From ea9adb85e69f76d4bc9c428494ce8b89883c9206 Mon Sep 17 00:00:00 2001 From: Christian Johannesen Date: Wed, 28 Oct 2026 09:59:06 +0100 Subject: [PATCH] Implement M0 bootable Plant Laboratory infrastructure --- .dockerignore | 8 + .env.example | 6 + .gitignore | 11 + AGENTS.md | 51 + README.md | 41 + apps/server/Dockerfile | 20 + apps/server/migrations/0001_initial.sql | 7 + apps/server/package.json | 23 + apps/server/src/app.test.ts | 40 + apps/server/src/app.ts | 48 + apps/server/src/config.ts | 29 + apps/server/src/db.ts | 11 + apps/server/src/index.ts | 14 + apps/server/src/migrate.ts | 35 + apps/server/src/schema.ts | 85 + apps/server/src/seed.ts | 37 + apps/server/tsconfig.json | 9 + apps/web/Dockerfile | 14 + apps/web/components.json | 15 + apps/web/index.html | 1 + apps/web/nginx.conf | 12 + apps/web/package.json | 30 + apps/web/src/lib/utils.ts | 5 + apps/web/src/main.tsx | 265 ++ apps/web/src/styles.css | 299 ++ apps/web/tsconfig.json | 11 + apps/web/vite.config.ts | 12 + artifacts/m0/1440.png | Bin 0 -> 124030 bytes artifacts/m0/360.png | Bin 0 -> 83722 bytes artifacts/m0/browser-checks.json | 62 + assets/README.md | 2 + compose.yaml | 71 + docs/API_AND_DATA.md | 53 + docs/CODEX_START_PROMPT.md | 12 + docs/DECISIONS.md | 12 + docs/DEPLOYMENT.md | 44 + docs/GENETICS_SPEC.md | 59 + docs/GRAPHICS_SPEC.md | 49 + docs/IMPLEMENTATION_PLAN.md | 89 + docs/PRODUCT_SPEC.md | 40 + docs/PROGRESS.md | 40 + package-lock.json | 3894 +++++++++++++++++++++++ package.json | 23 + packages/genetics/package.json | 11 + packages/genetics/src/index.ts | 1 + packages/genetics/tsconfig.json | 9 + packages/renderer/package.json | 11 + packages/renderer/src/index.ts | 1 + packages/renderer/tsconfig.json | 9 + packages/rules/package.json | 11 + packages/rules/src/index.ts | 1 + packages/rules/tsconfig.json | 9 + packages/shared/package.json | 11 + packages/shared/src/index.ts | 1 + packages/shared/tsconfig.json | 9 + tsconfig.base.json | 11 + 56 files changed, 5684 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 README.md create mode 100644 apps/server/Dockerfile create mode 100644 apps/server/migrations/0001_initial.sql create mode 100644 apps/server/package.json create mode 100644 apps/server/src/app.test.ts create mode 100644 apps/server/src/app.ts create mode 100644 apps/server/src/config.ts create mode 100644 apps/server/src/db.ts create mode 100644 apps/server/src/index.ts create mode 100644 apps/server/src/migrate.ts create mode 100644 apps/server/src/schema.ts create mode 100644 apps/server/src/seed.ts create mode 100644 apps/server/tsconfig.json create mode 100644 apps/web/Dockerfile create mode 100644 apps/web/components.json create mode 100644 apps/web/index.html create mode 100644 apps/web/nginx.conf create mode 100644 apps/web/package.json create mode 100644 apps/web/src/lib/utils.ts create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/styles.css create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/vite.config.ts create mode 100644 artifacts/m0/1440.png create mode 100644 artifacts/m0/360.png create mode 100644 artifacts/m0/browser-checks.json create mode 100644 assets/README.md create mode 100644 compose.yaml create mode 100644 docs/API_AND_DATA.md create mode 100644 docs/CODEX_START_PROMPT.md create mode 100644 docs/DECISIONS.md create mode 100644 docs/DEPLOYMENT.md create mode 100644 docs/GENETICS_SPEC.md create mode 100644 docs/GRAPHICS_SPEC.md create mode 100644 docs/IMPLEMENTATION_PLAN.md create mode 100644 docs/PRODUCT_SPEC.md create mode 100644 docs/PROGRESS.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/genetics/package.json create mode 100644 packages/genetics/src/index.ts create mode 100644 packages/genetics/tsconfig.json create mode 100644 packages/renderer/package.json create mode 100644 packages/renderer/src/index.ts create mode 100644 packages/renderer/tsconfig.json create mode 100644 packages/rules/package.json create mode 100644 packages/rules/src/index.ts create mode 100644 packages/rules/tsconfig.json create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/tsconfig.json create mode 100644 tsconfig.base.json diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..36e8cc0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,8 @@ +node_modules +**/node_modules +**/dist +.git +.env +.env.* +coverage +*.log diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5ab629f --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +HOST_PORT=8155 +PUBLIC_DOMAIN=http://localhost +POSTGRES_DB=botanica +POSTGRES_USER=botanica +POSTGRES_PASSWORD=change-me-before-exposing +NODE_ENV=development diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b0e491 --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +dist/ +coverage/ +.vite/ +*.log +.env.local +.env.production +.env.*.local +!.env.example +# Local .env supplied in handoff but should not be committed to public VCS +.env diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..d45aedf --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,51 @@ +# Codex repository instructions — Botanica / Plant Laboratory + +## Mission +Build **Plant Laboratory**, the first working module of a future online plant-breeding idle game. Illustrated 2D, procedural SVG assembled from art-directed botanical vector primitives, deterministic genetics, and an elegant responsive interface. This repository contains the authoritative implementation handoff. **Read `docs/IMPLEMENTATION_PLAN.md` and `docs/PRODUCT_SPEC.md` first.** + +## Non-negotiable operational settings +- Docker Compose is the standard runtime. The public HTTP UI is exposed on `${HOST_PORT}` (default **8155**) at `${PUBLIC_DOMAIN}` (default **http://localhost**), thus `http://localhost:8155`. +- The user requested literal `.env` values `HOST_PORT=8155` and `PUBLIC_DOMAIN=http://localhost`. Do not silently change these values. `PUBLIC_DOMAIN` is an **origin without port**, not a full public base URL. Build `PUBLIC_BASE_URL` from origin + exposed port for local development; do not append the port in production when running behind a reverse proxy. See `docs/DEPLOYMENT.md`. +- Keep PostgreSQL and API private on Compose networks; publish only the web entrypoint. +- No paid AI APIs, external image generation at runtime, cloud-only dependencies, trackers, auth integrations, marketplaces, multiplayer or microservices in the MVP. +- Use the root `package.json` workspaces with npm and committed lockfile after installing. + +## Source of truth and reading order +1. `docs/IMPLEMENTATION_PLAN.md` — phases and acceptance gates. +2. `docs/PRODUCT_SPEC.md` — player workflows, UI, quality bar. +3. `docs/GENETICS_SPEC.md` — genotype/phenotype, inheritance and randomness. +4. `docs/GRAPHICS_SPEC.md` — art pipeline, asset contract, deterministic SVG. +5. `docs/API_AND_DATA.md` — schemas, persistence, routes and invariants. +6. `docs/DEPLOYMENT.md` — Compose, ports, secrets, runbook. +7. `docs/DECISIONS.md` — fixed architectural decisions. +8. `docs/CODEX_START_PROMPT.md` — initial mission. + +## Implementation habits +- Work through milestones **M0 → M1 → M2 → M3 → M4**, one at a time. Never substitute a large unverified implementation for milestone gates. +- Implement the current milestone end to end; run its specified tests; update the checklist in `docs/PROGRESS.md`. Stop at a gate and report results, blockers and next step. If explicitly asked to continue autonomously, proceed sequentially. +- Favor simple readable TypeScript; no speculative abstraction, no giant dependencies, no unnecessary test scaffolding. +- Implement actual code and assets, not mockups, placeholders, TODO-based behavior or screenshots-as-assets. Make the UI genuinely usable. +- `packages/genetics`, `packages/renderer`, `packages/rules` must not import React, DOM UI state, database or server. Rendering may consume DOM/SVG APIs only in a thin web adapter; pure layout remains platform independent. +- Server owns authoritative breeding decisions, economy and persisted plant creation. Client never dictates child genotype, mutation outcome, rarity or inventory balances. +- Seeded random generation must be reproducible with explicit algorithm and version; **never use `Math.random()` inside genetics/renderer domain functions**. Use cryptographically secure server RNG to generate initial seeds; store them and use a deterministic PRNG for replay. +- Preserve provenance in `parents`, `generation`, `genomeVersion`, `rendererVersion`, `visualSeed`; no deleting ancestry on migration. +- No arbitrary cross-species breeding. Require compatibility groups, with species-specific constraints. +- Avoid using rarity as a naive random roll independent from genotype. Derive it from a versioned rarity policy as outlined in the specs. +- UI: English copy in the initial codebase; architecture ready for future i18n. Accessible labels, keyboard navigation, reduced motion support. +- Use SVG vector shapes created for this project; no scraped commercial plant assets or image-hotlinking. + +## Technical defaults +React + Vite + TypeScript, Tailwind CSS, shadcn/ui where useful, Motion for transitions, Zustand for local view state, TanStack Query for API state; Node.js + Fastify + Zod, PostgreSQL + Drizzle; Docker Compose. Use current compatible stable dependency versions and pin them through lockfile; verify APIs against documentation if needed. + +## Required commands / checks +- `docker compose config` +- `docker compose up --build -d` +- `docker compose ps` +- `curl -fsS http://localhost:8155/health` +- `npm run typecheck` +- `npm run test` +- `npm run build` +Use commands as applicable during scaffolding; fix any errors rather than suppressing them. The health endpoint must be served by web reverse proxy to API. + +## Finish and reporting +After each milestone report: files changed, URL, tests actually run/results, screenshots or concise UI description, known issues, and what M milestone is next. Do not claim tests were run if they were not. Never mutate `.env` secretly, commit credentials, or delete the user's data. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4785ae8 --- /dev/null +++ b/README.md @@ -0,0 +1,41 @@ +# Plant Laboratory / Botanica + +M0 provides a running React shell, Fastify API, PostgreSQL schema and repeatable bootstrap. Genetics and game workflows follow in M1–M4. + +## Run + +Keep `.env` local. Copy `.env.example` if missing; preserve `HOST_PORT=8155` and `PUBLIC_DOMAIN=http://localhost`. + +```sh +npm ci +docker compose config --quiet +docker compose up --build -d +docker compose ps +curl -fsS http://localhost:8155/health +``` + +Open http://localhost:8155. Only the web entrypoint is published, bound to loopback. API and PostgreSQL use the Compose network. The one-shot `bootstrap` service runs a transaction-locked migration followed by an idempotent demo-player/catalog seed before API startup. A named volume retains data across `docker compose down` and `up`; do not use `down -v` unless intentionally deleting all data. + +## Development and checks + +```sh +npm run typecheck +npm run test +npm run build +npm run dev +``` + +`npm run dev` serves Vite on port 5173 and API on 3000. Set `DATABASE_URL` to a reachable PostgreSQL database for host development; Compose intentionally does not publish its database. Prefer Compose for the complete runtime. + +Root `npm run db:migrate` and `npm run db:seed` require `DATABASE_URL`. Against Compose: + +```sh +docker compose run --rm bootstrap node dist/migrate.js +docker compose run --rm bootstrap node dist/seed.js +``` + +Migrations are checked-in SQL tracked in `schema_migrations`; seeds never overwrite existing records. `.env` is ignored by Git and Docker build contexts. Production containers run as non-root. The API returns safe uniform errors and health responds 503 if PostgreSQL is unavailable. Relative browser API URLs avoid container hostname leakage. `PUBLIC_BASE_URL` is validated and derived from origin plus port for localhost, or just origin behind a production reverse proxy. + +Routes: `/` redirects to `/lab`; `/lab`, `/breed`, `/gallery`, `/about` currently show clearly labeled milestone empty states. Original shell illustration is decorative; the deterministic species renderer is M2. No authentication: this sandbox is intended for local use. + +Read [the implementation plan](docs/IMPLEMENTATION_PLAN.md) and [progress log](docs/PROGRESS.md) for acceptance gates. diff --git a/apps/server/Dockerfile b/apps/server/Dockerfile new file mode 100644 index 0000000..f7e7853 --- /dev/null +++ b/apps/server/Dockerfile @@ -0,0 +1,20 @@ +FROM node:24-alpine AS build +WORKDIR /app +COPY package*.json ./ +COPY apps/server/package.json apps/server/package.json +COPY apps/web/package.json apps/web/package.json +COPY packages/ packages/ +RUN npm ci +COPY tsconfig.base.json ./ +COPY apps/server/ apps/server/ +RUN npm run build -w @botanica/server && npm prune --omit=dev +FROM node:24-alpine +ENV NODE_ENV=production +WORKDIR /app +COPY --from=build --chown=node:node /app/node_modules ./node_modules +COPY --from=build --chown=node:node /app/apps/server/package.json ./package.json +COPY --from=build --chown=node:node /app/apps/server/dist ./dist +COPY --from=build --chown=node:node /app/apps/server/migrations ./migrations +USER node +EXPOSE 3000 +CMD ["node", "dist/index.js"] diff --git a/apps/server/migrations/0001_initial.sql b/apps/server/migrations/0001_initial.sql new file mode 100644 index 0000000..dcd95b6 --- /dev/null +++ b/apps/server/migrations/0001_initial.sql @@ -0,0 +1,7 @@ +CREATE TABLE species (id text PRIMARY KEY, name text NOT NULL, compatibility_group text NOT NULL, catalog_version integer NOT NULL, config_jsonb jsonb NOT NULL); +CREATE TABLE players (id uuid PRIMARY KEY, display_name text NOT NULL, created_at timestamptz NOT NULL DEFAULT now()); +CREATE TABLE plants (id uuid PRIMARY KEY, owner_id uuid NOT NULL REFERENCES players(id), species_id text NOT NULL REFERENCES species(id), genome_version integer NOT NULL, genome jsonb NOT NULL, mutations jsonb NOT NULL, visual_seed integer NOT NULL, renderer_version integer NOT NULL, rarity_policy_version integer NOT NULL, rarity_score integer NOT NULL CHECK (rarity_score BETWEEN 0 AND 100), rarity_tier text NOT NULL CHECK (rarity_tier IN ('Common','Uncommon','Rare','Epic','Legendary','Mythic')), generation integer NOT NULL CHECK (generation >= 0), parent_a_id uuid REFERENCES plants(id), parent_b_id uuid REFERENCES plants(id), created_at timestamptz NOT NULL DEFAULT now(), CHECK ((parent_a_id IS NULL) = (parent_b_id IS NULL))); +CREATE INDEX plants_owner_created ON plants(owner_id, created_at DESC); +CREATE INDEX plants_species_rarity ON plants(species_id, rarity_tier); +CREATE TABLE breeding_events (id uuid PRIMARY KEY, owner_id uuid NOT NULL REFERENCES players(id), parent_a_id uuid NOT NULL REFERENCES plants(id), parent_b_id uuid NOT NULL REFERENCES plants(id), child_id uuid NOT NULL UNIQUE REFERENCES plants(id), rng_seed integer NOT NULL, engine_version integer NOT NULL, mutation_events jsonb NOT NULL, idempotency_key text NOT NULL UNIQUE, created_at timestamptz NOT NULL DEFAULT now()); +CREATE INDEX breeding_owner_created ON breeding_events(owner_id, created_at DESC); diff --git a/apps/server/package.json b/apps/server/package.json new file mode 100644 index 0000000..01211cb --- /dev/null +++ b/apps/server/package.json @@ -0,0 +1,23 @@ +{ + "name": "@botanica/server", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "tsx watch src/index.ts", + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit", + "db:migrate": "tsx src/migrate.ts", + "db:seed": "tsx src/seed.ts" + }, + "dependencies": { + "fastify": "^5.12.7", + "zod": "^4.0.0", + "drizzle-orm": "^0.45.4", + "pg": "^8.16.3" + }, + "devDependencies": { + "@types/pg": "^8.15.5", + "tsx": "^4.20.0" + } +} diff --git a/apps/server/src/app.test.ts b/apps/server/src/app.test.ts new file mode 100644 index 0000000..27b9205 --- /dev/null +++ b/apps/server/src/app.test.ts @@ -0,0 +1,40 @@ +import { describe, it, expect } from "vitest"; +import { createApp } from "./app.js"; +import { readConfig } from "./config.js"; +describe("M0 infrastructure contracts", () => { + it("checks database before reporting healthy", async () => { + let queries = 0; + const app = createApp(async () => { + queries++; + }); + const response = await app.inject("/health"); + expect(response.statusCode).toBe(200); + expect(response.json()).toEqual({ status: "ok", database: "connected" }); + expect(queries).toBe(1); + await app.close(); + }); + it("returns safe database and route errors", async () => { + const app = createApp(async () => { + throw new Error("secret password"); + }); + const response = await app.inject("/health"); + expect(response.statusCode).toBe(503); + expect(response.body).not.toContain("secret"); + expect((await app.inject("/missing")).json().error.code).toBe("NOT_FOUND"); + await app.close(); + }); + it("derives local URL and preserves reverse proxy origin", () => { + expect(readConfig({ DATABASE_URL: "postgres://db" }).PUBLIC_BASE_URL).toBe( + "http://localhost:8155", + ); + expect( + readConfig({ + DATABASE_URL: "postgres://db", + PUBLIC_DOMAIN: "https://plants.example", + }).PUBLIC_BASE_URL, + ).toBe("https://plants.example"); + expect(() => + readConfig({ DATABASE_URL: "x", PUBLIC_DOMAIN: "http://localhost:8155" }), + ).toThrow(); + }); +}); diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts new file mode 100644 index 0000000..efd1e7a --- /dev/null +++ b/apps/server/src/app.ts @@ -0,0 +1,48 @@ +import Fastify from "fastify"; +export function createApp( + checkDatabase: () => Promise, + logger = false, +) { + const app = Fastify({ logger, bodyLimit: 65536 }); + app.get("/health", async (_request, reply) => { + try { + await checkDatabase(); + return { status: "ok", database: "connected" }; + } catch { + return reply + .code(503) + .send({ + error: { + code: "DATABASE_UNAVAILABLE", + message: "Database is unavailable.", + }, + }); + } + }); + app.setNotFoundHandler((_request, reply) => + reply + .code(404) + .send({ error: { code: "NOT_FOUND", message: "Route not found." } }), + ); + app.setErrorHandler((error, request, reply) => { + request.log.error(error); + const code = + typeof error === "object" && error !== null && "statusCode" in error + ? error.statusCode + : undefined; + const status = + typeof code === "number" && code >= 400 && code < 500 ? code : 500; + reply + .code(status) + .send({ + error: { + code: status === 500 ? "INTERNAL_ERROR" : "INVALID_REQUEST", + message: + status === 500 + ? "An unexpected error occurred." + : "Request could not be processed.", + }, + }); + }); + return app; +} diff --git a/apps/server/src/config.ts b/apps/server/src/config.ts new file mode 100644 index 0000000..57709d8 --- /dev/null +++ b/apps/server/src/config.ts @@ -0,0 +1,29 @@ +import { z } from "zod"; +export function readConfig(env: NodeJS.ProcessEnv) { + const c = z + .object({ + DATABASE_URL: z.string().min(1), + PORT: z.coerce.number().int().min(1).max(65535).default(3000), + HOST_PORT: z.coerce.number().int().min(1).max(65535).default(8155), + PUBLIC_DOMAIN: z.string().url().default("http://localhost"), + }) + .parse(env); + const origin = new URL(c.PUBLIC_DOMAIN); + if ( + origin.port || + origin.pathname !== "/" || + origin.search || + origin.hash || + origin.username || + origin.password + ) + throw new Error("PUBLIC_DOMAIN must be an origin without port"); + return { + ...c, + PUBLIC_BASE_URL: ["localhost", "127.0.0.1", "[::1]"].includes( + origin.hostname, + ) + ? origin.origin + ":" + c.HOST_PORT + : origin.origin, + }; +} diff --git a/apps/server/src/db.ts b/apps/server/src/db.ts new file mode 100644 index 0000000..f22d8f2 --- /dev/null +++ b/apps/server/src/db.ts @@ -0,0 +1,11 @@ +import pg from "pg"; +import { drizzle } from "drizzle-orm/node-postgres"; +import * as schema from "./schema.js"; +export function connectDatabase(url: string) { + const pool = new pg.Pool({ + connectionString: url, + max: 10, + connectionTimeoutMillis: 5000, + }); + return { pool, db: drizzle(pool, { schema }) }; +} diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts new file mode 100644 index 0000000..f47cf1b --- /dev/null +++ b/apps/server/src/index.ts @@ -0,0 +1,14 @@ +import { readConfig } from "./config.js"; +import { connectDatabase } from "./db.js"; +import { createApp } from "./app.js"; +const config = readConfig(process.env); +const { pool } = connectDatabase(config.DATABASE_URL); +const app = createApp(() => pool.query("SELECT 1"), true); +app.addHook("onClose", async () => { + await pool.end(); +}); +for (const signal of ["SIGINT", "SIGTERM"]) + process.on(signal, () => { + void app.close(); + }); +await app.listen({ port: config.PORT, host: "0.0.0.0" }); diff --git a/apps/server/src/migrate.ts b/apps/server/src/migrate.ts new file mode 100644 index 0000000..588e2c8 --- /dev/null +++ b/apps/server/src/migrate.ts @@ -0,0 +1,35 @@ +import { readFile } from "node:fs/promises"; +import { connectDatabase } from "./db.js"; +const { pool } = connectDatabase(process.env.DATABASE_URL ?? ""); +const client = await pool.connect(); +try { + await client.query("BEGIN"); + await client.query("SELECT pg_advisory_xact_lock(8155000)"); + await client.query( + "CREATE TABLE IF NOT EXISTS schema_migrations (name text PRIMARY KEY, applied_at timestamptz NOT NULL DEFAULT now())", + ); + const name = "0001_initial"; + const exists = await client.query( + "SELECT name FROM schema_migrations WHERE name = $1", + [name], + ); + if (!exists.rowCount) { + await client.query( + await readFile( + new URL("../migrations/0001_initial.sql", import.meta.url), + "utf8", + ), + ); + await client.query("INSERT INTO schema_migrations(name) VALUES ($1)", [ + name, + ]); + } + await client.query("COMMIT"); + console.log("Migrations current"); +} catch (error) { + await client.query("ROLLBACK"); + throw error; +} finally { + client.release(); + await pool.end(); +} diff --git a/apps/server/src/schema.ts b/apps/server/src/schema.ts new file mode 100644 index 0000000..8c5e25b --- /dev/null +++ b/apps/server/src/schema.ts @@ -0,0 +1,85 @@ +import { + pgTable, + text, + integer, + uuid, + jsonb, + timestamp, + index, + unique, + type AnyPgColumn, +} from "drizzle-orm/pg-core"; +export const species = pgTable("species", { + id: text().primaryKey(), + name: text().notNull(), + compatibilityGroup: text("compatibility_group").notNull(), + catalogVersion: integer("catalog_version").notNull(), + config: jsonb("config_jsonb").notNull(), +}); +export const players = pgTable("players", { + id: uuid().primaryKey(), + displayName: text("display_name").notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), +}); +export const plants = pgTable( + "plants", + { + id: uuid().primaryKey(), + ownerId: uuid("owner_id") + .notNull() + .references(() => players.id), + speciesId: text("species_id") + .notNull() + .references(() => species.id), + genomeVersion: integer("genome_version").notNull(), + genome: jsonb().notNull(), + mutations: jsonb().notNull(), + visualSeed: integer("visual_seed").notNull(), + rendererVersion: integer("renderer_version").notNull(), + rarityPolicyVersion: integer("rarity_policy_version").notNull(), + rarityScore: integer("rarity_score").notNull(), + rarityTier: text("rarity_tier").notNull(), + generation: integer().notNull(), + parentAId: uuid("parent_a_id").references((): AnyPgColumn => plants.id), + parentBId: uuid("parent_b_id").references((): AnyPgColumn => plants.id), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + }, + (t) => [ + index("plants_owner_created").on(t.ownerId, t.createdAt.desc()), + index("plants_species_rarity").on(t.speciesId, t.rarityTier), + ], +); +export const breedingEvents = pgTable( + "breeding_events", + { + id: uuid().primaryKey(), + ownerId: uuid("owner_id") + .notNull() + .references(() => players.id), + parentAId: uuid("parent_a_id") + .notNull() + .references(() => plants.id), + parentBId: uuid("parent_b_id") + .notNull() + .references(() => plants.id), + childId: uuid("child_id") + .notNull() + .references(() => plants.id), + rngSeed: integer("rng_seed").notNull(), + engineVersion: integer("engine_version").notNull(), + mutationEvents: jsonb("mutation_events").notNull(), + idempotencyKey: text("idempotency_key").notNull(), + createdAt: timestamp("created_at", { withTimezone: true }) + .defaultNow() + .notNull(), + }, + (t) => [ + unique().on(t.childId), + unique().on(t.idempotencyKey), + index("breeding_owner_created").on(t.ownerId, t.createdAt.desc()), + ], +); diff --git a/apps/server/src/seed.ts b/apps/server/src/seed.ts new file mode 100644 index 0000000..8155343 --- /dev/null +++ b/apps/server/src/seed.ts @@ -0,0 +1,37 @@ +import { connectDatabase } from "./db.js"; +import { players, species } from "./schema.js"; +const { pool, db } = connectDatabase(process.env.DATABASE_URL ?? ""); +try { + await db.transaction(async (tx) => { + await tx + .insert(players) + .values({ + id: "00000000-0000-4000-8000-000000000001", + displayName: "Sandbox botanist", + }) + .onConflictDoNothing(); + await tx + .insert(species) + .values({ + id: "velvetleaf", + name: "Velvetleaf", + compatibilityGroup: "velvetleaf", + catalogVersion: 1, + config: { + interspeciesBreeding: false, + loci: { + pigment: ["G", "P", "R", "Y"], + leafShape: ["O", "L", "S"], + leafPattern: ["S", "V", "M"], + growthHabit: ["C", "B", "T"], + flowerColor: ["W", "P", "B", "R"], + flowerDensity: ["L", "M", "H"], + }, + }, + }) + .onConflictDoNothing(); + }); + console.log("Sandbox player and velvetleaf catalog ready"); +} finally { + await pool.end(); +} diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json new file mode 100644 index 0000000..5edad81 --- /dev/null +++ b/apps/server/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"], + "exclude": ["src/**/*.test.ts"] +} diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile new file mode 100644 index 0000000..7a2cd52 --- /dev/null +++ b/apps/web/Dockerfile @@ -0,0 +1,14 @@ +FROM node:24-alpine AS build +WORKDIR /app +COPY package*.json ./ +COPY apps/server/package.json apps/server/package.json +COPY apps/web/package.json apps/web/package.json +COPY packages/ packages/ +RUN npm ci +COPY tsconfig.base.json ./ +COPY apps/web/ apps/web/ +RUN npm run build -w @botanica/web +FROM nginxinc/nginx-unprivileged:stable-alpine +COPY apps/web/nginx.conf /etc/nginx/conf.d/default.conf +COPY --from=build /app/apps/web/dist /usr/share/nginx/html +EXPOSE 8080 diff --git a/apps/web/components.json b/apps/web/components.json new file mode 100644 index 0000000..b4d8889 --- /dev/null +++ b/apps/web/components.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "css": "src/styles.css", + "baseColor": "neutral", + "cssVariables": true + }, + "aliases": { + "components": "./src/components", + "utils": "./src/lib/utils" + } +} diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..15b3bf3 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1 @@ +Plant Laboratory
diff --git a/apps/web/nginx.conf b/apps/web/nginx.conf new file mode 100644 index 0000000..36c5db7 --- /dev/null +++ b/apps/web/nginx.conf @@ -0,0 +1,12 @@ +server { + listen 8080; + server_name _; + root /usr/share/nginx/html; + index index.html; + server_tokens off; + add_header X-Content-Type-Options nosniff always; + add_header Referrer-Policy same-origin always; + location = /health { proxy_pass http://api:3000/health; } + location /api/ { proxy_pass http://api:3000; } + location / { try_files $uri $uri/ /index.html; } +} diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..5881be6 --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,30 @@ +{ + "name": "@botanica/web", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --host 0.0.0.0", + "build": "tsc --noEmit && vite build", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-router": "^7.0.0", + "zustand": "^5.0.0", + "@tanstack/react-query": "^5.0.0", + "clsx": "^2.1.1", + "tailwind-merge": "^3.0.0", + "class-variance-authority": "^0.7.1", + "lucide-react": "^0.577.0" + }, + "devDependencies": { + "vite": "^8.3.5", + "@vitejs/plugin-react": "^6.0.0", + "tailwindcss": "^4.0.0", + "@tailwindcss/vite": "^4.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0" + } +} diff --git a/apps/web/src/lib/utils.ts b/apps/web/src/lib/utils.ts new file mode 100644 index 0000000..109c4e2 --- /dev/null +++ b/apps/web/src/lib/utils.ts @@ -0,0 +1,5 @@ +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx new file mode 100644 index 0000000..2288f9a --- /dev/null +++ b/apps/web/src/main.tsx @@ -0,0 +1,265 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import { BrowserRouter, NavLink, Navigate, Route, Routes } from "react-router"; +import { + QueryClient, + QueryClientProvider, + useQuery, +} from "@tanstack/react-query"; +import { + Leaf, + ArrowUpRight, + FlaskConical, + Sprout, + Images, + BookOpen, +} from "lucide-react"; +import "./styles.css"; +const queryClient = new QueryClient(); +const pages = { + lab: { + label: "Laboratory", + eyebrow: "A place for possibility", + title: "Small seeds. Endless possibilities.", + description: + "A botanical cabinet for curious minds. Explore the art of growing, the patterns of inheritance, and the delight of something unexpected.", + empty: "Your workbench is taking root", + detail: + "The laboratory is ready for its first species. Genome controls and live plant previews arrive in the next milestones.", + icon: FlaskConical, + }, + breed: { + label: "Breeding", + eyebrow: "The next generation", + title: "Every cross begins a new story.", + description: + "Bring two compatible plants together and follow the traits they pass on.", + empty: "No parents to pair yet", + detail: + "Saved parent plants and authoritative breeding will arrive in milestone M3.", + icon: Sprout, + }, + gallery: { + label: "Collection", + eyebrow: "Your living archive", + title: "A collection worth cultivating.", + description: + "A home for each discovery, from familiar greens to the wonderfully unusual.", + empty: "Room for your first discovery", + detail: + "Your saved plants will appear here. The collection gallery arrives in milestone M4.", + icon: Images, + }, + about: { + label: "Field notes", + eyebrow: "About this experiment", + title: "Botany meets a little imagination.", + description: + "Plant Laboratory is the first chapter of Botanica, a future plant-breeding idle game.", + empty: "Fictional genetics, real curiosity", + detail: + "This educational game uses simplified, fictional Mendelian genetics. It is not a scientifically accurate botany simulator. This local sandbox has no accounts yet.", + icon: BookOpen, + }, +}; +function BotanicalPlate() { + return ( + + + + + + + + + + + + {[ + [171, 251, -52], + [315, 209, 45], + [199, 160, -41], + [297, 127, 35], + [252, 108, 0], + ].map(([x, y, r], i) => ( + + + + + + ))} + + + + + + + Fig. 01 — A study in green + + + ); +} +function Health() { + const result = useQuery({ + queryKey: ["health"], + queryFn: async () => { + const r = await fetch("/health"); + if (!r.ok) throw new Error("Unavailable"); + return r.json() as Promise<{ status: string }>; + }, + refetchInterval: 30000, + retry: 1, + }); + return ( + + + {result.isPending + ? "Connecting to laboratory" + : result.isError + ? "Laboratory connection unavailable" + : "Laboratory online"} + + ); +} +function Page({ page }: { page: keyof typeof pages }) { + const p = pages[page]; + const Icon = p.icon; + return ( + <> +
+
+

{p.eyebrow}

+

{p.title}

+

{p.description}

+
+ PLANT LABORATORY + Local sandbox · No. 001 +
+
+
+ +
BOTANICAL STUDY / ILLUSTRATED SHELL ART
+
+
+
+
+
+

{p.label}

+

+ {page === "lab" ? "The workbench" : p.label} +

+
+ M0 · Foundations +
+
+ + + +

{p.empty}

+

{p.detail}

+ {page === "lab" && ( + + Read the field notes + + )} +
+
+ + ); +} +function App() { + return ( + <> + + Skip to content + +
+ + + + + + Plant LaboratoryBOTANICA / EXPERIMENT NO. 001 + + + +
+
+ + } /> + {Object.keys(pages).map((key) => ( + } + /> + ))} + +

