From 3304e0b8bce0c09b8e6073346497299d1fb34b88 Mon Sep 17 00:00:00 2001 From: e2e Date: Fri, 10 Jul 2026 20:36:29 +0200 Subject: [PATCH] chore: starter template --- .gitignore | 22 + .yarnrc.yml | 4 + AGENTS.md | 28 + apps/app/messages/en.json | 42 + apps/app/messages/fr.json | 36 + apps/app/package.json | 42 + apps/app/project.inlang/settings.json | 9 + apps/app/src/components/AppShell.tsx | 90 + apps/app/src/components/AuthCard.tsx | 227 +++ apps/app/src/components/DefaultErrorPage.tsx | 97 + apps/app/src/components/LanguageSelector.tsx | 32 + apps/app/src/components/ThemeSelector.tsx | 27 + apps/app/src/components/Wordmark.tsx | 39 + apps/app/src/contexts/preferences.tsx | 19 + apps/app/src/hooks/useAuthGate.ts | 46 + apps/app/src/i18n/config.ts | 87 + apps/app/src/i18n/messages.ts | 33 + apps/app/src/lib/auth.ts | 133 ++ apps/app/src/lib/env.ts | 18 + apps/app/src/pages/HomePage.tsx | 22 + apps/app/src/pages/LoginPage.tsx | 78 + apps/app/src/pages/SignupPage.tsx | 56 + apps/app/src/router.tsx | 22 + apps/app/src/routes/__root.tsx | 178 ++ apps/app/src/routes/app.index.tsx | 6 + apps/app/src/routes/app.tsx | 12 + apps/app/src/routes/index.tsx | 11 + apps/app/src/routes/login.tsx | 12 + apps/app/src/routes/signup.tsx | 12 + apps/app/tsconfig.json | 23 + apps/app/vite.config.ts | 59 + apps/app/wrangler.jsonc | 9 + bun.lock | 1699 +++++++++++++++++ db/annotations.ts | 21 + db/sqlite-seed.sql | 3 + db/sqlite-test-seed.sql | 6 + db/sqlite/0001-init.sql | 67 + db/sqlite/0002-audit.sql | 26 + db/sqlite/0003-user-actor.sql | 11 + db/sqlite/0004-admin.sql | 16 + db/sqlite/0005-fabric.sql | 13 + e2e/README.md | 34 + e2e/package.json | 21 + e2e/tests/cucumber.mjs | 6 + e2e/tests/features/auth.feature | 8 + e2e/tests/features/pages.feature | 10 + e2e/tests/support/register.ts | 28 + e2e/tests/support/world.ts | 15 + e2e/tsconfig.json | 14 + emails/locales/en.json | 14 + emails/partials/footer.html | 3 + emails/partials/layout.html | 13 + emails/templates/confirm-email.html | 27 + emails/templates/confirm-email.subject.txt | 1 + emails/templates/confirm-email.text.txt | 7 + emails/theme.json | 16 + knowledge/design-language.md | 23 + knowledge/index.md | 51 + knowledge/security.md | 11 + knowledge/technology.md | 11 + package.json | 45 + packages/components/index.ts | 24 + packages/components/package.json | 31 + packages/components/src/BarChart.tsx | 57 + packages/components/src/DataTable.tsx | 85 + .../components/src/EmptyState.stories.tsx | 58 + packages/components/src/EmptyState.tsx | 77 + .../components/src/NotFoundState.stories.tsx | 25 + packages/components/src/NotFoundState.tsx | 40 + .../components/src/PageHeader.stories.tsx | 32 + packages/components/src/PageHeader.tsx | 32 + .../components/src/PageLoader.stories.tsx | 11 + packages/components/src/PageLoader.tsx | 16 + packages/components/src/Panel.tsx | 48 + .../src/ServerErrorState.stories.tsx | 47 + packages/components/src/ServerErrorState.tsx | 70 + packages/components/src/StatCard.tsx | 37 + packages/components/src/StatGrid.tsx | 21 + packages/components/src/UserCard.tsx | 83 + packages/components/src/csf.types.ts | 21 + .../components/src/fixtures/stubMutation.ts | 69 + packages/components/src/fixtures/stubQuery.ts | 66 + packages/components/tsconfig.json | 14 + packages/functions-sdk/package.json | 19 + .../.pikku/agent/pikku-agent-map.gen.d.ts | 4 + packages/functions/.pikku/auth/auth.types.ts | 26 + .../channel/pikku-channels-map.gen.d.ts | 89 + .../.pikku/db/classification-map.gen.d.ts | 141 ++ .../http/pikku-http-wirings-map.gen.d.ts | 148 ++ .../.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts | 168 ++ .../pikku-rpc-wirings-map.internal.gen.d.ts | 185 ++ .../AgentApproveCallerInput.schema.json | 1 + .../schemas/AgentCallerInput.schema.json | 1 + .../AgentResumeCallerInput.schema.json | 1 + .../AgentStreamCallerInput.schema.json | 1 + .../schemas/AuthHandlerOutput.schema.json | 1 + .../DeleteAgentThreadInput.schema.json | 1 + .../DeleteAgentThreadOutput.schema.json | 1 + .../FunctionCoverageReport.schema.json | 1 + .../GetAgentThreadMessagesInput.schema.json | 1 + .../GetAgentThreadMessagesOutput.schema.json | 1 + .../GetAgentThreadRunsInput.schema.json | 1 + .../GetAgentThreadRunsOutput.schema.json | 1 + .../schemas/GetAgentThreadsInput.schema.json | 1 + .../schemas/GetAgentThreadsOutput.schema.json | 1 + .../schemas/GetSessionInput.schema.json | 1 + .../schemas/GetSessionOutput.schema.json | 1 + .../schemas/GraphStarterInput.schema.json | 1 + .../schemas/GraphStarterOutput.schema.json | 1 + .../PikkuConsoleGetSecretInput.schema.json | 1 + .../PikkuConsoleGetSecretOutput.schema.json | 1 + .../PikkuConsoleGetVariableInput.schema.json | 1 + .../PikkuConsoleGetVariableOutput.schema.json | 1 + .../PikkuConsoleHasSecretInput.schema.json | 1 + .../PikkuConsoleHasSecretOutput.schema.json | 1 + .../PikkuConsoleSetSecretInput.schema.json | 1 + .../PikkuConsoleSetSecretOutput.schema.json | 1 + .../PikkuConsoleSetVariableInput.schema.json | 1 + .../PikkuConsoleSetVariableOutput.schema.json | 1 + ...PikkuScenarioGetStubCallsInput.schema.json | 1 + ...ikkuScenarioGetStubCallsOutput.schema.json | 1 + ...cenarioResetLiveCoverageOutput.schema.json | 1 + .../PikkuScenarioResetStubsOutput.schema.json | 1 + .../RealtimeEventStreamInput.schema.json | 1 + .../RealtimeSubscribeInput.schema.json | 1 + .../RealtimeUnsubscribeInput.schema.json | 1 + .../schemas/RpcCallerInput.schema.json | 1 + .../SecretSchema_betterAuthSecret.schema.json | 1 + .../SessionHealthScenarioOutput.schema.json | 1 + .../StreamWorkflowRunInput.schema.json | 1 + .../schemas/WorkflowRunStatus.schema.json | 1 + .../schemas/WorkflowRunnerInput.schema.json | 1 + .../schemas/WorkflowStarterInput.schema.json | 1 + .../schemas/WorkflowStarterOutput.schema.json | 1 + .../WorkflowStatusCheckerInput.schema.json | 1 + .../WorkflowStatusStreamFullInput.schema.json | 1 + .../WorkflowStatusStreamInput.schema.json | 1 + .../workflow/pikku-workflow-map.gen.d.ts | 97 + packages/functions/package.json | 34 + packages/functions/src/application-types.d.ts | 39 + packages/functions/src/auth.ts | 72 + packages/functions/src/config.ts | 6 + .../src/functions/get-session.function.ts | 32 + .../src/functions/session-health.scenario.ts | 33 + packages/functions/src/lib/email-service.ts | 52 + .../src/middleware/cors.middleware.ts | 18 + packages/functions/src/services.ts | 98 + packages/mantine-theme/active.json | 3 + packages/mantine-theme/index.ts | 215 +++ packages/mantine-theme/package.json | 25 + packages/mantine-theme/themes/default.json | 25 + packages/mantine-theme/themes/index.ts | 8 + packages/mantine-theme/tsconfig.json | 15 + pikku.config.json | 62 + pikkufabric.config.json | 16 + tests/reports/cucumber-report.html | 50 + tsconfig.json | 21 + 157 files changed, 6462 insertions(+) create mode 100644 .gitignore create mode 100644 .yarnrc.yml create mode 100644 AGENTS.md create mode 100644 apps/app/messages/en.json create mode 100644 apps/app/messages/fr.json create mode 100644 apps/app/package.json create mode 100644 apps/app/project.inlang/settings.json create mode 100644 apps/app/src/components/AppShell.tsx create mode 100644 apps/app/src/components/AuthCard.tsx create mode 100644 apps/app/src/components/DefaultErrorPage.tsx create mode 100644 apps/app/src/components/LanguageSelector.tsx create mode 100644 apps/app/src/components/ThemeSelector.tsx create mode 100644 apps/app/src/components/Wordmark.tsx create mode 100644 apps/app/src/contexts/preferences.tsx create mode 100644 apps/app/src/hooks/useAuthGate.ts create mode 100644 apps/app/src/i18n/config.ts create mode 100644 apps/app/src/i18n/messages.ts create mode 100644 apps/app/src/lib/auth.ts create mode 100644 apps/app/src/lib/env.ts create mode 100644 apps/app/src/pages/HomePage.tsx create mode 100644 apps/app/src/pages/LoginPage.tsx create mode 100644 apps/app/src/pages/SignupPage.tsx create mode 100644 apps/app/src/router.tsx create mode 100644 apps/app/src/routes/__root.tsx create mode 100644 apps/app/src/routes/app.index.tsx create mode 100644 apps/app/src/routes/app.tsx create mode 100644 apps/app/src/routes/index.tsx create mode 100644 apps/app/src/routes/login.tsx create mode 100644 apps/app/src/routes/signup.tsx create mode 100644 apps/app/tsconfig.json create mode 100644 apps/app/vite.config.ts create mode 100644 apps/app/wrangler.jsonc create mode 100644 bun.lock create mode 100644 db/annotations.ts create mode 100644 db/sqlite-seed.sql create mode 100644 db/sqlite-test-seed.sql create mode 100644 db/sqlite/0001-init.sql create mode 100644 db/sqlite/0002-audit.sql create mode 100644 db/sqlite/0003-user-actor.sql create mode 100644 db/sqlite/0004-admin.sql create mode 100644 db/sqlite/0005-fabric.sql create mode 100644 e2e/README.md create mode 100644 e2e/package.json create mode 100644 e2e/tests/cucumber.mjs create mode 100644 e2e/tests/features/auth.feature create mode 100644 e2e/tests/features/pages.feature create mode 100644 e2e/tests/support/register.ts create mode 100644 e2e/tests/support/world.ts create mode 100644 e2e/tsconfig.json create mode 100644 emails/locales/en.json create mode 100644 emails/partials/footer.html create mode 100644 emails/partials/layout.html create mode 100644 emails/templates/confirm-email.html create mode 100644 emails/templates/confirm-email.subject.txt create mode 100644 emails/templates/confirm-email.text.txt create mode 100644 emails/theme.json create mode 100644 knowledge/design-language.md create mode 100644 knowledge/index.md create mode 100644 knowledge/security.md create mode 100644 knowledge/technology.md create mode 100644 package.json create mode 100644 packages/components/index.ts create mode 100644 packages/components/package.json create mode 100644 packages/components/src/BarChart.tsx create mode 100644 packages/components/src/DataTable.tsx create mode 100644 packages/components/src/EmptyState.stories.tsx create mode 100644 packages/components/src/EmptyState.tsx create mode 100644 packages/components/src/NotFoundState.stories.tsx create mode 100644 packages/components/src/NotFoundState.tsx create mode 100644 packages/components/src/PageHeader.stories.tsx create mode 100644 packages/components/src/PageHeader.tsx create mode 100644 packages/components/src/PageLoader.stories.tsx create mode 100644 packages/components/src/PageLoader.tsx create mode 100644 packages/components/src/Panel.tsx create mode 100644 packages/components/src/ServerErrorState.stories.tsx create mode 100644 packages/components/src/ServerErrorState.tsx create mode 100644 packages/components/src/StatCard.tsx create mode 100644 packages/components/src/StatGrid.tsx create mode 100644 packages/components/src/UserCard.tsx create mode 100644 packages/components/src/csf.types.ts create mode 100644 packages/components/src/fixtures/stubMutation.ts create mode 100644 packages/components/src/fixtures/stubQuery.ts create mode 100644 packages/components/tsconfig.json create mode 100644 packages/functions-sdk/package.json create mode 100644 packages/functions/.pikku/agent/pikku-agent-map.gen.d.ts create mode 100644 packages/functions/.pikku/auth/auth.types.ts create mode 100644 packages/functions/.pikku/channel/pikku-channels-map.gen.d.ts create mode 100644 packages/functions/.pikku/db/classification-map.gen.d.ts create mode 100644 packages/functions/.pikku/http/pikku-http-wirings-map.gen.d.ts create mode 100644 packages/functions/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts create mode 100644 packages/functions/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts create mode 100644 packages/functions/.pikku/schemas/schemas/AgentApproveCallerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/AgentCallerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/AgentResumeCallerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/AgentStreamCallerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/AuthHandlerOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/DeleteAgentThreadInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/DeleteAgentThreadOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/FunctionCoverageReport.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetAgentThreadsInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetAgentThreadsOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetSessionInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GetSessionOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GraphStarterInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/GraphStarterOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuScenarioResetLiveCoverageOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/PikkuScenarioResetStubsOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/RealtimeEventStreamInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/RealtimeSubscribeInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/RealtimeUnsubscribeInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/RpcCallerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/SecretSchema_betterAuthSecret.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/SessionHealthScenarioOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/StreamWorkflowRunInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowRunStatus.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowRunnerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowStarterInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowStarterOutput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowStatusCheckerInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamFullInput.schema.json create mode 100644 packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamInput.schema.json create mode 100644 packages/functions/.pikku/workflow/pikku-workflow-map.gen.d.ts create mode 100644 packages/functions/package.json create mode 100644 packages/functions/src/application-types.d.ts create mode 100644 packages/functions/src/auth.ts create mode 100644 packages/functions/src/config.ts create mode 100644 packages/functions/src/functions/get-session.function.ts create mode 100644 packages/functions/src/functions/session-health.scenario.ts create mode 100644 packages/functions/src/lib/email-service.ts create mode 100644 packages/functions/src/middleware/cors.middleware.ts create mode 100644 packages/functions/src/services.ts create mode 100644 packages/mantine-theme/active.json create mode 100644 packages/mantine-theme/index.ts create mode 100644 packages/mantine-theme/package.json create mode 100644 packages/mantine-theme/themes/default.json create mode 100644 packages/mantine-theme/themes/index.ts create mode 100644 packages/mantine-theme/tsconfig.json create mode 100644 pikku.config.json create mode 100644 pikkufabric.config.json create mode 100644 tests/reports/cucumber-report.html create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2afa24a --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +node_modules +dist +.vite +.wrangler + +# All *.gen.* files are regenerated by `pikku all` — never commit them. +*.gen.ts +*.gen.js +*.gen.json +*.gen.mjs + +# Yarn — commit the root lockfile; ignore PnP/cache and generated per-unit lockfiles +.yarn/ +.pnp.* +yarn.lock +!/yarn.lock + +# Injected/symlinked at sandbox runtime — never commit +vendor/ +.opencode +.pikku-runtime +__fabric_scaffold.vite.config.mjs diff --git a/.yarnrc.yml b/.yarnrc.yml new file mode 100644 index 0000000..2d9f6b2 --- /dev/null +++ b/.yarnrc.yml @@ -0,0 +1,4 @@ +# Force node_modules linker — some toolchain deps (uWebSockets.js native +# addon, pikku CLI bin, esbuild native) resolve cleanly only with a +# traditional tree. +nodeLinker: node-modules diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f0c8e50 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,28 @@ +# Building in this project + +This app ships a **component kit** at `@project/components` (source in +`packages/components/src`). **Compose these instead of hand-rolling UI** — it is faster, +consistent, and already themed. Import from `@project/components`. + +## Available components + +Layout: +- `PageHeader` — page title + optional description + right-aligned `actions` slot. Use one per page. +- `Panel` — bordered section with an optional titled header (`title`, `description`, `actions`). The workhorse container. +- `StatCard` — a single metric tile (`label`, `value`, optional `icon`, `color`). +- `StatGrid` — responsive row of `StatCard`s; pass `stats={[{label, value, icon}]}`. + +Data (feed these the output of an RPC you implement): +- `DataTable` — generic typed table. Props: `columns` (`{key, header, render?, align?}`), `rows`, `rowKey`, optional `loading`/`empty`/`onRowClick`. Implement a `listX` RPC and pass its rows. +- `BarChart` — dependency-free horizontal bars from `data={[{label, value, color?}]}`. Good for status/count breakdowns from a stats RPC. + +State (already used by the app): +- `EmptyState`, `PageLoader`, `NotFoundState`, `ServerErrorState`, `UserCard`. + +## How to build a feature page + +1. Implement the backend RPCs (`pikku-rpc` / `pikku-kysely` skills): a `listX` and any mutations, with zod input/output and `auth: true`. Scope rows to the signed-in user (`where('userId','=',session.userId)`). +2. Fetch with `usePikkuQuery('listX', {})` and mutate with `usePikkuMutation('createX')` (from `@project/functions-sdk/pikku/api.gen`). +3. Build the page by composing the kit: `PageHeader` + `Panel` + `DataTable`/`StatGrid`/`BarChart`. Pass i18n strings (`m.key()`) into the component props. + +These are props-only components — they never fetch data themselves. You own the page that wires RPC data into them. diff --git a/apps/app/messages/en.json b/apps/app/messages/en.json new file mode 100644 index 0000000..de67a0d --- /dev/null +++ b/apps/app/messages/en.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "error__title": "This page isn't running properly", + "error__hint": "If an agent is building this app, just wait — it's likely mid-change and will fix this shortly, and the page will refresh on its own.", + "error__retry": "Try again", + "error__details": "Error details", + "common__loading": "Loading…", + "common__email": "Email", + "common__email_placeholder": "you@example.com", + "common__password": "Password", + "common__password_placeholder": "••••••••", + "common__name": "Name", + "common__name_placeholder": "Ada Lovelace", + "validation__required": "Required.", + "validation__email_invalid": "Enter a valid email address.", + "app__name": "Fabric Starter", + "auth__or": "or", + "auth__continue_with_google": "Continue with Google", + "auth__google_error": "Unable to continue with Google right now.", + "auth__login__title": "Sign in", + "auth__login__description": "Welcome back to {name}.", + "auth__login__cta": "Sign in", + "auth__login__invalid_credentials": "That email and password don't match.", + "auth__login__error": "Unable to sign in right now.", + "auth__login__footer_prompt": "Don't have an account?", + "auth__login__footer_action": "Sign up", + "auth__dev_quick_login": "Quick login (dev)", + "auth__dev_quick_login_hint": "Development only — signs in as test@example.com", + "auth__signup__title": "Create your account", + "auth__signup__description": "Get started with {name}.", + "auth__signup__cta": "Create account", + "auth__signup__email_in_use": "An account with this email already exists.", + "auth__signup__error": "Unable to create your account right now.", + "auth__signup__footer_prompt": "Already have an account?", + "auth__signup__footer_action": "Sign in", + "nav__home": "Home", + "app_shell__sign_out": "Sign out", + "home__title": "Hello, world.", + "home__body": "You're signed in to {name}. This is the bare-bones starter every project begins from — describe what you want to build and it gets reshaped from here.", + "preferences__language": "Language", + "preferences__theme": "Theme" +} diff --git a/apps/app/messages/fr.json b/apps/app/messages/fr.json new file mode 100644 index 0000000..816bb01 --- /dev/null +++ b/apps/app/messages/fr.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + "common__loading": "Chargement…", + "common__email": "Email", + "common__email_placeholder": "vous@exemple.com", + "common__password": "Mot de passe", + "common__password_placeholder": "••••••••", + "common__name": "Nom", + "common__name_placeholder": "Ada Lovelace", + "validation__required": "Requis.", + "validation__email_invalid": "Saisissez une adresse email valide.", + "app__name": "Fabric Starter", + "auth__or": "ou", + "auth__continue_with_google": "Continuer avec Google", + "auth__google_error": "Impossible de continuer avec Google pour l'instant.", + "auth__login__title": "Se connecter", + "auth__login__description": "Bon retour sur {name}.", + "auth__login__cta": "Se connecter", + "auth__login__invalid_credentials": "Cet email et ce mot de passe ne correspondent pas.", + "auth__login__error": "Impossible de se connecter pour l'instant.", + "auth__login__footer_prompt": "Pas encore de compte ?", + "auth__login__footer_action": "S'inscrire", + "auth__signup__title": "Créez votre compte", + "auth__signup__description": "Commencez avec {name}.", + "auth__signup__cta": "Créer un compte", + "auth__signup__email_in_use": "Un compte avec cet email existe déjà.", + "auth__signup__error": "Impossible de créer votre compte pour l'instant.", + "auth__signup__footer_prompt": "Vous avez déjà un compte ?", + "auth__signup__footer_action": "Se connecter", + "nav__home": "Accueil", + "app_shell__sign_out": "Se déconnecter", + "home__title": "Bonjour, monde.", + "home__body": "Vous êtes connecté à {name}. C'est le point de départ minimal de chaque projet — décrivez ce que vous voulez construire et tout se reconstruit à partir d'ici.", + "preferences__language": "Langue", + "preferences__theme": "Thème" +} diff --git a/apps/app/package.json b/apps/app/package.json new file mode 100644 index 0000000..ec59e2e --- /dev/null +++ b/apps/app/package.json @@ -0,0 +1,42 @@ +{ + "name": "@project/app", + "version": "0.0.1", + "private": true, + "type": "module", + "scripts": { + "dev": "vite dev --port 7104", + "build": "vite build", + "preview": "vite preview --port 7104", + "tsc": "tsc --noEmit --incremental --tsBuildInfoFile node_modules/.cache/app-tsc.tsbuildinfo" + }, + "dependencies": { + "@assistant-ui/react": "^0.14.24", + "@mantine/core": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@pikku/assistant-ui": "^0.12.7", + "@pikku/mantine": "^0.12.6", + "@pikku/react": "^0.12.5", + "@project/components": "workspace:*", + "@project/functions-sdk": "workspace:*", + "@project/mantine-themes": "workspace:*", + "@tanstack/react-form": "^1.0.0", + "@tanstack/react-query": "^5.66.0", + "@tanstack/react-router": "^1.132.0", + "@tanstack/react-start": "^1.132.0", + "better-auth": "^1.6.18", + "lucide-react": "^0.456.0", + "react": "^19.2.5", + "react-dom": "^19.2.5" + }, + "devDependencies": { + "@babel/core": "^7.26.0", + "@inlang/paraglide-js": "^2.20.0", + "@tanstack/router-generator": "^1.132.0", + "@types/node": "^22", + "@types/react": "^19", + "@types/react-dom": "^19", + "@vitejs/plugin-react": "^4.5.2", + "typescript": "^5.9", + "vite": "^7.0.0" + } +} diff --git a/apps/app/project.inlang/settings.json b/apps/app/project.inlang/settings.json new file mode 100644 index 0000000..9b2e297 --- /dev/null +++ b/apps/app/project.inlang/settings.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://inlang.com/schema/project-settings", + "baseLocale": "en", + "locales": ["en", "fr"], + "modules": ["https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js"], + "plugin.inlang.messageFormat": { + "pathPattern": "./messages/{locale}.json" + } +} diff --git a/apps/app/src/components/AppShell.tsx b/apps/app/src/components/AppShell.tsx new file mode 100644 index 0000000..7a40641 --- /dev/null +++ b/apps/app/src/components/AppShell.tsx @@ -0,0 +1,90 @@ +import { AppShell as MantineAppShell, Box, Button, NavLink, Stack } from '@pikku/mantine/core' +import { Link, Outlet, useRouterState } from '@tanstack/react-router' +import { useState, type FC } from 'react' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' +import { signOut } from '@/lib/auth' +import { Wordmark } from './Wordmark' +import { LanguageSelector } from './LanguageSelector' +import { ThemeSelector } from './ThemeSelector' + +const HomeGlyph = () => +const SignOutGlyph = () => ( + +) + +function NavGlyph({ d }: { d: string }) { + return ( + + + + ) +} + +export const AppShell: FC = () => { + useLocale() + const pathname = useRouterState({ select: (s) => s.location.pathname }) + const [isSigningOut, setIsSigningOut] = useState(false) + + return ( + + + + + + + + + } + active={pathname === '/app'} + /> + + + + + + + + + + + {/* Flex column so a full-height page (e.g. a chat) can fill the remaining + viewport with just `flex: 1, minHeight: 0` — no viewport math needed. + Content-sized pages are unaffected. */} + + + + + ) +} diff --git a/apps/app/src/components/AuthCard.tsx b/apps/app/src/components/AuthCard.tsx new file mode 100644 index 0000000..c01bc2b --- /dev/null +++ b/apps/app/src/components/AuthCard.tsx @@ -0,0 +1,227 @@ +import type { FC } from 'react' +import type { I18nNode, I18nString } from '@pikku/react' +import { useForm } from '@tanstack/react-form' +import { + Box, + Button, + Card, + Divider, + Group, + PasswordInput, + Stack, + Text, + TextInput, + Title, +} from '@pikku/mantine/core' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' +import { Wordmark } from './Wordmark' + +export type AuthFormValues = { name: string; email: string; password: string } + +type AuthCardProps = { + appName: I18nString + title: I18nString + description: I18nString + cta: I18nString + // Show the Name field (signup) above email. + includeName?: boolean + passwordAutoComplete: 'current-password' | 'new-password' + // Server-side error from the page's mutation (bad credentials, email in use…). + error: I18nString | null + googleBusy: boolean + // Submitting state of the page's mutation; drives the primary button spinner. + busy: boolean + footer: I18nNode + // Called with validated values once the TanStack form passes validation. + onAuthSubmit: (values: AuthFormValues) => void + onGoogle: () => void + // Dev-only: prefill the form (e.g. the test account) when provided. + initialValues?: Partial + // Dev-only: a one-click quick-login action rendered below the form. + quickLogin?: { label: I18nString; hint: I18nString; onClick: () => void; busy: boolean } | null +} + +const ArrowGlyph = () => ( + + + + +) + +const GoogleGlyph = () => ( + + + + + + +) + +const required = (value: string): I18nString | undefined => + value.trim() ? undefined : m.validation__required() + +const validEmail = (value: string): I18nString | undefined => { + if (!value.trim()) return m.validation__required() + return /^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(value) ? undefined : m.validation__email_invalid() +} + +export const AuthCard: FC = (props) => { + useLocale() + + const form = useForm({ + defaultValues: { name: '', email: '', password: '', ...props.initialValues } as AuthFormValues, + onSubmit: ({ value }) => props.onAuthSubmit(value), + }) + + return ( + + + + + + + + +
+ + {props.title} + + + {props.description} + +
+ +
{ + event.preventDefault() + event.stopPropagation() + void form.handleSubmit() + }} + > + + {props.includeName ? ( + required(value) }}> + {(field) => ( + field.handleChange(event.currentTarget.value)} + onBlur={field.handleBlur} + error={field.state.meta.errors[0] as I18nString | undefined} + autoComplete="name" + /> + )} + + ) : null} + + validEmail(value) }} + > + {(field) => ( + field.handleChange(event.currentTarget.value)} + onBlur={field.handleBlur} + error={field.state.meta.errors[0] as I18nString | undefined} + type="email" + autoComplete="email" + /> + )} + + + required(value) }} + > + {(field) => ( + field.handleChange(event.currentTarget.value)} + onBlur={field.handleBlur} + error={field.state.meta.errors[0] as I18nString | undefined} + autoComplete={props.passwordAutoComplete} + /> + )} + + + {props.error ? ( + + {props.error} + + ) : null} + + + +
+ + {props.quickLogin ? ( + + + + {props.quickLogin.hint} + + + ) : null} + + + + +
+
+ + + {props.footer} + +
+
+ ) +} diff --git a/apps/app/src/components/DefaultErrorPage.tsx b/apps/app/src/components/DefaultErrorPage.tsx new file mode 100644 index 0000000..7064e87 --- /dev/null +++ b/apps/app/src/components/DefaultErrorPage.tsx @@ -0,0 +1,97 @@ +import { useState } from 'react' +import { Box, Button, Group, Stack, Text, Title } from '@pikku/mantine/core' +import { AlertTriangle, ChevronRight } from 'lucide-react' +import { asI18n } from '@pikku/react' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' + +// Router-level error boundary (wired as the router's defaultErrorComponent). In +// dev it reveals the raw error in an expandable section — agents watch for this +// while iterating — while production stays a calm, generic message. +export function DefaultErrorPage({ error }: { error: unknown }) { + useLocale() + const [open, setOpen] = useState(false) + const detail = error instanceof Error ? (error.stack ?? error.message) : String(error) + + return ( + + + + + + + {m.error__title()} + + + {m.error__hint()} + + + + + {import.meta.env.DEV && detail ? ( + + + {open ? ( + + {asI18n(detail)} + + ) : null} + + ) : null} + + + ) +} diff --git a/apps/app/src/components/LanguageSelector.tsx b/apps/app/src/components/LanguageSelector.tsx new file mode 100644 index 0000000..b998e3a --- /dev/null +++ b/apps/app/src/components/LanguageSelector.tsx @@ -0,0 +1,32 @@ +import { Select } from '@pikku/mantine/core' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' +import { supportedLocales } from '@/i18n/config' +import { usePreferences } from '@/contexts/preferences' + +const LOCALE_LABELS: Record = { + en: 'English', + fr: 'Français', +} + +export function LanguageSelector() { + useLocale() + const { locale, setLocale } = usePreferences() + + const data = supportedLocales.map((code) => ({ + value: code, + label: LOCALE_LABELS[code] ?? code.toUpperCase(), + })) + + return ( + ({ value: t.id, label: t.name }))} + value={themeId} + onChange={(v) => v && setThemeId(v)} + size="xs" + w={110} + allowDeselect={false} + /> + ) +} diff --git a/apps/app/src/components/Wordmark.tsx b/apps/app/src/components/Wordmark.tsx new file mode 100644 index 0000000..65fe922 --- /dev/null +++ b/apps/app/src/components/Wordmark.tsx @@ -0,0 +1,39 @@ +import type { FC } from 'react' +import { Box, Group, Text } from '@pikku/mantine/core' +import type { I18nString } from '@pikku/react' + +// Placeholder brand mark + app name. A gradient tile (brand primary → secondary, +// both theme-driven so it recolours with the active theme) holding a bold spark +// glyph — a confident, generic starting point, NOT a flat monochrome square. +// Reshape the glyph into a real brand mark per project. +export const Wordmark: FC<{ name: I18nString; size?: number }> = ({ name, size = 30 }) => { + return ( + + + + {/* Four-point spark — energetic, distinctive, reads at any size. */} + + + + + {name} + + + ) +} diff --git a/apps/app/src/contexts/preferences.tsx b/apps/app/src/contexts/preferences.tsx new file mode 100644 index 0000000..06da6a2 --- /dev/null +++ b/apps/app/src/contexts/preferences.tsx @@ -0,0 +1,19 @@ +import { createContext, useContext } from 'react' + +export interface PreferencesContextValue { + locale: string + themeId: string + setLocale: (locale: string) => void + setThemeId: (themeId: string) => void +} + +export const PreferencesContext = createContext({ + locale: 'en', + themeId: 'default', + setLocale: () => {}, + setThemeId: () => {}, +}) + +export function usePreferences(): PreferencesContextValue { + return useContext(PreferencesContext) +} diff --git a/apps/app/src/hooks/useAuthGate.ts b/apps/app/src/hooks/useAuthGate.ts new file mode 100644 index 0000000..5e95804 --- /dev/null +++ b/apps/app/src/hooks/useAuthGate.ts @@ -0,0 +1,46 @@ +import { useEffect } from 'react' +import { useNavigate } from '@tanstack/react-router' +import { getAuthSession } from '@/lib/auth' + +// Client-side auth gates. They run only after hydration (useEffect never fires +// during SSR), so the redirect decision never depends on the SSR worker seeing +// the session cookie — which it can't on the multi-tenant pikkufabric.dev +// domain, where the Auth.js cookie is host-only on the API origin and so is not +// sent to the app host on a server-rendered request. The client fetch to the +// API host does carry that cookie, so the check is correct on every deploy +// topology (local, platform subdomains, custom domain). +// +// Trade-off: a logged-out visitor to /app sees the shell for a moment before +// being redirected. On a custom domain (single tenant, cookie Domain=.) +// you could add a createServerFn + server-side gate to remove that flash — +// deferred; not safe to do generically on the shared platform domain. + +export function useRedirectIfAuthenticated() { + const navigate = useNavigate() + useEffect(() => { + let cancelled = false + void getAuthSession().then((session) => { + if (!cancelled && session.user?.email) { + void navigate({ to: '/app' }) + } + }) + return () => { + cancelled = true + } + }, [navigate]) +} + +export function useRequireAuthentication() { + const navigate = useNavigate() + useEffect(() => { + let cancelled = false + void getAuthSession().then((session) => { + if (!cancelled && !session.user?.email) { + void navigate({ to: '/login' }) + } + }) + return () => { + cancelled = true + } + }, [navigate]) +} diff --git a/apps/app/src/i18n/config.ts b/apps/app/src/i18n/config.ts new file mode 100644 index 0000000..86474d0 --- /dev/null +++ b/apps/app/src/i18n/config.ts @@ -0,0 +1,87 @@ +// i18n configuration — Paraglide JS (inlang). Messages live in `messages/*.json` +// and are compiled to `src/paraglide/` by the Vite plugin (gitignored). This +// module is the locale-plumbing entry point; `@/i18n/messages` exposes the typed +// message functions (`m`). +// +// Add a language: drop `messages/.json` next to `en.json`, add the code to +// `project.inlang/settings.json` `locales`, and recompile. Content is reachable +// via the `/` URL prefix (e.g. `/fr`); the base locale (`en`) needs none. +import { useSyncExternalStore } from 'react' +import { locales, baseLocale, overwriteGetLocale } from '../paraglide/runtime.js' + +export const supportedLocales = locales +export const defaultLocale = baseLocale +export type Locale = (typeof locales)[number] + +const RTL_LOCALES = new Set(['ar', 'he', 'fa', 'ur']) +// Direction for a locale — RTL for Arabic/Hebrew/Farsi/Urdu, else LTR. Set this +// on at the root so the browser (and Mantine) mirror the layout. +export function localeDir(locale: string = defaultLocale): 'rtl' | 'ltr' { + return RTL_LOCALES.has(locale.split('-')[0]) ? 'rtl' : 'ltr' +} + +export function detectLocale(pathname: string): Locale { + const segment = pathname.split('/')[1] + if (supportedLocales.includes(segment as Locale)) return segment as Locale + if (typeof navigator !== 'undefined') { + const browserLang = navigator.language?.split('-')[0] + if (supportedLocales.includes(browserLang as Locale)) return browserLang as Locale + } + return defaultLocale +} + +// ── reactive locale store ──────────────────────────────────────────────────── +// Paraglide's `getLocale()` is a module-global, decoupled from React. We bridge +// it to a tiny external store: `getLocale` reads `activeLocale`; components +// subscribe via `useLocale()` (useSyncExternalStore) so `m.*()` re-renders on +// switch — no page reload, no Paraglide `setLocale`, no app-specific context. +// The app's own setLocale (persist + ) calls `setActiveLocale`. +let activeLocale: Locale = defaultLocale +const listeners = new Set<() => void>() +overwriteGetLocale(() => activeLocale) + +export function setActiveLocale(next: Locale): void { + if (next === activeLocale) return + activeLocale = next + for (const fn of listeners) fn() +} + +function subscribe(fn: () => void): () => void { + listeners.add(fn) + return () => listeners.delete(fn) +} + +// Subscribe a component to locale changes so `m.*()` re-renders on switch. The +// codemod injects a bare `useLocale()` wherever `const { t } = useTranslation()` +// used to live; it also returns the active locale + direction for components +// that need them (e.g. the language switcher). +export function useLocale(): { + locale: Locale + dir: 'ltr' | 'rtl' + setLocale: (l: Locale) => void +} { + const locale = useSyncExternalStore( + subscribe, + () => activeLocale, + () => activeLocale, + ) + return { locale, dir: localeDir(locale), setLocale: setActiveLocale } +} + +// ── i18n-debug masking ─────────────────────────────────────────────────────── +// When enabled, every *translated* string is masked to block glyphs (█) so any +// readable text left on screen is text that never went through a message (a +// hardcoded/inlined string) — missing i18n at a glance. Toggle with `?i18n-debug` +// in the URL or `localStorage['i18n-debug'] = '1'` (`I18N_DEBUG=1` for SSR). +export function isI18nDebug(): boolean { + if (typeof process !== 'undefined' && process.env?.I18N_DEBUG === '1') return true + if (typeof window === 'undefined') return false + const params = new URLSearchParams(window.location.search) + if (params.has('i18n-debug')) return params.get('i18n-debug') !== '0' + return window.localStorage?.getItem('i18n-debug') === '1' +} + +/** Mask a rendered string when debug mode is on; otherwise pass it through. */ +export function maskI18n(s: string): string { + return isI18nDebug() ? s.replace(/\S/g, '█') : s +} diff --git a/apps/app/src/i18n/messages.ts b/apps/app/src/i18n/messages.ts new file mode 100644 index 0000000..0f5ed81 --- /dev/null +++ b/apps/app/src/i18n/messages.ts @@ -0,0 +1,33 @@ +// Typed message functions for the app. `m.landing_title()` returns a branded +// I18nString, so it satisfies the @pikku/mantine i18n gate exactly where the old +// `t('landing.title')` used to — no call-site boilerplate. +// +// Each message is wrapped once so i18n-debug masking (█) still works (parity with +// the old i18next postProcessor). Wrapping the whole namespace forgoes Paraglide +// per-message tree-shaking — fine here: locale files are KB and the app bundled +// all of en.json under i18next anyway. +import { m as _m } from '../paraglide/messages.js' +import type { I18nString } from '@pikku/react' +import { maskI18n } from './config.js' + +type BrandReturn = T extends (...args: infer A) => unknown ? (...args: A) => I18nString : T +type Branded = { [K in keyof T]: BrandReturn } + +const _raw = _m as unknown as Record) => string> +const _wrapped: Record = {} +for (const key of Object.keys(_raw)) { + const fn = _raw[key] + _wrapped[key] = + typeof fn === 'function' + ? (...args: unknown[]) => maskI18n((fn as (...a: unknown[]) => string)(...args)) + : fn +} + +/** Branded, debug-maskable message namespace. Drop-in for `t('...')`. */ +export const m = _wrapped as unknown as Branded + +// Re-export asI18n so every call site imports BOTH i18n helpers from this one +// module — `import { asI18n, m } from '@/i18n/messages'`. asI18n brands an opaque +// runtime string (a server name/slug/id or a formatted date/number) so it passes +// the @pikku/mantine i18n gate; m.key() is for static copy. Keep them co-located. +export { asI18n } from '@pikku/react' diff --git a/apps/app/src/lib/auth.ts b/apps/app/src/lib/auth.ts new file mode 100644 index 0000000..fc673f7 --- /dev/null +++ b/apps/app/src/lib/auth.ts @@ -0,0 +1,133 @@ +import { createAuthClient } from 'better-auth/client' +import { apiUrl } from './env' + +// Better Auth browser client. It targets the worker's catch-all `/api/auth/**` +// routes (generated from src/auth.ts in the functions package). Pass the FULL +// auth base (`/auth`): better-auth's withPath only appends its default +// `/api/auth` when baseURL has no path, and apiUrl() already carries `/api`, so +// a bare apiUrl() would leave the client calling `/api/get-session` (404) and +// the app would loop back to /login. Cookies ride every request so the session +// round-trips across origins. +// +// Lazily constructed: createAuthClient validates baseURL with `new URL()` at +// construction, so building it at module scope crashes SSR (apiUrl() returns +// the relative `/__api` placeholder there). Every caller runs in the browser. +let _authClient: ReturnType | null = null +function authClient() { + _authClient ??= createAuthClient({ baseURL: `${apiUrl()}/auth` }) + return _authClient +} + +export type AuthSession = { + user?: { + email?: string | null + name?: string | null + image?: string | null + } | null + expires?: string +} + +// Thrown by signInWithPassword when the email/password pair is wrong. +export const INVALID_CREDENTIALS = 'INVALID_CREDENTIALS' +// Thrown by registerWithPassword when the email is already taken. +export const EMAIL_IN_USE = 'EMAIL_IN_USE' + +export async function getAuthSession(): Promise { + const { data } = await authClient().getSession() + if (!data?.user) { + return {} + } + return { + user: { + email: data.user.email, + name: data.user.name ?? null, + image: data.user.image ?? null, + }, + expires: data.session?.expiresAt ? new Date(data.session.expiresAt).toISOString() : undefined, + } +} + +// Sign in with an email and password. On success Better Auth sets the session +// cookie; on bad credentials this throws INVALID_CREDENTIALS. +export async function signInWithPassword(email: string, password: string, _redirectPath = '/app') { + const { error } = await authClient().signIn.email({ email, password }) + if (error) { + throw new Error(INVALID_CREDENTIALS) + } +} + +// Create a new account. Better Auth signs the user in on success (sets the +// session cookie), so they land logged in. +export async function registerWithPassword( + email: string, + password: string, + options: { name?: string; redirectPath?: string } = {}, +) { + const { error } = await authClient().signUp.email({ + email, + password, + // Better Auth requires a name; fall back to the local-part of the email. + name: options.name?.trim() || email.split('@')[0], + }) + + if (error) { + // Better Auth returns 422 (UNPROCESSABLE_ENTITY) when the email is taken. + if (error.status === 422 || /exist|taken/i.test(error.message ?? '')) { + throw new Error(EMAIL_IN_USE) + } + throw new Error('Unable to create account') + } +} + +// Dev-only convenience account. The Quick-login button (rendered only in non-prod +// builds — sandboxes run `vite dev`, deployments are production builds where +// import.meta.env.DEV is false) signs in with these so you never sign up by hand. +export const DEV_LOGIN = { email: 'test@example.com', password: 'password' } as const + +// Sign in with the dev account, provisioning it on first use. Idempotent: if the +// account already exists we just sign in; a concurrent create (EMAIL_IN_USE) is +// fine. Only ever called from the dev-gated Quick-login button. +export async function devQuickLogin(): Promise { + // The account usually already exists — try signing in first. A failure here is + // expected on the very first run (not yet provisioned), so fall through. + const signedIn = await signInWithPassword(DEV_LOGIN.email, DEV_LOGIN.password) + .then(() => true) + .catch(() => false) + if (signedIn) return + + await registerWithPassword(DEV_LOGIN.email, DEV_LOGIN.password, { name: 'Test User' }).catch( + (err) => { + // Another tab/request may have created it between our sign-in and sign-up. + if (!(err instanceof Error && err.message === EMAIL_IN_USE)) throw err + }, + ) + await signInWithPassword(DEV_LOGIN.email, DEV_LOGIN.password) +} + +// Continue with Google. Better Auth redirects the browser to the provider and +// back to `callbackURL` on success, so this never resolves on the happy path — +// it throws only when the provider isn't configured / the request is rejected. +// Configure the Google provider in the functions package's auth config to enable +// it; until then the button surfaces the error via useMutation. +export async function signInWithGoogle(callbackURL = '/app') { + const { error } = await authClient().signIn.social({ provider: 'google', callbackURL }) + if (error) { + throw new Error('Unable to continue with Google') + } +} + +// Change the signed-in user's password. Better Auth requires the current +// password to authorize the change. +export async function changePassword(currentPassword: string, newPassword: string) { + const { error } = await authClient().changePassword({ currentPassword, newPassword }) + if (error) { + throw new Error('Unable to update password') + } +} + +export async function signOut() { + const { error } = await authClient().signOut() + if (error) { + throw new Error('Unable to sign out') + } +} diff --git a/apps/app/src/lib/env.ts b/apps/app/src/lib/env.ts new file mode 100644 index 0000000..269efca --- /dev/null +++ b/apps/app/src/lib/env.ts @@ -0,0 +1,18 @@ +// Endpoints come from env, never hardcoded. +// +// In local dev VITE_API_URL is set at build time via .dev.vars and Vite +// replaces the import.meta.env reference inline. In CF Workers deployments +// VITE_API_URL is a runtime text binding — invisible to Vite at build time — +// so import.meta.env.VITE_API_URL is undefined in the bundle. We fall back to +// the current origin + /api, which is correct because the dispatcher worker +// routes every /api/* path to the API units on the same hostname. +export function apiUrl(): string { + if (import.meta.env.SSR) { + // SSR context: PikkuProvider is a client-side provider and its serverUrl + // is only consumed by hooks that run in the browser. Return the build-time + // var when available (local dev) or a placeholder so SSR never throws. + return import.meta.env.VITE_API_URL ?? '/__api' + } + // Client: use the build-time var (local dev) or derive from current origin. + return import.meta.env.VITE_API_URL ?? window.location.origin + '/api' +} diff --git a/apps/app/src/pages/HomePage.tsx b/apps/app/src/pages/HomePage.tsx new file mode 100644 index 0000000..f2e47fc --- /dev/null +++ b/apps/app/src/pages/HomePage.tsx @@ -0,0 +1,22 @@ +import type { FC } from 'react' +import { Box, Stack, Text, Title } from '@pikku/mantine/core' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' + +export const HomePage: FC = () => { + useLocale() + const appName = m.app__name() + + return ( + + + + {m.home__title()} + + + {m.home__body({ name: appName })} + + + + ) +} diff --git a/apps/app/src/pages/LoginPage.tsx b/apps/app/src/pages/LoginPage.tsx new file mode 100644 index 0000000..c0ac595 --- /dev/null +++ b/apps/app/src/pages/LoginPage.tsx @@ -0,0 +1,78 @@ +import type { FC } from 'react' +import { Anchor } from '@pikku/mantine/core' +import { Link, useNavigate } from '@tanstack/react-router' +import { useMutation } from '@tanstack/react-query' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' +import { AuthCard, type AuthFormValues } from '@/components/AuthCard' +import { + DEV_LOGIN, + INVALID_CREDENTIALS, + devQuickLogin, + signInWithGoogle, + signInWithPassword, +} from '@/lib/auth' + +export const LoginPage: FC = () => { + useLocale() + const navigate = useNavigate() + const appName = m.app__name() + // Dev builds (sandboxes run `vite dev`) prefill the test account and expose a + // one-click quick-login; production builds strip both (import.meta.env.DEV). + const isDev = import.meta.env.DEV + + const signIn = useMutation({ + mutationFn: (values: AuthFormValues) => + signInWithPassword(values.email, values.password, '/app'), + onSuccess: () => navigate({ to: '/app' }), + }) + const google = useMutation({ mutationFn: () => signInWithGoogle('/app') }) + const quick = useMutation({ + mutationFn: () => devQuickLogin(), + onSuccess: () => navigate({ to: '/app' }), + }) + + const error = signIn.isError + ? signIn.error instanceof Error && signIn.error.message === INVALID_CREDENTIALS + ? m.auth__login__invalid_credentials() + : m.auth__login__error() + : google.isError + ? m.auth__google_error() + : quick.isError + ? m.auth__login__error() + : null + + return ( + quick.mutate(), + busy: quick.isPending, + } + : null + } + onAuthSubmit={(values) => signIn.mutate(values)} + onGoogle={() => google.mutate()} + footer={ + <> + {m.auth__login__footer_prompt()}{' '} + + {m.auth__login__footer_action()} + + + } + /> + ) +} diff --git a/apps/app/src/pages/SignupPage.tsx b/apps/app/src/pages/SignupPage.tsx new file mode 100644 index 0000000..d2d1de3 --- /dev/null +++ b/apps/app/src/pages/SignupPage.tsx @@ -0,0 +1,56 @@ +import type { FC } from 'react' +import { Anchor } from '@pikku/mantine/core' +import { Link, useNavigate } from '@tanstack/react-router' +import { useMutation } from '@tanstack/react-query' +import { m } from '@/i18n/messages' +import { useLocale } from '@/i18n/config' +import { AuthCard, type AuthFormValues } from '@/components/AuthCard' +import { EMAIL_IN_USE, registerWithPassword, signInWithGoogle } from '@/lib/auth' + +export const SignupPage: FC = () => { + useLocale() + const navigate = useNavigate() + const appName = m.app__name() + + const signUp = useMutation({ + mutationFn: (values: AuthFormValues) => + registerWithPassword(values.email, values.password, { + name: values.name, + redirectPath: '/app', + }), + onSuccess: () => navigate({ to: '/app' }), + }) + const google = useMutation({ mutationFn: () => signInWithGoogle('/app') }) + + const error = signUp.isError + ? signUp.error instanceof Error && signUp.error.message === EMAIL_IN_USE + ? m.auth__signup__email_in_use() + : m.auth__signup__error() + : google.isError + ? m.auth__google_error() + : null + + return ( + signUp.mutate(values)} + onGoogle={() => google.mutate()} + footer={ + <> + {m.auth__signup__footer_prompt()}{' '} + + {m.auth__signup__footer_action()} + + + } + /> + ) +} diff --git a/apps/app/src/router.tsx b/apps/app/src/router.tsx new file mode 100644 index 0000000..c1df8b5 --- /dev/null +++ b/apps/app/src/router.tsx @@ -0,0 +1,22 @@ +import { createRouter } from '@tanstack/react-router' +import { routeTree } from './routeTree.gen' +import { DefaultErrorPage } from '@/components/DefaultErrorPage' + +// TanStack Start discovers this `getRouter` factory to build a router per +// request (server) and once on the client (hydration). routeTree.gen.ts is +// generated by the tanstackStart() Vite plugin from src/routes/** — don't +// hand-edit it. +export function getRouter() { + return createRouter({ + routeTree, + scrollRestoration: true, + defaultPreload: 'intent', + defaultErrorComponent: DefaultErrorPage, + }) +} + +declare module '@tanstack/react-router' { + interface Register { + router: ReturnType + } +} diff --git a/apps/app/src/routes/__root.tsx b/apps/app/src/routes/__root.tsx new file mode 100644 index 0000000..6e12a5f --- /dev/null +++ b/apps/app/src/routes/__root.tsx @@ -0,0 +1,178 @@ +import { useEffect, useState } from 'react' +import { createRootRoute, HeadContent, Outlet, Scripts } from '@tanstack/react-router' +import { + ColorSchemeScript, + MantineProvider, + mantineHtmlProps, + type MantineThemeOverride, +} from '@pikku/mantine/core' +import '@mantine/core/styles.css' +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { PikkuProvider, createPikku } from '@pikku/react' +import { PikkuFetch } from '@project/functions-sdk/pikku/pikku-fetch.gen' +import { PikkuRPC } from '@project/functions-sdk/pikku/pikku-rpc.gen' +import { + activeColorScheme, + activeId, + activeTheme, + buildMantineTheme, + googleFontsHref, + themeColorSchemes, + themes, + type ColorScheme, + type Theme, +} from '@project/mantine-themes' +import { defaultLocale, localeDir, supportedLocales, setActiveLocale } from '@/i18n/config' +import { apiUrl } from '@/lib/env' +import { PreferencesContext } from '@/contexts/preferences' + +const LOCALE_KEY = 'app-locale' +const THEME_KEY = 'app-theme' +// The active theme id THEME_KEY was saved against — a preference only holds +// while that theme is still the workspace's active one, so a builder-side +// switch (which changes active.json) always wins over a stale local pick. +const THEME_SAVED_ACTIVE_KEY = 'app-theme-saved-active' + +const fontsHref = googleFontsHref() + +// Root route owns the full HTML document for SSR ( so the tree +// mirrors for RTL locales) and wraps the app in the Mantine + react-query + +// Pikku providers. Mantine v8 SSR needs ColorSchemeScript in and +// mantineHtmlProps on ; @mantine/core/styles.css ships the static CSS. +export const Route = createRootRoute({ + head: () => ({ + meta: [ + { charSet: 'utf-8' }, + { name: 'viewport', content: 'width=device-width, initial-scale=1' }, + { title: 'Pikku App' }, + ], + }), + component: RootDocument, +}) + +function RootDocument() { + // Seed from the build-time active theme (active.json) so the applied theme + // drives the initial + SSR render; useEffect syncs from localStorage after + // hydration. Seeding 'default' here was the "applied theme never shows" bug. + const [themeId, setThemeIdRaw] = useState(activeId) + const [locale, setLocaleRaw] = useState(defaultLocale) + // Transient override from the fabric console live-preview (not persisted) — + // the console injects a full theme spec into the iframe so the builder sees + // the look instantly. Takes precedence over the persisted theme. + const [previewTheme, setPreviewTheme] = useState(null) + // The scheme that goes with the live-preview spec (a light style must render + // light), tracked alongside previewTheme so a preview flips the scheme too. + const [previewScheme, setPreviewScheme] = useState(null) + + const effectiveTheme = previewTheme ?? themes[themeId] ?? activeTheme + // Force the active/previewed theme's natural scheme — a light-first style boots + // light, a dark-first style dark — rather than the old hardcoded dark. + const colorScheme: ColorScheme = previewScheme ?? themeColorSchemes[themeId] ?? activeColorScheme + + // Sync preferences from localStorage after hydration. + useEffect(() => { + const savedTheme = localStorage.getItem(THEME_KEY) + const savedAgainst = localStorage.getItem(THEME_SAVED_ACTIVE_KEY) + if (savedTheme && themes[savedTheme] && savedAgainst === activeId) { + setThemeIdRaw(savedTheme) + } else if (savedTheme) { + localStorage.removeItem(THEME_KEY) + localStorage.removeItem(THEME_SAVED_ACTIVE_KEY) + } + + const savedLocale = localStorage.getItem(LOCALE_KEY) + if ( + savedLocale && + supportedLocales.includes(savedLocale as (typeof supportedLocales)[number]) + ) { + setLocaleRaw(savedLocale) + setActiveLocale(savedLocale as (typeof supportedLocales)[number]) + } + }, []) + + // Keep in sync with locale changes after hydration. + useEffect(() => { + document.documentElement.lang = locale + document.documentElement.dir = localeDir(locale) + }, [locale]) + + // Fabric console live-preview: postMessage injects a theme spec to override + // the active theme without persisting. Accepts `theme` (a full spec) or the + // legacy `palette`; null resets to the persisted theme. + useEffect(() => { + const onMessage = (event: MessageEvent) => { + const data = event.data + if (data?.source !== 'fabric-console' || data.type !== 'set-theme') return + try { + const spec = (data.theme ?? data.palette) as Theme | null + setPreviewTheme(spec ? buildMantineTheme(spec) : null) + setPreviewScheme(spec?.structure?.defaultColorScheme ?? null) + } catch (err) { + console.warn('[mantine-themes] ignoring bad theme payload', err) + } + } + window.addEventListener('message', onMessage) + return () => window.removeEventListener('message', onMessage) + }, []) + + const setLocale = (next: string) => { + localStorage.setItem(LOCALE_KEY, next) + setLocaleRaw(next) + setActiveLocale(next as (typeof supportedLocales)[number]) + } + + const setThemeId = (next: string) => { + localStorage.setItem(THEME_KEY, next) + localStorage.setItem(THEME_SAVED_ACTIVE_KEY, activeId) + setThemeIdRaw(next) + setPreviewTheme(null) + setPreviewScheme(null) + } + + // Per-render instances keep server requests from sharing client/cache state. + const [queryClient] = useState(() => new QueryClient()) + const [pikku] = useState(() => + createPikku(PikkuFetch, PikkuRPC, { + serverUrl: apiUrl(), + credentials: 'include', + }), + ) + + return ( + + + + + {/* Inline data-URI icon so the browser's automatic /favicon.ico request + never 404s (no asset to ship, no network round-trip). Gradient spark + matches the Wordmark; the build agent rebrands this per project. */} + + {fontsHref && ( + <> + + + + + )} + + + + + + + + + + + + + + + ) +} diff --git a/apps/app/src/routes/app.index.tsx b/apps/app/src/routes/app.index.tsx new file mode 100644 index 0000000..7195881 --- /dev/null +++ b/apps/app/src/routes/app.index.tsx @@ -0,0 +1,6 @@ +import { createFileRoute } from '@tanstack/react-router' +import { HomePage } from '@/pages/HomePage' + +export const Route = createFileRoute('/app/')({ + component: HomePage, +}) diff --git a/apps/app/src/routes/app.tsx b/apps/app/src/routes/app.tsx new file mode 100644 index 0000000..a72d08f --- /dev/null +++ b/apps/app/src/routes/app.tsx @@ -0,0 +1,12 @@ +import { createFileRoute } from '@tanstack/react-router' +import { AppShell } from '@/components/AppShell' +import { useRequireAuthentication } from '@/hooks/useAuthGate' + +export const Route = createFileRoute('/app')({ + component: AppLayout, +}) + +function AppLayout() { + useRequireAuthentication() + return +} diff --git a/apps/app/src/routes/index.tsx b/apps/app/src/routes/index.tsx new file mode 100644 index 0000000..77e2751 --- /dev/null +++ b/apps/app/src/routes/index.tsx @@ -0,0 +1,11 @@ +import { createFileRoute, redirect } from '@tanstack/react-router' + +// The starter has no marketing landing — entry is the sign-in screen. Redirect +// at the router level so it runs during SSR (and every navigation), instead of a +// client-only effect that leaves `/` blank until hydration. Signed-in visitors +// are then bounced to /app by /login's own auth gate. +export const Route = createFileRoute('/')({ + beforeLoad: () => { + throw redirect({ to: '/login' }) + }, +}) diff --git a/apps/app/src/routes/login.tsx b/apps/app/src/routes/login.tsx new file mode 100644 index 0000000..9675cce --- /dev/null +++ b/apps/app/src/routes/login.tsx @@ -0,0 +1,12 @@ +import { createFileRoute } from '@tanstack/react-router' +import { LoginPage } from '@/pages/LoginPage' +import { useRedirectIfAuthenticated } from '@/hooks/useAuthGate' + +export const Route = createFileRoute('/login')({ + component: LoginRoute, +}) + +function LoginRoute() { + useRedirectIfAuthenticated() + return +} diff --git a/apps/app/src/routes/signup.tsx b/apps/app/src/routes/signup.tsx new file mode 100644 index 0000000..d94ccee --- /dev/null +++ b/apps/app/src/routes/signup.tsx @@ -0,0 +1,12 @@ +import { createFileRoute } from '@tanstack/react-router' +import { SignupPage } from '@/pages/SignupPage' +import { useRedirectIfAuthenticated } from '@/hooks/useAuthGate' + +export const Route = createFileRoute('/signup')({ + component: SignupRoute, +}) + +function SignupRoute() { + useRedirectIfAuthenticated() + return +} diff --git a/apps/app/tsconfig.json b/apps/app/tsconfig.json new file mode 100644 index 0000000..7e92f0b --- /dev/null +++ b/apps/app/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "allowJs": true, + "checkJs": false, + "types": ["vite/client", "node"], + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src", "vite.config.ts", "wrangler.jsonc"] +} diff --git a/apps/app/vite.config.ts b/apps/app/vite.config.ts new file mode 100644 index 0000000..60c8966 --- /dev/null +++ b/apps/app/vite.config.ts @@ -0,0 +1,59 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { tanstackStart } from '@tanstack/react-start/plugin/vite' +import { paraglideVitePlugin } from '@inlang/paraglide-js' +import { fileURLToPath, URL } from 'node:url' + +// Plain TanStack Start config (Node target) — used for local sandbox dev. This +// template is deploy-provider agnostic: it ships NO @cloudflare/vite-plugin. At +// deploy, fabric CI injects the CF adapter (vite.config.cf.ts merges cloudflare() +// on top of this config) to emit the CF Workers SSR bundle. Do not add cloudflare +// here — that would double-apply it and couple the template to a provider. +export default defineConfig({ + plugins: [ + // Compile messages/*.json → src/paraglide so `m`/`mKey` resolve, with HMR + // on message edits. Must run first. + paraglideVitePlugin({ project: './project.inlang', outdir: './src/paraglide' }), + tanstackStart(), + react(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + }, + }, + server: { + host: '0.0.0.0', + allowedHosts: true, + // Local dev only — mirrors the sandbox edge (Caddy): /api/auth/* keeps its + // prefix (Better Auth mounts there), every other /api/* reaches the pikku + // dev server unprefixed (/rpc/...). In the sandbox Caddy handles /api + // before Vite, so this proxy never fires there. + // changeOrigin stays false so the backend sees Host = the app origin — + // Better Auth trusts the request origin only when it matches Host. + proxy: { + '/api/auth': { + target: process.env.VITE_API_PROXY ?? 'http://localhost:3000', + changeOrigin: false, + }, + '/api': { + target: process.env.VITE_API_PROXY ?? 'http://localhost:3000', + changeOrigin: false, + rewrite: (path) => path.replace(/^\/api/, ''), + }, + // File content: the pikku dev server serves uploads (PUT) and assets (GET) + // AT these prefixes (pikku.config.json content.uploadUrlPrefix/assetUrlPrefix), + // so proxy them through WITHOUT a rewrite. `/content` (not `/assets`) avoids + // colliding with Vite/TanStack's own built asset paths. In the sandbox Caddy + // handles these before Vite, so this proxy only fires in local dev. + '/upload': { + target: process.env.VITE_API_PROXY ?? 'http://localhost:3000', + changeOrigin: false, + }, + '/content': { + target: process.env.VITE_API_PROXY ?? 'http://localhost:3000', + changeOrigin: false, + }, + }, + }, +}) diff --git a/apps/app/wrangler.jsonc b/apps/app/wrangler.jsonc new file mode 100644 index 0000000..a159d43 --- /dev/null +++ b/apps/app/wrangler.jsonc @@ -0,0 +1,9 @@ +{ + // Consumed by @cloudflare/vite-plugin. `main` is TanStack Start's built-in + // server entry (no hand-written worker file); the plugin wires client assets + // and the ssr environment automatically. + "name": "app", + "main": "@tanstack/react-start/server-entry", + "compatibility_date": "2024-12-01", + "compatibility_flags": ["nodejs_compat"], +} diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..7fd770d --- /dev/null +++ b/bun.lock @@ -0,0 +1,1699 @@ +{ + "lockfileVersion": 1, + "configVersion": 1, + "workspaces": { + "": { + "name": "@project/root", + "dependencies": { + "@pikku/addon-console": "^0.12.23", + "@pikku/ai-vercel": "^0.12.7", + "@pikku/assistant-ui": "^0.12.7", + "@pikku/better-auth": "^0.12.16", + "@pikku/core": "^0.12.57", + "@pikku/cucumber": "^0.12.11", + "@pikku/deploy-standalone": "^0.12.7", + "@pikku/fetch": "^0.12.6", + "@pikku/kysely": "^0.13.0", + "@pikku/kysely-node-sqlite": "^0.12.3", + "@pikku/kysely-sqlite": "^0.12.7", + "@pikku/mantine": "^0.12.6", + "@pikku/react": "^0.12.5", + "@pikku/schema-cfworker": "^0.12.4", + }, + "devDependencies": { + "@pikku/cli": "^0.12.76", + "oxfmt": "^0.53.0", + "oxlint": "^1.71.0", + }, + }, + "apps/app": { + "name": "@project/app", + "version": "0.0.1", + "dependencies": { + "@assistant-ui/react": "^0.14.24", + "@mantine/core": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@pikku/assistant-ui": "^0.12.7", + "@pikku/mantine": "^0.12.6", + "@pikku/react": "^0.12.5", + "@project/components": "workspace:*", + "@project/functions-sdk": "workspace:*", + "@project/mantine-themes": "workspace:*", + "@tanstack/react-form": "^1.0.0", + "@tanstack/react-query": "^5.66.0", + "@tanstack/react-router": "^1.132.0", + "@tanstack/react-start": "^1.132.0", + "better-auth": "^1.6.18", + "lucide-react": "^0.456.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + }, + "devDependencies": { + "@babel/core": "^7.26.0", + "@inlang/paraglide-js": "^2.20.0", + "@tanstack/router-generator": "^1.132.0", + "@types/node": "^22", + "@types/react": "^19", + "@types/react-dom": "^19", + "@vitejs/plugin-react": "^4.5.2", + "typescript": "^5.9", + "vite": "^7.0.0", + }, + }, + "e2e": { + "name": "@project/e2e", + "version": "0.0.1", + "devDependencies": { + "@cucumber/cucumber": "^11.0.0", + "@pikku/cucumber": "^0.12.11", + "@playwright/test": "^1.50.0", + "@types/node": "^22", + "tsx": "^4.21.0", + "typescript": "~5.8.0", + }, + }, + "packages/components": { + "name": "@project/components", + "version": "0.0.1", + "devDependencies": { + "@mantine/core": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@tanstack/react-query": "^5.66.0", + "@types/react": "^19", + "@types/react-dom": "^19", + "lucide-react": "^0.456.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "typescript": "^5.9", + }, + "peerDependencies": { + "@mantine/core": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@tanstack/react-query": "^5.66.0", + "lucide-react": "^0.456.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + }, + }, + "packages/functions": { + "name": "@project/functions", + "version": "0.0.1", + "dependencies": { + "@ai-sdk/openai-compatible": "^2.0.48", + "@pikku/addon-console": "^0.12.22", + "@pikku/ai-vercel": "^0.12.7", + "@pikku/better-auth": "^0.12.16", + "@pikku/core": "^0.12.57", + "@pikku/kysely": "^0.13.0", + "@pikku/schema-cfworker": "^0.12.4", + "@standard-schema/spec": "^1.1.0", + "ai": "^6.0.0", + "better-auth": "^1.6.18", + "kysely": "^0.29.0", + "tsx": "^4.21.0", + "zod": "^4.3.6", + }, + "devDependencies": { + "@pikku/deploy-standalone": "^0.12.7", + "@types/node": "^22", + "typescript": "^5.9.3", + }, + }, + "packages/functions-sdk": { + "name": "@project/functions-sdk", + "version": "0.0.1", + "dependencies": { + "@pikku/fetch": "^0.12.6", + "@pikku/react": "^0.12.5", + "@tanstack/react-query": "^5.66.0", + }, + }, + "packages/mantine-theme": { + "name": "@project/mantine-themes", + "version": "0.0.1", + "dependencies": { + "@mantine/colors-generator": "^9.2.1", + "chroma-js": "^3.1.2", + }, + "devDependencies": { + "@mantine/core": "^9.2.1", + "typescript": "^5.9", + }, + "peerDependencies": { + "@mantine/core": "^9.2.1", + }, + }, + }, + "overrides": { + "@pikku/core": "0.12.57", + }, + "packages": { + "@ai-sdk/gateway": ["@ai-sdk/gateway@3.0.143", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35", "@vercel/oidc": "3.2.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-RCH60KsUaNiZkI/fBuyau4yvYrVBIEgAcN+Ain94QpL1kVm28GduQzFKfGffAiJU2We0ZrmN4BHkoCZzACK96Q=="], + + "@ai-sdk/openai-compatible": ["@ai-sdk/openai-compatible@2.0.56", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-cQrN6OUn/jvsY3OdsU6Wn+ss7vp1iwIcakZKSlSRMnYqShBfyT7Qht+eqmgxs7w9ttrw6FAG6o11AiBs+iEsTA=="], + + "@ai-sdk/provider": ["@ai-sdk/provider@3.0.13", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-ZPtVYt5QIJzOta1kdUiDuCx4HhFkvNPv/rvmZ2b1iXwybYjJsCnNYR4PAw4kW7rgVfDARvHXcU64efWuqNp6bw=="], + + "@ai-sdk/provider-utils": ["@ai-sdk/provider-utils@4.0.35", "", { "dependencies": { "@ai-sdk/provider": "3.0.13", "@standard-schema/spec": "^1.1.0", "eventsource-parser": "^3.0.8" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-bjYld/2KGPLt78kpqbya+fD4LYS7BqVQJyUjE3qAHrYB0FR2Q90BaWEVIBZaguTWXf/A8L6uG1zO1v9TxVlGWg=="], + + "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@15.4.0", "", { "dependencies": { "js-yaml": "^4.2.0" }, "peerDependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-QbMJJlMZd27fZmi7Q+twCqwABlfaO4Qdc1YvbbwkqN2lILfELnfWfw9xFFl6CeF5jAeGQpokUVhvCkhz+rvEGg=="], + + "@assistant-ui/core": ["@assistant-ui/core@0.2.20", "", { "dependencies": { "assistant-stream": "^0.3.25", "nanoid": "^5.1.15" }, "peerDependencies": { "@assistant-ui/store": "^0.2.13", "@assistant-ui/tap": "^0.9.0", "@types/react": "*", "assistant-cloud": "^0.1.31", "react": "^18 || ^19", "zustand": "^5.0.11" }, "optionalPeers": ["@types/react", "assistant-cloud", "react", "zustand"] }, "sha512-PVUQH+Q3uQ98eSIeuY4gVR1zD1dhF0nkIQ9A3unE8BFPQD5iLXWkgSq+iAhF3H7WqKpTjUDhvJUAanAPcxqWfQ=="], + + "@assistant-ui/react": ["@assistant-ui/react@0.14.26", "", { "dependencies": { "@assistant-ui/core": "^0.2.20", "@assistant-ui/store": "^0.2.19", "@assistant-ui/tap": "^0.9.3", "@radix-ui/primitive": "^1.1.4", "@radix-ui/react-collection": "^1.1.10", "@radix-ui/react-compose-refs": "^1.1.3", "@radix-ui/react-context": "^1.1.4", "@radix-ui/react-primitive": "^2.1.6", "@radix-ui/react-use-callback-ref": "^1.1.2", "@radix-ui/react-use-controllable-state": "^1.2.3", "@radix-ui/react-use-escape-keydown": "^1.1.2", "assistant-cloud": "^0.1.34", "assistant-stream": "^0.3.25", "nanoid": "^5.1.15", "radix-ui": "^1.6.0", "react-textarea-autosize": "^8.5.9", "safe-content-frame": "^0.0.22", "zod": "^4.4.3", "zustand": "^5.0.14" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^18 || ^19", "react-dom": "^18 || ^19" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-i5BaJOe5hwSEr3mt89RsURfSGGJlCNJg3Vlh3Dw2PVeQr6MAGchT80v7aLf3e8LJ5IroKLhG8PyPCfYr1NV9XQ=="], + + "@assistant-ui/store": ["@assistant-ui/store@0.2.19", "", { "dependencies": { "use-effect-event": "^2.0.3" }, "peerDependencies": { "@assistant-ui/tap": "^0.9.0", "@types/react": "*", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-7GMEoK+H4iINquteLFXqqDB5SAzB19YHBy4KKQprxHseAtDrpkC8w9pTrPfJ1yLvbn3FqjXk645bCt5vDf1sTg=="], + + "@assistant-ui/tap": ["@assistant-ui/tap@0.9.3", "", { "peerDependencies": { "@types/react": "*", "react": "^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-IKIgDbaKUPvVt2hMKL+WU2E8oru5J3muO9iSjL/vEVf6TNz5H07wrOKwD+1xhitqR1Nc4WtHK986jqoeGmWRDw=="], + + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], + + "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], + + "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], + + "@babel/generator": ["@babel/generator@7.29.7", "", { "dependencies": { "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.29.7", "", {}, "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], + + "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], + + "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="], + + "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw=="], + + "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.29.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q=="], + + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], + + "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], + + "@babel/traverse": ["@babel/traverse@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/types": "^7.29.7", "debug": "^4.3.1" } }, "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw=="], + + "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="], + + "@better-auth/core": ["@better-auth/core@1.6.23", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.39.0", "@standard-schema/spec": "^1.1.0", "zod": "^4.3.6" }, "peerDependencies": { "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@cloudflare/workers-types": ">=4", "@opentelemetry/api": "^1.9.0", "better-call": "1.3.7", "jose": "^6.1.0", "kysely": "^0.28.5 || ^0.29.0", "nanostores": "^1.0.1" }, "optionalPeers": ["@cloudflare/workers-types", "@opentelemetry/api"] }, "sha512-beEhOs0uVeOxYOZKUfIEBd/nQV2Bd4/6wyLxZ0OFkn6CMTK2Vi+hXuZLnyPBeB6RdHpebEoJWiHqwHxBIxgPDQ=="], + + "@better-auth/drizzle-adapter": ["@better-auth/drizzle-adapter@1.6.23", "", { "peerDependencies": { "@better-auth/core": "^1.6.23", "@better-auth/utils": "0.4.2", "drizzle-orm": "^0.45.2" }, "optionalPeers": ["drizzle-orm"] }, "sha512-2+/PTVfIP9E7iz6af8TB3lhnowHUj9ljC66kECmHaFEdUqPgzHoWux9epotKwO7XDg2ui4ttWQ8CMeNFLvQeKQ=="], + + "@better-auth/kysely-adapter": ["@better-auth/kysely-adapter@1.6.23", "", { "peerDependencies": { "@better-auth/core": "^1.6.23", "@better-auth/utils": "0.4.2", "kysely": "^0.28.17 || ^0.29.0" }, "optionalPeers": ["kysely"] }, "sha512-zbNJsMbG09exfkGyvFqBLLqWoMPAUWjxCuUnEK5AsjbYoZeIjj/QGZgdf4CapVWryKxjA9Q6Jlr6fbiPpC3VAg=="], + + "@better-auth/memory-adapter": ["@better-auth/memory-adapter@1.6.23", "", { "peerDependencies": { "@better-auth/core": "^1.6.23", "@better-auth/utils": "0.4.2" } }, "sha512-krIiR0pIVkaKlAzm690n5bcMW4NGbqeMg0HQSD9fz/KcQF/eWLqcq9gG/BhHTj2i/y96qH+W5JWPmaSOS5iTgQ=="], + + "@better-auth/mongo-adapter": ["@better-auth/mongo-adapter@1.6.23", "", { "peerDependencies": { "@better-auth/core": "^1.6.23", "@better-auth/utils": "0.4.2", "mongodb": "^6.0.0 || ^7.0.0" }, "optionalPeers": ["mongodb"] }, "sha512-7+QdevitGlKBbP6JbiSk5SBnzPsKV/mDrQBGBn8hwByQLeJwqpqbuBPw7ZI8vzUlFfAAnyFiqwP3Eb8mxnp7pA=="], + + "@better-auth/prisma-adapter": ["@better-auth/prisma-adapter@1.6.23", "", { "peerDependencies": { "@better-auth/core": "^1.6.23", "@better-auth/utils": "0.4.2", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@prisma/client", "prisma"] }, "sha512-2qSdzidq4tkb1eS5TTqb4Nzg0mdZWm3Qky9SYeXeb8PpVQbC2sxqJhEM5mK7y12uU6I8hc64wO9f7AFVNL+6UQ=="], + + "@better-auth/telemetry": ["@better-auth/telemetry@1.6.23", "", { "peerDependencies": { "@better-auth/core": "^1.6.23", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1" } }, "sha512-/R2Kb+z2BpDOOWwVHqOk+c0VNpuwfCv4Hp5Yr9003WIZPax/zyNraGLB9CFE8qF2gZW8Dsz419k4I8CPrGzpDA=="], + + "@better-auth/utils": ["@better-auth/utils@0.4.2", "", { "dependencies": { "@noble/hashes": "^2.0.1" } }, "sha512-AUxrvu+HaaODsUyzDxFgwd/8RZ1yZaYo42LXKSrU2oGgR38pS1ij8nqQKNgtTWoYGpNevNXtCfgTy6loHveW9A=="], + + "@better-fetch/fetch": ["@better-fetch/fetch@1.3.1", "", {}, "sha512-ABkD1WhyfPZprKRQI3bhATjeiFuNWC9PXhfGWqL+sg/gKrM977oFrYkdb4msM3hgUGonr7KlOsOFT5TU2rht9g=="], + + "@cfworker/json-schema": ["@cfworker/json-schema@4.1.1", "", {}, "sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og=="], + + "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="], + + "@cucumber/ci-environment": ["@cucumber/ci-environment@10.0.1", "", {}, "sha512-/+ooDMPtKSmvcPMDYnMZt4LuoipfFfHaYspStI4shqw8FyKcfQAmekz6G+QKWjQQrvM+7Hkljwx58MEwPCwwzg=="], + + "@cucumber/cucumber": ["@cucumber/cucumber@11.3.0", "", { "dependencies": { "@cucumber/ci-environment": "10.0.1", "@cucumber/cucumber-expressions": "18.0.1", "@cucumber/gherkin": "30.0.4", "@cucumber/gherkin-streams": "5.0.1", "@cucumber/gherkin-utils": "9.2.0", "@cucumber/html-formatter": "21.10.1", "@cucumber/junit-xml-formatter": "0.7.1", "@cucumber/message-streams": "4.0.1", "@cucumber/messages": "27.2.0", "@cucumber/tag-expressions": "6.1.2", "assertion-error-formatter": "^3.0.0", "capital-case": "^1.0.4", "chalk": "^4.1.2", "cli-table3": "0.6.5", "commander": "^10.0.0", "debug": "^4.3.4", "error-stack-parser": "^2.1.4", "figures": "^3.2.0", "glob": "^10.3.10", "has-ansi": "^4.0.1", "indent-string": "^4.0.0", "is-installed-globally": "^0.4.0", "is-stream": "^2.0.0", "knuth-shuffle-seeded": "^1.0.6", "lodash.merge": "^4.6.2", "lodash.mergewith": "^4.6.2", "luxon": "3.6.1", "mime": "^3.0.0", "mkdirp": "^2.1.5", "mz": "^2.7.0", "progress": "^2.0.3", "read-package-up": "^11.0.0", "semver": "7.7.1", "string-argv": "0.3.1", "supports-color": "^8.1.1", "type-fest": "^4.41.0", "util-arity": "^1.1.0", "yaml": "^2.2.2", "yup": "1.6.1" }, "bin": { "cucumber-js": "bin/cucumber.js" } }, "sha512-1YGsoAzRfDyVOnRMTSZP/EcFsOBElOKa2r+5nin0DJAeK+Mp0mzjcmSllMgApGtck7Ji87wwy3kFONfHUHMn4g=="], + + "@cucumber/cucumber-expressions": ["@cucumber/cucumber-expressions@18.0.1", "", { "dependencies": { "regexp-match-indices": "1.0.2" } }, "sha512-NSid6bI+7UlgMywl5octojY5NXnxR9uq+JisjOrO52VbFsQM6gTWuQFE8syI10KnIBEdPzuEUSVEeZ0VFzRnZA=="], + + "@cucumber/gherkin": ["@cucumber/gherkin@30.0.4", "", { "dependencies": { "@cucumber/messages": ">=19.1.4 <=26" } }, "sha512-pb7lmAJqweZRADTTsgnC3F5zbTh3nwOB1M83Q9ZPbUKMb3P76PzK6cTcPTJBHWy3l7isbigIv+BkDjaca6C8/g=="], + + "@cucumber/gherkin-streams": ["@cucumber/gherkin-streams@5.0.1", "", { "dependencies": { "commander": "9.1.0", "source-map-support": "0.5.21" }, "peerDependencies": { "@cucumber/gherkin": ">=22.0.0", "@cucumber/message-streams": ">=4.0.0", "@cucumber/messages": ">=17.1.1" }, "bin": { "gherkin-javascript": "bin/gherkin" } }, "sha512-/7VkIE/ASxIP/jd4Crlp4JHXqdNFxPGQokqWqsaCCiqBiu5qHoKMxcWNlp9njVL/n9yN4S08OmY3ZR8uC5x74Q=="], + + "@cucumber/gherkin-utils": ["@cucumber/gherkin-utils@9.2.0", "", { "dependencies": { "@cucumber/gherkin": "^31.0.0", "@cucumber/messages": "^27.0.0", "@teppeis/multimaps": "3.0.0", "commander": "13.1.0", "source-map-support": "^0.5.21" }, "bin": { "gherkin-utils": "bin/gherkin-utils" } }, "sha512-3nmRbG1bUAZP3fAaUBNmqWO0z0OSkykZZotfLjyhc8KWwDSOrOmMJlBTd474lpA8EWh4JFLAX3iXgynBqBvKzw=="], + + "@cucumber/html-formatter": ["@cucumber/html-formatter@21.10.1", "", { "peerDependencies": { "@cucumber/messages": ">=18" } }, "sha512-isaaNMNnBYThsvaHy7i+9kkk9V3+rhgdkt0pd6TCY6zY1CSRZQ7tG6ST9pYyRaECyfbCeF7UGH0KpNEnh6UNvQ=="], + + "@cucumber/junit-xml-formatter": ["@cucumber/junit-xml-formatter@0.7.1", "", { "dependencies": { "@cucumber/query": "^13.0.2", "@teppeis/multimaps": "^3.0.0", "luxon": "^3.5.0", "xmlbuilder": "^15.1.1" }, "peerDependencies": { "@cucumber/messages": "*" } }, "sha512-AzhX+xFE/3zfoYeqkT7DNq68wAQfBcx4Dk9qS/ocXM2v5tBv6eFQ+w8zaSfsktCjYzu4oYRH/jh4USD1CYHfaQ=="], + + "@cucumber/message-streams": ["@cucumber/message-streams@4.0.1", "", { "peerDependencies": { "@cucumber/messages": ">=17.1.1" } }, "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA=="], + + "@cucumber/messages": ["@cucumber/messages@27.2.0", "", { "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", "uuid": "11.0.5" } }, "sha512-f2o/HqKHgsqzFLdq6fAhfG1FNOQPdBdyMGpKwhb7hZqg0yZtx9BVqkTyuoNk83Fcvk3wjMVfouFXXHNEk4nddA=="], + + "@cucumber/query": ["@cucumber/query@13.6.0", "", { "dependencies": { "@teppeis/multimaps": "3.0.0", "lodash.sortby": "^4.7.0" }, "peerDependencies": { "@cucumber/messages": "*" } }, "sha512-tiDneuD5MoWsJ9VKPBmQok31mSX9Ybl+U4wqDoXeZgsXHDURqzM3rnpWVV3bC34y9W6vuFxrlwF/m7HdOxwqRw=="], + + "@cucumber/tag-expressions": ["@cucumber/tag-expressions@6.1.2", "", {}, "sha512-xa3pER+ntZhGCxRXSguDTKEHTZpUUsp+RzTRNnit+vi5cqnk6abLdSLg5i3HZXU3c74nQ8afQC6IT507EN74oQ=="], + + "@electric-sql/pglite": ["@electric-sql/pglite@0.5.4", "", {}, "sha512-yYZUyyXrHU7tPlCjwZQJ6hIG9DscdCCn7Uk0mYKwC1FeHX286AbcmFveMiRBEak8e9iPupjsoVImN3yJZVed2g=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.7", "", { "os": "aix", "cpu": "ppc64" }, "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.7", "", { "os": "android", "cpu": "arm" }, "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.7", "", { "os": "android", "cpu": "arm64" }, "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.7", "", { "os": "android", "cpu": "x64" }, "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.7", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.7", "", { "os": "freebsd", "cpu": "x64" }, "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.7", "", { "os": "linux", "cpu": "arm" }, "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.7", "", { "os": "linux", "cpu": "ia32" }, "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.7", "", { "os": "linux", "cpu": "ppc64" }, "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.7", "", { "os": "linux", "cpu": "none" }, "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.7", "", { "os": "linux", "cpu": "s390x" }, "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.7", "", { "os": "linux", "cpu": "x64" }, "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.7", "", { "os": "none", "cpu": "x64" }, "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.7", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.7", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.7", "", { "os": "none", "cpu": "arm64" }, "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.7", "", { "os": "sunos", "cpu": "x64" }, "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.7", "", { "os": "win32", "cpu": "x64" }, "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg=="], + + "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="], + + "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="], + + "@floating-ui/react": ["@floating-ui/react@0.27.19", "", { "dependencies": { "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", "tabbable": "^6.0.0" }, "peerDependencies": { "react": ">=17.0.0", "react-dom": ">=17.0.0" } }, "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog=="], + + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="], + + "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], + + "@inlang/paraglide-js": ["@inlang/paraglide-js@2.20.2", "", { "dependencies": { "@inlang/recommend-sherlock": "^0.2.1", "@inlang/sdk": "^2.10.0", "commander": "11.1.0", "consola": "3.4.0", "json5": "2.2.3", "unplugin": "^2.1.2", "urlpattern-polyfill": "^10.0.0" }, "peerDependencies": { "typescript": ">=5.6" }, "optionalPeers": ["typescript"], "bin": { "paraglide-js": "bin/run.js" } }, "sha512-V8iY3uu/vQU94gEag1bdC3glMJSp4Dg3XMwfnabZLBh1Dv0F++DvDYlMeniqv2+nHbnS/twB75AM140OmpHDEg=="], + + "@inlang/recommend-sherlock": ["@inlang/recommend-sherlock@0.2.1", "", { "dependencies": { "comment-json": "^4.2.3" } }, "sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg=="], + + "@inlang/sdk": ["@inlang/sdk@2.10.2", "", { "dependencies": { "@lix-js/sdk": "0.4.10", "@sinclair/typebox": "^0.31.17", "kysely": "^0.28.12", "sqlite-wasm-kysely": "0.3.0", "uuid": "^14.0.0" } }, "sha512-O1ki72SNK6LPagaGrvlioBb1mWKvump7cO7P85hfGZjdFTmDdn3icI0A6MvaBsB3P9KQHAjzyubnN1OslGufTw=="], + + "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], + + "@istanbuljs/schema": ["@istanbuljs/schema@0.1.6", "", {}, "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + + "@lix-js/sdk": ["@lix-js/sdk@0.4.10", "", { "dependencies": { "@lix-js/server-protocol-schema": "0.1.1", "dedent": "1.5.1", "human-id": "^4.1.1", "js-sha256": "^0.11.0", "kysely": "^0.28.12", "sqlite-wasm-kysely": "0.3.0", "uuid": "^14.0.0" } }, "sha512-0dMInAJK/67guTG5rRZaCEhvzC5cCXENOjaePA5AqMXrCE97kaY7SRor9e2vnoGsFIiGqXKlT0MCIoZj36G0gg=="], + + "@lix-js/server-protocol-schema": ["@lix-js/server-protocol-schema@0.1.1", "", {}, "sha512-jBeALB6prAbtr5q4vTuxnRZZv1M2rKe8iNqRQhFJ4Tv7150unEa0vKyz0hs8Gl3fUGsWaNJBh3J8++fpbrpRBQ=="], + + "@mantine/colors-generator": ["@mantine/colors-generator@9.4.1", "", { "peerDependencies": { "chroma-js": ">=2.4.2" } }, "sha512-HEJAJACPfS5Y2XRf8ILOUpH7/nag7YN8v3SxGo+vTCyvWnNNqNM19V+weohrHSLnM+TLgHehFzHdG8CzmJkiXQ=="], + + "@mantine/core": ["@mantine/core@9.4.1", "", { "dependencies": { "@floating-ui/react": "^0.27.19", "clsx": "^2.1.1", "react-number-format": "^5.4.5", "react-remove-scroll": "^2.7.2", "type-fest": "^5.7.0" }, "peerDependencies": { "@mantine/hooks": "9.4.1", "react": "^19.2.0", "react-dom": "^19.2.0" } }, "sha512-lZWEICrum4+vwKxzh/mk4RB1N6BqZ0Cshdl6lhm7OYLiQzmOaxKtOgyaWz+vr65G8mqTXjalZalB+wmMVBYK2Q=="], + + "@mantine/hooks": ["@mantine/hooks@9.4.1", "", { "peerDependencies": { "react": "^19.2.0" } }, "sha512-eTI8wmzPx3r98zgKIEuvukmoGTHBhmtI6+9E6o2DbTmEU2eM1bCdjE2vFdf0op2AlRO0KEYEcZhNQi4T/SJk0A=="], + + "@noble/ciphers": ["@noble/ciphers@2.2.0", "", {}, "sha512-Z6pjIZ/8IJcCGzb2S/0Px5J81yij85xASuk1teLNeg75bfT07MV3a/O2Mtn1I2se43k3lkVEcFaR10N4cgQcZA=="], + + "@noble/hashes": ["@noble/hashes@2.2.0", "", {}, "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg=="], + + "@oozcitak/dom": ["@oozcitak/dom@2.0.2", "", { "dependencies": { "@oozcitak/infra": "^2.0.2", "@oozcitak/url": "^3.0.0", "@oozcitak/util": "^10.0.0" } }, "sha512-GjpKhkSYC3Mj4+lfwEyI1dqnsKTgwGy48ytZEhm4A/xnH/8z9M3ZVXKr/YGQi3uCLs1AEBS+x5T2JPiueEDW8w=="], + + "@oozcitak/infra": ["@oozcitak/infra@2.0.2", "", { "dependencies": { "@oozcitak/util": "^10.0.0" } }, "sha512-2g+E7hoE2dgCz/APPOEK5s3rMhJvNxSMBrP+U+j1OWsIbtSpWxxlUjq1lU8RIsFJNYv7NMlnVsCuHcUzJW+8vA=="], + + "@oozcitak/url": ["@oozcitak/url@3.0.0", "", { "dependencies": { "@oozcitak/infra": "^2.0.2", "@oozcitak/util": "^10.0.0" } }, "sha512-ZKfET8Ak1wsLAiLWNfFkZc/BraDccuTJKR6svTYc7sVjbR+Iu0vtXdiDMY4o6jaFl5TW2TlS7jbLl4VovtAJWQ=="], + + "@oozcitak/util": ["@oozcitak/util@10.0.0", "", {}, "sha512-hAX0pT/73190NLqBPPWSdBVGtbY6VOhWYK3qqHqtXQ1gK7kS2yz4+ivsN07hpJ6I3aeMtKP6J6npsEKOAzuTLA=="], + + "@openapi-contrib/json-schema-to-openapi-schema": ["@openapi-contrib/json-schema-to-openapi-schema@4.3.4", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.3.6", "json-schema-walker": "^3.3.1", "yargs": "^18.0.0" }, "peerDependencies": { "openapi-types": "*" }, "bin": { "json-schema-to-openapi-schema": "bin/json-schema-to-openapi-schema.js" } }, "sha512-HgCXkh8EyhTMGdT9fvdI7EAgHs9/9KS5SOpWHuqoerr6cyzaVYxCk+9ZX/ipfGP7nF0vFGnEt75siJ0vgLjbDQ=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.1", "", {}, "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.41.1", "", {}, "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA=="], + + "@oxfmt/binding-android-arm-eabi": ["@oxfmt/binding-android-arm-eabi@0.53.0", "", { "os": "android", "cpu": "arm" }, "sha512-XfVM8AmIovBTKXCt14Op5wbfcoM8418nttd+nhMgM3RAVaJg1MtJc73FyWfUt0oxLyBGVwfniNVUsbV/b3VmPg=="], + + "@oxfmt/binding-android-arm64": ["@oxfmt/binding-android-arm64@0.53.0", "", { "os": "android", "cpu": "arm64" }, "sha512-btHDfXckwdf9zgyAVznfZkf+GVyB0I1m1hlvaOMRx2xoyz3hphfPX97s89J3wfCN8QBETLtk4lQUaeOkrMuQOg=="], + + "@oxfmt/binding-darwin-arm64": ["@oxfmt/binding-darwin-arm64@0.53.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-k2RjMcSTkHjoOlsVGbL35JVzXL+oQco3GHPl/5kjebVF4oHNfE24In8F5isqBh9LBJucycWHKDXdGrCchdWcHQ=="], + + "@oxfmt/binding-darwin-x64": ["@oxfmt/binding-darwin-x64@0.53.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-65jIBE2H1l5SSs16fmv6/7b6sAx/WpvnsgDhVWK9qSjNFDUro7MPQ6q5UhpY7kl46yltfR046iAnxy/Bzqbiew=="], + + "@oxfmt/binding-freebsd-x64": ["@oxfmt/binding-freebsd-x64@0.53.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-oYe1gkz7U49PCYrS9147d2fJZj8mDI4Di6AvlsU5fu9p+Tq8S7qqOMSZjUiVTLX8bXuSA9Lk/tIxuegVjkNYRA=="], + + "@oxfmt/binding-linux-arm-gnueabihf": ["@oxfmt/binding-linux-arm-gnueabihf@0.53.0", "", { "os": "linux", "cpu": "arm" }, "sha512-ailB2vLzGi629tymdAb2VYJyEHref7oqGxP+tRBrtRBxQrb6NV55JMT7xtGZ8uTeG2+Y9zojqW4LhJYxQnz9Pg=="], + + "@oxfmt/binding-linux-arm-musleabihf": ["@oxfmt/binding-linux-arm-musleabihf@0.53.0", "", { "os": "linux", "cpu": "arm" }, "sha512-abh4mWBvOvD966sobqF7r103y2yYx7Rb4WGHLOS4+5igGqLbbPxS9aK5+45D6iUY7dWMsk3Muz9a8gUtufvqJA=="], + + "@oxfmt/binding-linux-arm64-gnu": ["@oxfmt/binding-linux-arm64-gnu@0.53.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-z73PvuhJ8qA+cDbaiqbtopHglA91U4+y5wn2sTJJrnpB957d5P33FEuyP3DQIFd7ofljmDmfVT4G0CVGHZaJWg=="], + + "@oxfmt/binding-linux-arm64-musl": ["@oxfmt/binding-linux-arm64-musl@0.53.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-I6bhOTroqc3ThrwZ89l2k3ivKuELhdPLbAcJhRNyjWvlgwb0vjRgEnVL1XLx5Jud04/ypNRZBykAWrSk6l/D+g=="], + + "@oxfmt/binding-linux-ppc64-gnu": ["@oxfmt/binding-linux-ppc64-gnu@0.53.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-w0p3JzB/PkkQjXALMJMqP9YfP3yq4w6zGsu5kezQmUnxRkN3b/Theg2l/nDgBsOcczxS3gL6Gam5XNAVrO6QJQ=="], + + "@oxfmt/binding-linux-riscv64-gnu": ["@oxfmt/binding-linux-riscv64-gnu@0.53.0", "", { "os": "linux", "cpu": "none" }, "sha512-mzBhF6k1Yq1K/dqDmVe/AAafnlJfEpx7yfUiksyeWXJk5iSzZqBSxcsa02zIytYgQFRZ7h6WPZfwHg/DoOE1Kw=="], + + "@oxfmt/binding-linux-riscv64-musl": ["@oxfmt/binding-linux-riscv64-musl@0.53.0", "", { "os": "linux", "cpu": "none" }, "sha512-AlFCpnRQhogQFzZXWbO6xB6/Udy745L+eQNmDPGg7G/OeWsYmJc4jZYfUN5pQg0reOPWSED2mOQqKZOJM1U8cA=="], + + "@oxfmt/binding-linux-s390x-gnu": ["@oxfmt/binding-linux-s390x-gnu@0.53.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-XD4ulY4f1DWbuuZXAqxhVn+gdPmrhnmojWtFN78ctVoupmS845fGhsUrk1HZXKQI+iymbaiz9vAjPsghHNQ7Ag=="], + + "@oxfmt/binding-linux-x64-gnu": ["@oxfmt/binding-linux-x64-gnu@0.53.0", "", { "os": "linux", "cpu": "x64" }, "sha512-xg8KWX0QnxmYWRe60CgHYWXI0ZOtBbqTsXvWiWrcl2XUHJ3fht2QerOk2iWvylzX3zNT2GpvBRxGoR4d3sxPRQ=="], + + "@oxfmt/binding-linux-x64-musl": ["@oxfmt/binding-linux-x64-musl@0.53.0", "", { "os": "linux", "cpu": "x64" }, "sha512-MWExpYBGvl+pIvVB/gj/CcWlN2al8AizT7rUbtaYaWNoQkhWARM6W3qpgoCr72CYSN9PborzPmM5MIRe2BrNdA=="], + + "@oxfmt/binding-openharmony-arm64": ["@oxfmt/binding-openharmony-arm64@0.53.0", "", { "os": "none", "cpu": "arm64" }, "sha512-u4sajgO4nxgmJIgc/y2AqPhkdbOkQH8WugXpA1+pW0ESQhvGZ1oGq61Q4xMbJHJU1hFgtO18QNrcFYDPYH0gwQ=="], + + "@oxfmt/binding-win32-arm64-msvc": ["@oxfmt/binding-win32-arm64-msvc@0.53.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yq9sOZoIOJ5xPjO0qOyHJS4CiPuTkB2en9auxZz7Ar2p5RaC7BzLyVVmAA7zz9/L9YnjjY1DwNxN+ivKXimN/A=="], + + "@oxfmt/binding-win32-ia32-msvc": ["@oxfmt/binding-win32-ia32-msvc@0.53.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-es1fVNZEkBqEcQtBpn19SYFgZF7FawlkCjkT/iImfEAus4gun8fBwB1E9hpV5LcR9B0DBNvRIXhW8BQk3JaE+Q=="], + + "@oxfmt/binding-win32-x64-msvc": ["@oxfmt/binding-win32-x64-msvc@0.53.0", "", { "os": "win32", "cpu": "x64" }, "sha512-QFmJs2bEu9AO4O6qsmEaZNGi6dFq8N+rT8EHAAnZIq/B9SeJDUbc4DzVxQ48MfDsL7D3sCZzo37zuTuspcURgg=="], + + "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.72.0", "", { "os": "android", "cpu": "arm" }, "sha512-zhCmvn+1Mj3UchAc/90i99S0t7jJUsHmFVSPg4UWrjO8b8eaSGwscgO6QAUtvHBstkjQwBttQNswEnAF1mIQdA=="], + + "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.72.0", "", { "os": "android", "cpu": "arm64" }, "sha512-mtH+aY/ozv1eZoCUC2owjFAtyNBKHpJHygKeEu9zXXnQGW1Q2/qOpvx+I+Lf23+TvTz66F4iiXUbl2cGvoLPCQ=="], + + "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.72.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EvnajNPDtfknB3ZieeOOyDTwJn9QXDiwfnF4ZDQqART6RG6hjY4WigQcZdGoK2dkB3e1vrmEzN9aYbQCUkh/gQ=="], + + "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.72.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZkCdEa/G80A7vEHfeCDz/+L3m33DE73v32mDKhgOIgz8Uwf0DFcK7+uu6qC+7LEhmz5fpOe1osWKyjSNMydFIQ=="], + + "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.72.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-NroXv2vh+sxVY1uya/rM5pjhx1hm8BzlYpx9q67QP0Xhw5MH2bf5GJylpvLEC+781p1Xli/317EoV9AlGwViag=="], + + "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.72.0", "", { "os": "linux", "cpu": "arm" }, "sha512-0NDywYgfj279Ou/BcQuCYSj7NJwBfmWn5qc5uGO/Ny7fUWmXyIpvawqX/8acQlWG6IXelJsJhj+JAy6sjsKj0A=="], + + "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.72.0", "", { "os": "linux", "cpu": "arm" }, "sha512-4vpXB06h65Ezsy4hRyrGjGrfa1SkVPii09yaajiYhmVpgsFiLD+KNxIx/BNAY+XiO+i1yqp9HHdwqM8VTqa5XQ=="], + + "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.72.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-immaN4g2ZGFiOkKrvRX9LvzZdd2GkQM5wR+UyzYyUuyhUTXGQ4HKUJH18xp4G8OfhCVaVAJfKZxwE1r8+4hhaQ=="], + + "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.72.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-JGHS9Mnr7iWyyLDxgCv1MhzVpAckgptg00F2gnxt/GD7lQ2SW1BRcxHqhSTaSdDpjWRrBkBxMMh4+Hn3aVtExg=="], + + "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.72.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-AOYgBZqxNshrg83P9v0RYv+m8s10Cqkj4/PxXFDhcS3k7FqsIG5+CxErshZCIN7G8iy4Y+VGfAsuEdar8AcbBg=="], + + "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.72.0", "", { "os": "linux", "cpu": "none" }, "sha512-QMybPS5ij3/vrKG67mqzHwW++91sYxK/PPUVi6SBtNCEzW4niS52fVBdXbQ6nou0wWbUPEpx8Sl/ZjtgE3clXA=="], + + "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.72.0", "", { "os": "linux", "cpu": "none" }, "sha512-gOc3W7JV0PXRpIL7stUlLe3Wa9Gp0Kdlup87IT3gHDvPKck2xNgMIl/Gs2lldYY2lyXZDC4rWi3hmoLUobkgbQ=="], + + "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.72.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-rpGxph+FjjHcYI5q6uxB3Az+tnfmEnDbSA8+PK9ZE/VzyUAkvBOMeuY7ZQMhu5mpZH7YQDsTdW6Cx4kV/msc6w=="], + + "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.72.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WND+uhf/Ko13SLqQMWQUgsZuLvYYEvL0ZKgg0tgGYfLqxG7l8Ju123fHDMJyYSDl5E3bUbpFUuii/OvMreFQzw=="], + + "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.72.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SrpbrUL70nG9vh6zP4/oKHWgLuHquwsr7MW9XOn0olBVgh10Uqr8qscKhQoBGEn6olK/IUpn5GSKcdQ5AjUhGA=="], + + "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.72.0", "", { "os": "none", "cpu": "arm64" }, "sha512-qkrsEn6NmgFKr7U/QnezQMb+q/vzAy0Dd9Y95gQGQTyjzDLN+HRZMuM5u70iyH4nBLCfKBzhjMsYCehKay2jyg=="], + + "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.72.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-LWR6ZlFZph+KPjXv8opgZsXRDCdrdQe8VL8Cg9zxCoBS73h6znzZpydVgmdnwj8mB9AuSM5jxEgDJDpQkjboeg=="], + + "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.72.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-yt6HEh7IsHvtjRWtmeZRX134eaXKHq5Gnqlf1xBJdJl1JtdoRUEJw3nAxpZoUDS860cX/foKbztO441anVBtVQ=="], + + "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.72.0", "", { "os": "win32", "cpu": "x64" }, "sha512-b2eKFD2hX7tIwmo/cyH6TDq8vzWRZ2qNHrzoGntUTmq0h3zQh/uX3eTSHCwI8OB/ADQfJCRelLItK8BsxuucDA=="], + + "@pikku/addon-console": ["@pikku/addon-console@0.12.26", "", { "dependencies": { "json-schema": "^0.4.0", "open": "^10.0.0" }, "peerDependencies": { "@pikku/core": "^0.12.54" } }, "sha512-ne5FKEja3YvQNCVIbPFwnbov+nTWeDeX20ugYyRJMH3eLqbb+L2dt9yfiKxw99I+oNlLkxfj0jADyOKAJg4H2A=="], + + "@pikku/ai-vercel": ["@pikku/ai-vercel@0.12.7", "", { "peerDependencies": { "@pikku/core": "^0.12.44", "ai": "^6.0.0" } }, "sha512-+7tqGiKr/9MarrAsoQGiEi1EQFmwcUX/NAobahE2/W27TstmcjhjSCluziir7oKRMqitTFL8shq3lq/NG2SRUw=="], + + "@pikku/assistant-ui": ["@pikku/assistant-ui@0.12.7", "", { "dependencies": { "@assistant-ui/react": "^0.12.12 || ^0.14.0", "react-markdown": "^10.1.0" }, "peerDependencies": { "react": "^18 || ^19", "react-dom": "^18 || ^19" } }, "sha512-Ye/3YCe0yyEALzs1lVP8vruLVF3OigktpRHpiyRyqTng8Ekwzxmxww6wEeXVVpxXO51s8ewHgGn5NL/+IGOJlg=="], + + "@pikku/better-auth": ["@pikku/better-auth@0.12.16", "", { "peerDependencies": { "@pikku/core": "^0.12.52", "better-auth": "^1.6.0" } }, "sha512-IWrEoX/JehrDmO40vJaHn6neOp1TuXG6ypVxsrdyh45VHxy5oZh4KcqVDX4Rb4+/MAIaZZvNZpHdSG7aolSBtg=="], + + "@pikku/bun-server": ["@pikku/bun-server@0.12.4", "", { "peerDependencies": { "@pikku/core": "^0.12.52", "@pikku/modelcontextprotocol": "^0.12.6" }, "optionalPeers": ["@pikku/modelcontextprotocol"] }, "sha512-2y2Wb3OGWNqgO04oLbWm1irFREjPkLnmUUEgYoTzme93epN5JARqlHoFb3yHKo3S8SgIS68bnx6/gBfD9QuVtw=="], + + "@pikku/cli": ["@pikku/cli@0.12.76", "", { "dependencies": { "@electric-sql/pglite": "^0.5.1", "@jridgewell/trace-mapping": "^0.3.25", "@openapi-contrib/json-schema-to-openapi-schema": "^4.3.1", "@pikku/better-auth": "^0.12.15", "@pikku/bun-server": "^0.12.4", "@pikku/deploy-cloudflare": "^0.12.8", "@pikku/fetch": "^0.12.6", "@pikku/inspector": "^0.12.38", "@pikku/kysely": "^0.13.0", "@pikku/kysely-node-sqlite": "^0.12.3", "@pikku/node-http-server": "^0.12.5", "@pikku/openapi-parser": "^0.12.11", "@pikku/schedule": "^0.12.3", "@pikku/ws": "^0.12.3", "@types/cookie": "^1.0.0", "@types/json-schema": "^7.0.15", "chalk": "^5.6.2", "chokidar": "^4.0.3", "esbuild": "~0.27.0", "istanbul-lib-instrument": "^6.0.3", "open": "^10.2.0", "openapi-types": "^12.1.3", "path-to-regexp": "^8.3.0", "pg": "^8.13.0", "tinyglobby": "^0.2.12", "ts-json-schema-generator": "2.9.1-next.16", "tsx": "^4.21.0", "typescript": "^6.0.3", "ws": "^8.18.0", "yaml": "^2.8.2", "zod": "^4.3.6", "zod-to-ts": "^2.1.0" }, "peerDependencies": { "@pikku/core": "^0.12.57" }, "bin": { "pikku": "dist/bin/pikku.js" } }, "sha512-6yoMXerz5G6vVOSs5UsnKg575Mg/NYXDit/bLVtgoAobM7TvtaUnSevyzMkQ2E9/F3lSdqVZ9SYim7t3kObI8Q=="], + + "@pikku/core": ["@pikku/core@0.12.57", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/json-schema": "^7.0.15", "cookie": "^1.1.1", "json-schema": "^0.4.0", "path-to-regexp": "^8.3.0", "picoquery": "^2.5.0" } }, "sha512-kmwm98bzFjgPbDa5KMhFwo/3JA+/c/5iVpZRq15UwiiMWw6N9yz7/mkzpx4rGsH0o2ZwCwnMJTolWHqb2Arxmg=="], + + "@pikku/cucumber": ["@pikku/cucumber@0.12.12", "", { "dependencies": { "@pikku/fetch": "^0.12.6" }, "peerDependencies": { "@pikku/core": "^0.12.54", "@playwright/test": "^1.50.0" }, "optionalPeers": ["@playwright/test"] }, "sha512-KIvu6yQEXTnJD3dezEawRxolftTm+O3u+vetzYaJarZ2aIesSoqefggc3Er6ioh0g/ogIqMCviL4uyetFD7ccw=="], + + "@pikku/deploy-cloudflare": ["@pikku/deploy-cloudflare@0.12.8", "", {}, "sha512-Y+djtVKLyndtYu3y3UrhDU0Gul2+mIF6b9YSE46M6bRQeGE+289d5Ds09jesWKqIgTNHNgUmlQT36E9/kWMalQ=="], + + "@pikku/deploy-standalone": ["@pikku/deploy-standalone@0.12.7", "", {}, "sha512-LT0vK2hOKtJquiE7OlbLWDkfX5mwIu8Q5tYVwLdv42XGlChvM5iAj2Xhl9LYbZvvnLf83OoyIGE2SW1h9VIS2w=="], + + "@pikku/fetch": ["@pikku/fetch@0.12.6", "", {}, "sha512-kObe7ySc2+Hf4GsmLQ7JTAVYdk8nyHOxdm6nGbXAYqqK5n9rhreEy4m/QmhU5sRn4rq5HNHukhE28N7GxjQW9A=="], + + "@pikku/inspector": ["@pikku/inspector@0.12.38", "", { "dependencies": { "@openapi-contrib/json-schema-to-openapi-schema": "^4.3.1", "openapi-types": "^12.1.3", "path-to-regexp": "^8.3.0", "ts-json-schema-generator": "2.9.1-next.16", "tsx": "^4.21.0", "typescript": "^6.0.3", "zod": "^4.3.6", "zod-to-ts": "^2.1.0" }, "peerDependencies": { "@pikku/core": "^0.12.54" } }, "sha512-Bs5byUQ0shzkxPWwjx0CGU1cYttxQbvMAokEFWTka6CQmpD6KVJjqwoW4+OziVIYPiv4gmj0cq+dEZmt1+PMeQ=="], + + "@pikku/kysely": ["@pikku/kysely@0.13.0", "", { "dependencies": { "kysely": "^0.29.0" }, "peerDependencies": { "@pikku/core": "^0.12.44" }, "bin": { "pikku-kysely-pure": "dist/bin/pikku-kysely-pure.js" } }, "sha512-gahQ8d4OCNh/mYP85a0Y8r2o8ONEtxkT63zetJirjkvaYS44CHI4m0UzL19TeMWZt0yxpdcOBcGB76a3lSNoIw=="], + + "@pikku/kysely-node-sqlite": ["@pikku/kysely-node-sqlite@0.12.3", "", { "dependencies": { "@pikku/kysely": "^0.13.0", "@pikku/kysely-sqlite": "^0.12.7", "kysely": "^0.29.0" }, "peerDependencies": { "@pikku/core": "^0.12.44" } }, "sha512-Wsix3N/DVURKHPx+5VSoqsxCt1ZQWucJbi2TRyMwzwTc5QbAk2/gaGpL3zDZSh2fTmeYNM3iwr2EEQHEuMvUag=="], + + "@pikku/kysely-sqlite": ["@pikku/kysely-sqlite@0.12.8", "", { "dependencies": { "@pikku/kysely": "^0.13.0", "kysely": "^0.29.0" }, "peerDependencies": { "@pikku/core": "^0.12.54" } }, "sha512-gBbQdoZXNzf30CP5ZDv8w7Sc3gKp/a+ZNM9oAvzPofwLoYY/oXXr3YbuvI4f7VQtwDXEHbYNYRFC6HlNYSsukg=="], + + "@pikku/mantine": ["@pikku/mantine@0.12.6", "", { "peerDependencies": { "@mantine/core": "^8 || ^9", "@mantine/hooks": "^8 || ^9", "@pikku/react": "^0.12.5", "react": "^18 || ^19", "react-dom": "^18 || ^19" } }, "sha512-tcnDQodFgk9EVArYHoVtvfQf9aVlnzCI0adjb5Bg0w3xsdoQvDSupCGC7w8uChkSVWVSzHEbhw1MqHZf7X5BVA=="], + + "@pikku/node-http-server": ["@pikku/node-http-server@0.12.5", "", { "peerDependencies": { "@pikku/core": "^0.12.52", "@pikku/modelcontextprotocol": "^0.12.5" }, "optionalPeers": ["@pikku/modelcontextprotocol"] }, "sha512-+i+ZIq4WuZEXegB+VGuxsrHQdTX5Hd0kOc3/SfZJ4tFUCtXvtZir57cYPkeGIdWfb8k/kYzgMHzXoHUe8E36qg=="], + + "@pikku/openapi-parser": ["@pikku/openapi-parser@0.12.12", "", { "dependencies": { "yaml": "^2.7.1" } }, "sha512-jdHftUC487LMHkSuv87KM0lQOySKteqYXPIZdCDE0GcLxE67MkP5RZQ98ZO+ZJbtJGcnivSmHupnSTSMLq4lxA=="], + + "@pikku/react": ["@pikku/react@0.12.5", "", { "dependencies": { "@pikku/fetch": "^0.12.6" }, "peerDependencies": { "react": "^18 || ^19", "react-dom": "^18 || ^19" } }, "sha512-BkcpgWZzRV65XUrobwlxH9ArRfSnMQzONrj/h2A7TKYZuY9qF5+LwDR7ZZB1WvBJXHgdXinjnzqnqYSDM2jOfw=="], + + "@pikku/schedule": ["@pikku/schedule@0.12.3", "", { "dependencies": { "cron": "^4.4.0", "cron-schedule": "^5.0.4" }, "peerDependencies": { "@pikku/core": "^0.12.44" } }, "sha512-a05AhSW435Az08otr5FKP+wZ0rMm/5re5iDX63/cBz5tNnBlQBKevjXVsNj5JLo0001tuWc5DQxbwAsjYIU/RQ=="], + + "@pikku/schema-cfworker": ["@pikku/schema-cfworker@0.12.4", "", { "dependencies": { "@cfworker/json-schema": "^4.1.1" }, "peerDependencies": { "@pikku/core": "^0.12.57" } }, "sha512-BMHpzVgWNMr08ovDdet7lTUlE7tG8TamupIuDp5iW7pibQb2xdkHpfcYdzMt7sB1AnQ5JdBeQ6uYG0dY4GRaBA=="], + + "@pikku/ws": ["@pikku/ws@0.12.3", "", { "dependencies": { "cookie": "^1.1.1" }, "peerDependencies": { "@pikku/core": "^0.12.44", "ws": "^8.18.0" } }, "sha512-9q83PIzGg5IX9SoETyErKTMHanv6qO780Tm5kYGVvjxvOMhITrC/d4mt/G6TK7pls1CiGQw9awr8N+wp8+jS1A=="], + + "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], + + "@playwright/test": ["@playwright/test@1.61.1", "", { "dependencies": { "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" } }, "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig=="], + + "@project/app": ["@project/app@workspace:apps/app"], + + "@project/components": ["@project/components@workspace:packages/components"], + + "@project/e2e": ["@project/e2e@workspace:e2e"], + + "@project/functions": ["@project/functions@workspace:packages/functions"], + + "@project/functions-sdk": ["@project/functions-sdk@workspace:packages/functions-sdk"], + + "@project/mantine-themes": ["@project/mantine-themes@workspace:packages/mantine-theme"], + + "@radix-ui/number": ["@radix-ui/number@1.1.2", "", {}, "sha512-ceTwaxc4I5IOi97DgCotl3pqiyRGvffcc0oOsE2dQYaJOFIDsDt4VWG6xEbg1QePv9QWausCEIppud/tJ1wNig=="], + + "@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="], + + "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.11", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HQDOFTKwSnmUij6l54wYJJtxTAnxI71+YJLOrjm2ladFB8HAV5Jt7hwaZPhWTGBkYoW4+ZAOfNZrLDh/qvxSYA=="], + + "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collapsible": "1.1.15", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-24Zz/0SYx8F2bSVThBnQrdJs2VbKelyuJordcFRRdA0fRAhrq/wSegGCqaQz34VQoiWqSMGYCYXEhynLSlyQlg=="], + + "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dialog": "1.1.18", "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-6c2cXpNlAgHDhKguK24XcWHHayMpK+lk7/WwBXBco+ZJ4Dv7xP++GBM280KgTD/HCRu3jSdfe8WQiZssonYaIA=="], + + "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.11", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Kdil9BB1rIFC/khmf4hC35bn8701AJcizTU7G7cUbEbk5XqqbjDuHW60uUfKqO5WojjZcbAW51Q7P0hRmMLw8A=="], + + "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.11", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-IUAhIVpBUvP5NNICjlaB1OFmtRLGqQqTF3ZOSGPoq3XeLXRFtHiWTRxSVEULgOd9GQR2c7tsYqDnhUennapZnw=="], + + "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.2.1", "", { "dependencies": { "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-is-hydrated": "0.1.1", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-+8PWoLLZv3AVb5m0pvoiOca/bQGzc9vPVb+982HB2x3Un0DpYEPM3zLMl4oqRpBsocJuNqLkiv/HXTnTrlwr4g=="], + + "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-eUEUoGMDpfkgHWSE97ZZaUJtzR1M7EKnNIpD1Q16+8JR9NWghcaqMulx9PuCQ720w0UclfYn6FEbCdd5Hx087g=="], + + "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-8A1zibu5skAQ+UVbaeNH5hVMibiFCRJzgMuM14LTWGttnTZKQL9jwYnhAbHRuxrtCqPXa4JvvnVUq1pTNgyZYw=="], + + "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.11", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-djW9+zeg137KQdlPtmE8xnaD+K2rcXXMWFrSg0hsmYZ6HRbdTA7tDHFgpaW9+huWVEu0RCabL+985T4TA0BE7g=="], + + "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA=="], + + "@radix-ui/react-context": ["@radix-ui/react-context@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg=="], + + "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.3.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-menu": "2.1.19", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qzsA/ZPhF6yMxBOTIk1nlCkoy2mswSbwYL+ErBa2iP0s4WWrlxmczArYqMcpVfEjmM7KJj/ADPXky0yZfbSxtQ=="], + + "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.11", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-apa28mldjMgORmE6g/w3sCcA0Y9UAVeeDVoozN4i7kOw12mLl9RBchfzK3Nn6qxOWjrZhK1Lfy7f07kyzxtnBw=="], + + "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA=="], + + "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-effect-event": "0.0.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4lUhWTWAjbDIqFrAPWJ3WqBOpO5YchVZ88X3nh6H9Lu5AFi5nCUeTPj3D8FSDmabmFeRe9ME0BDA4MwKTha5GQ=="], + + "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.19", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-menu": "2.1.19", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-HZccBkbK0LOi8nYKIp5jll/zIRW0cCOmG6WWyqsSpmXCU+ZlcBbTqIwlBvPCu886C5RVu6c/kHV7xSP8IgYNHw=="], + + "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q=="], + + "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.11", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Mn88Vg2whaRocGJNOH+DKFqYm6ySFPQaiwHNxZPyjn99B52KAEJWWY9NP83+nWdk2HM3rdov+STu9AG471Rt9w=="], + + "@radix-ui/react-form": ["@radix-ui/react-form@0.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-label": "2.1.11", "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0mTMJHv1gQAuEQoq5VDpTD3MRgmfUFdXAVFhpqR7wBeUr+tyRsof0wv/4XdPHLwQrefhoH2FiGHCggrCJhalIw=="], + + "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-popper": "1.3.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-rt+Fx4HoCeEwFL2IdoV2QaPltqDLlzxN77i9nwB3Y70scFlfAHh1QCdE2TXKuFJtA1TNygb0oivnFBZifgtZOw=="], + + "@radix-ui/react-id": ["@radix-ui/react-id@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA=="], + + "@radix-ui/react-label": ["@radix-ui/react-label@2.1.11", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3PKvDDxOn62k0oV1n4QtNtD2vpu+zYjXR7ojLBPaO6SPvhy53yg0vAmgNeBQeJW5rV3dffoRG+HYfLBZuzw0CQ=="], + + "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.19", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.11", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Mht9BVd1AIsNFVQr4KG3bIK7XQn5IXF0TL/2ObsrzOdc1loaly/+kBDL5roSCYn8j8XZkvpOD0WYLz2FQtH1Eg=="], + + "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.19", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-menu": "2.1.19", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Glt6mebxcgQvLeVkH3HiqV5bgQubE+31ELxLs7q0GlYI5k0XYkOkeuPrhXoylxK8eufvIt9CJjzY1TfFMXK3qw=="], + + "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.17", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-fYeYQvbeNn5AQk2RBbpO7koLm2YbS00UYxC/IL2sgLlninEH5UNIv+X3E0KJ1Vy4WIo+dhN9w8GNqSHhbHWCIg=="], + + "@radix-ui/react-one-time-password-field": ["@radix-ui/react-one-time-password-field@0.1.11", "", { "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-is-hydrated": "0.1.1", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Rsgab65u73E5kPVh8OS6PgPwJgPyf08GFfJDGAbMdF4DL7CgDhFOaDnXuk/DiMEVF6kgQwl0oJmFklvipmiOLg=="], + + "@radix-ui/react-password-toggle-field": ["@radix-ui/react-password-toggle-field@0.1.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-is-hydrated": "0.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pQ3xGp/uemomASPH97Eb3shfXX8QlG11bBJyEvRBV+vwtO4HvQlS06Yj9f31Ao7XepvF98SFrRgVDQ7jv+2xjQ=="], + + "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.11", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qdXDes+eHlnMUGlBAAAe5EG7oOQvqsXuq4mq585diMudg80iB+jHbsSeG3+Q4eWNsogNyhqU2p/3i+Y0iEepqg=="], + + "@radix-ui/react-popper": ["@radix-ui/react-popper@1.3.2", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-rect": "1.1.2", "@radix-ui/react-use-size": "1.1.2", "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3QXNeMkdshed1MR3LNoiCirBywRFPkD8ETJa/HlPuLwSajaQixf2ro+isoDNJlGABg9ug41XuZpINZJIle4XWg=="], + + "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.13", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-z3oXfmaHLJTF1wktbjgD6cn9jiEbq3WSondB10LIuIt2m2Ym4iJlrW04/euMwENDdWDdE7z+OuY7Qyp1YpRSwA=="], + + "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.6", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ=="], + + "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.7", "", { "dependencies": { "@radix-ui/react-slot": "1.3.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bC3NiwsprbxKjuon9l7X6BUTw7FPVzEYaL92MPEY5SCd/9hUTPXVFtVwRix7778wtRsVao+zE062gL79FZleeQ=="], + + "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.11", "", { "dependencies": { "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-KqiGJcFaZDc+BvveAgU3ZhACg2MvSUDrCBx4lRR/ZVRNal0bvt8lBpvnSkep9heeOuF8Qfw3fszLDX4OpQ2NVw=="], + + "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.4.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-W8Uo9riHnlzLLWy+r2mVHUyuEWqD/+be4PZzbEvaGoFSBDHkm+GYWjtcE6u3AmPKNyfanWpnVfpZ2GqPCdzzsw=="], + + "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-8Qcnx9447tx/aCBgw6Jenfqg4Skq+vqab9mCBmuGNipIS5YXvL275wbKEu7+ICYHIlAPgCduUMJH1XOYewKF6Q=="], + + "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.13", "", { "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7tncSubo2G0UY1e8rk+72qe3XRzrGnOLtZQ1PL1KoBfRUNX0NrJT5akb+0kfwSCc3gVR4wdHqyhAQBDpDNOwDw=="], + + "@radix-ui/react-select": ["@radix-ui/react-select@2.3.2", "", { "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.11", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.7", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-brXD6C/V0fVK0DDbscLVw6LsXrjQ+ay8jdOBaN+tLb4vsHsAMm6Gt6eT77wHX1Eq8GPtD5rJ+RxFtfDozsb4+Q=="], + + "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.11", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-jRhe86+8PF7VZ1u14eOWVOuh2BuAhALg/FT1VcMC4OHedMTRUazDnDlKTt+yxo5cRNKHMfmvZ4sSQtWDeMV4CQ=="], + + "@radix-ui/react-slider": ["@radix-ui/react-slider@1.4.2", "", { "dependencies": { "@radix-ui/number": "1.1.2", "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qt5C1ppJz66aUDrH1VccjPrq7aFchK0wBrn6xsxlCHNUyE57dRRQ7lp1QFpF7OscMexZF8MCGBTVBlENHPkNiA=="], + + "@radix-ui/react-slot": ["@radix-ui/react-slot@1.3.0", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA=="], + + "@radix-ui/react-switch": ["@radix-ui/react-switch@1.3.2", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tgRBI3DdNwAJYE4BBZyZcz/HRRCvAsPkRvG1wvKc+41tBGMxPn/a87T/wikXAvyDypNQ9kaZwHbeZe+veHCGpA=="], + + "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-v3Ab2l7z6U7tRB4xA0IyKdq0OsqaO1o9ZjsIEoKKnSZ/l96mZz8aCTX0NCXw+YVHJXr8Km4d+Mn6/Q8YjXa+gw=="], + + "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.18", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YNEnTHV47hPep+U0QvVM02OJNka9uygREc+k4Nh5VSZBg4MmE+myI442x3hCGfRpX7N2WSSYSJKws4gE+Z8lgg=="], + + "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bI2ILJrzwgmAsH05TsJ9pVrzqQwAip7OM2/krqAdYn0R16bl86UPWbe5VPHsALat0EnqpV01cGtkleaUKPNdNg=="], + + "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-toggle": "1.1.13", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TK1vusNKb8IRhF23FTbRgUNZ9zfs5rGIyI7LfR3h26p9LrQ060i0uW9QWeD8baZMddaaP0DBGlIa6pbZG+mitg=="], + + "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-separator": "1.1.11", "@radix-ui/react-toggle-group": "1.1.14" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-L/EkWVqlnj3lL2toHh4C7PwH2jxfa7OCq6lGfXSCii99ve2S4Ux5rc9HnOa7LN9exHa/Nl9kmCAmP9BuDPy5UA=="], + + "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-8XZ6Py3y3W2nEzAUGCN5cfVKaUi+CVApcz1d6lrNVVf2hvYEixMRkq8k9ggPKnQUpRRuOV5avt8uvxViH2jLwA=="], + + "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw=="], + + "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.3", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA=="], + + "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.3", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA=="], + + "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.3", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-3wEkMiPHXha/2VadZ68rYBcmYnPINVGl4Y3gtcM7fKRjANk0OscK+cdqBgUWdozb7YJxsh0vefM7vgAMHXOjqg=="], + + "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-qwOiz4Tjo8CNnrOLAYUMXeZwDzXgXpvK4TKQPmWLECM9XoWvA6+0Z2/7Ag3A4ivjS4ovbLJPbskkxioFyBhr8A=="], + + "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], + + "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw=="], + + "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.2", "", { "dependencies": { "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw=="], + + "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w=="], + + "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1wNZBggTDK3GRuuQ6nP4k2yi7a6l7I5qbMPbZcRsrGsGVead/f/d5FhEzUvqFs0bcrDLx7n1zKQ3JvLR6whaaw=="], + + "@radix-ui/rect": ["@radix-ui/rect@1.1.2", "", {}, "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA=="], + + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.62.2", "", { "os": "android", "cpu": "arm" }, "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.62.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.62.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.62.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.62.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.62.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.62.2", "", { "os": "linux", "cpu": "arm" }, "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.62.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.62.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.62.2", "", { "os": "linux", "cpu": "none" }, "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.62.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.62.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.62.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.62.2", "", { "os": "none", "cpu": "arm64" }, "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.62.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.62.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.62.2", "", { "os": "win32", "cpu": "x64" }, "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA=="], + + "@sinclair/typebox": ["@sinclair/typebox@0.31.28", "", {}, "sha512-/s55Jujywdw/Jpan+vsy6JZs1z2ZTGxTmbZTPiuSL2wz9mfzA2gN1zzaqmvfi4pq+uOt7Du85fkiwv5ymW84aQ=="], + + "@sqlite.org/sqlite-wasm": ["@sqlite.org/sqlite-wasm@3.48.0-build4", "", { "bin": { "sqlite-wasm": "bin/index.js" } }, "sha512-hI6twvUkzOmyGZhQMza1gpfqErZxXRw6JEsiVjUbo7tFanVD+8Oil0Ih3l2nGzHdxPI41zFmfUQG7GHqhciKZQ=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@tanstack/devtools-event-client": ["@tanstack/devtools-event-client@0.4.4", "", { "bin": { "intent": "./bin/intent.js" } }, "sha512-6T5Yop/793YI+H+5J8Hsyj4kCih9sl4t3ElLgKioW5hk3ocn+ZdSJ94tT7vL7uabxSugWYBZlOTMPzEw2puvQw=="], + + "@tanstack/form-core": ["@tanstack/form-core@1.33.0", "", { "dependencies": { "@tanstack/devtools-event-client": "^0.4.1", "@tanstack/pacer-lite": "^0.1.1", "@tanstack/store": "^0.11.0" } }, "sha512-AV4Pw9Dk4orFsuPBcDssfWMJFs+yMYBae7zZ4oTqrCf4ftNGQKxvrQRZeqKHG6A4TkiLeSvf2kzIjcVkrW7E6w=="], + + "@tanstack/history": ["@tanstack/history@1.162.0", "", {}, "sha512-79pf/RkhteYZTRgcR4F9kbk84P2N8rugQJswxfIqovlbRiT3yI7eBE+5QorIrZaOKktsgzRlXh1l/du/xpl4iA=="], + + "@tanstack/pacer-lite": ["@tanstack/pacer-lite@0.1.1", "", {}, "sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w=="], + + "@tanstack/query-core": ["@tanstack/query-core@5.101.2", "", {}, "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw=="], + + "@tanstack/react-form": ["@tanstack/react-form@1.33.0", "", { "dependencies": { "@tanstack/form-core": "1.33.0", "@tanstack/react-store": "^0.11.0" }, "peerDependencies": { "@tanstack/react-start": "*", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@tanstack/react-start"] }, "sha512-unaee+VS4MvKo+s1dmgGUXI4902VeAhuaUbKsQbhFe3MceOpB3JpAUGCDpyzjQPXVFkFY0COKfLrUNX2XZYW4g=="], + + "@tanstack/react-query": ["@tanstack/react-query@5.101.2", "", { "dependencies": { "@tanstack/query-core": "5.101.2" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg=="], + + "@tanstack/react-router": ["@tanstack/react-router@1.170.17", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/react-store": "^0.9.3", "@tanstack/router-core": "1.171.14", "isbot": "^5.1.22" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-ppLkjCfSMaeug9rmFRYzOd4TIqWV+yTE7tzIny7alJsSnM7w4lzEZm6eqCehG0SPetpZ0R3K+UnanSmBgOAVcQ=="], + + "@tanstack/react-start": ["@tanstack/react-start@1.168.27", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/react-start-client": "1.168.15", "@tanstack/react-start-rsc": "0.1.26", "@tanstack/react-start-server": "1.167.21", "@tanstack/router-utils": "1.162.2", "@tanstack/start-client-core": "1.170.13", "@tanstack/start-plugin-core": "1.171.19", "@tanstack/start-server-core": "1.169.16", "pathe": "^2.0.3" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", "@vitejs/plugin-rsc": "*", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "vite": ">=7.0.0" }, "optionalPeers": ["@rsbuild/core", "@vitejs/plugin-rsc", "vite"] }, "sha512-rdGFDqfCW71gyofyAxaYxhelNKmeVjpmbpm0uFYbNHORCa///4aBxi7B7ecShibKv9O4GfJ66MPX5F0ozbm+ig=="], + + "@tanstack/react-start-client": ["@tanstack/react-start-client@1.168.15", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/router-core": "1.171.14", "@tanstack/start-client-core": "1.170.13" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-pW50PHvadgi50iNCw6deUOvqc9rzs30SstyFZY2tcS9z1XlqTlELSvGowjxdu2m0ymtqm1emj1jau1iP7+3+PQ=="], + + "@tanstack/react-start-rsc": ["@tanstack/react-start-rsc@0.1.26", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/router-core": "1.171.14", "@tanstack/router-utils": "1.162.2", "@tanstack/start-client-core": "1.170.13", "@tanstack/start-fn-stubs": "1.162.0", "@tanstack/start-plugin-core": "1.171.19", "@tanstack/start-server-core": "1.169.16", "@tanstack/start-storage-context": "1.167.16", "pathe": "^2.0.3" }, "peerDependencies": { "@rspack/core": ">=2.0.0-0", "@vitejs/plugin-rsc": ">=0.5.20", "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0", "react-server-dom-rspack": ">=0.0.2" }, "optionalPeers": ["@rspack/core", "@vitejs/plugin-rsc", "react-server-dom-rspack"] }, "sha512-+FMm3qtT1gWsl0i5sG/Q70mh1k7tzZUsPBaqbg4v34zVJZ+XGn1mJb34x2w7z1M0/e7co6GkZfV8BRpczrs8UA=="], + + "@tanstack/react-start-server": ["@tanstack/react-start-server@1.167.21", "", { "dependencies": { "@tanstack/react-router": "1.170.17", "@tanstack/router-core": "1.171.14", "@tanstack/start-server-core": "1.169.16" }, "peerDependencies": { "react": ">=18.0.0 || >=19.0.0", "react-dom": ">=18.0.0 || >=19.0.0" } }, "sha512-puJ7eFxaLuDzeM/tiLDJaXCA4uK+PZnEOoIC73zipsFqx865MGzrRS/GSZxeVxjavC5iHU+ZwC+rgI0qYSol1A=="], + + "@tanstack/react-store": ["@tanstack/react-store@0.11.0", "", { "dependencies": { "@tanstack/store": "0.11.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-tX4YXh3PDkmpvGQWkWqKpzs/MSqbtuwY9dWdWhtV9Q50PmO+jOkUKIWIX4G85dwt7lxdHLXsiaEKPdKmC8F41w=="], + + "@tanstack/router-core": ["@tanstack/router-core@1.171.14", "", { "dependencies": { "@tanstack/history": "1.162.0", "cookie-es": "^3.0.0", "seroval": "^1.5.4", "seroval-plugins": "^1.5.4" } }, "sha512-Mo3hwx0qB0cJsVYGDjG0+Ouf7VV74h/vsoDMGztdlyzDanp4gBA2s7IVvm6hFrmQM6GpD9F0Z7SqD7OldfLE7g=="], + + "@tanstack/router-generator": ["@tanstack/router-generator@1.167.18", "", { "dependencies": { "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.14", "@tanstack/router-utils": "1.162.2", "@tanstack/virtual-file-routes": "1.162.0", "jiti": "^2.7.0", "magic-string": "^0.30.21", "prettier": "^3.5.0", "zod": "^4.4.3" } }, "sha512-kFvM4caRds9Q3EXg64bZubJ6rbDxyV0YDSBSGvOGzmKspQPdz5Xrh0uj5T1Ov8avUUg+c761u04VQAaEzSBXRw=="], + + "@tanstack/router-plugin": ["@tanstack/router-plugin@1.168.19", "", { "dependencies": { "@babel/core": "^7.28.5", "@babel/template": "^7.27.2", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.14", "@tanstack/router-generator": "1.167.18", "@tanstack/router-utils": "1.162.2", "chokidar": "^5.0.0", "unplugin": "^3.0.0", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": ">=1.0.2 || ^2.0.0", "@tanstack/react-router": "^1.170.17", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0 || >=8.0.0", "vite-plugin-solid": "^2.11.10 || ^3.0.0-0", "webpack": ">=5.92.0" }, "optionalPeers": ["@rsbuild/core", "@tanstack/react-router", "vite", "vite-plugin-solid", "webpack"] }, "sha512-aFglwLc+bbPTgZlkXn3PvOwpjJAfgUyPGSuql4MP3XrqTTh6WkBiy2RYb6oaG5h0s7EKwivEuq85K3Y4V0Mt1g=="], + + "@tanstack/router-utils": ["@tanstack/router-utils@1.162.2", "", { "dependencies": { "@babel/generator": "^7.28.5", "@babel/parser": "^7.28.5", "@babel/types": "^7.28.5", "ansis": "^4.1.0", "babel-dead-code-elimination": "^1.0.12", "diff": "^8.0.2", "pathe": "^2.0.3", "tinyglobby": "^0.2.15" } }, "sha512-hTWqJtqIFFdvuCl8WXNyrodp2L9zo2G37xKRrcVmVRWpAB2h+U1LuRAfS4tsFTiWOIoE/B+WDVFB8JpoEdw6jQ=="], + + "@tanstack/start-client-core": ["@tanstack/start-client-core@1.170.13", "", { "dependencies": { "@tanstack/router-core": "1.171.14", "@tanstack/start-fn-stubs": "1.162.0", "@tanstack/start-storage-context": "1.167.16", "seroval": "^1.5.4" } }, "sha512-o37M3msIK5ec87kPrIYJWXb1XPnjIe5/jrkGLXiXpFuVL99z7mhoBCzftKtVPtzqI8EElnRE/VGFYT9BHNnWcw=="], + + "@tanstack/start-fn-stubs": ["@tanstack/start-fn-stubs@1.162.0", "", {}, "sha512-QWfUZ3Yo923tdQn38LyKMU8rcTw69zc+T4dAvgTWV4O56SqFRsGfS0lSWIMhJRwXIx/bvdi7nTUBDdZtTHtpTQ=="], + + "@tanstack/start-plugin-core": ["@tanstack/start-plugin-core@1.171.19", "", { "dependencies": { "@babel/code-frame": "7.27.1", "@babel/core": "^7.28.5", "@babel/types": "^7.28.5", "@tanstack/router-core": "1.171.14", "@tanstack/router-generator": "1.167.18", "@tanstack/router-plugin": "1.168.19", "@tanstack/router-utils": "1.162.2", "@tanstack/start-server-core": "1.169.16", "exsolve": "^1.0.7", "lightningcss": "^1.32.0", "pathe": "^2.0.3", "picomatch": "^4.0.3", "seroval": "^1.5.4", "source-map": "^0.7.6", "srvx": "^0.11.9", "tinyglobby": "^0.2.15", "ufo": "^1.5.4", "vitefu": "^1.1.1", "xmlbuilder2": "^4.0.3", "zod": "^4.4.3" }, "peerDependencies": { "@rsbuild/core": "^2.0.0", "vite": ">=7.0.0" }, "optionalPeers": ["@rsbuild/core", "vite"] }, "sha512-+fpW3Z/2vPT8HDV1c5p2WC6/g2k/AV/ujdJVDcn/VFd+gXRtzSX1D/LfozlaDbhDoEsqOnAk/mGwjg60JkUA2Q=="], + + "@tanstack/start-server-core": ["@tanstack/start-server-core@1.169.16", "", { "dependencies": { "@tanstack/history": "1.162.0", "@tanstack/router-core": "1.171.14", "@tanstack/start-client-core": "1.170.13", "@tanstack/start-storage-context": "1.167.16", "fetchdts": "^0.1.6", "h3-v2": "npm:h3@2.0.1-rc.20", "seroval": "^1.5.4" } }, "sha512-lvAjQpH3nHJtd4xy0iHIaWbsTbyN9EBxuYCxbtXH0EpeBQPg+TCPhu9GQC9WbbA1rE//s82CpE55oYDQMqkU5A=="], + + "@tanstack/start-storage-context": ["@tanstack/start-storage-context@1.167.16", "", { "dependencies": { "@tanstack/router-core": "1.171.14" } }, "sha512-zTegxlij4BC1DbCrC6rsVlMOQVMzOuG5IllacZEkrUdhiFwMIMYpk0VWGH+d0ucx5RBkmv8e8GNX3AOVBWclfg=="], + + "@tanstack/store": ["@tanstack/store@0.11.0", "", {}, "sha512-WlzzCt3xi0G6pCAJu1U+2jiECwabETDpQDi3hfkFZvJii9AuZqEKbOiVarX1/bWhTNjU486yQtJCCasi/0q+Cw=="], + + "@tanstack/virtual-file-routes": ["@tanstack/virtual-file-routes@1.162.0", "", {}, "sha512-uhOeFyxLcU41HzvrxsGpiWdcMbScY1EDgbZ5K7DVRMYInbLYWAC0EA/kx9wXAoSM8q82bUG2hRl8+EAjE6XAbA=="], + + "@teppeis/multimaps": ["@teppeis/multimaps@3.0.0", "", {}, "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q=="], + + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], + + "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], + + "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="], + + "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="], + + "@types/cookie": ["@types/cookie@1.0.0", "", { "dependencies": { "cookie": "*" } }, "sha512-mGFXbkDQJ6kAXByHS7QAggRXgols0mAdP4MuXgloGY1tXokvzaFFM4SMqWvf7AH0oafI7zlFJwoGWzmhDqTZ9w=="], + + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], + + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/luxon": ["@types/luxon@3.7.2", "", {}, "sha512-gW+Oib+vUtGJBtNC8V9Reww0oIpusw+4m81uncg9REGZAJfqOQHfo/nkabnc7w0QReXyPqjrbWMJk6NuAkiX3Q=="], + + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + + "@types/node": ["@types/node@22.20.0", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-QWlFW2wf3nTjC13/DqRnBpR4ZO36VJH/JVBkA/vcnmbTBNQIlnObqyqZE1tUR7+Ni23Lda8R1BxMfbXRpCUx5g=="], + + "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="], + + "@types/react": ["@types/react@19.2.17", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw=="], + + "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="], + + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + + "@types/uuid": ["@types/uuid@10.0.0", "", {}, "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.2", "", {}, "sha512-5jsZFwgR5rTdKwidH9Qmat75RKwqfpKlWWB1frDkljN127mwqBu8K0PYo7/hFpF03IEJpfVPpCQDY/eDx3iHvA=="], + + "@vercel/oidc": ["@vercel/oidc@3.2.0", "", {}, "sha512-UycprH3T6n3jH0k44NHMa7pnFHGu/N05MjojYr+Mc6I7obkoLIJujSWwin1pCvdy/eOxrI/l3uDLQsmcrOb4ug=="], + + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], + + "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], + + "ai": ["ai@6.0.219", "", { "dependencies": { "@ai-sdk/gateway": "3.0.143", "@ai-sdk/provider": "3.0.13", "@ai-sdk/provider-utils": "4.0.35", "@opentelemetry/api": "^1.9.0" }, "peerDependencies": { "zod": "^3.25.76 || ^4.1.8" } }, "sha512-rtTDz99Rc9HsstSJ7YdO8DX7DQwS442N2vQ5jOopXDdo4qfkLrtIRpORdztFMOZxX/XjBzHRlvqF6eMg3cpyLA=="], + + "ansi-regex": ["ansi-regex@4.1.1", "", {}, "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansis": ["ansis@4.3.1", "", {}, "sha512-BJ8/l4R5LRE7hW9WdSuGYrLSHi2ynxeFpDFbH0K/CgNeY/tyhk+vO6TYxXC5r5CpUhNVX310xzPsN/H9lCdfOA=="], + + "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], + + "array-timsort": ["array-timsort@1.0.3", "", {}, "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="], + + "assertion-error-formatter": ["assertion-error-formatter@3.0.0", "", { "dependencies": { "diff": "^4.0.1", "pad-right": "^0.2.2", "repeat-string": "^1.6.1" } }, "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ=="], + + "assistant-cloud": ["assistant-cloud@0.1.34", "", { "dependencies": { "assistant-stream": "^0.3.24" } }, "sha512-kmB9qJmwf1Kb3FoLvVnDV7lsT2vRwaiNX9iDoEs+3Gli8aOQ667DPUIXvEXPyV5zF4gfT0E7GFNEcYWRQTElAA=="], + + "assistant-stream": ["assistant-stream@0.3.25", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "nanoid": "^5.1.15", "secure-json-parse": "^4.1.0" }, "peerDependencies": { "ioredis": "^5.10.1", "redis": "^5.12.1" }, "optionalPeers": ["ioredis", "redis"] }, "sha512-hOShVxlctNPWbGF4B1BqwM9Snp8NdS13F7sBIfhkCxlKDdX67/ylxNlGLVcB0E24V/U8XM0GlfS9DsVrxRsn8A=="], + + "babel-dead-code-elimination": ["babel-dead-code-elimination@1.0.12", "", { "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" } }, "sha512-GERT7L2TiYcYDtYk1IpD+ASAYXjKbLTDPhBtYj7X1NuRMDTMtAx9kyBenub1Ev41lo91OHCKdmP+egTDmfQ7Ig=="], + + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.10.42", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-c/jurFrDLyui7o1J86yLkRu4LMsTYcBohveus7/I2Hzdn9KIP2bdJPTue/lR1KH46enoPbD77GKeSYNdyPoD3Q=="], + + "better-auth": ["better-auth@1.6.23", "", { "dependencies": { "@better-auth/core": "1.6.23", "@better-auth/drizzle-adapter": "1.6.23", "@better-auth/kysely-adapter": "1.6.23", "@better-auth/memory-adapter": "1.6.23", "@better-auth/mongo-adapter": "1.6.23", "@better-auth/prisma-adapter": "1.6.23", "@better-auth/telemetry": "1.6.23", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@noble/ciphers": "^2.1.1", "@noble/hashes": "^2.0.1", "better-call": "1.3.7", "defu": "^6.1.4", "jose": "^6.1.3", "kysely": "^0.28.17 || ^0.29.0", "nanostores": "^1.1.1", "zod": "^4.3.6" }, "peerDependencies": { "@lynx-js/react": "*", "@prisma/client": "^5.0.0 || ^6.0.0 || ^7.0.0", "@sveltejs/kit": "^2.0.0", "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", "drizzle-kit": ">=0.31.4", "drizzle-orm": "^0.45.2", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", "next": "^14.0.0 || ^15.0.0 || ^16.0.0", "pg": "^8.0.0", "prisma": "^5.0.0 || ^6.0.0 || ^7.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", "solid-js": "^1.0.0", "svelte": "^4.0.0 || ^5.0.0", "vitest": "^2.0.0 || ^3.0.0 || ^4.0.0", "vue": "^3.0.0" }, "optionalPeers": ["@lynx-js/react", "@prisma/client", "@sveltejs/kit", "@tanstack/react-start", "@tanstack/solid-start", "better-sqlite3", "drizzle-kit", "drizzle-orm", "mongodb", "mysql2", "next", "pg", "prisma", "react", "react-dom", "solid-js", "svelte", "vitest", "vue"] }, "sha512-4vOaRd9UiKGKm9R+ej0jjU1es3MiJIiNc9Qq3VCnYqOZ4/nb5272QqTxWYoDxyUXl5x6A2x2we5KZKQO9teTQQ=="], + + "better-call": ["better-call@1.3.7", "", { "dependencies": { "@better-auth/utils": "^0.4.0", "@better-fetch/fetch": "^1.1.21", "rou3": "^0.7.12", "set-cookie-parser": "^3.0.1" }, "peerDependencies": { "zod": "^4.0.0" }, "optionalPeers": ["zod"] }, "sha512-Al51/hjp2SSp6CRTa3F2ptcx4yQVS1xWKoY6jcVXqNYOap6mHFP2jUBn5EwIL4iIed1/Sq4hlQ+Umm6EflZG+w=="], + + "brace-expansion": ["brace-expansion@2.1.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA=="], + + "browserslist": ["browserslist@4.28.5", "", { "dependencies": { "baseline-browser-mapping": "^2.10.42", "caniuse-lite": "^1.0.30001800", "electron-to-chromium": "^1.5.387", "node-releases": "^2.0.50", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-Cu2E6QejHWzuDMTkuwgpABFgDfZrXLQq5V13YOACZx4mFAG4IwGTbTfHPMr4WtxlHoXSM8FIuRwYYCz5XiabaQ=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001802", "", {}, "sha512-vmv8ub2xwTNmljSKf82mtCk5JH7hC+YgzLj3P5zotvA0tPQ9016tdNNOG8WRca1IxOnhSsivB+J0z5FeE5LOUw=="], + + "capital-case": ["capital-case@1.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3", "upper-case-first": "^2.0.2" } }, "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A=="], + + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + + "chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "chroma-js": ["chroma-js@3.2.0", "", {}, "sha512-os/OippSlX1RlWWr+QDPcGUZs0uoqr32urfxESG9U93lhUfbnlyckte84Q8P1UQY/qth983AS1JONKmLS4T0nw=="], + + "class-transformer": ["class-transformer@0.5.1", "", {}, "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw=="], + + "cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="], + + "cliui": ["cliui@9.0.1", "", { "dependencies": { "string-width": "^7.2.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w=="], + + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + + "commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="], + + "comment-json": ["comment-json@4.6.2", "", { "dependencies": { "array-timsort": "^1.0.3", "esprima": "^4.0.1" } }, "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w=="], + + "consola": ["consola@3.4.0", "", {}, "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA=="], + + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "cookie-es": ["cookie-es@3.1.1", "", {}, "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg=="], + + "cron": ["cron@4.4.0", "", { "dependencies": { "@types/luxon": "~3.7.0", "luxon": "~3.7.0" } }, "sha512-fkdfq+b+AHI4cKdhZlppHveI/mgz2qpiYxcm+t5E5TsxX7QrLS1VE0+7GENEk9z0EeGPcpSciGv6ez24duWhwQ=="], + + "cron-schedule": ["cron-schedule@5.0.4", "", {}, "sha512-nH0a49E/kSVk6BeFgKZy4uUsy6D2A16p120h5bYD9ILBhQu7o2sJFH+WI4R731TSBQ0dB1Ik7inB/dRAB4C8QQ=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + + "dedent": ["dedent@1.5.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg=="], + + "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="], + + "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="], + + "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], + + "defu": ["defu@6.1.7", "", {}, "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ=="], + + "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + + "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="], + + "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.387", "", {}, "sha512-TaxwufTFDufvPEoXdhwVrA3UdFWBeWGkYoJ1K8ldF1xe6gKfth6iRNS5lTQ5JPNOHdGQm8PT1QYKUqFLCiUefQ=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], + + "esbuild": ["esbuild@0.27.7", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.7", "@esbuild/android-arm": "0.27.7", "@esbuild/android-arm64": "0.27.7", "@esbuild/android-x64": "0.27.7", "@esbuild/darwin-arm64": "0.27.7", "@esbuild/darwin-x64": "0.27.7", "@esbuild/freebsd-arm64": "0.27.7", "@esbuild/freebsd-x64": "0.27.7", "@esbuild/linux-arm": "0.27.7", "@esbuild/linux-arm64": "0.27.7", "@esbuild/linux-ia32": "0.27.7", "@esbuild/linux-loong64": "0.27.7", "@esbuild/linux-mips64el": "0.27.7", "@esbuild/linux-ppc64": "0.27.7", "@esbuild/linux-riscv64": "0.27.7", "@esbuild/linux-s390x": "0.27.7", "@esbuild/linux-x64": "0.27.7", "@esbuild/netbsd-arm64": "0.27.7", "@esbuild/netbsd-x64": "0.27.7", "@esbuild/openbsd-arm64": "0.27.7", "@esbuild/openbsd-x64": "0.27.7", "@esbuild/openharmony-arm64": "0.27.7", "@esbuild/sunos-x64": "0.27.7", "@esbuild/win32-arm64": "0.27.7", "@esbuild/win32-ia32": "0.27.7", "@esbuild/win32-x64": "0.27.7" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], + + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + + "eventsource-parser": ["eventsource-parser@3.1.0", "", {}, "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg=="], + + "exsolve": ["exsolve@1.1.0", "", {}, "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw=="], + + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "fetchdts": ["fetchdts@0.1.7", "", {}, "sha512-YoZjBdafyLIop9lSxXVI33oLD5kN31q4Td+CasofLLYeLXRFeOsuOw0Uo+XNRi9PZlbfdlN2GmRtm4tCEQ9/KA=="], + + "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="], + + "find-up-simple": ["find-up-simple@1.0.1", "", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], + + "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], + + "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], + + "glob": ["glob@10.5.0", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg=="], + + "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="], + + "h3-v2": ["h3@2.0.1-rc.20", "", { "dependencies": { "rou3": "^0.8.1", "srvx": "^0.11.13" }, "peerDependencies": { "crossws": "^0.4.1" }, "optionalPeers": ["crossws"], "bin": { "h3": "bin/h3.mjs" } }, "sha512-28ljodXuUp0fZovdiSRq4G9OgrxCztrJe5VdYzXAB7ueRvI7pIUqLU14Xi3XqdYJ/khXjfpUOOD2EQa6CmBgsg=="], + + "has-ansi": ["has-ansi@4.0.1", "", { "dependencies": { "ansi-regex": "^4.1.0" } }, "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], + + "human-id": ["human-id@4.2.0", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-K3GbkIWqyvvlpfhBPlbEvD97TtqBpAYA4kt+cn2lD2x2HuohzZCibcA2nOlnJT6exqvJLggoB5nv2dNf192nEA=="], + + "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="], + + "index-to-position": ["index-to-position@1.2.0", "", {}, "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw=="], + + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], + + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + + "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], + + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], + + "isbot": ["isbot@5.1.44", "", {}, "sha512-PGEHtwMnKbZpeSEXW2Utx+/JWed7dp6DiH0WWg33vGSDA7RUvpUeJSVlLrVkQ1RCpvDOUc/eH9ql7VsdbBZ8pA=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="], + + "istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="], + + "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], + + "jose": ["jose@6.2.3", "", {}, "sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw=="], + + "js-sha256": ["js-sha256@0.11.1", "", {}, "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.3.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], + + "json-schema-walker": ["json-schema-walker@3.3.1", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^15.3.6", "@types/json-schema": "^7.0.15" } }, "sha512-75zF7uMRfvnSTNmzB/wVm1AbSCHnFu8FfAMowWN4MOIgE3taj1b+NyWDLhi3Q64UqrQSi1EhdiltXsNabF8N+A=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "knuth-shuffle-seeded": ["knuth-shuffle-seeded@1.0.6", "", { "dependencies": { "seed-random": "~2.2.0" } }, "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg=="], + + "kysely": ["kysely@0.29.3", "", {}, "sha512-VHtBdW6XB/pgoTSqraM3UAa2rYoYdNXqnNPpX+8XXP+cwYbVEFuAp3HyPt1vpNfU9l7Y2kpUrA9QDPsy8uUqOQ=="], + + "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="], + + "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="], + + "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="], + + "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="], + + "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="], + + "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="], + + "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="], + + "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="], + + "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="], + + "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="], + + "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="], + + "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="], + + "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="], + + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "lucide-react": ["lucide-react@0.456.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" } }, "sha512-DIIGJqTT5X05sbAsQ+OhA8OtJYyD4NsEMCA/HQW/Y6ToPQ7gwbtujIoeAaup4HpHzV35SQOarKAWH8LYglB6eA=="], + + "luxon": ["luxon@3.6.1", "", {}, "sha512-tJLxrKJhO2ukZ5z0gyjY1zPh3Rh88Ej9P7jNrZiHMUXHae1yvI2imgOZtL1TO8TW6biMMKfTtAOoEJANgtWBMQ=="], + + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + + "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="], + + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], + + "mkdirp": ["mkdirp@2.1.6", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], + + "nanoid": ["nanoid@5.1.16", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-kVrnsrJqMR8+oLJnGEmSWw9BivK5mt7H3FZatVRjrc5wGqFYuBxX1yG7+A7Gi5AefkX6t/oCkizcQgpu0cY1dQ=="], + + "nanostores": ["nanostores@1.4.0", "", {}, "sha512-i0tloweeudshAEuddpDxcg9Ik6pkPfVsHIgKyf143JrgG7/MOh0+q7BypdLXZPoOP7fOYt1eTcwGkyiVmhJFkA=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "node-releases": ["node-releases@2.0.50", "", {}, "sha512-J6l92tKHX6w8Jy5nO1Vuc01NoIiRGi/d6qBKVxh+IQ8Cr3b6HbVNfKiF8ZpFKufTwpwxMmce2W3iQZ861ZRyTg=="], + + "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], + + "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], + + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], + + "oxfmt": ["oxfmt@0.53.0", "", { "dependencies": { "tinypool": "2.1.0" }, "optionalDependencies": { "@oxfmt/binding-android-arm-eabi": "0.53.0", "@oxfmt/binding-android-arm64": "0.53.0", "@oxfmt/binding-darwin-arm64": "0.53.0", "@oxfmt/binding-darwin-x64": "0.53.0", "@oxfmt/binding-freebsd-x64": "0.53.0", "@oxfmt/binding-linux-arm-gnueabihf": "0.53.0", "@oxfmt/binding-linux-arm-musleabihf": "0.53.0", "@oxfmt/binding-linux-arm64-gnu": "0.53.0", "@oxfmt/binding-linux-arm64-musl": "0.53.0", "@oxfmt/binding-linux-ppc64-gnu": "0.53.0", "@oxfmt/binding-linux-riscv64-gnu": "0.53.0", "@oxfmt/binding-linux-riscv64-musl": "0.53.0", "@oxfmt/binding-linux-s390x-gnu": "0.53.0", "@oxfmt/binding-linux-x64-gnu": "0.53.0", "@oxfmt/binding-linux-x64-musl": "0.53.0", "@oxfmt/binding-openharmony-arm64": "0.53.0", "@oxfmt/binding-win32-arm64-msvc": "0.53.0", "@oxfmt/binding-win32-ia32-msvc": "0.53.0", "@oxfmt/binding-win32-x64-msvc": "0.53.0" }, "peerDependencies": { "svelte": "^5.0.0", "vite-plus": "*" }, "optionalPeers": ["svelte", "vite-plus"], "bin": { "oxfmt": "bin/oxfmt" } }, "sha512-9cB5glS3Ip6NMuZ+6NYTao9FCWkDhRtPYCtR3QBu/NxHoFbgzzTvi41N4jxz/GqGfuLKspui1qb/LlSu2IbMcw=="], + + "oxlint": ["oxlint@1.72.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.72.0", "@oxlint/binding-android-arm64": "1.72.0", "@oxlint/binding-darwin-arm64": "1.72.0", "@oxlint/binding-darwin-x64": "1.72.0", "@oxlint/binding-freebsd-x64": "1.72.0", "@oxlint/binding-linux-arm-gnueabihf": "1.72.0", "@oxlint/binding-linux-arm-musleabihf": "1.72.0", "@oxlint/binding-linux-arm64-gnu": "1.72.0", "@oxlint/binding-linux-arm64-musl": "1.72.0", "@oxlint/binding-linux-ppc64-gnu": "1.72.0", "@oxlint/binding-linux-riscv64-gnu": "1.72.0", "@oxlint/binding-linux-riscv64-musl": "1.72.0", "@oxlint/binding-linux-s390x-gnu": "1.72.0", "@oxlint/binding-linux-x64-gnu": "1.72.0", "@oxlint/binding-linux-x64-musl": "1.72.0", "@oxlint/binding-openharmony-arm64": "1.72.0", "@oxlint/binding-win32-arm64-msvc": "1.72.0", "@oxlint/binding-win32-ia32-msvc": "1.72.0", "@oxlint/binding-win32-x64-msvc": "1.72.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.22.1", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-1rhdZIP/EvoI91ABIwNU5Q8+bWf8mjrS5UzIOZld4d4bXxJvtlUhlQvaoTogIGin/qdErMOrwaIJvCSIAKTLhA=="], + + "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + + "pad-right": ["pad-right@0.2.2", "", { "dependencies": { "repeat-string": "^1.5.2" } }, "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g=="], + + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "path-to-regexp": ["path-to-regexp@8.4.2", "", {}, "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="], + + "pg-cloudflare": ["pg-cloudflare@1.4.0", "", {}, "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A=="], + + "pg-connection-string": ["pg-connection-string@2.14.0", "", {}, "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg=="], + + "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], + + "pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="], + + "pg-protocol": ["pg-protocol@1.15.0", "", {}, "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ=="], + + "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], + + "pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], + + "picoquery": ["picoquery@2.5.0", "", {}, "sha512-j1kgOFxtaCyoFCkpoYG2Oj3OdGakadO7HZ7o5CqyRazlmBekKhbDoUnNnXASE07xSY4nDImWZkrZv7toSxMi/g=="], + + "playwright": ["playwright@1.61.1", "", { "dependencies": { "playwright-core": "1.61.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ=="], + + "playwright-core": ["playwright-core@1.61.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg=="], + + "postcss": ["postcss@8.5.16", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg=="], + + "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], + + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], + + "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], + + "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], + + "prettier": ["prettier@3.9.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-yWG/o/4oJfo036EKAfK6ACAoDOfHeRHx4tuxkfBZiauURiaSmYwlpOr5LQqKtIkRD2z1PLteme2WoxEnj4tHTg=="], + + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + + "property-expr": ["property-expr@2.0.6", "", {}, "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA=="], + + "property-information": ["property-information@7.2.0", "", {}, "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg=="], + + "radix-ui": ["radix-ui@1.6.1", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-accessible-icon": "1.1.11", "@radix-ui/react-accordion": "1.2.15", "@radix-ui/react-alert-dialog": "1.1.18", "@radix-ui/react-arrow": "1.1.11", "@radix-ui/react-aspect-ratio": "1.1.11", "@radix-ui/react-avatar": "1.2.1", "@radix-ui/react-checkbox": "1.3.6", "@radix-ui/react-collapsible": "1.1.15", "@radix-ui/react-collection": "1.1.11", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-context-menu": "2.3.2", "@radix-ui/react-dialog": "1.1.18", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.14", "@radix-ui/react-dropdown-menu": "2.1.19", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.11", "@radix-ui/react-form": "0.1.11", "@radix-ui/react-hover-card": "1.1.18", "@radix-ui/react-label": "2.1.11", "@radix-ui/react-menu": "2.1.19", "@radix-ui/react-menubar": "1.1.19", "@radix-ui/react-navigation-menu": "1.2.17", "@radix-ui/react-one-time-password-field": "0.1.11", "@radix-ui/react-password-toggle-field": "0.1.6", "@radix-ui/react-popover": "1.1.18", "@radix-ui/react-popper": "1.3.2", "@radix-ui/react-portal": "1.1.13", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.7", "@radix-ui/react-progress": "1.1.11", "@radix-ui/react-radio-group": "1.4.2", "@radix-ui/react-roving-focus": "1.1.14", "@radix-ui/react-scroll-area": "1.2.13", "@radix-ui/react-select": "2.3.2", "@radix-ui/react-separator": "1.1.11", "@radix-ui/react-slider": "1.4.2", "@radix-ui/react-slot": "1.3.0", "@radix-ui/react-switch": "1.3.2", "@radix-ui/react-tabs": "1.1.16", "@radix-ui/react-toast": "1.2.18", "@radix-ui/react-toggle": "1.1.13", "@radix-ui/react-toggle-group": "1.1.14", "@radix-ui/react-toolbar": "1.1.14", "@radix-ui/react-tooltip": "1.2.11", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-escape-keydown": "1.1.3", "@radix-ui/react-use-is-hydrated": "0.1.1", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-size": "1.1.2", "@radix-ui/react-visually-hidden": "1.2.7" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QXDXJtB6sK83mLASONYUZCauatcWb+knFviFpN1EhtdbbmlsRmzCLrbZSKztnNiem2KOHIBbiDbauVB7SORXMw=="], + + "react": ["react@19.2.7", "", {}, "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ=="], + + "react-dom": ["react-dom@19.2.7", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.7" } }, "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ=="], + + "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], + + "react-number-format": ["react-number-format@5.4.5", "", { "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw=="], + + "react-refresh": ["react-refresh@0.17.0", "", {}, "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ=="], + + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], + + "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], + + "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], + + "react-textarea-autosize": ["react-textarea-autosize@8.5.9", "", { "dependencies": { "@babel/runtime": "^7.20.13", "use-composed-ref": "^1.3.0", "use-latest": "^1.2.1" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A=="], + + "read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="], + + "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], + + "readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], + + "regexp-match-indices": ["regexp-match-indices@1.0.2", "", { "dependencies": { "regexp-tree": "^0.1.11" } }, "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ=="], + + "regexp-tree": ["regexp-tree@0.1.27", "", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + + "rollup": ["rollup@4.62.2", "", { "dependencies": { "@types/estree": "1.0.9" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.62.2", "@rollup/rollup-android-arm64": "4.62.2", "@rollup/rollup-darwin-arm64": "4.62.2", "@rollup/rollup-darwin-x64": "4.62.2", "@rollup/rollup-freebsd-arm64": "4.62.2", "@rollup/rollup-freebsd-x64": "4.62.2", "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", "@rollup/rollup-linux-arm-musleabihf": "4.62.2", "@rollup/rollup-linux-arm64-gnu": "4.62.2", "@rollup/rollup-linux-arm64-musl": "4.62.2", "@rollup/rollup-linux-loong64-gnu": "4.62.2", "@rollup/rollup-linux-loong64-musl": "4.62.2", "@rollup/rollup-linux-ppc64-gnu": "4.62.2", "@rollup/rollup-linux-ppc64-musl": "4.62.2", "@rollup/rollup-linux-riscv64-gnu": "4.62.2", "@rollup/rollup-linux-riscv64-musl": "4.62.2", "@rollup/rollup-linux-s390x-gnu": "4.62.2", "@rollup/rollup-linux-x64-gnu": "4.62.2", "@rollup/rollup-linux-x64-musl": "4.62.2", "@rollup/rollup-openbsd-x64": "4.62.2", "@rollup/rollup-openharmony-arm64": "4.62.2", "@rollup/rollup-win32-arm64-msvc": "4.62.2", "@rollup/rollup-win32-ia32-msvc": "4.62.2", "@rollup/rollup-win32-x64-gnu": "4.62.2", "@rollup/rollup-win32-x64-msvc": "4.62.2", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA=="], + + "rou3": ["rou3@0.7.12", "", {}, "sha512-iFE4hLDuloSWcD7mjdCDhx2bKcIsYbtOTpfH5MHHLSKMOUyjqQXTeZVa289uuwEGEKFoE/BAPbhaU4B774nceg=="], + + "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], + + "safe-content-frame": ["safe-content-frame@0.0.22", "", {}, "sha512-RHZ4pcF0FWnqIjUmqlGwKxmkFvmQ/qZcJ5p5glhOe+VlfgdPadiKVWQRUXV6Q5/PiTDX2UmGK2alJQQArU6HUA=="], + + "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="], + + "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], + + "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="], + + "seed-random": ["seed-random@2.2.0", "", {}, "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ=="], + + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "seroval": ["seroval@1.5.4", "", {}, "sha512-46uFvgrXTVxZcUorgSSRZ4y+ieqLLQRMlG4bnCZKW3qI6BZm7Rg4ntMW4p1mILEEBZWrFlcpp0AyIIlM6jD9iw=="], + + "seroval-plugins": ["seroval-plugins@1.5.4", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-S0xQPhUTefAhNvNWFg0c1J8qJArHt5KdtJ/cFAofo06KD1MVSeFWyl4iiu+ApDIuw0WhjpOfCdgConOfAnLgkw=="], + + "set-cookie-parser": ["set-cookie-parser@3.1.1", "", {}, "sha512-vM9SUhjsUYs6UeJUmygc5Ofm5eQGe85riob5ju6XCgFGJI5PLV4nrDAQpQjd+LkFBpAkADn5BQQpZ9EUNkyLuA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + + "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="], + + "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="], + + "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="], + + "spdx-license-ids": ["spdx-license-ids@3.0.23", "", {}, "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw=="], + + "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], + + "sqlite-wasm-kysely": ["sqlite-wasm-kysely@0.3.0", "", { "dependencies": { "@sqlite.org/sqlite-wasm": "^3.48.0-build2" }, "peerDependencies": { "kysely": "*" } }, "sha512-TzjBNv7KwRw6E3pdKdlRyZiTmUIE0UttT/Sl56MVwVARl/u5gp978KepazCJZewFUnlWHz9i3NQd4kOtP/Afdg=="], + + "srvx": ["srvx@0.11.21", "", { "bin": { "srvx": "bin/srvx.mjs" } }, "sha512-GWTHjKMeekX8CwJf4VU9Oo6mJpSGaflGMddbCvR+Cmmh9sslRMiGbAoqqZacE0r1ncARh6buCEETr2W52F8b1w=="], + + "stackframe": ["stackframe@1.3.4", "", {}, "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="], + + "string-argv": ["string-argv@0.3.1", "", {}, "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], + + "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "tabbable": ["tabbable@6.5.0", "", {}, "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA=="], + + "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], + + "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="], + + "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="], + + "tiny-case": ["tiny-case@1.0.3", "", {}, "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q=="], + + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], + + "tinypool": ["tinypool@2.1.0", "", {}, "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw=="], + + "toposort": ["toposort@2.0.2", "", {}, "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg=="], + + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + + "ts-json-schema-generator": ["ts-json-schema-generator@2.9.1-next.16", "", { "dependencies": { "@types/json-schema": "^7.0.15", "commander": "^14.0.3", "glob": "^13.0.6", "json5": "^2.2.3", "normalize-path": "^3.0.0", "safe-stable-stringify": "^2.5.0", "tslib": "^2.8.1", "typescript": ">=5.9 <7" }, "bin": { "ts-json-schema-generator": "bin/ts-json-schema-generator.js" } }, "sha512-FTReylA5T/tbYiCTyGq+shS1xKubx6bc+/LyRoUEtDna3wHgJR6KG5/WKfRAbbvQdIOCgT0dDUIO4XgCvyzw6w=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tsx": ["tsx@4.23.0", "", { "dependencies": { "esbuild": "~0.28.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-eUdUIaCr963q2h5u3+QwvYp0+eqPvn+egeqZUm0hwERCqqx1E3kK5ehbGCvqSE5MQAULr67ww0cA3jKc3YkM1w=="], + + "type-fest": ["type-fest@5.8.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "ufo": ["ufo@1.6.4", "", {}, "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA=="], + + "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], + + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + + "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], + + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + + "upper-case-first": ["upper-case-first@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg=="], + + "urlpattern-polyfill": ["urlpattern-polyfill@10.1.0", "", {}, "sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw=="], + + "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], + + "use-composed-ref": ["use-composed-ref@1.4.0", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w=="], + + "use-effect-event": ["use-effect-event@2.0.3", "", { "peerDependencies": { "react": "^18.3 || ^19.0.0-0" } }, "sha512-fz1en+z3fYXCXx3nMB8hXDMuygBltifNKZq29zDx+xNJ+1vEs6oJlYd9sK31vxJ0YI534VUsHEBY0k2BATsmBQ=="], + + "use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA=="], + + "use-latest": ["use-latest@1.3.0", "", { "dependencies": { "use-isomorphic-layout-effect": "^1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-mhg3xdm9NaM8q+gLT8KryJPnRFOz1/5XPBhmDEVZK1webPzDjrPk7f/mbpeLqTgB9msytYWANxgALOCJKnLvcQ=="], + + "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], + + "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], + + "util-arity": ["util-arity@1.1.0", "", {}, "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA=="], + + "uuid": ["uuid@14.0.1", "", { "bin": { "uuid": "dist-node/bin/uuid" } }, "sha512-6ZxzVpzDXDa3bJWaHilVayA+BH/1zmxCJoVgvmqJnid/gPoKHxUrS/aC/T6LGQtNHT+XHG9fXPJB4d+IrU30Ew=="], + + "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], + + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + + "vite": ["vite@7.3.6", "", { "dependencies": { "esbuild": "^0.27.0 || ^0.28.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg=="], + + "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], + + "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "ws": ["ws@8.21.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g=="], + + "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], + + "xmlbuilder": ["xmlbuilder@15.1.1", "", {}, "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="], + + "xmlbuilder2": ["xmlbuilder2@4.0.3", "", { "dependencies": { "@oozcitak/dom": "^2.0.2", "@oozcitak/infra": "^2.0.2", "@oozcitak/util": "^10.0.0", "js-yaml": "^4.1.1" } }, "sha512-bx8Q1STctnNaaDymWnkfQLKofs0mGNN7rLLapJlGuV3VlvegD7Ls4ggMjE3aUSWItCCzU0PEv45lI87iSigiCA=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="], + + "yargs": ["yargs@18.0.0", "", { "dependencies": { "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "string-width": "^7.2.0", "y18n": "^5.0.5", "yargs-parser": "^22.0.0" } }, "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg=="], + + "yargs-parser": ["yargs-parser@22.0.0", "", {}, "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw=="], + + "yup": ["yup@1.6.1", "", { "dependencies": { "property-expr": "^2.0.5", "tiny-case": "^1.0.3", "toposort": "^2.0.2", "type-fest": "^2.19.0" } }, "sha512-JED8pB50qbA4FOkDol0bYF/p60qSEDQqBD0/qeIrUCG1KbPBIQ776fCUNb9ldbPcSTxA69g/47XTo4TqWiuXOA=="], + + "zod": ["zod@4.4.3", "", {}, "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ=="], + + "zod-to-ts": ["zod-to-ts@2.1.0", "", { "peerDependencies": { "typescript": "^5 || ^6", "zod": "^3.25.0 || ^4.0.0" } }, "sha512-jZP1GokTqR99FLmtGU+B9acjD9u/R++b++Vxe1sWpBQDd82/9/j5LyLZZ7/Oy3h2nxcz5NihikgX4D0hhdu3+g=="], + + "zustand": ["zustand@5.0.14", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-/8tAspM5LMPr28b3fwLYrtdj77ECpfZviaP75CMTnwO8ISyaE4GDIG/9rDDYq/cH9D2Xw2A2RXglLInmVBQB/g=="], + + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + + "@cucumber/cucumber/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "@cucumber/cucumber/commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], + + "@cucumber/cucumber/semver": ["semver@7.7.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA=="], + + "@cucumber/cucumber/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "@cucumber/gherkin/@cucumber/messages": ["@cucumber/messages@26.0.1", "", { "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", "uuid": "10.0.0" } }, "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg=="], + + "@cucumber/gherkin-streams/commander": ["commander@9.1.0", "", {}, "sha512-i0/MaqBtdbnJ4XQs4Pmyb+oFQl+q0lsAmokVUH92SlSw4fkeAcG3bVon+Qt7hmtF+u3Het6o4VgrcY3qAoEB6w=="], + + "@cucumber/gherkin-utils/@cucumber/gherkin": ["@cucumber/gherkin@31.0.0", "", { "dependencies": { "@cucumber/messages": ">=19.1.4 <=26" } }, "sha512-wlZfdPif7JpBWJdqvHk1Mkr21L5vl4EfxVUOS4JinWGf3FLRV6IKUekBv5bb5VX79fkDcfDvESzcQ8WQc07Wgw=="], + + "@cucumber/gherkin-utils/commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + + "@cucumber/junit-xml-formatter/luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + + "@cucumber/messages/uuid": ["uuid@11.0.5", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-508e6IcKLrhxKdBbcA2b4KQZlLVp2+J5UwQ6F7Drckkc5N9ZJwFa4TgWtsww9UG8fGHbm6gbV19TdM5pQ4GaIA=="], + + "@inlang/sdk/kysely": ["kysely@0.28.17", "", {}, "sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q=="], + + "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], + + "@isaacs/cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], + + "@lix-js/sdk/kysely": ["kysely@0.28.17", "", {}, "sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q=="], + + "@pikku/cli/@pikku/better-auth": ["@pikku/better-auth@0.12.15", "", { "peerDependencies": { "@pikku/core": "^0.12.52", "better-auth": "^1.6.0" } }, "sha512-rX9dM/Ro2ZZEqhB3DhGsWrrr1d6VkY6N790C86hLxFqcdSmGWtTa0b23FOAfpaX9wW6zdpdUmIMGCZSSVB1WRQ=="], + + "@pikku/cli/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "@pikku/inspector/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "@project/e2e/typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "@tanstack/react-router/@tanstack/react-store": ["@tanstack/react-store@0.9.3", "", { "dependencies": { "@tanstack/store": "0.9.3", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg=="], + + "@tanstack/router-plugin/chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], + + "@tanstack/router-plugin/unplugin": ["unplugin@3.3.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "picomatch": "^4.0.4", "webpack-virtual-modules": "^0.6.2" }, "peerDependencies": { "@farmfe/core": "*", "@rspack/core": "*", "bun-types-no-globals": "*", "esbuild": "*", "rolldown": "*", "rollup": "*", "unloader": "*", "vite": "*", "webpack": "*" }, "optionalPeers": ["@farmfe/core", "@rspack/core", "bun-types-no-globals", "esbuild", "rolldown", "rollup", "unloader", "vite", "webpack"] }, "sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg=="], + + "@tanstack/start-plugin-core/@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], + + "assertion-error-formatter/diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="], + + "cliui/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "cliui/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "cron/luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + + "h3-v2/rou3": ["rou3@0.8.1", "", {}, "sha512-ePa+XGk00/3HuCqrEnK3LxJW7I0SdNg6EFzKUJG73hMAdDcOUC/i/aSz7LSDwLrGr33kal/rqOGydzwl6U7zBA=="], + + "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "istanbul-lib-instrument/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "normalize-package-data/semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], + + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], + + "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + + "postcss/nanoid": ["nanoid@3.3.15", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA=="], + + "read-package-up/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "read-pkg/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ts-json-schema-generator/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + + "ts-json-schema-generator/glob": ["glob@13.0.6", "", { "dependencies": { "minimatch": "^10.2.2", "minipass": "^7.1.3", "path-scurry": "^2.0.2" } }, "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw=="], + + "ts-json-schema-generator/typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], + + "tsx/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + + "vite/esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="], + + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "yargs/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "yup/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="], + + "@cucumber/cucumber/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@cucumber/gherkin-utils/@cucumber/gherkin/@cucumber/messages": ["@cucumber/messages@26.0.1", "", { "dependencies": { "@types/uuid": "10.0.0", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", "uuid": "10.0.0" } }, "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg=="], + + "@cucumber/gherkin/@cucumber/messages/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "@isaacs/cliui/string-width/emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], + + "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "@tanstack/react-router/@tanstack/react-store/@tanstack/store": ["@tanstack/store@0.9.3", "", {}, "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw=="], + + "@tanstack/router-plugin/chokidar/readdirp": ["readdirp@5.0.0", "", {}, "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ=="], + + "cliui/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ts-json-schema-generator/glob/minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], + + "ts-json-schema-generator/glob/path-scurry": ["path-scurry@2.0.2", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg=="], + + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "vite/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="], + + "vite/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="], + + "vite/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="], + + "vite/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="], + + "vite/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="], + + "vite/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="], + + "vite/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="], + + "vite/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="], + + "vite/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="], + + "vite/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="], + + "vite/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="], + + "vite/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="], + + "vite/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="], + + "vite/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="], + + "vite/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="], + + "vite/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="], + + "vite/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="], + + "vite/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="], + + "vite/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="], + + "vite/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="], + + "vite/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="], + + "vite/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="], + + "vite/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="], + + "vite/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="], + + "vite/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="], + + "vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "yargs/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "yargs/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], + + "@cucumber/gherkin-utils/@cucumber/gherkin/@cucumber/messages/uuid": ["uuid@10.0.0", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ=="], + + "ts-json-schema-generator/glob/minimatch/brace-expansion": ["brace-expansion@5.0.7", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA=="], + + "ts-json-schema-generator/glob/path-scurry/lru-cache": ["lru-cache@11.5.1", "", {}, "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A=="], + + "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "ts-json-schema-generator/glob/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + } +} diff --git a/db/annotations.ts b/db/annotations.ts new file mode 100644 index 0000000..8647e9b --- /dev/null +++ b/db/annotations.ts @@ -0,0 +1,21 @@ +// Column annotations — compiled by `pikku db migrate` into db/annotations.gen.json, +// which drives BOTH the generated types/zod AND runtime value coercion. +// +// Declare a `kind` for every semantic date/bool/json column you add: +// - kind: 'date' → the column types as `Date` end-to-end. Write real `Date` +// objects, read back `Date` objects; the TEXT storage is coerced both ways. +// - kind: 'bool' → types as `boolean` over the INTEGER 0/1 storage. +// - kind: 'json' → parsed/serialized automatically. +// Without a kind, a SQLite date column is just `string` (write ISO strings via +// `new Date().toISOString()`) and a flag is `number` — that default is fine too; +// just follow the generated type, never fight it with `new Date()` writes or casts. +// +// Optional per column: security ('public' | 'private' | 'pii' | 'secret'), +// classification (anonymize strategy), tsType, format, description. +export const classifications = { + // Example — after adding a `todos` table in a migration: + // todos: { + // created_at: { kind: 'date' }, + // done: { kind: 'bool' }, + // }, +} diff --git a/db/sqlite-seed.sql b/db/sqlite-seed.sql new file mode 100644 index 0000000..42b41d8 --- /dev/null +++ b/db/sqlite-seed.sql @@ -0,0 +1,3 @@ +-- Dev seed (applied via `pikku db seed` after `pikku db migrate`). +-- The starter is auth-only, so there's nothing to seed yet. Add your own +-- INSERT … ON CONFLICT DO NOTHING rows here as you grow the schema. diff --git a/db/sqlite-test-seed.sql b/db/sqlite-test-seed.sql new file mode 100644 index 0000000..859fe8a --- /dev/null +++ b/db/sqlite-test-seed.sql @@ -0,0 +1,6 @@ +-- Test-only seed: a minimal user row so getSession resolves against `user`. +-- This file is only used by the function-tests harness (never in the sandbox +-- or production). +INSERT INTO "user" (id, name, email, email_verified, created_at, updated_at) +VALUES ('user-001', 'Test User', 'test@example.com', 1, datetime('now'), datetime('now')) +ON CONFLICT (id) DO NOTHING; diff --git a/db/sqlite/0001-init.sql b/db/sqlite/0001-init.sql new file mode 100644 index 0000000..71dd7bb --- /dev/null +++ b/db/sqlite/0001-init.sql @@ -0,0 +1,67 @@ +PRAGMA foreign_keys = ON; + +-- Better Auth core schema. These four tables (user, session, account, +-- verification) are owned and written entirely by Better Auth — the app never +-- inserts into them directly; sign-up / sign-in / sessions all flow through the +-- generated `/api/auth/**` routes (see src/auth.ts). +-- +-- The schema is generated by Better Auth's own migration generator +-- (`getMigrations(...).compileMigrations()`); the columns are spelled in +-- snake_case to match the rest of the app's DB convention. Better Auth is handed +-- the app's kysely (with CamelCasePlugin) in src/auth.ts, so its camelCase field +-- names (emailVerified, userId, createdAt, ...) compile to exactly these +-- snake_case columns at runtime. To change this schema (add a provider field, a +-- plugin table, ...), re-run the generator rather than hand-editing. +-- +-- Email + password is the default sign-in method. The credential hash is stored +-- by Better Auth in account.password (provider_id = 'credential'), never on the +-- user row. +CREATE TABLE IF NOT EXISTS "user" ( + "id" text not null primary key, + "name" text not null, + "email" text not null unique, + "email_verified" integer not null, + "image" text, + "created_at" date not null, + "updated_at" date not null +); + +CREATE TABLE IF NOT EXISTS "session" ( + "id" text not null primary key, + "expires_at" date not null, + "token" text not null unique, + "created_at" date not null, + "updated_at" date not null, + "ip_address" text, + "user_agent" text, + "user_id" text not null references "user" ("id") on delete cascade +); + +CREATE TABLE IF NOT EXISTS "account" ( + "id" text not null primary key, + "account_id" text not null, + "provider_id" text not null, + "user_id" text not null references "user" ("id") on delete cascade, + "access_token" text, + "refresh_token" text, + "id_token" text, + "access_token_expires_at" date, + "refresh_token_expires_at" date, + "scope" text, + "password" text, + "created_at" date not null, + "updated_at" date not null +); + +CREATE TABLE IF NOT EXISTS "verification" ( + "id" text not null primary key, + "identifier" text not null, + "value" text not null, + "expires_at" date not null, + "created_at" date not null, + "updated_at" date not null +); + +CREATE INDEX IF NOT EXISTS "session_user_id_idx" ON "session" ("user_id"); +CREATE INDEX IF NOT EXISTS "account_user_id_idx" ON "account" ("user_id"); +CREATE INDEX IF NOT EXISTS "verification_identifier_idx" ON "verification" ("identifier"); diff --git a/db/sqlite/0002-audit.sql b/db/sqlite/0002-audit.sql new file mode 100644 index 0000000..159966f --- /dev/null +++ b/db/sqlite/0002-audit.sql @@ -0,0 +1,26 @@ +-- Audit log. Fabric's audit service flushes events here via a per-stage +-- CF Queue. Add this table if you want audit capture; remove it (and skip +-- this migration) if your project has no audit requirements. +CREATE TABLE IF NOT EXISTS audit ( + audit_id TEXT NOT NULL PRIMARY KEY DEFAULT (lower(hex(randomblob(16)))), + occurred_at TEXT NOT NULL DEFAULT (datetime('now')), + type TEXT NOT NULL, + source TEXT NOT NULL DEFAULT 'auto', + outcome TEXT, + function_id TEXT, + wire_type TEXT, + trace_id TEXT, + transaction_id TEXT, + query_id TEXT, + actor_user_id TEXT, + actor_org_id TEXT, + tables TEXT, -- JSON array of table names touched + changed_cols TEXT, -- JSON array of changed column names + event TEXT, -- custom event label + old TEXT, -- JSON: previous values + data TEXT -- JSON: new values / event payload +); + +CREATE INDEX IF NOT EXISTS idx_audit_occurred_at ON audit (occurred_at); +CREATE INDEX IF NOT EXISTS idx_audit_actor ON audit (actor_user_id) WHERE actor_user_id IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_audit_function ON audit (function_id) WHERE function_id IS NOT NULL; diff --git a/db/sqlite/0003-user-actor.sql b/db/sqlite/0003-user-actor.sql new file mode 100644 index 0000000..ad2e4d5 --- /dev/null +++ b/db/sqlite/0003-user-actor.sql @@ -0,0 +1,11 @@ +-- ============================================================================= +-- BETTER AUTH ACTOR PLUGIN — user-flow actors +-- Adds the `actor` boolean the Better Auth `actor()` plugin declares so its +-- schema is covered by an explicit migration and the db drift check passes. +-- Actor rows are synthetic users signed in by pikkuUserFlow via +-- POST /api/auth/sign-in/actor with the server-held USER_FLOW_ACTOR_SECRET; +-- the flag rides into the pikku core session so audits/analytics can address +-- synthetic traffic. A non-actor user can never be signed in this way. +-- ============================================================================= + +ALTER TABLE "user" ADD COLUMN "actor" integer NOT NULL DEFAULT 0; diff --git a/db/sqlite/0004-admin.sql b/db/sqlite/0004-admin.sql new file mode 100644 index 0000000..48b005e --- /dev/null +++ b/db/sqlite/0004-admin.sql @@ -0,0 +1,16 @@ +-- ============================================================================= +-- BETTER AUTH ADMIN PLUGIN — user administration +-- Adds the columns the Better Auth `admin()` plugin declares so its schema is +-- covered by an explicit migration and the db drift check passes. The plugin +-- exposes /api/auth/admin/* (listUsers, setRole, ban, impersonateUser, …); +-- `impersonated_by` marks a session created via "view as user" so it can be +-- reverted with admin.stopImpersonating. All fields are optional — a user with +-- `role` = 'admin' is an administrator; everyone else stays a normal user. +-- ============================================================================= + +ALTER TABLE "user" ADD COLUMN "role" text; +ALTER TABLE "user" ADD COLUMN "banned" integer DEFAULT 0; +ALTER TABLE "user" ADD COLUMN "ban_reason" text; +ALTER TABLE "user" ADD COLUMN "ban_expires" date; + +ALTER TABLE "session" ADD COLUMN "impersonated_by" text; diff --git a/db/sqlite/0005-fabric.sql b/db/sqlite/0005-fabric.sql new file mode 100644 index 0000000..3680cff --- /dev/null +++ b/db/sqlite/0005-fabric.sql @@ -0,0 +1,13 @@ +-- ============================================================================= +-- BETTER AUTH FABRIC PLUGIN — Fabric operator admin sessions +-- Adds the `fabric` boolean the Better Auth `fabric()` plugin declares so its +-- schema is covered by an explicit migration and the db drift check passes. +-- Fabric rows are synthetic operator users minted by POST /api/auth/sign-in/fabric +-- after verifying a short-lived RS256 token the Fabric control plane signed +-- (checked against FABRIC_AUTH_PUBLIC_KEY). They are created with role 'admin' so +-- the console Users tab can list/impersonate real end-users WITHOUT the operator +-- being one of them; these rows are filtered out of any end-user listing. A real +-- user can never be signed in this way. +-- ============================================================================= + +ALTER TABLE "user" ADD COLUMN "fabric" integer NOT NULL DEFAULT 0; diff --git a/e2e/README.md b/e2e/README.md new file mode 100644 index 0000000..25899d3 --- /dev/null +++ b/e2e/README.md @@ -0,0 +1,34 @@ +# e2e — end-to-end tests (Cucumber + Playwright) + +Two tiers: + +## `@smoke` — the build gate (mutationless, runs against the live server) + +Fast, read-only checks that run against the **already-running** app (the sandbox +dev server, or a local `yarn dev`). They never mutate domain data — they sign in +(an idempotent test-user sign-up) and navigate, nothing more — so they are safe +to run against the normal server on every build. + +- `features/auth.feature` — sign in through the real login form. +- `features/pages.feature` — signed in, every static route must render with no + HTTP error, no failed/5xx app API call, no uncaught exception, and no console + error. New routes are picked up automatically from the generated route tree. + +Run: `yarn workspace @project/e2e test` (the build agent calls this via the +`fabric-app-smoke` tool). + +## `@e2e` — deeper behaviour tests (mutating, isolated server + DB) + +Create/edit/delete flows and permission checks. Because they mutate state they +must be **deterministic**, so they run like the seminarhof harness: a separate +pikku dev server with its own golden/isolated DB per scenario, against the same +frontend (`E2E_MANAGE_SERVERS=1 E2E_ISOLATED_DB=1`). Add these as the app grows — +do NOT tag them `@smoke` (they are not part of the fast build gate). + +## Extend + +Add a `features/.feature` plus `steps/.steps.ts` per area. Reuse +the generic steps in `steps/common.steps.ts` and the `AppWorld` primitives +(`gotoApp`, `signIn`, `expectText`). Keep `common.steps.ts` and `world.ts` +generic. Tag a scenario `@smoke` only if it is mutationless and must pass on +every build. diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 0000000..6760406 --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,21 @@ +{ + "name": "@project/e2e", + "version": "0.0.1", + "private": true, + "type": "module", + "description": "End-to-end tests \u2014 Cucumber + Playwright. Runs against the live app (sandbox dev server or a local dev server).", + "scripts": { + "test": "cucumber-js --config tests/cucumber.mjs --tags 'not @skip'", + "test:tag": "cucumber-js --config tests/cucumber.mjs --tags", + "test:headed": "HEADED=1 cucumber-js --config tests/cucumber.mjs --tags 'not @skip'", + "tsc": "tsc --noEmit" + }, + "devDependencies": { + "@cucumber/cucumber": "^11.0.0", + "@pikku/cucumber": "^0.12.11", + "@playwright/test": "^1.50.0", + "@types/node": "^22", + "tsx": "^4.21.0", + "typescript": "~5.8.0" + } +} diff --git a/e2e/tests/cucumber.mjs b/e2e/tests/cucumber.mjs new file mode 100644 index 0000000..e1e9c94 --- /dev/null +++ b/e2e/tests/cucumber.mjs @@ -0,0 +1,6 @@ +export default { + require: ['tests/support/**/*.ts', 'tests/steps/**/*.ts'], + paths: ['tests/features/**/*.feature'], + format: ['progress'], + forceExit: true, +} diff --git a/e2e/tests/features/auth.feature b/e2e/tests/features/auth.feature new file mode 100644 index 0000000..a7a4c2c --- /dev/null +++ b/e2e/tests/features/auth.feature @@ -0,0 +1,8 @@ +@auth @smoke +Feature: Authentication + Users sign in with email + password; the session is cookie-based. + + Scenario: a registered user signs in through the login form + Given a test account exists + When "the user" signs in through the login form + Then they land on the app diff --git a/e2e/tests/features/pages.feature b/e2e/tests/features/pages.feature new file mode 100644 index 0000000..9ae1fa6 --- /dev/null +++ b/e2e/tests/features/pages.feature @@ -0,0 +1,10 @@ +@pages @smoke +Feature: Every page loads + Signed in, every static route must render without an HTTP error, a failed or + 5xx app API call, an uncaught exception, or a console error. This is the + baseline reliability gate — extend it with per-domain behaviour features as + the app grows (create/edit/list flows, permissions, etc.). + + Scenario: all pages load cleanly when signed in + Given "the user" is signed in + Then every page loads without errors diff --git a/e2e/tests/support/register.ts b/e2e/tests/support/register.ts new file mode 100644 index 0000000..37facda --- /dev/null +++ b/e2e/tests/support/register.ts @@ -0,0 +1,28 @@ +import { + Given, + When, + Then, + Before, + After, + defineParameterType, + setDefaultTimeout, +} from '@cucumber/cucumber' +import { registerBrowserSteps, registerBrowserHooks } from '@pikku/cucumber/browser' + +// The shared browser vocabulary ({actor} grammar, form/click/see steps, the +// "every page loads without errors" sweep) and the browser lifecycle hooks. +// Per-domain business steps belong in ../steps/*.steps.ts. +registerBrowserSteps({ Given, When, Then, defineParameterType }) +registerBrowserHooks({ Before, After, setDefaultTimeout }) + +// The page-load sweep visits every route in one step, so give scenarios plenty +// of room. Per-action waits are still bounded by the package's config.timeout. +setDefaultTimeout(Number(process.env.E2E_SCENARIO_TIMEOUT ?? 300_000)) + +// Don't start a scenario while the dev server is mid-restart (it 5xx's /api +// for a few seconds on boot / file change) — that race reads as a phantom +// failure. Server orchestration itself stays outside these tests. +Before(async function (this: import('./world.js').AppWorld) { + const actor = await this.actor(undefined) + await actor.waitForServerReady() +}) diff --git a/e2e/tests/support/world.ts b/e2e/tests/support/world.ts new file mode 100644 index 0000000..995bd58 --- /dev/null +++ b/e2e/tests/support/world.ts @@ -0,0 +1,15 @@ +import { setWorldConstructor } from '@cucumber/cucumber' +import { BrowserWorld } from '@pikku/cucumber/browser' + +/** + * AppWorld — the app's cucumber world, built on @pikku/cucumber/browser. + * + * The package owns the browser lifecycle, the actor grammar ("the user", + * "the admin", they) and the generic step vocabulary. Extend this class for + * app-specific needs: override createClients() to expose the generated + * PikkuRPC/PikkuFetch on actors, override resetAppData() to call the app's + * reset RPC, or add helpers for per-domain *.steps.ts files. + */ +export class AppWorld extends BrowserWorld {} + +setWorldConstructor(AppWorld) diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json new file mode 100644 index 0000000..3b625f2 --- /dev/null +++ b/e2e/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ES2022", + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "strict": true, + "skipLibCheck": true, + "noEmit": true, + "types": ["node"] + }, + "include": ["tests/**/*.ts"] +} diff --git a/emails/locales/en.json b/emails/locales/en.json new file mode 100644 index 0000000..7b6091f --- /dev/null +++ b/emails/locales/en.json @@ -0,0 +1,14 @@ +{ + "common": { + "footer": "If you did not create this account, you can safely ignore this email." + }, + "confirmEmail": { + "subject": "Confirm your email for {{appName}}", + "preview": "Confirm your email address to finish setting up your account.", + "heading": "Confirm your email", + "intro": "Thanks for signing up for {{appName}}! Confirm {{email}} to finish setting up your account.", + "cta": "Confirm email", + "fallback": "If the button does not work, copy and paste this URL into your browser:", + "expiry": "This link expires in 24 hours." + } +} diff --git a/emails/partials/footer.html b/emails/partials/footer.html new file mode 100644 index 0000000..71aebf0 --- /dev/null +++ b/emails/partials/footer.html @@ -0,0 +1,3 @@ +

