From 0e96602f2ab9f7850c8d872579228ccb6fe8d4e4 Mon Sep 17 00:00:00 2001 From: Mason Hall Date: Mon, 31 Aug 2026 20:41:40 -0400 Subject: [PATCH 1/2] Add push-based agent automations --- .env.example | 6 + .gitignore | 1 + README.md | 32 + agent/channels/eve.ts | 39 + agent/instructions.md | 1 + agent/tools/manage_automations.ts | 132 + agent/tools/mta_status.ts | 184 + db/migrations/0006_chilly_the_leader.sql | 59 + db/migrations/0007_freezing_silver_sable.sql | 1 + db/migrations/meta/0006_snapshot.json | 1822 +++++++++ db/migrations/meta/0007_snapshot.json | 1828 +++++++++ db/migrations/meta/_journal.json | 14 + db/schema/application.ts | 122 + db/services/automations.ts | 501 +++ db/tests/automations.test.ts | 177 + db/tests/database-migration.test.ts | 7 +- db/tests/database-schema.test.ts | 25 + next.config.ts | 3 +- package.json | 1 + pnpm-lock.yaml | 3270 +++++++++++++++-- pnpm-workspace.yaml | 1 + .../api/automations/_lib/workflow-world.ts | 18 + .../api/automations/_workflows/automations.ts | 564 +++ src/app/api/automations/arm/route.ts | 81 + src/app/api/automations/gmail/route.ts | 92 + src/env.ts | 10 + src/lib/application-origin.ts | 11 + src/lib/automation-auth.ts | 98 + src/lib/automation.ts | 217 ++ src/lib/tests/application-origin.test.ts | 5 +- src/lib/tests/automation-auth.test.ts | 53 + src/lib/tests/automation.test.ts | 88 + src/lib/tests/env.test.ts | 33 + src/proxy.ts | 9 +- tests/agent-tool-boundaries.test.ts | 2 + tests/agent/tools/manage-automations.test.ts | 57 + tests/proxy.test.ts | 51 + tests/source-layout.test.ts | 2 + tests/turbo-config.test.ts | 1 + turbo.json | 4 + 40 files changed, 9343 insertions(+), 279 deletions(-) create mode 100644 agent/tools/manage_automations.ts create mode 100644 agent/tools/mta_status.ts create mode 100644 db/migrations/0006_chilly_the_leader.sql create mode 100644 db/migrations/0007_freezing_silver_sable.sql create mode 100644 db/migrations/meta/0006_snapshot.json create mode 100644 db/migrations/meta/0007_snapshot.json create mode 100644 db/services/automations.ts create mode 100644 db/tests/automations.test.ts create mode 100644 src/app/api/automations/_lib/workflow-world.ts create mode 100644 src/app/api/automations/_workflows/automations.ts create mode 100644 src/app/api/automations/arm/route.ts create mode 100644 src/app/api/automations/gmail/route.ts create mode 100644 src/lib/automation-auth.ts create mode 100644 src/lib/automation.ts create mode 100644 src/lib/tests/automation-auth.test.ts create mode 100644 src/lib/tests/automation.test.ts create mode 100644 tests/agent/tools/manage-automations.test.ts create mode 100644 tests/proxy.test.ts diff --git a/.env.example b/.env.example index 7bb8006e..964be3dd 100644 --- a/.env.example +++ b/.env.example @@ -17,6 +17,12 @@ BLOB_STORE_ID= BLOB_READ_WRITE_TOKEN= # Optional Vercel Connect configuration. GOOGLE_CONNECTOR_UID= +# Gmail event automations use an authenticated Google Cloud Pub/Sub push +# subscription. The topic must belong to the OAuth connector's Google Cloud +# project and grant Gmail's publisher service account permission to publish. +GMAIL_PUBSUB_TOPIC= +GMAIL_PUBSUB_AUDIENCE= +GMAIL_PUBSUB_SERVICE_ACCOUNT= # Linq delivery requires the connector. The phone number only enables the # optional click-to-message shortcut in the workspace. LINQ_CONNECTOR= diff --git a/.gitignore b/.gitignore index 694ec1f1..e2f98440 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ next-env.d.ts dist .DS_Store *.tsbuildinfo +/.swc diff --git a/README.md b/README.md index 0f453ddb..d1a435ea 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,38 @@ access deliberately uses `gmail.modify`, not the permanent-delete 4. Set `GOOGLE_CONNECTOR_UID` to the returned UID and redeploy. The default is `google/open-instinct`. +### Gmail push automations + +Gmail-triggered automations use Gmail `users.watch` and an authenticated Google +Cloud Pub/Sub push subscription. They do not poll the inbox. Timer automations +use Vercel Workflow durable sleeps and likewise do not need a cron dispatcher. + +1. In the same Google Cloud project as the OAuth credentials, create a Pub/Sub + topic and grant `gmail-api-push@system.gserviceaccount.com` the Pub/Sub + Publisher role on that topic. +2. Create a dedicated service account for Pub/Sub push authentication. Create a + push subscription whose endpoint is + `https:///api/automations/gmail`, enable OIDC authentication with + that service account, and set the token audience to that exact endpoint URL. +3. Configure and redeploy: + + ```bash + GMAIL_PUBSUB_TOPIC=projects//topics/ + GMAIL_PUBSUB_AUDIENCE=https:///api/automations/gmail + GMAIL_PUBSUB_SERVICE_ACCOUNT=@.iam.gserviceaccount.com + ``` + +OpenInstinct creates a watch only after a signed-in user creates a Gmail +automation, stores Gmail's history cursor, renews the watch before expiration, +and deduplicates each matching message before running the saved task. Gmail +push configuration is intentionally explicit: if any value is absent, Gmail +automations fail at creation instead of silently falling back to polling. +Automation executions use a fresh, replay-stable Eve session. The session stays +resumable until its run binding and result are durable, then OpenInstinct retires +it. If a task requests a later approval, question response, or OAuth sign-in, +the run records a visible failure and retires the pending session instead of +duplicating the request. + Gotchas: - Attach the connector separately to every Vercel environment that should use diff --git a/agent/channels/eve.ts b/agent/channels/eve.ts index c3e62e85..62f75184 100644 --- a/agent/channels/eve.ts +++ b/agent/channels/eve.ts @@ -1,13 +1,21 @@ import { eveChannel } from "eve/channels/eve"; import { ForbiddenError, UnauthenticatedError } from "eve/channels/auth"; import { z } from "zod"; +import { + readAutomationById, + readAutomationRunById, +} from "@/db/services/automations"; import { isSessionOwned } from "@/db/services/sessions"; import { accessScopeForUser, type AccessScope } from "@/lib/access-scope"; +import { verifyAutomationRequest } from "@/lib/automation-auth"; import { getAuthSession } from "@/auth/session"; export default eveChannel({ auth: [ async (request) => { + const automationIdentity = await automationIdentityFromRequest(request); + if (automationIdentity) return automationIdentity; + const identity = await requestIdentityFromRequest(request); if (!identity) { throw new UnauthenticatedError({ @@ -32,6 +40,37 @@ export default eveChannel({ ], }); +async function automationIdentityFromRequest(request: Request) { + const signed = await verifyAutomationRequest(request.headers, "execute"); + if (!signed?.runId) return undefined; + const [automation, run] = await Promise.all([ + readAutomationById(signed.automationId), + readAutomationRunById(signed.runId), + ]); + const requestedSessionId = sessionIdFromPath(new URL(request.url).pathname); + if ( + automation?.status !== "active" || + automation.revision !== signed.revision || + run?.automationId !== automation.id || + run.revision !== signed.revision || + run.status !== "running" || + (requestedSessionId !== undefined && + requestedSessionId !== run.eveSessionId) + ) { + throw new ForbiddenError({ message: "Automation is no longer active." }); + } + return { + attributes: { + automationId: automation.id, + phoneNumber: automation.phoneNumber, + workspaceId: automation.workspaceId, + }, + authenticator: "automation", + principalId: automation.createdByUserId, + principalType: "user" as const, + }; +} + function sessionIdFromPath(pathname: string) { const match = /^\/eve\/v1\/session\/([^/]+)/.exec(pathname); if (!match?.[1]) return undefined; diff --git a/agent/instructions.md b/agent/instructions.md index 34d0c4fa..c087953e 100644 --- a/agent/instructions.md +++ b/agent/instructions.md @@ -39,6 +39,7 @@ The main conversation is the control plane. Coordinate the user's work there, de - Perform public research, source discovery, comparisons, and current-information lookups directly with `web_search`. Never delegate a search-only task or use a browser to visit a search engine or browse search-result pages. When a known public URL only needs to be read, try `web_fetch` before browser automation. - Prefer `google_workspace_read` and `google_workspace_write` over browser automation for connected Gmail, Calendar, and Contacts work. Never ask for Google tokens or credentials in chat. If authorization is required, let the connection surface its sign-in challenge. - Use exact Gmail message IDs for reversible inbox updates. Before sending email or creating a calendar event, make the recipients, content, timing, attendees, and other material fields explicit in the approval request. +- Use `manage_automations` when the user asks for a later text, recurring task, or Gmail-based alert. Resolve relative dates into an explicit trigger using the user's timezone, save the complete task the future run must perform, and say it is scheduled only after the tool confirms it is armed. Use a Gmail trigger only when the requested event can be expressed by sender, thread, or subject; do not simulate unsupported event sources with polling. - Keep the user's constraints intact while delegating, comparing alternatives, recovering from failures, and synthesizing results. - When the conversation reveals a useful next action, offer that exact action with the details already established: book the 7:15 showtime, buy the selected groceries, or submit the prepared form. Offer execution, not a generic "anything else?" or instructions for the user to do it themselves. - If the user's intent is already clear and the action is authorized, act instead of asking whether to act. Do not add an offer to greetings, simple factual answers, or work you already completed. diff --git a/agent/tools/manage_automations.ts b/agent/tools/manage_automations.ts new file mode 100644 index 00000000..67a1a57b --- /dev/null +++ b/agent/tools/manage_automations.ts @@ -0,0 +1,132 @@ +import { defineTool } from "eve/tools"; +import { z } from "zod"; +import { + createAutomation, + listAutomations, + setAutomationStatus, +} from "@/db/services/automations"; +import { env } from "@/env"; +import { withGoogleAuth } from "@/agent/lib/google-workspace/client"; +import { scopeFromPrincipal } from "@/lib/access-scope"; +import { createAutomationRequestHeaders } from "@/lib/automation-auth"; +import { internalApplicationOrigin } from "@/lib/application-origin"; +import { assertTimezone, automationTriggerSchema } from "@/lib/automation"; +import { isE164PhoneNumber } from "@/auth/phone-number"; + +const inputSchema = z.discriminatedUnion("action", [ + z.object({ + action: z.literal("create"), + task: z.string().min(1).max(10_000), + timezone: z.string().min(1).default("America/New_York"), + title: z.string().min(1).max(200), + trigger: automationTriggerSchema, + }), + z.object({ action: z.literal("list") }), + z.object({ + action: z.enum(["pause", "resume", "delete"]), + automationId: z.string().min(1), + }), +]); + +export default defineTool({ + approval: ({ toolInput }) => + toolInput?.action === "delete" ? "user-approval" : "not-applicable", + description: + "Create and manage durable push automations. Timers sleep until an exact time without polling. Recurring and interval triggers schedule their next run after each delivery. Gmail triggers use authenticated Gmail push notifications and can match a sender, thread, or subject text. Every trigger runs the saved task with fresh data and texts the result to the authenticated user. Use list before changing an automation when its id is unknown. Deletion requires approval.", + inputSchema, + async execute(input, ctx) { + const principal = ctx.session.auth.current ?? ctx.session.auth.initiator; + if (principal?.principalType !== "user") { + throw new Error("Automations require an authenticated user."); + } + if (principal.authenticator === "automation" && input.action !== "list") { + throw new Error( + "Automation runs cannot change the automation control plane." + ); + } + const scope = scopeFromPrincipal(principal); + + if (input.action === "list") { + return { automations: await listAutomations(scope) }; + } + if (input.action !== "create") { + const status = + input.action === "pause" + ? "paused" + : input.action === "resume" + ? "active" + : "deleted"; + const automation = await setAutomationStatus( + scope, + input.automationId, + status + ); + if (!automation) throw new Error("Automation not found."); + const armed = + status === "active" ? await armAutomation(automation) : undefined; + return { armed, automation }; + } + + assertTimezone(input.timezone); + if ( + input.trigger.kind === "gmail" && + !input.trigger.fromAddress && + !input.trigger.subjectContains && + !input.trigger.threadId + ) { + throw new Error("A Gmail automation needs at least one message filter."); + } + if (input.trigger.kind === "gmail") { + if ( + !env.GMAIL_PUBSUB_AUDIENCE || + !env.GMAIL_PUBSUB_SERVICE_ACCOUNT || + !env.GMAIL_PUBSUB_TOPIC + ) { + throw new Error( + "Gmail push automations are not configured on this deployment." + ); + } + await withGoogleAuth(ctx, async () => undefined); + } + const phoneNumber = z + .string() + .refine(isE164PhoneNumber) + .parse(principal.attributes.phoneNumber); + const automation = await createAutomation(scope, { + idempotencyKey: `${ctx.session.id}:${ctx.callId}`, + phoneNumber, + sessionId: ctx.session.id, + task: input.task, + timezone: input.timezone, + title: input.title, + trigger: input.trigger, + }); + return { armed: await armAutomation(automation), automation }; + }, +}); + +async function armAutomation(automation: { + readonly id: string; + readonly revision: number; +}) { + const headers = await createAutomationRequestHeaders({ + automationId: automation.id, + purpose: "arm", + revision: automation.revision, + }); + const response = await fetch( + `${internalApplicationOrigin()}/api/automations/arm`, + { + headers, + method: "POST", + redirect: "error", + } + ); + const body: unknown = await response.json().catch(() => undefined); + if (!response.ok) { + throw new Error( + `Automation was saved but could not be armed (HTTP ${String(response.status)}): ${JSON.stringify(body)}` + ); + } + return body; +} diff --git a/agent/tools/mta_status.ts b/agent/tools/mta_status.ts new file mode 100644 index 00000000..a4e56ec4 --- /dev/null +++ b/agent/tools/mta_status.ts @@ -0,0 +1,184 @@ +import { defineTool } from "eve/tools"; +import { z } from "zod"; + +const feeds = { + bus: "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/camsys%2Fbus-alerts.json", + subway: + "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/camsys%2Fsubway-alerts.json", +} as const; + +const periodSchema = z.object({ + end: z.number().optional(), + start: z.number().optional(), +}); +const translatedTextSchema = z.object({ + translation: z + .object({ language: z.string().optional(), text: z.string().optional() }) + .array() + .optional(), +}); +const mtaFeedSchema = z.object({ + entity: z + .object({ + alert: z + .object({ + active_period: periodSchema.array().optional(), + description_text: translatedTextSchema.optional(), + header_text: translatedTextSchema.optional(), + informed_entity: z + .object({ route_id: z.string().optional() }) + .array() + .optional(), + "transit_realtime.mercury_alert": z + .object({ + alert_type: z.string().optional(), + human_readable_active_period: translatedTextSchema.optional(), + }) + .optional(), + }) + .optional(), + }) + .array() + .optional(), +}); + +type Period = z.infer; +type TranslatedText = z.infer; + +export default defineTool({ + description: + "Check current MTA subway and bus service alerts from the public MTA feed. Use this for live route status and before recommending a specific train or bus. It can also include future planned work.", + inputSchema: z.object({ + includePlanned: z.boolean().default(false), + limit: z.number().int().min(1).max(40).default(12), + mode: z.enum(["subway", "bus", "all"]).default("subway"), + routes: z.array(z.string()).optional(), + }), + async execute({ includePlanned, limit, mode, routes }, ctx) { + const wanted = routes + ?.map((route) => route.trim().toUpperCase()) + .filter(Boolean); + const selectedFeeds = + mode === "all" ? (["subway", "bus"] as const) : ([mode] as const); + const results = await Promise.all( + selectedFeeds.map(async (feed) => { + const response = await fetch(feeds[feed], { signal: ctx.abortSignal }); + if (!response.ok) { + throw new Error( + `MTA ${feed} alerts returned HTTP ${String(response.status)}.` + ); + } + return { data: mtaFeedSchema.parse(await response.json()), feed }; + }) + ); + + const nowSeconds = Math.floor(Date.now() / 1000); + const alerts = results.flatMap(({ data, feed }) => + (data.entity ?? []).flatMap((entity) => { + const alert = entity.alert; + if (!alert) return []; + const periods = alert.active_period ?? []; + const live = isLive(periods, nowSeconds); + if (!live && !(includePlanned && isUpcoming(periods, nowSeconds))) { + return []; + } + const alertRoutes = [ + ...new Set( + (alert.informed_entity ?? []).flatMap(({ route_id: routeId }) => + routeId ? [routeId] : [] + ) + ), + ]; + if ( + wanted?.length && + !alertRoutes.some((route) => wanted.includes(route.toUpperCase())) + ) { + return []; + } + const summary = plainText(alert.header_text); + if (!summary) return []; + const mercury = alert["transit_realtime.mercury_alert"]; + const alertType = mercury?.alert_type ?? "Service Change"; + const window = relevantPeriod(periods, nowSeconds); + return [ + { + activePeriod: + plainText(mercury?.human_readable_active_period) ?? null, + alertType, + details: plainText(alert.description_text) ?? null, + inEffectNow: live, + mode: feed, + plannedWork: alertType.startsWith("Planned"), + routes: alertRoutes, + summary, + windowEnd: window?.end + ? new Date(window.end * 1000).toISOString() + : null, + windowStart: window?.start + ? new Date(window.start * 1000).toISOString() + : null, + }, + ]; + }) + ); + + alerts.sort((left, right) => { + if (left.inEffectNow !== right.inEffectNow) { + return Number(right.inEffectNow) - Number(left.inEffectNow); + } + const leftStart = left.windowStart ?? ""; + const rightStart = right.windowStart ?? ""; + return left.inEffectNow + ? rightStart.localeCompare(leftStart) + : leftStart.localeCompare(rightStart); + }); + return { + alerts: alerts.slice(0, limit), + checkedAt: new Date().toISOString(), + mode, + routesRequested: wanted ?? null, + totalMatching: alerts.length, + upcomingWorkIncluded: includePlanned, + }; + }, +}); + +function isLive(periods: Period[], now: number) { + return ( + periods.length === 0 || + periods.some( + (period) => + (period.start ?? 0) <= now && + (period.end === undefined || period.end >= now) + ) + ); +} + +function isUpcoming(periods: Period[], now: number) { + return periods.some((period) => (period.start ?? 0) > now); +} + +function relevantPeriod(periods: Period[], now: number) { + return ( + periods.find( + (period) => + (period.start ?? 0) <= now && + (period.end === undefined || period.end >= now) + ) ?? + periods + .filter((period) => (period.start ?? 0) > now) + .toSorted((left, right) => (left.start ?? 0) - (right.start ?? 0))[0] + ); +} + +function plainText(field?: TranslatedText) { + const text = + field?.translation?.find( + (translation) => + translation.language === "en" && !translation.text?.includes("<") + )?.text ?? field?.translation?.[0]?.text; + return text + ?.replace(/<[^>]+>/gu, " ") + .replace(/\s+/gu, " ") + .trim(); +} diff --git a/db/migrations/0006_chilly_the_leader.sql b/db/migrations/0006_chilly_the_leader.sql new file mode 100644 index 00000000..e6c78e4c --- /dev/null +++ b/db/migrations/0006_chilly_the_leader.sql @@ -0,0 +1,59 @@ +CREATE TABLE "automation_runs" ( + "id" text PRIMARY KEY NOT NULL, + "automation_id" text NOT NULL, + "revision" integer NOT NULL, + "trigger_key" text NOT NULL, + "status" text DEFAULT 'running' NOT NULL, + "result" text, + "error" text, + "started_at" text NOT NULL, + "completed_at" text, + CONSTRAINT "automation_runs_status_check" CHECK ("automation_runs"."status" IN ('running', 'completed', 'failed', 'suppressed')) +); +--> statement-breakpoint +CREATE TABLE "automations" ( + "id" text PRIMARY KEY NOT NULL, + "workspace_id" text NOT NULL, + "created_by_user_id" text NOT NULL, + "session_id" text NOT NULL, + "phone_number" text NOT NULL, + "title" text NOT NULL, + "task" text NOT NULL, + "trigger" text NOT NULL, + "timezone" text NOT NULL, + "status" text DEFAULT 'active' NOT NULL, + "revision" integer DEFAULT 1 NOT NULL, + "next_run_at" text, + "last_run_at" text, + "idempotency_key" text NOT NULL, + "created_at" text NOT NULL, + "updated_at" text NOT NULL, + CONSTRAINT "automations_status_check" CHECK ("automations"."status" IN ('active', 'paused', 'completed', 'deleted')), + CONSTRAINT "automations_revision_check" CHECK ("automations"."revision" > 0) +); +--> statement-breakpoint +CREATE TABLE "gmail_watches" ( + "workspace_id" text NOT NULL, + "user_id" text NOT NULL, + "email_address" text, + "history_id" text, + "expiration_at" text, + "generation" integer DEFAULT 1 NOT NULL, + "status" text DEFAULT 'arming' NOT NULL, + "workflow_run_id" text, + "created_at" text NOT NULL, + "updated_at" text NOT NULL, + CONSTRAINT "gmail_watches_pkey" PRIMARY KEY("workspace_id","user_id"), + CONSTRAINT "gmail_watches_status_check" CHECK ("gmail_watches"."status" IN ('arming', 'active', 'paused', 'failed')), + CONSTRAINT "gmail_watches_generation_check" CHECK ("gmail_watches"."generation" > 0) +); +--> statement-breakpoint +ALTER TABLE "automation_runs" ADD CONSTRAINT "automation_runs_automation_id_fkey" FOREIGN KEY ("automation_id") REFERENCES "public"."automations"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "automations" ADD CONSTRAINT "automations_membership_fkey" FOREIGN KEY ("workspace_id","created_by_user_id") REFERENCES "public"."workspace_memberships"("workspace_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "automations" ADD CONSTRAINT "automations_session_id_fkey" FOREIGN KEY ("session_id") REFERENCES "public"."agent_sessions"("session_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "gmail_watches" ADD CONSTRAINT "gmail_watches_membership_fkey" FOREIGN KEY ("workspace_id","user_id") REFERENCES "public"."workspace_memberships"("workspace_id","user_id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +CREATE UNIQUE INDEX "automation_runs_trigger_uidx" ON "automation_runs" USING btree ("automation_id","trigger_key");--> statement-breakpoint +CREATE INDEX "automation_runs_automation_started_idx" ON "automation_runs" USING btree ("automation_id","started_at" DESC NULLS FIRST);--> statement-breakpoint +CREATE UNIQUE INDEX "automations_workspace_idempotency_uidx" ON "automations" USING btree ("workspace_id","idempotency_key");--> statement-breakpoint +CREATE INDEX "automations_workspace_status_idx" ON "automations" USING btree ("workspace_id","status","next_run_at");--> statement-breakpoint +CREATE UNIQUE INDEX "gmail_watches_email_uidx" ON "gmail_watches" USING btree ("email_address"); \ No newline at end of file diff --git a/db/migrations/0007_freezing_silver_sable.sql b/db/migrations/0007_freezing_silver_sable.sql new file mode 100644 index 00000000..247facbf --- /dev/null +++ b/db/migrations/0007_freezing_silver_sable.sql @@ -0,0 +1 @@ +ALTER TABLE "automation_runs" ADD COLUMN "eve_session_id" text; \ No newline at end of file diff --git a/db/migrations/meta/0006_snapshot.json b/db/migrations/meta/0006_snapshot.json new file mode 100644 index 00000000..cc74b690 --- /dev/null +++ b/db/migrations/meta/0006_snapshot.json @@ -0,0 +1,1822 @@ +{ + "id": "a49b2552-6f56-4632-96e2-fdd814ad5fe4", + "prevId": "454f727a-6123-463e-bb42-9e06236816a2", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.agent_sessions": { + "name": "agent_sessions", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "agent_sessions_workspace_idx": { + "name": "agent_sessions_workspace_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agent_sessions_membership_fkey": { + "name": "agent_sessions_membership_fkey", + "tableFrom": "agent_sessions", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.automation_runs": { + "name": "automation_runs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "automation_id": { + "name": "automation_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "revision": { + "name": "revision", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "trigger_key": { + "name": "trigger_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'running'" + }, + "result": { + "name": "result", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "automation_runs_trigger_uidx": { + "name": "automation_runs_trigger_uidx", + "columns": [ + { + "expression": "automation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "trigger_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "automation_runs_automation_started_idx": { + "name": "automation_runs_automation_started_idx", + "columns": [ + { + "expression": "automation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "automation_runs_automation_id_fkey": { + "name": "automation_runs_automation_id_fkey", + "tableFrom": "automation_runs", + "tableTo": "automations", + "columnsFrom": ["automation_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "automation_runs_status_check": { + "name": "automation_runs_status_check", + "value": "\"automation_runs\".\"status\" IN ('running', 'completed', 'failed', 'suppressed')" + } + }, + "isRLSEnabled": false + }, + "public.automations": { + "name": "automations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "phone_number": { + "name": "phone_number", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "task": { + "name": "task", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "trigger": { + "name": "trigger", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timezone": { + "name": "timezone", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "revision": { + "name": "revision", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "next_run_at": { + "name": "next_run_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_run_at": { + "name": "last_run_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idempotency_key": { + "name": "idempotency_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "automations_workspace_idempotency_uidx": { + "name": "automations_workspace_idempotency_uidx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "idempotency_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "automations_workspace_status_idx": { + "name": "automations_workspace_status_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "next_run_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "automations_membership_fkey": { + "name": "automations_membership_fkey", + "tableFrom": "automations", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "automations_session_id_fkey": { + "name": "automations_session_id_fkey", + "tableFrom": "automations", + "tableTo": "agent_sessions", + "columnsFrom": ["session_id"], + "columnsTo": ["session_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "automations_status_check": { + "name": "automations_status_check", + "value": "\"automations\".\"status\" IN ('active', 'paused', 'completed', 'deleted')" + }, + "automations_revision_check": { + "name": "automations_revision_check", + "value": "\"automations\".\"revision\" > 0" + } + }, + "isRLSEnabled": false + }, + "public.browser_image_artifacts": { + "name": "browser_image_artifacts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "root_session_id": { + "name": "root_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "worker_session_id": { + "name": "worker_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "browser_session_id": { + "name": "browser_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "media_type": { + "name": "media_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "byte_size": { + "name": "byte_size", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "content_hash": { + "name": "content_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "storage_pathname": { + "name": "storage_pathname", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_kind": { + "name": "source_kind", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "idempotency_key": { + "name": "idempotency_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "browser_image_artifacts_workspace_idempotency_uidx": { + "name": "browser_image_artifacts_workspace_idempotency_uidx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "idempotency_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "browser_image_artifacts_workspace_created_idx": { + "name": "browser_image_artifacts_workspace_created_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_image_artifacts_membership_fkey": { + "name": "browser_image_artifacts_membership_fkey", + "tableFrom": "browser_image_artifacts", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "browser_image_artifacts_status_check": { + "name": "browser_image_artifacts_status_check", + "value": "\"browser_image_artifacts\".\"status\" IN ('pending', 'ready')" + }, + "browser_image_artifacts_source_kind_check": { + "name": "browser_image_artifacts_source_kind_check", + "value": "\"browser_image_artifacts\".\"source_kind\" IN ('element', 'full_page', 'image_resource', 'viewport')" + }, + "browser_image_artifacts_ready_fields_check": { + "name": "browser_image_artifacts_ready_fields_check", + "value": "\"browser_image_artifacts\".\"status\" = 'pending' OR (\"browser_image_artifacts\".\"filename\" IS NOT NULL AND \"browser_image_artifacts\".\"media_type\" IS NOT NULL AND \"browser_image_artifacts\".\"byte_size\" > 0 AND \"browser_image_artifacts\".\"content_hash\" IS NOT NULL)" + } + }, + "isRLSEnabled": false + }, + "public.browser_sessions": { + "name": "browser_sessions", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "worker_session_id": { + "name": "worker_session_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "browser_sessions_workspace_idx": { + "name": "browser_sessions_workspace_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "browser_sessions_worker_idx": { + "name": "browser_sessions_worker_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "worker_session_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_sessions_membership_fkey": { + "name": "browser_sessions_membership_fkey", + "tableFrom": "browser_sessions", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.browser_trace_domains": { + "name": "browser_trace_domains", + "schema": "", + "columns": { + "trace_session_id": { + "name": "trace_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "browser_trace_domains_domain_idx": { + "name": "browser_trace_domains_domain_idx", + "columns": [ + { + "expression": "domain", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_trace_domains_trace_fkey": { + "name": "browser_trace_domains_trace_fkey", + "tableFrom": "browser_trace_domains", + "tableTo": "browser_traces", + "columnsFrom": ["trace_session_id"], + "columnsTo": ["session_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "browser_trace_domains_pkey": { + "name": "browser_trace_domains_pkey", + "columns": ["trace_session_id", "domain"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.browser_trace_events": { + "name": "browser_trace_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "trace_session_id": { + "name": "trace_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "at": { + "name": "at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "detail": { + "name": "detail", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "browser_trace_events_trace_idx": { + "name": "browser_trace_events_trace_idx", + "columns": [ + { + "expression": "trace_session_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_trace_events_trace_fkey": { + "name": "browser_trace_events_trace_fkey", + "tableFrom": "browser_trace_events", + "tableTo": "browser_traces", + "columnsFrom": ["trace_session_id"], + "columnsTo": ["session_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.browser_traces": { + "name": "browser_traces", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "task": { + "name": "task", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "result_message": { + "name": "result_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "duration_ms": { + "name": "duration_ms", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "browser_traces_workspace_started_idx": { + "name": "browser_traces_workspace_started_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_traces_membership_fkey": { + "name": "browser_traces_membership_fkey", + "tableFrom": "browser_traces", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "browser_traces_status_check": { + "name": "browser_traces_status_check", + "value": "\"browser_traces\".\"status\" IN ('running', 'success', 'failure', 'error', 'cancelled')" + }, + "browser_traces_duration_ms_check": { + "name": "browser_traces_duration_ms_check", + "value": "\"browser_traces\".\"duration_ms\" IS NULL OR \"browser_traces\".\"duration_ms\" >= 0" + } + }, + "isRLSEnabled": false + }, + "public.chats": { + "name": "chats", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "input_tokens": { + "name": "input_tokens", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "output_tokens": { + "name": "output_tokens", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "cost_usd": { + "name": "cost_usd", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "chats_workspace_updated_idx": { + "name": "chats_workspace_updated_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "updated_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "chats_workspace_id_fkey": { + "name": "chats_workspace_id_fkey", + "tableFrom": "chats", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "chats_input_tokens_check": { + "name": "chats_input_tokens_check", + "value": "\"chats\".\"input_tokens\" >= 0" + }, + "chats_output_tokens_check": { + "name": "chats_output_tokens_check", + "value": "\"chats\".\"output_tokens\" >= 0" + }, + "chats_cost_usd_check": { + "name": "chats_cost_usd_check", + "value": "\"chats\".\"cost_usd\" IS NULL OR \"chats\".\"cost_usd\" >= 0" + } + }, + "isRLSEnabled": false + }, + "public.encrypted_secrets": { + "name": "encrypted_secrets", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace": { + "name": "namespace", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "encrypted_value": { + "name": "encrypted_value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "encrypted_secrets_workspace_id_fkey": { + "name": "encrypted_secrets_workspace_id_fkey", + "tableFrom": "encrypted_secrets", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "encrypted_secrets_pkey": { + "name": "encrypted_secrets_pkey", + "columns": ["workspace_id", "namespace", "id"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "encrypted_secrets_namespace_check": { + "name": "encrypted_secrets_namespace_check", + "value": "\"encrypted_secrets\".\"namespace\" = 'vault'" + } + }, + "isRLSEnabled": false + }, + "public.gmail_watches": { + "name": "gmail_watches", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_address": { + "name": "email_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "history_id": { + "name": "history_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expiration_at": { + "name": "expiration_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "generation": { + "name": "generation", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'arming'" + }, + "workflow_run_id": { + "name": "workflow_run_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "gmail_watches_email_uidx": { + "name": "gmail_watches_email_uidx", + "columns": [ + { + "expression": "email_address", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "gmail_watches_membership_fkey": { + "name": "gmail_watches_membership_fkey", + "tableFrom": "gmail_watches", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "gmail_watches_pkey": { + "name": "gmail_watches_pkey", + "columns": ["workspace_id", "user_id"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "gmail_watches_status_check": { + "name": "gmail_watches_status_check", + "value": "\"gmail_watches\".\"status\" IN ('arming', 'active', 'paused', 'failed')" + }, + "gmail_watches_generation_check": { + "name": "gmail_watches_generation_check", + "value": "\"gmail_watches\".\"generation\" > 0" + } + }, + "isRLSEnabled": false + }, + "public.settings": { + "name": "settings", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "settings_workspace_id_fkey": { + "name": "settings_workspace_id_fkey", + "tableFrom": "settings", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "settings_pkey": { + "name": "settings_pkey", + "columns": ["workspace_id", "key"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "settings_key_check": { + "name": "settings_key_check", + "value": "\"settings\".\"key\" = 'gateway_model'" + } + }, + "isRLSEnabled": false + }, + "public.vault_items": { + "name": "vault_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "account": { + "name": "account", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "vault_items_workspace_updated_idx": { + "name": "vault_items_workspace_updated_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "updated_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vault_items_workspace_id_fkey": { + "name": "vault_items_workspace_id_fkey", + "tableFrom": "vault_items", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "vault_items_kind_check": { + "name": "vault_items_kind_check", + "value": "\"vault_items\".\"kind\" IN ('login', 'payment', 'address', 'contact', 'phone', 'identity', 'token')" + } + }, + "isRLSEnabled": false + }, + "public.workspace_memberships": { + "name": "workspace_memberships", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "workspace_memberships_workspace_id_fkey": { + "name": "workspace_memberships_workspace_id_fkey", + "tableFrom": "workspace_memberships", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "workspace_memberships_pkey": { + "name": "workspace_memberships_pkey", + "columns": ["workspace_id", "user_id"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "workspace_memberships_role_check": { + "name": "workspace_memberships_role_check", + "value": "\"workspace_memberships\".\"role\" = 'owner'" + } + }, + "isRLSEnabled": false + }, + "public.workspaces": { + "name": "workspaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accountId": { + "name": "accountId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessToken": { + "name": "accessToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idToken": { + "name": "idToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessTokenExpiresAt": { + "name": "accessTokenExpiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "refreshTokenExpiresAt": { + "name": "refreshTokenExpiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "account_issuer_accountId_uidx": { + "name": "account_issuer_accountId_uidx", + "columns": [ + { + "expression": "issuer", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "accountId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "account_userId_idx": { + "name": "account_userId_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userAgent": { + "name": "userAgent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "session_userId_idx": { + "name": "session_userId_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": ["token"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "emailVerified": { + "name": "emailVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "phoneNumber": { + "name": "phoneNumber", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "phoneNumberVerified": { + "name": "phoneNumberVerified", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": ["email"] + }, + "user_phoneNumber_unique": { + "name": "user_phoneNumber_unique", + "nullsNotDistinct": false, + "columns": ["phoneNumber"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "verification_identifier_idx": { + "name": "verification_identifier_idx", + "columns": [ + { + "expression": "identifier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} diff --git a/db/migrations/meta/0007_snapshot.json b/db/migrations/meta/0007_snapshot.json new file mode 100644 index 00000000..879764c1 --- /dev/null +++ b/db/migrations/meta/0007_snapshot.json @@ -0,0 +1,1828 @@ +{ + "id": "b7fa498b-f542-47dc-94a6-5cf84206e17a", + "prevId": "a49b2552-6f56-4632-96e2-fdd814ad5fe4", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.agent_sessions": { + "name": "agent_sessions", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "agent_sessions_workspace_idx": { + "name": "agent_sessions_workspace_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agent_sessions_membership_fkey": { + "name": "agent_sessions_membership_fkey", + "tableFrom": "agent_sessions", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.automation_runs": { + "name": "automation_runs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "automation_id": { + "name": "automation_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "revision": { + "name": "revision", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "trigger_key": { + "name": "trigger_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'running'" + }, + "eve_session_id": { + "name": "eve_session_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "result": { + "name": "result", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "automation_runs_trigger_uidx": { + "name": "automation_runs_trigger_uidx", + "columns": [ + { + "expression": "automation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "trigger_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "automation_runs_automation_started_idx": { + "name": "automation_runs_automation_started_idx", + "columns": [ + { + "expression": "automation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "automation_runs_automation_id_fkey": { + "name": "automation_runs_automation_id_fkey", + "tableFrom": "automation_runs", + "tableTo": "automations", + "columnsFrom": ["automation_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "automation_runs_status_check": { + "name": "automation_runs_status_check", + "value": "\"automation_runs\".\"status\" IN ('running', 'completed', 'failed', 'suppressed')" + } + }, + "isRLSEnabled": false + }, + "public.automations": { + "name": "automations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "phone_number": { + "name": "phone_number", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "task": { + "name": "task", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "trigger": { + "name": "trigger", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "timezone": { + "name": "timezone", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'active'" + }, + "revision": { + "name": "revision", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "next_run_at": { + "name": "next_run_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_run_at": { + "name": "last_run_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idempotency_key": { + "name": "idempotency_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "automations_workspace_idempotency_uidx": { + "name": "automations_workspace_idempotency_uidx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "idempotency_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "automations_workspace_status_idx": { + "name": "automations_workspace_status_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "next_run_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "automations_membership_fkey": { + "name": "automations_membership_fkey", + "tableFrom": "automations", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "automations_session_id_fkey": { + "name": "automations_session_id_fkey", + "tableFrom": "automations", + "tableTo": "agent_sessions", + "columnsFrom": ["session_id"], + "columnsTo": ["session_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "automations_status_check": { + "name": "automations_status_check", + "value": "\"automations\".\"status\" IN ('active', 'paused', 'completed', 'deleted')" + }, + "automations_revision_check": { + "name": "automations_revision_check", + "value": "\"automations\".\"revision\" > 0" + } + }, + "isRLSEnabled": false + }, + "public.browser_image_artifacts": { + "name": "browser_image_artifacts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "root_session_id": { + "name": "root_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "worker_session_id": { + "name": "worker_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "browser_session_id": { + "name": "browser_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "filename": { + "name": "filename", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "media_type": { + "name": "media_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "byte_size": { + "name": "byte_size", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "content_hash": { + "name": "content_hash", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "storage_pathname": { + "name": "storage_pathname", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "source_kind": { + "name": "source_kind", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "idempotency_key": { + "name": "idempotency_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "browser_image_artifacts_workspace_idempotency_uidx": { + "name": "browser_image_artifacts_workspace_idempotency_uidx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "idempotency_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "browser_image_artifacts_workspace_created_idx": { + "name": "browser_image_artifacts_workspace_created_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_image_artifacts_membership_fkey": { + "name": "browser_image_artifacts_membership_fkey", + "tableFrom": "browser_image_artifacts", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "browser_image_artifacts_status_check": { + "name": "browser_image_artifacts_status_check", + "value": "\"browser_image_artifacts\".\"status\" IN ('pending', 'ready')" + }, + "browser_image_artifacts_source_kind_check": { + "name": "browser_image_artifacts_source_kind_check", + "value": "\"browser_image_artifacts\".\"source_kind\" IN ('element', 'full_page', 'image_resource', 'viewport')" + }, + "browser_image_artifacts_ready_fields_check": { + "name": "browser_image_artifacts_ready_fields_check", + "value": "\"browser_image_artifacts\".\"status\" = 'pending' OR (\"browser_image_artifacts\".\"filename\" IS NOT NULL AND \"browser_image_artifacts\".\"media_type\" IS NOT NULL AND \"browser_image_artifacts\".\"byte_size\" > 0 AND \"browser_image_artifacts\".\"content_hash\" IS NOT NULL)" + } + }, + "isRLSEnabled": false + }, + "public.browser_sessions": { + "name": "browser_sessions", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "worker_session_id": { + "name": "worker_session_id", + "type": "text", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "browser_sessions_workspace_idx": { + "name": "browser_sessions_workspace_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "created_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "browser_sessions_worker_idx": { + "name": "browser_sessions_worker_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "worker_session_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_sessions_membership_fkey": { + "name": "browser_sessions_membership_fkey", + "tableFrom": "browser_sessions", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.browser_trace_domains": { + "name": "browser_trace_domains", + "schema": "", + "columns": { + "trace_session_id": { + "name": "trace_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "first_seen_at": { + "name": "first_seen_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "browser_trace_domains_domain_idx": { + "name": "browser_trace_domains_domain_idx", + "columns": [ + { + "expression": "domain", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_trace_domains_trace_fkey": { + "name": "browser_trace_domains_trace_fkey", + "tableFrom": "browser_trace_domains", + "tableTo": "browser_traces", + "columnsFrom": ["trace_session_id"], + "columnsTo": ["session_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "browser_trace_domains_pkey": { + "name": "browser_trace_domains_pkey", + "columns": ["trace_session_id", "domain"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.browser_trace_events": { + "name": "browser_trace_events", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "trace_session_id": { + "name": "trace_session_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "at": { + "name": "at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "detail": { + "name": "detail", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "browser_trace_events_trace_idx": { + "name": "browser_trace_events_trace_idx", + "columns": [ + { + "expression": "trace_session_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_trace_events_trace_fkey": { + "name": "browser_trace_events_trace_fkey", + "tableFrom": "browser_trace_events", + "tableTo": "browser_traces", + "columnsFrom": ["trace_session_id"], + "columnsTo": ["session_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.browser_traces": { + "name": "browser_traces", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "task": { + "name": "task", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "result_message": { + "name": "result_message", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "started_at": { + "name": "started_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "completed_at": { + "name": "completed_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "duration_ms": { + "name": "duration_ms", + "type": "integer", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "browser_traces_workspace_started_idx": { + "name": "browser_traces_workspace_started_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "started_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "browser_traces_membership_fkey": { + "name": "browser_traces_membership_fkey", + "tableFrom": "browser_traces", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "created_by_user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "browser_traces_status_check": { + "name": "browser_traces_status_check", + "value": "\"browser_traces\".\"status\" IN ('running', 'success', 'failure', 'error', 'cancelled')" + }, + "browser_traces_duration_ms_check": { + "name": "browser_traces_duration_ms_check", + "value": "\"browser_traces\".\"duration_ms\" IS NULL OR \"browser_traces\".\"duration_ms\" >= 0" + } + }, + "isRLSEnabled": false + }, + "public.chats": { + "name": "chats", + "schema": "", + "columns": { + "session_id": { + "name": "session_id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "input_tokens": { + "name": "input_tokens", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "output_tokens": { + "name": "output_tokens", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "cost_usd": { + "name": "cost_usd", + "type": "double precision", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "chats_workspace_updated_idx": { + "name": "chats_workspace_updated_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "updated_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "chats_workspace_id_fkey": { + "name": "chats_workspace_id_fkey", + "tableFrom": "chats", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "chats_input_tokens_check": { + "name": "chats_input_tokens_check", + "value": "\"chats\".\"input_tokens\" >= 0" + }, + "chats_output_tokens_check": { + "name": "chats_output_tokens_check", + "value": "\"chats\".\"output_tokens\" >= 0" + }, + "chats_cost_usd_check": { + "name": "chats_cost_usd_check", + "value": "\"chats\".\"cost_usd\" IS NULL OR \"chats\".\"cost_usd\" >= 0" + } + }, + "isRLSEnabled": false + }, + "public.encrypted_secrets": { + "name": "encrypted_secrets", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "namespace": { + "name": "namespace", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "encrypted_value": { + "name": "encrypted_value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "encrypted_secrets_workspace_id_fkey": { + "name": "encrypted_secrets_workspace_id_fkey", + "tableFrom": "encrypted_secrets", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "encrypted_secrets_pkey": { + "name": "encrypted_secrets_pkey", + "columns": ["workspace_id", "namespace", "id"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "encrypted_secrets_namespace_check": { + "name": "encrypted_secrets_namespace_check", + "value": "\"encrypted_secrets\".\"namespace\" = 'vault'" + } + }, + "isRLSEnabled": false + }, + "public.gmail_watches": { + "name": "gmail_watches", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email_address": { + "name": "email_address", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "history_id": { + "name": "history_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "expiration_at": { + "name": "expiration_at", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "generation": { + "name": "generation", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 1 + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'arming'" + }, + "workflow_run_id": { + "name": "workflow_run_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "gmail_watches_email_uidx": { + "name": "gmail_watches_email_uidx", + "columns": [ + { + "expression": "email_address", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "gmail_watches_membership_fkey": { + "name": "gmail_watches_membership_fkey", + "tableFrom": "gmail_watches", + "tableTo": "workspace_memberships", + "columnsFrom": ["workspace_id", "user_id"], + "columnsTo": ["workspace_id", "user_id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "gmail_watches_pkey": { + "name": "gmail_watches_pkey", + "columns": ["workspace_id", "user_id"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "gmail_watches_status_check": { + "name": "gmail_watches_status_check", + "value": "\"gmail_watches\".\"status\" IN ('arming', 'active', 'paused', 'failed')" + }, + "gmail_watches_generation_check": { + "name": "gmail_watches_generation_check", + "value": "\"gmail_watches\".\"generation\" > 0" + } + }, + "isRLSEnabled": false + }, + "public.settings": { + "name": "settings", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "settings_workspace_id_fkey": { + "name": "settings_workspace_id_fkey", + "tableFrom": "settings", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "settings_pkey": { + "name": "settings_pkey", + "columns": ["workspace_id", "key"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "settings_key_check": { + "name": "settings_key_check", + "value": "\"settings\".\"key\" = 'gateway_model'" + } + }, + "isRLSEnabled": false + }, + "public.vault_items": { + "name": "vault_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "account": { + "name": "account", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "updated_at": { + "name": "updated_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "vault_items_workspace_updated_idx": { + "name": "vault_items_workspace_updated_idx", + "columns": [ + { + "expression": "workspace_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "updated_at", + "isExpression": false, + "asc": false, + "nulls": "first" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "vault_items_workspace_id_fkey": { + "name": "vault_items_workspace_id_fkey", + "tableFrom": "vault_items", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "vault_items_kind_check": { + "name": "vault_items_kind_check", + "value": "\"vault_items\".\"kind\" IN ('login', 'payment', 'address', 'contact', 'phone', 'identity', 'token')" + } + }, + "isRLSEnabled": false + }, + "public.workspace_memberships": { + "name": "workspace_memberships", + "schema": "", + "columns": { + "workspace_id": { + "name": "workspace_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "workspace_memberships_workspace_id_fkey": { + "name": "workspace_memberships_workspace_id_fkey", + "tableFrom": "workspace_memberships", + "tableTo": "workspaces", + "columnsFrom": ["workspace_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "workspace_memberships_pkey": { + "name": "workspace_memberships_pkey", + "columns": ["workspace_id", "user_id"] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": { + "workspace_memberships_role_check": { + "name": "workspace_memberships_role_check", + "value": "\"workspace_memberships\".\"role\" = 'owner'" + } + }, + "isRLSEnabled": false + }, + "public.workspaces": { + "name": "workspaces", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account": { + "name": "account", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "issuer": { + "name": "issuer", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accountId": { + "name": "accountId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "providerId": { + "name": "providerId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "accessToken": { + "name": "accessToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "refreshToken": { + "name": "refreshToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idToken": { + "name": "idToken", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "accessTokenExpiresAt": { + "name": "accessTokenExpiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "refreshTokenExpiresAt": { + "name": "refreshTokenExpiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "password": { + "name": "password", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "account_issuer_accountId_uidx": { + "name": "account_issuer_accountId_uidx", + "columns": [ + { + "expression": "issuer", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "accountId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "account_userId_idx": { + "name": "account_userId_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "account_userId_user_id_fk": { + "name": "account_userId_user_id_fk", + "tableFrom": "account", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.session": { + "name": "session", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ipAddress": { + "name": "ipAddress", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userAgent": { + "name": "userAgent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "userId": { + "name": "userId", + "type": "text", + "primaryKey": false, + "notNull": true + } + }, + "indexes": { + "session_userId_idx": { + "name": "session_userId_idx", + "columns": [ + { + "expression": "userId", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "session_userId_user_id_fk": { + "name": "session_userId_user_id_fk", + "tableFrom": "session", + "tableTo": "user", + "columnsFrom": ["userId"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "session_token_unique": { + "name": "session_token_unique", + "nullsNotDistinct": false, + "columns": ["token"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.user": { + "name": "user", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "emailVerified": { + "name": "emailVerified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "phoneNumber": { + "name": "phoneNumber", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "phoneNumberVerified": { + "name": "phoneNumberVerified", + "type": "boolean", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "user_email_unique": { + "name": "user_email_unique", + "nullsNotDistinct": false, + "columns": ["email"] + }, + "user_phoneNumber_unique": { + "name": "user_phoneNumber_unique", + "nullsNotDistinct": false, + "columns": ["phoneNumber"] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.verification": { + "name": "verification", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "identifier": { + "name": "identifier", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expiresAt": { + "name": "expiresAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "createdAt": { + "name": "createdAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updatedAt": { + "name": "updatedAt", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "verification_identifier_idx": { + "name": "verification_identifier_idx", + "columns": [ + { + "expression": "identifier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} diff --git a/db/migrations/meta/_journal.json b/db/migrations/meta/_journal.json index 75e4984f..0cde50a2 100644 --- a/db/migrations/meta/_journal.json +++ b/db/migrations/meta/_journal.json @@ -43,6 +43,20 @@ "when": 1788192764428, "tag": "0005_brave_kang", "breakpoints": true + }, + { + "idx": 6, + "version": "7", + "when": 1788221305790, + "tag": "0006_chilly_the_leader", + "breakpoints": true + }, + { + "idx": 7, + "version": "7", + "when": 1788222842579, + "tag": "0007_freezing_silver_sable", + "breakpoints": true } ] } diff --git a/db/schema/application.ts b/db/schema/application.ts index d008f21b..039396d6 100644 --- a/db/schema/application.ts +++ b/db/schema/application.ts @@ -326,3 +326,125 @@ export const encryptedSecrets = pgTable( ), ] ); + +export const automations = pgTable( + "automations", + { + id: text("id").primaryKey(), + workspaceId: text("workspace_id").notNull(), + createdByUserId: text("created_by_user_id").notNull(), + sessionId: text("session_id").notNull(), + phoneNumber: text("phone_number").notNull(), + title: text("title").notNull(), + task: text("task").notNull(), + trigger: text("trigger").notNull(), + timezone: text("timezone").notNull(), + status: text("status").notNull().default("active"), + revision: integer("revision").notNull().default(1), + nextRunAt: text("next_run_at"), + lastRunAt: text("last_run_at"), + idempotencyKey: text("idempotency_key").notNull(), + createdAt: text("created_at").notNull(), + updatedAt: text("updated_at").notNull(), + }, + (table) => [ + foreignKey({ + name: "automations_membership_fkey", + columns: [table.workspaceId, table.createdByUserId], + foreignColumns: [ + workspaceMemberships.workspaceId, + workspaceMemberships.userId, + ], + }).onDelete("cascade"), + foreignKey({ + name: "automations_session_id_fkey", + columns: [table.sessionId], + foreignColumns: [agentSessions.sessionId], + }).onDelete("cascade"), + check( + "automations_status_check", + sql`${table.status} IN ('active', 'paused', 'completed', 'deleted')` + ), + check("automations_revision_check", sql`${table.revision} > 0`), + uniqueIndex("automations_workspace_idempotency_uidx").on( + table.workspaceId, + table.idempotencyKey + ), + index("automations_workspace_status_idx").on( + table.workspaceId, + table.status, + table.nextRunAt + ), + ] +); + +export const automationRuns = pgTable( + "automation_runs", + { + id: text("id").primaryKey(), + automationId: text("automation_id").notNull(), + revision: integer("revision").notNull(), + triggerKey: text("trigger_key").notNull(), + status: text("status").notNull().default("running"), + eveSessionId: text("eve_session_id"), + result: text("result"), + error: text("error"), + startedAt: text("started_at").notNull(), + completedAt: text("completed_at"), + }, + (table) => [ + foreignKey({ + name: "automation_runs_automation_id_fkey", + columns: [table.automationId], + foreignColumns: [automations.id], + }).onDelete("cascade"), + check( + "automation_runs_status_check", + sql`${table.status} IN ('running', 'completed', 'failed', 'suppressed')` + ), + uniqueIndex("automation_runs_trigger_uidx").on( + table.automationId, + table.triggerKey + ), + index("automation_runs_automation_started_idx").on( + table.automationId, + table.startedAt.desc().nullsFirst() + ), + ] +); + +export const gmailWatches = pgTable( + "gmail_watches", + { + workspaceId: text("workspace_id").notNull(), + userId: text("user_id").notNull(), + emailAddress: text("email_address"), + historyId: text("history_id"), + expirationAt: text("expiration_at"), + generation: integer("generation").notNull().default(1), + status: text("status").notNull().default("arming"), + workflowRunId: text("workflow_run_id"), + createdAt: text("created_at").notNull(), + updatedAt: text("updated_at").notNull(), + }, + (table) => [ + primaryKey({ + columns: [table.workspaceId, table.userId], + name: "gmail_watches_pkey", + }), + foreignKey({ + name: "gmail_watches_membership_fkey", + columns: [table.workspaceId, table.userId], + foreignColumns: [ + workspaceMemberships.workspaceId, + workspaceMemberships.userId, + ], + }).onDelete("cascade"), + check( + "gmail_watches_status_check", + sql`${table.status} IN ('arming', 'active', 'paused', 'failed')` + ), + check("gmail_watches_generation_check", sql`${table.generation} > 0`), + uniqueIndex("gmail_watches_email_uidx").on(table.emailAddress), + ] +); diff --git a/db/services/automations.ts b/db/services/automations.ts new file mode 100644 index 00000000..a119125c --- /dev/null +++ b/db/services/automations.ts @@ -0,0 +1,501 @@ +import { and, desc, eq, ne, sql } from "drizzle-orm"; +import { nanoid } from "nanoid"; +import { z } from "zod"; +import { automationRuns, automations, db, gmailWatches } from "@/db"; +import type { AccessScope } from "@/lib/access-scope"; +import { + automationSchema, + automationStatusSchema, + automationTriggerSchema, + nextAutomationRunAt, + type Automation, + type AutomationTrigger, +} from "@/lib/automation"; +import { ensureScope } from "./scope"; + +const automationRowSchema = automationSchema.omit({ trigger: true }).extend({ + trigger: z.string(), +}); + +const gmailWatchSchema = z.object({ + createdAt: z.string(), + emailAddress: z.string().nullable(), + expirationAt: z.string().nullable(), + generation: z.number().int().positive(), + historyId: z.string().nullable(), + status: z.enum(["arming", "active", "paused", "failed"]), + updatedAt: z.string(), + userId: z.string().min(1), + workflowRunId: z.string().nullable(), + workspaceId: z.string().min(1), +}); + +export interface CreateAutomationInput { + readonly idempotencyKey: string; + readonly phoneNumber: string; + readonly sessionId: string; + readonly task: string; + readonly timezone: string; + readonly title: string; + readonly trigger: AutomationTrigger; +} + +export async function createAutomation( + scope: AccessScope, + input: CreateAutomationInput +) { + await ensureScope(scope); + const now = new Date(); + const trigger = automationTriggerSchema.parse(input.trigger); + const nextRunAt = nextAutomationRunAt(trigger, input.timezone, now); + if (trigger.kind !== "gmail" && !nextRunAt) { + throw new Error("The automation's first run must be in the future."); + } + const row = { + createdAt: now.toISOString(), + createdByUserId: scope.userId, + id: nanoid(), + idempotencyKey: input.idempotencyKey, + nextRunAt: nextRunAt?.toISOString() ?? null, + phoneNumber: input.phoneNumber, + revision: 1, + sessionId: input.sessionId, + status: "active", + task: input.task, + timezone: input.timezone, + title: input.title, + trigger: JSON.stringify(trigger), + updatedAt: now.toISOString(), + workspaceId: scope.workspaceId, + } as const; + const inserted = await db + .insert(automations) + .values(row) + .onConflictDoNothing({ + target: [automations.workspaceId, automations.idempotencyKey], + }) + .returning(); + if (inserted[0]) return parseAutomation(inserted[0]); + + const existing = await db + .select() + .from(automations) + .where( + and( + eq(automations.workspaceId, scope.workspaceId), + eq(automations.idempotencyKey, input.idempotencyKey) + ) + ) + .limit(1); + const existingRow = existing[0]; + if (!existingRow) { + throw new Error("The saved automation could not be read after a conflict."); + } + const automation = parseAutomation(existingRow); + if ( + automation.sessionId !== input.sessionId || + automation.task !== input.task || + JSON.stringify(automation.trigger) !== JSON.stringify(trigger) + ) { + throw new Error("This automation idempotency key is already in use."); + } + return automation; +} + +export async function listAutomations(scope: AccessScope) { + const rows = await db + .select() + .from(automations) + .where( + and( + eq(automations.workspaceId, scope.workspaceId), + ne(automations.status, "deleted") + ) + ) + .orderBy(desc(automations.createdAt)); + return rows.map(parseAutomation); +} + +export async function readAutomationById(id: string) { + const rows = await db + .select() + .from(automations) + .where(eq(automations.id, id)) + .limit(1); + return rows[0] ? parseAutomation(rows[0]) : undefined; +} + +export async function readAutomationRunById(id: string) { + const rows = await db + .select({ + automationId: automationRuns.automationId, + eveSessionId: automationRuns.eveSessionId, + revision: automationRuns.revision, + status: automationRuns.status, + }) + .from(automationRuns) + .where(eq(automationRuns.id, id)) + .limit(1); + return rows[0]; +} + +export async function setAutomationStatus( + scope: AccessScope, + id: string, + requestedStatus: "active" | "paused" | "deleted" +) { + const now = new Date(); + return db.transaction(async (transaction) => { + const rows = await transaction + .select() + .from(automations) + .where( + and( + eq(automations.workspaceId, scope.workspaceId), + eq(automations.id, id) + ) + ) + .for("update") + .limit(1); + const current = rows[0] ? parseAutomation(rows[0]) : undefined; + if (!current) return undefined; + if (current.status === "deleted") return current; + + const status = automationStatusSchema.parse(requestedStatus); + const nextRunAt = + status === "active" + ? (nextAutomationRunAt( + current.trigger, + current.timezone, + now + )?.toISOString() ?? null) + : null; + if (status === "active" && current.trigger.kind !== "gmail" && !nextRunAt) { + throw new Error("This one-time automation has already passed."); + } + const updated = await transaction + .update(automations) + .set({ + nextRunAt, + revision: current.revision + 1, + status, + updatedAt: now.toISOString(), + }) + .where(eq(automations.id, id)) + .returning(); + const updatedRow = updated[0]; + if (!updatedRow) throw new Error("The automation could not be updated."); + return parseAutomation(updatedRow); + }); +} + +export async function beginAutomationRun( + automationId: string, + revision: number, + triggerKey: string +) { + return db.transaction(async (transaction) => { + const rows = await transaction + .select() + .from(automations) + .where(eq(automations.id, automationId)) + .for("update") + .limit(1); + const automation = rows[0] ? parseAutomation(rows[0]) : undefined; + if (automation?.status !== "active" || automation.revision !== revision) { + return undefined; + } + + const startedAt = new Date().toISOString(); + const inserted = await transaction + .insert(automationRuns) + .values({ + automationId, + id: nanoid(), + revision, + startedAt, + triggerKey, + }) + .onConflictDoNothing({ + target: [automationRuns.automationId, automationRuns.triggerKey], + }) + .returning({ id: automationRuns.id }); + const run = inserted[0]; + return run ? { automation, runId: run.id, startedAt } : undefined; + }); +} + +export async function finishAutomationRun({ + error, + result, + runId, +}: { + readonly error?: string; + readonly result?: string; + readonly runId: string; +}) { + return db.transaction(async (transaction) => { + const rows = await transaction + .select({ + automation: automations, + runRevision: automationRuns.revision, + runStatus: automationRuns.status, + }) + .from(automationRuns) + .innerJoin(automations, eq(automations.id, automationRuns.automationId)) + .where(eq(automationRuns.id, runId)) + .for("update") + .limit(1); + const row = rows[0]; + if (!row) throw new Error(`Automation run ${runId} was not found.`); + const automation = parseAutomation(row.automation); + if (row.runStatus !== "running") return automation; + + const completedAt = new Date(); + await transaction + .update(automationRuns) + .set({ + completedAt: completedAt.toISOString(), + error: error ?? null, + result: result ?? null, + status: error === undefined ? "completed" : "failed", + }) + .where(eq(automationRuns.id, runId)); + + if ( + automation.status !== "active" || + automation.revision !== row.runRevision + ) { + return automation; + } + + if (automation.trigger.kind === "gmail") { + await transaction + .update(automations) + .set({ + lastRunAt: completedAt.toISOString(), + updatedAt: completedAt.toISOString(), + }) + .where(eq(automations.id, automation.id)); + return automation; + } + + const nextRunAt = nextAutomationRunAt( + automation.trigger, + automation.timezone, + completedAt + ); + const status = nextRunAt ? "active" : "completed"; + const updated = await transaction + .update(automations) + .set({ + lastRunAt: completedAt.toISOString(), + nextRunAt: nextRunAt?.toISOString() ?? null, + status, + updatedAt: completedAt.toISOString(), + }) + .where( + and( + eq(automations.id, automation.id), + eq(automations.revision, automation.revision) + ) + ) + .returning(); + return updated[0] ? parseAutomation(updated[0]) : automation; + }); +} + +export async function recordAutomationEveSession( + runId: string, + eveSessionId: string +) { + const updated = await db + .update(automationRuns) + .set({ eveSessionId }) + .where( + and( + eq(automationRuns.id, runId), + sql`${automationRuns.eveSessionId} IS NULL OR ${automationRuns.eveSessionId} = ${eveSessionId}` + ) + ) + .returning({ eveSessionId: automationRuns.eveSessionId }); + const sessionId = updated[0]?.eveSessionId; + if (sessionId !== eveSessionId) { + throw new Error("The automation run is owned by another Eve session."); + } +} + +export async function listActiveGmailAutomations( + workspaceId: string, + userId: string +) { + const rows = await db + .select() + .from(automations) + .where( + and( + eq(automations.workspaceId, workspaceId), + eq(automations.createdByUserId, userId), + eq(automations.status, "active"), + sql`${automations.trigger}::jsonb ->> 'kind' = 'gmail'` + ) + ); + return rows.map(parseAutomation); +} + +export async function prepareGmailWatch(scope: AccessScope) { + await ensureScope(scope); + return db.transaction(async (transaction) => { + const rows = await transaction + .select() + .from(gmailWatches) + .where( + and( + eq(gmailWatches.workspaceId, scope.workspaceId), + eq(gmailWatches.userId, scope.userId) + ) + ) + .for("update") + .limit(1); + const existing = rows[0] ? gmailWatchSchema.parse(rows[0]) : undefined; + const sufficientlyFresh = + existing?.status === "active" && + existing.expirationAt !== null && + new Date(existing.expirationAt).getTime() > + Date.now() + 24 * 60 * 60 * 1000; + if (sufficientlyFresh) { + return { generation: existing.generation, startRequired: false } as const; + } + + const now = new Date().toISOString(); + const generation = (existing?.generation ?? 0) + 1; + const status = existing?.status === "active" ? "active" : "arming"; + await transaction + .insert(gmailWatches) + .values({ + createdAt: existing?.createdAt ?? now, + generation, + status, + updatedAt: now, + userId: scope.userId, + workspaceId: scope.workspaceId, + }) + .onConflictDoUpdate({ + set: { + generation, + status, + updatedAt: now, + workflowRunId: null, + }, + target: [gmailWatches.workspaceId, gmailWatches.userId], + }); + return { generation, startRequired: true } as const; + }); +} + +export async function recordGmailWatchWorkflow( + scope: AccessScope, + generation: number, + workflowRunId: string +) { + await db + .update(gmailWatches) + .set({ workflowRunId, updatedAt: new Date().toISOString() }) + .where( + and( + eq(gmailWatches.workspaceId, scope.workspaceId), + eq(gmailWatches.userId, scope.userId), + eq(gmailWatches.generation, generation) + ) + ); +} + +export async function activateGmailWatch({ + emailAddress, + expirationAt, + generation, + historyId, + scope, +}: { + readonly emailAddress: string; + readonly expirationAt: string; + readonly generation: number; + readonly historyId: string; + readonly scope: AccessScope; +}) { + const updated = await db + .update(gmailWatches) + .set({ + emailAddress, + expirationAt, + historyId: sql`coalesce(${gmailWatches.historyId}, ${historyId})`, + status: "active", + updatedAt: new Date().toISOString(), + }) + .where( + and( + eq(gmailWatches.workspaceId, scope.workspaceId), + eq(gmailWatches.userId, scope.userId), + eq(gmailWatches.generation, generation) + ) + ) + .returning(); + return updated[0] ? gmailWatchSchema.parse(updated[0]) : undefined; +} + +export async function readGmailWatchByEmail(emailAddress: string) { + const rows = await db + .select() + .from(gmailWatches) + .where(eq(gmailWatches.emailAddress, emailAddress)) + .limit(1); + return rows[0] ? gmailWatchSchema.parse(rows[0]) : undefined; +} + +export async function advanceGmailHistory( + workspaceId: string, + userId: string, + historyId: string +) { + return db.transaction(async (transaction) => { + const rows = await transaction + .select() + .from(gmailWatches) + .where( + and( + eq(gmailWatches.workspaceId, workspaceId), + eq(gmailWatches.userId, userId) + ) + ) + .for("update") + .limit(1); + const current = rows[0] ? gmailWatchSchema.parse(rows[0]) : undefined; + if (!current) return undefined; + if ( + current.historyId !== null && + BigInt(historyId) <= BigInt(current.historyId) + ) { + return current; + } + const updated = await transaction + .update(gmailWatches) + .set({ historyId, updatedAt: new Date().toISOString() }) + .where( + and( + eq(gmailWatches.workspaceId, workspaceId), + eq(gmailWatches.userId, userId) + ) + ) + .returning(); + return gmailWatchSchema.parse(updated[0]); + }); +} + +function parseAutomation(row: typeof automations.$inferSelect): Automation { + const parsed = automationRowSchema.parse(row); + const trigger: unknown = JSON.parse(parsed.trigger); + return automationSchema.parse({ + ...parsed, + trigger, + }); +} diff --git a/db/tests/automations.test.ts b/db/tests/automations.test.ts new file mode 100644 index 00000000..6e1754c5 --- /dev/null +++ b/db/tests/automations.test.ts @@ -0,0 +1,177 @@ +import { readFile } from "node:fs/promises"; +import { PGlite } from "@electric-sql/pglite"; +import { drizzle } from "drizzle-orm/pglite"; +import { afterEach, describe, expect, it, vi } from "vitest"; +import * as Database from "@/db"; +import * as schema from "../schema"; + +const databases: PGlite[] = []; + +afterEach(async () => { + vi.restoreAllMocks(); + await Promise.all(databases.splice(0).map((database) => database.close())); +}); + +describe("automation service", () => { + it("isolates owners and deduplicates saved automations and runs", async () => { + const client = new PGlite(); + databases.push(client); + await applyMigration(client, "0000_fluffy_the_spike.sql"); + await applyMigration(client, "0006_chilly_the_leader.sql"); + await applyMigration(client, "0007_freezing_silver_sable.sql"); + const database = drizzle(client, { schema }); + // SAFETY: PGlite implements the Drizzle query surface used by this service test. + // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- This test swaps only the driver while retaining the shared schema and query contract. + const testDatabase = database as never; + vi.spyOn(Database, "db", "get").mockReturnValue(testDatabase); + + const [automations, scopeService, sessions] = await Promise.all([ + import("@/db/services/automations"), + import("@/db/services/scope"), + import("@/db/services/sessions"), + ]); + const alice = { userId: "alice", workspaceId: "workspace:alice" }; + const bob = { userId: "bob", workspaceId: "workspace:bob" }; + await scopeService.ensureScope(alice); + await scopeService.ensureScope(bob); + await sessions.claimSession(alice, "session-alice"); + + const runAt = new Date(Date.now() + 50).toISOString(); + const input = { + idempotencyKey: "session-alice:call-1", + phoneNumber: "+12125550123", + sessionId: "session-alice", + task: "Check the L train and summarize it.", + timezone: "America/New_York", + title: "L train status", + trigger: { at: runAt, kind: "at" } as const, + }; + const created = await automations.createAutomation(alice, input); + const retried = await automations.createAutomation(alice, input); + expect(retried.id).toBe(created.id); + expect(await automations.listAutomations(bob)).toEqual([]); + + const firstRun = await automations.beginAutomationRun( + created.id, + created.revision, + `timer:${runAt}` + ); + expect(firstRun?.automation.id).toBe(created.id); + await expect( + automations.beginAutomationRun( + created.id, + created.revision, + `timer:${runAt}` + ) + ).resolves.toBeUndefined(); + await new Promise((resolve) => setTimeout(resolve, 60)); + const completed = await automations.finishAutomationRun({ + result: "No L train delays.", + runId: firstRun?.runId ?? "missing", + }); + expect(completed.status).toBe("completed"); + expect(completed.nextRunAt).toBeNull(); + + const recurring = await automations.createAutomation(alice, { + ...input, + idempotencyKey: "session-alice:call-2", + trigger: { everyMinutes: 5, kind: "interval" }, + }); + if (!recurring.nextRunAt) + throw new Error("Expected the next interval run."); + const recurringRun = await automations.beginAutomationRun( + recurring.id, + recurring.revision, + `timer:${recurring.nextRunAt}` + ); + const paused = await automations.setAutomationStatus( + alice, + recurring.id, + "paused" + ); + await automations.finishAutomationRun({ + result: "Finished after the pause.", + runId: recurringRun?.runId ?? "missing", + }); + const preservedRecurring = (await automations.listAutomations(alice)).find( + (automation) => automation.id === recurring.id + ); + expect(paused?.status).toBe("paused"); + expect(preservedRecurring).toMatchObject({ + nextRunAt: null, + revision: 2, + status: "paused", + }); + }, 15_000); + + it("arms one shared Gmail watch per connected user", async () => { + const client = new PGlite(); + databases.push(client); + await applyMigration(client, "0000_fluffy_the_spike.sql"); + await applyMigration(client, "0006_chilly_the_leader.sql"); + await applyMigration(client, "0007_freezing_silver_sable.sql"); + const database = drizzle(client, { schema }); + // SAFETY: PGlite implements the Drizzle query surface used by this service test. + // oxlint-disable-next-line typescript/no-unsafe-type-assertion -- This test swaps only the driver while retaining the shared schema and query contract. + const testDatabase = database as never; + vi.spyOn(Database, "db", "get").mockReturnValue(testDatabase); + const [automations, scopeService] = await Promise.all([ + import("@/db/services/automations"), + import("@/db/services/scope"), + ]); + const scope = { userId: "alice", workspaceId: "workspace:alice" }; + await scopeService.ensureScope(scope); + + const prepared = await automations.prepareGmailWatch(scope); + expect(prepared).toEqual({ generation: 1, startRequired: true }); + await automations.activateGmailWatch({ + emailAddress: "alice@example.com", + expirationAt: new Date( + Date.now() + 6 * 24 * 60 * 60 * 1000 + ).toISOString(), + generation: prepared.generation, + historyId: "12345", + scope, + }); + await expect(automations.prepareGmailWatch(scope)).resolves.toEqual({ + generation: 1, + startRequired: false, + }); + await automations.activateGmailWatch({ + emailAddress: "alice@example.com", + expirationAt: new Date(Date.now() + 60 * 60 * 1000).toISOString(), + generation: prepared.generation, + historyId: "12345", + scope, + }); + const renewal = await automations.prepareGmailWatch(scope); + expect(renewal).toEqual({ generation: 2, startRequired: true }); + expect( + await automations.readGmailWatchByEmail("alice@example.com") + ).toMatchObject({ historyId: "12345", status: "active" }); + await automations.activateGmailWatch({ + emailAddress: "alice@example.com", + expirationAt: new Date( + Date.now() + 6 * 24 * 60 * 60 * 1000 + ).toISOString(), + generation: renewal.generation, + historyId: "99999", + scope, + }); + expect( + await automations.readGmailWatchByEmail("alice@example.com") + ).toMatchObject({ historyId: "12345", status: "active" }); + }, 15_000); +}); + +async function applyMigration(database: PGlite, name: string) { + const migration = await readFile( + new URL(`../migrations/${name}`, import.meta.url), + "utf8" + ); + /* oxlint-disable eslint/no-await-in-loop -- SQL migration statements must execute in file order. */ + for (const statement of migration.split("--> statement-breakpoint")) { + if (statement.trim()) await database.exec(statement); + } + /* oxlint-enable eslint/no-await-in-loop */ +} diff --git a/db/tests/database-migration.test.ts b/db/tests/database-migration.test.ts index 2399670b..918965bd 100644 --- a/db/tests/database-migration.test.ts +++ b/db/tests/database-migration.test.ts @@ -18,6 +18,8 @@ describe("database migrations", () => { await applyMigration(database, "0003_unusual_fabian_cortez.sql"); await applyMigration(database, "0004_kind_manta.sql"); await applyMigration(database, "0005_brave_kang.sql"); + await applyMigration(database, "0006_chilly_the_leader.sql"); + await applyMigration(database, "0007_freezing_silver_sable.sql"); await applyMigration(database, "0000_fluffy_the_spike.sql"); await applyMigration(database, "0001_better-auth.sql"); @@ -44,6 +46,8 @@ describe("database migrations", () => { 'vault_items', 'settings', 'agent_sessions', + 'automation_runs', + 'automations', 'browser_image_artifacts', 'browser_sessions', 'browser_traces', @@ -51,6 +55,7 @@ describe("database migrations", () => { 'browser_trace_events', 'chats', 'encrypted_secrets', + 'gmail_watches', 'user', 'session', 'account', @@ -59,7 +64,7 @@ describe("database migrations", () => { ); const pendingConstraints = await pendingConstraintCount(database); - expect(tables.rows[0]?.count).toBe(16); + expect(tables.rows[0]?.count).toBe(19); expect(pendingConstraints).toBe(0); await expect( database.query("SELECT id FROM vault_items WHERE id = 'contact-1'") diff --git a/db/tests/database-schema.test.ts b/db/tests/database-schema.test.ts index 1453198c..90e4a743 100644 --- a/db/tests/database-schema.test.ts +++ b/db/tests/database-schema.test.ts @@ -5,6 +5,8 @@ import { z } from "zod"; import { account, agentSessions, + automationRuns, + automations, browserImageArtifacts, browserSessions, browserTraceDomains, @@ -12,6 +14,7 @@ import { browserTraces, chats, encryptedSecrets, + gmailWatches, session, settings, user, @@ -30,6 +33,8 @@ describe("database schema", () => { vaultItems, settings, agentSessions, + automationRuns, + automations, browserImageArtifacts, browserSessions, browserTraces, @@ -37,6 +42,7 @@ describe("database schema", () => { browserTraceEvents, chats, encryptedSecrets, + gmailWatches, user, session, account, @@ -48,6 +54,8 @@ describe("database schema", () => { "vault_items", "settings", "agent_sessions", + "automation_runs", + "automations", "browser_image_artifacts", "browser_sessions", "browser_traces", @@ -55,6 +63,7 @@ describe("database schema", () => { "browser_trace_events", "chats", "encrypted_secrets", + "gmail_watches", "user", "session", "account", @@ -68,6 +77,7 @@ describe("database schema", () => { browserImageArtifacts, browserSessions, browserTraces, + automations, ]) { const foreignKeys = getTableConfig(table).foreignKeys; expect(foreignKeys.map((foreignKey) => foreignKey.getName())).toContain( @@ -88,6 +98,21 @@ describe("database schema", () => { } }); + it("anchors Gmail watches to their workspace member", () => { + const membership = getTableConfig(gmailWatches).foreignKeys.find( + (foreignKey) => foreignKey.getName() === "gmail_watches_membership_fkey" + ); + const reference = membership?.reference(); + expect(reference?.columns.map((column) => column.name)).toEqual([ + "workspace_id", + "user_id", + ]); + expect(reference?.foreignColumns.map((column) => column.name)).toEqual([ + "workspace_id", + "user_id", + ]); + }); + it("keeps every workspace-owned table connected to the workspace root", () => { for (const table of [ workspaceMemberships, diff --git a/next.config.ts b/next.config.ts index 09a04884..88ac9bfe 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,6 +1,7 @@ import type { NextConfig } from "next"; import { withEve } from "eve/next"; +import { withWorkflow } from "workflow/next"; const nextConfig: NextConfig = {}; -export default withEve(nextConfig); +export default withEve(withWorkflow(nextConfig)); diff --git a/package.json b/package.json index e9318031..7d09759c 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "tailwind-merge": "3.6.0", "tailwindcss": "4.3.3", "use-stick-to-bottom": "1.1.6", + "workflow": "5.0.0-beta.43", "zod": "4.4.3" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 683f6144..8d333778 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,16 +10,16 @@ importers: dependencies: '@base-ui/react': specifier: ^1.7.0 - version: 1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 1.7.0(@types/react@19.2.18)(date-fns@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) '@googleapis/calendar': specifier: ^16.0.0 - version: 16.0.0 + version: 16.0.0(supports-color@8.1.1) '@googleapis/gmail': specifier: ^18.0.0 - version: 18.0.0 + version: 18.0.0(supports-color@8.1.1) '@googleapis/people': specifier: ^8.0.0 - version: 8.0.0 + version: 8.0.0(supports-color@8.1.1) '@onkernel/sdk': specifier: ^0.96.0 version: 0.96.0 @@ -28,13 +28,13 @@ importers: version: 1.9.1 '@streamdown/cjk': specifier: 1.0.3 - version: 1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.8)(unified@11.0.5) + version: 1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1))(react@19.2.8)(supports-color@8.1.1)(unified@11.0.5) '@streamdown/code': specifier: 1.1.1 version: 1.1.1(react@19.2.8) '@streamdown/math': specifier: 1.0.2 - version: 1.0.2(react@19.2.8) + version: 1.0.2(react@19.2.8)(supports-color@8.1.1) '@streamdown/mermaid': specifier: 1.0.2 version: 1.0.2(react@19.2.8) @@ -61,13 +61,13 @@ importers: version: 2.8.0 '@vercel/connect': specifier: ^2.0.0 - version: 2.0.0(c8ba74d3560b66367327a185277b6d95) + version: 2.0.0(b1d8a4df8cc9903d686597098ee3e8be) ai: specifier: ^7.0.79 version: 7.0.83(zod@4.4.3) better-auth: specifier: 1.7.2 - version: 1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))) + version: 1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))) class-variance-authority: specifier: 0.7.1 version: 0.7.1 @@ -85,10 +85,10 @@ importers: version: 0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0) eve: specifier: ^0.46.1 - version: 0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) evlog: specifier: 2.27.1 - version: 2.27.1(ai@7.0.83(zod@4.4.3))(eve@0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(express@5.2.1)(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@2.0.0-alpha.3)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 2.27.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nuxt/kit@4.4.8)(ai@7.0.83(zod@4.4.3))(eve@0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(express@5.2.1(supports-color@8.1.1))(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@2.0.0-alpha.3)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) lucide-react: specifier: 1.34.0 version: 1.34.0(react@19.2.8) @@ -100,7 +100,7 @@ importers: version: 6.0.1 next: specifier: 16.3.3 - version: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) pg: specifier: ^8.23.0 version: 8.23.0 @@ -112,7 +112,7 @@ importers: version: 19.2.8(react@19.2.8) streamdown: specifier: 2.6.0 - version: 2.6.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + version: 2.6.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1) tailwind-merge: specifier: 3.6.0 version: 3.6.0 @@ -122,6 +122,9 @@ importers: use-stick-to-bottom: specifier: 1.1.6 version: 1.1.6(react@19.2.8) + workflow: + specifier: 5.0.0-beta.43 + version: 5.0.0-beta.43(@aws-sdk/credential-provider-web-identity@3.972.49)(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(reflect-metadata@0.2.2)(rxjs@7.8.2))(@opentelemetry/api@1.9.1)(@swc/cli@0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0)(supports-color@8.1.1))(@swc/core@1.15.3(@swc/helpers@0.5.23))(@swc/helpers@0.5.23)(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)(typescript@6.0.3)(ws@8.21.3) zod: specifier: 4.4.3 version: 4.4.3 @@ -152,10 +155,10 @@ importers: version: 0.31.10 eslint-plugin-react-hooks: specifier: 7.1.1 - version: 7.1.1(eslint@10.9.1(jiti@2.7.0)) + version: 7.1.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1) eslint-plugin-turbo: specifier: 2.10.12 - version: 2.10.12(eslint@10.9.1(jiti@2.7.0))(turbo@2.10.12) + version: 2.10.12(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(turbo@2.10.12) knip: specifier: 6.32.3 version: 6.32.3 @@ -173,7 +176,7 @@ importers: version: 7.0.2001 shadcn: specifier: 4.19.0 - version: 4.19.0(typescript@6.0.3) + version: 4.19.0(supports-color@8.1.1)(typescript@6.0.3) taze: specifier: 21.1.0 version: 21.1.0 @@ -185,10 +188,10 @@ importers: version: 6.0.3 vercel: specifier: ^59.6.2 - version: 59.6.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) + version: 59.6.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(supports-color@8.1.1) vitest: specifier: 4.1.11 - version: 4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + version: 4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) packages: @@ -220,6 +223,34 @@ packages: engines: {node: '>=20.19.0'} hasBin: true + '@aws-sdk/core@3.977.9': + resolution: {integrity: sha512-reqPFEQrZxDZpeGj4PFMepBeR5LGYHRqq/L0motTzgFkCRBA4rFdaVXDSLYyGHhxVz7sT2PDnPN9CluGSfgyJA==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.972.49': + resolution: {integrity: sha512-IYx1lN38MnnPXv+NBLpuATu0cZakbZ321TAfjW+aVkw7HIJF38YnEwdeEO55MSl3pl7hIX1IvvnD6EmnAzmAJw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/nested-clients@3.997.44': + resolution: {integrity: sha512-NhEgryjlBF9w38ZXqGymQV28IhkYa1mKhlbYnqIis57AYwWGVYfUPgg/qC2rLRqOUfblxx++irvju10kVTa8Vw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.996.46': + resolution: {integrity: sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/types@3.974.5': + resolution: {integrity: sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/xml-builder@3.972.40': + resolution: {integrity: sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA==} + engines: {node: '>=20.0.0'} + + '@aws/lambda-invoke-store@0.3.0': + resolution: {integrity: sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.29.7': resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} engines: {node: '>=6.9.0'} @@ -462,12 +493,45 @@ packages: '@better-fetch/fetch@1.3.1': resolution: {integrity: sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g==} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} '@bytecodealliance/preview2-shim@0.17.6': resolution: {integrity: sha512-n3cM88gTen5980UOBAD6xDcNNL3ocTK8keab21bpx1ONdA+ARj7uD1qoFxOWCyKlkpSi195FH+GeAut7Oc6zZw==} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.2': + resolution: {integrity: sha512-ZKZ/F8US7JR92J4DMct6cLW/Y66o2K576+zjlEN/MevH70bFIsB10wkZEQPLzl2oNh2SMGy55xpJ9JoBRl5DOA==} + cpu: [arm64] + os: [darwin] + + '@cbor-extract/cbor-extract-darwin-x64@2.2.2': + resolution: {integrity: sha512-32b1mgc+P61Js+KW9VZv/c+xRw5EfmOcPx990JbCBSkYJFY0l25VinvyyWfl+3KjibQmAcYwmyzKF9J4DyKP/Q==} + cpu: [x64] + os: [darwin] + + '@cbor-extract/cbor-extract-linux-arm64@2.2.2': + resolution: {integrity: sha512-wfqgzqCAy/Vn8i6WVIh7qZd0DdBFaWBjPdB6ma+Wihcjv0gHqD/mw3ouVv7kbbUNrab6dKEx/w3xQZEdeXIlzg==} + cpu: [arm64] + os: [linux] + + '@cbor-extract/cbor-extract-linux-arm@2.2.2': + resolution: {integrity: sha512-tNg0za41TpQfkhWjptD+0gSD2fggMiDCSacuIeELyb2xZhr7PrhPe5h66Jc67B/5dmpIhI2QOUtv4SBsricyYQ==} + cpu: [arm] + os: [linux] + + '@cbor-extract/cbor-extract-linux-x64@2.2.2': + resolution: {integrity: sha512-rpiLnVEsqtPJ+mXTdx1rfz4RtUGYIUg2rUAZgd1KjiC1SehYUSkJN7Yh+aVfSjvCGtVP0/bfkQkXpPXKbmSUaA==} + cpu: [x64] + os: [linux] + + '@cbor-extract/cbor-extract-win32-x64@2.2.2': + resolution: {integrity: sha512-dI+9P7cfWxkTQ+oE+7Aa6onEn92PHgfWXZivjNheCRmTBDBf2fx6RyTi0cmgpYLnD1KLZK9ZYrMxaPZ4oiXhGA==} + cpu: [x64] + os: [win32] + '@chevrotain/types@11.1.2': resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} @@ -536,6 +600,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.18.20': resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -554,6 +624,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.18.20': resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -572,6 +648,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.18.20': resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -590,6 +672,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.18.20': resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -608,6 +696,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.18.20': resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -626,6 +720,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -644,6 +744,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -662,6 +768,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.18.20': resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -680,6 +792,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.18.20': resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -698,6 +816,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.18.20': resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -716,6 +840,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.18.20': resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -734,6 +864,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.18.20': resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -752,6 +888,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.18.20': resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -770,6 +912,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.18.20': resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -788,6 +936,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.18.20': resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -806,6 +960,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.18.20': resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -824,6 +984,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.12': resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} @@ -836,6 +1002,12 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -854,6 +1026,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.12': resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} @@ -866,6 +1044,12 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -884,6 +1068,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/openharmony-arm64@0.25.12': resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} @@ -896,6 +1086,12 @@ packages: cpu: [arm64] os: [openharmony] + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + '@esbuild/sunos-x64@0.18.20': resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -914,6 +1110,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.18.20': resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -932,6 +1134,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.18.20': resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -950,6 +1158,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.18.20': resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -968,6 +1182,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.10.1': resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1258,6 +1478,13 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + '@mapbox/node-pre-gyp@2.0.3': resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} engines: {node: '>=18'} @@ -1357,6 +1584,119 @@ packages: resolution: {integrity: sha512-d0d4Oyxm+v980PEq1ZH2PmS6cvpMIRc17eYpiU47KgW+lzxklMu6+HOEOPmxrpnF/XQZ0+Q78I2mgMhbIIo/dg==} engines: {node: '>= 10'} + '@napi-rs/nice-android-arm-eabi@1.1.1': + resolution: {integrity: sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@napi-rs/nice-android-arm64@1.1.1': + resolution: {integrity: sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@napi-rs/nice-darwin-arm64@1.1.1': + resolution: {integrity: sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/nice-darwin-x64@1.1.1': + resolution: {integrity: sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/nice-freebsd-x64@1.1.1': + resolution: {integrity: sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + resolution: {integrity: sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + resolution: {integrity: sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} + engines: {node: '>= 10'} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} + engines: {node: '>= 10'} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/nice-linux-x64-musl@1.1.1': + resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/nice-openharmony-arm64@1.1.1': + resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [openharmony] + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + resolution: {integrity: sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + resolution: {integrity: sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + resolution: {integrity: sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/nice@1.1.1': + resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} + engines: {node: '>= 10'} + '@napi-rs/wasm-runtime@1.2.3': resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} @@ -1368,6 +1708,37 @@ packages: resolution: {integrity: sha512-r3ZZhRjEcfEdKIZnoB1RusNgvHuaBRqfCzV4Gi+5A9yUX0S4HTws/ASWqt13wL4y4I+0rqsWGdA2w7EQXHi3+Q==} engines: {node: '>=19.0.0'} + '@nestjs/common@12.0.1': + resolution: {integrity: sha512-v0zTaRCTV2K2xSnb3GnJoQKtaR6VxouJtm+P2gpr5w61dlXeWpXl1WVknCSzUqx2QwTV10tBkHETxvQvkf2Exg==} + peerDependencies: + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/core@12.0.1': + resolution: {integrity: sha512-rU6tAi8vDdyzHgN0iW0J4UJvziroOqzHqzlqL7phOSPizaXVEePfv+OUOsdJEOh0Qd14mslc3udOheLrAEcZow==} + engines: {node: '>= 20'} + peerDependencies: + '@nestjs/common': ^12.0.0 + '@nestjs/microservices': ^12.0.0 + '@nestjs/platform-express': ^12.0.0 + '@nestjs/websockets': ^12.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + '@next/env@16.3.3': resolution: {integrity: sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==} @@ -1443,6 +1814,18 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nuxt/kit@4.4.8': + resolution: {integrity: sha512-ZUlZ5iYfyfJFDPluhn6ZxFWcsuxWbLnZBc8w3MAROcQ4lYfZ+qFpALBLSNlpc0zhOa++33EE+5PEbOAdVIY+dw==} + engines: {node: '>=18.12.0'} + + '@oclif/core@4.11.4': + resolution: {integrity: sha512-URwiQ5ALx/sJ2iH4vzXEd+H4K6NAI7LRs6Jag3hrgKEpGmaE6alfRC8qjO4GIgb6A3ACaJumqP9twi/M9ywdHQ==} + engines: {node: '>=18.0.0'} + + '@oclif/plugin-help@6.2.37': + resolution: {integrity: sha512-5N/X/FzlJaYfpaHwDC0YHzOzKDWa41s9t+4FpCDu4f9OMReds4JeNBaaWk9rlIzdKjh2M6AC5Q18ORfECRkHGA==} + engines: {node: '>=18.0.0'} + '@onkernel/sdk@0.96.0': resolution: {integrity: sha512-x23psMiKLsHA2CSuvvyHkcxVx/d5UN3PynloVWf4Fgy3Qt9pYotIXb7DEidXJBFYfIodNBMuHl9wPguK3r6Zow==} @@ -2615,10 +2998,37 @@ packages: '@sinclair/typebox@0.25.24': resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} + engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} + '@smithy/core@3.33.3': + resolution: {integrity: sha512-CsOeKq/9kA3y6VJHt+/+VTCtBaxJ4OTFpgrjIUhPpDIKxBci1k2bJaQASF2h/ELWrulGp+t97DZ0mevfAD8idg==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.7.2': + resolution: {integrity: sha512-nZyWTmSpJEXl6VtWVMBJve/7x12DZu6sIX1z1a+ZMaHlQQRs9Zpu6NbTe/gmxYXVRpkjxyDYpZ5gx2IM6f/Wkw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.11.3': + resolution: {integrity: sha512-2jY1tSpERfPfWqyBV2pH+iGFaghVsIJszJNsT7hxtQYhVJpWDyc0LqOWI+nXOxOAHaEfZ4PXXtp1wW1TGpHhkA==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.7.3': + resolution: {integrity: sha512-7ImGm+FkHRLcBaRttIAMZ6bzJZWb2cJGoYjq46F2UjycujWzrL9GEN9h4w7eQyXJYnltrUhxbbieBAIRrdqpow==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.17.2': + resolution: {integrity: sha512-FOKpVZob9MPTn2znRzGrnsMHv7BOsKVw3XiP/cOyYLDVZ9qKp4nifIiSCuUU/fIj5Vu0UOAxCFr+qRAtG0NUkA==} + engines: {node: '>=18.0.0'} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} @@ -2642,11 +3052,101 @@ packages: peerDependencies: react: ^18.0.0 || ^19.0.0 - '@swc/helpers@0.5.23': - resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} - - '@t3-oss/env-core@0.13.11': - resolution: {integrity: sha512-sM7GYY+KL7H/Hl0BE0inWfk3nRHZOLhmVn7sHGxaZt9FAR6KqREXAE+6TqKfiavfXmpRxO/OZ2QgKRd+oiBYRQ==} + '@swc/cli@0.8.1': + resolution: {integrity: sha512-L+ACCGHCiS0VqHVep/INLVnvRvJ2XooQFLZq4L8snhxw1jsqz+XRcY313UsyPVturPPE1shW3jic7rt3qEQTSQ==} + engines: {node: '>= 20.19.0'} + hasBin: true + peerDependencies: + '@swc/core': ^1.2.66 + chokidar: ^5.0.0 + peerDependenciesMeta: + chokidar: + optional: true + + '@swc/core-darwin-arm64@1.15.3': + resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.15.3': + resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.15.3': + resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.15.3': + resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-arm64-musl@1.15.3': + resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@swc/core-linux-x64-gnu@1.15.3': + resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@swc/core-linux-x64-musl@1.15.3': + resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@swc/core-win32-arm64-msvc@1.15.3': + resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.15.3': + resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.15.3': + resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.15.3': + resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.23': + resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==} + + '@swc/types@0.1.28': + resolution: {integrity: sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw==} + + '@t3-oss/env-core@0.13.11': + resolution: {integrity: sha512-sM7GYY+KL7H/Hl0BE0inWfk3nRHZOLhmVn7sHGxaZt9FAR6KqREXAE+6TqKfiavfXmpRxO/OZ2QgKRd+oiBYRQ==} peerDependencies: arktype: ^2.1.0 typescript: '>=5.0.0' @@ -2779,6 +3279,13 @@ packages: peerDependencies: react: ^18 || ^19 + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -2961,6 +3468,9 @@ packages: '@types/hast@3.0.5': resolution: {integrity: sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -3024,6 +3534,9 @@ packages: resolution: {integrity: sha512-kU8CDgcHvKUokW5UH5YodJ3sTplyszvWBSoH62qj6W8NGYmHNdtf8TXj8uTfm2WIty+d6mVbTsVtQhBc4jySOw==} hasBin: true + '@vercel/cli-auth@0.0.1': + resolution: {integrity: sha512-CnqiuMlZ4pjs2LCPYiR6aLKPPd3Xb8SBI1Y7eotXKgpx6qgrGNY+E7EIyUt5ErGHJGIrCZyGG5WEo4bHtVmz2Q==} + '@vercel/cli-auth@0.3.5': resolution: {integrity: sha512-DSkTWamJrhgCUrymOSCWysbiVeLsvPINhoKVTw+mypoyIJxKQxDgQaafvZ0OYGS2qg8wVUY30HgDugzaEdwo6Q==} @@ -3170,6 +3683,15 @@ packages: peerDependencies: '@vercel/build-utils': 14.5.0 + '@vercel/queue@0.5.0': + resolution: {integrity: sha512-TqvoMuhZK9Hw2yal6ee6EZ+wQw55+qPrpev6O6jJrpJMC1myrCrt7bLZvb9GQDIR35h40EiETVaMZT4eFWBVpA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@vercel/redwood@5.0.1': resolution: {integrity: sha512-9vpT+WFl1qFxzJRZ/gHboHubrseaIa4/cwaFJya1OCKb04eeC6H4oaHZhBJESnkD9z6L9czxr5OmZqIPfDBi8A==} peerDependencies: @@ -3250,12 +3772,146 @@ packages: '@vitest/utils@4.1.11': resolution: {integrity: sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==} + '@workflow/astro@5.0.0-beta.43': + resolution: {integrity: sha512-y/Wg4/IkMRJeeEBf6oj9Cm+QwAa3mhi9NrnyBtLezn4Eo64oKbjkqrFNBDIntQRy6FZ7SQ8giaxv12Jw2TrxCA==} + + '@workflow/builders@5.0.0-beta.43': + resolution: {integrity: sha512-FF+JSfDYG1+Y+cKbqvIwwEZVEn68kVI5ZbyEirayBar52XkDwU42y4hO/oACn/HsOj3crPdjqlGBWFszvCEm/Q==} + + '@workflow/cli@5.0.0-beta.43': + resolution: {integrity: sha512-+IhtwjYplPDsReVJmG0/Ft6vmVNrv+dTvWFkrkH0zzLwOVIzcOBGACCYTaYd07ff8oJrPgLqAdzS4XYm0KLT8w==} + hasBin: true + + '@workflow/core@5.0.0-beta.43': + resolution: {integrity: sha512-o3vdzxhL9HNJ3zA7GzCw0dkFNQryMVv8FUfb8c1XdKx4+gnQuOQFYj1TQadmPnCsRoJh1eVVe2y8OtvevuZwsg==} + peerDependencies: + '@opentelemetry/api': '1' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@workflow/errors@5.0.0-beta.17': + resolution: {integrity: sha512-orc86yllgOKpss/o5YD4kuhRbng+4aq8i4pPJR4uZCFeNpn4I4A+ek83lelQf31EJ5tyf12ikceOjabQxp317A==} + + '@workflow/nest@5.0.0-beta.43': + resolution: {integrity: sha512-MBr8bvc7B6LLlqCrz/oUUk4+NfBR7+3GMfm1dADh6nkcLB6jrfn/wETz+O7vAiGnawMPsaGde4SgOxC5i7MCqg==} + hasBin: true + peerDependencies: + '@nestjs/common': '>=10.0.0' + '@nestjs/core': '>=10.0.0' + '@swc/cli': '>=0.4.0' + '@swc/core': '>=1.5.0' + + '@workflow/next@5.0.0-beta.43': + resolution: {integrity: sha512-ZTfkOjhYyPpN7SONopmGsbhUXw44gBlgElfs0dtzRUsym6Mc9baPhtcqD79jRnD3i0JCw6ZOieexXOM+EX2O7A==} + peerDependencies: + next: '>13' + peerDependenciesMeta: + next: + optional: true + + '@workflow/nitro@5.0.0-beta.43': + resolution: {integrity: sha512-zfeikADnvYWPJSGIFjN7ynSP90/L43xILWvc0iUp/UJImYJhoA3SlS22uLXcdUat+6lcdesNkixGhbn8SUT11A==} + + '@workflow/nuxt@5.0.0-beta.43': + resolution: {integrity: sha512-BagrStv7gtEBHDJm+1wvpLWdQoIxTO5nfjuONIvkbYj0zwqPe2caKx3fDoEPgiCfgp6ynRqbQNzch1LcI2+v6Q==} + + '@workflow/rollup@5.0.0-beta.43': + resolution: {integrity: sha512-ihSyfbbB4/PuQTwYS1emwOvNbItTnXvaCIzYiFYB9CwE6JgxizHd7+sNzRGyxa1gPM6MyKHdySvH8gPS6uWT5Q==} + '@workflow/serde@4.1.0': resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} '@workflow/serde@4.1.0-beta.2': resolution: {integrity: sha512-8kkeoQKLDaKXefjV5dbhBj2aErfKp1Mc4pb6tj8144cF+Em5SPbyMbyLCHp+BVrFfFVCBluCtMx+jjvaFVZGww==} + '@workflow/serde@5.0.0-beta.2': + resolution: {integrity: sha512-INB+FcEKQkkFZa+s53sEMTNRFiBa2g9vzjsNuEDagvWxtI0t/cnCyoc57i7kS7nj+3/vGeRjO4Yn5ccbT0hyBQ==} + + '@workflow/sveltekit@5.0.0-beta.43': + resolution: {integrity: sha512-Zc0qrFMfPFGLHN0CJ9ehFGSadxmlp7HohXVWejvO7+gagSJEFRJUuhh+ZbzUeqZGoy1V7Huvpll6Gx1OHnWqcA==} + + '@workflow/swc-plugin@5.0.0-beta.5': + resolution: {integrity: sha512-Xk2UQePkuxTrgqU0EWZPRWM9Ttj9bcMAY+x700yg/0TQnD3MSxjY6/yC3e8wGr2dfzXik5zuH+Ixrog1CdBqeg==} + peerDependencies: + '@swc/core': 1.15.3 + + '@workflow/typescript-plugin@5.0.0-beta.5': + resolution: {integrity: sha512-IcP+tMktxXT02H60+Or+0rSKcydhg3CMM5CWTzpnnXlhW3rqBniA/FheWYvtR7HTM7x+Xht1W1eFm8PsaGQpxg==} + peerDependencies: + typescript: '>=5.0.0' + peerDependenciesMeta: + typescript: + optional: true + + '@workflow/utils@5.0.0-beta.8': + resolution: {integrity: sha512-dDiQ/LT05g9HyOicqWNNX/Gw/fmO7Ma2kZ+ddUXXpm/EFTMRS9eiI69suSe1+1NnhMzdV6ObI8wrO5lvQqPIbg==} + + '@workflow/vite@5.0.0-beta.43': + resolution: {integrity: sha512-erigf9N/bHYztCQ5I2YGD+gBmcK4aFkpu1GXbepUutvwVFm0cC6Ir8iYE+hjxNP6q8hCW7WG+smjfuKn3Po1sA==} + + '@workflow/web@5.0.0-beta.43': + resolution: {integrity: sha512-RON3okMMIwKGOIjLMKtFGgV/z2Ib71fg2MIijqEl/x7ahxgot9rhoVn95jnKaRpXLqq3tqjrWSQZ/F2Yek4wtQ==} + + '@workflow/world-local@5.0.0-beta.37': + resolution: {integrity: sha512-rruX3MZUqIyaFIEeHrdHyG6caogSFtf06Zxz1FYBOjNTKs4dE3W67obHM5rzD/5mjlQc9dmTye1/3+0NQ6wyag==} + peerDependencies: + '@opentelemetry/api': '1' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@workflow/world-vercel@5.0.0-beta.39': + resolution: {integrity: sha512-9Rr+P7pJ07nbOXGZPgYBbvhW11UqFa64xHmln3hjIndpN2/f04Td8lZLR6u5FTxrN+hZSd85ORih3j1a0Ov20w==} + peerDependencies: + '@opentelemetry/api': '1' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@workflow/world@5.0.0-beta.28': + resolution: {integrity: sha512-dW1gH4lL4GClAzklgQhQvKVo4pCmWwqrUN06ni+a6jdVt9Uk5MEPdDTBzYpDYH0caYvlFscIzajaYpE5ol2aRA==} + + '@xhmikosr/archive-type@8.1.0': + resolution: {integrity: sha512-EXOjEbnZFE5c/nFMf4FOrEURVanzHpnkPYmnmr78u02/8hAhE0FMq8p9TK1IM0/bFr5VcyBUY0gfLm8f7dKy+Q==} + engines: {node: '>=20'} + + '@xhmikosr/bin-check@8.2.2': + resolution: {integrity: sha512-Y/b0YJoCDda6DCFj8ikks06GrEWDsz/3vdgGLeectV9p+YJc76YugRjtqFdd2KTf2rnEPjalL2hcXP+x2KcSLQ==} + engines: {node: '>=20'} + + '@xhmikosr/bin-wrapper@14.5.1': + resolution: {integrity: sha512-UZUuTYWxeAbTIiRKKEAmV3csoE36B3CGFZrYYn87+bSEBTyJ32p5gx5Gmj5HOgyOtioFUypbOZ1V5M/l/VoePw==} + engines: {node: '>=20'} + + '@xhmikosr/decompress-tar@9.0.2': + resolution: {integrity: sha512-8nPZ6lZ3ExhsSxi/X/PMB3K+Vtsuxk43HowxYpxw4AsCHTYqFBXwC8B3Y+M/meaUOGOVm+2tFNUAfWGRjBt+Ww==} + engines: {node: '>=20'} + + '@xhmikosr/decompress-tarbz2@9.0.2': + resolution: {integrity: sha512-m0DvZhE7remCxtS8xY2iHSjivT4v+iyYDdfNoeuu8Nm+7g8xEXdLKSyDEicu4u1ImJLLGEfjMuTLera/F6UGWw==} + engines: {node: '>=20'} + + '@xhmikosr/decompress-targz@9.0.1': + resolution: {integrity: sha512-1JXu2b6yrpm5EuBoOzMU57B4qrHXJKWQQ7LlMynNEiz85mEjDciO3ayf//GXaTLLCEKiHjWlU3q3THjgf7uODA==} + engines: {node: '>=20'} + + '@xhmikosr/decompress-unzip@8.2.1': + resolution: {integrity: sha512-2MS94QnmXQwjkKN8WyFiu1sU7J3rcWJcMze4kRYsX7tN+CXpUGECgkh4YSOhujpkWPuVlFudIziJHO/TxOqkQQ==} + engines: {node: '>=20'} + + '@xhmikosr/decompress@11.1.4': + resolution: {integrity: sha512-ZbYL7SAfY37/TMpopqBR3mQiuQ76kI/RNpN4q82YHSw/UxktZNy8P4wgiKPSrTImMAWRaUG8UK1pgEa56YdLaw==} + engines: {node: '>=20'} + + '@xhmikosr/downloader@16.3.1': + resolution: {integrity: sha512-M67dvznaFbsvoqhGT4FsHWysaXXQ8386OViGZm0WOyQS3apW9p16WgvHp9nWj2vfKQAR2ZdqIBPNCHSM5rKSCg==} + engines: {node: '>=20'} + + '@xhmikosr/os-filter-obj@4.1.0': + resolution: {integrity: sha512-y5ArHvQ7BVule/+L9yE2nYMhceiJhgsqo58lOfnisQ7bg+Kjfmkgr7JBuVFiTkl+ErdShpp829QstZQyLugl8g==} + engines: {node: '>=20'} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -3314,10 +3970,21 @@ packages: ajv@8.6.3: resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3334,6 +4001,10 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + ansis@3.17.0: + resolution: {integrity: sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==} + engines: {node: '>=14'} + any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} @@ -3372,6 +4043,9 @@ packages: async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + atomically@1.7.0: resolution: {integrity: sha512-Xcz9l0z7y9yQ9rdDaxlmaI4uJHf/T8g9hOEzJcsEqX2SjCj4J20uK7+ldkDHMbpJDK76wF7xEIgxc/vSlsfw5w==} engines: {node: '>=10.12.0'} @@ -3483,6 +4157,14 @@ packages: bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} + binary-version-check@6.1.0: + resolution: {integrity: sha512-REKdLKmuViV2WrtWXvNSiPX04KbIjfUV3Cy8batUeOg+FtmowavzJorfFhWq95cVJzINnL/44ixP26TrdJZACA==} + engines: {node: '>=18'} + + binary-version@7.1.0: + resolution: {integrity: sha512-Iy//vPc3ANPNlIWd242Npqc8MK0a/i4kVcHDlDA6HNMv5zMxz4ulIFhOSYJVKw/8AbHdHy0CnGYEt1QqSXxPsw==} + engines: {node: '>=18'} + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -3490,6 +4172,13 @@ packages: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} + bowser@2.14.1: + resolution: {integrity: sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg==} + + boxen@8.0.1: + resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==} + engines: {node: '>=18'} + brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} @@ -3518,10 +4207,21 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@5.0.0: + resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} + engines: {node: '>=18.20'} + bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + byte-counter@0.1.0: + resolution: {integrity: sha512-jheRLVMeUKrDBjVw2O5+k4EvR4t9wtxHL+bo/LxfkxsVeuGMy3a5SEGgXdAFA4FSzTrU8rQXQIrsZ3oBq5a0pQ==} + engines: {node: '>=20'} + bytes@3.1.0: resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} engines: {node: '>= 0.8'} @@ -3530,10 +4230,26 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + cac@7.0.0: resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==} engines: {node: '>=20.19.0'} + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@13.0.19: + resolution: {integrity: sha512-SVXGH037+Mo1aIMO5B2UcleR43FGjFdN+M8JObSyEoQ2Mn4CODRWx28gN5jiTF0n5ItsgtIZfyargMNs8GX4kg==} + engines: {node: '>=18'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -3546,9 +4262,20 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + caniuse-lite@1.0.30001810: resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} + cbor-extract@2.2.2: + resolution: {integrity: sha512-hlSxxI9XO2yQfe9g6msd3g4xCfDqK5T5P0fRMLuaLHhxn4ViPrm+a+MUfhrvH2W962RGxcBwEGzLQyjbDG1gng==} + hasBin: true + + cbor-x@1.6.0: + resolution: {integrity: sha512-0kareyRwHSkL6ws5VXHEf8uY1liitysCVJjlmhaLG+IXLqhSaOO+t63coaso7yjwEzWZzLy8fJo06gZDVQM9Qg==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3576,16 +4303,35 @@ packages: resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} engines: {node: '>= 14.16.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-stack@3.0.1: + resolution: {integrity: sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg==} + engines: {node: '>=10'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} @@ -3597,6 +4343,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} @@ -3631,6 +4381,10 @@ packages: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -3646,6 +4400,12 @@ packages: resolution: {integrity: sha512-8fLl9F04EJqjSqH+QjITQfJF8BrOVaYr1jewVgSRAEWePfxT0sku4w2hrGQ60BC/TNLGQ2pgxNlTbWQmMPFvXg==} engines: {node: '>=12'} + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.4: + resolution: {integrity: sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==} + consola@3.4.2: resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} @@ -3654,6 +4414,10 @@ packages: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} + content-disposition@2.0.1: + resolution: {integrity: sha512-e+H0ZXHSWYrENhQzw1LPuP4oF5MzVKmDU6d3hxlvaPEYLLg62MxtQNPRx4SYSuYJSBUgnQIG4HIN2tEtNv7Dog==} + engines: {node: '>=18'} + content-type@1.0.4: resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} engines: {node: '>= 0.6'} @@ -3670,6 +4434,10 @@ packages: resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} engines: {node: '>=8'} + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3883,6 +4651,9 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + dayjs@1.11.23: resolution: {integrity: sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==} @@ -3934,6 +4705,10 @@ packages: decode-named-character-reference@1.3.0: resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} + decompress-response@10.0.0: + resolution: {integrity: sha512-oj7KWToJuuxlPr7VV0vabvxEIiqNMo+q0NueIiL3XhtwC6FVOX7Hr1c0C4eD0bmf7Zr+S/dSf2xvkH3Ad6sU3Q==} + engines: {node: '>=20'} + dedent@1.7.2: resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: @@ -3957,6 +4732,9 @@ packages: resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} engines: {node: '>=18'} + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} @@ -3993,6 +4771,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + devalue@5.9.0: + resolution: {integrity: sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==} + devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} @@ -4118,6 +4899,9 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + easy-table@1.2.0: + resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} + ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -4129,6 +4913,11 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.415: resolution: {integrity: sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg==} @@ -4151,6 +4940,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.19.0: + resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + engines: {node: '>=10.13.0'} + enhanced-resolve@5.24.5: resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==} engines: {node: '>=10.13.0'} @@ -4185,9 +4978,16 @@ packages: wrangler: optional: true + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + errx@0.1.2: + resolution: {integrity: sha512-chfpPHmCerdo/rXr/nNvPZRkV4WwDRwzwnsJ0Uzz3tVi8Z41tDctRjduYy1138ii77AFlts1qvWtX3g/Acg91Q==} + es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -4227,6 +5027,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4416,6 +5221,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + execa@9.6.1: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} @@ -4434,9 +5243,23 @@ packages: resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} engines: {node: '>= 18'} + exsolve@1.0.7: + resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + exsolve@1.1.1: resolution: {integrity: sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==} + ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + + ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} @@ -4456,6 +5279,9 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-uri@3.1.6: resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} @@ -4492,9 +5318,28 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + file-type@21.3.4: + resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} + engines: {node: '>=20'} + + file-type@22.0.2: + resolution: {integrity: sha512-0H8TsCUGBLx+V5adH3EY52hTAcyLKbV1D4gq5cIOJ6DnQAHeV9Z2Hhuc5CoBX4YmvB2oL+JIC84z0qO7JsCoNw==} + engines: {node: '>=22'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} + + filename-reserved-regex@4.0.1: + resolution: {integrity: sha512-qUet2faQFKvtvVUsEf7wCrTURwxBOIZpspsLHGifw9QCWk55ITE2FrG8XhfQqG/uxMA1xEGFVQbL+Yfm0O94+Q==} + engines: {node: '>=20'} + + filenamify@7.0.3: + resolution: {integrity: sha512-Pf0dwHrWs1GcIK15ps304fmxp2AOcfNR6vOIMvCPEy6ZztKYxzRQHlOuPVWo2HRjbCLHaRTY+kD8n3RbQ0A/fw==} + engines: {node: '>=20'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -4511,6 +5356,14 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + find-versions@6.0.0: + resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} + engines: {node: '>=18'} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -4522,6 +5375,10 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} + form-data-encoder@4.1.0: + resolution: {integrity: sha512-G6NsmEW15s0Uw9XnCg+33H3ViYRyiM0hMrMhhqQOR8NFc5GhYrI+6I3u7OTw7b91J2g8rtvMBZJDbcGb2YUniw==} + engines: {node: '>= 18'} + formatly@0.3.0: resolution: {integrity: sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w==} engines: {node: '>=18.3.0'} @@ -4570,6 +5427,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + fuzzysort@3.1.0: resolution: {integrity: sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ==} @@ -4608,6 +5469,10 @@ packages: resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==} engines: {node: '>=14.16'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -4624,6 +5489,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-stream@9.0.1: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} @@ -4671,6 +5540,10 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + got@14.6.6: + resolution: {integrity: sha512-QLV1qeYSo5l13mQzWgP/y0LbMr5Plr5fJilgAIwgnwseproEbtNym8xpLsDzeZ6MWXgNE6kdWGBjdh3zT/Qerg==} + engines: {node: '>=20'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4691,6 +5564,14 @@ packages: hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-flag@5.0.1: + resolution: {integrity: sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==} + engines: {node: '>=12'} + has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -4760,6 +5641,9 @@ packages: html-void-elements@3.0.0: resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + http-cache-semantics@4.2.0: + resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + http-errors@1.7.3: resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} engines: {node: '>= 0.6'} @@ -4768,6 +5652,10 @@ packages: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -4783,6 +5671,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + human-signals@8.0.1: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} @@ -4799,10 +5691,21 @@ packages: resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} engines: {node: '>=0.10.0'} + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + + ignore@7.0.7: + resolution: {integrity: sha512-dML0wP6oak21rsNYCJpJB6O1BJIEwNpGrTw0URPfAk4hm0e3pRfCtzkfB6olBcXcVlU2rouCyz7lCyRB0OMVCA==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -4814,12 +5717,19 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + inspect-with-kind@1.0.5: + resolution: {integrity: sha512-MAQUJuIo7Xqk8EVNP+6d3CKq9c80hi4tjIbIAT6lmGW9W6WzlHiu9PS8uSuUYU+Do+j1baiFp3H25XEVxDIG2g==} + internmap@1.0.1: resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} @@ -4904,6 +5814,10 @@ packages: resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==} engines: {node: '>=12'} + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} @@ -4919,6 +5833,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-stream@4.0.1: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} @@ -4946,9 +5864,22 @@ packages: resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} engines: {node: '>=18'} - jackspeak@3.4.3: + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jake@10.9.4: + resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} + engines: {node: '>=10'} + hasBin: true + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -5038,9 +5969,16 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} + khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -5049,11 +5987,18 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + knip@6.32.3: resolution: {integrity: sha512-wOJ1Av8PwKqFO0wU7F64vzIcUjxhrieA3Tc2lmeK9C9prpxq+TeG2ewNH5tCaBVZwXNPp6lJkrr+IhZ20iqkMA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + knitwork@1.3.0: + resolution: {integrity: sha512-4LqMNoONzR43B1W0ek0fhXMsDNW/zxa1NdFAVMY+k28pgZLovR4G3PB5MrpTxCy1QaZCqNoiaKPr5w5qZHfSNw==} + kysely@0.29.5: resolution: {integrity: sha512-ooa+eSbBNPTo3MycPEuW5jdrxQdQwdtB3LC3h43FiXQbIry5tR0C5lDG7eealK0E4D7XjrnOP5DIUg/LyjRMYQ==} engines: {node: '>=22.0.0'} @@ -5216,9 +6161,17 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + load-esm@1.0.3: + resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} + engines: {node: '>=13.2.0'} + locate-path@3.0.0: resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} engines: {node: '>=6'} @@ -5227,6 +6180,10 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash-es@4.18.1: resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} @@ -5237,6 +6194,10 @@ packages: longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -5263,6 +6224,10 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -5513,10 +6478,18 @@ packages: resolution: {integrity: sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==} engines: {node: '>=8'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + minimatch@10.1.1: resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} engines: {node: 20 || >=22} @@ -5528,6 +6501,10 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -5543,11 +6520,22 @@ packages: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} + mixpart@0.0.4: + resolution: {integrity: sha512-RAoaOSXnMLrfUfmFbNynRYjeMru/bhgAYRy/GQVI8gmRq7vm9V9c2gGVYnYoQ008X6YTmRIu5b0397U7vb0bIA==} + engines: {node: '>=22.0.0'} + + mixpart@0.0.6: + resolution: {integrity: sha512-CRdXtgfQH2jARmtNmPR0Q7jL20fiESbaYk1b0KvLD0jCdUuemepREtsbd8nbiY6BHV9OGGddAZITNXklupUPUQ==} + engines: {node: '>=20.0.0'} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + motion-dom@13.1.1: resolution: {integrity: sha512-XSf8VYWSB6G/0IY3rWVbyLcxWXtAVHkN1PQE2agTaCv3u8RGvbwu56TyyR/MNzBqqNavEBTZzErcxI1TxBrjcA==} @@ -5583,6 +6571,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + nanoid@6.0.1: resolution: {integrity: sha512-3wVS3i51pE2pi1k5FFL/95BGfVS0kSsvDVuGXHOtxox/TywUmtgq+3qiTOTbs9J7KfHaXPiN171k/A6dBnaXFw==} engines: {node: ^22 || ^24 || >=26} @@ -5693,6 +6686,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build-optional-packages@5.1.1: + resolution: {integrity: sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==} + hasBin: true + node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -5706,10 +6703,18 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} + engines: {node: '>=14.16'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -5756,6 +6761,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -5766,6 +6775,10 @@ packages: oniguruma-to-es@4.3.6: resolution: {integrity: sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==} + open@10.2.0: + resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} + engines: {node: '>=18'} + open@11.0.1: resolution: {integrity: sha512-NzwMUB6C1D0+Kd+9iMS/H4k+Ck3cTX6Ckyfr/gAGlmvSE1LUQZnEZvWBi4PYmMwH/S5SMeTXnE+9uAz8uF+pWw==} engines: {node: '>=20'} @@ -5839,6 +6852,14 @@ packages: vite-plus: optional: true + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + p-finally@2.0.1: resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} engines: {node: '>=8'} @@ -5851,6 +6872,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -5859,6 +6884,14 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -5909,6 +6942,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -5947,6 +6984,9 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + perfect-debounce@2.1.0: + resolution: {integrity: sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==} + pg-cloudflare@1.4.0: resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} @@ -5995,10 +7035,19 @@ packages: resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} + piscina@4.9.4: + resolution: {integrity: sha512-RyBDr2VheQ8ZfH3N8SzQZHztqVyOtadTwLnUYof6gdj5161/eu2wNhCbGl5GHnNKDpnkicJYpKtL2J+y/gk6XA==} + pkce-challenge@5.0.1: resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} engines: {node: '>=16.20.0'} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.3.1: + resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} + pkg-up@3.1.0: resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} engines: {node: '>=8'} @@ -6067,6 +7116,9 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + property-information@7.2.0: resolution: {integrity: sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==} @@ -6091,6 +7143,13 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + quickjs-wasi@3.4.0: + resolution: {integrity: sha512-ttKaBD8u0RXhz2UqDU8wOEruhxADt0WWHfMfnNR8aO0UyhlifFS6NvPYFbyhASjqIp2/1dpneoP1IzBUxION1w==} + range-parser@1.3.0: resolution: {integrity: sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==} engines: {node: '>= 0.6'} @@ -6103,6 +7162,9 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + react-dom@19.2.8: resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} peerDependencies: @@ -6146,10 +7208,17 @@ packages: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} + recast@0.23.21: resolution: {integrity: sha512-mFAyJq9vUbSTARLZUvAEf1z3YxlvAwswbmxMx2mPA/MSm4KmpwvwvhsH/NIrZhyOuwD60Lzyw2qh83uCbgTPYw==} engines: {node: '>= 4'} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -6216,6 +7285,9 @@ packages: reselect@5.3.0: resolution: {integrity: sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==} + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -6231,10 +7303,18 @@ packages: resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} + responselike@4.0.2: + resolution: {integrity: sha512-cGk8IbWEAnaCpdAt1BHzJ3Ahz5ewDJa0KseTsE3qIRMJ3C698W8psM7byCeWVpd/Ha7FUYzuRVzXoKoM6nRUbA==} + engines: {node: '>=20'} + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -6283,6 +7363,9 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -6296,6 +7379,24 @@ packages: scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + seek-bzip@2.0.0: + resolution: {integrity: sha512-SMguiTnYrhpLdk3PwfzHeotrcwi8bNV4iemL9tx9poR/yeaMYwB9VzR1w7b57DuWpuqR8n6oZboi0hj3AxZxQg==} + hasBin: true + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + + semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -6305,6 +7406,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.4: + resolution: {integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==} + engines: {node: '>=10'} + hasBin: true + semver@7.8.5: resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} engines: {node: '>=10'} @@ -6385,6 +7491,10 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -6401,6 +7511,14 @@ packages: resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + + sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -6412,6 +7530,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.6: + resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} + engines: {node: '>= 12'} + space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -6500,10 +7622,17 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-dirs@3.0.0: + resolution: {integrity: sha512-I0sdgcFTfKQlUPZyAqPJmSG3HLO9rWDFnxonnIbskYNM3DwFOeTNB5KzVq3dA1GdRAc/25b5Y7UO2TQfKWw4aQ==} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + strip-final-newline@4.0.0: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} @@ -6512,6 +7641,10 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -6534,6 +7667,31 @@ packages: stylis@4.4.0: resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + + supports-color@10.2.2: + resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} + engines: {node: '>=18'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@4.5.0: + resolution: {integrity: sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==} + engines: {node: '>=20'} + + swr@2.5.1: + resolution: {integrity: sha512-BRw55e8r0B7SpDN20CAzoQAHl7y1yP7/Zt7oqUjMv0vSt2u2Xnkm88Ws+VypbV9BXHQVuSuyVq7zMjO16wSExw==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + system-architecture@1.0.0: + resolution: {integrity: sha512-0OJWD12D7XX3KUg1DYkMaTTjSTo2k/mhIYI3HlBlceXSMcJhW/1qO735fPKS5prcyjvn57Ub151vvASYXpQrEw==} + engines: {node: '>=18'} + systeminformation@5.33.4: resolution: {integrity: sha512-poXpX8M9NBll1NDMW1ho6qRFkjrlttfm8E/YtPmn5x0TQ1z8LoJUHg9kwr/sRDmCjktqfnFRxqsoUNpaRakeMQ==} engines: {node: '>=10.0.0'} @@ -6566,6 +7724,10 @@ packages: resolution: {integrity: sha512-NkFkadmqqpaVZ9x3bV4cul1xQnUknhs1HzE3Q/VXHKS7np2Kg7ZNL7nNsEsBXKsafmgepa+aZNtzoegDgsymPw==} hasBin: true + terminal-link@5.0.0: + resolution: {integrity: sha512-qFAy10MTMwjzjU8U16YS4YoZD+NQLHzLssFMNqgravjbvIPNiqkGFR4yjhJfmY9R5OFU7+yHxc6y+uGHkKwLRA==} + engines: {node: '>=20'} + text-decoder@1.2.7: resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} @@ -6573,10 +7735,17 @@ packages: resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} engines: {node: '>=18'} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + time-span@4.0.0: resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} engines: {node: '>=10'} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -6614,6 +7783,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} + tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -6660,6 +7833,14 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@2.1.0: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} @@ -6680,16 +7861,34 @@ packages: uid-promise@1.0.0: resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + + ulid@3.0.2: + resolution: {integrity: sha512-yu26mwteFYzBAot7KVMqFGCVpsF6g8wXfJzQUHvu1no3+rRRSFcSV2nKeYvNPLD2J4b08jYBDhHUjeH0ygIl9w==} + hasBin: true + unbash@4.0.10: resolution: {integrity: sha512-b7zoBQvpWp0vuN5q2vK2RRBR2SvuruQAs50DApdDveBSn3eSYd84IaHodFqQIMlvY9K2VnyBUEXgwOBuGU9GBg==} engines: {node: '>=14'} + unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + unconfig-core@7.5.0: resolution: {integrity: sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==} unconfig@7.5.0: resolution: {integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==} + unctx@2.5.0: + resolution: {integrity: sha512-p+Rz9x0R7X+CYDkT+Xg8/GhpcShTlU8n+cf9OtOEf7zEQsNcCZO1dPKNRDqvUTaq+P32PMMkxWHwfrxkqfqAYg==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -6719,6 +7918,10 @@ packages: unenv@2.0.0-rc.24: resolution: {integrity: sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==} + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + unicorn-magic@0.3.0: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} @@ -6755,6 +7958,10 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + unstorage@2.0.0-alpha.7: resolution: {integrity: sha512-ELPztchk2zgFJnakyodVY3vJWGW9jy//keJ32IOJVGUMyaPydwcA1FtVvWqT0TNRch9H+cMNEGllfVFfScImog==} peerDependencies: @@ -6829,6 +8036,10 @@ packages: uploadthing: optional: true + untyped@2.0.0: + resolution: {integrity: sha512-nwNCjxJTjNuLCgFr42fEak5OcLuB3ecca+9ksPFNvtfYSLpjf+iJqSIaSnIile6ZPbKYxI5k2AfXqeopGudK/g==} + hasBin: true + update-browserslist-db@1.3.1: resolution: {integrity: sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==} hasBin: true @@ -6996,6 +8207,9 @@ packages: resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} engines: {node: 20 || >=22} + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-namespaces@2.0.1: resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} @@ -7006,9 +8220,15 @@ packages: web-vitals@0.2.4: resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -7027,10 +8247,30 @@ packages: engines: {node: '>=8'} hasBin: true + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + widest-line@5.0.0: + resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==} + engines: {node: '>=18'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + workflow@5.0.0-beta.43: + resolution: {integrity: sha512-2v0dDirnby+cjSDz0F6MTKfyqRy/jKoX11Zt8cY8vSkjJWxqtMZwdNy3Wh2Pcpwfh+G95wIuZe+6z3+SDwOOWw==} + hasBin: true + peerDependencies: + '@opentelemetry/api': '1' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -7039,6 +8279,10 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -7054,6 +8298,10 @@ packages: utf-8-validate: optional: true + wsl-utils@0.1.0: + resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} + engines: {node: '>=18'} + wsl-utils@1.0.0: resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} engines: {node: '>=20'} @@ -7100,10 +8348,18 @@ packages: yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + yauzl@3.4.0: + resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.2.2: + resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} + engines: {node: '>=12.20'} + yocto-spinner@1.2.2: resolution: {integrity: sha512-DODGl1wJjA/s5pnJFKau9lIYHT81lnhob1i3e1TjxZRxEhWRKl74nTbWE6H5KlkViQQTo/Z29YFdxzTZAMY3ng==} engines: {node: '>=18.19'} @@ -7132,6 +8388,9 @@ packages: zod@4.1.11: resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + zod@4.4.3: resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} @@ -7174,6 +8433,56 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 + '@aws-sdk/core@3.977.9': + dependencies: + '@aws-sdk/types': 3.974.5 + '@aws-sdk/xml-builder': 3.972.40 + '@aws/lambda-invoke-store': 0.3.0 + '@smithy/core': 3.33.3 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.17.2 + bowser: 2.14.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-web-identity@3.972.49': + dependencies: + '@aws-sdk/core': 3.977.9 + '@aws-sdk/nested-clients': 3.997.44 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.997.44': + dependencies: + '@aws-sdk/core': 3.977.9 + '@aws-sdk/signature-v4-multi-region': 3.996.46 + '@aws-sdk/types': 3.974.5 + '@smithy/core': 3.33.3 + '@smithy/fetch-http-handler': 5.7.2 + '@smithy/node-http-handler': 4.11.3 + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.996.46': + dependencies: + '@aws-sdk/types': 3.974.5 + '@smithy/signature-v4': 5.7.3 + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@aws-sdk/types@3.974.5': + dependencies: + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.972.40': + dependencies: + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.3.0': {} + '@babel/code-frame@7.29.7': dependencies: '@babel/helper-validator-identifier': 7.29.7 @@ -7182,20 +8491,20 @@ snapshots: '@babel/compat-data@7.29.7': {} - '@babel/core@7.29.7': + '@babel/core@7.29.7(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helpers': 7.29.7 '@babel/parser': 7.29.8 '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7222,41 +8531,41 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7)': + '@babel/helper-create-class-features-plugin@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/helper-replace-supers': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/traverse': 7.29.8(supports-color@8.1.1) semver: 6.3.1 transitivePeerDependencies: - supports-color '@babel/helper-globals@7.29.7': {} - '@babel/helper-member-expression-to-functions@7.29.7': + '@babel/helper-member-expression-to-functions@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': + '@babel/helper-module-imports@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': + '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-imports': 7.29.7(supports-color@8.1.1) '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7266,18 +8575,18 @@ snapshots: '@babel/helper-plugin-utils@7.29.7': {} - '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7)': + '@babel/helper-replace-supers@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-member-expression-to-functions': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-member-expression-to-functions': 7.29.7(supports-color@8.1.1) '@babel/helper-optimise-call-expression': 7.29.7 - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': + '@babel/helper-skip-transparent-expression-wrappers@7.29.7(supports-color@8.1.1)': dependencies: - '@babel/traverse': 7.29.8 + '@babel/traverse': 7.29.8(supports-color@8.1.1) '@babel/types': 7.29.8 transitivePeerDependencies: - supports-color @@ -7297,43 +8606,43 @@ snapshots: dependencies: '@babel/types': 7.29.8 - '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-syntax-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-modules-commonjs@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) + '@babel/core': 7.29.7(supports-color@8.1.1) + '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/plugin-transform-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-annotate-as-pure': 7.29.7 - '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7) + '@babel/helper-create-class-features-plugin': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 - '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 - '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7(supports-color@8.1.1) + '@babel/plugin-syntax-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) transitivePeerDependencies: - supports-color - '@babel/preset-typescript@7.29.7(@babel/core@7.29.7)': + '@babel/preset-typescript@7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-option': 7.29.7 - '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7) - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-syntax-jsx': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1)) + '@babel/plugin-transform-modules-commonjs': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7345,7 +8654,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/types': 7.29.8 - '@babel/traverse@7.29.8': + '@babel/traverse@7.29.8(supports-color@8.1.1)': dependencies: '@babel/code-frame': 7.29.7 '@babel/generator': 7.29.8 @@ -7353,7 +8662,7 @@ snapshots: '@babel/parser': 7.29.8 '@babel/template': 7.29.7 '@babel/types': 7.29.8 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7362,7 +8671,7 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@base-ui/react@1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + '@base-ui/react@1.7.0(@types/react@19.2.18)(date-fns@4.1.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: '@babel/runtime': 7.29.7 '@base-ui/utils': 0.3.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) @@ -7373,6 +8682,7 @@ snapshots: use-sync-external-store: 1.6.0(react@19.2.8) optionalDependencies: '@types/react': 19.2.18 + date-fns: 4.1.0 '@base-ui/utils@0.3.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': dependencies: @@ -7444,10 +8754,30 @@ snapshots: '@better-fetch/fetch@1.3.1': {} + '@borewit/text-codec@0.2.2': {} + '@braintree/sanitize-url@7.1.2': {} '@bytecodealliance/preview2-shim@0.17.6': {} + '@cbor-extract/cbor-extract-darwin-arm64@2.2.2': + optional: true + + '@cbor-extract/cbor-extract-darwin-x64@2.2.2': + optional: true + + '@cbor-extract/cbor-extract-linux-arm64@2.2.2': + optional: true + + '@cbor-extract/cbor-extract-linux-arm@2.2.2': + optional: true + + '@cbor-extract/cbor-extract-linux-x64@2.2.2': + optional: true + + '@cbor-extract/cbor-extract-win32-x64@2.2.2': + optional: true + '@chevrotain/types@11.1.2': {} '@dotenvx/dotenvx@1.75.1': @@ -7524,6 +8854,9 @@ snapshots: '@esbuild/aix-ppc64@0.27.0': optional: true + '@esbuild/aix-ppc64@0.28.2': + optional: true + '@esbuild/android-arm64@0.18.20': optional: true @@ -7533,6 +8866,9 @@ snapshots: '@esbuild/android-arm64@0.27.0': optional: true + '@esbuild/android-arm64@0.28.2': + optional: true + '@esbuild/android-arm@0.18.20': optional: true @@ -7542,6 +8878,9 @@ snapshots: '@esbuild/android-arm@0.27.0': optional: true + '@esbuild/android-arm@0.28.2': + optional: true + '@esbuild/android-x64@0.18.20': optional: true @@ -7551,6 +8890,9 @@ snapshots: '@esbuild/android-x64@0.27.0': optional: true + '@esbuild/android-x64@0.28.2': + optional: true + '@esbuild/darwin-arm64@0.18.20': optional: true @@ -7560,6 +8902,9 @@ snapshots: '@esbuild/darwin-arm64@0.27.0': optional: true + '@esbuild/darwin-arm64@0.28.2': + optional: true + '@esbuild/darwin-x64@0.18.20': optional: true @@ -7569,6 +8914,9 @@ snapshots: '@esbuild/darwin-x64@0.27.0': optional: true + '@esbuild/darwin-x64@0.28.2': + optional: true + '@esbuild/freebsd-arm64@0.18.20': optional: true @@ -7578,6 +8926,9 @@ snapshots: '@esbuild/freebsd-arm64@0.27.0': optional: true + '@esbuild/freebsd-arm64@0.28.2': + optional: true + '@esbuild/freebsd-x64@0.18.20': optional: true @@ -7587,6 +8938,9 @@ snapshots: '@esbuild/freebsd-x64@0.27.0': optional: true + '@esbuild/freebsd-x64@0.28.2': + optional: true + '@esbuild/linux-arm64@0.18.20': optional: true @@ -7596,6 +8950,9 @@ snapshots: '@esbuild/linux-arm64@0.27.0': optional: true + '@esbuild/linux-arm64@0.28.2': + optional: true + '@esbuild/linux-arm@0.18.20': optional: true @@ -7605,6 +8962,9 @@ snapshots: '@esbuild/linux-arm@0.27.0': optional: true + '@esbuild/linux-arm@0.28.2': + optional: true + '@esbuild/linux-ia32@0.18.20': optional: true @@ -7614,6 +8974,9 @@ snapshots: '@esbuild/linux-ia32@0.27.0': optional: true + '@esbuild/linux-ia32@0.28.2': + optional: true + '@esbuild/linux-loong64@0.18.20': optional: true @@ -7623,6 +8986,9 @@ snapshots: '@esbuild/linux-loong64@0.27.0': optional: true + '@esbuild/linux-loong64@0.28.2': + optional: true + '@esbuild/linux-mips64el@0.18.20': optional: true @@ -7632,6 +8998,9 @@ snapshots: '@esbuild/linux-mips64el@0.27.0': optional: true + '@esbuild/linux-mips64el@0.28.2': + optional: true + '@esbuild/linux-ppc64@0.18.20': optional: true @@ -7641,6 +9010,9 @@ snapshots: '@esbuild/linux-ppc64@0.27.0': optional: true + '@esbuild/linux-ppc64@0.28.2': + optional: true + '@esbuild/linux-riscv64@0.18.20': optional: true @@ -7650,6 +9022,9 @@ snapshots: '@esbuild/linux-riscv64@0.27.0': optional: true + '@esbuild/linux-riscv64@0.28.2': + optional: true + '@esbuild/linux-s390x@0.18.20': optional: true @@ -7659,6 +9034,9 @@ snapshots: '@esbuild/linux-s390x@0.27.0': optional: true + '@esbuild/linux-s390x@0.28.2': + optional: true + '@esbuild/linux-x64@0.18.20': optional: true @@ -7668,12 +9046,18 @@ snapshots: '@esbuild/linux-x64@0.27.0': optional: true + '@esbuild/linux-x64@0.28.2': + optional: true + '@esbuild/netbsd-arm64@0.25.12': optional: true '@esbuild/netbsd-arm64@0.27.0': optional: true + '@esbuild/netbsd-arm64@0.28.2': + optional: true + '@esbuild/netbsd-x64@0.18.20': optional: true @@ -7683,12 +9067,18 @@ snapshots: '@esbuild/netbsd-x64@0.27.0': optional: true + '@esbuild/netbsd-x64@0.28.2': + optional: true + '@esbuild/openbsd-arm64@0.25.12': optional: true '@esbuild/openbsd-arm64@0.27.0': optional: true + '@esbuild/openbsd-arm64@0.28.2': + optional: true + '@esbuild/openbsd-x64@0.18.20': optional: true @@ -7698,12 +9088,18 @@ snapshots: '@esbuild/openbsd-x64@0.27.0': optional: true + '@esbuild/openbsd-x64@0.28.2': + optional: true + '@esbuild/openharmony-arm64@0.25.12': optional: true '@esbuild/openharmony-arm64@0.27.0': optional: true + '@esbuild/openharmony-arm64@0.28.2': + optional: true + '@esbuild/sunos-x64@0.18.20': optional: true @@ -7713,6 +9109,9 @@ snapshots: '@esbuild/sunos-x64@0.27.0': optional: true + '@esbuild/sunos-x64@0.28.2': + optional: true + '@esbuild/win32-arm64@0.18.20': optional: true @@ -7722,6 +9121,9 @@ snapshots: '@esbuild/win32-arm64@0.27.0': optional: true + '@esbuild/win32-arm64@0.28.2': + optional: true + '@esbuild/win32-ia32@0.18.20': optional: true @@ -7731,6 +9133,9 @@ snapshots: '@esbuild/win32-ia32@0.27.0': optional: true + '@esbuild/win32-ia32@0.28.2': + optional: true + '@esbuild/win32-x64@0.18.20': optional: true @@ -7740,17 +9145,20 @@ snapshots: '@esbuild/win32-x64@0.27.0': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.9.1(jiti@2.7.0))': + '@esbuild/win32-x64@0.28.2': + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))': dependencies: - eslint: 10.9.1(jiti@2.7.0) + eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.23.5': + '@eslint/config-array@0.23.5(supports-color@8.1.1)': dependencies: '@eslint/object-schema': 3.0.5 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.6 transitivePeerDependencies: - supports-color @@ -7789,21 +9197,21 @@ snapshots: '@floating-ui/utils@0.2.12': {} - '@googleapis/calendar@16.0.0': + '@googleapis/calendar@16.0.0(supports-color@8.1.1)': dependencies: - googleapis-common: 8.0.3 + googleapis-common: 8.0.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@googleapis/gmail@18.0.0': + '@googleapis/gmail@18.0.0(supports-color@8.1.1)': dependencies: - googleapis-common: 8.0.3 + googleapis-common: 8.0.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@googleapis/people@8.0.0': + '@googleapis/people@8.0.0(supports-color@8.1.1)': dependencies: - googleapis-common: 8.0.3 + googleapis-common: 8.0.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7982,11 +9390,15 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@mapbox/node-pre-gyp@2.0.3': + '@keyv/serialize@1.1.1': {} + + '@lukeed/csprng@1.1.0': {} + + '@mapbox/node-pre-gyp@2.0.3(supports-color@8.1.1)': dependencies: consola: 3.4.2 detect-libc: 2.1.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@8.1.1) node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.8.5 @@ -7999,7 +9411,7 @@ snapshots: dependencies: '@chevrotain/types': 11.1.2 - '@modelcontextprotocol/sdk@1.30.0(zod@3.25.76)': + '@modelcontextprotocol/sdk@1.30.0(supports-color@8.1.1)(zod@3.25.76)': dependencies: '@hono/node-server': 2.1.1(hono@4.13.5) ajv: 8.20.0 @@ -8009,8 +9421,8 @@ snapshots: cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.1.1 - express: 5.2.1 - express-rate-limit: 8.6.2(express@5.2.1) + express: 5.2.1(supports-color@8.1.1) + express-rate-limit: 8.6.2(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1) hono: 4.13.5 jose: 6.2.10 json-schema-typed: 8.0.2 @@ -8072,8 +9484,80 @@ snapshots: '@napi-rs/keyring-win32-ia32-msvc': 1.2.0 '@napi-rs/keyring-win32-x64-msvc': 1.2.0 - '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': - dependencies: + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true + + '@napi-rs/nice-android-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true + + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true + + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true + + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true + + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true + + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true + + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true + + '@napi-rs/nice@1.1.1': + optionalDependencies: + '@napi-rs/nice-android-arm-eabi': 1.1.1 + '@napi-rs/nice-android-arm64': 1.1.1 + '@napi-rs/nice-darwin-arm64': 1.1.1 + '@napi-rs/nice-darwin-x64': 1.1.1 + '@napi-rs/nice-freebsd-x64': 1.1.1 + '@napi-rs/nice-linux-arm-gnueabihf': 1.1.1 + '@napi-rs/nice-linux-arm64-gnu': 1.1.1 + '@napi-rs/nice-linux-arm64-musl': 1.1.1 + '@napi-rs/nice-linux-ppc64-gnu': 1.1.1 + '@napi-rs/nice-linux-riscv64-gnu': 1.1.1 + '@napi-rs/nice-linux-s390x-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-gnu': 1.1.1 + '@napi-rs/nice-linux-x64-musl': 1.1.1 + '@napi-rs/nice-openharmony-arm64': 1.1.1 + '@napi-rs/nice-win32-arm64-msvc': 1.1.1 + '@napi-rs/nice-win32-ia32-msvc': 1.1.1 + '@napi-rs/nice-win32-x64-msvc': 1.1.1 + optional: true + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': + dependencies: '@emnapi/core': 1.11.2 '@emnapi/runtime': 1.11.2 '@tybys/wasm-util': 0.10.3 @@ -8089,6 +9573,30 @@ snapshots: '@neondatabase/serverless@1.1.0': optional: true + '@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1)': + dependencies: + '@standard-schema/spec': 1.1.0 + file-type: 22.0.2(supports-color@8.1.1) + iterare: 1.2.1 + load-esm: 1.0.3 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + transitivePeerDependencies: + - supports-color + + '@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1) + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 8.4.2 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + '@next/env@16.3.3': {} '@next/swc-darwin-arm64@16.3.3': @@ -8131,6 +9639,56 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@nuxt/kit@4.4.8': + dependencies: + c12: 3.3.4 + consola: 3.4.2 + defu: 6.1.7 + destr: 2.0.5 + errx: 0.1.2 + exsolve: 1.1.1 + ignore: 7.0.7 + jiti: 2.7.0 + klona: 2.0.6 + mlly: 1.8.2 + ohash: 2.0.12 + pathe: 2.0.3 + pkg-types: 2.3.1 + rc9: 3.0.1 + scule: 1.3.0 + semver: 7.8.5 + tinyglobby: 0.2.17 + ufo: 1.6.4 + unctx: 2.5.0 + untyped: 2.0.0 + transitivePeerDependencies: + - magicast + + '@oclif/core@4.11.4': + dependencies: + ansi-escapes: 4.3.2 + ansis: 3.17.0 + clean-stack: 3.0.1 + cli-spinners: 2.9.2 + debug: 4.4.3(supports-color@8.1.1) + ejs: 3.1.10 + get-package-type: 0.1.0 + indent-string: 4.0.0 + is-wsl: 2.2.0 + lilconfig: 3.1.3 + minimatch: 10.2.6 + semver: 7.8.5 + string-width: 4.2.3 + supports-color: 8.1.1 + tinyglobby: 0.2.17 + widest-line: 3.1.0 + wordwrap: 1.0.0 + wrap-ansi: 7.0.0 + + '@oclif/plugin-help@6.2.37': + dependencies: + '@oclif/core': 4.11.4 + '@onkernel/sdk@0.96.0': {} '@opentelemetry/api@1.9.1': {} @@ -8809,15 +10367,46 @@ snapshots: '@sinclair/typebox@0.25.24': {} + '@sindresorhus/is@7.2.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@smithy/core@3.33.3': + dependencies: + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.7.2': + dependencies: + '@smithy/core': 3.33.3 + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.11.3': + dependencies: + '@smithy/core': 3.33.3 + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@smithy/signature-v4@5.7.3': + dependencies: + '@smithy/core': 3.33.3 + '@smithy/types': 4.17.2 + tslib: 2.8.1 + + '@smithy/types@4.17.2': + dependencies: + tslib: 2.8.1 + + '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} - '@streamdown/cjk@1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(react@19.2.8)(unified@11.0.5)': + '@streamdown/cjk@1.0.3(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1))(react@19.2.8)(supports-color@8.1.1)(unified@11.0.5)': dependencies: react: 19.2.8 - remark-cjk-friendly: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) - remark-cjk-friendly-gfm-strikethrough: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5) + remark-cjk-friendly: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1))(unified@11.0.5) + remark-cjk-friendly-gfm-strikethrough: 2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1))(supports-color@8.1.1)(unified@11.0.5) unist-util-visit: 5.1.0 transitivePeerDependencies: - '@types/mdast' @@ -8831,12 +10420,12 @@ snapshots: react: 19.2.8 shiki: 3.23.0 - '@streamdown/math@1.0.2(react@19.2.8)': + '@streamdown/math@1.0.2(react@19.2.8)(supports-color@8.1.1)': dependencies: katex: 0.16.47 react: 19.2.8 rehype-katex: 7.0.1 - remark-math: 6.0.0 + remark-math: 6.0.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8845,10 +10434,82 @@ snapshots: mermaid: 11.17.2 react: 19.2.8 + '@swc/cli@0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0)(supports-color@8.1.1)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@swc/counter': 0.1.3 + '@xhmikosr/bin-wrapper': 14.5.1(supports-color@8.1.1) + commander: 8.3.0 + minimatch: 9.0.9 + piscina: 4.9.4 + semver: 7.8.5 + slash: 3.0.0 + source-map: 0.7.6 + tinyglobby: 0.2.17 + optionalDependencies: + chokidar: 5.0.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@swc/core-darwin-arm64@1.15.3': + optional: true + + '@swc/core-darwin-x64@1.15.3': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.15.3': + optional: true + + '@swc/core-linux-arm64-gnu@1.15.3': + optional: true + + '@swc/core-linux-arm64-musl@1.15.3': + optional: true + + '@swc/core-linux-x64-gnu@1.15.3': + optional: true + + '@swc/core-linux-x64-musl@1.15.3': + optional: true + + '@swc/core-win32-arm64-msvc@1.15.3': + optional: true + + '@swc/core-win32-ia32-msvc@1.15.3': + optional: true + + '@swc/core-win32-x64-msvc@1.15.3': + optional: true + + '@swc/core@1.15.3(@swc/helpers@0.5.23)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.28 + optionalDependencies: + '@swc/core-darwin-arm64': 1.15.3 + '@swc/core-darwin-x64': 1.15.3 + '@swc/core-linux-arm-gnueabihf': 1.15.3 + '@swc/core-linux-arm64-gnu': 1.15.3 + '@swc/core-linux-arm64-musl': 1.15.3 + '@swc/core-linux-x64-gnu': 1.15.3 + '@swc/core-linux-x64-musl': 1.15.3 + '@swc/core-win32-arm64-msvc': 1.15.3 + '@swc/core-win32-ia32-msvc': 1.15.3 + '@swc/core-win32-x64-msvc': 1.15.3 + '@swc/helpers': 0.5.23 + + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.23': dependencies: tslib: 2.8.1 + '@swc/types@0.1.28': + dependencies: + '@swc/counter': 0.1.3 + '@t3-oss/env-core@0.13.11(typescript@6.0.3)(zod@4.4.3)': optionalDependencies: typescript: 6.0.3 @@ -8937,6 +10598,15 @@ snapshots: '@tanstack/query-core': 5.102.6 react: 19.2.8 + '@tokenizer/inflate@0.4.1(supports-color@8.1.1)': + dependencies: + debug: 4.4.3(supports-color@8.1.1) + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + '@tootallnate/once@2.0.0': {} '@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@6.0.3))(typescript@6.0.3)': @@ -9134,6 +10804,8 @@ snapshots: dependencies: '@types/unist': 3.0.3 + '@types/http-cache-semantics@4.2.0': {} + '@types/json-schema@7.0.15': {} '@types/katex@0.16.8': {} @@ -9182,10 +10854,10 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vercel/backends@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/backends@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/nft': 1.10.0 + '@vercel/nft': 1.10.0(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) execa: 3.2.0 fs-extra: 11.1.0 @@ -9219,9 +10891,9 @@ snapshots: cjs-module-lexer: 1.2.3 es-module-lexer: 1.5.0 - '@vercel/cervel@0.1.52(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/cervel@0.1.52(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: - '@vercel/backends': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/backends': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -9230,6 +10902,13 @@ snapshots: - rollup - supports-color + '@vercel/cli-auth@0.0.1': + dependencies: + async-listen: 3.0.0 + open: 8.4.0 + xdg-app-paths: 5.5.1 + zod: 4.1.11 + '@vercel/cli-auth@0.3.5': dependencies: '@napi-rs/keyring': 1.2.0 @@ -9247,13 +10926,13 @@ snapshots: dependencies: execa: 5.1.1 - '@vercel/connect@2.0.0(c8ba74d3560b66367327a185277b6d95)': + '@vercel/connect@2.0.0(b1d8a4df8cc9903d686597098ee3e8be)': dependencies: '@vercel/oidc': 3.8.5 optionalDependencies: ai: 7.0.83(zod@4.4.3) - better-auth: 1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))) - eve: 0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + better-auth: 1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))) + eve: 0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@vercel/container@3.0.0(@vercel/build-utils@14.5.0)': dependencies: @@ -9261,10 +10940,10 @@ snapshots: '@vercel/detect-agent@1.2.5': {} - '@vercel/elysia@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/elysia@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' @@ -9275,12 +10954,12 @@ snapshots: '@vercel/error-utils@2.2.1': {} - '@vercel/express@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/express@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/cervel': 0.1.52(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/nft': 1.10.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/cervel': 0.1.52(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/nft': 1.10.0(supports-color@8.1.1) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) fs-extra: 11.1.0 path-to-regexp: 8.3.0 @@ -9293,10 +10972,10 @@ snapshots: - rollup - supports-color - '@vercel/fastify@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/fastify@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' @@ -9305,11 +10984,11 @@ snapshots: - rollup - supports-color - '@vercel/fun@1.3.0': + '@vercel/fun@1.3.0(supports-color@8.1.1)': dependencies: '@tootallnate/once': 2.0.0 async-listen: 1.2.0 - debug: 4.3.4 + debug: 4.3.4(supports-color@8.1.1) generic-pool: 3.4.2 micro: 9.3.5-canary.3 ms: 2.1.1 @@ -9329,12 +11008,12 @@ snapshots: - encoding - supports-color - '@vercel/functions@3.9.5(ws@8.21.3)': + '@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3)': dependencies: '@vercel/oidc': 3.8.5 optionalDependencies: + '@aws-sdk/credential-provider-web-identity': 3.972.49 ws: 8.21.3 - optional: true '@vercel/gatsby-plugin-vercel-analytics@1.0.12': dependencies: @@ -9352,10 +11031,10 @@ snapshots: dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/h3@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/h3@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' @@ -9364,11 +11043,11 @@ snapshots: - rollup - supports-color - '@vercel/hono@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/hono@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/nft': 1.10.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/nft': 1.10.0(supports-color@8.1.1) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) fs-extra: 11.1.0 path-to-regexp: 8.3.0 @@ -9390,10 +11069,10 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - '@vercel/koa@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/koa@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' @@ -9402,10 +11081,10 @@ snapshots: - rollup - supports-color - '@vercel/nestjs@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/nestjs@3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) transitivePeerDependencies: - '@emnapi/core' @@ -9414,18 +11093,18 @@ snapshots: - rollup - supports-color - '@vercel/next@7.0.0(@vercel/build-utils@14.5.0)': + '@vercel/next@7.0.0(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/nft': 1.10.0 + '@vercel/nft': 1.10.0(supports-color@8.1.1) transitivePeerDependencies: - encoding - rollup - supports-color - '@vercel/nft@1.10.0': + '@vercel/nft@1.10.0(supports-color@8.1.1)': dependencies: - '@mapbox/node-pre-gyp': 2.0.3 + '@mapbox/node-pre-gyp': 2.0.3(supports-color@8.1.1) '@rollup/pluginutils': 5.4.0 acorn: 8.18.0 acorn-import-attributes: 1.9.5(acorn@8.18.0) @@ -9442,7 +11121,7 @@ snapshots: - rollup - supports-color - '@vercel/node@8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/node@8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@edge-runtime/node-utils': 2.3.0 '@edge-runtime/primitives': 4.1.0 @@ -9450,7 +11129,7 @@ snapshots: '@types/node': 20.11.0 '@vercel/build-utils': 14.5.0 '@vercel/error-utils': 2.2.1 - '@vercel/nft': 1.10.0 + '@vercel/nft': 1.10.0(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) async-listen: 3.0.0 cjs-module-lexer: 1.2.3 @@ -9498,10 +11177,19 @@ snapshots: '@vercel/build-utils': 14.5.0 '@vercel/python-analysis': 0.14.0 - '@vercel/redwood@5.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/queue@0.5.0(@opentelemetry/api@1.9.1)': + dependencies: + '@vercel/oidc': 3.8.5 + minimatch: 10.2.6 + mixpart: 0.0.6 + picocolors: 1.1.1 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + + '@vercel/redwood@5.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 - '@vercel/nft': 1.10.0 + '@vercel/nft': 1.10.0(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) semver: 6.3.1 ts-morph: 12.0.0 @@ -9512,11 +11200,11 @@ snapshots: - rollup - supports-color - '@vercel/remix-builder@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)': + '@vercel/remix-builder@8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1)': dependencies: '@vercel/build-utils': 14.5.0 '@vercel/error-utils': 2.2.1 - '@vercel/nft': 1.10.0 + '@vercel/nft': 1.10.0(supports-color@8.1.1) '@vercel/static-config': 3.4.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3) path-to-regexp: 6.1.0 path-to-regexp-updated: path-to-regexp@6.3.0 @@ -9598,13 +11286,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.1 - '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': + '@vitest/mocker@4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.11 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) '@vitest/pretty-format@4.1.11': dependencies: @@ -9630,10 +11318,395 @@ snapshots: convert-source-map: 2.0.0 tinyrainbow: 3.1.1 + '@workflow/astro@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/rollup': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + '@workflow/vite': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + exsolve: 1.1.1 + pathe: 2.0.3 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/builders@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/core': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/errors': 5.0.0-beta.17 + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + '@workflow/utils': 5.0.0-beta.8 + builtin-modules: 5.0.0 + chalk: 5.6.2 + enhanced-resolve: 5.19.0 + esbuild: 0.28.2 + find-up: 7.0.0 + json5: 2.2.3 + tinyglobby: 0.2.17 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/cli@5.0.0-beta.43(@aws-sdk/credential-provider-web-identity@3.972.49)(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@oclif/core': 4.11.4 + '@oclif/plugin-help': 6.2.37 + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@vercel/cli-auth': 0.0.1 + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/core': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/errors': 5.0.0-beta.17 + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + '@workflow/utils': 5.0.0-beta.8 + '@workflow/web': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(react@19.2.8)(supports-color@8.1.1) + '@workflow/world': 5.0.0-beta.28 + '@workflow/world-local': 5.0.0-beta.37(@opentelemetry/api@1.9.1) + '@workflow/world-vercel': 5.0.0-beta.39(@aws-sdk/credential-provider-web-identity@3.972.49)(@opentelemetry/api@1.9.1) + boxen: 8.0.1 + builtin-modules: 5.0.0 + chalk: 5.6.2 + chokidar: 4.0.3 + date-fns: 4.1.0 + dotenv: 17.4.2 + easy-table: 1.2.0 + enhanced-resolve: 5.19.0 + esbuild: 0.28.2 + find-up: 7.0.0 + mixpart: 0.0.4 + open: 10.2.0 + ora: 8.2.0 + terminal-link: 5.0.0 + tinyglobby: 0.2.17 + xdg-app-paths: 5.1.0 + zod: 4.3.6 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-web-identity' + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - react + - supports-color + - utf-8-validate + - ws + + '@workflow/core@5.0.0-beta.43(@opentelemetry/api@1.9.1)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@aws-sdk/credential-provider-web-identity': 3.972.49 + '@jridgewell/trace-mapping': 0.3.31 + '@standard-schema/spec': 1.0.0 + '@types/ms': 2.1.0 + '@vercel/functions': 3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3) + '@workflow/errors': 5.0.0-beta.17 + '@workflow/serde': 5.0.0-beta.2 + '@workflow/utils': 5.0.0-beta.8 + '@workflow/world': 5.0.0-beta.28 + '@workflow/world-local': 5.0.0-beta.37(@opentelemetry/api@1.9.1) + '@workflow/world-vercel': 5.0.0-beta.39(@aws-sdk/credential-provider-web-identity@3.972.49)(@opentelemetry/api@1.9.1) + debug: 4.4.3(supports-color@8.1.1) + devalue: 5.9.0 + ms: 2.1.3 + nanoid: 5.1.6 + quickjs-wasi: 3.4.0 + seedrandom: 3.0.5 + semver: 7.7.4 + ulid: 3.0.2 + zod: 4.3.6 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/errors@5.0.0-beta.17': + dependencies: + '@workflow/utils': 5.0.0-beta.8 + ms: 2.1.3 + + '@workflow/nest@5.0.0-beta.43(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(reflect-metadata@0.2.2)(rxjs@7.8.2))(@opentelemetry/api@1.9.1)(@swc/cli@0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0)(supports-color@8.1.1))(@swc/core@1.15.3(@swc/helpers@0.5.23))(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1) + '@nestjs/core': 12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@swc/cli': 0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0)(supports-color@8.1.1) + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + esbuild: 0.28.2 + pathe: 2.0.3 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/next@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/core': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + chokidar: 4.0.3 + ignore: 7.0.5 + semver: 7.7.4 + optionalDependencies: + next: 16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/nitro@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/core': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/rollup': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + '@workflow/vite': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/web': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(react@19.2.8)(supports-color@8.1.1) + exsolve: 1.0.8 + pathe: 2.0.3 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - react + - supports-color + - utf-8-validate + - ws + + '@workflow/nuxt@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@nuxt/kit': 4.4.8 + '@workflow/nitro': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - magicast + - react + - supports-color + - utf-8-validate + - ws + + '@workflow/rollup@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + exsolve: 1.0.7 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + '@workflow/serde@4.1.0': {} '@workflow/serde@4.1.0-beta.2': {} + '@workflow/serde@5.0.0-beta.2': {} + + '@workflow/sveltekit@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/rollup': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/swc-plugin': 5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23)) + '@workflow/vite': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + exsolve: 1.1.1 + fs-extra: 11.4.0 + pathe: 2.0.3 + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/swc-plugin@5.0.0-beta.5(@swc/core@1.15.3(@swc/helpers@0.5.23))': + dependencies: + '@swc/core': 1.15.3(@swc/helpers@0.5.23) + + '@workflow/typescript-plugin@5.0.0-beta.5(typescript@6.0.3)': + optionalDependencies: + typescript: 6.0.3 + + '@workflow/utils@5.0.0-beta.8': + dependencies: + ms: 2.1.3 + + '@workflow/vite@5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3)': + dependencies: + '@workflow/builders': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@swc/helpers' + - bufferutil + - supports-color + - utf-8-validate + - ws + + '@workflow/web@5.0.0-beta.43(@opentelemetry/api@1.9.1)(react@19.2.8)(supports-color@8.1.1)': + dependencies: + '@workflow/world-local': 5.0.0-beta.37(@opentelemetry/api@1.9.1) + express: 5.2.1(supports-color@8.1.1) + swr: 2.5.1(react@19.2.8) + transitivePeerDependencies: + - '@opentelemetry/api' + - react + - supports-color + + '@workflow/world-local@5.0.0-beta.37(@opentelemetry/api@1.9.1)': + dependencies: + '@vercel/queue': 0.5.0(@opentelemetry/api@1.9.1) + '@workflow/errors': 5.0.0-beta.17 + '@workflow/utils': 5.0.0-beta.8 + '@workflow/world': 5.0.0-beta.28 + async-sema: 3.1.1 + proper-lockfile: 4.1.2 + ulid: 3.0.2 + undici: 7.29.0 + zod: 4.3.6 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + + '@workflow/world-vercel@5.0.0-beta.39(@aws-sdk/credential-provider-web-identity@3.972.49)(@opentelemetry/api@1.9.1)': + dependencies: + '@vercel/functions': 3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3) + '@vercel/oidc': 3.2.0 + '@vercel/queue': 0.5.0(@opentelemetry/api@1.9.1) + '@workflow/errors': 5.0.0-beta.17 + '@workflow/world': 5.0.0-beta.28 + cbor-x: 1.6.0 + ulid: 3.0.2 + undici: 7.29.0 + ws: 8.21.3 + zod: 4.3.6 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-web-identity' + - bufferutil + - utf-8-validate + + '@workflow/world@5.0.0-beta.28': + dependencies: + ulid: 3.0.2 + zod: 4.3.6 + + '@xhmikosr/archive-type@8.1.0(supports-color@8.1.1)': + dependencies: + file-type: 21.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + + '@xhmikosr/bin-check@8.2.2': + dependencies: + execa: 9.6.1 + isexe: 4.0.0 + + '@xhmikosr/bin-wrapper@14.5.1(supports-color@8.1.1)': + dependencies: + '@xhmikosr/bin-check': 8.2.2 + '@xhmikosr/downloader': 16.3.1(supports-color@8.1.1) + '@xhmikosr/os-filter-obj': 4.1.0 + binary-version-check: 6.1.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-tar@9.0.2(supports-color@8.1.1)': + dependencies: + file-type: 21.3.4(supports-color@8.1.1) + is-stream: 4.0.1 + tar-stream: 3.1.7 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-tarbz2@9.0.2(supports-color@8.1.1)': + dependencies: + '@xhmikosr/decompress-tar': 9.0.2(supports-color@8.1.1) + file-type: 21.3.4(supports-color@8.1.1) + is-stream: 4.0.1 + seek-bzip: 2.0.0 + unbzip2-stream: 1.4.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-targz@9.0.1(supports-color@8.1.1)': + dependencies: + '@xhmikosr/decompress-tar': 9.0.2(supports-color@8.1.1) + file-type: 21.3.4(supports-color@8.1.1) + is-stream: 4.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@xhmikosr/decompress-unzip@8.2.1(supports-color@8.1.1)': + dependencies: + file-type: 21.3.4(supports-color@8.1.1) + get-stream: 9.0.1 + yauzl: 3.4.0 + transitivePeerDependencies: + - supports-color + + '@xhmikosr/decompress@11.1.4(supports-color@8.1.1)': + dependencies: + '@xhmikosr/decompress-tar': 9.0.2(supports-color@8.1.1) + '@xhmikosr/decompress-tarbz2': 9.0.2(supports-color@8.1.1) + '@xhmikosr/decompress-targz': 9.0.1(supports-color@8.1.1) + '@xhmikosr/decompress-unzip': 8.2.1(supports-color@8.1.1) + graceful-fs: 4.2.11 + strip-dirs: 3.0.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@xhmikosr/downloader@16.3.1(supports-color@8.1.1)': + dependencies: + '@xhmikosr/archive-type': 8.1.0(supports-color@8.1.1) + '@xhmikosr/decompress': 11.1.4(supports-color@8.1.1) + content-disposition: 2.0.1 + ext-name: 5.0.0 + file-type: 21.3.4(supports-color@8.1.1) + filenamify: 7.0.3 + got: 14.6.6 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@xhmikosr/os-filter-obj@4.1.0': + dependencies: + system-architecture: 1.0.0 + abbrev@3.0.1: {} accepts@2.0.0: @@ -9689,8 +11762,20 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.3.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.3.0: {} @@ -9701,6 +11786,8 @@ snapshots: ansi-styles@6.2.3: {} + ansis@3.17.0: {} + any-promise@1.3.0: {} arg@4.1.0: {} @@ -9729,6 +11816,8 @@ snapshots: async-sema@3.1.1: {} + async@3.2.6: {} + atomically@1.7.0: {} b4a@1.8.1: {} @@ -9745,7 +11834,7 @@ snapshots: baseline-browser-mapping@2.11.19: {} - better-auth@1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))): + better-auth@1.7.2(@opentelemetry/api@1.9.1)(drizzle-kit@0.31.10)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(pg@8.23.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0))): dependencies: '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2) '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@opentelemetry/api@1.9.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.10)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)) @@ -9767,11 +11856,11 @@ snapshots: optionalDependencies: drizzle-kit: 0.31.10 drizzle-orm: 0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0) - next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + next: 16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) pg: 8.23.0 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - vitest: 4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + vitest: 4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -9787,15 +11876,26 @@ snapshots: bignumber.js@9.3.1: {} + binary-version-check@6.1.0: + dependencies: + binary-version: 7.1.0 + semver: 7.8.5 + semver-truncate: 3.0.0 + + binary-version@7.1.0: + dependencies: + execa: 8.0.1 + find-versions: 6.0.0 + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - body-parser@2.3.0: + body-parser@2.3.0(supports-color@8.1.1): dependencies: bytes: 3.1.2 content-type: 2.1.0 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.1 iconv-lite: 0.7.3 on-finished: 2.4.1 @@ -9805,6 +11905,19 @@ snapshots: transitivePeerDependencies: - supports-color + bowser@2.14.1: {} + + boxen@8.0.1: + dependencies: + ansi-align: 3.0.1 + camelcase: 8.0.0 + chalk: 5.6.2 + cli-boxes: 3.0.0 + string-width: 7.2.0 + type-fest: 4.41.0 + widest-line: 5.0.0 + wrap-ansi: 9.0.2 + brace-expansion@1.1.18: dependencies: balanced-match: 1.0.2 @@ -9836,16 +11949,52 @@ snapshots: buffer-from@1.1.2: {} + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@5.0.0: {} + bundle-name@4.1.0: dependencies: run-applescript: 7.1.0 + byte-counter@0.1.0: {} + bytes@3.1.0: {} bytes@3.1.2: {} + c12@3.3.4: + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.1.1 + giget: 3.3.1 + jiti: 2.7.0 + ohash: 2.0.12 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.1 + rc9: 3.0.1 + cac@7.0.0: {} + cacheable-lookup@7.0.0: {} + + cacheable-request@13.0.19: + dependencies: + '@types/http-cache-semantics': 4.2.0 + get-stream: 9.0.1 + http-cache-semantics: 4.2.0 + keyv: 5.6.0 + mimic-response: 4.0.0 + normalize-url: 8.1.1 + responselike: 4.0.2 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -9858,8 +12007,26 @@ snapshots: callsites@3.1.0: {} + camelcase@8.0.0: {} + caniuse-lite@1.0.30001810: {} + cbor-extract@2.2.2: + dependencies: + node-gyp-build-optional-packages: 5.1.1 + optionalDependencies: + '@cbor-extract/cbor-extract-darwin-arm64': 2.2.2 + '@cbor-extract/cbor-extract-darwin-x64': 2.2.2 + '@cbor-extract/cbor-extract-linux-arm': 2.2.2 + '@cbor-extract/cbor-extract-linux-arm64': 2.2.2 + '@cbor-extract/cbor-extract-linux-x64': 2.2.2 + '@cbor-extract/cbor-extract-win32-x64': 2.2.2 + optional: true + + cbor-x@1.6.0: + optionalDependencies: + cbor-extract: 2.2.2 + ccount@2.0.1: {} chai@6.2.2: {} @@ -9878,14 +12045,32 @@ snapshots: dependencies: readdirp: 4.1.2 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + chokidar@5.0.0: + dependencies: + readdirp: 5.1.1 + chownr@3.0.0: {} + citty@0.1.6: + dependencies: + consola: 3.4.2 + cjs-module-lexer@1.2.3: {} class-variance-authority@0.7.1: dependencies: clsx: 2.1.1 + clean-stack@3.0.1: + dependencies: + escape-string-regexp: 4.0.0 + + cli-boxes@3.0.0: {} + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 @@ -9894,6 +12079,9 @@ snapshots: client-only@0.0.1: {} + clone@1.0.4: + optional: true + clsx@2.1.1: {} cmdk@1.1.1(@types/react-dom@19.2.5(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): @@ -9924,6 +12112,8 @@ snapshots: commander@14.0.3: {} + commander@6.2.1: {} + commander@7.2.0: {} commander@8.3.0: {} @@ -9943,10 +12133,16 @@ snapshots: pkg-up: 3.1.0 semver: 7.8.5 + confbox@0.1.8: {} + + confbox@0.2.4: {} + consola@3.4.2: {} content-disposition@1.1.0: {} + content-disposition@2.0.1: {} + content-type@1.0.4: {} content-type@1.0.5: {} @@ -9955,6 +12151,8 @@ snapshots: convert-hrtime@3.0.0: {} + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} @@ -10185,6 +12383,8 @@ snapshots: data-uri-to-buffer@4.0.1: {} + date-fns@4.1.0: {} + dayjs@1.11.23: {} db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)): @@ -10196,18 +12396,26 @@ snapshots: dependencies: mimic-fn: 3.1.0 - debug@4.3.4: + debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 - debug@4.4.3: + debug@4.4.3(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 + decompress-response@10.0.0: + dependencies: + mimic-response: 4.0.0 + dedent@1.7.2: {} deep-is@0.1.4: {} @@ -10221,6 +12429,11 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 + defaults@1.0.4: + dependencies: + clone: 1.0.4 + optional: true + define-lazy-prop@2.0.0: {} define-lazy-prop@3.0.0: {} @@ -10243,6 +12456,8 @@ snapshots: detect-node-es@1.1.0: {} + devalue@5.9.0: {} + devlop@1.1.0: dependencies: dequal: 2.0.3 @@ -10285,6 +12500,12 @@ snapshots: eastasianwidth@0.2.0: {} + easy-table@1.2.0: + dependencies: + ansi-regex: 5.0.1 + optionalDependencies: + wcwidth: 1.0.1 + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 @@ -10303,6 +12524,10 @@ snapshots: ee-first@1.1.1: {} + ejs@3.1.10: + dependencies: + jake: 10.9.4 + electron-to-chromium@1.5.415: {} emoji-regex@10.6.0: {} @@ -10321,6 +12546,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.19.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enhanced-resolve@5.24.5: dependencies: graceful-fs: 4.2.11 @@ -10342,10 +12572,14 @@ snapshots: httpxy: 0.5.5 srvx: 0.11.22 + environment@1.1.0: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 + errx@0.1.2: {} + es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -10445,6 +12679,35 @@ snapshots: '@esbuild/win32-ia32': 0.27.0 '@esbuild/win32-x64': 0.27.0 + esbuild@0.28.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -10453,21 +12716,21 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-plugin-react-hooks@7.1.1(eslint@10.9.1(jiti@2.7.0)): + eslint-plugin-react-hooks@7.1.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.8 - eslint: 10.9.1(jiti@2.7.0) + eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) hermes-parser: 0.25.1 zod: 4.4.3 zod-validation-error: 4.0.2(zod@4.4.3) transitivePeerDependencies: - supports-color - eslint-plugin-turbo@2.10.12(eslint@10.9.1(jiti@2.7.0))(turbo@2.10.12): + eslint-plugin-turbo@2.10.12(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1))(turbo@2.10.12): dependencies: dotenv: 16.0.3 - eslint: 10.9.1(jiti@2.7.0) + eslint: 10.9.1(jiti@2.7.0)(supports-color@8.1.1) turbo: 2.10.12 eslint-scope@9.1.2: @@ -10481,11 +12744,11 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.9.1(jiti@2.7.0): + eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(jiti@2.7.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(jiti@2.7.0)(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 + '@eslint/config-array': 0.23.5(supports-color@8.1.1) '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.2 @@ -10495,7 +12758,7 @@ snapshots: '@types/estree': 1.0.9 ajv: 6.15.0 cross-spawn: 7.0.6 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 9.1.2 eslint-visitor-keys: 5.0.1 @@ -10548,10 +12811,10 @@ snapshots: etag@1.8.1: {} - eve@0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + eve@0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: ai: 7.0.83(zod@4.4.3) - nitro: 3.0.260610-beta(@electric-sql/pglite@0.5.8)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + nitro: 3.0.260610-beta(@electric-sql/pglite@0.5.8)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) undici: 8.9.0 optionalDependencies: '@opentelemetry/api': 1.9.1 @@ -10609,16 +12872,18 @@ snapshots: dependencies: eventsource-parser: 3.1.1 - evlog@2.27.1(ai@7.0.83(zod@4.4.3))(eve@0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(express@5.2.1)(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@2.0.0-alpha.3)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + evlog@2.27.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nuxt/kit@4.4.8)(ai@7.0.83(zod@4.4.3))(eve@0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)))(express@5.2.1(supports-color@8.1.1))(hono@4.13.5)(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(ofetch@2.0.0-alpha.3)(react@19.2.8)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): optionalDependencies: + '@nestjs/common': 12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1) + '@nuxt/kit': 4.4.8 ai: 7.0.83(zod@4.4.3) - eve: 0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) - express: 5.2.1 + eve: 0.46.1(@electric-sql/pglite@0.5.8)(@opentelemetry/api@1.9.1)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(ai@7.0.83(zod@4.4.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + express: 5.2.1(supports-color@8.1.1) hono: 4.13.5 - next: 16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + next: 16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8) ofetch: 2.0.0-alpha.3 react: 19.2.8 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) execa@3.2.0: dependencies: @@ -10645,6 +12910,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + execa@9.6.1: dependencies: '@sindresorhus/merge-streams': 4.0.0 @@ -10662,28 +12939,28 @@ snapshots: expect-type@1.4.0: {} - express-rate-limit@8.6.2(express@5.2.1): + express-rate-limit@8.6.2(express@5.2.1(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - debug: 4.4.3 - express: 5.2.1 + debug: 4.4.3(supports-color@8.1.1) + express: 5.2.1(supports-color@8.1.1) ip-address: 10.5.0 transitivePeerDependencies: - supports-color - express@5.2.1: + express@5.2.1(supports-color@8.1.1): dependencies: accepts: 2.0.0 - body-parser: 2.3.0 + body-parser: 2.3.0(supports-color@8.1.1) content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 2.1.1 + finalhandler: 2.1.1(supports-color@8.1.1) fresh: 2.0.0 http-errors: 2.0.1 merge-descriptors: 2.0.0 @@ -10694,17 +12971,30 @@ snapshots: proxy-addr: 2.0.7 qs: 6.15.3 range-parser: 1.3.0 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 + router: 2.2.0(supports-color@8.1.1) + send: 1.2.1(supports-color@8.1.1) + serve-static: 2.2.1(supports-color@8.1.1) statuses: 2.0.2 type-is: 2.1.0 vary: 1.1.2 transitivePeerDependencies: - supports-color + exsolve@1.0.7: {} + + exsolve@1.0.8: {} + exsolve@1.1.1: {} + ext-list@2.2.2: + dependencies: + mime-db: 1.54.0 + + ext-name@5.0.0: + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + extend@3.0.2: {} fast-deep-equal@3.1.3: {} @@ -10723,6 +13013,8 @@ snapshots: fast-levenshtein@2.0.6: {} + fast-safe-stringify@2.1.1: {} + fast-uri@3.1.6: {} fastdom@1.0.12: @@ -10758,15 +13050,43 @@ snapshots: dependencies: flat-cache: 4.0.1 + file-type@21.3.4(supports-color@8.1.1): + dependencies: + '@tokenizer/inflate': 0.4.1(supports-color@8.1.1) + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + + file-type@22.0.2(supports-color@8.1.1): + dependencies: + '@tokenizer/inflate': 0.4.1(supports-color@8.1.1) + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + file-uri-to-path@1.0.0: {} + filelist@1.0.6: + dependencies: + minimatch: 5.1.9 + + filename-reserved-regex@4.0.1: {} + + filenamify@7.0.3: + dependencies: + filename-reserved-regex: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - finalhandler@2.1.1: + finalhandler@2.1.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 @@ -10784,6 +13104,17 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + find-versions@6.0.0: + dependencies: + semver-regex: 4.0.5 + super-regex: 1.1.0 + flat-cache@4.0.1: dependencies: flatted: 3.4.4 @@ -10796,6 +13127,8 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + form-data-encoder@4.1.0: {} + formatly@0.3.0: dependencies: fd-package-json: 2.0.0 @@ -10840,22 +13173,24 @@ snapshots: function-bind@1.1.2: {} + function-timeout@1.0.2: {} + fuzzysort@3.1.0: {} fzf@0.5.2: {} - gaxios@7.1.3: + gaxios@7.1.3(supports-color@8.1.1): dependencies: extend: 3.0.2 - https-proxy-agent: 7.0.6 + https-proxy-agent: 7.0.6(supports-color@8.1.1) node-fetch: 3.3.2 rimraf: 5.0.10 transitivePeerDependencies: - supports-color - gcp-metadata@8.1.4: + gcp-metadata@8.1.4(supports-color@8.1.1): dependencies: - gaxios: 7.1.3 + gaxios: 7.1.3(supports-color@8.1.1) google-logging-utils: 1.1.3 json-bigint: 1.0.0 transitivePeerDependencies: @@ -10884,6 +13219,8 @@ snapshots: get-own-enumerable-keys@1.0.0: {} + get-package-type@0.1.0: {} + get-port@5.1.1: {} get-proto@1.0.1: @@ -10897,6 +13234,8 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-stream@9.0.1: dependencies: '@sec-ant/readable-stream': 0.4.1 @@ -10910,8 +13249,7 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - giget@3.3.1: - optional: true + giget@3.3.1: {} glob-parent@5.1.2: dependencies: @@ -10936,25 +13274,25 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 - google-auth-library@10.5.0: + google-auth-library@10.5.0(supports-color@8.1.1): dependencies: base64-js: 1.5.1 ecdsa-sig-formatter: 1.0.11 - gaxios: 7.1.3 - gcp-metadata: 8.1.4 + gaxios: 7.1.3(supports-color@8.1.1) + gcp-metadata: 8.1.4(supports-color@8.1.1) google-logging-utils: 1.1.3 - gtoken: 8.0.0 + gtoken: 8.0.0(supports-color@8.1.1) jws: 4.0.1 transitivePeerDependencies: - supports-color google-logging-utils@1.1.3: {} - googleapis-common@8.0.3: + googleapis-common@8.0.3(supports-color@8.1.1): dependencies: extend: 3.0.2 - gaxios: 7.1.3 - google-auth-library: 10.5.0 + gaxios: 7.1.3(supports-color@8.1.1) + google-auth-library: 10.5.0(supports-color@8.1.1) google-logging-utils: 1.1.3 qs: 6.15.3 url-template: 2.0.8 @@ -10963,11 +13301,26 @@ snapshots: gopd@1.2.0: {} + got@14.6.6: + dependencies: + '@sindresorhus/is': 7.2.0 + byte-counter: 0.1.0 + cacheable-lookup: 7.0.0 + cacheable-request: 13.0.19 + decompress-response: 10.0.0 + form-data-encoder: 4.1.0 + http2-wrapper: 2.2.1 + keyv: 5.6.0 + lowercase-keys: 3.0.0 + p-cancelable: 4.0.1 + responselike: 4.0.2 + type-fest: 4.41.0 + graceful-fs@4.2.11: {} - gtoken@8.0.0: + gtoken@8.0.0(supports-color@8.1.1): dependencies: - gaxios: 7.1.3 + gaxios: 7.1.3(supports-color@8.1.1) jws: 4.0.1 transitivePeerDependencies: - supports-color @@ -10981,6 +13334,10 @@ snapshots: hachure-fill@0.5.2: {} + has-flag@4.0.0: {} + + has-flag@5.0.1: {} + has-symbols@1.1.0: {} hasown@2.0.4: @@ -11064,7 +13421,7 @@ snapshots: stringify-entities: 4.0.4 zwitch: 2.0.4 - hast-util-to-jsx-runtime@2.3.6: + hast-util-to-jsx-runtime@2.3.6(supports-color@8.1.1): dependencies: '@types/estree': 1.0.9 '@types/hast': 3.0.5 @@ -11073,9 +13430,9 @@ snapshots: devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.1 - mdast-util-mdx-jsx: 3.2.0 - mdast-util-mdxjs-esm: 2.0.1 + mdast-util-mdx-expression: 2.0.1(supports-color@8.1.1) + mdast-util-mdx-jsx: 3.2.0(supports-color@8.1.1) + mdast-util-mdxjs-esm: 2.0.1(supports-color@8.1.1) property-information: 7.2.0 space-separated-tokens: 2.0.2 style-to-js: 1.1.21 @@ -11127,6 +13484,8 @@ snapshots: html-void-elements@3.0.0: {} + http-cache-semantics@4.2.0: {} + http-errors@1.7.3: dependencies: depd: 1.1.2 @@ -11143,10 +13502,15 @@ snapshots: statuses: 2.0.2 toidentifier: 1.0.1 - https-proxy-agent@7.0.6: + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + https-proxy-agent@7.0.6(supports-color@8.1.1): dependencies: agent-base: 7.1.4 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -11156,6 +13520,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@5.0.0: {} + human-signals@8.0.1: {} iconv-lite@0.4.24: @@ -11170,8 +13536,14 @@ snapshots: dependencies: safer-buffer: 2.1.2 + ieee754@1.2.1: {} + ignore@5.3.2: {} + ignore@7.0.5: {} + + ignore@7.0.7: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -11181,10 +13553,16 @@ snapshots: imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + inherits@2.0.4: {} inline-style-parser@0.2.7: {} + inspect-with-kind@1.0.5: + dependencies: + kind-of: 6.0.3 + internmap@1.0.1: {} internmap@2.0.3: {} @@ -11236,6 +13614,8 @@ snapshots: is-obj@3.0.0: {} + is-plain-obj@1.1.0: {} + is-plain-obj@4.1.0: {} is-promise@4.0.0: {} @@ -11244,6 +13624,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + is-stream@4.0.1: {} is-unicode-supported@1.3.0: {} @@ -11262,12 +13644,22 @@ snapshots: isexe@3.1.5: {} + isexe@4.0.0: {} + + iterare@1.2.1: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jake@10.9.4: + dependencies: + async: 3.2.6 + filelist: 1.0.6 + picocolors: 1.1.1 + jiti@2.7.0: {} jose@5.10.0: {} @@ -11346,12 +13738,20 @@ snapshots: dependencies: json-buffer: 3.0.1 + keyv@5.6.0: + dependencies: + '@keyv/serialize': 1.1.1 + khroma@2.1.0: {} + kind-of@6.0.3: {} + kleur@3.0.3: {} kleur@4.1.5: {} + klona@2.0.6: {} + knip@6.32.3: dependencies: fdir: 6.5.0(picomatch@4.0.7) @@ -11368,6 +13768,8 @@ snapshots: yaml: 2.9.0 zod: 4.4.3 + knitwork@1.3.0: {} + kysely@0.29.5: {} layout-base@1.0.2: {} @@ -11477,8 +13879,12 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + lilconfig@3.1.3: {} + lines-and-columns@1.2.4: {} + load-esm@1.0.3: {} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 @@ -11488,6 +13894,10 @@ snapshots: dependencies: p-locate: 5.0.0 + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + lodash-es@4.18.1: {} log-symbols@6.0.0: @@ -11497,6 +13907,8 @@ snapshots: longest-streak@3.1.0: {} + lowercase-keys@3.0.0: {} + lru-cache@10.4.3: {} lru-cache@11.5.2: {} @@ -11519,6 +13931,12 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + markdown-table@3.0.4: {} marked@16.4.2: {} @@ -11534,14 +13952,14 @@ snapshots: unist-util-is: 6.0.1 unist-util-visit-parents: 6.0.2 - mdast-util-from-markdown@2.0.3: + mdast-util-from-markdown@2.0.3(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 - micromark: 4.0.2 + micromark: 4.0.2(supports-color@8.1.1) micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-decode-string: 2.0.1 micromark-util-normalize-identifier: 2.0.1 @@ -11559,79 +13977,79 @@ snapshots: mdast-util-find-and-replace: 3.0.2 micromark-util-character: 2.1.1 - mdast-util-gfm-footnote@2.1.0: + mdast-util-gfm-footnote@2.1.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 micromark-util-normalize-identifier: 2.0.1 transitivePeerDependencies: - supports-color - mdast-util-gfm-strikethrough@2.0.0: + mdast-util-gfm-strikethrough@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-table@2.0.0: + mdast-util-gfm-table@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 markdown-table: 3.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm-task-list-item@2.0.0: + mdast-util-gfm-task-list-item@2.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-gfm@3.1.0: + mdast-util-gfm@3.1.0(supports-color@8.1.1): dependencies: - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-gfm-autolink-literal: 2.0.1 - mdast-util-gfm-footnote: 2.1.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-gfm-footnote: 2.1.0(supports-color@8.1.1) + mdast-util-gfm-strikethrough: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-table: 2.0.0(supports-color@8.1.1) + mdast-util-gfm-task-list-item: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: + mdast-util-math@3.0.0(supports-color@8.1.1): dependencies: '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 unist-util-remove-position: 5.0.0 transitivePeerDependencies: - supports-color - mdast-util-mdx-expression@2.0.1: + mdast-util-mdx-expression@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color - mdast-util-mdx-jsx@3.2.0: + mdast-util-mdx-jsx@3.2.0(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 @@ -11639,7 +14057,7 @@ snapshots: '@types/unist': 3.0.3 ccount: 2.0.1 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 parse-entities: 4.0.2 stringify-entities: 4.0.4 @@ -11648,13 +14066,13 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-mdxjs-esm@2.0.1: + mdast-util-mdxjs-esm@2.0.1(supports-color@8.1.1): dependencies: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 devlop: 1.1.0 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 transitivePeerDependencies: - supports-color @@ -11676,9 +14094,9 @@ snapshots: unist-util-visit: 5.1.0 vfile: 6.0.3 - mdast-util-to-markdown-cjk-friendly-gfm-strikethrough@1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2): + mdast-util-to-markdown-cjk-friendly-gfm-strikethrough@1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(supports-color@8.1.1): dependencies: - mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0(supports-color@8.1.1) mdast-util-to-markdown: 2.1.2 micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) micromark-util-symbol: 2.0.1 @@ -11772,11 +14190,11 @@ snapshots: micromark-util-symbol: 2.0.1 micromark-util-types: 2.0.2 - micromark-extension-cjk-friendly-gfm-strikethrough@2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2): + micromark-extension-cjk-friendly-gfm-strikethrough@2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1)): dependencies: devlop: 1.1.0 get-east-asian-width: 1.6.0 - micromark: 4.0.2 + micromark: 4.0.2(supports-color@8.1.1) micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) micromark-util-character: 2.1.1 micromark-util-chunked: 2.0.1 @@ -11793,10 +14211,10 @@ snapshots: optionalDependencies: micromark-util-types: 2.0.2 - micromark-extension-cjk-friendly@2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2): + micromark-extension-cjk-friendly@2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1)): dependencies: devlop: 1.1.0 - micromark: 4.0.2 + micromark: 4.0.2(supports-color@8.1.1) micromark-extension-cjk-friendly-util: 3.0.1(micromark-util-types@2.0.2) micromark-util-chunked: 2.0.1 micromark-util-resolve-all: 2.0.1 @@ -11964,10 +14382,10 @@ snapshots: micromark-util-types@2.0.2: {} - micromark@4.0.2: + micromark@4.0.2(supports-color@8.1.1): dependencies: '@types/debug': 4.1.13 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 @@ -12007,8 +14425,12 @@ snapshots: mimic-fn@3.1.0: {} + mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + mimic-response@4.0.0: {} + minimatch@10.1.1: dependencies: '@isaacs/brace-expansion': 5.0.1 @@ -12021,6 +14443,10 @@ snapshots: dependencies: brace-expansion: 1.1.18 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.1.4 + minimatch@9.0.9: dependencies: brace-expansion: 2.1.4 @@ -12033,8 +14459,19 @@ snapshots: dependencies: minipass: 7.1.3 + mixpart@0.0.4: {} + + mixpart@0.0.6: {} + mkdirp@1.0.4: {} + mlly@1.8.2: + dependencies: + acorn: 8.18.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.4 + motion-dom@13.1.1: dependencies: motion-utils: 13.0.0 @@ -12059,6 +14496,8 @@ snapshots: nanoid@3.3.18: {} + nanoid@5.1.6: {} + nanoid@6.0.1: {} nanostores@1.5.2: {} @@ -12069,7 +14508,7 @@ snapshots: dependencies: content-type: 2.1.0 - next@16.3.3(@babel/core@7.29.7)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8): dependencies: '@next/env': 16.3.3 '@swc/helpers': 0.5.23 @@ -12078,7 +14517,7 @@ snapshots: postcss: 8.5.23 react: 19.2.8 react-dom: 19.2.8(react@19.2.8) - styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.8) + styled-jsx: 5.1.6(@babel/core@7.29.7(supports-color@8.1.1))(react@19.2.8) optionalDependencies: '@next/swc-darwin-arm64': 16.3.3 '@next/swc-darwin-x64': 16.3.3 @@ -12097,7 +14536,7 @@ snapshots: nf3@0.3.24: {} - nitro@3.0.260610-beta(@electric-sql/pglite@0.5.8)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + nitro@3.0.260610-beta(@electric-sql/pglite@0.5.8)(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(chokidar@4.0.0)(dotenv@17.4.2)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0))(giget@3.3.1)(jiti@2.7.0)(lru-cache@11.5.2)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: consola: 3.4.2 crossws: 0.4.12(srvx@0.11.22) @@ -12112,12 +14551,12 @@ snapshots: rolldown: 1.2.6 srvx: 0.11.22 unenv: 2.0.0-rc.24 - unstorage: 2.0.0-alpha.7(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(chokidar@4.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)))(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3) + unstorage: 2.0.0-alpha.7(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(chokidar@4.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)))(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3) optionalDependencies: dotenv: 17.4.2 giget: 3.3.1 jiti: 2.7.0 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -12172,6 +14611,11 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build-optional-packages@5.1.1: + dependencies: + detect-libc: 2.1.2 + optional: true + node-gyp-build@4.8.4: {} node-releases@2.0.53: {} @@ -12180,10 +14624,16 @@ snapshots: dependencies: abbrev: 3.0.1 + normalize-url@8.1.1: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -12227,6 +14677,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -12239,6 +14693,13 @@ snapshots: regex: 6.1.0 regex-recursion: 6.0.2 + open@10.2.0: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + wsl-utils: 0.1.0 + open@11.0.1: dependencies: default-browser: 5.5.1 @@ -12444,6 +14905,12 @@ snapshots: '@oxlint/binding-win32-x64-msvc': 1.80.0 oxlint-tsgolint: 7.0.2001 + p-cancelable@4.0.1: {} + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + p-finally@2.0.1: {} p-limit@2.3.0: @@ -12454,6 +14921,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.2 + p-locate@3.0.0: dependencies: p-limit: 2.3.0 @@ -12462,6 +14933,12 @@ snapshots: dependencies: p-limit: 3.1.0 + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-timeout@6.1.4: {} + p-try@2.2.0: {} package-json-from-dist@1.0.1: {} @@ -12507,6 +14984,8 @@ snapshots: path-exists@4.0.0: {} + path-exists@5.0.0: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -12535,6 +15014,8 @@ snapshots: pend@1.2.0: {} + perfect-debounce@2.1.0: {} + pg-cloudflare@1.4.0: optional: true @@ -12578,8 +15059,24 @@ snapshots: picomatch@4.0.7: {} + piscina@4.9.4: + optionalDependencies: + '@napi-rs/nice': 1.1.1 + pkce-challenge@5.0.1: {} + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.8.2 + pathe: 2.0.3 + + pkg-types@2.3.1: + dependencies: + confbox: 0.2.4 + exsolve: 1.1.1 + pathe: 2.0.3 + pkg-up@3.1.0: dependencies: find-up: 3.0.0 @@ -12643,6 +15140,12 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + property-information@7.2.0: {} proxy-addr@2.0.7: @@ -12666,6 +15169,10 @@ snapshots: queue-microtask@1.2.3: {} + quick-lru@5.1.1: {} + + quickjs-wasi@3.4.0: {} + range-parser@1.3.0: {} raw-body@2.4.1: @@ -12682,6 +15189,11 @@ snapshots: iconv-lite: 0.7.3 unpipe: 1.0.0 + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + react-dom@19.2.8(react@19.2.8): dependencies: react: 19.2.8 @@ -12718,6 +15230,8 @@ snapshots: readdirp@4.1.2: {} + readdirp@5.1.1: {} + recast@0.23.21: dependencies: ast-types: 0.16.1 @@ -12726,6 +15240,8 @@ snapshots: tiny-invariant: 1.3.3 tslib: 2.8.1 + reflect-metadata@0.2.2: {} + regex-recursion@6.0.2: dependencies: regex-utilities: 2.3.0 @@ -12761,10 +15277,10 @@ snapshots: '@types/hast': 3.0.5 hast-util-sanitize: 5.0.2 - remark-cjk-friendly-gfm-strikethrough@2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + remark-cjk-friendly-gfm-strikethrough@2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1))(supports-color@8.1.1)(unified@11.0.5): dependencies: - mdast-util-to-markdown-cjk-friendly-gfm-strikethrough: 1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2) - micromark-extension-cjk-friendly-gfm-strikethrough: 2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2) + mdast-util-to-markdown-cjk-friendly-gfm-strikethrough: 1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(supports-color@8.1.1) + micromark-extension-cjk-friendly-gfm-strikethrough: 2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1)) unified: 11.0.5 optionalDependencies: '@types/mdast': 4.0.4 @@ -12773,10 +15289,10 @@ snapshots: - micromark-util-types - supports-color - remark-cjk-friendly@2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2)(unified@11.0.5): + remark-cjk-friendly@2.3.1(@types/mdast@4.0.4)(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1))(unified@11.0.5): dependencies: mdast-util-to-markdown-cjk-friendly: 1.0.0(@types/mdast@4.0.4)(micromark-util-types@2.0.2) - micromark-extension-cjk-friendly: 2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2) + micromark-extension-cjk-friendly: 2.0.1(micromark-util-types@2.0.2)(micromark@4.0.2(supports-color@8.1.1)) unified: 11.0.5 optionalDependencies: '@types/mdast': 4.0.4 @@ -12784,30 +15300,30 @@ snapshots: - micromark - micromark-util-types - remark-gfm@4.0.1: + remark-gfm@4.0.1(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-gfm: 3.1.0 + mdast-util-gfm: 3.1.0(supports-color@8.1.1) micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 + remark-parse: 11.0.0(supports-color@8.1.1) remark-stringify: 11.0.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-math@6.0.0: + remark-math@6.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0 + mdast-util-math: 3.0.0(supports-color@8.1.1) micromark-extension-math: 3.1.0 unified: 11.0.5 transitivePeerDependencies: - supports-color - remark-parse@11.0.0: + remark-parse@11.0.0(supports-color@8.1.1): dependencies: '@types/mdast': 4.0.4 - mdast-util-from-markdown: 2.0.3 + mdast-util-from-markdown: 2.0.3(supports-color@8.1.1) micromark-util-types: 2.0.2 unified: 11.0.5 transitivePeerDependencies: @@ -12833,6 +15349,8 @@ snapshots: reselect@5.3.0: {} + resolve-alpn@1.2.1: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -12841,11 +15359,17 @@ snapshots: resolve.exports@2.0.3: {} + responselike@4.0.2: + dependencies: + lowercase-keys: 3.0.0 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 signal-exit: 4.1.0 + retry@0.12.0: {} + retry@0.13.1: {} reusify@1.1.0: {} @@ -12910,9 +15434,9 @@ snapshots: points-on-curve: 0.2.0 points-on-path: 0.2.1 - router@2.2.0: + router@2.2.0(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -12928,15 +15452,19 @@ snapshots: rw@1.3.3: {} + rxjs@7.8.2: + dependencies: + tslib: 2.8.1 + safe-buffer@5.2.1: {} safer-buffer@2.1.2: {} - sandbox@4.0.0: + sandbox@4.0.0(supports-color@8.1.1): dependencies: '@vercel/sandbox': 3.0.0 async-retry: 1.3.3 - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) ws: 8.21.3 zod: 4.4.3 transitivePeerDependencies: @@ -12948,17 +15476,33 @@ snapshots: scheduler@0.27.0: {} + scule@1.3.0: {} + + seedrandom@3.0.5: {} + + seek-bzip@2.0.0: + dependencies: + commander: 6.2.1 + + semver-regex@4.0.5: {} + + semver-truncate@3.0.0: + dependencies: + semver: 7.8.5 + semver@6.3.1: {} semver@7.5.4: dependencies: lru-cache: 6.0.0 + semver@7.7.4: {} + semver@7.8.5: {} - send@1.2.1: + send@1.2.1(supports-color@8.1.1): dependencies: - debug: 4.4.3 + debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -12972,12 +15516,12 @@ snapshots: transitivePeerDependencies: - supports-color - serve-static@2.2.1: + serve-static@2.2.1(supports-color@8.1.1): dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.1 + send: 1.2.1(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -12987,14 +15531,14 @@ snapshots: setprototypeof@1.2.0: {} - shadcn@4.19.0(typescript@6.0.3): + shadcn@4.19.0(supports-color@8.1.1)(typescript@6.0.3): dependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) '@babel/parser': 7.29.8 - '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7) - '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) + '@babel/preset-typescript': 7.29.7(@babel/core@7.29.7(supports-color@8.1.1))(supports-color@8.1.1) '@dotenvx/dotenvx': 1.75.1 - '@modelcontextprotocol/sdk': 1.30.0(zod@3.25.76) + '@modelcontextprotocol/sdk': 1.30.0(supports-color@8.1.1)(zod@3.25.76) '@types/validate-npm-package-name': 4.0.2 browserslist: 4.28.8 commander: 14.0.3 @@ -13117,6 +15661,8 @@ snapshots: sisteransi@1.0.5: {} + slash@3.0.0: {} + smart-buffer@4.2.0: {} smol-toml@1.5.2: {} @@ -13128,6 +15674,14 @@ snapshots: ip-address: 10.5.0 smart-buffer: 4.2.0 + sort-keys-length@1.0.1: + dependencies: + sort-keys: 1.1.2 + + sort-keys@1.1.2: + dependencies: + is-plain-obj: 1.1.0 + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -13137,6 +15691,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.6: {} + space-separated-tokens@2.0.2: {} split2@4.2.0: {} @@ -13167,10 +15723,10 @@ snapshots: end-of-stream: 1.1.0 stream-to-array: 2.3.0 - streamdown@2.6.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + streamdown@2.6.0(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(supports-color@8.1.1): dependencies: clsx: 2.1.1 - hast-util-to-jsx-runtime: 2.3.6 + hast-util-to-jsx-runtime: 2.3.6(supports-color@8.1.1) html-url-attributes: 3.0.1 marked: 17.0.6 react: 19.2.8 @@ -13178,8 +15734,8 @@ snapshots: rehype-harden: 1.1.8 rehype-raw: 7.0.0 rehype-sanitize: 6.0.0 - remark-gfm: 4.0.1 - remark-parse: 11.0.0 + remark-gfm: 4.0.1(supports-color@8.1.1) + remark-parse: 11.0.0(supports-color@8.1.1) remark-rehype: 11.1.2 remend: 1.3.1 tailwind-merge: 3.6.0 @@ -13239,12 +15795,23 @@ snapshots: strip-bom@3.0.0: {} + strip-dirs@3.0.0: + dependencies: + inspect-with-kind: 1.0.5 + is-plain-obj: 1.1.0 + strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + strip-final-newline@4.0.0: {} strip-json-comments@5.0.3: {} + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -13253,15 +15820,40 @@ snapshots: dependencies: inline-style-parser: 0.2.7 - styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.8): + styled-jsx@5.1.6(@babel/core@7.29.7(supports-color@8.1.1))(react@19.2.8): dependencies: client-only: 0.0.1 react: 19.2.8 optionalDependencies: - '@babel/core': 7.29.7 + '@babel/core': 7.29.7(supports-color@8.1.1) stylis@4.4.0: {} + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + + supports-color@10.2.2: {} + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@4.5.0: + dependencies: + has-flag: 5.0.1 + supports-color: 10.2.2 + + swr@2.5.1(react@19.2.8): + dependencies: + dequal: 2.0.3 + react: 19.2.8 + use-sync-external-store: 1.6.0(react@19.2.8) + + system-architecture@1.0.0: {} + systeminformation@5.33.4: {} tailwind-merge@3.6.0: {} @@ -13312,6 +15904,11 @@ snapshots: verkit: 0.3.2 yaml: 2.9.0 + terminal-link@5.0.0: + dependencies: + ansi-escapes: 7.3.0 + supports-hyperlinks: 4.5.0 + text-decoder@1.2.7: dependencies: b4a: 1.8.1 @@ -13320,10 +15917,16 @@ snapshots: throttleit@2.1.0: {} + through@2.3.8: {} + time-span@4.0.0: dependencies: convert-hrtime: 3.0.0 + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -13349,6 +15952,12 @@ snapshots: toidentifier@1.0.1: {} + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + tr46@0.0.3: {} tree-kill@1.2.2: {} @@ -13399,6 +16008,10 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.21.3: {} + + type-fest@4.41.0: {} + type-is@2.1.0: dependencies: content-type: 2.1.0 @@ -13413,8 +16026,21 @@ snapshots: uid-promise@1.0.0: {} + uid@2.0.2: + dependencies: + '@lukeed/csprng': 1.1.0 + + uint8array-extras@1.5.0: {} + + ulid@3.0.2: {} + unbash@4.0.10: {} + unbzip2-stream@1.4.3: + dependencies: + buffer: 5.7.1 + through: 2.3.8 + unconfig-core@7.5.0: dependencies: '@quansync/fs': 1.0.0 @@ -13428,6 +16054,13 @@ snapshots: quansync: 1.0.0 unconfig-core: 7.5.0 + unctx@2.5.0: + dependencies: + acorn: 8.18.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + unplugin: 2.3.11 + undici-types@5.26.5: {} undici-types@7.18.2: {} @@ -13450,6 +16083,8 @@ snapshots: dependencies: pathe: 2.0.3 + unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} unified@11.0.5: @@ -13499,15 +16134,30 @@ snapshots: unpipe@1.0.0: {} - unstorage@2.0.0-alpha.7(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(ws@8.21.3))(chokidar@4.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)))(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3): + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.18.0 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + + unstorage@2.0.0-alpha.7(@vercel/blob@2.8.0)(@vercel/functions@3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3))(chokidar@4.0.0)(db0@0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)))(lru-cache@11.5.2)(ofetch@2.0.0-alpha.3): optionalDependencies: '@vercel/blob': 2.8.0 - '@vercel/functions': 3.9.5(ws@8.21.3) + '@vercel/functions': 3.9.5(@aws-sdk/credential-provider-web-identity@3.972.49)(ws@8.21.3) chokidar: 4.0.0 db0: 0.3.4(@electric-sql/pglite@0.5.8)(drizzle-orm@0.45.2(@electric-sql/pglite@0.5.8)(@neondatabase/serverless@1.1.0)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(kysely@0.29.5)(pg@8.23.0)) lru-cache: 11.5.2 ofetch: 2.0.0-alpha.3 + untyped@2.0.0: + dependencies: + citty: 0.1.6 + defu: 6.1.7 + jiti: 2.7.0 + knitwork: 1.3.0 + scule: 1.3.0 + update-browserslist-db@1.3.1(browserslist@4.28.8): dependencies: browserslist: 4.28.8 @@ -13553,32 +16203,32 @@ snapshots: vary@1.1.2: {} - vercel@59.6.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3): + vercel@59.6.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(supports-color@8.1.1): dependencies: - '@vercel/backends': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/backends': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/blob': 2.8.0 '@vercel/build-utils': 14.5.0 '@vercel/cli-auth': 0.3.5 '@vercel/cli-config': 0.2.4 '@vercel/container': 3.0.0(@vercel/build-utils@14.5.0) '@vercel/detect-agent': 1.2.5 - '@vercel/elysia': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/express': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/fastify': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/fun': 1.3.0 + '@vercel/elysia': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/express': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/fastify': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/fun': 1.3.0(supports-color@8.1.1) '@vercel/go': 6.0.0(@vercel/build-utils@14.5.0) - '@vercel/h3': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/hono': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/h3': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/hono': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/hydrogen': 4.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/koa': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/nestjs': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/next': 7.0.0(@vercel/build-utils@14.5.0) - '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/koa': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/nestjs': 3.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/next': 7.0.0(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/node': 8.1.0(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/prepare-flags-definitions': 0.3.0 '@vercel/python': 9.0.0(@vercel/build-utils@14.5.0) '@vercel/python-analysis': 0.14.0 - '@vercel/redwood': 5.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) - '@vercel/remix-builder': 8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) + '@vercel/redwood': 5.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) + '@vercel/remix-builder': 8.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0)(supports-color@8.1.1) '@vercel/ruby': 5.0.0(@vercel/build-utils@14.5.0) '@vercel/rust': 4.0.0(@vercel/build-utils@14.5.0) '@vercel/static-build': 5.0.1(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.3)(@vercel/build-utils@14.5.0) @@ -13587,7 +16237,7 @@ snapshots: jose: 5.9.6 jsonc-parser: 3.3.1 luxon: 3.7.2 - sandbox: 4.0.0 + sandbox: 4.0.0(supports-color@8.1.1) smol-toml: 1.5.2 undici: 5.29.0 uuid: 14.0.1 @@ -13625,7 +16275,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0): + vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.7 @@ -13634,16 +16284,16 @@ snapshots: tinyglobby: 0.2.17 optionalDependencies: '@types/node': 24.13.3 - esbuild: 0.27.0 + esbuild: 0.28.2 fsevents: 2.3.3 jiti: 2.7.0 tsx: 4.21.0 yaml: 2.9.0 - vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): + vitest@4.1.11(@edge-runtime/vm@3.2.0)(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.11 - '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) + '@vitest/mocker': 4.1.11(vite@8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.11 '@vitest/runner': 4.1.11 '@vitest/snapshot': 4.1.11 @@ -13660,7 +16310,7 @@ snapshots: tinyexec: 1.3.0 tinyglobby: 0.2.17 tinyrainbow: 3.1.1 - vite: 8.2.2(@types/node@24.13.3)(esbuild@0.27.0)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) + vite: 8.2.2(@types/node@24.13.3)(esbuild@0.28.2)(jiti@2.7.0)(tsx@4.21.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@edge-runtime/vm': 3.2.0 @@ -13671,14 +16321,23 @@ snapshots: walk-up-path@4.0.0: {} + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + optional: true + web-namespaces@2.0.1: {} web-streams-polyfill@3.3.3: {} web-vitals@0.2.4: {} + web-worker@1.5.0: {} + webidl-conversions@3.0.1: {} + webpack-virtual-modules@0.6.2: {} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -13697,8 +16356,51 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + widest-line@5.0.0: + dependencies: + string-width: 7.2.0 + word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + + workflow@5.0.0-beta.43(@aws-sdk/credential-provider-web-identity@3.972.49)(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(reflect-metadata@0.2.2)(rxjs@7.8.2))(@opentelemetry/api@1.9.1)(@swc/cli@0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0)(supports-color@8.1.1))(@swc/core@1.15.3(@swc/helpers@0.5.23))(@swc/helpers@0.5.23)(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(supports-color@8.1.1)(typescript@6.0.3)(ws@8.21.3): + dependencies: + '@workflow/astro': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/cli': 5.0.0-beta.43(@aws-sdk/credential-provider-web-identity@3.972.49)(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/core': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/errors': 5.0.0-beta.17 + '@workflow/nest': 5.0.0-beta.43(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(@nestjs/core@12.0.1(@nestjs/common@12.0.1(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@8.1.1))(reflect-metadata@0.2.2)(rxjs@7.8.2))(@opentelemetry/api@1.9.1)(@swc/cli@0.8.1(@swc/core@1.15.3(@swc/helpers@0.5.23))(chokidar@5.0.0)(supports-color@8.1.1))(@swc/core@1.15.3(@swc/helpers@0.5.23))(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/next': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(next@16.3.3(@babel/core@7.29.7(supports-color@8.1.1))(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(supports-color@8.1.1)(ws@8.21.3) + '@workflow/nitro': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/nuxt': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(react@19.2.8)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/rollup': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/sveltekit': 5.0.0-beta.43(@opentelemetry/api@1.9.1)(@swc/helpers@0.5.23)(supports-color@8.1.1)(ws@8.21.3) + '@workflow/typescript-plugin': 5.0.0-beta.5(typescript@6.0.3) + '@workflow/utils': 5.0.0-beta.8 + ms: 2.1.3 + optionalDependencies: + '@opentelemetry/api': 1.9.1 + transitivePeerDependencies: + - '@aws-sdk/credential-provider-web-identity' + - '@nestjs/common' + - '@nestjs/core' + - '@swc/cli' + - '@swc/core' + - '@swc/helpers' + - bufferutil + - magicast + - next + - react + - supports-color + - typescript + - utf-8-validate + - ws + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -13711,10 +16413,20 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.2.0 + wrap-ansi@9.0.2: + dependencies: + ansi-styles: 6.2.3 + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrappy@1.0.2: {} ws@8.21.3: {} + wsl-utils@0.1.0: + dependencies: + is-wsl: 3.1.1 + wsl-utils@1.0.0: dependencies: is-wsl: 3.1.1 @@ -13757,8 +16469,14 @@ snapshots: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + yauzl@3.4.0: + dependencies: + pend: 1.2.0 + yocto-queue@0.1.0: {} + yocto-queue@1.2.2: {} + yocto-spinner@1.2.2: dependencies: yoctocolors: 2.2.0 @@ -13779,6 +16497,8 @@ snapshots: zod@4.1.11: {} + zod@4.3.6: {} + zod@4.4.3: {} zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 28f96d0c..c3bc3665 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -15,6 +15,7 @@ minimumReleaseAgeExclude: - picomatch - systeminformation allowBuilds: + "@swc/core": true cbor-extract: false esbuild: true sharp: true diff --git a/src/app/api/automations/_lib/workflow-world.ts b/src/app/api/automations/_lib/workflow-world.ts new file mode 100644 index 00000000..7d086315 --- /dev/null +++ b/src/app/api/automations/_lib/workflow-world.ts @@ -0,0 +1,18 @@ +import { createWorld, setWorld } from "workflow/runtime"; + +let applicationWorldPromise: Promise | undefined; + +export async function ensureApplicationWorkflowWorld() { + applicationWorldPromise ??= initializeApplicationWorld(); + try { + await applicationWorldPromise; + } catch (error) { + applicationWorldPromise = undefined; + throw error; + } +} + +async function initializeApplicationWorld() { + const world = await createWorld(); + setWorld(world); +} diff --git a/src/app/api/automations/_workflows/automations.ts b/src/app/api/automations/_workflows/automations.ts new file mode 100644 index 00000000..e471babe --- /dev/null +++ b/src/app/api/automations/_workflows/automations.ts @@ -0,0 +1,564 @@ +import { auth, gmail } from "@googleapis/gmail"; +import { getTokenResponse } from "@vercel/connect"; +import type { MessageStreamEvent } from "eve/client"; +import { createLogger, parseError } from "evlog"; +import { sleep } from "workflow"; +import { start } from "workflow/api"; +import { z } from "zod"; +import { + activateGmailWatch, + advanceGmailHistory, + beginAutomationRun, + finishAutomationRun, + listActiveGmailAutomations, + prepareGmailWatch, + readGmailWatchByEmail, + recordAutomationEveSession, +} from "@/db/services/automations"; +import { env } from "@/env"; +import type { AccessScope } from "@/lib/access-scope"; +import { createAutomationRequestHeaders } from "@/lib/automation-auth"; +import { internalApplicationOrigin } from "@/lib/application-origin"; +import { gmailTriggerMatches } from "@/lib/automation"; +import { googleWorkspaceTokenParams } from "@/lib/google-workspace"; +import { sendLinqText } from "@/auth/linq"; + +interface TimerAutomationWorkflowInput { + readonly automationId: string; + readonly revision: number; + readonly runAt: string; +} + +interface GmailWatchWorkflowInput extends AccessScope { + readonly generation: number; +} + +export interface GmailEventWorkflowInput { + readonly emailAddress: string; + readonly historyId: string; + readonly messageId: string; +} + +interface GmailEventMatch { + readonly automationId: string; + readonly eventContext: string; + readonly revision: number; + readonly triggerKey: string; +} + +const eveSessionAcceptedSchema = z.object({ + ok: z.literal(true), + sessionId: z.string().min(1), + status: z.literal("accepted"), +}); + +export async function timerAutomationWorkflow( + input: TimerAutomationWorkflowInput +) { + "use workflow"; + + await sleep(new Date(input.runAt)); + const run = await beginAutomationStep( + input.automationId, + input.revision, + `timer:${input.runAt}` + ); + if (!run) return { outcome: "suppressed" } as const; + + const completed = await executeAndDeliverAutomation(run); + if ( + completed.status === "active" && + completed.nextRunAt && + completed.revision === input.revision + ) { + await start( + timerAutomationWorkflow, + [ + { + automationId: completed.id, + revision: completed.revision, + runAt: completed.nextRunAt, + }, + ], + { deploymentId: "latest" } + ); + } + return { + nextRunAt: completed.nextRunAt, + outcome: completed.status, + } as const; +} + +export async function gmailWatchWorkflow(input: GmailWatchWorkflowInput) { + "use workflow"; + + const watch = await createGmailWatchStep(input); + if (!watch) return { outcome: "superseded" } as const; + await sleep(new Date(watch.renewAt)); + const renewal = await prepareGmailWatchStep(input); + if (!renewal.startRequired) return { outcome: "already-renewed" } as const; + await start( + gmailWatchWorkflow, + [{ ...input, generation: renewal.generation }], + { deploymentId: "latest" } + ); + return { outcome: "renewed" } as const; +} + +export async function gmailEventWorkflow(input: GmailEventWorkflowInput) { + "use workflow"; + + const batch = await loadGmailEventMatchesStep(input); + /* oxlint-disable eslint/no-await-in-loop -- Each matching delivery is serialized so one user's shared Eve session sees an ordered queue. */ + for (const match of batch.matches) { + const run = await beginAutomationStep( + match.automationId, + match.revision, + match.triggerKey + ); + if (run) await executeAndDeliverAutomation(run, match.eventContext); + } + /* oxlint-enable eslint/no-await-in-loop */ + await advanceGmailHistoryStep( + batch.workspaceId, + batch.userId, + batch.historyId + ); + return { matchCount: batch.matches.length, outcome: "processed" } as const; +} + +async function executeAndDeliverAutomation( + run: Awaited> & {}, + eventContext?: string +) { + "use workflow"; + + try { + const eveSessionId = await startAutomationExecutionStep(run, eventContext); + const execution = await collectAutomationExecutionStep(run, eveSessionId); + await retireAutomationExecutionStep(run, eveSessionId); + if (execution.status !== "completed") { + return await finishAutomationStep(run.runId, { + error: + execution.status === "waiting" + ? "Automation requires human input and cannot continue unattended." + : (execution.error ?? "Automation Eve task failed."), + }); + } + if (!execution.message) { + return await finishAutomationStep(run.runId, { + error: "Automation agent completed without a deliverable message.", + }); + } + await deliverAutomationStep(run, execution.message); + return await finishAutomationStep(run.runId, { + result: execution.message, + }); + } catch (error) { + return await finishAutomationStep(run.runId, { + error: error instanceof Error ? error.message : String(error), + }); + } +} + +async function beginAutomationStep( + automationId: string, + revision: number, + triggerKey: string +) { + "use step"; + return beginAutomationRun(automationId, revision, triggerKey); +} + +async function startAutomationExecutionStep( + run: NonNullable>>, + eventContext?: string +) { + "use step"; + const log = automationLogger("dispatch", run, { eventContext }); + try { + const { Client } = await import("eve/client"); + const client = new Client({ + headers: () => automationExecutionHeaders(run), + host: internalApplicationOrigin(), + redirect: "error", + }); + const response = await client.fetch("/eve/v1/session", { + body: JSON.stringify({ + context: [ + JSON.stringify({ + automationId: run.automation.id, + automationRunId: run.runId, + automationTitle: run.automation.title, + }), + ], + message: automationPrompt(run.automation.task, eventContext), + mode: "conversation", + operationId: `automation-run:${run.runId}`, + }), + headers: { "content-type": "application/json" }, + method: "POST", + }); + const body: unknown = await response.json().catch(() => undefined); + if (!response.ok) { + throw new Error( + `Automation Eve task dispatch failed with HTTP ${String(response.status)}: ${JSON.stringify(body)}` + ); + } + const accepted = eveSessionAcceptedSchema.parse(body); + await recordAutomationEveSession(run.runId, accepted.sessionId); + log.set({ eveResponse: accepted }); + log.info("Automation Eve task dispatched"); + return accepted.sessionId; + } catch (error) { + log.error(error instanceof Error ? error : String(error), { + failure: parseError(error), + }); + throw error; + } finally { + log.emit(); + } +} + +async function collectAutomationExecutionStep( + run: NonNullable>>, + eveSessionId: string +) { + "use step"; + const log = automationLogger("execute", run, { eveSessionId }); + const events: MessageStreamEvent[] = []; + let error: string | undefined; + let inputRequired = false; + let message: string | undefined; + let status: "completed" | "failed" | "waiting" | undefined; + try { + const { Client } = await import("eve/client"); + const client = new Client({ + headers: () => automationExecutionHeaders(run), + host: internalApplicationOrigin(), + redirect: "error", + }); + const session = client.sessions.attach(eveSessionId); + for await (const event of session.stream({ startIndex: 0 })) { + events.push(event); + if ( + event.type === "input.requested" || + event.type === "authorization.required" + ) { + inputRequired = true; + } else if ( + event.type === "message.completed" && + event.data.finishReason !== "tool-calls" + ) { + message = event.data.message?.trim() ?? undefined; + } else if (event.type === "session.failed") { + error = `${event.data.code}: ${event.data.message}`; + status = "failed"; + break; + } else if (event.type === "session.waiting") { + status = inputRequired ? "waiting" : "completed"; + break; + } else if (event.type === "session.completed") { + status = "completed"; + break; + } + } + if (!status) throw new Error("Automation Eve task stream ended early."); + log.set({ + eveEvents: events, + eveSessionId, + response: { error, message, status }, + }); + log.info("Automation Eve task settled"); + return { error, message, status }; + } catch (caught) { + log.error(caught instanceof Error ? caught : String(caught), { + eveEvents: events, + failure: parseError(caught), + }); + throw caught; + } finally { + log.emit(); + } +} + +async function retireAutomationExecutionStep( + run: NonNullable>>, + eveSessionId: string +) { + "use step"; + const { Client } = await import("eve/client"); + const client = new Client({ + headers: () => automationExecutionHeaders(run), + host: internalApplicationOrigin(), + redirect: "error", + }); + await client.sessions.attach(eveSessionId).reset({ + reason: "Automation run settled.", + }); +} + +async function deliverAutomationStep( + run: NonNullable>>, + result: string +) { + "use step"; + const log = automationLogger("deliver", run, { result }); + try { + if (!env.LINQ_CONNECTOR) { + throw new Error("LINQ_CONNECTOR is required for automation delivery."); + } + await sendLinqText({ + connector: env.LINQ_CONNECTOR, + idempotencyKey: `automation-run:${run.runId}`, + message: result, + to: run.automation.phoneNumber, + }); + log.info("Automation text delivered"); + } catch (error) { + log.error(error instanceof Error ? error : String(error), { + failure: parseError(error), + }); + throw error; + } finally { + log.emit(); + } +} + +async function finishAutomationStep( + runId: string, + outcome: { readonly error?: string; readonly result?: string } +) { + "use step"; + return finishAutomationRun({ runId, ...outcome }); +} + +async function prepareGmailWatchStep(scope: GmailWatchWorkflowInput) { + "use step"; + return prepareGmailWatch(scope); +} + +async function createGmailWatchStep(input: GmailWatchWorkflowInput) { + "use step"; + const log = createLogger({ gmailWatch: input, operation: "gmail.watch" }); + try { + if (!env.GMAIL_PUBSUB_TOPIC) { + throw new Error("GMAIL_PUBSUB_TOPIC is required for Gmail automations."); + } + const client = await gmailClient(input.userId); + const [{ data: profile }, { data: watch }] = await Promise.all([ + client.users.getProfile({ userId: "me" }), + client.users.watch({ + requestBody: { + labelFilterBehavior: "include", + labelIds: ["INBOX"], + topicName: env.GMAIL_PUBSUB_TOPIC, + }, + userId: "me", + }), + ]); + if (!profile.emailAddress || !watch.expiration || !watch.historyId) { + throw new Error("Gmail returned an incomplete watch response."); + } + const expirationAt = new Date(Number(watch.expiration)); + const activated = await activateGmailWatch({ + emailAddress: profile.emailAddress, + expirationAt: expirationAt.toISOString(), + generation: input.generation, + historyId: watch.historyId, + scope: input, + }); + if (!activated) return undefined; + const renewAt = new Date( + Math.max( + Date.now() + 60_000, + expirationAt.getTime() - 24 * 60 * 60 * 1000 + ) + ); + log.set({ + activated, + gmailResponse: watch, + renewAt: renewAt.toISOString(), + }); + log.info("Gmail push watch activated"); + return { renewAt: renewAt.toISOString() }; + } catch (error) { + log.error(error instanceof Error ? error : String(error), { + failure: parseError(error), + }); + throw error; + } finally { + log.emit(); + } +} + +async function loadGmailEventMatchesStep(input: GmailEventWorkflowInput) { + "use step"; + const log = createLogger({ gmailPush: input, operation: "gmail.event" }); + try { + const watch = await readGmailWatchByEmail(input.emailAddress); + if (watch?.status !== "active" || !watch.historyId) { + throw new Error( + `No active Gmail watch exists for ${input.emailAddress}.` + ); + } + if (BigInt(input.historyId) <= BigInt(watch.historyId)) { + return { + historyId: input.historyId, + matches: [], + userId: watch.userId, + workspaceId: watch.workspaceId, + }; + } + + const client = await gmailClient(watch.userId); + const messageIds = new Set(); + let pageToken: string | undefined; + let latestHistoryId = input.historyId; + /* oxlint-disable eslint/no-await-in-loop -- Gmail history page tokens form an ordered cursor chain. */ + do { + const { data } = await client.users.history.list({ + historyTypes: ["messageAdded"], + labelId: "INBOX", + pageToken, + startHistoryId: watch.historyId, + userId: "me", + }); + for (const history of data.history ?? []) { + for (const addition of history.messagesAdded ?? []) { + const message = addition.message; + if (message?.id && message.labelIds?.includes("INBOX")) { + messageIds.add(message.id); + } + } + } + latestHistoryId = data.historyId ?? latestHistoryId; + pageToken = data.nextPageToken ?? undefined; + } while (pageToken); + /* oxlint-enable eslint/no-await-in-loop */ + + const messages = await Promise.all( + [...messageIds].map(async (id) => { + const { data } = await client.users.messages.get({ + format: "metadata", + id, + metadataHeaders: ["From", "Subject", "Date", "Message-ID"], + userId: "me", + }); + const headers = new Map( + (data.payload?.headers ?? []).flatMap((header) => + header.name && header.value + ? [[header.name.toLowerCase(), header.value] as const] + : [] + ) + ); + return { + date: headers.get("date") ?? "", + from: headers.get("from") ?? "", + id, + messageId: headers.get("message-id") ?? "", + snippet: data.snippet ?? "", + subject: headers.get("subject") ?? "", + threadId: data.threadId ?? "", + }; + }) + ); + const automations = await listActiveGmailAutomations( + watch.workspaceId, + watch.userId + ); + const matches = automations.flatMap((automation) => { + if (automation.trigger.kind !== "gmail") return []; + const trigger = automation.trigger; + return messages.flatMap((message) => + gmailTriggerMatches(trigger, message) + ? [ + { + automationId: automation.id, + eventContext: JSON.stringify(message), + revision: automation.revision, + triggerKey: `gmail:${message.id}`, + } satisfies GmailEventMatch, + ] + : [] + ); + }); + log.set({ automations, matches, messages, watch }); + log.info("Gmail push event matched automations"); + return { + historyId: latestHistoryId, + matches, + userId: watch.userId, + workspaceId: watch.workspaceId, + }; + } catch (error) { + log.error(error instanceof Error ? error : String(error), { + failure: parseError(error), + }); + throw error; + } finally { + log.emit(); + } +} + +async function advanceGmailHistoryStep( + workspaceId: string, + userId: string, + historyId: string +) { + "use step"; + await advanceGmailHistory(workspaceId, userId, historyId); +} + +async function gmailClient(userId: string) { + const response = await getTokenResponse( + env.GOOGLE_CONNECTOR_UID, + googleWorkspaceTokenParams(userId), + { forceRefresh: true } + ); + const authClient = new auth.OAuth2(); + authClient.setCredentials({ access_token: response.token }); + return gmail({ auth: authClient, version: "v1" }); +} + +function automationLogger( + operation: string, + run: NonNullable>>, + context: { + readonly eventContext?: string; + readonly eveSessionId?: string; + readonly result?: string; + } +) { + return createLogger({ + automation: run.automation, + automationRun: { + id: run.runId, + startedAt: run.startedAt, + }, + operation: `automation.${operation}`, + ...context, + }); +} + +function automationExecutionHeaders( + run: NonNullable>> +) { + return createAutomationRequestHeaders({ + automationId: run.automation.id, + purpose: "execute", + revision: run.automation.revision, + runId: run.runId, + }); +} + +function automationPrompt(task: string, eventContext?: string) { + return [ + "Run this saved automation now.", + `Task: ${task}`, + eventContext ? `Trigger event:\n${eventContext}` : undefined, + "Complete the task using current data. Do not create, update, pause, or delete automations while fulfilling it. Return a concise text message for the user.", + ] + .filter((value): value is string => value !== undefined) + .join("\n\n"); +} diff --git a/src/app/api/automations/arm/route.ts b/src/app/api/automations/arm/route.ts new file mode 100644 index 00000000..ce02ea3d --- /dev/null +++ b/src/app/api/automations/arm/route.ts @@ -0,0 +1,81 @@ +import { start } from "workflow/api"; +import { + prepareGmailWatch, + readAutomationById, + recordGmailWatchWorkflow, +} from "@/db/services/automations"; +import { verifyAutomationRequest } from "@/lib/automation-auth"; +import { ensureApplicationWorkflowWorld } from "../_lib/workflow-world"; +import { + gmailWatchWorkflow, + timerAutomationWorkflow, +} from "../_workflows/automations"; + +export async function POST(request: Request) { + const signed = await verifyAutomationRequest(request.headers, "arm"); + if (!signed) { + return Response.json({ error: "Unauthorized" }, { status: 401 }); + } + await ensureApplicationWorkflowWorld(); + const automation = await readAutomationById(signed.automationId); + if ( + automation?.status !== "active" || + automation.revision !== signed.revision + ) { + return Response.json({ error: "Automation is inactive" }, { status: 409 }); + } + + if (automation.trigger.kind === "gmail") { + const scope = { + userId: automation.createdByUserId, + workspaceId: automation.workspaceId, + }; + const prepared = await prepareGmailWatch(scope); + if (!prepared.startRequired) { + return Response.json({ kind: "gmail", status: "already-armed" }); + } + const run = await start( + gmailWatchWorkflow, + [{ ...scope, generation: prepared.generation }], + { + attributes: { + automationId: automation.id, + trigger: "gmail-watch", + userId: automation.createdByUserId, + }, + deploymentId: "latest", + } + ); + await recordGmailWatchWorkflow(scope, prepared.generation, run.runId); + return Response.json({ kind: "gmail", runId: run.runId, status: "armed" }); + } + + if (!automation.nextRunAt) { + return Response.json( + { error: "Automation has no next run" }, + { status: 409 } + ); + } + const run = await start( + timerAutomationWorkflow, + [ + { + automationId: automation.id, + revision: automation.revision, + runAt: automation.nextRunAt, + }, + ], + { + attributes: { + automationId: automation.id, + trigger: automation.trigger.kind, + }, + deploymentId: "latest", + } + ); + return Response.json({ + kind: automation.trigger.kind, + runId: run.runId, + status: "armed", + }); +} diff --git a/src/app/api/automations/gmail/route.ts b/src/app/api/automations/gmail/route.ts new file mode 100644 index 00000000..d58b7cfd --- /dev/null +++ b/src/app/api/automations/gmail/route.ts @@ -0,0 +1,92 @@ +import { auth } from "@googleapis/gmail"; +import { createLogger, parseError } from "evlog"; +import { z } from "zod"; +import { start } from "workflow/api"; +import { env } from "@/env"; +import { ensureApplicationWorkflowWorld } from "../_lib/workflow-world"; +import { gmailEventWorkflow } from "../_workflows/automations"; + +const pubsubEnvelopeSchema = z.object({ + message: z.object({ + data: z.string().min(1), + messageId: z.string().min(1), + publishTime: z.string().optional(), + }), + subscription: z.string().optional(), +}); + +const gmailNotificationSchema = z.object({ + emailAddress: z.email(), + historyId: z.string().regex(/^\d+$/u), +}); + +export async function POST(request: Request) { + const log = createLogger({ operation: "automation.gmail.push" }); + try { + if (!env.GMAIL_PUBSUB_AUDIENCE || !env.GMAIL_PUBSUB_SERVICE_ACCOUNT) { + throw new Error( + "GMAIL_PUBSUB_AUDIENCE and GMAIL_PUBSUB_SERVICE_ACCOUNT are required." + ); + } + const authorization = request.headers.get("authorization"); + const idToken = /^Bearer (.+)$/iu.exec(authorization ?? "")?.[1]; + if (!idToken) { + return Response.json( + { error: "Missing Pub/Sub identity" }, + { status: 401 } + ); + } + const ticket = await new auth.OAuth2().verifyIdToken({ + audience: env.GMAIL_PUBSUB_AUDIENCE, + idToken, + }); + const claims = ticket.getPayload(); + if ( + claims?.email !== env.GMAIL_PUBSUB_SERVICE_ACCOUNT || + claims.email_verified !== true + ) { + return Response.json( + { error: "Unexpected Pub/Sub identity" }, + { status: 403 } + ); + } + + const envelope = pubsubEnvelopeSchema.parse(await request.json()); + const decodedNotification: unknown = JSON.parse( + Buffer.from(envelope.message.data, "base64url").toString("utf8") + ); + const notification = gmailNotificationSchema.parse(decodedNotification); + log.set({ claims, envelope, notification }); + await ensureApplicationWorkflowWorld(); + const run = await start( + gmailEventWorkflow, + [ + { + ...notification, + messageId: envelope.message.messageId, + }, + ], + { + attributes: { + emailAddress: notification.emailAddress, + pubsubMessageId: envelope.message.messageId, + trigger: "gmail-event", + }, + deploymentId: "latest", + } + ); + log.set({ workflowRunId: run.runId }); + log.info("Gmail push event accepted"); + return new Response(null, { status: 204 }); + } catch (error) { + log.error(error instanceof Error ? error : String(error), { + failure: parseError(error), + }); + return Response.json( + { error: error instanceof Error ? error.message : String(error) }, + { status: 500 } + ); + } finally { + log.emit(); + } +} diff --git a/src/env.ts b/src/env.ts index 545717b3..83ee47ae 100644 --- a/src/env.ts +++ b/src/env.ts @@ -44,6 +44,11 @@ const betterAuthUrlSchema = requiredValue.refine( "BETTER_AUTH_URL must be an absolute URL" ); +const absoluteUrlSchema = requiredValue.refine( + (value) => URL.canParse(value), + "Must be an absolute URL" +); + function optionalValueWithLocalDefault>( schema: T, localDefault: z.util.NoUndefined> @@ -83,6 +88,11 @@ export const env = createEnv({ // Optional BLOB_READ_WRITE_TOKEN: requiredValue.optional(), BLOB_STORE_ID: requiredValue.optional(), + GMAIL_PUBSUB_AUDIENCE: absoluteUrlSchema.optional(), + GMAIL_PUBSUB_SERVICE_ACCOUNT: z.email().optional(), + GMAIL_PUBSUB_TOPIC: requiredValue + .regex(/^projects\/[^/]+\/topics\/[^/]+$/u) + .optional(), GOOGLE_CONNECTOR_UID: requiredValue.default("google/open-instinct"), LINQ_CONNECTOR: requiredValue.optional(), LINQ_PHONE_NUMBER: requiredValue diff --git a/src/lib/application-origin.ts b/src/lib/application-origin.ts index 52adda80..446eea40 100644 --- a/src/lib/application-origin.ts +++ b/src/lib/application-origin.ts @@ -16,6 +16,17 @@ export function applicationOrigin() { ); } +export function internalApplicationOrigin() { + if (env.VERCEL_ENV) { + const hostname = + env.VERCEL_URL ?? + env.VERCEL_BRANCH_URL ?? + env.VERCEL_PROJECT_PRODUCTION_URL; + if (hostname) return new URL(`https://${hostname}`).origin; + } + return applicationOrigin(); +} + export function betterAuthBaseURL() { const fallback = applicationOrigin(); if (!env.VERCEL_ENV) return fallback; diff --git a/src/lib/automation-auth.ts b/src/lib/automation-auth.ts new file mode 100644 index 00000000..682abcd0 --- /dev/null +++ b/src/lib/automation-auth.ts @@ -0,0 +1,98 @@ +import { createHmac, timingSafeEqual } from "node:crypto"; +import { z } from "zod"; +import { getInstallationSecrets } from "@/lib/installation-secrets"; + +const automationRequestSchema = z.object({ + automationId: z.string().min(1), + purpose: z.enum(["arm", "execute"]), + revision: z.coerce.number().int().positive(), + runId: z.string().min(1).optional(), + timestamp: z.coerce.number().int().positive(), +}); + +const maximumSignatureAgeMilliseconds = 5 * 60 * 1000; + +export async function createAutomationRequestHeaders(input: { + readonly automationId: string; + readonly purpose: "arm" | "execute"; + readonly revision: number; + readonly runId?: string; +}) { + if (input.purpose === "execute" && !input.runId) { + throw new Error("Automation execution signatures require a run ID."); + } + const timestamp = Date.now(); + const request = { ...input, timestamp }; + const headers = { + "x-openinstinct-automation-id": input.automationId, + "x-openinstinct-automation-purpose": input.purpose, + "x-openinstinct-automation-revision": String(input.revision), + "x-openinstinct-automation-signature": await signAutomationRequest(request), + "x-openinstinct-automation-timestamp": String(timestamp), + }; + if (input.runId) { + Object.assign(headers, { + "x-openinstinct-automation-run-id": input.runId, + }); + } + return headers; +} + +export async function verifyAutomationRequest( + headers: Headers, + expectedPurpose: "arm" | "execute" +) { + const parsed = automationRequestSchema.safeParse({ + automationId: headers.get("x-openinstinct-automation-id"), + purpose: headers.get("x-openinstinct-automation-purpose"), + revision: headers.get("x-openinstinct-automation-revision"), + runId: headers.get("x-openinstinct-automation-run-id") ?? undefined, + timestamp: headers.get("x-openinstinct-automation-timestamp"), + }); + if ( + !parsed.success || + parsed.data.purpose !== expectedPurpose || + (expectedPurpose === "execute" && !parsed.data.runId) + ) + return undefined; + if ( + Math.abs(Date.now() - parsed.data.timestamp) > + maximumSignatureAgeMilliseconds + ) { + return undefined; + } + + const signature = headers.get("x-openinstinct-automation-signature"); + if (!signature) return undefined; + const expected = await signAutomationRequest(parsed.data); + const actualBuffer = Buffer.from(signature, "hex"); + const expectedBuffer = Buffer.from(expected, "hex"); + if ( + actualBuffer.length !== expectedBuffer.length || + !timingSafeEqual(actualBuffer, expectedBuffer) + ) { + return undefined; + } + return parsed.data; +} + +async function signAutomationRequest(input: { + readonly automationId: string; + readonly purpose: "arm" | "execute"; + readonly revision: number; + readonly runId?: string; + readonly timestamp: number; +}) { + const { betterAuthSecret } = await getInstallationSecrets(); + return createHmac("sha256", betterAuthSecret) + .update( + [ + input.purpose, + input.automationId, + input.revision, + input.runId ?? "", + input.timestamp, + ].join("\0") + ) + .digest("hex"); +} diff --git a/src/lib/automation.ts b/src/lib/automation.ts new file mode 100644 index 00000000..7d7982ae --- /dev/null +++ b/src/lib/automation.ts @@ -0,0 +1,217 @@ +import { z } from "zod"; + +const weekdaySchema = z.enum([ + "sunday", + "monday", + "tuesday", + "wednesday", + "thursday", + "friday", + "saturday", +]); + +const localTimeSchema = z + .string() + .regex(/^(?:[01]\d|2[0-3]):[0-5]\d$/u, "Use 24-hour HH:MM format."); + +export const automationTriggerSchema = z.discriminatedUnion("kind", [ + z.object({ + at: z.iso.datetime({ offset: true }), + kind: z.literal("at"), + }), + z + .object({ + kind: z.literal("recurring"), + localTime: localTimeSchema, + recurrence: z.enum(["daily", "weekdays", "weekly"]), + weekday: weekdaySchema.optional(), + }) + .refine((trigger) => trigger.recurrence !== "weekly" || trigger.weekday, { + message: "Weekly automations require a weekday.", + path: ["weekday"], + }), + z.object({ + everyMinutes: z.number().int().min(5).max(525_600), + kind: z.literal("interval"), + startsAt: z.iso.datetime({ offset: true }).optional(), + }), + z + .object({ + fromAddress: z.email().optional(), + kind: z.literal("gmail"), + subjectContains: z.string().min(1).max(500).optional(), + threadId: z.string().min(1).max(200).optional(), + }) + .refine( + (trigger) => + trigger.fromAddress !== undefined || + trigger.subjectContains !== undefined || + trigger.threadId !== undefined, + { message: "A Gmail automation needs at least one message filter." } + ), +]); + +export const automationStatusSchema = z.enum([ + "active", + "paused", + "completed", + "deleted", +]); + +export const automationSchema = z.object({ + createdAt: z.string(), + createdByUserId: z.string().min(1), + id: z.string().min(1), + lastRunAt: z.string().nullable(), + nextRunAt: z.string().nullable(), + phoneNumber: z.string().min(1), + revision: z.number().int().positive(), + sessionId: z.string().min(1), + status: automationStatusSchema, + task: z.string().min(1), + timezone: z.string().min(1), + title: z.string().min(1), + trigger: automationTriggerSchema, + updatedAt: z.string(), + workspaceId: z.string().min(1), +}); + +export type Automation = z.infer; +export type AutomationTrigger = z.infer; + +const weekdayNumbers = new Map( + weekdaySchema.options.map((weekday, index) => [weekday, index]) +); + +export function assertTimezone(timezone: string) { + try { + new Intl.DateTimeFormat("en-US", { timeZone: timezone }).format(); + } catch { + throw new Error(`Unknown IANA timezone: ${timezone}`); + } +} + +export function nextAutomationRunAt( + trigger: AutomationTrigger, + timezone: string, + after: Date +) { + if (trigger.kind === "gmail") return undefined; + if (trigger.kind === "at") { + const at = new Date(trigger.at); + return at.getTime() > after.getTime() ? at : undefined; + } + if (trigger.kind === "interval") { + const intervalMilliseconds = trigger.everyMinutes * 60_000; + const startsAt = trigger.startsAt ? new Date(trigger.startsAt) : after; + if (startsAt.getTime() > after.getTime()) return startsAt; + const elapsed = after.getTime() - startsAt.getTime(); + return new Date( + startsAt.getTime() + + (Math.floor(elapsed / intervalMilliseconds) + 1) * intervalMilliseconds + ); + } + + assertTimezone(timezone); + if (trigger.recurrence === "weekly" && trigger.weekday === undefined) { + throw new Error("Weekly automations require a weekday."); + } + + const [hour, minute] = trigger.localTime.split(":").map(Number); + const formatter = new Intl.DateTimeFormat("en-US", { + day: "2-digit", + hour: "2-digit", + hour12: false, + minute: "2-digit", + month: "2-digit", + timeZone: timezone, + weekday: "long", + year: "numeric", + }); + const afterParts = localDateParts(formatter, after); + const afterDate = localDateKey(afterParts); + let currentDateAlreadyRan = false; + for (let offset = 0; offset <= 26 * 60; offset += 1) { + const candidate = new Date(after.getTime() - offset * 60_000); + const parts = localDateParts(formatter, candidate); + if (localDateKey(parts) !== afterDate) continue; + if (Number(parts.hour) % 24 === hour && Number(parts.minute) === minute) { + currentDateAlreadyRan = true; + break; + } + } + const firstCandidate = Math.floor(after.getTime() / 60_000) * 60_000 + 60_000; + const maximumMinutes = 8 * 24 * 60; + + for (let offset = 0; offset < maximumMinutes; offset += 1) { + const candidate = new Date(firstCandidate + offset * 60_000); + const parts = localDateParts(formatter, candidate); + const candidateHour = Number(parts.hour) % 24; + if (candidateHour !== hour || Number(parts.minute) !== minute) continue; + if (currentDateAlreadyRan && localDateKey(parts) === afterDate) continue; + + const candidateWeekday = weekdayNumbers.get( + weekdaySchema.parse(parts.weekday) + ); + const targetWeekday = + trigger.weekday === undefined + ? undefined + : weekdayNumbers.get(trigger.weekday); + const allowed = + trigger.recurrence === "daily" || + (trigger.recurrence === "weekdays" && + candidateWeekday !== 0 && + candidateWeekday !== 6) || + (trigger.recurrence === "weekly" && candidateWeekday === targetWeekday); + if (allowed) return candidate; + } + + throw new Error(`Could not resolve the next run in ${timezone}.`); +} + +function localDateParts(formatter: Intl.DateTimeFormat, date: Date) { + return Object.fromEntries( + formatter + .formatToParts(date) + .filter((part) => part.type !== "literal") + .map((part) => [part.type, part.value.toLowerCase()]) + ); +} + +function localDateKey(parts: Record) { + const date = z + .object({ day: z.string(), month: z.string(), year: z.string() }) + .parse(parts); + return `${date.year}-${date.month}-${date.day}`; +} + +export function gmailTriggerMatches( + trigger: Extract, + message: { + readonly from: string; + readonly subject: string; + readonly threadId: string; + } +) { + if ( + trigger.fromAddress && + fromMailbox(message.from) !== trigger.fromAddress.toLowerCase() + ) { + return false; + } + if (trigger.threadId && message.threadId !== trigger.threadId) return false; + if ( + trigger.subjectContains && + !message.subject + .toLowerCase() + .includes(trigger.subjectContains.toLowerCase()) + ) { + return false; + } + return true; +} + +function fromMailbox(header: string) { + const bracketed = /<\s*([^<>]+?)\s*>/u.exec(header)?.[1]; + return (bracketed ?? header).trim().toLowerCase(); +} diff --git a/src/lib/tests/application-origin.test.ts b/src/lib/tests/application-origin.test.ts index 42151aa5..9d23d645 100644 --- a/src/lib/tests/application-origin.test.ts +++ b/src/lib/tests/application-origin.test.ts @@ -32,10 +32,13 @@ describe("application origin", () => { vi.stubEnv("VERCEL_PROJECT_PRODUCTION_URL", "openinstinct.example.com"); vi.stubEnv("VERCEL_URL", "openinstinct-preview-123.vercel.app"); - const { applicationOrigin, betterAuthBaseURL } = + const { applicationOrigin, betterAuthBaseURL, internalApplicationOrigin } = await import("@/lib/application-origin"); expect(applicationOrigin()).toBe("https://openinstinct.example.com"); + expect(internalApplicationOrigin()).toBe( + "https://openinstinct-preview-123.vercel.app" + ); expect(betterAuthBaseURL()).toEqual({ allowedHosts: [ "*.vercel.app", diff --git a/src/lib/tests/automation-auth.test.ts b/src/lib/tests/automation-auth.test.ts new file mode 100644 index 00000000..eef6ad56 --- /dev/null +++ b/src/lib/tests/automation-auth.test.ts @@ -0,0 +1,53 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { + createAutomationRequestHeaders, + verifyAutomationRequest, +} from "../automation-auth"; + +afterEach(() => { + vi.restoreAllMocks(); +}); + +describe("automation request authentication", () => { + it("accepts an intact purpose-bound signature and rejects tampering", async () => { + const headers = new Headers( + await createAutomationRequestHeaders({ + automationId: "automation-1", + purpose: "arm", + revision: 3, + }) + ); + await expect( + verifyAutomationRequest(headers, "arm") + ).resolves.toMatchObject({ + automationId: "automation-1", + purpose: "arm", + revision: 3, + }); + await expect( + verifyAutomationRequest(headers, "execute") + ).resolves.toBeUndefined(); + + headers.set("x-openinstinct-automation-revision", "4"); + await expect( + verifyAutomationRequest(headers, "arm") + ).resolves.toBeUndefined(); + }); + + it("expires captured signatures", async () => { + const timestamp = Date.now(); + const now = vi.spyOn(Date, "now").mockReturnValue(timestamp); + const headers = new Headers( + await createAutomationRequestHeaders({ + automationId: "automation-1", + purpose: "execute", + revision: 1, + runId: "run-1", + }) + ); + now.mockReturnValue(timestamp + 6 * 60 * 1000); + await expect( + verifyAutomationRequest(headers, "execute") + ).resolves.toBeUndefined(); + }); +}); diff --git a/src/lib/tests/automation.test.ts b/src/lib/tests/automation.test.ts new file mode 100644 index 00000000..1d140cf7 --- /dev/null +++ b/src/lib/tests/automation.test.ts @@ -0,0 +1,88 @@ +import { describe, expect, it } from "vitest"; +import { + automationTriggerSchema, + gmailTriggerMatches, + nextAutomationRunAt, +} from "../automation"; + +describe("automation scheduling", () => { + it("keeps recurring local time across daylight-saving changes", () => { + const next = nextAutomationRunAt( + { + kind: "recurring", + localTime: "03:30", + recurrence: "daily", + }, + "America/New_York", + new Date("2026-03-08T06:59:00.000Z") + ); + expect(next?.toISOString()).toBe("2026-03-08T07:30:00.000Z"); + expect( + nextAutomationRunAt( + { + kind: "recurring", + localTime: "01:30", + recurrence: "daily", + }, + "America/New_York", + new Date("2026-11-01T05:31:00.000Z") + )?.toISOString() + ).toBe("2026-11-02T06:30:00.000Z"); + }); + + it("resolves weekly and interval triggers after an exclusive cursor", () => { + expect( + nextAutomationRunAt( + { + kind: "recurring", + localTime: "09:00", + recurrence: "weekly", + weekday: "monday", + }, + "America/New_York", + new Date("2026-08-31T13:00:00.000Z") + )?.toISOString() + ).toBe("2026-09-07T13:00:00.000Z"); + expect( + nextAutomationRunAt( + { + everyMinutes: 15, + kind: "interval", + startsAt: "2026-08-31T12:00:00.000Z", + }, + "UTC", + new Date("2026-08-31T12:31:00.000Z") + )?.toISOString() + ).toBe("2026-08-31T12:45:00.000Z"); + }); + + it("rejects unfiltered Gmail triggers and matches normalized metadata", () => { + expect(automationTriggerSchema.safeParse({ kind: "gmail" }).success).toBe( + false + ); + expect( + gmailTriggerMatches( + { + fromAddress: "ava@example.com", + kind: "gmail", + subjectContains: "launch", + }, + { + from: "Ava Chen ", + subject: "Re: LAUNCH plan", + threadId: "thread-1", + } + ) + ).toBe(true); + expect( + gmailTriggerMatches( + { fromAddress: "ava@example.com", kind: "gmail" }, + { + from: '"ava@example.com" ', + subject: "launch", + threadId: "thread-1", + } + ) + ).toBe(false); + }); +}); diff --git a/src/lib/tests/env.test.ts b/src/lib/tests/env.test.ts index 19859834..198b1169 100644 --- a/src/lib/tests/env.test.ts +++ b/src/lib/tests/env.test.ts @@ -87,6 +87,39 @@ describe("environment", () => { expect(env.LINQ_PHONE_NUMBER).toBe("+12025550123"); }); + it("validates Gmail Pub/Sub push configuration", async () => { + vi.stubEnv( + "GMAIL_PUBSUB_AUDIENCE", + "https://example.com/api/automations/gmail" + ); + vi.stubEnv( + "GMAIL_PUBSUB_SERVICE_ACCOUNT", + "gmail-push@example.iam.gserviceaccount.com" + ); + vi.stubEnv( + "GMAIL_PUBSUB_TOPIC", + "projects/example/topics/openinstinct-gmail" + ); + + const { env } = await import("@/env"); + + expect(env.GMAIL_PUBSUB_TOPIC).toBe( + "projects/example/topics/openinstinct-gmail" + ); + }); + + it.each([ + ["GMAIL_PUBSUB_AUDIENCE", "not-a-url"], + ["GMAIL_PUBSUB_SERVICE_ACCOUNT", "not-an-email"], + ["GMAIL_PUBSUB_TOPIC", "openinstinct-gmail"], + ])("rejects malformed %s", async (name, value) => { + vi.stubEnv(name, value); + + await expect(import("@/env")).rejects.toThrow( + "Invalid environment variables" + ); + }); + it("does not provide local defaults in a Vercel development environment", async () => { vi.stubEnv("BETTER_AUTH_SECRET", ""); vi.stubEnv("BETTER_AUTH_URL", ""); diff --git a/src/proxy.ts b/src/proxy.ts index 5e104bf6..66743200 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -6,6 +6,11 @@ export async function proxy(request: NextRequest) { if ( pathname === "/sign-in" || pathname.startsWith("/api/auth/") || + pathname === "/api/automations/arm" || + pathname === "/api/automations/gmail" || + ((pathname === "/eve/v1/session" || + pathname.startsWith("/eve/v1/session/")) && + request.headers.get("x-openinstinct-automation-purpose") === "execute") || pathname === "/eve/v1/health" ) { return NextResponse.next(); @@ -22,5 +27,7 @@ export async function proxy(request: NextRequest) { } export const config = { - matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"], + matcher: [ + "/((?!_next/static|_next/image|favicon.ico|.well-known/workflow/).*)", + ], }; diff --git a/tests/agent-tool-boundaries.test.ts b/tests/agent-tool-boundaries.test.ts index b3dae9df..efecb53d 100644 --- a/tests/agent-tool-boundaries.test.ts +++ b/tests/agent-tool-boundaries.test.ts @@ -19,6 +19,8 @@ describe("root and worker capability boundaries", () => { "ask_question.ts", "google_workspace_read.ts", "google_workspace_write.ts", + "manage_automations.ts", + "mta_status.ts", "request_vault_import.ts", "request_vault_setup.ts", ]); diff --git a/tests/agent/tools/manage-automations.test.ts b/tests/agent/tools/manage-automations.test.ts new file mode 100644 index 00000000..042f5dba --- /dev/null +++ b/tests/agent/tools/manage-automations.test.ts @@ -0,0 +1,57 @@ +import type { ToolContext } from "eve/tools"; +import { describe, expect, it, vi } from "vitest"; +import manageAutomations from "@/agent/tools/manage_automations"; + +describe("automation management authorization", () => { + it("prevents an automation-authenticated task from mutating the control plane", async () => { + await expect( + manageAutomations.execute( + { + action: "create", + task: "Create another automation.", + timezone: "America/New_York", + title: "Recursive automation", + trigger: { at: "2030-01-01T09:00:00.000-05:00", kind: "at" }, + }, + automationContext() + ) + ).rejects.toThrow( + "Automation runs cannot change the automation control plane." + ); + }); +}); + +function automationContext() { + const getToken = vi.fn(); + const requireAuth = vi.fn(); + return { + abortSignal: new AbortController().signal, + callId: "call-1", + async getSandbox() { + throw new Error("Sandbox access is outside this focused test."); + }, + getSkill() { + throw new Error("Skill access is outside this focused test."); + }, + getToken, + requireAuth, + session: { + auth: { + current: { + attributes: { + automationId: "automation-1", + phoneNumber: "+12025550123", + workspaceId: "workspace-1", + }, + authenticator: "automation", + principalId: "user-1", + principalType: "user" as const, + }, + initiator: null, + }, + id: "automation-session-1", + turn: { id: "turn-1", sequence: 0 }, + }, + toolName: "manage_automations", + } satisfies ToolContext; +} diff --git a/tests/proxy.test.ts b/tests/proxy.test.ts new file mode 100644 index 00000000..dd0f9839 --- /dev/null +++ b/tests/proxy.test.ts @@ -0,0 +1,51 @@ +import { NextRequest } from "next/server"; +import { beforeEach, describe, expect, it, vi } from "vitest"; + +const getAuthSession = vi.fn<(headers: Headers) => Promise>(); + +vi.mock("@/auth/session", () => ({ getAuthSession })); + +describe("application proxy", () => { + beforeEach(() => { + getAuthSession.mockReset(); + getAuthSession.mockResolvedValue(undefined); + }); + + it("passes self-authenticating automation webhooks to their route handlers", async () => { + const { proxy } = await import("../src/proxy"); + const responses = await Promise.all( + ["/api/automations/arm", "/api/automations/gmail"].map( + async (pathname) => + await proxy(new NextRequest(new URL(pathname, "https://example.com"))) + ) + ); + for (const response of responses) { + expect(response.headers.get("x-middleware-next")).toBe("1"); + } + }); + + it("passes signed automation session requests but still protects ordinary sessions", async () => { + const { proxy } = await import("../src/proxy"); + const createPath = "/eve/v1/session"; + const path = "/eve/v1/session/session-1/stream"; + const createResponse = await proxy( + new NextRequest(new URL(createPath, "https://example.com"), { + headers: { "x-openinstinct-automation-purpose": "execute" }, + }) + ); + const automationResponse = await proxy( + new NextRequest(new URL(path, "https://example.com"), { + headers: { "x-openinstinct-automation-purpose": "execute" }, + }) + ); + const ordinaryResponse = await proxy( + new NextRequest(new URL(path, "https://example.com")) + ); + expect(createResponse.headers.get("x-middleware-next")).toBe("1"); + expect(automationResponse.headers.get("x-middleware-next")).toBe("1"); + expect(ordinaryResponse.status).toBe(307); + expect(ordinaryResponse.headers.get("location")).toBe( + "https://example.com/sign-in?callbackUrl=%2Feve%2Fv1%2Fsession%2Fsession-1%2Fstream" + ); + }); +}); diff --git a/tests/source-layout.test.ts b/tests/source-layout.test.ts index 096f3621..60f851c5 100644 --- a/tests/source-layout.test.ts +++ b/tests/source-layout.test.ts @@ -25,6 +25,8 @@ const disallowedLibDirectories = [ const expectedLibFiles = [ "access-scope.ts", "application-origin.ts", + "automation-auth.ts", + "automation.ts", "browser-artifact.ts", "chat.ts", "google-workspace.ts", diff --git a/tests/turbo-config.test.ts b/tests/turbo-config.test.ts index 4a758395..a19447d2 100644 --- a/tests/turbo-config.test.ts +++ b/tests/turbo-config.test.ts @@ -6,6 +6,7 @@ const applicationEnvironment = [ "BETTER_AUTH_*", "BLOB_*", "DATABASE_URL", + "GMAIL_PUBSUB_*", "*_CONNECTOR_UID", "KERNEL_*", "LINQ_*", diff --git a/turbo.json b/turbo.json index 129fb85f..aa800a96 100644 --- a/turbo.json +++ b/turbo.json @@ -8,6 +8,7 @@ "BLOB_*", "DATABASE_URL", "EVE_NEXT_*", + "GMAIL_PUBSUB_*", "*_CONNECTOR_UID", "KERNEL_*", "LINQ_*", @@ -23,6 +24,7 @@ "BETTER_AUTH_*", "BLOB_*", "DATABASE_URL", + "GMAIL_PUBSUB_*", "*_CONNECTOR_UID", "KERNEL_*", "LINQ_*", @@ -43,6 +45,7 @@ "BETTER_AUTH_*", "BLOB_*", "DATABASE_URL", + "GMAIL_PUBSUB_*", "*_CONNECTOR_UID", "KERNEL_*", "LINQ_*", @@ -70,6 +73,7 @@ "BETTER_AUTH_*", "BLOB_*", "DATABASE_URL", + "GMAIL_PUBSUB_*", "*_CONNECTOR_UID", "KERNEL_*", "LINQ_*", From 2041eac43723164b49ea725accc0b8fb0a07df5c Mon Sep 17 00:00:00 2001 From: Mason Hall Date: Mon, 31 Aug 2026 20:48:25 -0400 Subject: [PATCH 2/2] Remove MTA tool from automation PR --- agent/tools/mta_status.ts | 184 ---------------------------- db/tests/automations.test.ts | 6 +- tests/agent-tool-boundaries.test.ts | 1 - 3 files changed, 3 insertions(+), 188 deletions(-) delete mode 100644 agent/tools/mta_status.ts diff --git a/agent/tools/mta_status.ts b/agent/tools/mta_status.ts deleted file mode 100644 index a4e56ec4..00000000 --- a/agent/tools/mta_status.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { defineTool } from "eve/tools"; -import { z } from "zod"; - -const feeds = { - bus: "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/camsys%2Fbus-alerts.json", - subway: - "https://api-endpoint.mta.info/Dataservice/mtagtfsfeeds/camsys%2Fsubway-alerts.json", -} as const; - -const periodSchema = z.object({ - end: z.number().optional(), - start: z.number().optional(), -}); -const translatedTextSchema = z.object({ - translation: z - .object({ language: z.string().optional(), text: z.string().optional() }) - .array() - .optional(), -}); -const mtaFeedSchema = z.object({ - entity: z - .object({ - alert: z - .object({ - active_period: periodSchema.array().optional(), - description_text: translatedTextSchema.optional(), - header_text: translatedTextSchema.optional(), - informed_entity: z - .object({ route_id: z.string().optional() }) - .array() - .optional(), - "transit_realtime.mercury_alert": z - .object({ - alert_type: z.string().optional(), - human_readable_active_period: translatedTextSchema.optional(), - }) - .optional(), - }) - .optional(), - }) - .array() - .optional(), -}); - -type Period = z.infer; -type TranslatedText = z.infer; - -export default defineTool({ - description: - "Check current MTA subway and bus service alerts from the public MTA feed. Use this for live route status and before recommending a specific train or bus. It can also include future planned work.", - inputSchema: z.object({ - includePlanned: z.boolean().default(false), - limit: z.number().int().min(1).max(40).default(12), - mode: z.enum(["subway", "bus", "all"]).default("subway"), - routes: z.array(z.string()).optional(), - }), - async execute({ includePlanned, limit, mode, routes }, ctx) { - const wanted = routes - ?.map((route) => route.trim().toUpperCase()) - .filter(Boolean); - const selectedFeeds = - mode === "all" ? (["subway", "bus"] as const) : ([mode] as const); - const results = await Promise.all( - selectedFeeds.map(async (feed) => { - const response = await fetch(feeds[feed], { signal: ctx.abortSignal }); - if (!response.ok) { - throw new Error( - `MTA ${feed} alerts returned HTTP ${String(response.status)}.` - ); - } - return { data: mtaFeedSchema.parse(await response.json()), feed }; - }) - ); - - const nowSeconds = Math.floor(Date.now() / 1000); - const alerts = results.flatMap(({ data, feed }) => - (data.entity ?? []).flatMap((entity) => { - const alert = entity.alert; - if (!alert) return []; - const periods = alert.active_period ?? []; - const live = isLive(periods, nowSeconds); - if (!live && !(includePlanned && isUpcoming(periods, nowSeconds))) { - return []; - } - const alertRoutes = [ - ...new Set( - (alert.informed_entity ?? []).flatMap(({ route_id: routeId }) => - routeId ? [routeId] : [] - ) - ), - ]; - if ( - wanted?.length && - !alertRoutes.some((route) => wanted.includes(route.toUpperCase())) - ) { - return []; - } - const summary = plainText(alert.header_text); - if (!summary) return []; - const mercury = alert["transit_realtime.mercury_alert"]; - const alertType = mercury?.alert_type ?? "Service Change"; - const window = relevantPeriod(periods, nowSeconds); - return [ - { - activePeriod: - plainText(mercury?.human_readable_active_period) ?? null, - alertType, - details: plainText(alert.description_text) ?? null, - inEffectNow: live, - mode: feed, - plannedWork: alertType.startsWith("Planned"), - routes: alertRoutes, - summary, - windowEnd: window?.end - ? new Date(window.end * 1000).toISOString() - : null, - windowStart: window?.start - ? new Date(window.start * 1000).toISOString() - : null, - }, - ]; - }) - ); - - alerts.sort((left, right) => { - if (left.inEffectNow !== right.inEffectNow) { - return Number(right.inEffectNow) - Number(left.inEffectNow); - } - const leftStart = left.windowStart ?? ""; - const rightStart = right.windowStart ?? ""; - return left.inEffectNow - ? rightStart.localeCompare(leftStart) - : leftStart.localeCompare(rightStart); - }); - return { - alerts: alerts.slice(0, limit), - checkedAt: new Date().toISOString(), - mode, - routesRequested: wanted ?? null, - totalMatching: alerts.length, - upcomingWorkIncluded: includePlanned, - }; - }, -}); - -function isLive(periods: Period[], now: number) { - return ( - periods.length === 0 || - periods.some( - (period) => - (period.start ?? 0) <= now && - (period.end === undefined || period.end >= now) - ) - ); -} - -function isUpcoming(periods: Period[], now: number) { - return periods.some((period) => (period.start ?? 0) > now); -} - -function relevantPeriod(periods: Period[], now: number) { - return ( - periods.find( - (period) => - (period.start ?? 0) <= now && - (period.end === undefined || period.end >= now) - ) ?? - periods - .filter((period) => (period.start ?? 0) > now) - .toSorted((left, right) => (left.start ?? 0) - (right.start ?? 0))[0] - ); -} - -function plainText(field?: TranslatedText) { - const text = - field?.translation?.find( - (translation) => - translation.language === "en" && !translation.text?.includes("<") - )?.text ?? field?.translation?.[0]?.text; - return text - ?.replace(/<[^>]+>/gu, " ") - .replace(/\s+/gu, " ") - .trim(); -} diff --git a/db/tests/automations.test.ts b/db/tests/automations.test.ts index 6e1754c5..50bfabb0 100644 --- a/db/tests/automations.test.ts +++ b/db/tests/automations.test.ts @@ -41,9 +41,9 @@ describe("automation service", () => { idempotencyKey: "session-alice:call-1", phoneNumber: "+12125550123", sessionId: "session-alice", - task: "Check the L train and summarize it.", + task: "Summarize unread inbox messages.", timezone: "America/New_York", - title: "L train status", + title: "Unread inbox summary", trigger: { at: runAt, kind: "at" } as const, }; const created = await automations.createAutomation(alice, input); @@ -66,7 +66,7 @@ describe("automation service", () => { ).resolves.toBeUndefined(); await new Promise((resolve) => setTimeout(resolve, 60)); const completed = await automations.finishAutomationRun({ - result: "No L train delays.", + result: "Three unread inbox messages.", runId: firstRun?.runId ?? "missing", }); expect(completed.status).toBe("completed"); diff --git a/tests/agent-tool-boundaries.test.ts b/tests/agent-tool-boundaries.test.ts index efecb53d..aa6a40cd 100644 --- a/tests/agent-tool-boundaries.test.ts +++ b/tests/agent-tool-boundaries.test.ts @@ -20,7 +20,6 @@ describe("root and worker capability boundaries", () => { "google_workspace_read.ts", "google_workspace_write.ts", "manage_automations.ts", - "mta_status.ts", "request_vault_import.ts", "request_vault_setup.ts", ]);