Page not found

+ Return to the laboratory + + } + /> +
+
+
+ Rooted in curiosity. Grown with care. + +
+ + ); +} +createRoot(document.getElementById("root")!).render( + + + + + + + , +); diff --git a/apps/web/src/styles.css b/apps/web/src/styles.css new file mode 100644 index 0000000..7ece704 --- /dev/null +++ b/apps/web/src/styles.css @@ -0,0 +1,299 @@ +@import "tailwindcss"; +:root { + font-family: Arial, sans-serif; + color: #20392d; + background: #f6f3e8; + font-synthesis: none; + --background: #f6f3e8; + --foreground: #20392d; + --primary: #32684a; + --border: #d8ded2; + --radius: 0.75rem; +} +* { + box-sizing: border-box; +} +body { + margin: 0; +} +a { + color: inherit; + text-decoration: none; +} +a:focus-visible { + outline: 3px solid #b76f52; + outline-offset: 5px; + border-radius: 3px; +} +header, +main, +footer { + max-width: 1280px; + margin: auto; +} +header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 29px 42px; + border-bottom: 1px solid #d8ded2; + gap: 25px; +} +.brand { + display: flex; + align-items: center; + gap: 12px; + font: + 23px Georgia, + serif; +} +.brand-icon { + display: grid; + place-items: center; + border: 1px solid #b3c1a7; + border-radius: 50%; + width: 46px; + height: 46px; +} +.brand small { + display: block; + font: + 9px Arial, + sans-serif; + letter-spacing: 2px; + margin-top: 7px; +} +nav { + display: flex; + gap: 27px; + font-size: 13px; +} +nav a { + padding: 13px 0; + color: #586c5e; +} +nav a.active { + color: #20392d; + border-bottom: 2px solid #32684a; +} +main { + padding: 0 42px 60px; +} +.hero { + display: grid; + grid-template-columns: 1.1fr 1fr; + align-items: center; + gap: 45px; + min-height: 530px; +} +.eyebrow { + font-size: 10px; + text-transform: uppercase; + letter-spacing: 2.5px; + color: #647961; + font-weight: bold; + margin: 0 0 22px; +} +h1 { + font: + clamp(40px, 4.8vw, 67px)/1.07 Georgia, + serif; + letter-spacing: -2px; + max-width: 620px; + margin: 0 0 25px; +} +.description { + font-size: 15px; + line-height: 1.85; + color: #5d7062; + max-width: 440px; +} +.edition { + margin-top: 37px; + display: flex; + gap: 19px; + flex-wrap: wrap; + font-size: 9px; + letter-spacing: 1.5px; + color: #687665; +} +.edition span:first-child { + color: #9b6349; +} +figure { + margin: 0; + max-width: 440px; + justify-self: center; + width: 100%; +} +figure svg { + display: block; + width: 100%; + height: auto; +} +figcaption { + text-align: center; + font-size: 8px; + letter-spacing: 2px; + color: #75816f; + margin-top: -10px; +} +.workbench { + border-top: 1px solid #d8ded2; + padding-top: 28px; +} +.section-heading { + display: flex; + justify-content: space-between; + align-items: center; + gap: 16px; +} +.section-heading .eyebrow { + margin-bottom: 8px; +} +h2 { + font: + 29px Georgia, + serif; + margin: 0; +} +.badge { + font-size: 10px; + color: #63775f; + background: #e9ecde; + border: 1px solid #d7ddc9; + padding: 9px 13px; + border-radius: 20px; + white-space: nowrap; +} +.empty { + margin-top: 23px; + padding: 36px 20px; + text-align: center; + background: #fffcf4; + border: 1px solid #d8ded2; + border-radius: 12px; +} +.icon { + display: inline-grid; + place-items: center; + width: 49px; + height: 49px; + background: #edf0e4; + border-radius: 50%; + color: #617e56; +} +h3 { + font: + 23px Georgia, + serif; + margin: 17px 0 10px; +} +.empty p { + max-width: 440px; + margin: 0 auto; + color: #637565; + font-size: 13px; + line-height: 1.8; +} +.text-link { + display: inline-flex; + align-items: center; + gap: 9px; + font-size: 12px; + margin-top: 21px; + color: #32684a; +} +footer { + display: flex; + justify-content: space-between; + gap: 20px; + border-top: 1px solid #d8ded2; + padding: 24px 42px; + font-size: 11px; + color: #6a7c70; +} +.health { + display: flex; + align-items: center; + gap: 8px; +} +.dot { + height: 6px; + width: 6px; + border-radius: 50%; + background: #b76f52; + flex-shrink: 0; +} +.online { + background: #547e4e; +} +.skip { + position: absolute; + top: -100px; + padding: 10px; + background: #fffcf4; +} +.skip:focus { + top: 5px; + left: 5px; +} +@media (max-width: 720px) { + header { + padding: 22px; + flex-direction: column; + align-items: flex-start; + gap: 16px; + } + nav { + width: 100%; + justify-content: space-between; + gap: 10px; + font-size: 12px; + } + main { + padding: 0 22px 35px; + } + .hero { + grid-template-columns: 1fr; + gap: 0; + padding-top: 38px; + } + .hero figure { + max-width: 320px; + margin: 12px 0 30px; + } + .eyebrow { + margin-bottom: 17px; + } + h1 { + font-size: 46px; + } + .description { + font-size: 14px; + } + .edition { + margin-top: 25px; + } + footer { + padding: 22px; + flex-direction: column; + gap: 12px; + } + .badge { + font-size: 9px; + padding: 8px; + } + .empty { + padding: 28px 16px; + } +} +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation: none !important; + transition: none !important; + scroll-behavior: auto !important; + } +} diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..8a1afe6 --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "noEmit": true + }, + "include": ["src", "vite.config.ts"] +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..8975de0 --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import tailwindcss from "@tailwindcss/vite"; +export default defineConfig({ + plugins: [react(), tailwindcss()], + server: { + proxy: { + "/health": "http://localhost:3000", + "/api": "http://localhost:3000", + }, + }, +}); diff --git a/artifacts/m0/1440.png b/artifacts/m0/1440.png new file mode 100644 index 0000000000000000000000000000000000000000..ad6bb83b1a3a33f0f8ee84818f80ac53a94c9cf5 GIT binary patch literal 124030 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

-_w)f6LPkPEhbwXrAeAE!eGvVZL)k)|r-o)H(Yj-C z+!^s$35vF}HaQSG8 z8IPET0aV*`L(Pe|;FTaEr4gbVwXnqEYoSl?V7NK#y{jt2*wS_&JpdSF0^DAfPXFunYS=)plUe@aZtDyyOJ zWjYGXcuiw2E(?u}inh9Tdw<4tQtw0^+!DG{=^6EbZm_VhZLGVsMr8HP$?MHG@LbV<_B=ve1ykc@kshk=mQLXV>=0MT?jyXq?nL*WXp!n)*i9I-rh~ zq5Y1IPEJU9*XT9MFCvrJGDuE{3L`D8QowA}DJzwZs&Zjp?sQO*Y{9F3R2Lg)dnKw; zqFd$88QAxViuwbq_x{7XT+|8Kyf-=PWI726>HbsqmmqkU1C^5s+sX}ScfogE6@%2~ z2S%slY$rdeF2zk)+q%;zEK>ignHT8o77c~yOGYIm^D;WwYDaa5jt%qSpO~kt1ZQKH zLnExJYQ919@@u&LeJRc~@A>r5pml88>gQm;m5aMLRR&tUulDN+wa zRWij|Y^{okd__PnwYq^nu&>%!fK#?NJ2sa~>4dVi)%aRoY&kEB;$IHSB14OG_R|8G zOJiIL+r|ujD!yE#4(Z+ZLFd>rYRXK4E4y(Qq3L3o67yj6cXn4(Gb<%W&DMJ!{s9*X zTeemwh#_zQqqAy;r`FfLlY^np=?hN_XmXR3&SJ*&w}j9ww6?ad6FMnQye%*()oz{- zdfQI5G3B(^8r&WasP{sN84>5=`|fMpA25CY^(>-|1pKu+*qQ9^8=&SBizI41np?B$ zmphn?+pDU)YhO;%-8nQ?tN7X3g`2BmsH!Z0&GV#~uV3E7Uifrz^-=TD+49+HtrlMS z*@y0xj=&Ouc59wQ&&g^MT3?)%oss=Op5@buu1)Tb&i8Of$p2u^v;&2%u4(YJhN`-v zympECr0y}rn@Q$@;;&iCx|p1plF*WQ#pA=h&C@Ad;bF+m(;*rp8~^}(=um2l3h<`= z`u~aM{u@cL6EY5FC|Mu1v^BH((EMY)fq7aj^RJm0@yS#1%dUHEwQ7}@r8~H4XotFU zd5kbrwD{of-FMuA z&Sn&w5wL@T7v<0WNac7ydlssH}-=V3Epx?$I|k9EYizrEd#;q@{m)B)j+s4ZZf{~b8kYV#*V2GtUqb?qoO8>ebXDGkH4%+r?uz@x3ZP)QlMIilA zVt&gSQTm5;1_qJ5)$~wKdOb0(;q@d#!j$agT%zm?u;%sreri2kWM#brxyOL9MenAM zPhhIA#vz-$-5U9!MdDI_S?8885!5%0HA(Kkl16)czq78DaTGa9i}6OTfs@L&r_wz} zO0>Ex7`VhXtt_*QQ@trGKAsf|k8=IJeNZPRhIOB&H#lRAFJ*m6+^YdIR2%HCwKQ%Z zk;ckX6f~9)smCKR)HTth%H74dV4XNPf=i7MU(jFP>E1AqBNa1mBQkV~9e7>gs>^TT zX$EVrj+Q1Vv_0U^Jlpva?K)*`kcB%z*Mnj0?Z!H0s_GuI?>Ry0 z9r)wwCRs+g;&H^gCZm#)%9Fkw$QdH-0j$&zE|H_P@M36P!o22DU;J3-@@M-*K)SrQz!!?n)U=~PY>Ctvz}yPm@}bx4=HwpX>tQUkOn zA49@yWGfrP0LML=bIqpsFyeBa$c(P9{%kak5{UO8y^ru6n+m!XEXvwPR#exLj5Lga__8`U26J!^?vyUV!P0VsGYM%ynPnjF~dz0$uR zd(0%PW@2k8f%WaE(+*gfjS3%a8^!;8!|L;(9_LW!(qXV~eAXLy%917~@6@JkDs99G z57E_n79ibFe^-cqtno3V!a^Hr{gTARTKQUhlOWI9RD#U(==hjmV5$m%^+ZgRo=D}y z5(6SuLEiIPAH*w^Z)()6v=x=2w<9B;TviTiZ0WXs0G(i%y+*5Xqpyw-kyx)BHkQM# z8j23?^GNNy{ke+H3#pHY_ij0K#D$*S_ z2CR;HMn@%nvHUTk6}H#E9?c<F8a1#^=f7S{(9MBY(gv78 z*~#$R`k3q49y-~prdtU!x6+}BQfgPPrD(sP6O4w)i0?Qbhc$5~dmzFT3)J$WZGglC z9W`Ih1vAyq00oFdhBF70X|r;q`}GWs(38OMZ)f4xs*y;GQ+4nD4o9jd3Z@>Sz--i{ zfzH|rcUtv)8N5jpip!zTdhB*oV5u8+&$P5)cn%NPv(Q&)?hd~1hvaekLLc}sqCa=Sao~JK(oghH_SA0~N=I^IiL&ARu-PYXn|p5HYPg}jwGXXF=w>?{xrT4LbUjpv;(frQJs;9x^{`SE(U z(#*juzS1hl*JzJYlsZH;D&TYQh70h1u3A5+>SVG)@J!Mave@M8XXl-M`TaN>1txdK zJi)jTtg^to*wD^nyzPMz9-9hS|KLJB*R1vr_$w^=ONe?)F2g`JUFHvz4Gfb=kuEDN zk*ljj15a#qs)f<8(A8Fl>0GJW3WL6f9m|Cfq%z#z2oX54z8wbFA3PGX$rF2$UYAWl zV?me2iEiA!hDX8O{Sn}?Qf0%vax_=uldLLbLt9h^_sy*}*yiu(Geh-`%l)>0SMqOR zfbq^?k$F%wLRrz`gj2Z>EV+M$$7NEnwfB?|{Ry!Ci(0RK15RXu`0#J&#yGbCwZj}QRBgf-Ll zp9>~JeEX-W-T!a6#s5h^ao~nWJ{-9BcOBQy|J2wu(f-$!_5^cQ-Tz_%|9^_{|3>-t zzYh^?2b~B!w%_98l=72X%s2B0stqaIS&X^!D1F6u=W0ACt7`Ya4P0AFW!{SGi+mi8 zYrR|st!N3IytPZsO^7;*kCNb}E=d|mMjCM<`$8Dp~4i@7> zy?i)wg+w;%ks~G}bkFCvy>3Hynp%KI7O7fRn;AX0d5`yqFld*5>fRHEUFf>u2({E1 zhp|--8~Q`4{uJWF3C;O6;;N>gL{?DcJ+-xThTKk&s;Q|Upeg(=4ewdc{LxfeyV1Y- zK9V;f`OKqlO>cO~*y;)&4b&$YK-i_%D}l+_ zn<^a$+Fu%`9f7Ybs;ft$ce-q@Vz7h$xjtYN#@Y6G(62ABj^+N^f?slx#b@RKaWbPw z(e&35$$hRXM>T(`xSC-kX@&^{UdidF zd&9hw2iX{?@_7vZ-tu7`fqHo_0;*~XtunMPs3fjB_5(Fu05Q%>&z&T{6-MPG}b}F{|a_I-fGmV{JEOMWzqr0*&v2MpF z++`|c7o1cTLE!qg`Thz8aeKX|mcX-$N4tLKdQ1W#xo&cp)*L?b8PzGiX76)YcuMMX zS6Aye8~P;sqJRzkE2=`BewRCE;>1H6>rgRAaprj^|GhjC#~>G4VhTp}B(J)5@!di3 zMhz8hHzJ@#Q%fo2Z-->paqXiw>M!v~-(uL2%H9nG`4CG=qiRShRH8+^BvrbJVcJmm zOisa!N2(W&*lkX(*5@wp;AWnjkonXv-K|M)5vIeF4s^RQy0?`XEaZy1*2;4K zg&kRUcmpEiM*m|s{m`$y=v*m&;%gh&Z+y?weEt1oVKuilPP0r-$!xs>t`W|pqyOiP z{EvfyhXX!~KR;Gj@@mCpse&2^7i4tp!+tEjUvn)-Gx)kYfbdf~V9MS%+U_G5@WgJmBlYMKT>ZJ0TFojq{?d(IaE`(-ewA-wgY(9gLy*EraKhP$b z<#^1xv5qGOnUt5Ue7VIJqGs$WJ3gdhQ{m1uU$;Z-3Zl%9w9A)gH#QDd<#=W00}8vy z`vWq)KsSP&ov9U(;~fL?66%TsAXEZ75Z>_hMHGh1;{1M)ll${hP~ zJT2G;6T+DgS0ATre5u)EezIVn?)}O|iGqxoUW%DSl`Q6ad>hxzWdg?eSkavE=~MY< zM+l~$*KZs%MlJK|r zw{RAu)Zo;b#tTEZ=40@0s|Ek0RX<6qJ~q#N zs0ncYqMVHap2W~bLr=GW+R*7Qx3g|Ou#=oC$;SuByCQsZcCrsFshifC$uH7h120dM z%A^B7$c}ww&c@{2Z19S)z2!yC8jm513dhHtdLw)Vj>SZMz?#9P;bn2MBK`ef&{Pb- zW?z4REy5c@7bb0+NAXPiLAc^Sf;_{55qRg9tLbWI@*lKhf@CMf@Q8JPa=;^3)^Tn8 z{Cfwx2TOy(g1-rd^#Mp8{pGPQQ47ly6V$g$q~34_cCX6xo$}-IAQF~JMt&bn)Pb*t zrFAhoZ|7c59Ur0F=a3ywhiK=!@9!T^=Vlo#h}*&y)8|`WOUuYhZI&JEpEc!rf&7Bt zzLPXSDp=wyla`_KPZDg4d@0)lmCkE5F$T8X`9NM~94Xty5=hH`w$|15W!Z&q6hVrq z1-}|<25VLgKjUu}3K`RZ(1%I0H{nLdX)ev3g9DBg(kEif3IbCqF9Tr4rR3A1klx2X z#4#V?njF=4rLhANuZR4S=XH%?|>1jt}@mBehrG zv&Ey1k71BZWGOY;+5@hicIWnbpKf#nH_iBtqGkOV&c=GfnH#Nao{|`EXI`6yDyI`$ zs&ufm^C6&<95LhHimwQdjOL{9qdmsnO4fJHnj^?555g!CJ;i<9_pg)ReLZskTz0I9 ziSCbS-auA3@;#a9!tl$g*f?qd*L%V>qpFQ!#n75>!r}JMx3JDPu{UhMZk8K zvk-&nRySyCqLJ~J>K}OG9SBw zcBjR@g$vD^erTBNf$UYxo{Zt2O%BB5HqWJ+oYuz%4}HGjd}ouaPT(R5>j-l6XIo`_ z?YDh2&XGf@4BHB;)MrsP?fN1H^X=h0?CM)l?Mla`(i-~(GU)`jZks2beKLdNr0sEy z=jG6;w%+Zt7kbafDe;%KT+of3DODk z)#_mYrMaA(u#a1AfYo7gY%b5Q`FHZ6*Q+95=)1g^9F)s02X@OB?v$H+^d(U4T% z04ue-tI0{s%=%LEwVk1S$*oJc>WhW{!_?pVCG~5J0&`=!70JBeyz2Cz{G+)iNde{@rmme*+W_phc?IxN9jP6x+w?aS4 zo!?xErT=36km4ORH(!XDfejaXxN$iy&=CoVL9fZ#1{ajc1fk@8$sP#nqh5@z=if`7 znKjgT91#z{P_ECVNkW&7b-atv_*>}-fzenrvD~P@AUYvi={Pk~I(w1SNO|hVKGjA% zkXB_7Y9mE?N2lqeu!T_~rTwbHMaNtj-(WftVzO12HSaInXSrBSIghQHMWH{#AZ+## z5%H`MjK#9p-c~wUe1ipb_L2@O+#t%IdeyX|LIPr* z5SK-@x!_h`Pe`IZL@1#&R;98l-;G7u4prTs@&_n2`WKFkY7Z%YW7}>uwcvu%fPDk} zeEWrgdcB0t_vkgy%N=Ie7%?b7kWp?Pg3&>uif*g*YPz+jQNxXChDR)+M_JB(zlbVJ z#$C#V0=~raRdsbE&B&!s>jh=w7ouH`qzFuby? z8f$8np#A|BdgCo;BNzNjc^5(dJbI`7^tRpv^|W%~YDOKC&zD9@e4wyKjOfzRo%a{=Po#@#{!%#%GiJSbnDdfN`^2De z-iL&!x4zAu;kIaH;Lc3=imRqKKRiCF!^s8a%&9f`5oxTc2&mbu8JaTqjr_QuhXnbk&3)oiCHBHG(02Fq@bJGwJ4vdUcXxI$;}*JO`NLUkH17!MM`PbQ#=;0 zVXhMLZ_lSRB7SRr8O@Emq}#5SQmY;U%PA^6P?@3B&fApHW7K_J#!PhvridP{lyKKr zvWd_w)61Dr%p6xESgQq{9xncsM#jeJ4O^M^ z$tZQSa4gukF%{Mqf4L89M?W72B=B-d9Op8oLj?D9dA z`ZSL^9xE5`9hFIQv+?H01P#yEoDxp#XD7w#c6L+q$R75iK372ts7>TXG}N<<`xkpS zXG659;R@2LrMiN4jXDC#4W$t{3N7TCsw#HZ^)-Lx{qP9-8mogE7CMg@kU#OdnPF14 zRwktDbiHIGL02B6B;ukTZin0R(hhD*{8-X2u3iNPEK28gl#VQvlVgBSnk9~^h>XHw z@`Ag8!oJx{yve8v-a8-GyZ?vO2VMpQtvEX|d_;2xYoV;m`o0sNZVTB8h*Ejey4ruQ zm;HR-oFF>dq7sHW*`mxQw`m;^LM$SxJzZ?uSH6k1IE=?_-*-e)d!WHiR*y)*c0F&& zxi(i@wu0@BEmG59#b#{2HmT)5Rv~kqelRZ^b(Oc+W0!&cK70CeTxD8WL^4D*m9|A@ zd&XMaqdP+08u{mbA3Fx6DbcrIDv}BDMF!j$?>+*-DlIpoaN>A_-f}%blMyfAQl$c= zN?y6?mmsn0hT#w{4n5Fbvefz+$+jV5&9cc1)Uy9-8)b7ZeDGsE)D9|IC`1ZgR8)gW z`|+^8slOu$rQPi5{=Nh-QO(@7V&H%TI|Ch0S<{lJY*dQ4*+)nua^*tyFj{%SSdWB| zG};zS7MZ_vaj|a|Y78maoiq4wvrU0{YU{BBa_kHlobd;yRT?q94>1)YQboH>@^K)z ze~s{-Y=1F&o9`2Ys*im<4Y5)G%*Dz6X%*|HF4s^Bo=hDA-9yPu@*HGIykK}BkYb}+J zaUa>*J65J+)KWynSZ=yMZT?eeT@-Tb^d>&Rmuj>RSFojzJcEbLu{)GdzpE0}#G7*X zmn{M;vp=ymmwZwvvFaGRa^tEu3Y0P{p{(hDCT300rjS$O3Te}6rdp|<9l)`?tmkX^vE1D% z=Nt+^_r4lpO*x8dJcz~Ti8Qc)j^{m^YLMis<2zyugnTR+Y_P%yUIo}^zO@MtKvVQd zHuELC?REz|>rS@49%cgQLG%3y1)eUggVEU`=k;Etdw=+EQ)(Q`6&(c%YMv$hV6+f^ zxZ!6d?VoEHZ>=yMRM*plX}M-Aopi@)SQ~nTm)A4D>sXdq;`RQeKXWaVOl#Q4ad2JA zk^rU-TewWPJR!ej!3VkPN3flG|D@9$9~qeuAFXpfnMxfP_5A)e9PJ8DB#^q%jz`j8 zql!uBpyna0;?UpqaGTP|2$opG8Po3nh|78?)uN!03{1o~q1-&WCjjfY;+XQtyhw(F zHncq86IlD&>a?|-eq7z*>a58eRk|`h*nUca{+{Pc2wF$}@yXcvq+ac{E@mYrsVZq4 z%Rr}nuecSz{`_S#ImWqC22n;ioQNjprY>$_0`JY^ZOb3h&;c*QRsx|k44#FNY6oxm zro-ZGs<=hV>pb?y68rnnxaaL7V!~s<232tjH^VN_nq61L)1o5Qb7Re)MwZM!K;4>3_@8g3R5*>AyyO-_5A zUNOHJDijr1=9E#TDfDv|!PMa#UPwLX^{BDA|=AZ7BSS-z+<%WYt?J(66{R%I3AC^-ucj{CRqFsTuvZZnL{(q zlyjg$^x-*-0RC)9CZlGkbO4X}ey%cQiG5(YTC#`3Rw6y|YV;vWOIbS4Kx>dAE!ir& zps;Q;CtoTujUMC@Bs3y!JAH$}y8AQ%zKA>vE@92HWj5h@X*;|$?EdDR{C6o-xld#S zDm`&@oy^`hzQ8$Fnv>iwZkrG^mF3k|ORK1Lyt79&J2b%%+P#JGhqzQqC+6^-PIuJZ{Q8!#-X0bi)SnaGy%e%hRJLV`0s z+2iG5iT}+!zr*F6-YQ$o`nm<4bCcAvUM~cNFq1~ooVrtHWkoHZmn&h8JvhVa^~gXP zcujs~|2Up5C+3&*=o!<_lVqROn5#4q2aiiXy*CtsctY4A63+6F zp2Z@iR9Z30UGFY%<>PRd{o%*gvKaM@2c&cabR_EEZkrrQAlla;qBecHbngS7q5lNB zx;MGH8ckHY*}mC3YbnVSN8TW{u*i+(ob z^*xXGr^lc{0&Ef{U32sy00#{JmgYa=VAUxVy14rJ#G)v}TA??y#L0_{`|)Q7bL|r+WD6$w=(W z`lien7L2_lgfsHpG#dkYs5wIeqUTk)bRUVqtl&$Jh4Ox>db3TBVH4Ls zkbKB2+hui(NQ{Sf`OcF04dJe!=VUqb;X{evK-FfO4k%w0#bnSAast9+?IZQ26U!%S)#CGF);$sxsm}k#x~disgZ65YV`kr#0{qqoKpinoDFjgpRXIv67LS1l|`D=%a;uxoUPy;K#oFuPj6BW1MK9~jaW+%hi2!stu}@UiF88~ z;0$lCMxhm{vhK&{g#NOTLV8h&IJ+@{(o)mRzQ6V@5)i!DjgGz_Xm-`Qw9NT*#@Ykt z?NPpKK7fu)R5;?G8W^7O>WJsLArL46e`_zyynyhQDo+Iy)y+-U#&a>NzRkT;T*iGr zb>ek4WIRw+Bw$4CYJO<)R%boAZ|s?L!KbHYs|7S;of}AackLUu+tcW8YqmWj+Fa8J z1IZiC_s2=Fe&lT1b&ji5jrYrCQt=35M`V(D92vQh`dueaZb#B_`x3tA*e&%ZfO{RG z8!Au%wc+Zz+a|NS#ujN99TW>X0!EIa;8s(A81kjMr`;v7xTy-_+|xIw^CJ=}E%n;1 zvJX+eRPBADoeFMNJe#WcPq@;WqhzsMO_+Q@UC5jzXNz558e-{1V6NG})s#95<7FtZ z9Bt}5+xhW)9IdEIhc}$`oUx@wv-IDvKC#fHP5ZN%d9vPcLh)a6AC5yQ?EV*z#)>!u zulnJ)uBcWnQoZk&jHg3IBj0BzEoskjd0T(l|DJB$W<6b`XPgeiAu9Nqbni8y-*+Y^ zc7ZJ6F>ht{xfOeGa5vW@8j2g+mXT2;1a| zwOFhSv{X6s;ZEfO>FkiRUk45plBjDlz>iw0QvggD(|)o^3J=s<%a%HysDHJ+LVQVF z`juUkNq)ZoJ7fh~Cd1Ez;TS(?x|EAwnX>Md2g$Astv#K|;kICMfdfQT5ItCGuoBIZ`gs42aEaLuc6yKqE(uQNWo#a zhQB(Q8tFWXt|G9~%A>%_o;p3cX^XkGh^_=wCaIPeBPzTZSF3n$hqx%XrtCQq-gHV) zY%|tc^CaA`(+eyY?h~g=s%(bor9lpuj369wcIq%*tAB>Y*+3f6^YMgZ-B(*D{M4

*GFov)IECi7-#) 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