+ {{t.common.footer}} +

diff --git a/emails/partials/layout.html b/emails/partials/layout.html new file mode 100644 index 0000000..38831eb --- /dev/null +++ b/emails/partials/layout.html @@ -0,0 +1,13 @@ + + + + + + {{subject}} + + +
+ {{content}} +
+ + diff --git a/emails/templates/confirm-email.html b/emails/templates/confirm-email.html new file mode 100644 index 0000000..419b055 --- /dev/null +++ b/emails/templates/confirm-email.html @@ -0,0 +1,27 @@ +

+ {{appName}} +

+

+ {{t.confirmEmail.heading}} +

+

+ {{t.confirmEmail.intro}} +

+

+ + {{t.confirmEmail.cta}} + +

+

+ {{t.confirmEmail.fallback}} +

+

+ {{confirmUrl}} +

+

+ {{t.confirmEmail.expiry}} +

+{{> footer}} diff --git a/emails/templates/confirm-email.subject.txt b/emails/templates/confirm-email.subject.txt new file mode 100644 index 0000000..a43b2f3 --- /dev/null +++ b/emails/templates/confirm-email.subject.txt @@ -0,0 +1 @@ +{{t.confirmEmail.subject}} diff --git a/emails/templates/confirm-email.text.txt b/emails/templates/confirm-email.text.txt new file mode 100644 index 0000000..406446e --- /dev/null +++ b/emails/templates/confirm-email.text.txt @@ -0,0 +1,7 @@ +{{t.confirmEmail.heading}} + +{{t.confirmEmail.intro}} + +{{confirmUrl}} + +{{t.confirmEmail.expiry}} diff --git a/emails/theme.json b/emails/theme.json new file mode 100644 index 0000000..b7aa92f --- /dev/null +++ b/emails/theme.json @@ -0,0 +1,16 @@ +{ + "appName": "Pikku Starter", + "fonts": { + "body": "Inter, Arial, sans-serif" + }, + "colors": { + "canvas": "#0b1020", + "surface": "#11182d", + "border": "#263252", + "text": "#f7f8fb", + "muted": "#a8b0c5", + "accent": "#7dd3fc", + "button": "#f59e0b", + "buttonText": "#111827" + } +} diff --git a/knowledge/design-language.md b/knowledge/design-language.md new file mode 100644 index 0000000..219625c --- /dev/null +++ b/knowledge/design-language.md @@ -0,0 +1,23 @@ +--- +type: Decision +title: Design language +description: UI/UX conventions decided for this app, applied consistently. +tags: [design, ui] +--- +# Design Language + +High-level UI/UX decisions for this app. Use component inspection and the codebase for implementation details — record only things here that aren't obvious from reading the code, and only once a decision has been made and should be applied consistently. + + diff --git a/knowledge/index.md b/knowledge/index.md new file mode 100644 index 0000000..b410387 --- /dev/null +++ b/knowledge/index.md @@ -0,0 +1,51 @@ +--- +type: Overview +title: Knowledge base +description: The builder agent's long-term memory, in the Open Knowledge Format (OKF). +tags: [meta, okf] +--- +# Knowledge base + +This folder is the builder agent's long-term memory of **this company and product** — short +markdown notes, not code. The agent reads these at the start of every session and updates +them as it learns durable facts. + +## Record ONLY what pikku can't tell you + +Never duplicate anything the platform already gives you for free. Database tables and +columns, function signatures, routes, wirings, permissions, and roles are all discoverable +with `pikku meta` and the database tools — do **not** copy them here. They drift the moment +the code changes, and a stale copy is worse than none. + +Knowledge is the context introspection can't surface: + +- **Domain concepts** — what the business's own terms mean +- **Decisions and their reasons** — *why* an approach was chosen, trade-offs accepted +- **Preferences** — style, scope, and things to avoid +- **Constraints** — external facts (a partner API's quirk, a compliance rule) agreed with the user + +## Format — Open Knowledge Format (OKF v0.1) + +Each note is a markdown file whose **path is its identity**, with YAML frontmatter and a +markdown body. Frontmatter fields (only `type` is required): + +- `type` (required) — e.g. `Concept`, `Decision`, `Glossary`, `Preference`, `Overview` +- `title` — a short human label +- `description` — a one-line summary +- `tags` — a list for grouping and search, e.g. `[security, billing]` +- `resource` — a URL the note documents (a dashboard, doc, external service) +- `timestamp` — ISO-8601 of the last meaningful change + +Reserved filenames: `index.md` (this section overview) and `log.md` (a chronological +history of changes). Cross-link notes with normal markdown links — they form a graph. + +Suggested notes (create as needed): + +- `product.md` — what the product is, who it's for, the core problem it solves +- `glossary.md` — the company's own terms and what they mean +- `decisions.md` — choices made together and why +- `preferences.md` — style, scope, and things to avoid + +Keep notes concise and current. Do not store secrets or credentials here. + +Spec: https://github.com/GoogleCloudPlatform/knowledge-catalog/tree/main/okf diff --git a/knowledge/security.md b/knowledge/security.md new file mode 100644 index 0000000..5438320 --- /dev/null +++ b/knowledge/security.md @@ -0,0 +1,11 @@ +--- +type: Decision +title: Security +description: High-level, product-level security decisions for this app. +tags: [security] +--- +# Security + +High-level security decisions for this app. Use `pikku meta functions` to discover the actual auth functions, permissions, and roles — record only context here that isn't in the code. + + diff --git a/knowledge/technology.md b/knowledge/technology.md new file mode 100644 index 0000000..7b7eded --- /dev/null +++ b/knowledge/technology.md @@ -0,0 +1,11 @@ +--- +type: Decision +title: Technology +description: High-level technical decisions and context for this app. +tags: [technology, architecture] +--- +# Technology + +High-level technical decisions and context for this app. Use `pikku meta` and the database tools for implementation details — record only things here that aren't obvious from introspection. + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..d307679 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "@project/root", + "version": "0.0.1", + "private": true, + "packageManager": "bun@1.3.14", + "workspaces": [ + "apps/*", + "packages/*", + "design/*", + "e2e", + "!apps/_app_template_" + ], + "scripts": { + "prebuild": "cd packages/functions && pikku all", + "dev": "bun run --filter '@project/app' dev", + "tsc": "bun run --filter '*' tsc", + "lint": "oxlint --config ../.oxlintrc.json apps packages", + "format": "oxfmt --config ../.oxfmtrc.json apps packages", + "format:check": "oxfmt --check --config ../.oxfmtrc.json apps packages" + }, + "dependencies": { + "@pikku/addon-console": "^0.12.23", + "@pikku/ai-vercel": "^0.12.7", + "@pikku/assistant-ui": "^0.12.7", + "@pikku/better-auth": "^0.12.16", + "@pikku/core": "^0.12.57", + "@pikku/cucumber": "^0.12.11", + "@pikku/deploy-standalone": "^0.12.7", + "@pikku/fetch": "^0.12.6", + "@pikku/kysely": "^0.13.0", + "@pikku/kysely-node-sqlite": "^0.12.3", + "@pikku/kysely-sqlite": "^0.12.7", + "@pikku/mantine": "^0.12.6", + "@pikku/react": "^0.12.5", + "@pikku/schema-cfworker": "^0.12.4" + }, + "devDependencies": { + "@pikku/cli": "^0.12.76", + "oxfmt": "^0.53.0", + "oxlint": "^1.71.0" + }, + "overrides": { + "@pikku/core": "0.12.57" + } +} diff --git a/packages/components/index.ts b/packages/components/index.ts new file mode 100644 index 0000000..d8fa1b6 --- /dev/null +++ b/packages/components/index.ts @@ -0,0 +1,24 @@ +export { UserCard } from './src/UserCard' +export type { User, UserCardProps } from './src/UserCard' +export { stubQuery } from './src/fixtures/stubQuery' +export { stubMutation } from './src/fixtures/stubMutation' +export { EmptyState } from './src/EmptyState' +export { NotFoundState } from './src/NotFoundState' +export { PageLoader } from './src/PageLoader' +export { ServerErrorState } from './src/ServerErrorState' + +// Layout primitives — compose these instead of hand-rolling page chrome. +export { PageHeader } from './src/PageHeader' +export type { PageHeaderProps } from './src/PageHeader' +export { Panel } from './src/Panel' +export type { PanelProps } from './src/Panel' +export { StatCard } from './src/StatCard' +export type { StatCardProps } from './src/StatCard' +export { StatGrid } from './src/StatGrid' +export type { StatGridProps } from './src/StatGrid' + +// Data presentation — feed these the output of a list/stats RPC you implement. +export { DataTable } from './src/DataTable' +export type { DataTableProps, DataTableColumn } from './src/DataTable' +export { BarChart } from './src/BarChart' +export type { BarChartProps, BarChartDatum } from './src/BarChart' diff --git a/packages/components/package.json b/packages/components/package.json new file mode 100644 index 0000000..2a8004c --- /dev/null +++ b/packages/components/package.json @@ -0,0 +1,31 @@ +{ + "name": "@project/components", + "version": "0.0.1", + "private": true, + "type": "module", + "exports": { + ".": "./index.ts" + }, + "scripts": { + "tsc": "tsc --noEmit" + }, + "devDependencies": { + "@mantine/core": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@tanstack/react-query": "^5.66.0", + "@types/react": "^19", + "@types/react-dom": "^19", + "lucide-react": "^0.456.0", + "react": "^19.2.5", + "react-dom": "^19.2.5", + "typescript": "^5.9" + }, + "peerDependencies": { + "@mantine/core": "^9.2.1", + "@mantine/hooks": "^9.2.1", + "@tanstack/react-query": "^5.66.0", + "lucide-react": "^0.456.0", + "react": "^19.2.5", + "react-dom": "^19.2.5" + } +} diff --git a/packages/components/src/BarChart.tsx b/packages/components/src/BarChart.tsx new file mode 100644 index 0000000..5e3159d --- /dev/null +++ b/packages/components/src/BarChart.tsx @@ -0,0 +1,57 @@ +import React from 'react' +import { Box, Group, Stack, Text } from '@mantine/core' + +export interface BarChartDatum { + label: React.ReactNode + value: number + /** Mantine color key for the bar (e.g. 'teal', 'red'). Defaults to the theme primary. */ + color?: string +} + +export interface BarChartProps { + data: BarChartDatum[] + /** Format the numeric value shown at the end of each bar. */ + valueFormatter?: (value: number) => string +} + +// A dependency-free horizontal bar chart (CSS only, theme colours). Feed it +// aggregated counts from a stats RPC — no charting library to install or break. +export function BarChart({ data, valueFormatter }: BarChartProps) { + const max = Math.max(1, ...data.map((d) => d.value)) + const fmt = valueFormatter ?? ((n: number) => String(n)) + + return ( + + {data.map((datum, index) => ( + + + {datum.label} + + {fmt(datum.value)} + + + + + + + ))} + + ) +} diff --git a/packages/components/src/DataTable.tsx b/packages/components/src/DataTable.tsx new file mode 100644 index 0000000..67dbad6 --- /dev/null +++ b/packages/components/src/DataTable.tsx @@ -0,0 +1,85 @@ +import React from 'react' +import { Center, Loader, Table, Text } from '@mantine/core' + +export interface DataTableColumn { + /** Stable column id; also the default cell value (row[key]) when no render is given. */ + key: string + header: React.ReactNode + /** Custom cell renderer. Defaults to String(row[key]). */ + render?: (row: Row) => React.ReactNode + align?: 'left' | 'center' | 'right' + width?: number | string +} + +export interface DataTableProps { + columns: DataTableColumn[] + rows: Row[] + /** Stable key per row (e.g. r => r.taskId). */ + rowKey: (row: Row) => string + loading?: boolean + /** Shown when there are no rows (pass an for a rich version). */ + empty?: React.ReactNode + onRowClick?: (row: Row) => void +} + +// A generic, typed table. Wire it to any list RPC: implement listX, pass its +// rows here, and describe the columns. Pure presentation — no data fetching. +export function DataTable({ + columns, + rows, + rowKey, + loading, + empty, + onRowClick, +}: DataTableProps) { + if (loading) { + return ( +
+ +
+ ) + } + + if (rows.length === 0) { + return ( +
+ {empty ?? ( + + Nothing here yet. + + )} +
+ ) + } + + return ( + + + + {columns.map((col) => ( + + {col.header} + + ))} + + + + {rows.map((row) => ( + onRowClick(row) : undefined} + style={onRowClick ? { cursor: 'pointer' } : undefined} + > + {columns.map((col) => ( + + {col.render + ? col.render(row) + : String((row as Record)[col.key] ?? '')} + + ))} + + ))} + +
+ ) +} diff --git a/packages/components/src/EmptyState.stories.tsx b/packages/components/src/EmptyState.stories.tsx new file mode 100644 index 0000000..db216ee --- /dev/null +++ b/packages/components/src/EmptyState.stories.tsx @@ -0,0 +1,58 @@ +import { AlertCircle, Boxes, FolderOpen } from 'lucide-react' +import type { Story, StoryMeta } from './csf.types' +import { EmptyState } from './EmptyState' + +const meta: StoryMeta = { + title: 'EmptyState', + component: EmptyState, + tags: ['feedback'], + argTypes: { + icon: { description: 'Lucide icon component displayed above the title', control: false }, + title: { description: 'Primary heading text', control: 'text' }, + description: { description: 'Supporting text below the title', control: 'text' }, + action: { description: 'Label for the primary action button', control: 'text' }, + onAction: { description: 'Callback fired when the action button is clicked', control: false }, + compact: { + description: 'Reduces padding and icon size for inline contexts', + control: 'boolean', + }, + docsHref: { description: 'Optional link shown as a Docs button', control: 'text' }, + }, +} +export default meta + +function DefaultStory() { + return ( + + ) +} +export const Default: Story = { render: DefaultStory } + +function WithActionStory() { + return ( + {}} + /> + ) +} +export const WithAction: Story = { render: WithActionStory } + +function CompactStory() { + return ( + + ) +} +export const Compact: Story = { render: CompactStory } diff --git a/packages/components/src/EmptyState.tsx b/packages/components/src/EmptyState.tsx new file mode 100644 index 0000000..b69a6eb --- /dev/null +++ b/packages/components/src/EmptyState.tsx @@ -0,0 +1,77 @@ +import React from 'react' +import { Button, Center, Group, Stack, Text } from '@mantine/core' +import { ExternalLink } from 'lucide-react' + +interface EmptyStateProps { + icon: React.ComponentType<{ size?: number; strokeWidth?: number }> + title: string + description: React.ReactNode + action?: string + onAction?: () => void + actionIcon?: React.ReactNode + actionLoading?: boolean + secondaryText?: React.ReactNode + docsHref?: string + compact?: boolean +} + +export function EmptyState({ + icon, + title, + description, + action, + onAction, + actionIcon, + actionLoading, + secondaryText, + docsHref, + compact = false, +}: EmptyStateProps) { + const Icon = icon + + return ( +
+ + + + {title} + + + {description} + + {docsHref || (action && onAction) ? ( + + {docsHref ? ( + + ) : null} + {action && onAction ? ( + + ) : null} + + ) : null} + {secondaryText ? ( + + {secondaryText} + + ) : null} + +
+ ) +} diff --git a/packages/components/src/NotFoundState.stories.tsx b/packages/components/src/NotFoundState.stories.tsx new file mode 100644 index 0000000..1222ea3 --- /dev/null +++ b/packages/components/src/NotFoundState.stories.tsx @@ -0,0 +1,25 @@ +import type { Story, StoryMeta } from './csf.types' +import { NotFoundState } from './NotFoundState' + +const meta: StoryMeta = { + title: 'NotFoundState', + component: NotFoundState, + tags: ['feedback'], + argTypes: { + title: { description: 'Override the "Page not found" heading', control: 'text' }, + description: { description: 'Override the default description text', control: 'text' }, + }, +} +export default meta + +export const Default: Story = {} + +function CustomStory() { + return ( + + ) +} +export const Custom: Story = { render: CustomStory } diff --git a/packages/components/src/NotFoundState.tsx b/packages/components/src/NotFoundState.tsx new file mode 100644 index 0000000..28c0970 --- /dev/null +++ b/packages/components/src/NotFoundState.tsx @@ -0,0 +1,40 @@ +import { Center, Stack, Text } from '@mantine/core' + +interface NotFoundStateProps { + title?: string + description?: string +} + +export function NotFoundState({ + title = 'Page not found', + description = "The resource you're looking for doesn't exist or has been removed.", +}: NotFoundStateProps) { + return ( +
+ + + 404 + + + {title} + + + {description} + + +
+ ) +} diff --git a/packages/components/src/PageHeader.stories.tsx b/packages/components/src/PageHeader.stories.tsx new file mode 100644 index 0000000..3892f9f --- /dev/null +++ b/packages/components/src/PageHeader.stories.tsx @@ -0,0 +1,32 @@ +import { Button } from '@mantine/core' +import { Plus } from 'lucide-react' +import type { Story, StoryMeta } from './csf.types' +import { PageHeader } from './PageHeader' + +const meta: StoryMeta = { + title: 'PageHeader', + component: PageHeader, + tags: ['layout'], + argTypes: { + title: { description: 'Page title', control: 'text' }, + description: { description: 'Optional sub-text', control: 'text' }, + actions: { description: 'Right-aligned actions slot', control: false }, + }, +} +export default meta + +function DefaultStory() { + return +} +export const Default: Story = { render: DefaultStory } + +function WithActionStory() { + return ( + }>New task} + /> + ) +} +export const WithAction: Story = { render: WithActionStory } diff --git a/packages/components/src/PageHeader.tsx b/packages/components/src/PageHeader.tsx new file mode 100644 index 0000000..352d127 --- /dev/null +++ b/packages/components/src/PageHeader.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import { Box, Group, Stack, Text, Title } from '@mantine/core' + +export interface PageHeaderProps { + /** Page title. Pass an i18n string from the app (m.foo()). */ + title: React.ReactNode + /** Optional one-line description under the title. */ + description?: React.ReactNode + /** Right-aligned actions (buttons, menus). */ + actions?: React.ReactNode +} + +// The single shared page header every screen uses: a title, optional +// description, and a right-aligned action slot. Keeps headers consistent across +// pages — compose it, don't hand-roll a per-page header. +export function PageHeader({ title, description, actions }: PageHeaderProps) { + return ( + + + + {title} + + {description ? ( + + {description} + + ) : null} + + {actions ? {actions} : null} + + ) +} diff --git a/packages/components/src/PageLoader.stories.tsx b/packages/components/src/PageLoader.stories.tsx new file mode 100644 index 0000000..91f0100 --- /dev/null +++ b/packages/components/src/PageLoader.stories.tsx @@ -0,0 +1,11 @@ +import type { Story, StoryMeta } from './csf.types' +import { PageLoader } from './PageLoader' + +const meta: StoryMeta = { + title: 'PageLoader', + component: PageLoader, + tags: ['loading'], +} +export default meta + +export const Default: Story = {} diff --git a/packages/components/src/PageLoader.tsx b/packages/components/src/PageLoader.tsx new file mode 100644 index 0000000..e6b927b --- /dev/null +++ b/packages/components/src/PageLoader.tsx @@ -0,0 +1,16 @@ +import { Center, Loader } from '@mantine/core' + +export function PageLoader() { + return ( +
+ +
+ ) +} diff --git a/packages/components/src/Panel.tsx b/packages/components/src/Panel.tsx new file mode 100644 index 0000000..7fc15e7 --- /dev/null +++ b/packages/components/src/Panel.tsx @@ -0,0 +1,48 @@ +import React from 'react' +import { Card, Group, Stack, Text, Title } from '@mantine/core' + +export interface PanelProps { + /** Optional panel heading. */ + title?: React.ReactNode + /** Optional sub-text under the heading. */ + description?: React.ReactNode + /** Right-aligned header actions. */ + actions?: React.ReactNode + /** Panel body. */ + children: React.ReactNode + /** Remove inner padding (e.g. for a flush table). */ + noPadding?: boolean +} + +// A bordered content section with an optional titled header. The workhorse +// container — group related content into Panels instead of loose Cards. +export function Panel({ title, description, actions, children, noPadding }: PanelProps) { + return ( + + {title || actions ? ( + + + {title ? ( + + {title} + + ) : null} + {description ? ( + + {description} + + ) : null} + + {actions ?
{actions}
: null} +
+ ) : null} + {children} +
+ ) +} diff --git a/packages/components/src/ServerErrorState.stories.tsx b/packages/components/src/ServerErrorState.stories.tsx new file mode 100644 index 0000000..ab12cb4 --- /dev/null +++ b/packages/components/src/ServerErrorState.stories.tsx @@ -0,0 +1,47 @@ +import { useState } from 'react' +import type { Story, StoryMeta } from './csf.types' +import { ServerErrorState } from './ServerErrorState' + +const meta: StoryMeta = { + title: 'ServerErrorState', + component: ServerErrorState, + tags: ['feedback'], + argTypes: { + title: { description: 'Override the "Something went wrong" heading', control: 'text' }, + description: { description: 'Override the default error description', control: 'text' }, + onRetry: { description: 'Callback fired when the retry button is clicked', control: false }, + retrying: { + description: 'Shows a loading spinner on the retry button', + control: 'boolean', + }, + retryLabel: { description: 'Label for the retry button', control: 'text' }, + glyph: { + description: 'Custom element displayed above the title instead of "500"', + control: false, + }, + }, +} +export default meta + +export const Default: Story = {} + +function WithRetryStory() { + const [retrying, setRetrying] = useState(false) + const handleRetry = () => { + setRetrying(true) + setTimeout(() => setRetrying(false), 1500) + } + return +} +export const WithRetry: Story = { render: WithRetryStory } + +function CustomGlyphStory() { + return ( + ⚠️} + title="Unexpected error" + description="Please try again or contact support if the problem persists." + /> + ) +} +export const CustomGlyph: Story = { render: CustomGlyphStory } diff --git a/packages/components/src/ServerErrorState.tsx b/packages/components/src/ServerErrorState.tsx new file mode 100644 index 0000000..dabcdf6 --- /dev/null +++ b/packages/components/src/ServerErrorState.tsx @@ -0,0 +1,70 @@ +import type { ReactNode } from 'react' +import { Button, Center, Stack, Text } from '@mantine/core' +import { RefreshCw } from 'lucide-react' + +interface ServerErrorStateProps { + title?: string + description?: string + onRetry?: () => void + retrying?: boolean + retryLabel?: string + glyph?: ReactNode +} + +export function ServerErrorState({ + title = 'Something went wrong', + description = 'The server returned an error while loading this page.', + onRetry, + retrying = false, + retryLabel = 'Retry', + glyph, +}: ServerErrorStateProps) { + const normalizedDescription = typeof description === 'string' ? description.trim() : '' + const showDescription = + normalizedDescription.length > 0 && + normalizedDescription !== 'HTTP 500' && + normalizedDescription !== 'HTTP 500.' + + return ( +
+ + {glyph ?? ( + + 500 + + )} + + {title} + + {showDescription ? ( + + {normalizedDescription} + + ) : null} + {onRetry ? ( + + ) : null} + +
+ ) +} diff --git a/packages/components/src/StatCard.tsx b/packages/components/src/StatCard.tsx new file mode 100644 index 0000000..e4dbeeb --- /dev/null +++ b/packages/components/src/StatCard.tsx @@ -0,0 +1,37 @@ +import React from 'react' +import { Card, Group, Stack, Text, ThemeIcon } from '@mantine/core' + +export interface StatCardProps { + /** Metric label, e.g. "Open tasks". */ + label: React.ReactNode + /** The big number / value. */ + value: React.ReactNode + /** Optional Lucide icon component. */ + icon?: React.ComponentType<{ size?: number; strokeWidth?: number }> + /** Theme color for the icon tile (Mantine color key). Defaults to primary. */ + color?: string +} + +// A single metric tile: label, large value, optional icon. Compose several in a +// StatGrid for a dashboard summary row. +export function StatCard({ label, value, icon: Icon, color }: StatCardProps) { + return ( + + + + + {label} + + + {value} + + + {Icon ? ( + + + + ) : null} + + + ) +} diff --git a/packages/components/src/StatGrid.tsx b/packages/components/src/StatGrid.tsx new file mode 100644 index 0000000..51ef440 --- /dev/null +++ b/packages/components/src/StatGrid.tsx @@ -0,0 +1,21 @@ +import { SimpleGrid } from '@mantine/core' +import { StatCard, type StatCardProps } from './StatCard' + +export interface StatGridProps { + stats: StatCardProps[] + /** Columns on wide screens (responsive down to 1). Defaults to stats.length capped at 4. */ + columns?: number +} + +// A responsive row of StatCards. Feed it the metrics from a stats RPC +// (e.g. getTaskStats) mapped to {label, value, icon}. +export function StatGrid({ stats, columns }: StatGridProps) { + const cols = columns ?? Math.min(stats.length || 1, 4) + return ( + + {stats.map((stat, index) => ( + + ))} + + ) +} diff --git a/packages/components/src/UserCard.tsx b/packages/components/src/UserCard.tsx new file mode 100644 index 0000000..80c013f --- /dev/null +++ b/packages/components/src/UserCard.tsx @@ -0,0 +1,83 @@ +import { Avatar, Badge, Card, Group, Loader, Stack, Text } from '@mantine/core' +import type { UseQueryResult } from '@tanstack/react-query' + +export type User = { + id: string + name: string + email: string + role: string + status: 'active' | 'away' | 'offline' +} + +const STATUS_COLOR: Record = { + active: 'green', + away: 'yellow', + offline: 'gray', +} + +export type UserCardProps = { + query: UseQueryResult +} + +export const UserCard: React.FC = ({ query }) => { + if (query.isLoading) { + return ( + + + + + Loading user… + + + + ) + } + + if (query.isError) { + return ( + + + + Couldn’t load user + + + {query.error instanceof Error ? query.error.message : 'Unknown error'} + + + + ) + } + + const user = query.data + if (!user) { + return ( + + + No user to show. + + + ) + } + + return ( + + + + + + {user.name} + + {user.email} + + + + + {user.status} + + + + {user.role} + + + ) +} diff --git a/packages/components/src/csf.types.ts b/packages/components/src/csf.types.ts new file mode 100644 index 0000000..04687bd --- /dev/null +++ b/packages/components/src/csf.types.ts @@ -0,0 +1,21 @@ +import type { ComponentType } from 'react' + +export interface ArgType { + description?: string + control?: string | false + defaultValue?: unknown +} + +export interface StoryMeta { + title: string + component: ComponentType + description?: string + tags?: string[] + argTypes?: Record +} + +export interface Story { + args?: Record + render?: ComponentType + name?: string +} diff --git a/packages/components/src/fixtures/stubMutation.ts b/packages/components/src/fixtures/stubMutation.ts new file mode 100644 index 0000000..00d458b --- /dev/null +++ b/packages/components/src/fixtures/stubMutation.ts @@ -0,0 +1,69 @@ +import type { UseMutationResult } from '@tanstack/react-query' + +function build( + partial: Record, +): UseMutationResult { + return { + failureCount: 0, + failureReason: null, + isPaused: false, + submittedAt: 0, + context: undefined, + variables: undefined, + mutate: () => undefined, + mutateAsync: () => Promise.resolve(undefined as never), + reset: () => undefined, + ...partial, + } as unknown as UseMutationResult +} + +export const stubMutation = { + idle(): UseMutationResult { + return build({ + status: 'idle', + isIdle: true, + isPending: false, + isError: false, + isSuccess: false, + data: undefined, + error: null, + }) + }, + pending(): UseMutationResult { + return build({ + status: 'pending', + isIdle: false, + isPending: true, + isError: false, + isSuccess: false, + data: undefined, + error: null, + }) + }, + error( + error: Error, + ): UseMutationResult { + return build({ + status: 'error', + isIdle: false, + isPending: false, + isError: true, + isSuccess: false, + data: undefined, + error, + }) + }, + success( + data: TData, + ): UseMutationResult { + return build({ + status: 'success', + isIdle: false, + isPending: false, + isError: false, + isSuccess: true, + data, + error: null, + }) + }, +} diff --git a/packages/components/src/fixtures/stubQuery.ts b/packages/components/src/fixtures/stubQuery.ts new file mode 100644 index 0000000..497a3c7 --- /dev/null +++ b/packages/components/src/fixtures/stubQuery.ts @@ -0,0 +1,66 @@ +import type { UseQueryResult } from '@tanstack/react-query' + +function build(partial: Record): UseQueryResult { + return { + failureCount: 0, + failureReason: null, + errorUpdateCount: 0, + isFetched: true, + isFetchedAfterMount: true, + isFetching: partial.fetchStatus === 'fetching', + isPaused: false, + isPlaceholderData: false, + isRefetching: false, + isStale: false, + isInitialLoading: partial.isLoading === true, + isLoadingError: false, + isRefetchError: false, + dataUpdatedAt: 0, + errorUpdatedAt: 0, + refetch: () => Promise.resolve(undefined as never), + promise: Promise.resolve(undefined as never), + ...partial, + } as unknown as UseQueryResult +} + +export const stubQuery = { + loading(): UseQueryResult { + return build({ + status: 'pending', + fetchStatus: 'fetching', + isPending: true, + isLoading: true, + isError: false, + isSuccess: false, + data: undefined, + error: null, + }) + }, + error(error: Error): UseQueryResult { + return build({ + status: 'error', + fetchStatus: 'idle', + isPending: false, + isLoading: false, + isError: true, + isSuccess: false, + data: undefined, + error, + }) + }, + success(data: T): UseQueryResult { + return build({ + status: 'success', + fetchStatus: 'idle', + isPending: false, + isLoading: false, + isError: false, + isSuccess: true, + data, + error: null, + }) + }, + empty(): UseQueryResult { + return stubQuery.success(null as T) + }, +} diff --git a/packages/components/tsconfig.json b/packages/components/tsconfig.json new file mode 100644 index 0000000..6c547ca --- /dev/null +++ b/packages/components/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "noEmit": true + }, + "include": ["index.ts", "src"] +} diff --git a/packages/functions-sdk/package.json b/packages/functions-sdk/package.json new file mode 100644 index 0000000..6dd1b95 --- /dev/null +++ b/packages/functions-sdk/package.json @@ -0,0 +1,19 @@ +{ + "name": "@project/functions-sdk", + "version": "0.0.1", + "private": true, + "type": "module", + "exports": { + "./pikku/api.gen": "./src/pikku/api.gen.ts", + "./pikku/pikku-fetch.gen": "./src/pikku/pikku-fetch.gen.ts", + "./pikku/pikku-rpc.gen": "./src/pikku/pikku-rpc.gen.ts", + "./pikku/rpc-map.gen": "./src/pikku/rpc-map.gen.d.ts", + "./pikku/http-map.gen": "./src/pikku/http-map.gen.d.ts", + "./pikku/*": "./src/pikku/*" + }, + "dependencies": { + "@pikku/fetch": "^0.12.6", + "@pikku/react": "^0.12.5", + "@tanstack/react-query": "^5.66.0" + } +} diff --git a/packages/functions/.pikku/agent/pikku-agent-map.gen.d.ts b/packages/functions/.pikku/agent/pikku-agent-map.gen.d.ts new file mode 100644 index 0000000..5fac765 --- /dev/null +++ b/packages/functions/.pikku/agent/pikku-agent-map.gen.d.ts @@ -0,0 +1,4 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +export type AgentMap = {} diff --git a/packages/functions/.pikku/auth/auth.types.ts b/packages/functions/.pikku/auth/auth.types.ts new file mode 100644 index 0000000..ba1cafe --- /dev/null +++ b/packages/functions/.pikku/auth/auth.types.ts @@ -0,0 +1,26 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +// AUTO-GENERATED by pikku CLI — do not edit + +import { pikkuBetterAuth as _pikkuBetterAuth } from '@pikku/better-auth' +import type { BetterAuthInstance, PikkuBetterAuthFactory } from '@pikku/better-auth' +import type { SingletonServices } from '../function/pikku-function-types.gen.js' +import { TypedSecretService } from '../secrets/pikku-secrets.gen.js' +import { TypedVariablesService } from '../variables/pikku-variables.gen.js' + +type AuthSingletonServices = Omit & { + secrets: TypedSecretService + variables: TypedVariablesService +} + +export const pikkuBetterAuth = ( + factory: (services: AuthSingletonServices) => I | Promise +): PikkuBetterAuthFactory => + _pikkuBetterAuth((services) => + factory({ + ...services, + secrets: new TypedSecretService(services.secrets), + variables: new TypedVariablesService(services.variables), + } as AuthSingletonServices) + ) diff --git a/packages/functions/.pikku/channel/pikku-channels-map.gen.d.ts b/packages/functions/.pikku/channel/pikku-channels-map.gen.d.ts new file mode 100644 index 0000000..990e47d --- /dev/null +++ b/packages/functions/.pikku/channel/pikku-channels-map.gen.d.ts @@ -0,0 +1,89 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +/** + * This provides the structure needed for TypeScript to be aware of channels + */ + +import type { StubCall } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/stub-tracker' + +import type { StubCall } from '/Users/yasser/git/pikku/fabric/templates/starter-template/node_modules/.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/stub-tracker.d.ts' + +export type AgentApproveCallerInput = { agentName: string; runId: string; approvals: { toolCallId: string; approved: boolean; }[]; } +export type AgentCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; } +export type AgentResumeCallerInput = { agentName: string; runId: string; toolCallId: string; approved: boolean; } +export type AgentStreamCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; context?: string | undefined; } +export type AuthHandlerOutput = Promise | Promise +export type DeleteAgentThreadInput = { threadId: string; resourceId?: string | undefined; } +export type DeleteAgentThreadOutput = { deleted: boolean; } +export type GetAgentThreadMessagesInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadMessagesOutput = any[] +export type GetAgentThreadRunsInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadRunsOutput = any[] +export type GetAgentThreadsInput = { agentName?: string | undefined; resourceId?: string | undefined; limit?: number | undefined; offset?: number | undefined; } +export type GetAgentThreadsOutput = any[] +export type GetSessionInput = {} +export type GetSessionOutput = { + userId: string; + email: string; + name: string | null; +} +export type GraphStarterInput = { workflowName: string; nodeId: string; data?: unknown; } +export type GraphStarterOutput = { runId: string; } +export type PikkuConsoleGetSecretInput = { secretId: string; } +export type PikkuConsoleGetSecretOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleGetVariableInput = { variableId: string; } +export type PikkuConsoleGetVariableOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleHasSecretInput = { secretId: string; } +export type PikkuConsoleHasSecretOutput = { exists: boolean; } +export type PikkuConsoleSetSecretInput = { secretId: string; value: unknown; } +export type PikkuConsoleSetSecretOutput = { success: boolean; } +export type PikkuConsoleSetVariableInput = { variableId: string; value: unknown; } +export type PikkuConsoleSetVariableOutput = { success: boolean; } +export type PikkuScenarioGetStubCallsInput = { service?: string | undefined; } +export type PikkuScenarioGetStubCallsOutput = StubCall[] +export type PikkuScenarioResetLiveCoverageOutput = { enabled: boolean; } +export type PikkuScenarioResetStubsOutput = { enabled: boolean; } +export type RealtimeEventStreamInput = { topic: string; } +export type RealtimeSubscribeInput = { topic: string; } +export type RealtimeUnsubscribeInput = { topic: string; } +export type RpcCallerInput = { rpcName: string; data?: unknown; } +export type SecretSchema_betterAuthSecret = string +export type SessionHealthScenarioOutput = { email: string; userId: string; } +export type WorkflowRunnerInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterOutput = { runId: string; } +export type WorkflowStatusCheckerInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamFullInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamInput = { workflowName: string; runId: string; } + +interface ChannelHandler { + input: I; + output: O; +} + +export type ChannelsMap = { + readonly 'events': { + readonly routes: { + readonly action: { + readonly subscribe: ChannelHandler, + readonly unsubscribe: ChannelHandler, + }, + }, + readonly defaultMessage: never, + }, +}; + +export type ChannelDefaultHandlerOf = + ChannelsMap[Channel]['defaultMessage'] extends { input: infer I; output: infer O } + ? ChannelHandler + : never; + +export type ChannelWiringHandlerOf< + Channel extends keyof ChannelsMap, + Route extends keyof ChannelsMap[Channel]['routes'], + Method extends keyof ChannelsMap[Channel]['routes'][Route], +> = + ChannelsMap[Channel]['routes'][Route][Method] extends { input: infer I; output: infer O } + ? ChannelHandler + : never; diff --git a/packages/functions/.pikku/db/classification-map.gen.d.ts b/packages/functions/.pikku/db/classification-map.gen.d.ts new file mode 100644 index 0000000..f2f3adb --- /dev/null +++ b/packages/functions/.pikku/db/classification-map.gen.d.ts @@ -0,0 +1,141 @@ +// Generated by @pikku/cli — do not edit by hand. +// Run `pikku db migrate` to refresh. +// Use this type in db/classifications.ts: +// import type { DbClassificationMap } from './.pikku/db/classification-map.gen.d.ts' +// export const classifications = { ... } satisfies DbClassificationMap + +export type ColumnEntry = { + /** Privacy level. Defaults to 'private' when omitted. */ + security?: 'public' | 'private' | 'pii' | 'secret' | 'encrypted' + /** Anonymize strategy used by `pikku db anonymize`. */ + classification?: 'fake:email' | 'fake:name' | 'hash' | 'keep' + /** Column kind override for codegen coercion + typing. */ + kind?: 'date' | 'bool' | 'json' | 'uuid' + /** TypeScript type override, e.g. `string[]` or `MyJson`. Wins over `kind`. */ + tsType?: string + /** Zod string-format validator (keeps the TS type as `string`). */ + format?: 'email' | 'url' | 'emoji' | 'e164' | 'jwt' | 'cuid' | 'cuid2' | 'ulid' | 'nanoid' | 'base64' | 'base64url' | 'ipv4' | 'ipv6' | 'cidrv4' | 'cidrv6' | 'isoDate' | 'isoTime' | 'isoDatetime' | 'isoDuration' + description?: string +} + +export type DbClassificationMap = { + "account": { + "id": ColumnEntry + "account_id": ColumnEntry + "provider_id": ColumnEntry + "user_id": ColumnEntry + "access_token": ColumnEntry + "refresh_token": ColumnEntry + "id_token": ColumnEntry + "access_token_expires_at": ColumnEntry + "refresh_token_expires_at": ColumnEntry + "scope": ColumnEntry + "password": ColumnEntry + "created_at": ColumnEntry + "updated_at": ColumnEntry + } + "ai_message": { + "id": ColumnEntry + "thread_id": ColumnEntry + "role": ColumnEntry + "content": ColumnEntry + "created_at": ColumnEntry + } + "ai_run": { + "run_id": ColumnEntry + "agent_name": ColumnEntry + "thread_id": ColumnEntry + "resource_id": ColumnEntry + "status": ColumnEntry + "error_message": ColumnEntry + "suspend_reason": ColumnEntry + "missing_rpcs": ColumnEntry + "usage_input_tokens": ColumnEntry + "usage_output_tokens": ColumnEntry + "usage_model": ColumnEntry + "created_at": ColumnEntry + "updated_at": ColumnEntry + } + "ai_threads": { + "id": ColumnEntry + "resource_id": ColumnEntry + "title": ColumnEntry + "metadata": ColumnEntry + "created_at": ColumnEntry + "updated_at": ColumnEntry + } + "ai_tool_call": { + "id": ColumnEntry + "thread_id": ColumnEntry + "message_id": ColumnEntry + "run_id": ColumnEntry + "tool_name": ColumnEntry + "args": ColumnEntry + "result": ColumnEntry + "approval_status": ColumnEntry + "approval_type": ColumnEntry + "agent_run_id": ColumnEntry + "display_tool_name": ColumnEntry + "display_args": ColumnEntry + "created_at": ColumnEntry + } + "ai_working_memory": { + "id": ColumnEntry + "scope": ColumnEntry + "data": ColumnEntry + "updated_at": ColumnEntry + } + "audit": { + "audit_id": ColumnEntry + "occurred_at": ColumnEntry + "type": ColumnEntry + "source": ColumnEntry + "outcome": ColumnEntry + "function_id": ColumnEntry + "wire_type": ColumnEntry + "trace_id": ColumnEntry + "transaction_id": ColumnEntry + "query_id": ColumnEntry + "actor_user_id": ColumnEntry + "actor_org_id": ColumnEntry + "tables": ColumnEntry + "changed_cols": ColumnEntry + "event": ColumnEntry + "old": ColumnEntry + "data": ColumnEntry + } + "session": { + "id": ColumnEntry + "expires_at": ColumnEntry + "token": ColumnEntry + "created_at": ColumnEntry + "updated_at": ColumnEntry + "ip_address": ColumnEntry + "user_agent": ColumnEntry + "user_id": ColumnEntry + "impersonated_by": ColumnEntry + } + "user": { + "id": ColumnEntry + "name": ColumnEntry + "email": ColumnEntry + "email_verified": ColumnEntry + "image": ColumnEntry + "created_at": ColumnEntry + "updated_at": ColumnEntry + "actor": ColumnEntry + "role": ColumnEntry + "banned": ColumnEntry + "ban_reason": ColumnEntry + "ban_expires": ColumnEntry + "fabric": ColumnEntry + } + "verification": { + "id": ColumnEntry + "identifier": ColumnEntry + "value": ColumnEntry + "expires_at": ColumnEntry + "created_at": ColumnEntry + "updated_at": ColumnEntry + } +} diff --git a/packages/functions/.pikku/http/pikku-http-wirings-map.gen.d.ts b/packages/functions/.pikku/http/pikku-http-wirings-map.gen.d.ts new file mode 100644 index 0000000..9894201 --- /dev/null +++ b/packages/functions/.pikku/http/pikku-http-wirings-map.gen.d.ts @@ -0,0 +1,148 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +/** + * This provides the structure needed for typescript to be aware of routes and their return types + */ + +import type { StubCall } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/stub-tracker' +import type { StreamWorkflowRunInput } from '.bun/@pikku+addon-console@0.12.26+8a6fcc78e6b267a5/node_modules/@pikku/addon-console/dist/.pikku/rpc/pikku-rpc-wirings-map.internal.gen' +import type { WorkflowRunStatus } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/wirings/workflow/workflow.types' + + +export type AgentApproveCallerInput = { agentName: string; runId: string; approvals: { toolCallId: string; approved: boolean; }[]; } +export type AgentCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; } +export type AgentResumeCallerInput = { agentName: string; runId: string; toolCallId: string; approved: boolean; } +export type AgentStreamCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; context?: string | undefined; } +export type AuthHandlerOutput = Promise | Promise +export type DeleteAgentThreadInput = { threadId: string; resourceId?: string | undefined; } +export type DeleteAgentThreadOutput = { deleted: boolean; } +export type GetAgentThreadMessagesInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadMessagesOutput = any[] +export type GetAgentThreadRunsInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadRunsOutput = any[] +export type GetAgentThreadsInput = { agentName?: string | undefined; resourceId?: string | undefined; limit?: number | undefined; offset?: number | undefined; } +export type GetAgentThreadsOutput = any[] +export type GetSessionInput = {} +export type GetSessionOutput = { + userId: string; + email: string; + name: string | null; +} +export type GraphStarterInput = { workflowName: string; nodeId: string; data?: unknown; } +export type GraphStarterOutput = { runId: string; } +export type PikkuConsoleGetSecretInput = { secretId: string; } +export type PikkuConsoleGetSecretOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleGetVariableInput = { variableId: string; } +export type PikkuConsoleGetVariableOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleHasSecretInput = { secretId: string; } +export type PikkuConsoleHasSecretOutput = { exists: boolean; } +export type PikkuConsoleSetSecretInput = { secretId: string; value: unknown; } +export type PikkuConsoleSetSecretOutput = { success: boolean; } +export type PikkuConsoleSetVariableInput = { variableId: string; value: unknown; } +export type PikkuConsoleSetVariableOutput = { success: boolean; } +export type PikkuScenarioGetStubCallsInput = { service?: string | undefined; } +export type PikkuScenarioGetStubCallsOutput = StubCall[] +export type PikkuScenarioResetLiveCoverageOutput = { enabled: boolean; } +export type PikkuScenarioResetStubsOutput = { enabled: boolean; } +export type RealtimeEventStreamInput = { topic: string; } +export type RealtimeSubscribeInput = { topic: string; } +export type RealtimeUnsubscribeInput = { topic: string; } +export type RpcCallerInput = { rpcName: string; data?: unknown; } +export type SecretSchema_betterAuthSecret = string +export type SessionHealthScenarioOutput = { email: string; userId: string; } +export type WorkflowRunnerInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterOutput = { runId: string; } +export type WorkflowStatusCheckerInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamFullInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamInput = { workflowName: string; runId: string; } + +// The '& {}' is a workaround for not directly refering to a type since it confuses typescript +export type AgentCallerInputParams = Pick & {} +export type AgentCallerInputBody = Omit & {} +export type AgentStreamCallerInputParams = Pick & {} +export type AgentStreamCallerInputBody = Omit & {} +export type AgentApproveCallerInputParams = Pick & {} +export type AgentApproveCallerInputBody = Omit & {} +export type AgentResumeCallerInputParams = Pick & {} +export type AgentResumeCallerInputBody = Omit & {} +export type StreamWorkflowRunInputParams = Pick & {} +export type StreamWorkflowRunInputBody = Omit & {} +export type RealtimeEventStreamInputParams = Pick & {} +export type RealtimeEventStreamInputBody = Omit & {} +export type RpcCallerInputParams = Pick & {} +export type RpcCallerInputBody = Omit & {} +export type WorkflowStarterInputParams = Pick & {} +export type WorkflowStarterInputBody = Omit & {} +export type WorkflowRunnerInputParams = Pick & {} +export type WorkflowRunnerInputBody = Omit & {} +export type WorkflowStatusCheckerInputParams = Pick & {} +export type WorkflowStatusCheckerInputBody = Omit & {} +export type WorkflowStatusStreamInputParams = Pick & {} +export type WorkflowStatusStreamInputBody = Omit & {} +export type WorkflowStatusStreamFullInputParams = Pick & {} +export type WorkflowStatusStreamFullInputBody = Omit & {} +export type GraphStarterInputParams = Pick & {} +export type GraphStarterInputBody = Omit & {} + +interface HTTPWiringHandler { + input: I; + output: O; +} + +export type HTTPWiringsMap = { + readonly '/api/auth{/*splat}': { + readonly GET: HTTPWiringHandler, + readonly POST: HTTPWiringHandler, + }, + readonly '/workflow-run/:runId/stream': { + readonly GET: HTTPWiringHandler, + }, + readonly '/events/:topic': { + readonly GET: HTTPWiringHandler, + }, + readonly '/workflow/:workflowName/status/:runId': { + readonly GET: HTTPWiringHandler, + }, + readonly '/workflow/:workflowName/status/:runId/stream': { + readonly GET: HTTPWiringHandler, + }, + readonly '/workflow/:workflowName/status/:runId/stream/full': { + readonly GET: HTTPWiringHandler, + }, + readonly '/rpc/agent/:agentName': { + readonly POST: HTTPWiringHandler, + }, + readonly '/rpc/agent/:agentName/stream': { + readonly POST: HTTPWiringHandler, + }, + readonly '/rpc/agent/:agentName/approve': { + readonly POST: HTTPWiringHandler, + }, + readonly '/rpc/agent/:agentName/resume': { + readonly POST: HTTPWiringHandler, + }, + readonly '/rpc/:rpcName': { + readonly POST: HTTPWiringHandler, + }, + readonly '/workflow/:workflowName/start': { + readonly POST: HTTPWiringHandler, + }, + readonly '/workflow/:workflowName/run': { + readonly POST: HTTPWiringHandler, + }, + readonly '/workflow/:workflowName/graph/:nodeId': { + readonly POST: HTTPWiringHandler, + }, +}; + +export type HTTPWiringHandlerOf = + HTTPWiringsMap[HTTPWiring][Method] extends { input: infer I; output: infer O } + ? HTTPWiringHandler + : never; + +export type HTTPWiringsWithMethod = { + [HTTPWiring in keyof HTTPWiringsMap]: Method extends keyof HTTPWiringsMap[HTTPWiring] ? HTTPWiring : never; +}[keyof HTTPWiringsMap]; + \ No newline at end of file diff --git a/packages/functions/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts b/packages/functions/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts new file mode 100644 index 0000000..7248fb3 --- /dev/null +++ b/packages/functions/.pikku/rpc/pikku-rpc-wirings-map.gen.d.ts @@ -0,0 +1,168 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +/** + * This provides the structure needed for typescript to be aware of RPCs and their return types + */ + + +import type { StubCall } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/stub-tracker' +import type { FunctionCoverageReport } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/v8-coverage-service' + +export type AgentApproveCallerInput = { agentName: string; runId: string; approvals: { toolCallId: string; approved: boolean; }[]; } +export type AgentCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; } +export type AgentResumeCallerInput = { agentName: string; runId: string; toolCallId: string; approved: boolean; } +export type AgentStreamCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; context?: string | undefined; } +export type AuthHandlerOutput = Promise | Promise +export type DeleteAgentThreadInput = { threadId: string; resourceId?: string | undefined; } +export type DeleteAgentThreadOutput = { deleted: boolean; } +export type GetAgentThreadMessagesInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadMessagesOutput = any[] +export type GetAgentThreadRunsInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadRunsOutput = any[] +export type GetAgentThreadsInput = { agentName?: string | undefined; resourceId?: string | undefined; limit?: number | undefined; offset?: number | undefined; } +export type GetAgentThreadsOutput = any[] +export type GetSessionInput = {} +export type GetSessionOutput = { + userId: string; + email: string; + name: string | null; +} +export type GraphStarterInput = { workflowName: string; nodeId: string; data?: unknown; } +export type GraphStarterOutput = { runId: string; } +export type PikkuConsoleGetSecretInput = { secretId: string; } +export type PikkuConsoleGetSecretOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleGetVariableInput = { variableId: string; } +export type PikkuConsoleGetVariableOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleHasSecretInput = { secretId: string; } +export type PikkuConsoleHasSecretOutput = { exists: boolean; } +export type PikkuConsoleSetSecretInput = { secretId: string; value: unknown; } +export type PikkuConsoleSetSecretOutput = { success: boolean; } +export type PikkuConsoleSetVariableInput = { variableId: string; value: unknown; } +export type PikkuConsoleSetVariableOutput = { success: boolean; } +export type PikkuScenarioGetStubCallsInput = { service?: string | undefined; } +export type PikkuScenarioGetStubCallsOutput = StubCall[] +export type PikkuScenarioResetLiveCoverageOutput = { enabled: boolean; } +export type PikkuScenarioResetStubsOutput = { enabled: boolean; } +export type RealtimeEventStreamInput = { topic: string; } +export type RealtimeSubscribeInput = { topic: string; } +export type RealtimeUnsubscribeInput = { topic: string; } +export type RpcCallerInput = { rpcName: string; data?: unknown; } +export type SecretSchema_betterAuthSecret = string +export type SessionHealthScenarioOutput = { email: string; userId: string; } +export type WorkflowRunnerInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterOutput = { runId: string; } +export type WorkflowStatusCheckerInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamFullInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamInput = { workflowName: string; runId: string; } + +interface RPCHandler { + input: I; + output: O; +} + +export type RPCMap = { + readonly 'getSession': RPCHandler, + readonly 'getAgentThreads': RPCHandler, + readonly 'getAgentThreadMessages': RPCHandler, + readonly 'getAgentThreadRuns': RPCHandler, + readonly 'deleteAgentThread': RPCHandler, + readonly 'pikkuConsoleSetSecret': RPCHandler, + readonly 'pikkuConsoleGetVariable': RPCHandler, + readonly 'pikkuConsoleSetVariable': RPCHandler, + readonly 'pikkuConsoleHasSecret': RPCHandler, + readonly 'pikkuConsoleGetSecret': RPCHandler, + readonly 'pikkuScenarioTakeLiveCoverage': RPCHandler, + readonly 'pikkuScenarioResetLiveCoverage': RPCHandler, + readonly 'pikkuScenarioResetStubs': RPCHandler, + readonly 'pikkuScenarioGetStubCalls': RPCHandler, +}; + + +// Addon package RPC maps +import type { RPCMap as ConsoleRPCMap } from '@pikku/addon-console/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.js' + + +// Utility type to prefix keys with namespace (skips 'any' to prevent type poisoning) +type PrefixKeys = unknown extends T ? {} : { + [K in keyof T as `${Prefix}:${string & K}`]: T[K] +} + +// Merge all RPC maps with namespace prefixes +export type FlattenedRPCMap = + RPCMap & PrefixKeys + +type IsAny = 0 extends (1 & T) ? true : false +type IsVoidishInput = IsAny extends true + ? false + : [T] extends [void | null | undefined] + ? true + : false + + +export type RPCInvoke = ( + ...args: IsVoidishInput extends true + ? [name: Name] + : [name: Name, data: FlattenedRPCMap[Name]['input']] +) => Promise + +export type RPCRemote = ( + ...args: IsVoidishInput extends true + ? [name: Name] + : [name: Name, data: FlattenedRPCMap[Name]['input']] +) => Promise + +import type { FlattenedWorkflowMap } from '../workflow/pikku-workflow-map.gen.d.js' + +import type { AgentMap } from '../agent/pikku-agent-map.gen.d.js' + +// Addon package Agent maps +import type { AgentMap as ConsoleAgentMap } from '@pikku/addon-console/.pikku/agent/pikku-agent-map.gen.d.js' + + +type FlattenedAgentMap = + AgentMap & PrefixKeys + + +import type { PikkuRPC } from '@pikku/core/rpc' + +interface AIAgentInput { + message: string + threadId: string + resourceId: string +} + +export type TypedStartWorkflow = ( + name: Name, + input: FlattenedWorkflowMap[Name]['input'], + options?: { startNode?: string } +) => Promise<{ runId: string }> + +export type TypedRunWorkflow = ( + name: Name, + input: FlattenedWorkflowMap[Name]['input'] +) => Promise + +export type TypedWorkflowStatus = ( + workflowName: string, + runId: string +) => Promise<{ id: string; status: 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled'; output?: unknown; error?: { message?: string } }> + +type TypedAgentRun = [keyof FlattenedAgentMap] extends [never] + ? (name: string, input: AIAgentInput) => Promise + : ( + name: Name, + input: AIAgentInput + ) => Promise<{ runId: string; result: FlattenedAgentMap[Name]['output']; usage: { inputTokens: number; outputTokens: number } }> + +type TypedAgentStream = [keyof FlattenedAgentMap] extends [never] + ? (name: string, input: AIAgentInput, options?: { requiresToolApproval?: 'all' | 'explicit' | false }) => Promise + : ( + name: Name, + input: AIAgentInput, + options?: { requiresToolApproval?: 'all' | 'explicit' | false } + ) => Promise + +export type TypedPikkuRPC = PikkuRPC + \ No newline at end of file diff --git a/packages/functions/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts b/packages/functions/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts new file mode 100644 index 0000000..54e7e83 --- /dev/null +++ b/packages/functions/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.d.ts @@ -0,0 +1,185 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +/** + * This provides the structure needed for typescript to be aware of RPCs and their return types + */ + + +import type { StubCall } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/stub-tracker' +import type { FunctionCoverageReport } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/v8-coverage-service' +import type { WorkflowRunStatus } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/wirings/workflow/workflow.types' + +export type AgentApproveCallerInput = { agentName: string; runId: string; approvals: { toolCallId: string; approved: boolean; }[]; } +export type AgentCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; } +export type AgentResumeCallerInput = { agentName: string; runId: string; toolCallId: string; approved: boolean; } +export type AgentStreamCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; context?: string | undefined; } +export type AuthHandlerOutput = Promise | Promise +export type DeleteAgentThreadInput = { threadId: string; resourceId?: string | undefined; } +export type DeleteAgentThreadOutput = { deleted: boolean; } +export type GetAgentThreadMessagesInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadMessagesOutput = any[] +export type GetAgentThreadRunsInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadRunsOutput = any[] +export type GetAgentThreadsInput = { agentName?: string | undefined; resourceId?: string | undefined; limit?: number | undefined; offset?: number | undefined; } +export type GetAgentThreadsOutput = any[] +export type GetSessionInput = {} +export type GetSessionOutput = { + userId: string; + email: string; + name: string | null; +} +export type GraphStarterInput = { workflowName: string; nodeId: string; data?: unknown; } +export type GraphStarterOutput = { runId: string; } +export type PikkuConsoleGetSecretInput = { secretId: string; } +export type PikkuConsoleGetSecretOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleGetVariableInput = { variableId: string; } +export type PikkuConsoleGetVariableOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleHasSecretInput = { secretId: string; } +export type PikkuConsoleHasSecretOutput = { exists: boolean; } +export type PikkuConsoleSetSecretInput = { secretId: string; value: unknown; } +export type PikkuConsoleSetSecretOutput = { success: boolean; } +export type PikkuConsoleSetVariableInput = { variableId: string; value: unknown; } +export type PikkuConsoleSetVariableOutput = { success: boolean; } +export type PikkuScenarioGetStubCallsInput = { service?: string | undefined; } +export type PikkuScenarioGetStubCallsOutput = StubCall[] +export type PikkuScenarioResetLiveCoverageOutput = { enabled: boolean; } +export type PikkuScenarioResetStubsOutput = { enabled: boolean; } +export type RealtimeEventStreamInput = { topic: string; } +export type RealtimeSubscribeInput = { topic: string; } +export type RealtimeUnsubscribeInput = { topic: string; } +export type RpcCallerInput = { rpcName: string; data?: unknown; } +export type SecretSchema_betterAuthSecret = string +export type SessionHealthScenarioOutput = { email: string; userId: string; } +export type WorkflowRunnerInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterOutput = { runId: string; } +export type WorkflowStatusCheckerInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamFullInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamInput = { workflowName: string; runId: string; } + +interface RPCHandler { + input: I; + output: O; +} + +export type RPCMap = { + readonly 'getSession': RPCHandler, + readonly 'sessionHealthScenario': RPCHandler, + readonly 'agentCaller': RPCHandler, + readonly 'agentStreamCaller': RPCHandler, + readonly 'agentApproveCaller': RPCHandler, + readonly 'agentResumeCaller': RPCHandler, + readonly 'getAgentThreads': RPCHandler, + readonly 'getAgentThreadMessages': RPCHandler, + readonly 'getAgentThreadRuns': RPCHandler, + readonly 'deleteAgentThread': RPCHandler, + readonly 'authHandler': RPCHandler, + readonly 'pikkuConsoleSetSecret': RPCHandler, + readonly 'pikkuConsoleGetVariable': RPCHandler, + readonly 'pikkuConsoleSetVariable': RPCHandler, + readonly 'pikkuConsoleHasSecret': RPCHandler, + readonly 'pikkuConsoleGetSecret': RPCHandler, + readonly 'realtimeSubscribe': RPCHandler, + readonly 'realtimeUnsubscribe': RPCHandler, + readonly 'realtimeEventStream': RPCHandler, + readonly 'rpcCaller': RPCHandler, + readonly 'pikkuScenarioTakeLiveCoverage': RPCHandler, + readonly 'pikkuScenarioResetLiveCoverage': RPCHandler, + readonly 'pikkuScenarioResetStubs': RPCHandler, + readonly 'pikkuScenarioGetStubCalls': RPCHandler, + readonly 'workflowStarter': RPCHandler, + readonly 'workflowRunner': RPCHandler, + readonly 'workflowStatusChecker': RPCHandler, + readonly 'workflowStatusStream': RPCHandler, + readonly 'workflowStatusStreamFull': RPCHandler, + readonly 'graphStarter': RPCHandler, +}; + + +// Addon package RPC maps +import type { RPCMap as ConsoleRPCMap } from '@pikku/addon-console/.pikku/rpc/pikku-rpc-wirings-map.internal.gen.js' + + +// Utility type to prefix keys with namespace (skips 'any' to prevent type poisoning) +type PrefixKeys = unknown extends T ? {} : { + [K in keyof T as `${Prefix}:${string & K}`]: T[K] +} + +// Merge all RPC maps with namespace prefixes +export type FlattenedRPCMap = + RPCMap & PrefixKeys + +type IsAny = 0 extends (1 & T) ? true : false +type IsVoidishInput = IsAny extends true + ? false + : [T] extends [void | null | undefined] + ? true + : false + + +export type RPCInvoke = ( + ...args: IsVoidishInput extends true + ? [name: Name] + : [name: Name, data: FlattenedRPCMap[Name]['input']] +) => Promise + +export type RPCRemote = ( + ...args: IsVoidishInput extends true + ? [name: Name] + : [name: Name, data: FlattenedRPCMap[Name]['input']] +) => Promise + +import type { FlattenedWorkflowMap } from '../workflow/pikku-workflow-map.gen.d.js' + +import type { AgentMap } from '../agent/pikku-agent-map.gen.d.js' + +// Addon package Agent maps +import type { AgentMap as ConsoleAgentMap } from '@pikku/addon-console/.pikku/agent/pikku-agent-map.gen.d.js' + + +type FlattenedAgentMap = + AgentMap & PrefixKeys + + +import type { PikkuRPC } from '@pikku/core/rpc' + +interface AIAgentInput { + message: string + threadId: string + resourceId: string +} + +export type TypedStartWorkflow = ( + name: Name, + input: FlattenedWorkflowMap[Name]['input'], + options?: { startNode?: string } +) => Promise<{ runId: string }> + +export type TypedRunWorkflow = ( + name: Name, + input: FlattenedWorkflowMap[Name]['input'] +) => Promise + +export type TypedWorkflowStatus = ( + workflowName: string, + runId: string +) => Promise<{ id: string; status: 'running' | 'suspended' | 'completed' | 'failed' | 'cancelled'; output?: unknown; error?: { message?: string } }> + +type TypedAgentRun = [keyof FlattenedAgentMap] extends [never] + ? (name: string, input: AIAgentInput) => Promise + : ( + name: Name, + input: AIAgentInput + ) => Promise<{ runId: string; result: FlattenedAgentMap[Name]['output']; usage: { inputTokens: number; outputTokens: number } }> + +type TypedAgentStream = [keyof FlattenedAgentMap] extends [never] + ? (name: string, input: AIAgentInput, options?: { requiresToolApproval?: 'all' | 'explicit' | false }) => Promise + : ( + name: Name, + input: AIAgentInput, + options?: { requiresToolApproval?: 'all' | 'explicit' | false } + ) => Promise + +export type TypedPikkuRPC = PikkuRPC + \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/AgentApproveCallerInput.schema.json b/packages/functions/.pikku/schemas/schemas/AgentApproveCallerInput.schema.json new file mode 100644 index 0000000..5755207 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/AgentApproveCallerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"agentName":{"type":"string"},"runId":{"type":"string"},"approvals":{"type":"array","items":{"type":"object","properties":{"toolCallId":{"type":"string"},"approved":{"type":"boolean"}},"required":["toolCallId","approved"],"additionalProperties":false}}},"required":["agentName","runId","approvals"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/AgentCallerInput.schema.json b/packages/functions/.pikku/schemas/schemas/AgentCallerInput.schema.json new file mode 100644 index 0000000..4c67865 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/AgentCallerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"agentName":{"type":"string"},"message":{"type":"string"},"threadId":{"type":"string"},"resourceId":{"type":"string"}},"required":["agentName","message","threadId","resourceId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/AgentResumeCallerInput.schema.json b/packages/functions/.pikku/schemas/schemas/AgentResumeCallerInput.schema.json new file mode 100644 index 0000000..064659f --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/AgentResumeCallerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"agentName":{"type":"string"},"runId":{"type":"string"},"toolCallId":{"type":"string"},"approved":{"type":"boolean"}},"required":["agentName","runId","toolCallId","approved"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/AgentStreamCallerInput.schema.json b/packages/functions/.pikku/schemas/schemas/AgentStreamCallerInput.schema.json new file mode 100644 index 0000000..d807ee4 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/AgentStreamCallerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"agentName":{"type":"string"},"message":{"type":"string"},"threadId":{"type":"string"},"resourceId":{"type":"string"},"context":{"type":"string"}},"required":["agentName","message","threadId","resourceId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/AuthHandlerOutput.schema.json b/packages/functions/.pikku/schemas/schemas/AuthHandlerOutput.schema.json new file mode 100644 index 0000000..b4c29d6 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/AuthHandlerOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"type":"null"},{}],"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/DeleteAgentThreadInput.schema.json b/packages/functions/.pikku/schemas/schemas/DeleteAgentThreadInput.schema.json new file mode 100644 index 0000000..498b0a5 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/DeleteAgentThreadInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"threadId":{"type":"string"},"resourceId":{"type":"string"}},"required":["threadId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/DeleteAgentThreadOutput.schema.json b/packages/functions/.pikku/schemas/schemas/DeleteAgentThreadOutput.schema.json new file mode 100644 index 0000000..ba9f308 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/DeleteAgentThreadOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"deleted":{"type":"boolean"}},"required":["deleted"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/FunctionCoverageReport.schema.json b/packages/functions/.pikku/schemas/schemas/FunctionCoverageReport.schema.json new file mode 100644 index 0000000..06d3745 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/FunctionCoverageReport.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"generatedAt":{"type":"string"},"summary":{"type":"object","properties":{"total":{"type":"number"},"covered":{"type":"number"},"partial":{"type":"number"},"uncovered":{"type":"number"},"unknown":{"type":"number"},"overallRatio":{"type":"number"}},"required":["total","covered","partial","uncovered","unknown","overallRatio"],"additionalProperties":false},"functions":{"type":"array","items":{"$ref":"#/definitions/FunctionCoverageEntry"}}},"required":["generatedAt","summary","functions"],"additionalProperties":false,"definitions":{"FunctionCoverageEntry":{"type":"object","properties":{"name":{"type":"string"},"sourceFile":{"type":"string"},"exposed":{"type":"boolean"},"description":{"type":["string","null"]},"coveredLines":{"type":"number"},"totalLines":{"type":"number"},"missedLines":{"type":"array","items":{"type":"number"}},"ratio":{"type":"number"},"status":{"$ref":"#/definitions/CoverageStatus"}},"required":["name","sourceFile","exposed","description","coveredLines","totalLines","missedLines","ratio","status"],"additionalProperties":false},"CoverageStatus":{"type":"string","enum":["covered","partial","uncovered","unknown"]}}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesInput.schema.json b/packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesInput.schema.json new file mode 100644 index 0000000..498b0a5 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"threadId":{"type":"string"},"resourceId":{"type":"string"}},"required":["threadId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesOutput.schema.json b/packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesOutput.schema.json new file mode 100644 index 0000000..3997471 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetAgentThreadMessagesOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"array","items":{},"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsInput.schema.json b/packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsInput.schema.json new file mode 100644 index 0000000..498b0a5 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"threadId":{"type":"string"},"resourceId":{"type":"string"}},"required":["threadId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsOutput.schema.json b/packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsOutput.schema.json new file mode 100644 index 0000000..3997471 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetAgentThreadRunsOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"array","items":{},"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetAgentThreadsInput.schema.json b/packages/functions/.pikku/schemas/schemas/GetAgentThreadsInput.schema.json new file mode 100644 index 0000000..e2fc213 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetAgentThreadsInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"agentName":{"type":"string"},"resourceId":{"type":"string"},"limit":{"type":"number"},"offset":{"type":"number"}},"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetAgentThreadsOutput.schema.json b/packages/functions/.pikku/schemas/schemas/GetAgentThreadsOutput.schema.json new file mode 100644 index 0000000..3997471 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetAgentThreadsOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"array","items":{},"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetSessionInput.schema.json b/packages/functions/.pikku/schemas/schemas/GetSessionInput.schema.json new file mode 100644 index 0000000..281508a --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetSessionInput.schema.json @@ -0,0 +1 @@ +{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{},"additionalProperties":false} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GetSessionOutput.schema.json b/packages/functions/.pikku/schemas/schemas/GetSessionOutput.schema.json new file mode 100644 index 0000000..504af58 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GetSessionOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"userId":{"type":"string"},"email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["userId","email","name"],"additionalProperties":false} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GraphStarterInput.schema.json b/packages/functions/.pikku/schemas/schemas/GraphStarterInput.schema.json new file mode 100644 index 0000000..070cb3f --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GraphStarterInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"workflowName":{"type":"string"},"nodeId":{"type":"string"},"data":{}},"required":["workflowName","nodeId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/GraphStarterOutput.schema.json b/packages/functions/.pikku/schemas/schemas/GraphStarterOutput.schema.json new file mode 100644 index 0000000..372a091 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/GraphStarterOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"runId":{"type":"string"}},"required":["runId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretInput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretInput.schema.json new file mode 100644 index 0000000..850d438 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"secretId":{"type":"string"}},"required":["secretId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretOutput.schema.json new file mode 100644 index 0000000..1593607 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetSecretOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"exists":{"type":"boolean"},"value":{}},"required":["exists","value"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableInput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableInput.schema.json new file mode 100644 index 0000000..7b106f4 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"variableId":{"type":"string"}},"required":["variableId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableOutput.schema.json new file mode 100644 index 0000000..1593607 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleGetVariableOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"exists":{"type":"boolean"},"value":{}},"required":["exists","value"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretInput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretInput.schema.json new file mode 100644 index 0000000..850d438 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"secretId":{"type":"string"}},"required":["secretId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretOutput.schema.json new file mode 100644 index 0000000..cce6013 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleHasSecretOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"exists":{"type":"boolean"}},"required":["exists"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretInput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretInput.schema.json new file mode 100644 index 0000000..c85adda --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"secretId":{"type":"string"},"value":{}},"required":["secretId","value"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretOutput.schema.json new file mode 100644 index 0000000..a64cffc --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetSecretOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableInput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableInput.schema.json new file mode 100644 index 0000000..e4deefb --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"variableId":{"type":"string"},"value":{}},"required":["variableId","value"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableOutput.schema.json new file mode 100644 index 0000000..a64cffc --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuConsoleSetVariableOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"success":{"type":"boolean"}},"required":["success"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsInput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsInput.schema.json new file mode 100644 index 0000000..f1c744a --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"service":{"type":"string"}},"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsOutput.schema.json new file mode 100644 index 0000000..0ab91a6 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuScenarioGetStubCallsOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"array","items":{"$ref":"#/definitions/StubCall"},"definitions":{"StubCall":{"type":"object","properties":{"service":{"type":"string"},"method":{"type":"string"},"args":{"type":"array","items":{}}},"required":["service","method","args"],"additionalProperties":false}}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuScenarioResetLiveCoverageOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuScenarioResetLiveCoverageOutput.schema.json new file mode 100644 index 0000000..3df1434 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuScenarioResetLiveCoverageOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/PikkuScenarioResetStubsOutput.schema.json b/packages/functions/.pikku/schemas/schemas/PikkuScenarioResetStubsOutput.schema.json new file mode 100644 index 0000000..3df1434 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/PikkuScenarioResetStubsOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"enabled":{"type":"boolean"}},"required":["enabled"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/RealtimeEventStreamInput.schema.json b/packages/functions/.pikku/schemas/schemas/RealtimeEventStreamInput.schema.json new file mode 100644 index 0000000..5000bc2 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/RealtimeEventStreamInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"topic":{"type":"string"}},"required":["topic"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/RealtimeSubscribeInput.schema.json b/packages/functions/.pikku/schemas/schemas/RealtimeSubscribeInput.schema.json new file mode 100644 index 0000000..5000bc2 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/RealtimeSubscribeInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"topic":{"type":"string"}},"required":["topic"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/RealtimeUnsubscribeInput.schema.json b/packages/functions/.pikku/schemas/schemas/RealtimeUnsubscribeInput.schema.json new file mode 100644 index 0000000..5000bc2 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/RealtimeUnsubscribeInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"topic":{"type":"string"}},"required":["topic"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/RpcCallerInput.schema.json b/packages/functions/.pikku/schemas/schemas/RpcCallerInput.schema.json new file mode 100644 index 0000000..8f8a8bb --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/RpcCallerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"rpcName":{"type":"string"},"data":{}},"required":["rpcName"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/SecretSchema_betterAuthSecret.schema.json b/packages/functions/.pikku/schemas/schemas/SecretSchema_betterAuthSecret.schema.json new file mode 100644 index 0000000..aef59da --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/SecretSchema_betterAuthSecret.schema.json @@ -0,0 +1 @@ +{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string"} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/SessionHealthScenarioOutput.schema.json b/packages/functions/.pikku/schemas/schemas/SessionHealthScenarioOutput.schema.json new file mode 100644 index 0000000..93d3ca6 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/SessionHealthScenarioOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"email":{"type":"string"},"userId":{"type":"string"}},"required":["email","userId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/StreamWorkflowRunInput.schema.json b/packages/functions/.pikku/schemas/schemas/StreamWorkflowRunInput.schema.json new file mode 100644 index 0000000..372a091 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/StreamWorkflowRunInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"runId":{"type":"string"}},"required":["runId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowRunStatus.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowRunStatus.schema.json new file mode 100644 index 0000000..df611dd --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowRunStatus.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"id":{"type":"string"},"status":{"$ref":"#/definitions/WorkflowStatus"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"deterministic":{"type":"boolean"},"plannedSteps":{"type":"array","items":{"$ref":"#/definitions/WorkflowPlannedStep"}},"steps":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"status":{"$ref":"#/definitions/StepStatus"},"duration":{"type":"number"},"attempts":{"type":"number","description":"Number of attempts for this step (1 = first try; > 1 means it retried)."}},"required":["name","status"],"additionalProperties":false}},"output":{},"error":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"],"additionalProperties":false}},"required":["id","status","startedAt","steps"],"additionalProperties":false,"definitions":{"WorkflowStatus":{"type":"string","enum":["running","suspended","completed","failed","cancelled"],"description":"Workflow run status"},"WorkflowPlannedStep":{"type":"object","properties":{"stepName":{"type":"string","description":"Durable step key — matches the runtime step name stored in the DB"},"displayName":{"type":"string","description":"Optional human-readable label for the UI timeline (falls back to stepName)"}},"required":["stepName"],"additionalProperties":false},"StepStatus":{"type":"string","enum":["pending","running","scheduled","succeeded","failed","suspended"],"description":"Workflow step status"}}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowRunnerInput.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowRunnerInput.schema.json new file mode 100644 index 0000000..a935145 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowRunnerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"workflowName":{"type":"string"},"data":{}},"required":["workflowName"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowStarterInput.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowStarterInput.schema.json new file mode 100644 index 0000000..a935145 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowStarterInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"workflowName":{"type":"string"},"data":{}},"required":["workflowName"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowStarterOutput.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowStarterOutput.schema.json new file mode 100644 index 0000000..372a091 --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowStarterOutput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"runId":{"type":"string"}},"required":["runId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowStatusCheckerInput.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowStatusCheckerInput.schema.json new file mode 100644 index 0000000..290db2f --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowStatusCheckerInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"workflowName":{"type":"string"},"runId":{"type":"string"}},"required":["workflowName","runId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamFullInput.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamFullInput.schema.json new file mode 100644 index 0000000..290db2f --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamFullInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"workflowName":{"type":"string"},"runId":{"type":"string"}},"required":["workflowName","runId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamInput.schema.json b/packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamInput.schema.json new file mode 100644 index 0000000..290db2f --- /dev/null +++ b/packages/functions/.pikku/schemas/schemas/WorkflowStatusStreamInput.schema.json @@ -0,0 +1 @@ +{"$schema":"http://json-schema.org/draft-07/schema#","type":"object","properties":{"workflowName":{"type":"string"},"runId":{"type":"string"}},"required":["workflowName","runId"],"additionalProperties":false,"definitions":{}} \ No newline at end of file diff --git a/packages/functions/.pikku/workflow/pikku-workflow-map.gen.d.ts b/packages/functions/.pikku/workflow/pikku-workflow-map.gen.d.ts new file mode 100644 index 0000000..eb179f4 --- /dev/null +++ b/packages/functions/.pikku/workflow/pikku-workflow-map.gen.d.ts @@ -0,0 +1,97 @@ +/** + * This file was generated by @pikku/cli@0.12.76 + */ +/** + * Workflow type map with input/output types for each workflow + */ + +import type { StubCall } from '.bun/@pikku+core@0.12.57/node_modules/@pikku/core/dist/services/stub-tracker' + +export type AgentApproveCallerInput = { agentName: string; runId: string; approvals: { toolCallId: string; approved: boolean; }[]; } +export type AgentCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; } +export type AgentResumeCallerInput = { agentName: string; runId: string; toolCallId: string; approved: boolean; } +export type AgentStreamCallerInput = { agentName: string; message: string; threadId: string; resourceId: string; context?: string | undefined; } +export type AuthHandlerOutput = Promise | Promise +export type DeleteAgentThreadInput = { threadId: string; resourceId?: string | undefined; } +export type DeleteAgentThreadOutput = { deleted: boolean; } +export type GetAgentThreadMessagesInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadMessagesOutput = any[] +export type GetAgentThreadRunsInput = { threadId: string; resourceId?: string | undefined; } +export type GetAgentThreadRunsOutput = any[] +export type GetAgentThreadsInput = { agentName?: string | undefined; resourceId?: string | undefined; limit?: number | undefined; offset?: number | undefined; } +export type GetAgentThreadsOutput = any[] +export type GetSessionInput = {} +export type GetSessionOutput = { + userId: string; + email: string; + name: string | null; +} +export type GraphStarterInput = { workflowName: string; nodeId: string; data?: unknown; } +export type GraphStarterOutput = { runId: string; } +export type PikkuConsoleGetSecretInput = { secretId: string; } +export type PikkuConsoleGetSecretOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleGetVariableInput = { variableId: string; } +export type PikkuConsoleGetVariableOutput = { exists: boolean; value: unknown; } +export type PikkuConsoleHasSecretInput = { secretId: string; } +export type PikkuConsoleHasSecretOutput = { exists: boolean; } +export type PikkuConsoleSetSecretInput = { secretId: string; value: unknown; } +export type PikkuConsoleSetSecretOutput = { success: boolean; } +export type PikkuConsoleSetVariableInput = { variableId: string; value: unknown; } +export type PikkuConsoleSetVariableOutput = { success: boolean; } +export type PikkuScenarioGetStubCallsInput = { service?: string | undefined; } +export type PikkuScenarioGetStubCallsOutput = StubCall[] +export type PikkuScenarioResetLiveCoverageOutput = { enabled: boolean; } +export type PikkuScenarioResetStubsOutput = { enabled: boolean; } +export type RealtimeEventStreamInput = { topic: string; } +export type RealtimeSubscribeInput = { topic: string; } +export type RealtimeUnsubscribeInput = { topic: string; } +export type RpcCallerInput = { rpcName: string; data?: unknown; } +export type SecretSchema_betterAuthSecret = string +export type SessionHealthScenarioOutput = { email: string; userId: string; } +export type WorkflowRunnerInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterInput = { workflowName: string; data?: unknown; } +export type WorkflowStarterOutput = { runId: string; } +export type WorkflowStatusCheckerInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamFullInput = { workflowName: string; runId: string; } +export type WorkflowStatusStreamInput = { workflowName: string; runId: string; } + +// Addon package Workflow maps +import type { WorkflowMap as ConsoleWorkflowMap } from '@pikku/addon-console/.pikku/workflow/pikku-workflow-map.gen.d.js' + + +interface WorkflowHandler { + input: I; + output: O; +} + +interface GraphNodeHandler { + input: I; +} + +export type WorkflowMap = { + readonly 'sessionHealthScenario': WorkflowHandler, +}; + +export type GraphsMap = { + readonly 'sessionHealthScenario': { + readonly 'visitor signs in and reads their session': GraphNodeHandler, + }, +}; + +type PrefixWorkflowKeys = unknown extends T ? {} : { + [K in keyof T as `${Prefix}:${string & K}`]: T[K] +} + +export type FlattenedWorkflowMap = + WorkflowMap & PrefixWorkflowKeys + + +export type WorkflowClient = { + start: (input: FlattenedWorkflowMap[Name]['input']) => Promise<{ runId: string }>; + getRun: (runId: string) => Promise; + cancelRun: (runId: string) => Promise; +} + +export type TypedWorkflowClients = { + [Name in keyof FlattenedWorkflowMap]: WorkflowClient; +} diff --git a/packages/functions/package.json b/packages/functions/package.json new file mode 100644 index 0000000..81b7d7e --- /dev/null +++ b/packages/functions/package.json @@ -0,0 +1,34 @@ +{ + "name": "@project/functions", + "version": "0.0.1", + "private": true, + "type": "module", + "imports": { + "#pikku": "./.pikku/pikku-types.gen.ts", + "#pikku/*.gen.js": "./.pikku/*.gen.ts", + "#pikku/*": "./.pikku/*" + }, + "scripts": { + "db:types": "pikku db types" + }, + "dependencies": { + "@ai-sdk/openai-compatible": "^2.0.48", + "@pikku/addon-console": "^0.12.22", + "@pikku/ai-vercel": "^0.12.7", + "@pikku/better-auth": "^0.12.16", + "@pikku/core": "^0.12.57", + "@pikku/kysely": "^0.13.0", + "@pikku/schema-cfworker": "^0.12.4", + "@standard-schema/spec": "^1.1.0", + "ai": "^6.0.0", + "better-auth": "^1.6.18", + "kysely": "^0.29.0", + "tsx": "^4.21.0", + "zod": "^4.3.6" + }, + "devDependencies": { + "@pikku/deploy-standalone": "^0.12.7", + "@types/node": "^22", + "typescript": "^5.9.3" + } +} diff --git a/packages/functions/src/application-types.d.ts b/packages/functions/src/application-types.d.ts new file mode 100644 index 0000000..98904c7 --- /dev/null +++ b/packages/functions/src/application-types.d.ts @@ -0,0 +1,39 @@ +import type { CoreServices, CoreSingletonServices, CoreConfig, CoreUserSession } from '@pikku/core' +import type { AuditLog, EmailService } from '@pikku/core/services' +import type { Kysely } from 'kysely' +import type { DB } from '#pikku/db/schema.gen.js' +import type { TypedSecretService } from '../.pikku/secrets/pikku-secrets.gen.js' +import type { TypedVariablesService } from '../.pikku/variables/pikku-variables.gen.js' +import type { auth } from './auth.js' + +export interface UserSession extends CoreUserSession { + userId: string +} + +export interface Config extends CoreConfig { + port: number + hostname: string +} + +export interface SingletonServices extends CoreSingletonServices { + variables: TypedVariablesService + secrets: TypedSecretService + kysely: Kysely + // Resolved Better Auth instance, injected once by the generated pikkuServices + // wrapper from the `auth` factory. Typed as the factory's return so functions + // get better-auth's full server `api`/`handler` surface via DI. + auth: Awaited> + // Always constructed in services.ts, so declare it REQUIRED here — it is + // optional in CoreSingletonServices, which otherwise makes every emailService + // use read as possibly-undefined and forces needless `!`/guards in functions. + emailService: EmailService + // Per-invocation audit log, ALWAYS returned from createWireServices (see + // services.ts) so general activity logging is available in every function — + // `await auditLog.write({ type, source: 'explicit', metadata })`. Declared + // REQUIRED (like emailService above) so a plain `auditLog.write(...)` doesn't + // read as possibly-undefined and force needless `?.`/guards. A function with + // `audit: true` ADDITIONALLY gets a kysely wrapped to capture every table write. + auditLog: AuditLog +} + +export interface Services extends CoreServices {} diff --git a/packages/functions/src/auth.ts b/packages/functions/src/auth.ts new file mode 100644 index 0000000..7b9760f --- /dev/null +++ b/packages/functions/src/auth.ts @@ -0,0 +1,72 @@ +import { betterAuth } from 'better-auth' +import { admin } from 'better-auth/plugins' +import { actor, fabric } from '@pikku/better-auth' +import { pikkuBetterAuth } from '#pikku' + +/** + * Better Auth configuration — email + password sign-in. + * + * `pikkuBetterAuth` has no side effects: the pikku CLI statically inspects this single + * exported `auth` const and generates the catch-all `/api/auth/**` HTTP wiring, + * the session-bridge middleware, and a `wireSecret` for `BETTER_AUTH_SECRET` (and + * one per social provider, if you add any) — so the auth routes and secret + * requirements flow through normal inspection into the deploy manifest. + * + * The factory runs once when singleton services are built, pulling the secret + * (and the database) off the injected `services`; the resolved instance is then + * available to every function as `services.auth`. Better Auth is given the app's + * own kysely: the CamelCasePlugin maps Better Auth's camelCase field names onto + * the snake_case columns created in db/sqlite/0001-init.sql, keeping the whole DB + * on one naming convention. To offer Google / GitHub / ... add a `socialProviders` + * entry (and a button on the login page) — the CLI will wire its secret too. + */ +// The factory receives the FULL singleton services (emailService, logger, …) — +// destructure whatever you need, e.g. `{ kysely, secrets, emailService }` to wire +// sendResetPassword/verification emails. It runs lazily after all services exist, +// so never re-construct a service here or reach for a dynamic import. +export const auth = pikkuBetterAuth(async ({ kysely, secrets, variables }) => { + const BETTER_AUTH_SECRET = await secrets.getSecret('BETTER_AUTH_SECRET') + // Genuinely optional: unset simply disables /api/auth/sign-in/actor (scenarios + // off for this deployment) — the actor plugin refuses all sign-ins + // without it. + const SCENARIO_ACTOR_SECRET = await secrets + .getSecret('SCENARIO_ACTOR_SECRET') + .catch(() => undefined) + // Fabric operator admin: the RSA public key the control plane's token is + // verified against. The Fabric deployer pushes FABRIC_AUTH_PUBLIC_KEY onto + // every stage; locally it's simply absent, which disables /sign-in/fabric. + // Asymmetric — the app verifies, it can never forge an operator login. + const FABRIC_AUTH_PUBLIC_KEY = await variables.get('FABRIC_AUTH_PUBLIC_KEY') + + return betterAuth({ + secret: BETTER_AUTH_SECRET, + database: { db: kysely, type: 'sqlite' }, + emailAndPassword: { enabled: true }, + // Stateless session: CLI splits out betterAuthStatelessSession so non-auth + // units verify the signed cookie instead of bundling better-auth. pikku #737. + session: { cookieCache: { enabled: true } }, + advanced: { database: { generateId: 'uuid' } }, + // Scenario actors: synthetic users (user.actor = true, see + // db/sqlite/0003-user-actor.sql) signed in by pikkuScenario via + // POST /api/auth/sign-in/actor { email, secret }. Never signs in real users. + // + // admin(): exposes /api/auth/admin/* (listUsers, setRole, impersonateUser, + // …) so an app admin can list and "view as" their end-users — this is what + // the Fabric console's Users tab drives. Adds role/banned/impersonatedBy + // columns (see db/sqlite/0004-admin.sql). No user is an admin by default: + // grant it by setting a user's `role` to 'admin' (or pass + // `adminUserIds: [...]` here) — the admin API refuses non-admins. + // + // fabric(): exposes /api/auth/sign-in/fabric — the Fabric control plane + // mints a short-lived RS256 token and signs in as a synthetic `fabric: true` + // admin operator (db/sqlite/0005-fabric.sql), so the console Users tab can + // list/impersonate real users without the operator being one of them. It + // pairs with admin() and verifies against FABRIC_AUTH_PUBLIC_KEY; missing + // key disables the endpoint. + plugins: [ + actor({ secret: SCENARIO_ACTOR_SECRET }), + admin(), + fabric({ publicKey: FABRIC_AUTH_PUBLIC_KEY }), + ], + }) +}) diff --git a/packages/functions/src/config.ts b/packages/functions/src/config.ts new file mode 100644 index 0000000..0e8e8c0 --- /dev/null +++ b/packages/functions/src/config.ts @@ -0,0 +1,6 @@ +import { pikkuConfig } from '../.pikku/pikku-types.gen.js' + +export const createConfig = pikkuConfig(async () => ({ + port: parseInt(process.env.API_PORT || '4003', 10), + hostname: process.env.HOST || '0.0.0.0', +})) diff --git a/packages/functions/src/functions/get-session.function.ts b/packages/functions/src/functions/get-session.function.ts new file mode 100644 index 0000000..287a395 --- /dev/null +++ b/packages/functions/src/functions/get-session.function.ts @@ -0,0 +1,32 @@ +import { z } from 'zod' +import { pikkuFunc } from '#pikku' + +export const GetSessionInput = z.object({}) + +export const GetSessionOutput = z.object({ + userId: z.string(), + email: z.string().email(), + name: z.string().nullable(), +}) + +export const getSession = pikkuFunc({ + expose: true, + readonly: true, + auth: true, + description: 'Returns the current signed-in user.', + input: GetSessionInput, + output: GetSessionOutput, + func: async ({ kysely }, _input, { session }) => { + const user = await kysely + .selectFrom('user') + .select(['id', 'email', 'name']) + .where('id', '=', session!.userId) + .executeTakeFirstOrThrow() + + return { + userId: user.id, + email: user.email, + name: user.name ?? null, + } + }, +}) diff --git a/packages/functions/src/functions/session-health.scenario.ts b/packages/functions/src/functions/session-health.scenario.ts new file mode 100644 index 0000000..d0fd4c7 --- /dev/null +++ b/packages/functions/src/functions/session-health.scenario.ts @@ -0,0 +1,33 @@ +import { pikkuScenario } from '#pikku/workflow/pikku-workflow-types.gen.js' + +/** + * A scenario is a story of RPC calls told through a synthetic persona (an + * "actor" — see scenarios.actors in pikku.config.json). Every step runs over + * the REAL transport with the actor's session cookie, so a passing scenario + * proves the deployed API works exactly as a signed-in user would experience it. + * + * Run it with `pikku scenario run local` (needs SCENARIO_ACTOR_SECRET in the + * environment — the actor plugin in src/auth.ts refuses sign-ins without it). + * This one signs the visitor in and reads their own session: actor sign-in, + * session cookie, authed RPC, and session mapping in one pass — a ready-made + * health check for staging or production. + */ +export const sessionHealthScenario = pikkuScenario({ + title: 'Session health (scenario)', + tags: ['scenario'], + func: async ({ logger }, _input, { workflow, actors }) => { + if (!actors?.visitor) { + throw new Error( + 'sessionHealthScenario needs run actors (visitor) — run via `pikku scenario run `', + ) + } + logger.debug('session-health scenario starting') + const session = await workflow.do( + 'visitor signs in and reads their session', + 'getSession', + {}, + { actor: actors.visitor }, + ) + return { email: session.email, userId: session.userId } + }, +}) diff --git a/packages/functions/src/lib/email-service.ts b/packages/functions/src/lib/email-service.ts new file mode 100644 index 0000000..628be3a --- /dev/null +++ b/packages/functions/src/lib/email-service.ts @@ -0,0 +1,52 @@ +import { + LocalEmailService, + type EmailService, + type SendEmailInput, + type SendEmailResult, +} from '@pikku/core/services' +import { renderEmailTemplate, type EmailTemplateName } from '../../.pikku/email/pikku-emails.gen.js' + +type GeneratedTemplateEmailServiceOptions = { + delegate?: EmailService + defaultLocale?: string +} + +export class GeneratedTemplateEmailService implements EmailService { + private readonly delegate: EmailService + private readonly defaultLocale: string + + constructor(options: GeneratedTemplateEmailServiceOptions = {}) { + this.delegate = options.delegate ?? new LocalEmailService() + this.defaultLocale = options.defaultLocale ?? 'en' + } + + async send(input: SendEmailInput): Promise { + if (!('template' in input) || !input.template) { + return this.delegate.send(input) + } + + const rendered = renderEmailTemplate({ + name: input.template.name as EmailTemplateName, + locale: (input.template.locale ?? this.defaultLocale) as Parameters< + typeof renderEmailTemplate + >[0]['locale'], + data: input.template.data ?? {}, + }) + + return this.delegate.send({ + to: input.to, + from: input.from, + cc: input.cc, + bcc: input.bcc, + replyTo: input.replyTo, + headers: { + ...(input.headers ?? {}), + 'x-pikku-email-template': String(input.template.name), + 'x-pikku-email-hash': rendered.hash, + }, + subject: rendered.subject, + html: rendered.html, + ...(rendered.text ? { text: rendered.text } : {}), + }) + } +} diff --git a/packages/functions/src/middleware/cors.middleware.ts b/packages/functions/src/middleware/cors.middleware.ts new file mode 100644 index 0000000..f86fcef --- /dev/null +++ b/packages/functions/src/middleware/cors.middleware.ts @@ -0,0 +1,18 @@ +import { addHTTPMiddleware } from '@pikku/core/http' +import { cors } from '@pikku/core/middleware' + +const corsOrigins = process.env.CORS_ORIGINS + ? process.env.CORS_ORIGINS.split(',') + .map((origin) => origin.trim()) + .filter(Boolean) + : [process.env.FRONTEND_URL, 'http://localhost:7104', 'http://127.0.0.1:7104'].filter( + (origin): origin is string => Boolean(origin), + ) + +addHTTPMiddleware('*', [ + cors({ + origin: corsOrigins, + credentials: true, + headers: ['Content-Type', 'Authorization', 'X-Auth-Return-Redirect'], + }), +]) diff --git a/packages/functions/src/services.ts b/packages/functions/src/services.ts new file mode 100644 index 0000000..055ab1d --- /dev/null +++ b/packages/functions/src/services.ts @@ -0,0 +1,98 @@ +import { + JsonConsoleLogger, + LocalEmailService, + LocalSecretService, + LocalVariablesService, + NoopAuditService, + createInvocationAudit, +} from '@pikku/core/services' +import { createAuditedKysely } from '@pikku/kysely' +import { pikkuServices, pikkuWireServices } from '../.pikku/pikku-types.gen.js' +import { TypedSecretService } from '../.pikku/secrets/pikku-secrets.gen.js' +import { TypedVariablesService } from '../.pikku/variables/pikku-variables.gen.js' +import { CFWorkerSchemaService } from '@pikku/schema-cfworker' +import type { Kysely } from 'kysely' +import type { VercelAIAgentRunner } from '@pikku/ai-vercel' +import { GeneratedTemplateEmailService } from './lib/email-service.js' +import type { DB } from '#pikku/db/schema.gen.js' + +export const createSingletonServices = pikkuServices(async (config, existingServices) => { + const variables = + existingServices?.variables ?? new TypedVariablesService(new LocalVariablesService()) + const secrets = + existingServices?.secrets ?? new TypedSecretService(new LocalSecretService(variables)) + const logger = existingServices?.logger ?? new JsonConsoleLogger() + const schema = existingServices?.schema ?? new CFWorkerSchemaService(logger) + const emailService = + existingServices?.emailService ?? + new GeneratedTemplateEmailService({ + delegate: new LocalEmailService(), + }) + // The durable audit sink. In a deployed stage fabric injects the platform's + // audit service; locally it falls back to a no-op so nothing is persisted. + const audit = existingServices?.audit ?? new NoopAuditService() + // kysely is injected by pikku dev (node:sqlite) or the CF Worker workflow (libsql). + // The template never constructs its own dialect — dialects are fabric/runtime + // concerns — so it must always be provided by the runtime. + if (!existingServices?.kysely) { + throw new Error('kysely service was not injected by the runtime (pikku dev / fabric)') + } + const kysely: Kysely = existingServices.kysely + + const litellmProxyUrl = process.env.LITELLM_PROXY_URL ?? null + const litellmApiKey = process.env.LITELLM_API_KEY ?? null + let aiAgentRunner: VercelAIAgentRunner | undefined + if (litellmProxyUrl && litellmApiKey) { + // The AI SDKs (~3MB) are stubbed out of non-agent units at bundle time — + // only units with the `ai-model` capability keep them. So import them + // dynamically and guard on the module resolving to a real export; in a + // stubbed unit the import yields `{}` and the runner is simply not built. + const aiVercel = await import('@pikku/ai-vercel') + const aiSdk = await import('@ai-sdk/openai-compatible') + if (aiVercel.VercelAIAgentRunner && aiSdk.createOpenAICompatible) { + const litellmProvider = aiSdk.createOpenAICompatible({ + name: 'litellm', + baseURL: litellmProxyUrl, + apiKey: litellmApiKey, + }) + aiAgentRunner = new aiVercel.VercelAIAgentRunner({ + openai: (modelId: string) => litellmProvider.chatModel(modelId), + anthropic: (modelId: string) => litellmProvider.chatModel(modelId), + google: (modelId: string) => litellmProvider.chatModel(modelId), + deepseek: (modelId: string) => litellmProvider.chatModel(modelId), + }) + } + } + + return { + ...(existingServices ?? {}), + config, + variables, + secrets, + schema, + logger, + emailService, + audit, + kysely, + ...(aiAgentRunner ? { aiAgentRunner } : {}), + } +}) + +export const createWireServices = pikkuWireServices(async (singletonServices, wire) => { + if (!singletonServices.audit) { + return {} + } + const auditLog = createInvocationAudit(singletonServices.audit, wire) + // auditLog is ALWAYS returned so `auditLog.write(...)` works in every function + // for general activity logging. `auditLog.config` is set ONLY when this + // invocation opts into row-level auditing (`audit: true`); when it is, ALSO wrap + // kysely so every query is captured and the runner flushes the buffer on close. + // Without audit: true, leave the plain kysely untouched — no per-query overhead. + if (!auditLog.config) { + return { auditLog } + } + return { + auditLog, + kysely: createAuditedKysely(singletonServices.kysely, { audit: auditLog }), + } +}) diff --git a/packages/mantine-theme/active.json b/packages/mantine-theme/active.json new file mode 100644 index 0000000..b801f69 --- /dev/null +++ b/packages/mantine-theme/active.json @@ -0,0 +1,3 @@ +{ + "id": "default" +} diff --git a/packages/mantine-theme/index.ts b/packages/mantine-theme/index.ts new file mode 100644 index 0000000..da6772c --- /dev/null +++ b/packages/mantine-theme/index.ts @@ -0,0 +1,215 @@ +import { createTheme, type MantineColorsTuple, type MantineThemeOverride } from '@mantine/core' +import { generateColors } from '@mantine/colors-generator' +import active from './active.json' +import { themeSpecs } from './themes' + +const FONT_FALLBACK = "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif" +const MONO_FALLBACK = + "ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace" + +// Mono families need a monospace fallback chain, not the sans-serif one — else a +// terminal/matrix theme degrades to a proportional font before the webfont loads. +const isMonoFamily = (family: string): boolean => /\bmono\b|consol|courier/i.test(family) + +// A theme is ONE Mantine theme, authored as two clearly-labelled sections: +// brand — HIGH-LEVEL: colour palette + fonts (what makes apps look different) +// structure — LOW-LEVEL Mantine: radius, shadows, spacing, component defaults +// buildMantineTheme takes the structure as the base and EXTENDS it with the +// brand, then that single merged object is registered with MantineProvider. +export type Brand = { + colors?: Record + fonts?: { heading?: string; body?: string; mono?: string } +} + +export type Structure = { + defaultRadius?: string + autoContrast?: boolean + primaryShade?: number | { light?: number; dark?: number } + shadows?: Record + spacing?: Record + radius?: Record + components?: Record + // The style's natural scheme — seeds ColorSchemeScript + MantineProvider so a + // light style renders light and a dark style dark by default. NOT a createTheme + // key, so it is stripped before the theme is built. + defaultColorScheme?: 'light' | 'dark' | 'auto' + // An explicit 10-step Mantine `dark` tuple used verbatim (idx0 lightest text → + // idx7 body bg → idx9 deepest). When present it overrides the auto-tint so a + // dark-first style gets its exact background. NOT a createTheme key. + darkColors?: string[] +} + +export type Theme = { + name: string + description?: string + brand?: Brand + structure?: Structure +} + +// Back-compat alias: older imports referred to a colours-only "Palette". +export type Palette = Theme + +const fontStack = (family?: string): string | undefined => + family ? `'${family}', ${isMonoFamily(family) ? MONO_FALLBACK : FONT_FALLBACK}` : undefined + +// Brand-tinted dark surfaces. Mantine's dark scheme derives the body, surfaces, +// borders and inputs from the `dark` colour tuple; the default ramp is neutral +// grey, so every app looked identical regardless of the brand colour. We rebuild +// the dark ramp at the brand's HUE so the whole background takes on the theme — +// keeping text shades (0..3) near-neutral for contrast and saturating the deep +// background shades (6..9) for a clearly distinct, on-brand dark look. +const hexToHsl = (hex: string): [number, number, number] | null => { + const m = /^#?([0-9a-f]{6})$/i.exec(hex.trim()) + if (!m) return null + const int = parseInt(m[1], 16) + const r = ((int >> 16) & 255) / 255 + const g = ((int >> 8) & 255) / 255 + const b = (int & 255) / 255 + const max = Math.max(r, g, b) + const min = Math.min(r, g, b) + const l = (max + min) / 2 + let h = 0 + let s = 0 + if (max !== min) { + const d = max - min + s = l > 0.5 ? d / (2 - max - min) : d / (max + min) + if (max === r) h = (g - b) / d + (g < b ? 6 : 0) + else if (max === g) h = (b - r) / d + 2 + else h = (r - g) / d + 4 + h *= 60 + } + return [h, s * 100, l * 100] +} + +const hslToHex = (h: number, s: number, l: number): string => { + s /= 100 + l /= 100 + const k = (n: number) => (n + h / 30) % 12 + const a = s * Math.min(l, 1 - l) + const f = (n: number) => { + const v = l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1))) + return Math.round(255 * v) + .toString(16) + .padStart(2, '0') + } + return `#${f(0)}${f(8)}${f(4)}` +} + +// Lightness/saturation anchors per dark-tuple index (0 = lightest text → 9 = +// deepest background). dark[7] is the body background in Mantine's dark scheme. +// Text shades (0..3) stay near-neutral for readable contrast; the surface and +// background shades (5..9) carry real brand saturation so the dark UI reads as a +// rich, on-brand dark — NOT the flat near-grey it used to be (the "all gray" bug). +const DARK_L = [96, 88, 77, 62, 48, 36, 25, 17, 12, 9] +// Restrained saturation: just enough hue to read as on-brand, never the lurid +// over-saturated background that made dark apps look "absurd". Dark-first styles +// that want a precise background ship an explicit `darkColors` tuple instead. +const DARK_S = [8, 10, 12, 14, 16, 18, 20, 22, 24, 26] + +// Below this saturation a brand reads as greyscale (e.g. a mono/neutral theme); +// tinting it at its near-arbitrary hue would turn the whole UI an off-colour +// (a grey seed sits at hue 0 → a red-tinted dark). Keep those neutral. +const MIN_TINT_SATURATION = 12 + +const tintedDarkTuple = (hex: string): MantineColorsTuple | null => { + const hsl = hexToHsl(hex) + if (!hsl) return null + const [h, s] = hsl + if (s < MIN_TINT_SATURATION) return null + return DARK_L.map((l, i) => hslToHex(h, DARK_S[i]!, l)) as unknown as MantineColorsTuple +} + +// structure (base) → extend with brand (colours + fonts) → one Mantine theme. +export const buildMantineTheme = (spec: Theme): MantineThemeOverride => { + // Pull the two non-Mantine fields out of structure before it is spread into + // createTheme — they drive scheme/dark-tuple, not the theme object. + const { + defaultColorScheme: _scheme, + darkColors, + ...structureRest + } = (spec.structure ?? {}) as Structure + const structure = structureRest as MantineThemeOverride + const brand = spec.brand ?? {} + const colors: Record = Object.fromEntries( + Object.entries(brand.colors ?? {}).map(([role, hex]) => [role, generateColors(hex)]), + ) + // An explicit dark tuple (from a dark-first style) wins verbatim; otherwise tint + // the dark surfaces/background at the brand hue so apps still look distinct. + const dark = + darkColors && darkColors.length === 10 + ? (darkColors as unknown as MantineColorsTuple) + : brand.colors?.primary + ? tintedDarkTuple(brand.colors.primary) + : null + if (dark) colors.dark = dark + const body = fontStack(brand.fonts?.body) + const heading = fontStack(brand.fonts?.heading ?? brand.fonts?.body) + const mono = fontStack(brand.fonts?.mono) + // Mantine's default dark primaryShade is 8 — a deep, muted tone that reads as + // near-grey against the dark background, so buttons/accents/the logo all looked + // washed out (the other half of the "all gray" bug). Force a vibrant shade in + // dark mode so the brand actually pops; honour an explicit theme override. + // Cast to Mantine's narrow MantineColorShade union — structure JSON types the + // shade loosely as number, which the literal 0–9 union rejects. + const specShade = (spec.structure ?? {}).primaryShade + const primaryShade = (specShade ?? { light: 6, dark: 5 }) as MantineThemeOverride['primaryShade'] + return createTheme({ + ...structure, + primaryShade, + ...(body ? { fontFamily: body } : {}), + ...(heading ? { headings: { fontFamily: heading } } : {}), + ...(mono ? { fontFamilyMonospace: mono } : {}), + ...(Object.keys(colors).length ? { colors } : {}), + // Drive the primary colour from the brand. Previously a theme could define + // colours that Mantine never used as the primary — that was the "themes + // don't react" bug. + ...('primary' in colors ? { primaryColor: 'primary' } : {}), + }) +} + +// Back-compat alias for callers that pass a spec. +export const buildTheme = buildMantineTheme + +const specs = themeSpecs as Record + +export const themes: Record = Object.fromEntries( + Object.entries(specs).map(([id, s]) => [id, buildMantineTheme(s)]), +) + +export const themeList = Object.entries(specs).map(([id, s]) => ({ + id, + name: s.name, + description: s.description, +})) + +export const activeId = active.id +export const activeTheme: MantineThemeOverride = themes[active.id] ?? themes.default +export const theme = activeTheme + +// The natural color scheme each theme declares, so the app can seed +// ColorSchemeScript + MantineProvider to match (a light style boots light, a dark +// style dark). Defaults to 'dark' (the template's historical default). +export type ColorScheme = 'light' | 'dark' | 'auto' +export const themeColorSchemes: Record = Object.fromEntries( + Object.entries(specs).map(([id, s]) => [id, s.structure?.defaultColorScheme ?? 'dark']), +) +export const activeColorScheme: ColorScheme = themeColorSchemes[active.id] ?? 'dark' + +// Distinct font families referenced by any theme, for the Google Fonts +// so a theme's typography actually renders. +export const brandFontFamilies: string[] = [ + ...new Set( + Object.values(specs).flatMap((s) => { + const f = s.brand?.fonts ?? {} + return [f.body, f.heading, f.mono].filter((x): x is string => Boolean(x)) + }), + ), +] + +export const googleFontsHref = (families: string[] = brandFontFamilies): string | null => { + if (!families.length) return null + const params = families + .map((f) => `family=${encodeURIComponent(f)}:wght@400;500;600;700`) + .join('&') + return `https://fonts.googleapis.com/css2?${params}&display=swap` +} diff --git a/packages/mantine-theme/package.json b/packages/mantine-theme/package.json new file mode 100644 index 0000000..fb41591 --- /dev/null +++ b/packages/mantine-theme/package.json @@ -0,0 +1,25 @@ +{ + "name": "@project/mantine-themes", + "version": "0.0.1", + "private": true, + "type": "module", + "exports": { + ".": "./index.ts", + "./base.json": "./base.json", + "./active.json": "./active.json" + }, + "scripts": { + "tsc": "tsc --noEmit" + }, + "dependencies": { + "@mantine/colors-generator": "^9.2.1", + "chroma-js": "^3.1.2" + }, + "devDependencies": { + "@mantine/core": "^9.2.1", + "typescript": "^5.9" + }, + "peerDependencies": { + "@mantine/core": "^9.2.1" + } +} diff --git a/packages/mantine-theme/themes/default.json b/packages/mantine-theme/themes/default.json new file mode 100644 index 0000000..a91cb48 --- /dev/null +++ b/packages/mantine-theme/themes/default.json @@ -0,0 +1,25 @@ +{ + "name": "Default", + "description": "Confident indigo with soft elevation — a solid, non-gray starting point.", + "brand": { + "colors": { "primary": "#4f46e5", "secondary": "#0ea5e9", "accent": "#f59e0b" }, + "fonts": { "heading": "Inter", "body": "Inter" } + }, + "structure": { + "defaultRadius": "md", + "autoContrast": true, + "primaryShade": { "light": 6, "dark": 5 }, + "shadows": { + "xs": "0 1px 3px rgba(0,0,0,0.08)", + "sm": "0 2px 8px rgba(0,0,0,0.10)", + "md": "0 6px 18px -4px rgba(0,0,0,0.15)", + "lg": "0 12px 32px -8px rgba(0,0,0,0.20)", + "xl": "0 20px 48px -12px rgba(0,0,0,0.24)" + }, + "defaultGradient": { "from": "primary.5", "to": "secondary.6", "deg": 135 }, + "components": { + "Card": { "defaultProps": { "shadow": "sm", "radius": "md", "withBorder": true } }, + "Paper": { "defaultProps": { "shadow": "sm", "radius": "md" } } + } + } +} diff --git a/packages/mantine-theme/themes/index.ts b/packages/mantine-theme/themes/index.ts new file mode 100644 index 0000000..0df9d38 --- /dev/null +++ b/packages/mantine-theme/themes/index.ts @@ -0,0 +1,8 @@ +// Generated by the fabric-theme tool — do not edit by hand. +// One JSON per theme. Each bundles a `brand` (colours + fonts) and a +// `structure` (radius/shadows/spacing) section. Add themes via the fabric-theme tool. +import t_default from './default.json' + +export const themeSpecs: Record = { + default: t_default, +} diff --git a/packages/mantine-theme/tsconfig.json b/packages/mantine-theme/tsconfig.json new file mode 100644 index 0000000..6c16ccc --- /dev/null +++ b/packages/mantine-theme/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "noEmit": true, + "types": [] + }, + "include": ["index.ts", "base.json", "active.json", "palettes/**/*.ts", "palettes/**/*.json"] +} diff --git a/pikku.config.json b/pikku.config.json new file mode 100644 index 0000000..e379c88 --- /dev/null +++ b/pikku.config.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://raw.githubusercontent.com/pikkujs/pikku/refs/heads/main/packages/cli/cli.schema.json", + "rootDir": ".", + "tsconfig": "tsconfig.json", + "srcDirectories": [ + "packages/functions/src" + ], + "outDir": "packages/functions/.pikku", + "emailTemplatesDir": "emails", + "clientFiles": { + "rpcMapDeclarationFile": "packages/functions-sdk/src/pikku/rpc-map.gen.d.ts", + "httpMapDeclarationFile": "packages/functions-sdk/src/pikku/http-map.gen.d.ts", + "fetchFile": "packages/functions-sdk/src/pikku/pikku-fetch.gen.ts", + "rpcWiringsFile": "packages/functions-sdk/src/pikku/pikku-rpc.gen.ts", + "reactQueryFile": "packages/functions-sdk/src/pikku/api.gen.ts", + "websocketFile": "packages/functions-sdk/src/pikku/pikku-websocket.gen.ts", + "realtimeFile": "packages/functions-sdk/src/pikku/realtime.gen.ts" + }, + "packageMappings": { + "packages/functions": "@project/functions" + }, + "schema": { + "supportsImportAttributes": true + }, + "dev": { + "db": true + }, + "content": { + "uploadUrlPrefix": "/upload", + "assetUrlPrefix": "/content", + "sizeLimit": "10mb" + }, + "scaffold": { + "pikkuDir": "packages/functions/src/scaffold", + "console": true, + "rpc": true, + "agent": "no-auth", + "workflow": "no-auth", + "scenarios": "no-auth", + "events": "no-auth" + }, + "scenarios": { + "actors": { + "visitor": { + "email": "visitor@actors.local", + "name": "Visitor", + "jobTitle": "Synthetic health-check user", + "personality": "Signs in and checks their own session — proves auth end to end" + } + }, + "environments": { + "local": { + "apiUrl": "http://localhost:3000", + "signInPath": "/api/auth/sign-in/actor" + }, + "sandbox": { + "apiUrl": "http://localhost:4000", + "signInPath": "/api/auth/sign-in/actor" + } + } + } +} diff --git a/pikkufabric.config.json b/pikkufabric.config.json new file mode 100644 index 0000000..20afc01 --- /dev/null +++ b/pikkufabric.config.json @@ -0,0 +1,16 @@ +{ + "projectId": "__PROJECT_ID__", + "frontends": { + "app": { + "cwd": "apps/app", + "primary": true, + "deploy": true, + "kind": "ssr", + "dev": { + "command": ["yarn", "dev"], + "port": 7104, + "healthPath": "/" + } + } + } +} diff --git a/tests/reports/cucumber-report.html b/tests/reports/cucumber-report.html new file mode 100644 index 0000000..77e6b21 --- /dev/null +++ b/tests/reports/cucumber-report.html @@ -0,0 +1,50 @@ + + + + Cucumber + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6ab24a8 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "Node16", + "moduleResolution": "Node16", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "outDir": "dist", + "rootDir": ".", + "typeRoots": [ + "./node_modules/@types", + "./packages/functions/node_modules/@types" + ] + }, + "include": [ + "packages/functions/src" + ] +}