AdvLi 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 literal 0 HcmV?d00001 diff --git a/artifacts/m0/browser-checks.json b/artifacts/m0/browser-checks.json new file mode 100644 index 0000000..69e2d9c --- /dev/null +++ b/artifacts/m0/browser-checks.json @@ -0,0 +1,62 @@ +{ + "results": [ + { + "width": 360, + "route": "/", + "url": "http://localhost:8155/lab", + "viewport": 360, + "document": 360 + }, + { + "width": 360, + "route": "/breed", + "url": "http://localhost:8155/breed", + "viewport": 360, + "document": 360 + }, + { + "width": 360, + "route": "/gallery", + "url": "http://localhost:8155/gallery", + "viewport": 360, + "document": 360 + }, + { + "width": 360, + "route": "/about", + "url": "http://localhost:8155/about", + "viewport": 360, + "document": 360 + }, + { + "width": 1440, + "route": "/", + "url": "http://localhost:8155/lab", + "viewport": 1440, + "document": 1440 + }, + { + "width": 1440, + "route": "/breed", + "url": "http://localhost:8155/breed", + "viewport": 1440, + "document": 1440 + }, + { + "width": 1440, + "route": "/gallery", + "url": "http://localhost:8155/gallery", + "viewport": 1440, + "document": 1440 + }, + { + "width": 1440, + "route": "/about", + "url": "http://localhost:8155/about", + "viewport": 1440, + "document": 1440 + } + ], + "errors": [], + "keyboard": "Skip link is first focus target" +} \ No newline at end of file diff --git a/assets/README.md b/assets/README.md new file mode 100644 index 0000000..2bcb530 --- /dev/null +++ b/assets/README.md @@ -0,0 +1,2 @@ +# Artwork +The botanical shell study in apps/web/src/main.tsx is original SVG artwork created for Botanica by Codex (2026-10-28), provided under the repository terms. No external assets are used. This is decorative M0 art; species primitives and the genotype renderer belong to M2. diff --git a/compose.yaml b/compose.yaml new file mode 100644 index 0000000..16bd6a3 --- /dev/null +++ b/compose.yaml @@ -0,0 +1,71 @@ +name: botanica +services: + web: + build: + context: . + dockerfile: apps/web/Dockerfile + ports: ["127.0.0.1:${HOST_PORT:-8155}:8080"] + depends_on: + api: + condition: service_healthy + restart: unless-stopped + networks: [internal] + api: + build: + context: . + dockerfile: apps/server/Dockerfile + environment: + NODE_ENV: production + PORT: "3000" + HOST_PORT: ${HOST_PORT:-8155} + DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} + PUBLIC_DOMAIN: ${PUBLIC_DOMAIN:-http://localhost} + depends_on: + bootstrap: + condition: service_completed_successfully + db: + condition: service_healthy + healthcheck: + test: + [ + "CMD", + "node", + "-e", + "fetch('http://127.0.0.1:3000/health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))", + ] + interval: 10s + timeout: 3s + retries: 10 + start_period: 20s + restart: unless-stopped + networks: [internal] + bootstrap: + build: + context: . + dockerfile: apps/server/Dockerfile + environment: + DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} + command: ["sh", "-c", "node dist/migrate.js && node dist/seed.js"] + depends_on: + db: + condition: service_healthy + restart: "no" + networks: [internal] + db: + image: postgres:17-alpine + environment: + POSTGRES_DB: ${POSTGRES_DB:-botanica} + POSTGRES_USER: ${POSTGRES_USER:-botanica} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD in .env} + volumes: ["postgres_data:/var/lib/postgresql/data"] + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] + interval: 5s + timeout: 5s + retries: 15 + restart: unless-stopped + networks: [internal] +networks: + internal: +volumes: + postgres_data: diff --git a/docs/API_AND_DATA.md b/docs/API_AND_DATA.md new file mode 100644 index 0000000..9f3c903 --- /dev/null +++ b/docs/API_AND_DATA.md @@ -0,0 +1,53 @@ +# API and persistence contracts + +## API conventions +Versioned REST at `/api/v1`. JSON UTF-8. Zod validation for input. Consistent failures `{error:{code,message,details?}}`; use 400 for malformed, 404 for missing, 409 for incompatible/duplicate, 500 for unexpected failures. `GET /health` returns 200 JSON and DB health information without credentials. + +## Endpoints M0–M4 +- `GET /health` — proxy-through health. +- `GET /api/v1/catalog/species` — available species and allele catalogs. +- `POST /api/v1/phenotype/resolve` — validated genome → phenotype + rarity preview; no persistence. +- `POST /api/v1/preview` — validated genome + seed + stage → serialized SVG (or typed scene; choose one and document). +- `GET /api/v1/plants?cursor=&limit=&species=&rarity=&pigment=` — paginated saved demo plants. +- `POST /api/v1/plants` — create demo plant using server-side validation and secure initial visual seed if omitted; no privilege to set own immutable rarity/parent claims. +- `GET /api/v1/plants/:id` — plant, phenotype, parent IDs and status. +- `POST /api/v1/breeding` — `{parentAId,parentBId,idempotencyKey}`; server validates, generates seed, applies genetics, persists child + event in a single transaction. Repeated key returns same result (not additional child). +- `GET /api/v1/breeding?limit=&cursor=` — recent events. + +## Data model (first migration) +`species(id PK, name, compatibility_group, catalog_version, config_jsonb)`. +`players(id UUID PK, display_name, created_at)` — seed single sandbox player only; no auth yet. +`plants(id UUID PK, owner_id FK, species_id FK, genome_version integer, genome jsonb, mutations jsonb, visual_seed integer, renderer_version integer, rarity_policy_version integer, rarity_score integer, rarity_tier text, generation integer, parent_a_id nullable FK self, parent_b_id nullable FK self, created_at timestamptz)`. +`breeding_events(id UUID PK, owner_id FK, parent_a_id FK, parent_b_id FK, child_id UNIQUE FK, rng_seed integer, engine_version integer, mutation_events jsonb, idempotency_key unique text, created_at timestamptz)`. +`discoveries(player_id FK, signature text, first_discovered_at timestamptz, PK(player_id,signature))` optional in M4. + +Indices: plants(owner_id,created_at DESC), plants(species_id,rarity_tier), breeding_events(owner_id,created_at DESC). Use enum validation in domain layer. Schema-specific migrations must be checked into repository. Seed catalog + demo player in idempotent script; sample gallery generated from seeded fixed seeds for repeatability. + +## Example valid genome +```json +{ + "pigment": ["P", "G"], + "leafShape": ["L", "O"], + "leafPattern": ["V", "S"], + "growthHabit": ["B", "C"], + "flowerColor": ["R", "W"], + "flowerDensity": ["H", "M"] +} +``` + +## Example breeding request +```json +{ + "parentAId": "uuid-parent-a", + "parentBId": "uuid-parent-b", + "idempotencyKey": "uuid-user-generated-unique-request" +} +``` + +## Security and transaction invariants +- Only exposed service is the web reverse proxy. Proxy `/api/` and `/health` to `api:3000` over Compose internal network, not to `localhost` from inside container. +- Demo endpoints are deliberately not publicly secure without authentication. For internet deployment, **must** add auth + ownership and rate limits first; current MVP intended for localhost only. +- Sanitize SVG input by using known primitive IDs/validated hex palette values; never interpolate arbitrary string into SVG markup. +- No raw SQL concatenation; no secrets in frontend build; limit payload size. +- Idempotent breeding ensures retries cannot create duplicated child plants. +- API response and schema types must be shared where sensible; avoid circular import chains. diff --git a/docs/CODEX_START_PROMPT.md b/docs/CODEX_START_PROMPT.md new file mode 100644 index 0000000..3c87ae4 --- /dev/null +++ b/docs/CODEX_START_PROMPT.md @@ -0,0 +1,12 @@ +# First message to Codex + +Read `AGENTS.md` and the whole `docs/` handoff. You are implementing a real repository, not writing another plan. Begin with **milestone M0 only** from `docs/IMPLEMENTATION_PLAN.md`: scaffold the workspaces, create all Dockerfiles, web reverse proxy and a responsive Plant Laboratory shell with a working API and Postgres migrations. Keep the requested `.env` values (`HOST_PORT=8155`, `PUBLIC_DOMAIN=http://localhost`). Do not add unnecessary frameworks. Execute the M0 acceptance commands, fix failures, update `docs/PROGRESS.md`, then report results and ask to proceed to M1. All later milestones must follow the exact order and contracts specified. + +# Subsequent prompts + +- `Implement M1 exactly as specified, validate it, update PROGRESS.md, and report.` +- `Implement M2 exactly as specified, validate it, update PROGRESS.md, and report.` +- `Implement M3 exactly as specified, validate it, update PROGRESS.md, and report.` +- `Implement M4 exactly as specified, validate it, update PROGRESS.md, and report.` + +For more independent execution: `Implement M0 through M4 sequentially, checking each acceptance gate and recording verified results. Do not skip failed gates.` diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md new file mode 100644 index 0000000..ddf94d8 --- /dev/null +++ b/docs/DECISIONS.md @@ -0,0 +1,12 @@ +# Architectural decisions (fixed for v1) + +- First deliverable is Plant Laboratory, not the entire idle economy. +- React/Vite frontend; Fastify backend; PostgreSQL; npm workspaces; Docker Compose; TypeScript across code. +- Illustrated 2D original SVG primitives; pure deterministic renderer with optional PixiJS **later** only if performance demands. +- Diploid fixed-locus genetics; explicit seed and versions; no bio-realism claims. +- One demonstrator species (`velvetleaf`), other species supported by schema but not required before M4. +- Two-parent controlled breeding, server authoritative and idempotent. +- Single sandbox demo player, no auth or public release at MVP stage. +- English UI for v1, sensible localization-ready keys later. +- Simple focused tests over test-heavy process; acceptance gates must work. +- No cloud API dependencies for game operation. diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md new file mode 100644 index 0000000..6bf26c4 --- /dev/null +++ b/docs/DEPLOYMENT.md @@ -0,0 +1,44 @@ +# Docker Compose deployment/runbook + +## Requested configuration +`.env` includes exactly: +``` +HOST_PORT=8155 +PUBLIC_DOMAIN=http://localhost +``` +The actual **browser URL** is `http://localhost:8155`. `PUBLIC_DOMAIN` is the domain origin requested by owner and deliberately has no port. For local URL construction derive `PUBLIC_BASE_URL=http://localhost:8155`; prefer relative API URLs (`/api/v1/...`) on the web client. Do not send client requests directly to container name `api` (not browser-resolvable). + +## M0 required deliverables +- `apps/web/Dockerfile`: multi-stage Node build → lightweight nginx runtime, serving Vite output and forwarding `/api/`, `/health` to `api:3000`. Create nginx config under `apps/web/nginx.conf`. Use SPA history fallback to `index.html`; ensure `/health` and `/api/` proxy rules take precedence. +- `apps/server/Dockerfile`: multi-stage Node build, Node runtime listening on `0.0.0.0:3000` and health endpoint. +- `compose.yaml` is provided; adapt only if necessary for a **working**, secure Compose setup, preserving exposed host port, private DB/API, healthcheck and volume. If Node native dependencies require extra Docker libraries, document why. +- Use `NODE_ENV=development` only for initial local setup; deployment builds should run production assets and API with runtime environment. +- Implement Drizzle migrations on container initialization as a controlled documented command, not an uncontrolled migration loop. Provide `npm run db:migrate`, `npm run db:seed`. +- `docker compose config` should parse correctly before Docker build. + +## Commands +```bash +# local bootstrap (after M0 files created) +docker compose config +docker compose up --build -d +docker compose ps +curl -fsS http://localhost:8155/health + +# Stop (keep database) +docker compose down + +# NEVER use -v unless intentionally deleting data +docker compose down -v +``` + +## Critical security note +The starter `.env` has a deliberately weak local-only placeholder password. Generate a strong password before exposing the app or sharing `.env`. `.env` is gitignored. In this MVP there is no user authentication: **do not open the app to the public internet** until auth/access control and API throttling are implemented. + +## Future reverse proxy +Later replace `PUBLIC_DOMAIN` with a true HTTPS origin and configure TLS at the reverse proxy; no fixed 8155 should be appended for an external HTTPS origin. Keep Compose `HOST_PORT` configurable; enable trusted proxy headers only for known proxy. Do not overbuild this now. + +## Implemented M0 bootstrap + +Compose publishes web on loopback (`127.0.0.1:${HOST_PORT}:8080`), with nginx running as an unprivileged user. API and DB have no published ports. The `bootstrap` one-shot service uses the API image to run `node dist/migrate.js` then `node dist/seed.js`; API waits for successful completion. A PostgreSQL transaction advisory lock serializes migration execution. A migration tracking table prevents repeat schema application. Seeds use conflict-safe inserts and preserve existing records. + +For explicit reruns use `docker compose run --rm bootstrap node dist/migrate.js` or `docker compose run --rm bootstrap node dist/seed.js`. Runtime images contain compiled JavaScript; root npm migration/seed scripts use TypeScript tooling for host development with an explicit `DATABASE_URL`. Compose production mode overrides the starter development value without modifying `.env`. diff --git a/docs/GENETICS_SPEC.md b/docs/GENETICS_SPEC.md new file mode 100644 index 0000000..ac913dc --- /dev/null +++ b/docs/GENETICS_SPEC.md @@ -0,0 +1,59 @@ +# Genetics contract v1 + +## Basic representation +This is an intentional **game model** inspired by Mendelian genetics. It is not rigorous botanical genetics. Genomes are diploid: each locus is `[alleleFromParentA, alleleFromParentB]` (ordering retained for parental origin if useful). The trait catalog is species-family scoped, versioned and data-driven. + +Initial loci: +| key | alleles | mode | visible phenotype | +|---|---|---|---| +| pigment | `G,P,R,Y` | categorical dominance `P > R > Y > G` for v1 | leaf base palette | +| leafShape | `O,L,S` | `L > S > O` | oval/lobed/pointed silhouette | +| leafPattern | `S,V,M` | `V > M > S` | solid/variegated/marbled | +| growthHabit | `C,B,T` | `T > B > C` | compact/bushy/trailing | +| flowerColor | `W,P,B,R` | `B > R > P > W` | flower palette | +| flowerDensity | `L,M,H` | `H > M > L` | number of blooms | + +Dominance order is a gameplay simplification and is **not** an assertion about real plant biology. Use stable, named IDs in catalog; do not rely on one-letter characters to be globally unique between loci. + +## Determinism contract +- `resolvePhenotype(speciesId, genome, mutations, catalogVersion): Phenotype` pure, no RNG. +- `layoutPlant(speciesId, phenotype, visualSeed, growthStage, rendererVersion): PlantScene` pure; same inputs result in same scene bytes/geometry to meaningful precision. +- `breed(parentA, parentB, seed, catalogVersion): BreedingResult` pure; reject incompatible species, select one parental allele per locus with uniform seeded draw, independently across loci for v1. Use fixed PRNG and documented serialization of seed. Save source seed, engine version and result in breeding event. +- `generateSeed()` server-only with secure randomness; genetics gets explicit numerical seed. Use a testable seeded generator such as Mulberry32 or PCG32 and document cross-runtime integer semantics. +- `visualSeed` affects only cosmetic leaf placement/density jitter within the constraints of resolved phenotype. Never affects hereditary traits. +- Allele catalog/engine version changes must not silently rewrite existing stored genotypes. Keep backwards-compatible resolution or migration scripts. + +## Cross compatibility +- Species have `compatibilityGroup`, plus optional allowed partner overrides. +- Default: only same-group species can cross. Unapproved combinations reject with machine code `INCOMPATIBLE_SPECIES`. +- In v1, seed offspring species is parent A if same species, otherwise use a **specified deterministic hybrid rule**; initially disallow interspecies even within group until hybrids are defined in data. Code should have a clear compatibility extension point. + +## Mutation rules +- Per-locus mutation is optional and small; **baseline probability 0.005 per inherited allele** in configurable catalog; when triggered replace inherited allele with a *different valid allele* selected uniformly. Persist event log of mutations. +- Rare named morphological mutation `golden_veins` is an explicit modifier with a separate configurable triggered probability, initially **0.001 per offspring**, rolled only at breeding. It changes vein rendering only, not chromosome alleles. +- These are example balance values, not promises of rarity tiers; capture actual result via tests. +- Mutation outcome must be committed once with breeding transaction, not recomputed on fetching plant. + +## Rarity policy +- Rarity is a **derived, versioned classification**, not an independent RNG reward. +- Score `0..100`: +20 for each recessive unusual phenotype (max +40), +20 for variegated/marbled patterns, +25 for named rare mutation, +15 for other uncommon combination; clamp 100. Define unusual traits per species catalog rather than hardcoding across all species. +- Tier thresholds: Common 0–9, Uncommon 10–24, Rare 25–44, Epic 45–64, Legendary 65–84, Mythic 85–100. Some tiers may be inaccessible before more traits/species are added; do not misrepresent tier frequency. +- `rarityPolicyVersion=1`, store score and tier at birth with policy version; provide a recompute command for future version upgrades, but no automatic silent rewrite. +- Display collection frequency (from actual dataset) separately from rarity tier. + +## Breeding algorithm outline +1. Validate species compatibility, complete genomes and locus alleles using Zod. +2. Instantiate deterministic RNG from event seed. +3. At each locus, draw exactly one of each parent's two alleles; invoke mutation checks in **stable sorted locus order**. +4. Roll named mutations in stable sorted ID order (fixed order documented). +5. Resolve phenotype and classify rarity. +6. Derive fresh child `visualSeed` deterministically from event seed; persist child, generation `max(parents)+1`, parent IDs, breed event and costs atomically. +7. Return resolved phenotype and persisted child. + +## Tests (mandatory, small and meaningful) +- `Pg × Pg` in a single dominant locus: 25% homozygous dominant, 50% heterozygous, 25% homozygous recessive after >=10,000 draws with mutation OFF, tolerances ±2 percentage points. +- Two parents with same genotype and fixed seed always reproduce same child. +- Same genome, different visualSeed: same phenotype, different cosmetics. +- Invalid alleles, missing loci and incompatible species fail. +- Mutations never create an unknown allele and are logged. +- No simultaneous duplicate breeding can spend resources twice (when economy implemented); meanwhile transaction persists exactly one child per idempotency key. diff --git a/docs/GRAPHICS_SPEC.md b/docs/GRAPHICS_SPEC.md new file mode 100644 index 0000000..45bb950 --- /dev/null +++ b/docs/GRAPHICS_SPEC.md @@ -0,0 +1,49 @@ +# Graphics and renderer architecture v1 + +## Principle +No pre-rendered combination explosion. Build plants from **illustrated hand-authored SVG primitives** composed into a deterministic scene. Species style is recognizable: no generic random leaves substituting for all botanical families. + +## Module shape +- `packages/renderer/src/layout.ts`: pure scene generation (geometry, layer ordering, deterministic placements). +- `packages/renderer/src/renderSvg.ts`: scene → **safe deterministic SVG string** with validated colors/asset paths, fixed viewBox `0 0 512 512`, no scripts/external href. +- `apps/web/src/components/PlantPreview.tsx`: SVG display wrapper; supports 64, 128, 512 pixel responsive presentation. +- Exports: browser SVG native; PNG via canvas using locally generated serialized SVG with same-origin/Blob URLs and graceful error; JSON genome export separate. + +## Render stack, back to front +1. soft ground shadow; 2. pot rear; 3. rear leaves; 4. stem branches; 5. front leaves; 6. blooms/inflorescence; 7. pigment patterns + veins; 8. pot lip and highlights. + +## Primitive asset contract +SVG primitives saved under `assets/species//` as `.svg` source and optional typed path definitions. Each primitive declares: +``` +{ + "assetId": "velvetleaf/leaf_lobed_v1", + "category": "leaf", + "anchor": [0.5, 0.92], + "bounds": [0, 0, 100, 140], + "paletteSlots": ["leafBase", "leafShade", "vein", "variegation"], + "rendererVersion": 1 +} +``` +Each path has canonical coordinates and must be paintable using declared palette slots. No bitmap/image elements, filter-heavy effects, third-party assets, arbitrary scripts or CSS foreignObject. + +## v1 authored assets +- Species `velvetleaf`: 3 silhouettes (oval, lobed, pointed), each with veins and highlights. +- 3 branch templates (compact, bushy, trailing) and stem primitive. +- 4 bloom variants / petals, 2 pots, ground shadow. +- 4 growth stages: seedling, juvenile, mature, flowering. Bloom graphics hidden until flowering stage. Stage affects geometry/counts, never genotype. +- 6 curated palettes, mapping allele phenotype to leaf colors. Variegation and marbling are **masks or path overlays**, not arbitrary giant color rectangles. +- Golden veins mutation renders as restrained warm-gold vein overlay. + +## Scene and repeatability +- Layout output is a data tree: layer, assetId, x, y, rotation, scale, palette map, optional clipping/masking config. +- Use seeded RNG for branch/leaf placement, but do not randomize core silhouette beyond recognition. +- Bounds must never clip major leaves or pot. Maintain consistent scale across gallery cards. +- Render to SVG with stable ID namespace per preview (no collisions when multiple plants appear on the page). IDs derived from scene instance + fixed index; do not affect visual deterministic geometry. +- Avoid React rerender of all 100 plants when changing one editor control; memoize based on canonical render inputs. + +## Acceptance visual QA +- At least 12 intentional variants (3 leaf shapes × 2 pigments × 2 patterns) clearly distinguishable; manually visually inspect using rendered browser screenshot. +- Large preview remains attractive at 512px, readable at 64px; avoid jagged joins and disproportionate pots. +- 100 small previews render without unacceptable jank on a normal desktop browser. +- Exported SVG opens in a standard SVG viewer without external assets; PNG export has correct alpha/background as selected. +- All graphics are original vector assets stored in the repository; document creator and licensing in `assets/README.md`. diff --git a/docs/IMPLEMENTATION_PLAN.md b/docs/IMPLEMENTATION_PLAN.md new file mode 100644 index 0000000..7edb98f --- /dev/null +++ b/docs/IMPLEMENTATION_PLAN.md @@ -0,0 +1,89 @@ +# Implementation plan — explicit Codex execution gates + +## Working rules +Complete milestones sequentially. Finish one and validate it before moving on. Use `docs/PROGRESS.md` as execution log. Do not implement speculative game systems. In the event of a spec conflict, prioritize: `AGENTS.md`, then this plan, then narrower contracts. Document deviations instead of silently redefining requirements. Prefer small components, one implementation per responsibility and clear error states. + +## M0 — infrastructure & bootable application +**Objective:** real running web + API + database through Docker Compose, before domain features. + +Tasks: +1. Initialize npm workspace root with `apps/web`, `apps/server`, `packages/genetics`, `packages/renderer`, `packages/rules`, `packages/shared`. Configure shared TS config, ESLint if straightforward, testing via Vitest and root scripts `dev`, `build`, `typecheck`, `test`, `db:migrate`, `db:seed`. +2. Scaffold React/Vite + router + Tailwind, install shadcn/ui prerequisites only (add actual components as needed), Zustand and TanStack Query; a proper illustrated shell/header and top nav. Implement `/lab`, `/breed`, `/gallery`, `/about`; all pages may show clearly labeled empty states in M0. +3. Scaffold Fastify TypeScript API, Zod, Drizzle PostgreSQL connection, `/health` returning 200 if DB query succeeds. Implement uniform API errors. +4. Create DB schema and initial migration consistent with `docs/API_AND_DATA.md`, demo player + `velvetleaf` catalog seed; startup/bootstrap behavior must be repeatable. Seed operation idempotent. +5. Create production-quality Dockerfiles, nginx SPA/proxy config, .dockerignore. Make Compose from root work with provided .env (host 8155, public origin http://localhost). +6. Add simple README scripts, screenshots not mandatory yet. No credentials in Git. + +Gate: +- `docker compose config` works. +- `docker compose up --build -d` produces healthy API/DB and reachable UI at `http://localhost:8155`. +- `curl -fsS http://localhost:8155/health` returns HTTP 200 JSON. +- Mobile page renders without horizontal overflow. +- `npm run typecheck`, `npm run test`, `npm run build` pass (root tooling installed and lockfile committed). +- Database survives `docker compose down` / `up` and cannot be reached via published Compose ports. + +## M1 — genetics domain (pure package) +Tasks: +1. Create versioned catalogs/types, Zod validators, `validateGenome`, `resolvePhenotype`, `canBreed`, `breed`, `classifyRarity` as specified. +2. Implement a deterministic seeded PRNG with documented integer rules and deterministic cross-run results. Do not mix RNG into renderer. +3. Allele inheritance: 50/50 from each parent independently by locus; dominance policy per locus; named mutation logging; explicit exceptions for invalid/incompatible pairs. +4. Add proper unit tests on example cross, mutation boundaries, deterministic replay, phenotypes and rarity policy. +5. Implement `/api/v1/catalog/species` and `/api/v1/phenotype/resolve` with shared DTOs. + +Gate: +- Example cross with mutations disabled yields 1:2:1 genotypes over 10k runs within ±2 percentage points. +- Same seed → exact same result, across calls. +- Cross-species breeding blocked unless compatibility is explicitly defined. +- Untrusted client alleles rejected by server. +- `npm run test`, `typecheck`, `build` pass. + +## M2 — illustrated vector rendering +Tasks: +1. Create at least **original** handcrafted SVG primitive sources (see GRAPHICS_SPEC). Strong visual quality; use multiple paths, veins/shading, artistically composed plant silhouette. +2. Implement species-specific plant grammar and pure geometry layout with visualSeed, phenotype, 4 stages and stable IDs. +3. Render an isolated viewBox 512 SVG. Apply color palettes, silhouette switching, variegation/marbling and golden veins mutation. No unsafe injected XML. +4. Add export SVG and PNG with transparent or warm background selection, ensure rendered result matches preview. +5. Add gallery proof view showing at least 12 systematic variations and 100-seed smoke demo; perform browser visual QA and optimize if needed. + +Gate: +- 3 leaf shapes, 2 pigments, 2 patterns visibly distinct. +- Same args produce same SVG geometry; same genotype with different visualSeed varies only cosmetically. +- 64px icon and 512px hero remain legible; no obvious clipping. +- SVG and PNG exports open and visually match. +- 100 plants render without noticeable frozen UI on typical desktop. +- Build/tests/typecheck pass. + +## M3 — editor and persistent breeding +Tasks: +1. Build polished Lab: live plant preview, species selector, diploid allele editor, stage selector, visual seed control and mutation toggles (manual preview only, not falsely claimed as bred mutations), genotype/phenotype and score explanations. +2. Add server-side `POST /api/v1/plants`, `GET /api/v1/plants/:id`, pagination GET. Persist canonical genomes, seeds, lineage fields. Seed demo parents. +3. Implement server authoritative `POST /api/v1/breeding` idempotent and transactional, plus history endpoint; create real child instance with securely selected event seed and recorded parent IDs. +4. Implement Breeding Lab screen: parent selection, validation, cross, result card and lineage navigation. Show accurate example probabilities only for single-gene preview. +5. Mutation logic and rarity scores computed once at child creation and persisted. Data migration scripts tested on clean DB. + +Gate: +- Editing allele changes expected visible traits instantly. +- Breed yields child with exactly two persisted parents and generation +1. +- Retry same idempotencyKey returns same child, no duplicates. +- Cross incompatible species refuses with clear message. +- Browser reload persists generated plants. +- No server error leaks secrets. Tests/build/typecheck pass. + +## M4 — collection gallery and hardening +Tasks: +1. Implement `/gallery` cards with filters, sorting and pagination, details inspector, lineage ancestry links and export JSON/SVG/PNG. +2. Create **100 deterministic varied demo plants** using seed script. Make seed idempotent so running twice does not duplicate. +3. Add helpful empty/loading/error states, toast/action confirmation, responsive layout and focus handling, reduced motion. +4. Polish botanical art direction and cards, ensure readability at 64px; inspect screenshots for desktop + mobile and fix visual issues. +5. Document API via concise examples, deployment constraints, future idle-game roadmap; verify no public auth claims or security oversell. + +Gate: +- 100 plant gallery searchable/filterable without excessive UI lag. +- Exported SVG, PNG and JSON valid; opens without external resources. +- Lineage from bred child to parents navigable. +- 360px and 1440px layouts verified. +- `docker compose up --build -d`, health, tests, typecheck, build pass. +- Project ready for further iteration, **not** publicly launchable until auth/ownership controls added. + +## Scope of next phase (do not code yet) +M5+ greenhouse economy (pots, seeds, currencies), offline time progression via event timestamps, upgrades and automation, seed shop, collection achievements, research, player accounts, secure multiplayer/trading. Should be planned after Plant Lab proof is accepted, not smuggled into MVP. diff --git a/docs/PRODUCT_SPEC.md b/docs/PRODUCT_SPEC.md new file mode 100644 index 0000000..9f5cdf7 --- /dev/null +++ b/docs/PRODUCT_SPEC.md @@ -0,0 +1,40 @@ +# Product specification — Plant Laboratory v1 + +## Goal +A functioning botanical breeding sandbox with beautiful **illustrated 2D** assets. This is the first slice of a larger idle plant collection/greenhouse game, not a generic admin UI. Initial interface language English. + +## Personas and core flow +1. Visitor opens responsive browser app at `/` and sees a lovely large plant rendered as SVG. +2. They choose species, edit diploid alleles, watch the plant change immediately, select a growth stage and set the cosmetic visual seed. +3. They select two parent plants and request breeding through the API; resulting child genotype and traceable parent IDs are saved by the server. +4. They browse a 100-plant visual gallery with filter by species, pigment, pattern and rarity, open details, inspect ancestry and export JSON/SVG/PNG. +5. At end of MVP, single demo player has local-account-free sandbox persistence; no login. Build ownership into schema for later authenticated accounts. Avoid exposing a destructive global reset in production. + +## Pages/screens +- `/lab`: hero live SVG preview (large), genome editor (editable locus/allele pairs), controls for stage, visualSeed, mutation flags, responsive inspector with phenotype and derived rarity. +- `/breed`: two parent pickers (from persisted sample plants), compatibility indicator, breeding button, outcome card, parent links, historic breed events. +- `/gallery`: responsive 2–5 column cards, virtualize or paginate when >100, species/trait/rarity filters, details sheet, download actions. +- `/about`: clear description of educational *fictional game genetics*, not a scientifically accurate botany simulator. +- `/` redirects to `/lab`. + +## Visual design +Mood: calm botanical cabinet of curiosities; credible handmade illustration rather than glossy tech dashboard. Canvas warm ivory, forest green controls, restrained terra-cotta, rare colors as accents. Dark mode optional, not prerequisite. Leaves and flowers must have deliberate illustrated shapes (veins, subtle layered shading); avoid simple emoji or generic circles. + +Design tokens suggested: +- Background `#F6F3E8`; surface `#FFFCF4`; ink `#20392D`; muted `#6A7C70`. +- Primary `#32684A`; secondary `#B76F52`; borders `#D8DED2`. +- Rarity accents: Common `#78977B`, Uncommon `#4F9D91`, Rare `#5489C6`, Epic `#9366C3`, Legendary `#CB9C39`, Mythic `#C76D87`. +- Use consistent typography (system serif for botanical headings, sans for controls); avoid remote font dependencies. + +## Core UX acceptance +- Clear keyboard-focus indication, semantic controls, labels, WCAG AA targets where feasible. +- Mobile 360px width does not overflow. Desktop 1440px has split inspector/gallery composition. +- SVG shapes readable at 64px card and at 500px inspector. +- Select altered allele → phenotype and illustration change without page refresh, for traits with visible manifestations. +- Controls show genotype **and** phenotype separately. +- Show why crossing is blocked if species incompatible. +- Show generated probabilities only if accurate to implemented model; do not imply independent rarity dice rolls. +- Reduced-motion users do not get excessive animations. No external runtime artwork APIs. + +## Explicitly out of scope for this handoff +Accounts/auth, inventory purchase/harvest economy, greenhouse automation/timers, social trading, realtime multiplayer, paywalls, AI-generated graphics, crop disease. Add later in separate plan after Laboratory MVP. diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md new file mode 100644 index 0000000..a6441eb --- /dev/null +++ b/docs/PROGRESS.md @@ -0,0 +1,40 @@ +# Implementation progress + +- [x] M0 — workspaces, Compose, healthcheck, migrations, responsive shell. +- [ ] M1 — genetics contracts, deterministic PRNG, pure engine + tests. +- [ ] M2 — procedural illustrated SVG renderer, exports, visual QA. +- [ ] M3 — lab editor, server persistence, breeding flow. +- [ ] M4 — gallery, provenance, UX polish, full acceptance. + +## M0 — 2026-10-28 + +Implemented npm workspaces (`apps/web`, `apps/server`, and four pure package boundaries), shared strict TypeScript configuration, Vitest, and root development/build/typecheck/test/migration/seed commands. Installed compatible dependencies and generated `package-lock.json`. + +Added React/Vite/Tailwind shell with router, TanStack Query health indicator, Zustand and shadcn prerequisites. Four routes have explicit M0 empty states, keyboard focus and skip navigation, responsive layout and reduced-motion support. Original static botanical SVG is shell decoration; no genetics or procedural renderer is claimed at M0. + +Added Fastify API with uniform safe errors, DB-dependent `/health`, Zod runtime configuration, local/reverse-proxy public URL derivation, PostgreSQL pool and Drizzle schema. Checked-in initial SQL migration creates species, players, plants and breeding events with ownership/lineage references, uniqueness, indexes and basic data constraints. Transaction-locked migration tracking and idempotent catalog/player seeding run in a one-shot Compose bootstrap service before API startup. + +Added non-root production Docker images, nginx history fallback and API/health reverse proxy, `.dockerignore`, local-only web publication and persistent PostgreSQL volume. Updated README and asset provenance. `.env` remains unchanged and ignored; requested values are `HOST_PORT=8155`, `PUBLIC_DOMAIN=http://localhost`. + +### Verified acceptance + +- `docker compose config --quiet`: passed. +- `docker compose up --build -d`: passed; API and PostgreSQL healthy; bootstrap exits successfully. +- `docker compose ps`: API/DB running healthy; web running at `127.0.0.1:8155`. +- `curl.exe -fsS http://localhost:8155/health`: HTTP 200, `{"status":"ok","database":"connected"}` through nginx. +- `npm run typecheck`: passed across all six workspaces. +- `npm run test`: 3 tests passed (DB health success, safe failure/404, local versus reverse-proxy URL configuration). +- `npm run build`: all workspaces passed; Vite generated production assets. +- Repeated `docker compose run --rm bootstrap node dist/migrate.js` and `node dist/seed.js`: passed; counts remain one player, one species, one migration. +- `docker compose down` then `docker compose up -d --wait`: passed without removing volumes. Player UUID and original `created_at` remained identical; velvetleaf catalog persisted. +- Docker inspection reports empty published port bindings for API and DB. Only web publishes a host port; it binds to loopback. +- Headless Chrome visited all four routes at 360px and 1440px, with zero JavaScript page errors and document width equal to viewport width. `/` redirects to `/lab`. Desktop and mobile screenshots visually inspected; see `artifacts/m0/1440.png`, `artifacts/m0/360.png`, and `artifacts/m0/browser-checks.json`. +- Git ignore verification confirms `.env` excluded; no live credentials in tracked source. + +### Execution notes and limits + +Initial Docker build started before npm finished writing the lockfile and failed; rebuilding with the completed lockfile succeeded. Initial typecheck found Fastify's unknown error type; handler now narrows it safely. Vitest's temporary-cache writes were blocked by the Windows sandbox; rerunning with approved expanded execution passed. Docker, npm network access and headless Chrome also required expanded execution in this environment. + +No M1–M4 behavior is implemented. Domain packages intentionally establish empty module boundaries until their milestone. No ESLint was added; strict TypeScript and focused tests provide the M0 checks. This remains a local demo without authentication. + +M0 gate complete. Stop here. Next: M1 genetics contracts, deterministic PRNG, inheritance engine and tests, after user instruction to proceed. diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..91c0864 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3894 @@ +{ + "name": "botanica", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "botanica", + "version": "0.0.0", + "workspaces": [ + "apps/*", + "packages/*" + ], + "devDependencies": { + "@types/node": "^24.0.0", + "concurrently": "^9.2.1", + "typescript": "~5.9.3", + "vitest": "^4.1.0" + } + }, + "apps/server": { + "name": "@botanica/server", + "version": "0.0.0", + "dependencies": { + "drizzle-orm": "^0.45.4", + "fastify": "^5.12.7", + "pg": "^8.16.3", + "zod": "^4.0.0" + }, + "devDependencies": { + "@types/pg": "^8.15.5", + "tsx": "^4.20.0" + } + }, + "apps/web": { + "name": "@botanica/web", + "version": "0.0.0", + "dependencies": { + "@tanstack/react-query": "^5.0.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.577.0", + "react": "^19.3.1", + "react-dom": "^19.3.1", + "react-router": "^7.0.0", + "tailwind-merge": "^3.0.0", + "zustand": "^5.0.0" + }, + "devDependencies": { + "@tailwindcss/vite": "^4.0.0", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^6.0.0", + "tailwindcss": "^4.0.0", + "vite": "^8.3.5" + } + }, + "node_modules/@botanica/genetics": { + "resolved": "packages/genetics", + "link": true + }, + "node_modules/@botanica/renderer": { + "resolved": "packages/renderer", + "link": true + }, + "node_modules/@botanica/rules": { + "resolved": "packages/rules", + "link": true + }, + "node_modules/@botanica/server": { + "resolved": "apps/server", + "link": true + }, + "node_modules/@botanica/shared": { + "resolved": "packages/shared", + "link": true + }, + "node_modules/@botanica/web": { + "resolved": "apps/web", + "link": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-4.0.7.tgz", + "integrity": "sha512-VP0yIfwlc1ohj733keYDqyHm1VWeP9VQxYomunhr90jkC4aNNibbkrRiaNgPgqj1ORxUenILR4qzA/ppYBNAtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^4.0.0" + } + }, + "node_modules/@fastify/deepmerge": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@fastify/deepmerge/-/deepmerge-3.2.4.tgz", + "integrity": "sha512-kc8GQq5gX9RRhw0rov3DMrN8wS8yRlxJRdDzsYwwdBV/wazuVgc/1K7CKL90tlvu3RlHan6Y0R0aE3nJtBz2eQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/error": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-4.2.1.tgz", + "integrity": "sha512-MYBumuIwP+5MIpXSyKm6/o1Eigcoij186lWUssX3LH5U8KWqU0ktZhzC4CErIX9EJeQeRGI+zJZQWakBlFbUcg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-5.1.1.tgz", + "integrity": "sha512-pyxRKk7UpUnnrztP9pF4+ZYxusEQ4LifTyzRdiXmyql1QezNHxO02D25MVU2o4kMeAMYWAjG6RKRlojgkbiDAw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^7.0.0" + } + }, + "node_modules/@fastify/forwarded": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@fastify/forwarded/-/forwarded-3.1.2.tgz", + "integrity": "sha512-89WiRG+hW3VQSfCwg4Hb8b43PeyEX15K5+lEfsZ4EUth/FyOjS/lv8HsVuswUNXWiSnxMGNouE/fq/0w3VumHQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/@fastify/merge-json-schemas": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.2.2.tgz", + "integrity": "sha512-d/gx9sRbUCVgGRGzma46wLcwiY8noTqO2Nmjg/vbTARxHRE5bdh5PIL8s97Lt1X7ScRWRW52eVYxwIoPwIdVUA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@fastify/proxy-addr": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@fastify/proxy-addr/-/proxy-addr-5.1.2.tgz", + "integrity": "sha512-uqB4QsgVoro0XDC+DIftIMGXHdBPn+lK6Ek3xXAIxPMCJfqxnbtyEoMCm2KPUVOuIosd7Cyw9HawEqMFM/UA+g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/forwarded": "^3.0.0", + "ipaddr.js": "^2.1.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@oxc-project/types": { + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" + } + }, + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz", + "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.24.1", + "jiti": "^2.7.0", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.3.3" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "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" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/node/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz", + "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-arm64": "4.3.3", + "@tailwindcss/oxide-darwin-x64": "4.3.3", + "@tailwindcss/oxide-freebsd-x64": "4.3.3", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", + "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", + "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", + "@tailwindcss/oxide-linux-x64-musl": "4.3.3", + "@tailwindcss/oxide-wasm32-wasi": "4.3.3", + "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", + "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz", + "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz", + "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz", + "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz", + "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz", + "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz", + "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz", + "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz", + "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz", + "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz", + "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.11.1", + "@emnapi/runtime": "^1.11.1", + "@emnapi/wasi-threads": "^1.2.2", + "@napi-rs/wasm-runtime": "^1.1.4", + "@tybys/wasm-util": "^0.10.2", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz", + "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz", + "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz", + "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.105.0.tgz", + "integrity": "sha512-7p56vRmT/z4UJ6sctGIdl5WRUQyUv53IUpUwEKi2g97zMbO7zh8ZsCLffGAvCPBR4xD72e3VXsDyLwXHhoNTMQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.105.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.105.0.tgz", + "integrity": "sha512-y+hMuDERvgg6ay1da0V1a6ZC0ZONt7dELxSFkqRZuwm7p1TTZs0MoXrPlBRflIpRoYjvzQVYxycnLImpFLhWrw==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.105.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@types/react": "^18 || ^19", + "react": "^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.19.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz", + "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": ">=7.24.0 <7.24.7" + } + }, + "node_modules/@types/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-fKVHpikPdg4GKks3JuLEhvwSyvwzF23hnabPy6DD8ljVbC7+6J5dQzdv4arV6jqq57djnMgs1HKBxX4P8aBI3A==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/react": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.3.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.2.tgz", + "integrity": "sha512-fhJNGUdscQa4HkI0xFxwonWyhnVReCPDbXI7FH7jmzpnVCrFQI7PRrhWecO263610vOrs9tr2Y4xcf8uAdFxbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", + "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.152.0", + "vite": "^8.0.0" + }, + "peerDependenciesMeta": { + "@rolldown/plugin-babel": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "oxc-transform-react": { + "optional": true + } + } + }, + "node_modules/@vitest/expect": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.12.tgz", + "integrity": "sha512-vFlTt+YEu9WBpNjdGayNmlMVzrWPi1+sv853/7t2FU7hpO5gAFBKHzQmkCq5Xjpr+evegF2994LQT3hF3mRlqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.1.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", + "chai": "^6.2.2", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.12.tgz", + "integrity": "sha512-fKShNpKZzupWZuY0z7egydvL0sqW4INEZBEExMBMAa6izlENEVHwoXgdaTCaBZ5fwlr4xf2o1wXC83n9RpO+NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.1.12", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.21" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.12.tgz", + "integrity": "sha512-XW9O8+Mxx4VpCtkYdMJLZQQwsVryP9wk7cPKDxtXFfwSak6yRh5+2fep/Y0XF/ElBvJHq8bcYdi6aeuai0opZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.12.tgz", + "integrity": "sha512-NKlVKCr5QnCe8jijdMnmkpHHU+WTqiLFR6G0pHji9uRjXK9xJl1k1nTw6F3pOOj2PDcsDt2GKQMI7wIsaT491w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.1.12", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.12.tgz", + "integrity": "sha512-ko1y1Qgb/slzQ9mr+b89Cuqud8WG1TKtsPD8r7ZUBdvVOGt85Af2HwCqHujrhwJq95hs/9RM7fcAPg57o1vlzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.12", + "@vitest/utils": "4.1.12", + "magic-string": "^0.30.21", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.12.tgz", + "integrity": "sha512-RGq9x4JNGNTZHEJxvN0oSiJjeSCExm0n2gZKKJZHY9cX5AVA6M7VJILBT3ZJ/tJ/0J9uWT7fETV9/btoi//vSg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.12.tgz", + "integrity": "sha512-Q3awXrwOfEV+qc3WmO5ONyE0yO7Q1gQ9/oyHxGLZ/pl7N3NO/ZztqQwKLuwMkV+CA1JYSIeO3gkHnRDIo4AVaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.1.12", + "convert-source-map": "^2.0.0", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.9.tgz", + "integrity": "sha512-hS/0Wt3Ya043oKXs0sIxrMpKQITXhMLIrVAKKXi4gozGC9v7YRWVnXIZzjNPTO02M9BdxLCWqK1yRXgNziVyJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-9.3.1.tgz", + "integrity": "sha512-QyTKW61/qlba+cUQBm/sT9X8lri4UdomqSDwCnrnj1IvLVDRRiXRkz4CgBRWB+/cmfC7SK5WQc8T1vSdGvaUcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/error": "^4.0.0", + "fastq": "^1.17.1" + } + }, + "node_modules/chai": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/class-variance-authority": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", + "integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concurrently": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.5.tgz", + "integrity": "sha512-YMZlvWrTPQEhjKp60XSmMGt60+pffbv6DyRnOMvVO98+J7aF8w8Ui9FhdcOwvSixc/kyR6SoVvmejcn/2lZBqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "4.1.2", + "rxjs": "7.8.2", + "shell-quote": "1.12.0", + "supports-color": "8.1.1", + "tree-kill": "1.2.2", + "yargs": "17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-yuToqVvRrj6pfDXREyQAAv8SkAEk/8GS3jQRTiUMm66TVtBYmqQeoEjL2Lmq8Rpo6271vH76InTChTitEAm65w==", + "license": "MIT", + "engines": { + "node": ">=22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/drizzle-orm": { + "version": "0.45.4", + "resolved": "https://registry.npmjs.org/drizzle-orm/-/drizzle-orm-0.45.4.tgz", + "integrity": "sha512-NiM1YZpJ2UxyeE67DpDDZ+Tsw4YLX3trSlkNT7Tm9eKoUNb1LvaAaQzXgYQsWs+AQ9TUmmwMmBOCXuqqxUWKKQ==", + "license": "Apache-2.0", + "peerDependencies": { + "@aws-sdk/client-rds-data": ">=3", + "@cloudflare/workers-types": ">=4", + "@electric-sql/pglite": ">=0.2.0", + "@libsql/client": ">=0.10.0", + "@libsql/client-wasm": ">=0.10.0", + "@neondatabase/serverless": ">=0.10.0", + "@netlify/db": ">=0.4.0", + "@op-engineering/op-sqlite": ">=2", + "@opentelemetry/api": "^1.4.1", + "@planetscale/database": ">=1.13", + "@prisma/client": "*", + "@tidbcloud/serverless": "*", + "@types/better-sqlite3": "*", + "@types/pg": "*", + "@types/sql.js": "*", + "@upstash/redis": ">=1.34.7", + "@vercel/postgres": ">=0.8.0", + "@xata.io/client": "*", + "better-sqlite3": ">=7", + "bun-types": "*", + "expo-sqlite": ">=14.0.0", + "gel": ">=2", + "knex": "*", + "kysely": "*", + "mysql2": ">=2", + "pg": ">=8", + "postgres": ">=3", + "sql.js": ">=1", + "sqlite3": ">=5" + }, + "peerDependenciesMeta": { + "@aws-sdk/client-rds-data": { + "optional": true + }, + "@cloudflare/workers-types": { + "optional": true + }, + "@electric-sql/pglite": { + "optional": true + }, + "@libsql/client": { + "optional": true + }, + "@libsql/client-wasm": { + "optional": true + }, + "@neondatabase/serverless": { + "optional": true + }, + "@netlify/db": { + "optional": true + }, + "@op-engineering/op-sqlite": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@prisma/client": { + "optional": true + }, + "@tidbcloud/serverless": { + "optional": true + }, + "@types/better-sqlite3": { + "optional": true + }, + "@types/pg": { + "optional": true + }, + "@types/sql.js": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/postgres": { + "optional": true + }, + "@xata.io/client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "bun-types": { + "optional": true + }, + "expo-sqlite": { + "optional": true + }, + "gel": { + "optional": true + }, + "knex": { + "optional": true + }, + "kysely": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "pg": { + "optional": true + }, + "postgres": { + "optional": true + }, + "prisma": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + } + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.26.0.tgz", + "integrity": "sha512-9vhedylFonb2YGogzUKX6+Ja72gOJbN1QHAqdrvqLwhdl/QWbKopzoUC9EbQNVsAns/bx/4uyqalrQAoy1IByw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.28.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-7.2.0.tgz", + "integrity": "sha512-q18imgm9fEdQVfvJbRJALE9VP/A5HGme0+NUnWcmFYM9rbQbLkZZk20FyIp1LQ8gDOauQKwqMc52YozqFaQyOw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/merge-json-schemas": "^0.2.0", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "fast-uri": "^4.0.0", + "json-schema-ref-resolver": "^3.0.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "license": "MIT", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-uri": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-4.2.3.tgz", + "integrity": "sha512-I1PXwP5eAhlNlcdpjt9CgB59op2ZvZfxw+BkqGFVIUOgNpCVTcTqp3HhTX7brxj5vsip+nSY4nTvff+eIA76hg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastify": { + "version": "5.12.7", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.12.7.tgz", + "integrity": "sha512-v4pEPsTRPuqlDIYiQFB+BHjVN4SdHX9u0ABk0ZDUKbbdY1vsNryUd1j4Z+jQEZajvYIVk047Kimva9/AJ79GYw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@fastify/ajv-compiler": "^4.0.5", + "@fastify/error": "^4.0.0", + "@fastify/fast-json-stringify-compiler": "^5.0.0", + "@fastify/proxy-addr": "^5.0.0", + "abstract-logging": "^2.0.1", + "avvio": "^9.0.0", + "fast-json-stringify": "^7.0.0", + "find-my-way": "^9.6.0", + "light-my-request": "^6.0.0", + "pino": "^9.14.0 || ^10.1.0", + "process-warning": "^5.1.0", + "rfdc": "^1.3.1", + "secure-json-parse": "^4.0.0", + "semver": "^7.6.0", + "toad-cache": "^3.7.0" + } + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-my-way": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-9.10.0.tgz", + "integrity": "sha512-eru+uCPQ2g+nLBkf84MHP/KyNNMar0BDy0j+i8Fb72GF9/YHBZ58q7FODUtfVV7XU9nfRUHXSmaM8NmZcIbZ4Q==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^5.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.5.0.tgz", + "integrity": "sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/json-schema-ref-resolver": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-schema-ref-resolver/-/json-schema-ref-resolver-3.0.1.tgz", + "integrity": "sha512-w+HwgljXpVwZ3IidoUR1qPZxSOQ+NRQWuVe6a5pe8XbHsNZE4UAwVPUvzZagn7yBKbJtt6UJnRFYbNTRPZI45Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/light-my-request": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-6.8.0.tgz", + "integrity": "sha512-5Q8PjoSEdtGIB8fikZsTem5vgRo4F2mR6vUKTDW/H1g6MtAt8e3duQbg/QxL5yzg6BZhor2KOUm3hhWMWLTZwg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause", + "dependencies": { + "@fastify/deepmerge": "^3.1.0", + "cookie": "^2.0.0", + "process-warning": "^5.0.0", + "set-cookie-parser": "^3.0.1" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-react": { + "version": "0.577.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.577.0.tgz", + "integrity": "sha512-4LjoFv2eEPwYDPg/CUdBJQSDfPyzXCRrVW1X7jrx/trgxnxkHFjnVZINbzvzxjN70dxychOfg+FTYwBiS3pQ5A==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/nanoid": { + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/obug": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pg": { + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.23.1.tgz", + "integrity": "sha512-aL96AHANtWjPLDOLqnhx+ngp9+UK7ETEU8VJrDCGvsSSi/mGLcWYsS6Herg7lmaBJe4uwrfqsa7gTEFaSizDoQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "pg-connection-string": "^2.14.1", + "pg-pool": "^3.14.0", + "pg-protocol": "^1.16.1", + "pg-types": "2.2.0", + "pgpass": "1.0.5" + }, + "engines": { + "node": ">= 16.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.4.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.4.1.tgz", + "integrity": "sha512-6PQbsFWZcp9EmJEwy5cGQ2La+AMWpP46lgbb8X+U/XsHIUweYDNCpeuKck5RxL2MdVFi7krbbEi5nX4Zh7JhrQ==", + "license": "MIT", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.14.1.tgz", + "integrity": "sha512-qR3kGNPBLpCNtz0evbKA0Y/MRFXwSSdT+pTJvYp/bXTcReZbvX1kzF0IyTc1QnxqF7AZbOeBhNL8R5mYQZV/MA==", + "license": "MIT" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "license": "ISC", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.14.0.tgz", + "integrity": "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw==", + "license": "MIT", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.16.1.tgz", + "integrity": "sha512-p9VOFMiHB/ZbJATetbg+99PxssTVSQRnyuPSQ67mN1+1KBOjZaZ83ZQzltnxPhJwSsC3nwVjJ10DVJlerbFzLg==", + "license": "MIT" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "license": "MIT", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pino": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-10.4.0.tgz", + "integrity": "sha512-bk1ZMTwG/Vymx+zPoa28MhNzucFvXJWp3csrSuxuHPSMeUettaCoQ5Jvg07mtC4JGNpcfTwz41oVCnNgBK9+vA==", + "license": "MIT", + "dependencies": { + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^3.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^1.0.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^4.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-3.0.0.tgz", + "integrity": "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==", + "license": "MIT", + "dependencies": { + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.1.0.tgz", + "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", + "license": "MIT" + }, + "node_modules/postcss": { + "version": "8.5.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.32.tgz", + "integrity": "sha512-LJlKCCAUFKOuZxipUdYw1NzIITEsPcgyOG9LkvRJvuKj/bRzbuRY0ARXvL0pWGpsZvn8jku+LMep2eU0seHp8g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.20", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "license": "MIT", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-warning": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.1.1.tgz", + "integrity": "sha512-oCkNVj4OKnKEcocVBcDfiIugN1/cE6rgfT3nCtzeqZPA8+rIxMaQ0xXzIkGP8Gj2qUaP1UR7uhJ1VD8lUCpzCg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.1.tgz", + "integrity": "sha512-QNhWdt7nrgVWWQG58QuGsAR3jv3Hbe4mb4vz7w2csnHavciZJgda1CPNaldF6eVxv90ud3jUXpKlHL69gO38yw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.1.tgz", + "integrity": "sha512-Y0bARz53lhEC1NMCASs0/j+faB/zqt3R8hpvg1e8+61ZVJ4UL0UdC4cBbXfZMcIuhrfgeILTLe+ZeBCavQPtKQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.28.0" + }, + "peerDependencies": { + "react": "^19.3.1" + } + }, + "node_modules/react-router": { + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.5.tgz", + "integrity": "sha512-dTgvcXDOrLPrlLHrcZAqWveiK1hMSqN+rGAJzegP8HtmNkfRxOoshGWBNX3ZJ0cZjOHkRdlUJtaIhZMLLyGyPw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router/node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/react-router/node_modules/set-cookie-parser": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.3.tgz", + "integrity": "sha512-irZHtTqurLna57KQG/s+fzOwv/J6XSH4cs8M/vsrY3uCaQ3S6+QJguAH0WdN47SXlk82voMZ4naWMQf8fdEoIg==", + "license": "MIT" + }, + "node_modules/real-require": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", + "integrity": "sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==", + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ret": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.1.tgz", + "integrity": "sha512-Z/nyvABwcRnRD2mMP7Kz6G1dFZZqX1mNErOnxF42OCQKE07b9k9hK9SQxHL3LFEZUdzQaLM4dId1E/E6Vm4WhA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rolldown": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@oxc-project/types": "=0.155.0", + "@rolldown/pluginutils": "^1.0.0" + }, + "bin": { + "rolldown": "bin/cli.mjs" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "optionalDependencies": { + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-regex2": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.1.2.tgz", + "integrity": "sha512-tAtCGFPPP02VroDVzp4daGi6bC7jWG+41D47GKf18FeH/ubvKQHT9VmhAkvtjNOmJwqtApzWeUpEhkyEYULvmw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "ret": "~0.5.0" + }, + "bin": { + "safe-regex2": "bin/safe-regex2.js" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" + }, + "node_modules/secure-json-parse": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-4.1.1.tgz", + "integrity": "sha512-lnd81MQEZKjhW/Gd2TQqdd4XP6QYNdDW/EP+I7nTrFHP9y2LmaGPIHk9xsnzcOiEr1c39c/e84xFgGviQKBTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.2.1.tgz", + "integrity": "sha512-Npd1Pt+4zb3BrSZDPd2qFwRpS6b1EUEasRrO8xS0zMJi0fApXXK5YuzP0minyJnxwnFHoVoJwA55q0A0cu63gQ==", + "license": "MIT" + }, + "node_modules/shell-quote": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz", + "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/sonic-boom": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.1.tgz", + "integrity": "sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==", + "license": "MIT", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.3.0.tgz", + "integrity": "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/tailwind-merge": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.7.0.tgz", + "integrity": "sha512-XPPUyAc+cvspz3lHTcR/QgPfW2A0lv/xQNIjX3HGhLR+Nq2lHaLq5MtTesHn8GUr3W3DguT2KT5x3NVgRtYwmA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz", + "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/thread-stream": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", + "integrity": "sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==", + "license": "MIT", + "dependencies": { + "real-require": "^1.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.2.0.tgz", + "integrity": "sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/toad-cache": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.7.4.tgz", + "integrity": "sha512-m1TdR/rvT7kgGJZhspNtXdsdYk0fddFpJJFlG5s+UkPFo6lkLoZ3YLOaovPYjq1R75NP5JfeTlSHaOsE09peCg==", + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.23.15", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", + "integrity": "sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", + "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.5.tgz", + "integrity": "sha512-z1YpjieJ9g0ebTmQpLBv/oq9E3F9EIlOe+7LahW8SrE3LTiG3udBRUXQOlYXP9b+IC2q2phHeVxj9xGlw34OEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.30", + "rolldown": "~1.2.14", + "tinyglobby": "^0.2.17" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.7.1 || ^0.8.0", + "esbuild": "^0.27.0 || ^0.28.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "@vitejs/devtools": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.12.tgz", + "integrity": "sha512-5eWdz2yb3ajxWF3C8C4TjkXl7FGm3n2E/VlazALrQHzK7nYMSGFnCZto0bbPNl77AwkOZVLk0YnBAejUu0NiWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.1.12", + "@vitest/mocker": "4.1.12", + "@vitest/pretty-format": "4.1.12", + "@vitest/runner": "4.1.12", + "@vitest/snapshot": "4.1.12", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", + "es-module-lexer": "^2.0.0", + "expect-type": "^1.3.0", + "magic-string": "^0.30.21", + "obug": "^2.1.1", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^4.0.0-rc.1", + "tinybench": "^2.9.0", + "tinyexec": "^1.0.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.1.0", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.1.12", + "@vitest/browser-preview": "4.1.12", + "@vitest/browser-webdriverio": "^4.1.11", + "@vitest/coverage-istanbul": "4.1.12", + "@vitest/coverage-v8": "4.1.12", + "@vitest/ui": "4.1.12", + "happy-dom": "*", + "jsdom": "*", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@opentelemetry/api": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/coverage-istanbul": { + "optional": true + }, + "@vitest/coverage-v8": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "vite": { + "optional": false + } + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/zod": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zustand": { + "version": "5.0.16", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.16.tgz", + "integrity": "sha512-Uv7e327ihlCfayfja3hDc0M64Upev1LWBKpRobdK4NyovDDPeeX4imWXc/wzC1yc6fkYPoAY/ncKVPAs2jrtQw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "packages/genetics": { + "name": "@botanica/genetics", + "version": "0.0.0" + }, + "packages/renderer": { + "name": "@botanica/renderer", + "version": "0.0.0" + }, + "packages/rules": { + "name": "@botanica/rules", + "version": "0.0.0" + }, + "packages/shared": { + "name": "@botanica/shared", + "version": "0.0.0" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..aebdfce --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "botanica", + "private": true, + "version": "0.0.0", + "workspaces": [ + "apps/*", + "packages/*" + ], + "scripts": { + "dev": "concurrently \"npm run dev -w @botanica/server\" \"npm run dev -w @botanica/web\"", + "build": "npm run build --workspaces --if-present", + "typecheck": "npm run typecheck --workspaces --if-present", + "test": "vitest run", + "db:migrate": "npm run db:migrate -w @botanica/server", + "db:seed": "npm run db:seed -w @botanica/server" + }, + "devDependencies": { + "typescript": "~5.9.3", + "vitest": "^4.1.0", + "concurrently": "^9.2.1", + "@types/node": "^24.0.0" + } +} diff --git a/packages/genetics/package.json b/packages/genetics/package.json new file mode 100644 index 0000000..e69701b --- /dev/null +++ b/packages/genetics/package.json @@ -0,0 +1,11 @@ +{ + "name": "@botanica/genetics", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": "./src/index.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit" + } +} diff --git a/packages/genetics/src/index.ts b/packages/genetics/src/index.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/genetics/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/genetics/tsconfig.json b/packages/genetics/tsconfig.json new file mode 100644 index 0000000..01c4d9a --- /dev/null +++ b/packages/genetics/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true + }, + "include": ["src"] +} diff --git a/packages/renderer/package.json b/packages/renderer/package.json new file mode 100644 index 0000000..206dbf4 --- /dev/null +++ b/packages/renderer/package.json @@ -0,0 +1,11 @@ +{ + "name": "@botanica/renderer", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": "./src/index.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit" + } +} diff --git a/packages/renderer/src/index.ts b/packages/renderer/src/index.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/renderer/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json new file mode 100644 index 0000000..01c4d9a --- /dev/null +++ b/packages/renderer/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true + }, + "include": ["src"] +} diff --git a/packages/rules/package.json b/packages/rules/package.json new file mode 100644 index 0000000..1e22b85 --- /dev/null +++ b/packages/rules/package.json @@ -0,0 +1,11 @@ +{ + "name": "@botanica/rules", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": "./src/index.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit" + } +} diff --git a/packages/rules/src/index.ts b/packages/rules/src/index.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/rules/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/rules/tsconfig.json b/packages/rules/tsconfig.json new file mode 100644 index 0000000..01c4d9a --- /dev/null +++ b/packages/rules/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true + }, + "include": ["src"] +} diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 0000000..b2e91ac --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,11 @@ +{ + "name": "@botanica/shared", + "version": "0.0.0", + "private": true, + "type": "module", + "exports": "./src/index.ts", + "scripts": { + "build": "tsc -p tsconfig.json", + "typecheck": "tsc -p tsconfig.json --noEmit" + } +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 0000000..01c4d9a --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "declaration": true + }, + "include": ["src"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 0000000..d54705a --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true + } +}