From de33a03524072b637c6881f0414b1b0e612b3c1a Mon Sep 17 00:00:00 2001 From: karti Date: Wed, 12 Aug 2026 19:16:43 -0700 Subject: [PATCH] Add the web app, seed data, and user-selectable theming MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit apps/web — React, Vite, Tailwind, shadcn-idiom components. Mobile Safari is a first-class target, not an afterthought: - Two navigation treatments rather than one compromise. A bottom tab bar on phones, because the top of a large phone is out of thumb reach; a persistent sidebar from lg upward, so an iPad in portrait gets it too. - Safe-area insets throughout, so the tab bar clears the home indicator and the last row of a list is actually reachable. - Inputs are pinned to a 16px minimum, which is the correct fix for Safari zooming on focus. user-scalable=no is not used: it breaks pinch-zoom for everyone and recent iOS ignores it anyway. - The pipeline board becomes a stage picker on phones. An eight-column board scrolling horizontally on a 390px screen is technically responsive and practically useless. Theming: users pick an accent and the whole interface re-tints. Accent values live once, in @pig/core, and are written onto the root element at runtime — there is no CSS copy to drift from the TypeScript. Preferences are stored server-side so they follow a person between laptop and phone, mirrored into localStorage only so the pre-paint script can avoid a white flash. Status colours stay fixed regardless of accent: if "at risk" re-tinted to whatever someone picked, the signal would be gone. Seed data is public research, every record carrying a confidence grade and a source URL. No email addresses are seeded or inferred — none are published, and guessing them from a name and a domain is unreliable and rude. Authorship is not promoted to employment: contributors, residency participants and alumni are recorded as what the evidence actually shows, and a name that could not be sourced at all is listed as unresolved rather than invented. Three defects found and fixed by actually running it rather than assuming: 1. The seed was not idempotent. onConflictDoNothing() with no target is a no-op without a matching unique constraint, so a second run duplicated 27 contacts. There is deliberately no unique index on (account, name) — two people at one company can share a name — so idempotency is enforced in the seed instead of by bending the schema. 2. /capacity scrolled sideways on a phone. Grid items default to min-width:auto and `truncate` sets nowrap, so a long title became unshrinkable content and widened the track. Fixed with min-w-0 on every truncating grid child. 3. The idle-capacity alert silently failed to fire at exactly 80% utilisation, losing a float comparison against a 0.2 threshold. Moved to 0.15, which is also a more sensible line for "worth attention". The worked example is tuned to teach rather than to flatter: 70% sold at a 53% markup lands at +6.7% margin with 20% still idle, so both the healthy number and the alert are visible. Drop the sold share to 55% and the same block goes underwater — that sensitivity is the argument for the product. Verified in a real browser at 393px and 1440px, light and dark: zero horizontal overflow on every route, zero console errors. Co-Authored-By: Claude Opus 5 (1M context) --- apps/api/src/app.ts | 5 +- apps/web/index.html | 56 + apps/web/package.json | 34 + apps/web/postcss.config.js | 1 + apps/web/public/manifest.webmanifest | 12 + apps/web/public/pig.svg | 14 + apps/web/src/App.tsx | 225 + apps/web/src/components/PiggyMark.tsx | 79 + apps/web/src/components/Shell.tsx | 154 + apps/web/src/components/ui/index.tsx | 227 + apps/web/src/index.css | 129 + apps/web/src/lib/api.ts | 191 + apps/web/src/lib/theme.tsx | 159 + apps/web/src/main.tsx | 13 + apps/web/src/pages/Accounts.tsx | 109 + apps/web/src/pages/Capacity.tsx | 337 + apps/web/src/pages/Margin.tsx | 138 + apps/web/src/pages/Overview.tsx | 263 + apps/web/src/pages/Pipeline.tsx | 250 + apps/web/src/pages/Settings.tsx | 238 + apps/web/src/pages/SignIn.tsx | 102 + apps/web/tailwind.config.js | 33 + apps/web/tsconfig.json | 12 + apps/web/vite.config.ts | 37 + package-lock.json | 2961 ++++++++ .../db/migrations/0001_user_appearance.sql | 2 + .../db/migrations/meta/0001_snapshot.json | 6244 +++++++++++++++++ packages/db/migrations/meta/_journal.json | 7 + packages/db/src/seed/index.ts | 361 + packages/db/src/seed/people.ts | 373 + 30 files changed, 12765 insertions(+), 1 deletion(-) create mode 100644 apps/web/index.html create mode 100644 apps/web/package.json create mode 100644 apps/web/postcss.config.js create mode 100644 apps/web/public/manifest.webmanifest create mode 100644 apps/web/public/pig.svg create mode 100644 apps/web/src/App.tsx create mode 100644 apps/web/src/components/PiggyMark.tsx create mode 100644 apps/web/src/components/Shell.tsx create mode 100644 apps/web/src/components/ui/index.tsx create mode 100644 apps/web/src/index.css create mode 100644 apps/web/src/lib/api.ts create mode 100644 apps/web/src/lib/theme.tsx create mode 100644 apps/web/src/main.tsx create mode 100644 apps/web/src/pages/Accounts.tsx create mode 100644 apps/web/src/pages/Capacity.tsx create mode 100644 apps/web/src/pages/Margin.tsx create mode 100644 apps/web/src/pages/Overview.tsx create mode 100644 apps/web/src/pages/Pipeline.tsx create mode 100644 apps/web/src/pages/Settings.tsx create mode 100644 apps/web/src/pages/SignIn.tsx create mode 100644 apps/web/tailwind.config.js create mode 100644 apps/web/tsconfig.json create mode 100644 apps/web/vite.config.ts create mode 100644 packages/db/migrations/0001_user_appearance.sql create mode 100644 packages/db/migrations/meta/0001_snapshot.json create mode 100644 packages/db/src/seed/index.ts create mode 100644 packages/db/src/seed/people.ts diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index 58ec9c7..ed2c60c 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -493,7 +493,10 @@ export function createApp(config: Config, db: Database) { const p = c.get('principal'); const [margin, idle, openDemand, openSupply, recent] = await Promise.all([ capacity.marginReport(), - capacity.idleCapacity({ thresholdPct: 0.2 }), + // 0.15 rather than 0.2: a block sitting exactly on the threshold would + // otherwise flip in and out of the alert list on floating-point noise, + // and 15% idle is worth a seller's attention anyway. + capacity.idleCapacity({ thresholdPct: 0.15 }), db .select({ count: sql`count(*)::int` }) .from(demandDeals) diff --git a/apps/web/index.html b/apps/web/index.html new file mode 100644 index 0000000..62d5103 --- /dev/null +++ b/apps/web/index.html @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + pig — Prime Intellect Growth + + + + +
+ + + diff --git a/apps/web/package.json b/apps/web/package.json new file mode 100644 index 0000000..d372d5d --- /dev/null +++ b/apps/web/package.json @@ -0,0 +1,34 @@ +{ + "name": "@pig/web", + "version": "0.1.0", + "private": true, + "license": "Apache-2.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b --noEmit false --emitDeclarationOnly false || true && vite build", + "preview": "vite preview", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@pig/core": "*", + "@supabase/supabase-js": "^2.47.10", + "@tanstack/react-query": "^5.62.11", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.469.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.1.1", + "tailwind-merge": "^2.6.0" + }, + "devDependencies": { + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "vite": "^6.0.7" + } +} diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js new file mode 100644 index 0000000..99417eb --- /dev/null +++ b/apps/web/postcss.config.js @@ -0,0 +1 @@ +export default { plugins: { tailwindcss: {}, autoprefixer: {} } }; diff --git a/apps/web/public/manifest.webmanifest b/apps/web/public/manifest.webmanifest new file mode 100644 index 0000000..6d4c65f --- /dev/null +++ b/apps/web/public/manifest.webmanifest @@ -0,0 +1,12 @@ +{ + "name": "pig — Prime Intellect Growth", + "short_name": "pig", + "description": "An agent-native CRM for two-sided AI-compute companies.", + "start_url": "/", + "display": "standalone", + "background_color": "#ffffff", + "theme_color": "#ffffff", + "icons": [ + { "src": "/pig.svg", "sizes": "any", "type": "image/svg+xml", "purpose": "any" } + ] +} diff --git a/apps/web/public/pig.svg b/apps/web/public/pig.svg new file mode 100644 index 0000000..10bf2ac --- /dev/null +++ b/apps/web/public/pig.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx new file mode 100644 index 0000000..5feda59 --- /dev/null +++ b/apps/web/src/App.tsx @@ -0,0 +1,225 @@ +/** + * Application root: routing, data fetching, and the auth gate. + */ +import { useEffect, useState } from 'react'; +import { QueryClient, QueryClientProvider, useQuery } from '@tanstack/react-query'; +import { BrowserRouter, Route, Routes } from 'react-router-dom'; +import { ApiError, get, getSupabase, loadPublicConfig, patch, type PublicConfig } from '@/lib/api'; +import { ThemeProvider } from '@/lib/theme'; +import { Shell } from '@/components/Shell'; +import { Overview } from '@/pages/Overview'; +import { Capacity } from '@/pages/Capacity'; +import { DemandPipeline, SupplyPipeline } from '@/pages/Pipeline'; +import { Settings } from '@/pages/Settings'; +import { Accounts } from '@/pages/Accounts'; +import { Margin } from '@/pages/Margin'; +import { SignIn } from '@/pages/SignIn'; +import { PiggyMark } from '@/components/PiggyMark'; +import { EmptyState } from '@/components/ui'; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + staleTime: 30_000, + // Refetching every time a phone user switches apps and comes back is + // wasteful on cellular; the interval on the dashboard covers freshness. + refetchOnWindowFocus: false, + retry: (failureCount, error) => { + // Retrying an auth failure just produces the same failure slower. + if (error instanceof ApiError && (error.needsSignIn || error.needsProfile)) return false; + return failureCount < 2; + }, + }, + }, +}); + +export function App() { + const [config, setConfig] = useState(null); + const [configError, setConfigError] = useState(null); + + useEffect(() => { + loadPublicConfig() + .then(setConfig) + .catch((error: unknown) => + setConfigError(error instanceof Error ? error.message : 'Could not reach the server.'), + ); + }, []); + + if (configError) { + return ( + + + + ); + } + + if (!config) return ; + + return ( + + { + // Fire and forget: a failed preference save must never block the UI, + // and the local copy already applied the change. + void patch('/api/me/preferences', prefs).catch(() => {}); + }} + > + + + + + + ); +} + +/** + * Decides what to show based on *why* a request failed. + * + * The distinction between "not signed in" and "signed in but not a member" is + * the one that matters: sending an invited-but-unprovisioned user back to a + * login screen they have already completed is an infuriating loop, and it is + * the default behaviour if both are treated as "auth error". + */ +function AuthGate({ config }: { config: PublicConfig }) { + const { data, isLoading, error, refetch } = useQuery({ + queryKey: ['me'], + queryFn: () => get<{ id: string; name: string }>('/api/me'), + }); + + // Adopt the server's stored appearance preferences once we know who this is. + useEffect(() => { + if (!data) return; + void get<{ themeMode?: string; accentColor?: string }>('/api/me/profile') + .then((profile) => { + const adopt = (window as unknown as { __pigAdoptTheme?: (p: unknown) => void }) + .__pigAdoptTheme; + if (profile && adopt) adopt(profile); + }) + .catch(() => {}); + }, [data]); + + // React to sign-in and sign-out without a page reload. + useEffect(() => { + const supabase = getSupabase(); + if (!supabase) return; + const { data: subscription } = supabase.auth.onAuthStateChange(() => { + void refetch(); + }); + return () => subscription.subscription.unsubscribe(); + }, [refetch]); + + if (isLoading) return ; + + if (error instanceof ApiError) { + if (error.needsSignIn) return ; + if (error.needsProfile) { + return ( + + + + ); + } + } + + if (error || !data) { + return ( + + + + ); + } + + return ( + + }> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + ); +} + +function Splash() { + return ( + + + + ); +} + +function Centered({ children }: { children: React.ReactNode }) { + return ( +
+
{children}
+
+ ); +} + +function Placeholder({ title }: { title: string }) { + return ( + + ); +} + +function Team() { + const { data } = useQuery({ + queryKey: ['team'], + queryFn: () => + get< + { + id: string; + name: string; + email: string; + title: string | null; + teams: { team: string; role: string }[]; + }[] + >('/api/team'), + }); + + return ( +
+
+

Team

+

Supply, demand and research.

+
+
+ {(data ?? []).map((person) => ( +
+

{person.name}

+ {person.title ?

{person.title}

: null} +
+ {person.teams.map((t) => ( + + {t.team} + + ))} +
+
+ ))} +
+
+ ); +} diff --git a/apps/web/src/components/PiggyMark.tsx b/apps/web/src/components/PiggyMark.tsx new file mode 100644 index 0000000..9d0a72d --- /dev/null +++ b/apps/web/src/components/PiggyMark.tsx @@ -0,0 +1,79 @@ +/** + * Piggy — the mark. + * + * A front-facing pig's head reduced to the four shapes that survive at 16px: + * two triangular ears, a rounded head, a snout with two nostrils, two eyes. + * Drawn with `currentColor` so it inherits whatever it sits on and works in + * both themes without a second asset, and on any accent the user picks. + * + * This is a placeholder of reasonable quality, not final brand art — good + * enough to ship and to judge layout against, and easy to swap for + * commissioned artwork later without touching any layout code. + */ +export function PiggyMark({ + className = 'h-6 w-6', + title, +}: { + className?: string; + title?: string; +}) { + return ( + + {title ? {title} : null} + + {/* Ears. Drawn before the head so the head's fill overlaps their base. */} + + + + {/* Head. Slightly wider than tall — reads as a pig rather than a bear. */} + + + {/* Eyes, knocked out of the head so the mark stays a single colour. */} + + + + {/* Snout, also knocked out, with two nostrils punched back in. */} + + + + + ); +} + +/** + * The full lockup: mark plus wordmark. + * + * Lowercase, because "pig" set in lowercase reads as a friendly product name + * while "PIG" reads as an acronym being shouted. The expansion is available + * to assistive technology without cluttering the interface. + */ +export function PiggyLogo({ className = '' }: { className?: string }) { + return ( + + + + pig + — Prime Intellect Growth + + + ); +} diff --git a/apps/web/src/components/Shell.tsx b/apps/web/src/components/Shell.tsx new file mode 100644 index 0000000..4a2a9d8 --- /dev/null +++ b/apps/web/src/components/Shell.tsx @@ -0,0 +1,154 @@ +/** + * The application shell. + * + * Two navigation treatments rather than one responsive compromise: + * + * Phone — a bottom tab bar, because the top of a large phone is out of + * thumb reach, and iOS users expect primary navigation there. + * Desktop — a persistent sidebar, because the horizontal room exists and + * hiding navigation behind a hamburger on a 27-inch display wastes + * it. + * + * The breakpoint is `lg`, chosen so that an iPad in portrait gets the sidebar + * — it has the width, and the bottom bar looks lost across a tablet. + */ +import { NavLink, Outlet, useLocation } from 'react-router-dom'; +import { + Boxes, + Building2, + FileText, + LayoutDashboard, + Server, + Settings, + TrendingUp, + Users, +} from 'lucide-react'; +import { PiggyLogo, PiggyMark } from './PiggyMark'; +import { cn } from './ui'; + +interface NavItem { + to: string; + label: string; + icon: typeof LayoutDashboard; + /** Shown in the phone tab bar. Space there is scarce, so only five fit. */ + primary?: boolean; +} + +const NAV: NavItem[] = [ + { to: '/', label: 'Overview', icon: LayoutDashboard, primary: true }, + { to: '/margin', label: 'Margin', icon: TrendingUp, primary: true }, + { to: '/capacity', label: 'Capacity', icon: Server, primary: true }, + { to: '/demand', label: 'Demand', icon: Building2, primary: true }, + { to: '/supply', label: 'Supply', icon: Boxes, primary: true }, + { to: '/accounts', label: 'Accounts', icon: Building2 }, + { to: '/contracts', label: 'Contracts', icon: FileText }, + { to: '/team', label: 'Team', icon: Users }, + { to: '/settings', label: 'Settings', icon: Settings }, +]; + +export function Shell() { + const location = useLocation(); + const current = NAV.find((item) => + item.to === '/' ? location.pathname === '/' : location.pathname.startsWith(item.to), + ); + + return ( +
+ {/* ------------------------------------------------- desktop sidebar */} + + + {/* ---------------------------------------------------- mobile header */} +
+ + + {current?.label ?? 'pig'} + +
+ + {/* ---------------------------------------------------------- content */} +
+
+ +
+
+ + {/* ------------------------------------------------- mobile tab bar */} + +
+ ); +} diff --git a/apps/web/src/components/ui/index.tsx b/apps/web/src/components/ui/index.tsx new file mode 100644 index 0000000..70c4a95 --- /dev/null +++ b/apps/web/src/components/ui/index.tsx @@ -0,0 +1,227 @@ +/** + * UI primitives, in the shadcn idiom — copied-in components you own rather + * than a dependency you configure. Kept in one file because there are few + * enough that a directory of six-line modules would be worse. + * + * Every interactive element clears a 44px touch target, which is the + * documented iOS minimum and the practical difference between a control that + * works on a phone and one that is merely present on it. + */ +import { clsx, type ClassValue } from 'clsx'; +import { twMerge } from 'tailwind-merge'; +import { cva, type VariantProps } from 'class-variance-authority'; +import { + forwardRef, + type ButtonHTMLAttributes, + type HTMLAttributes, + type InputHTMLAttributes, + type ReactNode, +} from 'react'; + +export function cn(...inputs: ClassValue[]): string { + return twMerge(clsx(inputs)); +} + +// ------------------------------------------------------------------- button + +const buttonVariants = cva( + 'inline-flex items-center justify-center gap-2 rounded-lg text-sm font-medium ' + + 'transition-colors disabled:pointer-events-none disabled:opacity-50 ' + + // touch-manipulation removes the 300ms tap delay that older mobile Safari + // applies while waiting to see whether a tap is a double-tap zoom. + 'touch-manipulation select-none whitespace-nowrap', + { + variants: { + variant: { + primary: 'bg-accent text-accent-on hover:opacity-90 active:opacity-80', + secondary: 'bg-surface-2 text-fg hover:bg-border active:bg-border', + outline: 'border border-border bg-transparent hover:bg-surface-2', + ghost: 'bg-transparent hover:bg-surface-2', + danger: 'bg-danger text-white hover:opacity-90', + }, + size: { + // min-h keeps the target tappable even when the label is short. + sm: 'h-9 min-h-[36px] px-3 text-xs', + md: 'h-11 min-h-[44px] px-4', + lg: 'h-12 min-h-[48px] px-6 text-base', + icon: 'h-11 w-11 min-h-[44px] min-w-[44px] p-0', + }, + }, + defaultVariants: { variant: 'secondary', size: 'md' }, + }, +); + +export interface ButtonProps + extends ButtonHTMLAttributes, + VariantProps {} + +export const Button = forwardRef( + ({ className, variant, size, ...props }, ref) => ( + + ))} + + + + {isLoading ? ( + + ) : !data || data.length === 0 ? ( + } title="No accounts found" /> + ) : ( +
+ {data.map((account) => ( +
+
+
+

{account.name}

+ {account.domain ? ( +

{account.domain}

+ ) : null} +
+ +
+
+ + {account.side} + + {account.supplierType ? ( + {account.supplierType.replace(/_/g, ' ')} + ) : null} + {account.customerSegment ? ( + {account.customerSegment.replace(/_/g, ' ')} + ) : null} +
+ {account.lastActivityAt ? ( +

+ Active {relativeTime(account.lastActivityAt)} +

+ ) : null} +
+ ))} +
+ )} + + ); +} diff --git a/apps/web/src/pages/Capacity.tsx b/apps/web/src/pages/Capacity.tsx new file mode 100644 index 0000000..372ea21 --- /dev/null +++ b/apps/web/src/pages/Capacity.tsx @@ -0,0 +1,337 @@ +/** + * Capacity — availability, and the matcher. + * + * The matcher is the screen that justifies the product: given what a customer + * wants, what have we already bought that could serve them, and would selling + * it make money? No generic CRM can answer either half. + */ +import { useState } from 'react'; +import { useMutation, useQuery } from '@tanstack/react-query'; +import { Search, Server, Zap } from 'lucide-react'; +import { compactNumber, get, money, percent, post, shortDate } from '@/lib/api'; +import { + Badge, + Button, + Card, + CardContent, + CardHeader, + CardTitle, + EmptyState, + Input, + Skeleton, +} from '@/components/ui'; + +interface AvailabilityRow { + commitmentId: string; + name: string; + gpuType: string; + gpuCount: number; + interconnectType: string; + securityTier: string; + startsAt: string; + endsAt: string; + totalGpuHours: number; + soldGpuHours: number; + heldGpuHours: number; + availableGpuHours: number; + costPerGpuHourCents: number; + utilisation: number; + breakEvenPriceCents: number | null; +} + +type MatchRow = AvailabilityRow & { score: number; rationale: string[] }; + +export function Capacity() { + const [tab, setTab] = useState<'available' | 'match'>('available'); + + return ( +
+
+

Capacity

+

+ What we hold, what is sold, and what is still sellable. +

+
+ + {/* A segmented control rather than tabs — it reads correctly at phone + width, where a tab row would either wrap or scroll. */} +
+ {(['available', 'match'] as const).map((value) => ( + + ))} +
+ + {tab === 'available' ? : } +
+ ); +} + +function Availability() { + const { data, isLoading } = useQuery({ + queryKey: ['availability'], + queryFn: () => get('/api/capacity/availability'), + }); + + if (isLoading) return ; + + if (!data || data.length === 0) { + return ( + + + } + title="No live capacity commitments" + description="Once you record what capacity you have committed to buy, this view shows how much of each block is sold, held, and still available." + /> + + + ); + } + + return ( +
+ {data.map((row) => ( + + ))} +
+ ); +} + +function CapacityCard({ row }: { row: AvailabilityRow }) { + const soldPct = row.totalGpuHours > 0 ? row.soldGpuHours / row.totalGpuHours : 0; + const heldPct = row.totalGpuHours > 0 ? row.heldGpuHours / row.totalGpuHours : 0; + + return ( + /* + * `min-w-0` is load-bearing. A grid item defaults to `min-width: auto`, + * which means it refuses to shrink below its content — and `truncate` sets + * `white-space: nowrap`, so a long title becomes unshrinkable content and + * widens the whole track. The result is a page that scrolls sideways on a + * phone. This is the fix, and it is needed on every grid child that + * truncates. + */ + + +
+ {row.name} + + {row.securityTier === 'secure_cloud' ? 'Secure' : 'Community'} + +
+

+ {row.gpuCount}× {row.gpuType} · {row.interconnectType} ·{' '} + {shortDate(row.startsAt)}–{shortDate(row.endsAt)} +

+
+ + {/* Sold and held are shown as separate segments, because a full-looking + bar made mostly of unconverted holds is a lie a seller would act on. */} +
+
+
+
+
+
+ {percent(soldPct)} sold + {row.heldGpuHours > 0 ? {percent(heldPct)} held : null} + {compactNumber(row.availableGpuHours)} hrs free +
+
+ +
+
Cost
+
{money(row.costPerGpuHourCents)}/hr
+
Break even
+
+ {row.breakEvenPriceCents == null + ? 'Fully sold' + : row.breakEvenPriceCents === 0 + ? 'Cost covered' + : `${money(row.breakEvenPriceCents)}/hr`} +
+
+ + + ); +} + +function Matcher() { + const [form, setForm] = useState({ + gpuType: '', + gpuCount: '64', + totalGpuHours: '', + requiresHighSpeedInterconnect: true, + maxPrice: '', + }); + + const mutation = useMutation({ + mutationFn: () => + post('/api/capacity/match', { + gpuType: form.gpuType || undefined, + gpuCount: Number(form.gpuCount) || 1, + totalGpuHours: form.totalGpuHours ? Number(form.totalGpuHours) : undefined, + requiresHighSpeedInterconnect: form.requiresHighSpeedInterconnect, + maxPricePerGpuHourCents: form.maxPrice + ? Math.round(Number(form.maxPrice) * 100) + : undefined, + }), + }); + + return ( +
+ + + What does the customer need? + + +
{ + event.preventDefault(); + mutation.mutate(); + }} + > + + setForm({ ...form, gpuType: e.target.value })} + placeholder="H100_80GB" + // Hardware identifiers are case-sensitive upstream; correcting + // them for the user would produce silent mismatches. + autoCapitalize="off" + autoCorrect="off" + spellCheck={false} + /> + + + setForm({ ...form, gpuCount: e.target.value })} + // A numeric keypad on phones, without the spinner arrows and + // scroll-to-change behaviour of type="number". + inputMode="numeric" + pattern="[0-9]*" + /> + + + setForm({ ...form, totalGpuHours: e.target.value })} + inputMode="numeric" + placeholder="Optional" + /> + + + setForm({ ...form, maxPrice: e.target.value })} + inputMode="decimal" + placeholder="Optional" + /> + + + + + +
+
+
+ + {mutation.isSuccess ? ( + mutation.data.length === 0 ? ( + + + } + title="Nothing on the book fits" + description="No committed capacity matches. Search provider inventory to find capacity to buy, which would mean opening a supply deal." + /> + + + ) : ( +
+ {mutation.data.map((match) => ( + + +
+
+

{match.name}

+

+ {match.gpuCount}× {match.gpuType} · {match.interconnectType} ·{' '} + {compactNumber(match.availableGpuHours)} hrs free +

+
+ 0.7 ? 'positive' : 'neutral'}> + {percent(match.score)} fit + +
+
    + {match.rationale.map((reason, i) => ( +
  • + {reason} +
  • + ))} +
+
+
+ ))} +
+ ) + ) : null} + + {mutation.isError ? ( +

+ {mutation.error instanceof Error ? mutation.error.message : 'Match failed.'} +

+ ) : null} +
+ ); +} + +function Field({ label, children }: { label: string; children: React.ReactNode }) { + return ( + + ); +} diff --git a/apps/web/src/pages/Margin.tsx b/apps/web/src/pages/Margin.tsx new file mode 100644 index 0000000..ff5554d --- /dev/null +++ b/apps/web/src/pages/Margin.tsx @@ -0,0 +1,138 @@ +/** + * Margin — the ledger, per block and in total. + * + * The table scrolls inside its own pane on narrow screens rather than making + * the page scroll sideways; a card list would lose the column comparison that + * is the entire value of this view. + */ +import { useQuery } from '@tanstack/react-query'; +import { compactNumber, get, money, moneyExact, percent } from '@/lib/api'; +import { Card, CardContent, CardHeader, CardTitle, EmptyState, Skeleton, Stat } from '@/components/ui'; + +interface MarginReport { + totals: { + committedGpuHours: number; + allocatedGpuHours: number; + idleGpuHours: number; + utilisation: number; + costCents: number; + revenueCents: number; + grossMarginCents: number; + grossMarginPct: number | null; + marginPerAllocatedGpuHourCents: number | null; + }; + blocks: { + commitmentId: string; + name: string; + gpuType: string; + gpuCount: number; + totalGpuHours: number; + soldGpuHours: number; + availableGpuHours: number; + costPerGpuHourCents: number; + utilisation: number; + breakEvenPriceCents: number | null; + }[]; +} + +export function Margin() { + const { data, isLoading } = useQuery({ + queryKey: ['margin'], + queryFn: () => get('/api/capacity/margin'), + }); + + if (isLoading) return ; + if (!data || data.blocks.length === 0) { + return ( + + ); + } + + const t = data.totals; + + return ( +
+
+

Margin

+

+ Revenue from what we sold, against the full cost of what we bought. +

+
+ +
+ + + = 0 ? 'positive' : 'danger'} + /> + +
+ + + + By commitment + + +
+ + + + + + + + + + + + + {data.blocks.map((block) => ( + + + + + + + + + ))} + +
CommitmentSoldFreeUtilisationCost/hrBreak even
+
{block.name}
+
+ {block.gpuCount}× {block.gpuType} +
+
+ {compactNumber(block.soldGpuHours)} + + {compactNumber(block.availableGpuHours)} + + {percent(block.utilisation)} + + {moneyExact(block.costPerGpuHourCents)} + + {block.breakEvenPriceCents == null + ? '—' + : moneyExact(block.breakEvenPriceCents)} +
+
+
+
+
+ ); +} diff --git a/apps/web/src/pages/Overview.tsx b/apps/web/src/pages/Overview.tsx new file mode 100644 index 0000000..3edcb80 --- /dev/null +++ b/apps/web/src/pages/Overview.tsx @@ -0,0 +1,263 @@ +/** + * Overview — the landing view. + * + * Leads with margin and idle capacity rather than deal counts, because those + * are the numbers this business actually turns on. A CRM that opens on + * "23 open opportunities" tells you nothing about whether you are making money. + */ +import { useQuery } from '@tanstack/react-query'; +import { AlertTriangle, ArrowRight, Server, TrendingUp } from 'lucide-react'; +import { Link } from 'react-router-dom'; +import { compactNumber, get, money, percent, relativeTime } from '@/lib/api'; +import { Badge, Card, CardContent, CardHeader, CardTitle, EmptyState, Skeleton, Stat } from '@/components/ui'; + +interface Dashboard { + me: { name: string; teams: { team: string; role: string }[] }; + margin: { + revenueCents: number; + costCents: number; + grossMarginCents: number; + grossMarginPct: number | null; + utilisation: number; + idleGpuHours: number; + committedGpuHours: number; + allocatedGpuHours: number; + }; + blocks: number; + openDemandDeals: number; + openSupplyDeals: number; + idleAlerts: { + commitmentId: string; + name: string; + gpuType: string; + gpuCount: number; + idleCostCents: number; + utilisation: number; + breakEvenPriceCents: number | null; + }[]; + recentActivity: { + id: string; + type: string; + subject: string | null; + occurredAt: string; + }[]; +} + +export function Overview() { + const { data, isLoading, error } = useQuery({ + queryKey: ['dashboard'], + queryFn: () => get('/api/dashboard'), + // The book does not change second to second, but it does change while + // someone is looking at it during a pipeline review. + refetchInterval: 60_000, + }); + + if (isLoading) { + return ( +
+ {Array.from({ length: 4 }).map((_, i) => ( + + ))} +
+ ); + } + + if (error || !data) { + return ( + + ); + } + + const m = data.margin; + const marginTone = m.grossMarginCents >= 0 ? 'positive' : 'danger'; + const firstName = data.me.name.split(' ')[0]; + + return ( +
+
+

+ {greeting()}, {firstName} +

+

+ {data.blocks === 0 + ? 'No capacity commitments yet — margin appears once you record what you have bought.' + : `${data.blocks} capacity commitment${data.blocks === 1 ? '' : 's'} on the book.`} +

+
+ +
+ + + 0 ? 'warning' : 'default'} + /> + +
+ + {data.idleAlerts.length > 0 ? ( + + + + Capacity you are paying for and not selling + + + {data.idleAlerts.map((alert) => ( +
+
+

{alert.name}

+

+ {alert.gpuCount}× {alert.gpuType} · {percent(alert.utilisation)} utilised + {/* + A zero break-even means the block's cost is already + covered, so any further sale is upside. Printing + "break even above $0.00" is technically true and reads + like a bug, so it is said in words instead. + */} + {alert.breakEvenPriceCents == null ? null : alert.breakEvenPriceCents > 0 ? ( + <> + {' · '}break even above{' '} + {money(alert.breakEvenPriceCents)}/GPU-hr + + ) : ( + <>{' · '}cost already covered — further sales are upside + )} +

+
+
+ + {money(alert.idleCostCents)} + + + Match + + +
+
+ ))} +
+
+ ) : null} + +
+ + + The book + + + + +
+ +
+

+ Cost is charged against the full commitment, not only the hours that sold — + unsold hours are already paid for. +

+
+
+ + + + Recent activity + + + {data.recentActivity.length === 0 ? ( +

Nothing logged yet.

+ ) : ( +
    + {data.recentActivity.slice(0, 8).map((activity) => ( +
  • + + {activity.type.replace('_', ' ')} + + {activity.subject ?? '—'} + + {relativeTime(activity.occurredAt)} + +
  • + ))} +
+ )} +
+
+
+ + {data.blocks === 0 ? ( + + + } + title="No capacity on the book yet" + description="Record a capacity commitment — what you bought, at what cost, over what term — and margin, utilisation and idle alerts all follow from it." + /> + + + ) : null} +
+ ); +} + +function Row({ + label, + value, + emphasis, + tone, +}: { + label: string; + value: string; + emphasis?: boolean; + tone?: 'positive' | 'danger'; +}) { + return ( +
+ {label} + + {value} + +
+ ); +} + +function greeting(): string { + const hour = new Date().getHours(); + if (hour < 12) return 'Good morning'; + if (hour < 18) return 'Good afternoon'; + return 'Good evening'; +} diff --git a/apps/web/src/pages/Pipeline.tsx b/apps/web/src/pages/Pipeline.tsx new file mode 100644 index 0000000..11d0c0b --- /dev/null +++ b/apps/web/src/pages/Pipeline.tsx @@ -0,0 +1,250 @@ +/** + * The pipeline boards, for both sides of the market. + * + * A column-per-stage board on desktop; on a phone, a stage picker and a single + * column. A horizontally scrolling eight-column board on a 390px screen is + * technically responsive and practically unusable — you cannot see where a + * card is going, which is the entire point of a board. + */ +import { useMemo, useState } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { get, money, relativeTime } from '@/lib/api'; +import { Badge, Card, EmptyState, Skeleton } from '@/components/ui'; + +interface DemandDeal { + id: string; + name: string; + stage: string; + productLine: string; + acvCents: number | null; + msaExecuted: boolean; + dpaExecuted: boolean; + updatedAt: string; +} + +interface SupplyDeal { + id: string; + name: string; + stage: string; + gpuType: string | null; + gpuCount: number | null; + targetCostPerGpuHourCents: number | null; + updatedAt: string; +} + +interface Board { + stages: string[]; + deals: { deal: T; accountName: string | null }[]; +} + +const STAGE_LABELS: Record = { + qualification: 'Qualification', + legal: 'Legal', + scoping: 'Scoping', + proposal: 'Proposal', + procurement: 'Procurement', + poc: 'POC', + deployment: 'Deployment', + expansion: 'Expansion', + closed_won: 'Closed won', + closed_lost: 'Closed lost', + sourced: 'Sourced', + qualifying: 'Qualifying', + technical_diligence: 'Technical diligence', + financial_diligence: 'Financial diligence', + pricing: 'Pricing', + contracting: 'Contracting', + onboarding: 'Onboarding', + live: 'Live', + renewal: 'Renewal', + churned: 'Churned', + rejected: 'Rejected', +}; + +export function DemandPipeline() { + return ( + + title="Demand" + subtitle="Selling compute and post-training. Note that legal sits early — paper gates the deal rather than closing it." + endpoint="/api/deals/demand" + renderCard={(deal, accountName) => ( + <> +

{deal.name}

+

{accountName ?? 'No account'}

+
+ {deal.acvCents ? ( + {money(deal.acvCents)} + ) : null} + {deal.productLine.replace(/_/g, ' ')} + {/* Contract state is surfaced on the card because shipping capacity + without executed paper is the mistake this pipeline prevents. */} + {deal.msaExecuted ? MSA : null} + {deal.dpaExecuted ? DPA : null} +
+ + )} + /> + ); +} + +export function SupplyPipeline() { + return ( + + title="Supply" + subtitle="Sourcing GPU capacity. Technical and financial diligence are separate gates — accepting capacity is a two-key decision." + endpoint="/api/deals/supply" + renderCard={(deal, accountName) => ( + <> +

{deal.name}

+

{accountName ?? 'No account'}

+
+ {deal.gpuCount && deal.gpuType ? ( + + {deal.gpuCount}× {deal.gpuType} + + ) : null} + {deal.targetCostPerGpuHourCents ? ( + + {money(deal.targetCostPerGpuHourCents)}/hr target + + ) : null} +
+ + )} + /> + ); +} + +function PipelineBoard({ + title, + subtitle, + endpoint, + renderCard, +}: { + title: string; + subtitle: string; + endpoint: string; + renderCard: (deal: T, accountName: string | null) => React.ReactNode; +}) { + const { data, isLoading } = useQuery({ + queryKey: [endpoint], + queryFn: () => get>(endpoint), + }); + + const [activeStage, setActiveStage] = useState(null); + + const byStage = useMemo(() => { + const map = new Map(); + for (const stage of data?.stages ?? []) map.set(stage, []); + for (const row of data?.deals ?? []) { + map.get(row.deal.stage)?.push(row); + } + return map; + }, [data]); + + if (isLoading) return ; + + if (!data || data.deals.length === 0) { + return ( +
+
+ + + +
+ ); + } + + const stages = data.stages; + const currentStage = activeStage ?? stages[0]!; + + return ( +
+
+ + {/* Phone: pick one stage. The chips scroll; the board does not. */} +
+
+ {stages.map((stage) => { + const count = byStage.get(stage)?.length ?? 0; + return ( + + ); + })} +
+
+ {(byStage.get(currentStage) ?? []).map((row) => ( + + ))} + {(byStage.get(currentStage) ?? []).length === 0 ? ( +

+ Nothing in {STAGE_LABELS[currentStage] ?? currentStage}. +

+ ) : null} +
+
+ + {/* Desktop: the full board, scrolling horizontally within its own pane + so the page itself never scrolls sideways. */} +
+
+ {stages.map((stage) => { + const rows = byStage.get(stage) ?? []; + return ( +
+
+

{STAGE_LABELS[stage] ?? stage}

+ {rows.length} +
+
+ {rows.map((row) => ( + + ))} +
+
+ ); + })} +
+
+
+ ); +} + +function DealCard({ + row, + renderCard, +}: { + row: { deal: T; accountName: string | null }; + renderCard: (deal: T, accountName: string | null) => React.ReactNode; +}) { + return ( +
+ {renderCard(row.deal, row.accountName)} +

{relativeTime(row.deal.updatedAt)}

+
+ ); +} + +function Header({ title, subtitle }: { title: string; subtitle: string }) { + return ( +
+

{title}

+

{subtitle}

+
+ ); +} diff --git a/apps/web/src/pages/Settings.tsx b/apps/web/src/pages/Settings.tsx new file mode 100644 index 0000000..a8397df --- /dev/null +++ b/apps/web/src/pages/Settings.tsx @@ -0,0 +1,238 @@ +/** + * Settings — appearance, profile, and connecting an agent. + * + * The appearance section is where the user picks the accent that re-tints the + * whole product. It is saved server-side, so the choice follows them between + * devices rather than being a per-browser quirk. + */ +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { Check, Monitor, Moon, Sun, Terminal } from 'lucide-react'; +import { get, patch } from '@/lib/api'; +import { useTheme } from '@/lib/theme'; +import { getAccent, THEME_MODES, type ThemeMode } from '@pig/core'; +import { Badge, Button, Card, CardContent, CardHeader, CardTitle, Input } from '@/components/ui'; +import { useState } from 'react'; + +interface Me { + id: string; + name: string; + email: string; + isPlatformAdmin: boolean; + teams: { team: string; role: string }[]; + via: string; +} + +export function Settings() { + const { data: me } = useQuery({ queryKey: ['me'], queryFn: () => get('/api/me') }); + + return ( +
+
+

Settings

+
+ + + + +
+ ); +} + +function Appearance() { + const { mode, accent, setMode, setAccent, accents } = useTheme(); + + return ( + + + Appearance +

+ Saved to your account, so it follows you between your laptop and your phone. +

+
+ +
+

Theme

+
+ {THEME_MODES.map((value) => { + const Icon = value === 'light' ? Sun : value === 'dark' ? Moon : Monitor; + return ( + + ); + })} +
+
+ +
+

Accent

+
+ {accents.map((option) => { + const selected = option.key === accent; + const definition = getAccent(option.key); + return ( + + ); + })} +
+

+ Status colours — positive, warning, danger — stay fixed regardless of your accent, + so a warning always looks like a warning. +

+
+
+
+ ); +} + +function Profile({ me }: { me: Me | undefined }) { + const queryClient = useQueryClient(); + const [name, setName] = useState(''); + const [title, setTitle] = useState(''); + + const save = useMutation({ + mutationFn: () => + patch('/api/me/preferences', { + ...(name ? { name } : {}), + ...(title ? { title } : {}), + }), + onSuccess: () => { + void queryClient.invalidateQueries({ queryKey: ['me'] }); + setName(''); + setTitle(''); + }, + }); + + if (!me) return null; + + return ( + + + Profile + + +
+
+
Name
+
{me.name}
+
+
+
Email
+
{me.email}
+
+
+
Teams
+
+ {me.teams.length === 0 ? ( + No team membership + ) : ( + me.teams.map((t) => ( + + {t.team} · {t.role} + + )) + )} + {me.isPlatformAdmin ? Platform admin : null} +
+
+
+ +
{ + event.preventDefault(); + save.mutate(); + }} + > + + +
+ +
+
+
+
+ ); +} + +function ConnectAgent() { + const origin = typeof window !== 'undefined' ? window.location.origin : 'https://your-pig-host'; + + return ( + + +
+ + Connect your agent +
+

+ PIG speaks MCP, so Claude Code, Codex, prime-agent and Buzz agents can all work with + your pipeline directly from the terminal. +

+
+ +
+
+            {`export PIG_URL=${origin}
+export PIG_API_KEY=pig_...      # create one below
+
+claude mcp add pig -- npx -y @pig/mcp`}
+          
+
+

+ The agent authenticates as its own principal, separately revocable from your own + session, and can never reach further than you can. +

+
+
+ ); +} diff --git a/apps/web/src/pages/SignIn.tsx b/apps/web/src/pages/SignIn.tsx new file mode 100644 index 0000000..89f5b8d --- /dev/null +++ b/apps/web/src/pages/SignIn.tsx @@ -0,0 +1,102 @@ +/** + * Sign-in. + * + * Magic link only. PIG stores no passwords, and adding a password field would + * mean either storing one or pretending to — both worse than an email link for + * an internal tool used by a couple of dozen people. + */ +import { useState } from 'react'; +import { getSupabase, type PublicConfig } from '@/lib/api'; +import { Button, Card, CardContent, Input } from '@/components/ui'; +import { PiggyMark } from '@/components/PiggyMark'; + +export function SignIn({ config }: { config: PublicConfig }) { + const [email, setEmail] = useState(''); + const [status, setStatus] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle'); + const [message, setMessage] = useState(''); + + async function submit(event: React.FormEvent) { + event.preventDefault(); + const supabase = getSupabase(); + if (!supabase) { + setStatus('error'); + setMessage('Authentication is not configured on this deployment.'); + return; + } + + setStatus('sending'); + const { error } = await supabase.auth.signInWithOtp({ + email, + options: { emailRedirectTo: window.location.origin }, + }); + + if (error) { + setStatus('error'); + // Supabase returns a clear message for rate limits and disabled signup, + // both of which the person can act on, so it is shown rather than hidden. + setMessage(error.message); + return; + } + setStatus('sent'); + } + + return ( +
+
+
+ +
+

pig

+

Prime Intellect Growth

+
+
+ + + + {status === 'sent' ? ( +
+

Check your email

+

+ A sign-in link is on its way to {email}. It expires shortly, so use it soon. +

+
+ ) : ( +
+ + + {status === 'error' ? ( +

{message}

+ ) : null} + {config.inviteRequired ? ( +

+ PIG is invite-only. An account alone does not grant access. +

+ ) : null} +
+ )} +
+
+
+
+ ); +} diff --git a/apps/web/tailwind.config.js b/apps/web/tailwind.config.js new file mode 100644 index 0000000..0701821 --- /dev/null +++ b/apps/web/tailwind.config.js @@ -0,0 +1,33 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: ['class', '[data-theme="dark"]'], + content: ['./index.html', './src/**/*.{ts,tsx}'], + theme: { + extend: { + colors: { + // Every colour resolves through a CSS variable so the user's chosen + // accent re-tints the whole interface without a rebuild. + bg: 'hsl(var(--bg))', + surface: 'hsl(var(--surface))', + 'surface-2': 'hsl(var(--surface-2))', + border: 'hsl(var(--border))', + fg: 'hsl(var(--fg))', + muted: 'hsl(var(--muted))', + accent: 'hsl(var(--accent))', + 'accent-fg': 'hsl(var(--accent-fg))', + 'accent-on': 'hsl(var(--accent-on))', + 'accent-subtle': 'hsl(var(--accent-subtle))', + positive: 'hsl(var(--positive))', + warning: 'hsl(var(--warning))', + danger: 'hsl(var(--danger))', + info: 'hsl(var(--info))', + }, + fontFamily: { + sans: ['ui-sans-serif', 'system-ui', '-apple-system', 'Segoe UI', 'Inter', 'sans-serif'], + mono: ['ui-monospace', 'SFMono-Regular', 'Menlo', 'monospace'], + }, + borderRadius: { lg: '0.75rem', xl: '1rem' }, + }, + }, + plugins: [], +}; diff --git a/apps/web/tsconfig.json b/apps/web/tsconfig.json new file mode 100644 index 0000000..1c1211b --- /dev/null +++ b/apps/web/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "noEmit": true, + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "jsx": "react-jsx", + "types": ["vite/client"], + "baseUrl": ".", + "paths": { "@/*": ["./src/*"] } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "vite.config.ts"] +} diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts new file mode 100644 index 0000000..903e1bf --- /dev/null +++ b/apps/web/vite.config.ts @@ -0,0 +1,37 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import { fileURLToPath, URL } from 'node:url'; + +export default defineConfig({ + plugins: [react()], + resolve: { + alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) }, + }, + server: { + port: 5173, + // Proxy in development so the browser sees one origin, matching how + // production serves the API and the app together. Auth sessions are + // per-origin, so a split origin in dev but not prod hides real bugs. + proxy: { '/api': { target: 'http://localhost:8920', changeOrigin: true } }, + }, + build: { + outDir: 'dist', + sourcemap: true, + rollupOptions: { + output: { + /* + * Split the vendor code that changes rarely from the app code that + * changes constantly, so a deploy invalidates only the small chunk. + * This matters on mobile: the auth client alone is a large download, + * and re-fetching it on every deploy over a cellular connection is + * exactly the cost worth avoiding. + */ + manualChunks: { + react: ['react', 'react-dom', 'react-router-dom'], + supabase: ['@supabase/supabase-js'], + query: ['@tanstack/react-query'], + }, + }, + }, + }, +}); diff --git a/package-lock.json b/package-lock.json index 71cf5e4..40ad8b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,6 +49,347 @@ "pig-mcp": "src/stdio.ts" } }, + "apps/web": { + "name": "@pig/web", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@pig/core": "*", + "@supabase/supabase-js": "^2.47.10", + "@tanstack/react-query": "^5.62.11", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "lucide-react": "^0.469.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^7.1.1", + "tailwind-merge": "^2.6.0" + }, + "devDependencies": { + "@types/react": "^19.0.2", + "@types/react-dom": "^19.0.2", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "vite": "^6.0.7" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@drizzle-team/brocli": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@drizzle-team/brocli/-/brocli-0.10.2.tgz", @@ -946,6 +1287,56 @@ "hono": "^4" } }, + "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.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "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/@modelcontextprotocol/sdk": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz", @@ -995,6 +1386,64 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@petamoriken/float16": { "version": "3.9.3", "resolved": "https://registry.npmjs.org/@petamoriken/float16/-/float16-3.9.3.tgz", @@ -1022,6 +1471,576 @@ "resolved": "packages/prime", "link": true }, + "node_modules/@pig/web": { + "resolved": "apps/web", + "link": true + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz", + "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz", + "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz", + "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz", + "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz", + "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz", + "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz", + "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz", + "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz", + "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz", + "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz", + "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz", + "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz", + "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz", + "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz", + "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz", + "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz", + "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz", + "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz", + "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz", + "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz", + "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz", + "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz", + "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz", + "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz", + "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@supabase/auth-js": { + "version": "2.112.3", + "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.112.3.tgz", + "integrity": "sha512-NA0rsgAlWZPvbhw8aUdmgfpHVgUAcd8zK5ov43l++o1bLIPXZhRiAlRobhwF5AatQuovpqxsMH50F4oyyV4XZw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.112.3", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.112.3.tgz", + "integrity": "sha512-gfv481mTOVWtZIJgXupxZpni2V2UWPf6jeF/jOK7HdMHdH+mt6sU0sHHwf0POsPip8ltlulu9OUHgwVzl5ddRw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@supabase/phoenix": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@supabase/phoenix/-/phoenix-0.4.5.tgz", + "integrity": "sha512-aAn9H9ovVyeApKy11OWOrrOGq8DV68yWeH4ud2lN9fzn4aO8Zb5GLL9m1pUg9nLqIcT+ZDfAcsZe0E/nqdv2lw==", + "license": "MIT" + }, + "node_modules/@supabase/postgrest-js": { + "version": "2.112.3", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-2.112.3.tgz", + "integrity": "sha512-+Mf6uCpzr00bqxwX8hTK2X2L9eAL/1vuOjdEjx6upz9ulb0RmQT16XeU/JkMUlVHw/B46ZnPa2busY4Kd9YCzw==", + "license": "MIT", + "dependencies": { + "tslib": "2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.112.3", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.112.3.tgz", + "integrity": "sha512-E6wljXWs7DUOloyIB69i3YFInWE6IyCvgTAbQ0KYxOHv26FdA1KzEXTuzxrYEdf70t406Z9BRwUlGyclGF2FXA==", + "license": "MIT", + "dependencies": { + "@supabase/phoenix": "0.4.5", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.112.3", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.112.3.tgz", + "integrity": "sha512-oSK61tzlUvg+BWPqpKQCu9qqonsO26btaoAR9D6Gest2aj7xUqToj9rKyaoYOJczkhg9BjqA1REbYy9tPI4bDA==", + "license": "MIT", + "dependencies": { + "iceberg-js": "^0.8.1", + "tslib": "2.8.1" + }, + "engines": { + "node": ">=22.0.0" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.112.3", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.112.3.tgz", + "integrity": "sha512-Jv1bxVQmEJNkjvPEhFaKjPzsh+Ozyew6lWGD+SoYcsclDEP1z7yEvKvfUQfzy0DkxRIQnZNxmmWtAzw5XLTQoA==", + "license": "MIT", + "dependencies": { + "@supabase/auth-js": "2.112.3", + "@supabase/functions-js": "2.112.3", + "@supabase/postgrest-js": "2.112.3", + "@supabase/realtime-js": "2.112.3", + "@supabase/storage-js": "2.112.3" + }, + "engines": { + "node": ">=22.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.101.4", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.4.tgz", + "integrity": "sha512-gNwcvOJcRbLWPOLG/2OBm+zM+Yv+MKsXKEOWC57USuZDEsI71hEErQsiEGx5wX9rzWWkfwM0fVSPoiIFSsxfiw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.101.4", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.4.tgz", + "integrity": "sha512-yRg2pfOCxIs4ZJW3XYYHU/WgtD04FHSnfHlpRT7h7pR77hwkdRG4wxbKe4aq6P0RvXUTBSQpQeadS1SUYUe+KA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.101.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "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": "22.20.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", @@ -1032,6 +2051,47 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/react": { + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -1078,6 +2138,97 @@ } } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.13", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.13.tgz", + "integrity": "sha512-k9HNuUVMlqVjQ9UHzfPjIqiDbWw7WqT1AoT7GL8VwvF3r0ZfArtgiSPAlmupyNquNgOJHTuH4CKYf8ttMTWBTQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/body-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", @@ -1115,6 +2266,53 @@ "url": "https://opencollective.com/express" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -1160,6 +2358,106 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001809", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz", + "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "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/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/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -1182,6 +2480,13 @@ "node": ">= 0.6" } }, + "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": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -1252,6 +2557,26 @@ "node": ">= 8" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "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/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1278,6 +2603,20 @@ "node": ">= 0.8" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, "node_modules/drizzle-kit": { "version": "0.30.6", "resolved": "https://registry.npmjs.org/drizzle-kit/-/drizzle-kit-0.30.6.tgz", @@ -1870,6 +3209,13 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.405", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.405.tgz", + "integrity": "sha512-bNglH7lPH5l+yHOes7Zr4VqxhOy4BQ9ZBUX4VdoFgxMpzJk7W1ZoO3Vgd9Pxa9PyjQ76sfm2aKH/nzEcCNRlew==", + "dev": true, + "license": "ISC" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1977,6 +3323,16 @@ "esbuild": ">=0.12 <1" } }, + "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/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2081,6 +3437,36 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-uri": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", @@ -2097,6 +3483,29 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -2127,6 +3536,20 @@ "node": ">= 0.6" } }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", @@ -2181,6 +3604,16 @@ "node": ">= 18.0.0" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -2231,6 +3664,19 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -2296,6 +3742,15 @@ "url": "https://opencollective.com/express" } }, + "node_modules/iceberg-js": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/iceberg-js/-/iceberg-js-0.8.1.tgz", + "integrity": "sha512-1dhVQZXhcHje7798IVM+xoo/1ZdVfzOMIc8/rgVSijRK38EDqOJoGula9N/8ZI5RD8QTxNQtK/Gozpr+qUqRRA==", + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } + }, "node_modules/iconv-lite": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", @@ -2336,6 +3791,68 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -2352,6 +3869,16 @@ "node": ">=18" } }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jose": { "version": "5.10.0", "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", @@ -2361,6 +3888,26 @@ "url": "https://github.com/sponsors/panva" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -2373,6 +3920,58 @@ "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", "license": "BSD-2-Clause" }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.469.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.469.0.tgz", + "integrity": "sha512-28vvUnnKQ/dBwiCQtwJw7QauYnE7yd2Cyp4tTTJpvglX4EMpbflcdBgrgToX2j71B3YvugK/NH3BGUk+E/p/Fw==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -2407,6 +4006,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -2438,6 +4061,37 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "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/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -2447,6 +4101,26 @@ "node": ">= 0.6" } }, + "node_modules/node-releases": { + "version": "2.0.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz", + "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2456,6 +4130,16 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -2507,6 +4191,13 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, "node_modules/path-to-regexp": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", @@ -2517,6 +4208,46 @@ "url": "https://opencollective.com/express" } }, + "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": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkce-challenge": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", @@ -2526,6 +4257,169 @@ "node": ">=16.20.0" } }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "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.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, "node_modules/postgres": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.9.tgz", @@ -2568,6 +4462,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/range-parser": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", @@ -2596,6 +4511,111 @@ "node": ">= 0.10" } }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz", + "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==", + "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-dom": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz", + "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==", + "license": "MIT", + "dependencies": { + "react-router": "7.18.2" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "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/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.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", @@ -2605,6 +4625,28 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -2615,6 +4657,63 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.62.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz", + "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.62.4", + "@rollup/rollup-android-arm64": "4.62.4", + "@rollup/rollup-darwin-arm64": "4.62.4", + "@rollup/rollup-darwin-x64": "4.62.4", + "@rollup/rollup-freebsd-arm64": "4.62.4", + "@rollup/rollup-freebsd-x64": "4.62.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.4", + "@rollup/rollup-linux-arm-musleabihf": "4.62.4", + "@rollup/rollup-linux-arm64-gnu": "4.62.4", + "@rollup/rollup-linux-arm64-musl": "4.62.4", + "@rollup/rollup-linux-loong64-gnu": "4.62.4", + "@rollup/rollup-linux-loong64-musl": "4.62.4", + "@rollup/rollup-linux-ppc64-gnu": "4.62.4", + "@rollup/rollup-linux-ppc64-musl": "4.62.4", + "@rollup/rollup-linux-riscv64-gnu": "4.62.4", + "@rollup/rollup-linux-riscv64-musl": "4.62.4", + "@rollup/rollup-linux-s390x-gnu": "4.62.4", + "@rollup/rollup-linux-x64-gnu": "4.62.4", + "@rollup/rollup-linux-x64-musl": "4.62.4", + "@rollup/rollup-openbsd-x64": "4.62.4", + "@rollup/rollup-openharmony-arm64": "4.62.4", + "@rollup/rollup-win32-arm64-msvc": "4.62.4", + "@rollup/rollup-win32-ia32-msvc": "4.62.4", + "@rollup/rollup-win32-x64-gnu": "4.62.4", + "@rollup/rollup-win32-x64-msvc": "4.62.4", + "fsevents": "~2.3.2" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -2631,12 +4730,42 @@ "node": ">= 18" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, "node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -2695,6 +4824,12 @@ "url": "https://opencollective.com/express" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -2817,6 +4952,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -2837,6 +4982,174 @@ "node": ">= 0.8" } }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwind-merge": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.1.tgz", + "integrity": "sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "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/tinyglobby/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/tinyglobby/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2846,6 +5159,19 @@ "node": ">=0.6" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "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==", + "license": "0BSD" + }, "node_modules/tsx": { "version": "4.23.12", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.12.tgz", @@ -2926,6 +5252,44 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz", + "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2935,6 +5299,596 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "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/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/vite/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/vite/node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/which": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", @@ -2957,6 +5911,13 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/packages/db/migrations/0001_user_appearance.sql b/packages/db/migrations/0001_user_appearance.sql new file mode 100644 index 0000000..151115f --- /dev/null +++ b/packages/db/migrations/0001_user_appearance.sql @@ -0,0 +1,2 @@ +ALTER TABLE "users" ADD COLUMN "theme_mode" text DEFAULT 'system' NOT NULL;--> statement-breakpoint +ALTER TABLE "users" ADD COLUMN "accent_color" text DEFAULT 'pig' NOT NULL; \ No newline at end of file diff --git a/packages/db/migrations/meta/0001_snapshot.json b/packages/db/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000..0b48f58 --- /dev/null +++ b/packages/db/migrations/meta/0001_snapshot.json @@ -0,0 +1,6244 @@ +{ + "id": "545f974e-4c4b-47fd-bea4-2f0af1107fea", + "prevId": "037c2019-247c-4c7b-b595-08af7cedfe37", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.api_keys": { + "name": "api_keys", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key_hash": { + "name": "key_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key_prefix": { + "name": "key_prefix", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "scopes": { + "name": "scopes", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[\"read\"]'::jsonb" + }, + "last_used_at": { + "name": "last_used_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "revoked_at": { + "name": "revoked_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "api_keys_key_hash_key": { + "name": "api_keys_key_hash_key", + "columns": [ + { + "expression": "key_hash", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "api_keys_user_idx": { + "name": "api_keys_user_idx", + "columns": [ + { + "expression": "user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "api_keys_user_id_users_id_fk": { + "name": "api_keys_user_id_users_id_fk", + "tableFrom": "api_keys", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.invites": { + "name": "invites", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "code_hash": { + "name": "code_hash", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "team": { + "name": "team", + "type": "pig_team", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "role": { + "name": "role", + "type": "pig_team_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'member'" + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "uses_remaining": { + "name": "uses_remaining", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'1'::jsonb" + }, + "redeemed_by_user_id": { + "name": "redeemed_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "redeemed_at": { + "name": "redeemed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "revoked_at": { + "name": "revoked_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "invites_code_hash_key": { + "name": "invites_code_hash_key", + "columns": [ + { + "expression": "code_hash", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "invites_email_idx": { + "name": "invites_email_idx", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "invites_created_by_user_id_users_id_fk": { + "name": "invites_created_by_user_id_users_id_fk", + "tableFrom": "invites", + "tableTo": "users", + "columnsFrom": [ + "created_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "invites_redeemed_by_user_id_users_id_fk": { + "name": "invites_redeemed_by_user_id_users_id_fk", + "tableFrom": "invites", + "tableTo": "users", + "columnsFrom": [ + "redeemed_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.team_memberships": { + "name": "team_memberships", + "schema": "", + "columns": { + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "team": { + "name": "team", + "type": "pig_team", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "pig_team_role", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'member'" + }, + "is_primary": { + "name": "is_primary", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "team_memberships_team_idx": { + "name": "team_memberships_team_idx", + "columns": [ + { + "expression": "team", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "team_memberships_user_id_users_id_fk": { + "name": "team_memberships_user_id_users_id_fk", + "tableFrom": "team_memberships", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "team_memberships_user_id_team_pk": { + "name": "team_memberships_user_id_team_pk", + "columns": [ + "user_id", + "team" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "auth_subject": { + "name": "auth_subject", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "handle": { + "name": "handle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "timezone": { + "name": "timezone", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_platform_admin": { + "name": "is_platform_admin", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "theme_mode": { + "name": "theme_mode", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'system'" + }, + "accent_color": { + "name": "accent_color", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pig'" + }, + "deactivated_at": { + "name": "deactivated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_seen_at": { + "name": "last_seen_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "users_auth_subject_key": { + "name": "users_auth_subject_key", + "columns": [ + { + "expression": "auth_subject", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_email_key": { + "name": "users_email_key", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "users_handle_key": { + "name": "users_handle_key", + "columns": [ + { + "expression": "handle", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.account_stats": { + "name": "account_stats", + "schema": "", + "columns": { + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "open_deals": { + "name": "open_deals", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "contact_count": { + "name": "contact_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "refreshed_at": { + "name": "refreshed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "account_stats_account_id_accounts_id_fk": { + "name": "account_stats_account_id_accounts_id_fk", + "tableFrom": "account_stats", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.accounts": { + "name": "accounts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "domain": { + "name": "domain", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "website": { + "name": "website", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "logo_url": { + "name": "logo_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "side": { + "name": "side", + "type": "pig_account_side", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'demand'" + }, + "supplier_type": { + "name": "supplier_type", + "type": "pig_supplier_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "customer_segment": { + "name": "customer_segment", + "type": "pig_customer_segment", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "country": { + "name": "country", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "jurisdiction": { + "name": "jurisdiction", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ultimate_parent_account_id": { + "name": "ultimate_parent_account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "ultimate_parent_name": { + "name": "ultimate_parent_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ultimate_parent_country": { + "name": "ultimate_parent_country", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ownership_verified_at": { + "name": "ownership_verified_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "linkedin_url": { + "name": "linkedin_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "twitter_url": { + "name": "twitter_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "github_org": { + "name": "github_org", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "source": { + "name": "source", + "type": "pig_record_source", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'manual'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confidence": { + "name": "confidence", + "type": "pig_confidence_grade", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'confirmed'" + }, + "last_activity_at": { + "name": "last_activity_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "accounts_domain_key": { + "name": "accounts_domain_key", + "columns": [ + { + "expression": "domain", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "accounts_side_idx": { + "name": "accounts_side_idx", + "columns": [ + { + "expression": "side", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "accounts_owner_idx": { + "name": "accounts_owner_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "accounts_name_idx": { + "name": "accounts_name_idx", + "columns": [ + { + "expression": "name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "accounts_owner_user_id_users_id_fk": { + "name": "accounts_owner_user_id_users_id_fk", + "tableFrom": "accounts", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.activities": { + "name": "activities", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "type": { + "name": "type", + "type": "pig_activity_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "body": { + "name": "body", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "contact_id": { + "name": "contact_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "demand_deal_id": { + "name": "demand_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "supply_deal_id": { + "name": "supply_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "actor_user_id": { + "name": "actor_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "actor_agent": { + "name": "actor_agent", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "occurred_at": { + "name": "occurred_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "meta": { + "name": "meta", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "source": { + "name": "source", + "type": "pig_record_source", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'manual'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "activities_account_idx": { + "name": "activities_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "occurred_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "activities_contact_idx": { + "name": "activities_contact_idx", + "columns": [ + { + "expression": "contact_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "occurred_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "activities_demand_deal_idx": { + "name": "activities_demand_deal_idx", + "columns": [ + { + "expression": "demand_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "occurred_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "activities_supply_deal_idx": { + "name": "activities_supply_deal_idx", + "columns": [ + { + "expression": "supply_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "occurred_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "activities_external_id_key": { + "name": "activities_external_id_key", + "columns": [ + { + "expression": "external_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "activities_account_id_accounts_id_fk": { + "name": "activities_account_id_accounts_id_fk", + "tableFrom": "activities", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "activities_contact_id_contacts_id_fk": { + "name": "activities_contact_id_contacts_id_fk", + "tableFrom": "activities", + "tableTo": "contacts", + "columnsFrom": [ + "contact_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "activities_actor_user_id_users_id_fk": { + "name": "activities_actor_user_id_users_id_fk", + "tableFrom": "activities", + "tableTo": "users", + "columnsFrom": [ + "actor_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.channel_links": { + "name": "channel_links", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "platform": { + "name": "platform", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel_id": { + "name": "channel_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "channel_name": { + "name": "channel_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "notify_on": { + "name": "notify_on", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "channel_links_platform_channel_key": { + "name": "channel_links_platform_channel_key", + "columns": [ + { + "expression": "platform", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "channel_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "channel_links_account_idx": { + "name": "channel_links_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "channel_links_account_id_accounts_id_fk": { + "name": "channel_links_account_id_accounts_id_fk", + "tableFrom": "channel_links", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.contacts": { + "name": "contacts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "full_name": { + "name": "full_name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "first_name": { + "name": "first_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "phone": { + "name": "phone", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "linkedin_url": { + "name": "linkedin_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "twitter_handle": { + "name": "twitter_handle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "github_handle": { + "name": "github_handle", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "website_url": { + "name": "website_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "affiliation": { + "name": "affiliation", + "type": "pig_affiliation_kind", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'unknown'" + }, + "departed_at": { + "name": "departed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "is_decision_maker": { + "name": "is_decision_maker", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "source": { + "name": "source", + "type": "pig_record_source", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'manual'" + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "confidence": { + "name": "confidence", + "type": "pig_confidence_grade", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'confirmed'" + }, + "confidence_note": { + "name": "confidence_note", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "last_activity_at": { + "name": "last_activity_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "contacts_account_idx": { + "name": "contacts_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contacts_email_idx": { + "name": "contacts_email_idx", + "columns": [ + { + "expression": "email", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contacts_name_idx": { + "name": "contacts_name_idx", + "columns": [ + { + "expression": "full_name", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contacts_confidence_idx": { + "name": "contacts_confidence_idx", + "columns": [ + { + "expression": "confidence", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contacts_account_id_accounts_id_fk": { + "name": "contacts_account_id_accounts_id_fk", + "tableFrom": "contacts", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contacts_owner_user_id_users_id_fk": { + "name": "contacts_owner_user_id_users_id_fk", + "tableFrom": "contacts", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.capacity_commitments": { + "name": "capacity_commitments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "site_id": { + "name": "site_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "supply_deal_id": { + "name": "supply_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "gpu_type": { + "name": "gpu_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "socket": { + "name": "socket", + "type": "pig_gpu_socket", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "gpu_count": { + "name": "gpu_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "interconnect_type": { + "name": "interconnect_type", + "type": "pig_interconnect_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'Unknown'" + }, + "security_tier": { + "name": "security_tier", + "type": "pig_security_tier", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'secure_cloud'" + }, + "starts_at": { + "name": "starts_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ends_at": { + "name": "ends_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "total_gpu_hours": { + "name": "total_gpu_hours", + "type": "numeric(16, 2)", + "primaryKey": false, + "notNull": true + }, + "cost_per_gpu_hour_cents": { + "name": "cost_per_gpu_hour_cents", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "currency": { + "name": "currency", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'USD'" + }, + "shape": { + "name": "shape", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "colocate_with": { + "name": "colocate_with", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "is_contiguous": { + "name": "is_contiguous", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "minimum_spend_cents": { + "name": "minimum_spend_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_auto_renew": { + "name": "is_auto_renew", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notice_days": { + "name": "notice_days", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "take_or_pay_floor_pct": { + "name": "take_or_pay_floor_pct", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": false + }, + "prepaid_pct": { + "name": "prepaid_pct", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": false + }, + "prepaid_amount_cents": { + "name": "prepaid_amount_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "useful_life_years": { + "name": "useful_life_years", + "type": "numeric(4, 2)", + "primaryKey": false, + "notNull": false + }, + "salvage_value_pct": { + "name": "salvage_value_pct", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": false + }, + "depreciation_start_at": { + "name": "depreciation_start_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "cost_of_capital_bps": { + "name": "cost_of_capital_bps", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "financing_instrument": { + "name": "financing_instrument", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "oversubscription_pct": { + "name": "oversubscription_pct", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": true, + "default": "'0'" + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "terminated_at": { + "name": "terminated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "capacity_commitments_account_idx": { + "name": "capacity_commitments_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "capacity_commitments_gpu_type_idx": { + "name": "capacity_commitments_gpu_type_idx", + "columns": [ + { + "expression": "gpu_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "capacity_commitments_window_idx": { + "name": "capacity_commitments_window_idx", + "columns": [ + { + "expression": "starts_at", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "ends_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "capacity_commitments_account_id_accounts_id_fk": { + "name": "capacity_commitments_account_id_accounts_id_fk", + "tableFrom": "capacity_commitments", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + }, + "capacity_commitments_site_id_sites_id_fk": { + "name": "capacity_commitments_site_id_sites_id_fk", + "tableFrom": "capacity_commitments", + "tableTo": "sites", + "columnsFrom": [ + "site_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "capacity_commitments_supply_deal_id_supply_deals_id_fk": { + "name": "capacity_commitments_supply_deal_id_supply_deals_id_fk", + "tableFrom": "capacity_commitments", + "tableTo": "supply_deals", + "columnsFrom": [ + "supply_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.inventory_listings": { + "name": "inventory_listings", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "site_id": { + "name": "site_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "external_cloud_id": { + "name": "external_cloud_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "provider_slug": { + "name": "provider_slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gpu_type": { + "name": "gpu_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "socket": { + "name": "socket", + "type": "pig_gpu_socket", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "gpu_count": { + "name": "gpu_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "gpu_memory_gb": { + "name": "gpu_memory_gb", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "vcpu": { + "name": "vcpu", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "memory_gb": { + "name": "memory_gb", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "disk_gb": { + "name": "disk_gb", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "internet_mbps": { + "name": "internet_mbps", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "interconnect_gbps": { + "name": "interconnect_gbps", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "interconnect_type": { + "name": "interconnect_type", + "type": "pig_interconnect_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'Unknown'" + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "country": { + "name": "country", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "security_tier": { + "name": "security_tier", + "type": "pig_security_tier", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'secure_cloud'" + }, + "stock_status": { + "name": "stock_status", + "type": "pig_stock_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'Available'" + }, + "is_spot": { + "name": "is_spot", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "provisioning_minutes": { + "name": "provisioning_minutes", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "prepaid_hours": { + "name": "prepaid_hours", + "type": "numeric(12, 2)", + "primaryKey": false, + "notNull": false + }, + "on_demand_price_cents": { + "name": "on_demand_price_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "community_price_cents": { + "name": "community_price_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "price_is_variable": { + "name": "price_is_variable", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "currency": { + "name": "currency", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'USD'" + }, + "images": { + "name": "images", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "raw": { + "name": "raw", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "source": { + "name": "source", + "type": "pig_record_source", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'manual'" + }, + "observed_at": { + "name": "observed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "inventory_listings_external_key": { + "name": "inventory_listings_external_key", + "columns": [ + { + "expression": "external_cloud_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "gpu_type", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "socket", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "gpu_count", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "security_tier", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inventory_listings_gpu_type_idx": { + "name": "inventory_listings_gpu_type_idx", + "columns": [ + { + "expression": "gpu_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inventory_listings_stock_idx": { + "name": "inventory_listings_stock_idx", + "columns": [ + { + "expression": "stock_status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inventory_listings_interconnect_idx": { + "name": "inventory_listings_interconnect_idx", + "columns": [ + { + "expression": "interconnect_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inventory_listings_account_idx": { + "name": "inventory_listings_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "inventory_listings_observed_idx": { + "name": "inventory_listings_observed_idx", + "columns": [ + { + "expression": "observed_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "inventory_listings_account_id_accounts_id_fk": { + "name": "inventory_listings_account_id_accounts_id_fk", + "tableFrom": "inventory_listings", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "inventory_listings_site_id_sites_id_fk": { + "name": "inventory_listings_site_id_sites_id_fk", + "tableFrom": "inventory_listings", + "tableTo": "sites", + "columnsFrom": [ + "site_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sites": { + "name": "sites", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "external_data_center_id": { + "name": "external_data_center_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "country": { + "name": "country", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "country_code": { + "name": "country_code", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "region": { + "name": "region", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "city": { + "name": "city", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "jurisdiction": { + "name": "jurisdiction", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "power_mw": { + "name": "power_mw", + "type": "numeric(10, 3)", + "primaryKey": false, + "notNull": false + }, + "pue": { + "name": "pue", + "type": "numeric(4, 2)", + "primaryKey": false, + "notNull": false + }, + "certifications": { + "name": "certifications", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "uptime_history_pct": { + "name": "uptime_history_pct", + "type": "numeric(6, 3)", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "sites_account_idx": { + "name": "sites_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "sites_country_idx": { + "name": "sites_country_idx", + "columns": [ + { + "expression": "country_code", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sites_account_id_accounts_id_fk": { + "name": "sites_account_id_accounts_id_fk", + "tableFrom": "sites", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.supply_deals": { + "name": "supply_deals", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "site_id": { + "name": "site_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "stage": { + "name": "stage", + "type": "pig_supply_stage", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'sourced'" + }, + "stage_changed_at": { + "name": "stage_changed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "primary_contact_id": { + "name": "primary_contact_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "gpu_type": { + "name": "gpu_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gpu_count": { + "name": "gpu_count", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "interconnect_type": { + "name": "interconnect_type", + "type": "pig_interconnect_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "target_cost_per_gpu_hour_cents": { + "name": "target_cost_per_gpu_hour_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "term_months": { + "name": "term_months", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "available_from": { + "name": "available_from", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "technical_verdict": { + "name": "technical_verdict", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "technical_verdict_by": { + "name": "technical_verdict_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "technical_verdict_at": { + "name": "technical_verdict_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "technical_notes": { + "name": "technical_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "financial_verdict": { + "name": "financial_verdict", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "financial_verdict_by": { + "name": "financial_verdict_by", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "financial_verdict_at": { + "name": "financial_verdict_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "financial_notes": { + "name": "financial_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "rejection_reason": { + "name": "rejection_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "closed_at": { + "name": "closed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "last_activity_at": { + "name": "last_activity_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "supply_deals_account_idx": { + "name": "supply_deals_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "supply_deals_stage_idx": { + "name": "supply_deals_stage_idx", + "columns": [ + { + "expression": "stage", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "supply_deals_owner_idx": { + "name": "supply_deals_owner_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "supply_deals_account_id_accounts_id_fk": { + "name": "supply_deals_account_id_accounts_id_fk", + "tableFrom": "supply_deals", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "supply_deals_site_id_sites_id_fk": { + "name": "supply_deals_site_id_sites_id_fk", + "tableFrom": "supply_deals", + "tableTo": "sites", + "columnsFrom": [ + "site_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "supply_deals_owner_user_id_users_id_fk": { + "name": "supply_deals_owner_user_id_users_id_fk", + "tableFrom": "supply_deals", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "supply_deals_primary_contact_id_contacts_id_fk": { + "name": "supply_deals_primary_contact_id_contacts_id_fk", + "tableFrom": "supply_deals", + "tableTo": "contacts", + "columnsFrom": [ + "primary_contact_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "supply_deals_technical_verdict_by_users_id_fk": { + "name": "supply_deals_technical_verdict_by_users_id_fk", + "tableFrom": "supply_deals", + "tableTo": "users", + "columnsFrom": [ + "technical_verdict_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "supply_deals_financial_verdict_by_users_id_fk": { + "name": "supply_deals_financial_verdict_by_users_id_fk", + "tableFrom": "supply_deals", + "tableTo": "users", + "columnsFrom": [ + "financial_verdict_by" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.capacity_requests": { + "name": "capacity_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "demand_deal_id": { + "name": "demand_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "gpu_type": { + "name": "gpu_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gpu_type_alternatives": { + "name": "gpu_type_alternatives", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "gpu_count": { + "name": "gpu_count", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "requires_high_speed_interconnect": { + "name": "requires_high_speed_interconnect", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "min_interconnect_type": { + "name": "min_interconnect_type", + "type": "pig_interconnect_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "min_security_tier": { + "name": "min_security_tier", + "type": "pig_security_tier", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'secure_cloud'" + }, + "allowed_regions": { + "name": "allowed_regions", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "excluded_jurisdictions": { + "name": "excluded_jurisdictions", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "starts_at": { + "name": "starts_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "ends_at": { + "name": "ends_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "total_gpu_hours": { + "name": "total_gpu_hours", + "type": "numeric(16, 2)", + "primaryKey": false, + "notNull": false + }, + "max_price_per_gpu_hour_cents": { + "name": "max_price_per_gpu_hour_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "required_certifications": { + "name": "required_certifications", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "capacity_requests_deal_idx": { + "name": "capacity_requests_deal_idx", + "columns": [ + { + "expression": "demand_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "capacity_requests_gpu_type_idx": { + "name": "capacity_requests_gpu_type_idx", + "columns": [ + { + "expression": "gpu_type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "capacity_requests_window_idx": { + "name": "capacity_requests_window_idx", + "columns": [ + { + "expression": "starts_at", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "ends_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "capacity_requests_demand_deal_id_demand_deals_id_fk": { + "name": "capacity_requests_demand_deal_id_demand_deals_id_fk", + "tableFrom": "capacity_requests", + "tableTo": "demand_deals", + "columnsFrom": [ + "demand_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.deal_contacts": { + "name": "deal_contacts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "demand_deal_id": { + "name": "demand_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "contact_id": { + "name": "contact_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "deal_contacts_deal_idx": { + "name": "deal_contacts_deal_idx", + "columns": [ + { + "expression": "demand_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "deal_contacts_contact_idx": { + "name": "deal_contacts_contact_idx", + "columns": [ + { + "expression": "contact_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "deal_contacts_demand_deal_id_demand_deals_id_fk": { + "name": "deal_contacts_demand_deal_id_demand_deals_id_fk", + "tableFrom": "deal_contacts", + "tableTo": "demand_deals", + "columnsFrom": [ + "demand_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "deal_contacts_contact_id_contacts_id_fk": { + "name": "deal_contacts_contact_id_contacts_id_fk", + "tableFrom": "deal_contacts", + "tableTo": "contacts", + "columnsFrom": [ + "contact_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.demand_deals": { + "name": "demand_deals", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "product_line": { + "name": "product_line", + "type": "pig_product_line", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'compute_reserved'" + }, + "stage": { + "name": "stage", + "type": "pig_demand_stage", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'qualification'" + }, + "stage_changed_at": { + "name": "stage_changed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "primary_contact_id": { + "name": "primary_contact_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "acv_cents": { + "name": "acv_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "tcv_cents": { + "name": "tcv_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "currency": { + "name": "currency", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'USD'" + }, + "term_months": { + "name": "term_months", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "probability": { + "name": "probability", + "type": "numeric(4, 3)", + "primaryKey": false, + "notNull": false + }, + "expected_close_date": { + "name": "expected_close_date", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "closed_at": { + "name": "closed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "closed_reason": { + "name": "closed_reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "msa_executed": { + "name": "msa_executed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "dpa_executed": { + "name": "dpa_executed", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "parent_deal_id": { + "name": "parent_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "last_activity_at": { + "name": "last_activity_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "demand_deals_account_idx": { + "name": "demand_deals_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "demand_deals_stage_idx": { + "name": "demand_deals_stage_idx", + "columns": [ + { + "expression": "stage", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "demand_deals_owner_idx": { + "name": "demand_deals_owner_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "demand_deals_close_date_idx": { + "name": "demand_deals_close_date_idx", + "columns": [ + { + "expression": "expected_close_date", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "demand_deals_account_id_accounts_id_fk": { + "name": "demand_deals_account_id_accounts_id_fk", + "tableFrom": "demand_deals", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "demand_deals_owner_user_id_users_id_fk": { + "name": "demand_deals_owner_user_id_users_id_fk", + "tableFrom": "demand_deals", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "demand_deals_primary_contact_id_contacts_id_fk": { + "name": "demand_deals_primary_contact_id_contacts_id_fk", + "tableFrom": "demand_deals", + "tableTo": "contacts", + "columnsFrom": [ + "primary_contact_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.allocations": { + "name": "allocations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "capacity_commitment_id": { + "name": "capacity_commitment_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "demand_deal_id": { + "name": "demand_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "internal_team": { + "name": "internal_team", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "gpu_hours": { + "name": "gpu_hours", + "type": "numeric(16, 2)", + "primaryKey": false, + "notNull": true + }, + "price_per_gpu_hour_cents": { + "name": "price_per_gpu_hour_cents", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "currency": { + "name": "currency", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'USD'" + }, + "starts_at": { + "name": "starts_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ends_at": { + "name": "ends_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'planned'" + }, + "hold_expires_at": { + "name": "hold_expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "hold_opportunity_cost_cents": { + "name": "hold_opportunity_cost_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "guarantee_type": { + "name": "guarantee_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'committed'" + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 100 + }, + "compliance_decision_id": { + "name": "compliance_decision_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_by_user_id": { + "name": "created_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "released_at": { + "name": "released_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "allocations_commitment_idx": { + "name": "allocations_commitment_idx", + "columns": [ + { + "expression": "capacity_commitment_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "allocations_deal_idx": { + "name": "allocations_deal_idx", + "columns": [ + { + "expression": "demand_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "allocations_status_idx": { + "name": "allocations_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "allocations_window_idx": { + "name": "allocations_window_idx", + "columns": [ + { + "expression": "starts_at", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "ends_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "allocations_hold_expiry_idx": { + "name": "allocations_hold_expiry_idx", + "columns": [ + { + "expression": "hold_expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "allocations_capacity_commitment_id_capacity_commitments_id_fk": { + "name": "allocations_capacity_commitment_id_capacity_commitments_id_fk", + "tableFrom": "allocations", + "tableTo": "capacity_commitments", + "columnsFrom": [ + "capacity_commitment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "restrict", + "onUpdate": "no action" + }, + "allocations_demand_deal_id_demand_deals_id_fk": { + "name": "allocations_demand_deal_id_demand_deals_id_fk", + "tableFrom": "allocations", + "tableTo": "demand_deals", + "columnsFrom": [ + "demand_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "allocations_created_by_user_id_users_id_fk": { + "name": "allocations_created_by_user_id_users_id_fk", + "tableFrom": "allocations", + "tableTo": "users", + "columnsFrom": [ + "created_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.contract_obligations": { + "name": "contract_obligations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "contract_id": { + "name": "contract_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "kind": { + "name": "kind", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'milestone'" + }, + "due_at": { + "name": "due_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "contract_obligations_contract_idx": { + "name": "contract_obligations_contract_idx", + "columns": [ + { + "expression": "contract_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contract_obligations_due_idx": { + "name": "contract_obligations_due_idx", + "columns": [ + { + "expression": "due_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contract_obligations_owner_idx": { + "name": "contract_obligations_owner_idx", + "columns": [ + { + "expression": "owner_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contract_obligations_contract_id_contracts_id_fk": { + "name": "contract_obligations_contract_id_contracts_id_fk", + "tableFrom": "contract_obligations", + "tableTo": "contracts", + "columnsFrom": [ + "contract_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contract_obligations_owner_user_id_users_id_fk": { + "name": "contract_obligations_owner_user_id_users_id_fk", + "tableFrom": "contract_obligations", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.contracts": { + "name": "contracts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "pig_contract_type", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "pig_contract_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'draft'" + }, + "side": { + "name": "side", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'demand'" + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "external_reference": { + "name": "external_reference", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "demand_deal_id": { + "name": "demand_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "supply_deal_id": { + "name": "supply_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "capacity_commitment_id": { + "name": "capacity_commitment_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "parent_contract_id": { + "name": "parent_contract_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "contracting_party_name": { + "name": "contracting_party_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "take_or_pay_floor_pct": { + "name": "take_or_pay_floor_pct", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": false + }, + "prepaid_pct": { + "name": "prepaid_pct", + "type": "numeric(6, 2)", + "primaryKey": false, + "notNull": false + }, + "termination_tier": { + "name": "termination_tier", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "assignable_on_default": { + "name": "assignable_on_default", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "assignment_deadline_business_days": { + "name": "assignment_deadline_business_days", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "effective_at": { + "name": "effective_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "executed_at": { + "name": "executed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "terminated_at": { + "name": "terminated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "is_auto_renew": { + "name": "is_auto_renew", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "notice_days": { + "name": "notice_days", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "value_cents": { + "name": "value_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "currency": { + "name": "currency", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'USD'" + }, + "governing_law": { + "name": "governing_law", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "document_url": { + "name": "document_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "notes": { + "name": "notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "contracts_account_idx": { + "name": "contracts_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_type_idx": { + "name": "contracts_type_idx", + "columns": [ + { + "expression": "type", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_status_idx": { + "name": "contracts_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_expiry_idx": { + "name": "contracts_expiry_idx", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "contracts_demand_deal_idx": { + "name": "contracts_demand_deal_idx", + "columns": [ + { + "expression": "demand_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "contracts_account_id_accounts_id_fk": { + "name": "contracts_account_id_accounts_id_fk", + "tableFrom": "contracts", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "contracts_demand_deal_id_demand_deals_id_fk": { + "name": "contracts_demand_deal_id_demand_deals_id_fk", + "tableFrom": "contracts", + "tableTo": "demand_deals", + "columnsFrom": [ + "demand_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contracts_supply_deal_id_supply_deals_id_fk": { + "name": "contracts_supply_deal_id_supply_deals_id_fk", + "tableFrom": "contracts", + "tableTo": "supply_deals", + "columnsFrom": [ + "supply_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contracts_capacity_commitment_id_capacity_commitments_id_fk": { + "name": "contracts_capacity_commitment_id_capacity_commitments_id_fk", + "tableFrom": "contracts", + "tableTo": "capacity_commitments", + "columnsFrom": [ + "capacity_commitment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "contracts_owner_user_id_users_id_fk": { + "name": "contracts_owner_user_id_users_id_fk", + "tableFrom": "contracts", + "tableTo": "users", + "columnsFrom": [ + "owner_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sla_metric_targets": { + "name": "sla_metric_targets", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "sla_term_id": { + "name": "sla_term_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "metric": { + "name": "metric", + "type": "pig_sla_metric", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "target_value": { + "name": "target_value", + "type": "numeric(12, 3)", + "primaryKey": false, + "notNull": true + }, + "unit": { + "name": "unit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "sla_metric_targets_term_idx": { + "name": "sla_metric_targets_term_idx", + "columns": [ + { + "expression": "sla_term_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sla_metric_targets_sla_term_id_sla_terms_id_fk": { + "name": "sla_metric_targets_sla_term_id_sla_terms_id_fk", + "tableFrom": "sla_metric_targets", + "tableTo": "sla_terms", + "columnsFrom": [ + "sla_term_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.sla_terms": { + "name": "sla_terms", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "contract_id": { + "name": "contract_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "kind": { + "name": "kind", + "type": "pig_sla_kind", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'credits_policy'" + }, + "uptime_target_pct": { + "name": "uptime_target_pct", + "type": "numeric(6, 3)", + "primaryKey": false, + "notNull": false + }, + "node_replacement_hours": { + "name": "node_replacement_hours", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "mttr_hours": { + "name": "mttr_hours", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "support_response_hours": { + "name": "support_response_hours", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "measurement_window": { + "name": "measurement_window", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'monthly'" + }, + "measurement_unit": { + "name": "measurement_unit", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'cluster'" + }, + "remedy_type": { + "name": "remedy_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'service_credit'" + }, + "abatement_trigger_value": { + "name": "abatement_trigger_value", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "abatement_trigger_unit": { + "name": "abatement_trigger_unit", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "claim_deadline_value": { + "name": "claim_deadline_value", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "claim_deadline_unit": { + "name": "claim_deadline_unit", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'days'" + }, + "credit_expiry_months": { + "name": "credit_expiry_months", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "is_sole_remedy": { + "name": "is_sole_remedy", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "spare_pool_obligation": { + "name": "spare_pool_obligation", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "spare_pool_scope": { + "name": "spare_pool_scope", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "maintenance_classes": { + "name": "maintenance_classes", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "reasonable_endeavours_days_per_year": { + "name": "reasonable_endeavours_days_per_year", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "rca_delivery_hours": { + "name": "rca_delivery_hours", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "credit_schedule": { + "name": "credit_schedule", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "credit_cap_pct": { + "name": "credit_cap_pct", + "type": "numeric(6, 3)", + "primaryKey": false, + "notNull": false + }, + "exclusions": { + "name": "exclusions", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "sla_terms_contract_idx": { + "name": "sla_terms_contract_idx", + "columns": [ + { + "expression": "contract_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "sla_terms_contract_id_contracts_id_fk": { + "name": "sla_terms_contract_id_contracts_id_fk", + "tableFrom": "sla_terms", + "tableTo": "contracts", + "columnsFrom": [ + "contract_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compliance_artifacts": { + "name": "compliance_artifacts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "claim": { + "name": "claim", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "scope": { + "name": "scope", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_certified": { + "name": "is_certified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "soc2_type": { + "name": "soc2_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "observation_window_start": { + "name": "observation_window_start", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "observation_window_end": { + "name": "observation_window_end", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "audit_firm": { + "name": "audit_firm", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "carve_out_method": { + "name": "carve_out_method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "products_in_scope": { + "name": "products_in_scope", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "evidence_url": { + "name": "evidence_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "verified_by_user_id": { + "name": "verified_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "verified_at": { + "name": "verified_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "compliance_artifacts_account_idx": { + "name": "compliance_artifacts_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "compliance_artifacts_claim_idx": { + "name": "compliance_artifacts_claim_idx", + "columns": [ + { + "expression": "claim", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "compliance_artifacts_expiry_idx": { + "name": "compliance_artifacts_expiry_idx", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "compliance_artifacts_account_id_accounts_id_fk": { + "name": "compliance_artifacts_account_id_accounts_id_fk", + "tableFrom": "compliance_artifacts", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compliance_artifacts_verified_by_user_id_users_id_fk": { + "name": "compliance_artifacts_verified_by_user_id_users_id_fk", + "tableFrom": "compliance_artifacts", + "tableTo": "users", + "columnsFrom": [ + "verified_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.compliance_decisions": { + "name": "compliance_decisions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "allocation_id": { + "name": "allocation_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "beneficial_owner_name": { + "name": "beneficial_owner_name", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "ultimate_parent_country": { + "name": "ultimate_parent_country", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "physical_jurisdiction": { + "name": "physical_jurisdiction", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "end_use": { + "name": "end_use", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "decision": { + "name": "decision", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'needs_review'" + }, + "rationale": { + "name": "rationale", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "rule_version": { + "name": "rule_version", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "decided_by_user_id": { + "name": "decided_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "decided_at": { + "name": "decided_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "re_evaluation_triggers": { + "name": "re_evaluation_triggers", + "type": "jsonb", + "primaryKey": false, + "notNull": true, + "default": "'[]'::jsonb" + }, + "superseded_at": { + "name": "superseded_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "compliance_decisions_allocation_idx": { + "name": "compliance_decisions_allocation_idx", + "columns": [ + { + "expression": "allocation_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "compliance_decisions_account_idx": { + "name": "compliance_decisions_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "compliance_decisions_decision_idx": { + "name": "compliance_decisions_decision_idx", + "columns": [ + { + "expression": "decision", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "compliance_decisions_allocation_id_allocations_id_fk": { + "name": "compliance_decisions_allocation_id_allocations_id_fk", + "tableFrom": "compliance_decisions", + "tableTo": "allocations", + "columnsFrom": [ + "allocation_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compliance_decisions_account_id_accounts_id_fk": { + "name": "compliance_decisions_account_id_accounts_id_fk", + "tableFrom": "compliance_decisions", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "compliance_decisions_decided_by_user_id_users_id_fk": { + "name": "compliance_decisions_decided_by_user_id_users_id_fk", + "tableFrom": "compliance_decisions", + "tableTo": "users", + "columnsFrom": [ + "decided_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.export_authorizations": { + "name": "export_authorizations", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "authorization_type": { + "name": "authorization_type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'none'" + }, + "reference": { + "name": "reference", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "scope_notes": { + "name": "scope_notes", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "issued_at": { + "name": "issued_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "evidence_url": { + "name": "evidence_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "verified_by_user_id": { + "name": "verified_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "verified_at": { + "name": "verified_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "volatile": { + "name": "volatile", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "export_authorizations_account_idx": { + "name": "export_authorizations_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "export_authorizations_expiry_idx": { + "name": "export_authorizations_expiry_idx", + "columns": [ + { + "expression": "expires_at", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "export_authorizations_account_id_accounts_id_fk": { + "name": "export_authorizations_account_id_accounts_id_fk", + "tableFrom": "export_authorizations", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "export_authorizations_verified_by_user_id_users_id_fk": { + "name": "export_authorizations_verified_by_user_id_users_id_fk", + "tableFrom": "export_authorizations", + "tableTo": "users", + "columnsFrom": [ + "verified_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.agent_actions": { + "name": "agent_actions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "agent_run_id": { + "name": "agent_run_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "target_type": { + "name": "target_type", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "target_id": { + "name": "target_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "summary": { + "name": "summary", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "idempotency_key": { + "name": "idempotency_key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'pending'" + }, + "external_id": { + "name": "external_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "metadata": { + "name": "metadata", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "agent_actions_idempotency_key": { + "name": "agent_actions_idempotency_key", + "columns": [ + { + "expression": "idempotency_key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agent_actions_run_idx": { + "name": "agent_actions_run_idx", + "columns": [ + { + "expression": "agent_run_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agent_actions_agent_run_id_agent_runs_id_fk": { + "name": "agent_actions_agent_run_id_agent_runs_id_fk", + "tableFrom": "agent_actions", + "tableTo": "agent_runs", + "columnsFrom": [ + "agent_run_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.agent_runs": { + "name": "agent_runs", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "agent_task_id": { + "name": "agent_task_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "agent": { + "name": "agent", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'piggy'" + }, + "principal_user_id": { + "name": "principal_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'running'" + }, + "model": { + "name": "model", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "input_tokens": { + "name": "input_tokens", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "output_tokens": { + "name": "output_tokens", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "cost_micro_cents": { + "name": "cost_micro_cents", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "input": { + "name": "input", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "result": { + "name": "result", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "summary": { + "name": "summary", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "started_at": { + "name": "started_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "finished_at": { + "name": "finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "agent_runs_task_idx": { + "name": "agent_runs_task_idx", + "columns": [ + { + "expression": "agent_task_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agent_runs_principal_idx": { + "name": "agent_runs_principal_idx", + "columns": [ + { + "expression": "principal_user_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agent_runs_agent_task_id_agent_tasks_id_fk": { + "name": "agent_runs_agent_task_id_agent_tasks_id_fk", + "tableFrom": "agent_runs", + "tableTo": "agent_tasks", + "columnsFrom": [ + "agent_task_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "agent_runs_principal_user_id_users_id_fk": { + "name": "agent_runs_principal_user_id_users_id_fk", + "tableFrom": "agent_runs", + "tableTo": "users", + "columnsFrom": [ + "principal_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.agent_tasks": { + "name": "agent_tasks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "kind": { + "name": "kind", + "type": "pig_agent_task_kind", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "subject": { + "name": "subject", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "reason": { + "name": "reason", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "payload": { + "name": "payload", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "priority": { + "name": "priority", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "budget": { + "name": "budget", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 4 + }, + "attempts": { + "name": "attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "max_attempts": { + "name": "max_attempts", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 3 + }, + "due_at": { + "name": "due_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "leased_until": { + "name": "leased_until", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "leased_by": { + "name": "leased_by", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "started_at": { + "name": "started_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "finished_at": { + "name": "finished_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "outcome": { + "name": "outcome", + "type": "pig_agent_task_outcome", + "typeSchema": "public", + "primaryKey": false, + "notNull": false + }, + "error": { + "name": "error", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "requested_by_user_id": { + "name": "requested_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "agent_tasks_pending_key": { + "name": "agent_tasks_pending_key", + "columns": [ + { + "expression": "kind", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "subject", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "where": "\"agent_tasks\".\"finished_at\" IS NULL", + "concurrently": false, + "method": "btree", + "with": {} + }, + "agent_tasks_claimable_idx": { + "name": "agent_tasks_claimable_idx", + "columns": [ + { + "expression": "due_at", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "priority", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "agent_tasks_lease_idx": { + "name": "agent_tasks_lease_idx", + "columns": [ + { + "expression": "leased_until", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "agent_tasks_requested_by_user_id_users_id_fk": { + "name": "agent_tasks_requested_by_user_id_users_id_fk", + "tableFrom": "agent_tasks", + "tableTo": "users", + "columnsFrom": [ + "requested_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.facts": { + "name": "facts", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "contact_id": { + "name": "contact_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "field": { + "name": "field", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "value": { + "name": "value", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "score": { + "name": "score", + "type": "numeric(4, 3)", + "primaryKey": false, + "notNull": true + }, + "band": { + "name": "band", + "type": "pig_fact_band", + "typeSchema": "public", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "pig_fact_status", + "typeSchema": "public", + "primaryKey": false, + "notNull": true, + "default": "'proposed'" + }, + "evidence": { + "name": "evidence", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "source_url": { + "name": "source_url", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "method": { + "name": "method", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "agent_run_id": { + "name": "agent_run_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "decided_by_user_id": { + "name": "decided_by_user_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "decided_at": { + "name": "decided_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "observed_at": { + "name": "observed_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "superseded_at": { + "name": "superseded_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "facts_account_idx": { + "name": "facts_account_idx", + "columns": [ + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "facts_contact_idx": { + "name": "facts_contact_idx", + "columns": [ + { + "expression": "contact_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "facts_status_idx": { + "name": "facts_status_idx", + "columns": [ + { + "expression": "status", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + }, + "facts_field_idx": { + "name": "facts_field_idx", + "columns": [ + { + "expression": "field", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "facts_account_id_accounts_id_fk": { + "name": "facts_account_id_accounts_id_fk", + "tableFrom": "facts", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "facts_contact_id_contacts_id_fk": { + "name": "facts_contact_id_contacts_id_fk", + "tableFrom": "facts", + "tableTo": "contacts", + "columnsFrom": [ + "contact_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "facts_decided_by_user_id_users_id_fk": { + "name": "facts_decided_by_user_id_users_id_fk", + "tableFrom": "facts", + "tableTo": "users", + "columnsFrom": [ + "decided_by_user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.field_definitions": { + "name": "field_definitions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "entity": { + "name": "entity", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "default": "'text'" + }, + "agent_filled": { + "name": "agent_filled", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": true + }, + "agent_brief": { + "name": "agent_brief", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "is_required": { + "name": "is_required", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "show_on_table": { + "name": "show_on_table", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "field_definitions_entity_key": { + "name": "field_definitions_entity_key", + "columns": [ + { + "expression": "entity", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "key", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.field_options": { + "name": "field_options", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "field_id": { + "name": "field_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "position": { + "name": "position", + "type": "integer", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "archived_at": { + "name": "archived_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + } + }, + "indexes": { + "field_options_field_idx": { + "name": "field_options_field_idx", + "columns": [ + { + "expression": "field_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": false, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "field_options_field_id_field_definitions_id_fk": { + "name": "field_options_field_id_field_definitions_id_fk", + "tableFrom": "field_options", + "tableTo": "field_definitions", + "columnsFrom": [ + "field_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.field_values": { + "name": "field_values", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "field_id": { + "name": "field_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "account_id": { + "name": "account_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "contact_id": { + "name": "contact_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "demand_deal_id": { + "name": "demand_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "supply_deal_id": { + "name": "supply_deal_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "text_value": { + "name": "text_value", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "number_value": { + "name": "number_value", + "type": "numeric(24, 4)", + "primaryKey": false, + "notNull": false + }, + "date_value": { + "name": "date_value", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": false + }, + "bool_value": { + "name": "bool_value", + "type": "boolean", + "primaryKey": false, + "notNull": false + }, + "option_id": { + "name": "option_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "user_value": { + "name": "user_value", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": { + "field_values_account_key": { + "name": "field_values_account_key", + "columns": [ + { + "expression": "field_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "account_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "field_values_contact_key": { + "name": "field_values_contact_key", + "columns": [ + { + "expression": "field_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "contact_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "field_values_demand_deal_key": { + "name": "field_values_demand_deal_key", + "columns": [ + { + "expression": "field_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "demand_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + }, + "field_values_supply_deal_key": { + "name": "field_values_supply_deal_key", + "columns": [ + { + "expression": "field_id", + "isExpression": false, + "asc": true, + "nulls": "last" + }, + { + "expression": "supply_deal_id", + "isExpression": false, + "asc": true, + "nulls": "last" + } + ], + "isUnique": true, + "concurrently": false, + "method": "btree", + "with": {} + } + }, + "foreignKeys": { + "field_values_field_id_field_definitions_id_fk": { + "name": "field_values_field_id_field_definitions_id_fk", + "tableFrom": "field_values", + "tableTo": "field_definitions", + "columnsFrom": [ + "field_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_values_account_id_accounts_id_fk": { + "name": "field_values_account_id_accounts_id_fk", + "tableFrom": "field_values", + "tableTo": "accounts", + "columnsFrom": [ + "account_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_values_contact_id_contacts_id_fk": { + "name": "field_values_contact_id_contacts_id_fk", + "tableFrom": "field_values", + "tableTo": "contacts", + "columnsFrom": [ + "contact_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_values_demand_deal_id_demand_deals_id_fk": { + "name": "field_values_demand_deal_id_demand_deals_id_fk", + "tableFrom": "field_values", + "tableTo": "demand_deals", + "columnsFrom": [ + "demand_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_values_supply_deal_id_supply_deals_id_fk": { + "name": "field_values_supply_deal_id_supply_deals_id_fk", + "tableFrom": "field_values", + "tableTo": "supply_deals", + "columnsFrom": [ + "supply_deal_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "field_values_option_id_field_options_id_fk": { + "name": "field_values_option_id_field_options_id_fk", + "tableFrom": "field_values", + "tableTo": "field_options", + "columnsFrom": [ + "option_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + }, + "field_values_user_value_users_id_fk": { + "name": "field_values_user_value_users_id_fk", + "tableFrom": "field_values", + "tableTo": "users", + "columnsFrom": [ + "user_value" + ], + "columnsTo": [ + "id" + ], + "onDelete": "set null", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": { + "public.pig_account_side": { + "name": "pig_account_side", + "schema": "public", + "values": [ + "supply", + "demand", + "both" + ] + }, + "public.pig_activity_type": { + "name": "pig_activity_type", + "schema": "public", + "values": [ + "note", + "email", + "call", + "meeting", + "slack", + "buzz", + "stage_change", + "contract_event", + "task", + "agent_action" + ] + }, + "public.pig_affiliation_kind": { + "name": "pig_affiliation_kind", + "schema": "public", + "values": [ + "staff", + "founder", + "alumni", + "contributor", + "resident", + "advisor", + "investor", + "customer_reference", + "unknown" + ] + }, + "public.pig_agent_task_kind": { + "name": "pig_agent_task_kind", + "schema": "public", + "values": [ + "enrich_account", + "enrich_contact", + "write_brief", + "match_capacity", + "detect_idle_capacity", + "summarise_pipeline", + "watch_renewal", + "research_supplier" + ] + }, + "public.pig_agent_task_outcome": { + "name": "pig_agent_task_outcome", + "schema": "public", + "values": [ + "succeeded", + "failed", + "skipped", + "cancelled" + ] + }, + "public.pig_confidence_grade": { + "name": "pig_confidence_grade", + "schema": "public", + "values": [ + "confirmed", + "probable", + "unverified", + "disputed" + ] + }, + "public.pig_contract_status": { + "name": "pig_contract_status", + "schema": "public", + "values": [ + "draft", + "in_review", + "in_negotiation", + "out_for_signature", + "executed", + "expired", + "terminated" + ] + }, + "public.pig_contract_type": { + "name": "pig_contract_type", + "schema": "public", + "values": [ + "msa", + "dpa", + "sla", + "order_form", + "capacity_commitment", + "nda", + "amendment" + ] + }, + "public.pig_customer_segment": { + "name": "pig_customer_segment", + "schema": "public", + "values": [ + "frontier_lab", + "applied_ai_startup", + "enterprise", + "research_institution", + "sovereign", + "individual_developer" + ] + }, + "public.pig_demand_stage": { + "name": "pig_demand_stage", + "schema": "public", + "values": [ + "qualification", + "legal", + "scoping", + "proposal", + "procurement", + "poc", + "deployment", + "expansion", + "closed_won", + "closed_lost" + ] + }, + "public.pig_fact_band": { + "name": "pig_fact_band", + "schema": "public", + "values": [ + "verified", + "probable", + "possible" + ] + }, + "public.pig_fact_status": { + "name": "pig_fact_status", + "schema": "public", + "values": [ + "applied", + "proposed", + "dismissed", + "superseded" + ] + }, + "public.pig_gpu_socket": { + "name": "pig_gpu_socket", + "schema": "public", + "values": [ + "PCIe", + "SXM2", + "SXM3", + "SXM4", + "SXM5", + "SXM6" + ] + }, + "public.pig_interconnect_type": { + "name": "pig_interconnect_type", + "schema": "public", + "values": [ + "Infiniband", + "RoCE", + "NVLink", + "Ethernet", + "Unknown" + ] + }, + "public.pig_product_line": { + "name": "pig_product_line", + "schema": "public", + "values": [ + "compute_ondemand", + "compute_reserved", + "compute_spot", + "post_training", + "inference", + "evaluations", + "platform" + ] + }, + "public.pig_record_source": { + "name": "pig_record_source", + "schema": "public", + "values": [ + "manual", + "seed", + "agent", + "prime_api", + "slack", + "buzz", + "import" + ] + }, + "public.pig_security_tier": { + "name": "pig_security_tier", + "schema": "public", + "values": [ + "secure_cloud", + "community_cloud" + ] + }, + "public.pig_sla_kind": { + "name": "pig_sla_kind", + "schema": "public", + "values": [ + "none", + "credits_policy", + "negotiated" + ] + }, + "public.pig_sla_metric": { + "name": "pig_sla_metric", + "schema": "public", + "values": [ + "uptime_pct", + "node_availability_pct", + "node_replacement_hours", + "mttr_hours", + "support_response_hours", + "throughput_floor" + ] + }, + "public.pig_stock_status": { + "name": "pig_stock_status", + "schema": "public", + "values": [ + "Available", + "Low", + "Medium", + "High", + "Unavailable" + ] + }, + "public.pig_supplier_type": { + "name": "pig_supplier_type", + "schema": "public", + "values": [ + "hyperscaler", + "neocloud", + "regional_operator", + "datacenter", + "broker", + "depin", + "community" + ] + }, + "public.pig_supply_stage": { + "name": "pig_supply_stage", + "schema": "public", + "values": [ + "sourced", + "qualifying", + "technical_diligence", + "financial_diligence", + "pricing", + "contracting", + "onboarding", + "live", + "renewal", + "churned", + "rejected" + ] + }, + "public.pig_team": { + "name": "pig_team", + "schema": "public", + "values": [ + "supply", + "demand", + "research" + ] + }, + "public.pig_team_role": { + "name": "pig_team_role", + "schema": "public", + "values": [ + "member", + "lead", + "admin" + ] + } + }, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/db/migrations/meta/_journal.json b/packages/db/migrations/meta/_journal.json index bf23262..d089ecb 100644 --- a/packages/db/migrations/meta/_journal.json +++ b/packages/db/migrations/meta/_journal.json @@ -8,6 +8,13 @@ "when": 1786585246686, "tag": "0000_initial", "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1786587116691, + "tag": "0001_user_appearance", + "breakpoints": true } ] } \ No newline at end of file diff --git a/packages/db/src/seed/index.ts b/packages/db/src/seed/index.ts new file mode 100644 index 0000000..437d35e --- /dev/null +++ b/packages/db/src/seed/index.ts @@ -0,0 +1,361 @@ +/** + * Seed the database. + * + * Idempotent: running it twice does not duplicate anything. Safe against a + * database that already has real data, because every insert is keyed and + * conflicts are ignored rather than overwritten. + * + * What gets seeded, and why: + * + * • **Prime Intellect as an account, with its people.** Public research, + * every record confidence-graded and cited. See `people.ts`. + * • **A handful of named neoclouds** as supply-side accounts, so the supply + * pipeline is not an empty screen on first run. + * • **A worked example** of the thing PIG exists for: one capacity + * commitment, two allocations against it, and therefore a real margin + * number and a real idle-capacity alert on the dashboard. + * + * The example is clearly labelled. Nobody should mistake it for real business. + */ +import { eq } from 'drizzle-orm'; +import { createDatabase } from '../client'; +import { + accounts, + allocations, + capacityCommitments, + contacts, + demandDeals, + teamMemberships, + users, +} from '../schema/index'; +import { PRIME_INTELLECT_PEOPLE, PUBLIC_CUSTOMER_REFERENCES, UNRESOLVED_NAMES } from './people'; + +const db = createDatabase(); + +async function seed() { + console.log('Seeding PIG…\n'); + + // ------------------------------------------------------- Prime Intellect + const [prime] = await db + .insert(accounts) + .values({ + name: 'Prime Intellect', + domain: 'primeintellect.ai', + website: 'https://www.primeintellect.ai', + description: + 'Aggregates GPU capacity across many providers and sells compute, RL ' + + 'post-training, inference and evaluations. The company PIG was designed for.', + side: 'both', + customerSegment: 'frontier_lab', + country: 'United States', + region: 'San Francisco', + source: 'seed', + sourceUrl: 'https://www.primeintellect.ai/', + confidence: 'confirmed', + }) + .onConflictDoNothing({ target: accounts.domain }) + .returning(); + + const primeId = + prime?.id ?? + ( + await db + .select({ id: accounts.id }) + .from(accounts) + .where(eq(accounts.domain, 'primeintellect.ai')) + .limit(1) + )[0]?.id; + + if (!primeId) throw new Error('Could not resolve the Prime Intellect account.'); + + /* + * Existence checks rather than ON CONFLICT. + * + * `onConflictDoNothing()` with no target is a no-op unless a unique + * constraint is actually violated, and there is deliberately no unique index + * on (account, name) — two people at one company really can share a name. + * So idempotency is enforced here, in the seed, rather than by bending the + * schema to suit it. + */ + const existingContactNames = new Set( + ( + await db + .select({ fullName: contacts.fullName }) + .from(contacts) + .where(eq(contacts.accountId, primeId)) + ).map((row) => row.fullName), + ); + + let peopleAdded = 0; + for (const person of PRIME_INTELLECT_PEOPLE) { + if (existingContactNames.has(person.fullName)) continue; + const [created] = await db + .insert(contacts) + .values({ + accountId: primeId, + fullName: person.fullName, + title: person.title, + affiliation: person.affiliation, + confidence: person.confidence, + confidenceNote: person.confidenceNote, + sourceUrl: person.sourceUrl, + githubHandle: person.githubHandle, + twitterHandle: person.twitterHandle, + linkedinUrl: person.linkedinUrl, + websiteUrl: person.websiteUrl, + isDecisionMaker: person.isDecisionMaker ?? false, + // Recorded as a real date so "who has left?" is answerable without + // parsing prose out of a note field. + departedAt: person.departed ? new Date('2026-01-01') : null, + source: 'seed', + // Deliberately no email. None are published, and inferring one from a + // name and a domain is unreliable and discourteous. + email: null, + }) + .onConflictDoNothing() + .returning(); + if (created) peopleAdded += 1; + } + console.log(` Prime Intellect: ${peopleAdded} contact(s) seeded, all graded and cited.`); + + // --------------------------------------------------- customer references + for (const reference of PUBLIC_CUSTOMER_REFERENCES) { + const [account] = await db + .insert(accounts) + .values({ + name: reference.account, + side: 'demand', + customerSegment: 'enterprise', + description: `Named publicly as a Prime Intellect customer reference.`, + source: 'seed', + sourceUrl: reference.sourceUrl, + confidence: 'confirmed', + }) + .onConflictDoNothing() + .returning(); + + if (account) { + const [existingRef] = await db + .select({ id: contacts.id }) + .from(contacts) + .where(eq(contacts.fullName, reference.person)) + .limit(1); + if (existingRef) continue; + + await db + .insert(contacts) + .values({ + accountId: account.id, + fullName: reference.person, + title: reference.title, + // Named as a reference in marketing material, which is evidence of a + // relationship — not evidence of employment at the seller. + affiliation: 'customer_reference', + confidence: 'confirmed', + sourceUrl: reference.sourceUrl, + source: 'seed', + email: null, + }) + .onConflictDoNothing(); + } + } + console.log(` ${PUBLIC_CUSTOMER_REFERENCES.length} public customer reference(s) seeded.`); + + // --------------------------------------------------------- supply accounts + const SUPPLIERS = [ + { name: 'CoreWeave', domain: 'coreweave.com', type: 'neocloud' as const }, + { name: 'Nebius', domain: 'nebius.com', type: 'neocloud' as const }, + { name: 'Crusoe', domain: 'crusoe.ai', type: 'neocloud' as const }, + { name: 'Lambda', domain: 'lambda.ai', type: 'neocloud' as const }, + { name: 'Together AI', domain: 'together.ai', type: 'neocloud' as const }, + { name: 'Voltage Park', domain: 'voltagepark.com', type: 'neocloud' as const }, + { name: 'RunPod', domain: 'runpod.io', type: 'neocloud' as const }, + { name: 'Datacrunch', domain: 'datacrunch.io', type: 'neocloud' as const }, + ]; + + let suppliersAdded = 0; + for (const supplier of SUPPLIERS) { + const [created] = await db + .insert(accounts) + .values({ + name: supplier.name, + domain: supplier.domain, + side: 'supply', + supplierType: supplier.type, + description: 'GPU cloud provider. Publicly documented; commercial terms are not.', + source: 'seed', + confidence: 'confirmed', + }) + .onConflictDoNothing({ target: accounts.domain }) + .returning(); + if (created) suppliersAdded += 1; + } + console.log(` ${suppliersAdded} supply-side account(s) seeded.`); + + // ------------------------------------------------------- a worked example + // + // Illustrative only, and labelled as such. It exists so the dashboard has a + // real margin figure and a real idle-capacity alert on first run, rather + // than empty states that make the product look like it does nothing. + const [supplier] = await db + .select({ id: accounts.id }) + .from(accounts) + .where(eq(accounts.domain, 'coreweave.com')) + .limit(1); + + const EXAMPLE_COMMITMENT = 'EXAMPLE — 256× H100 reserved, 6 months'; + const [existingExample] = await db + .select({ id: capacityCommitments.id }) + .from(capacityCommitments) + .where(eq(capacityCommitments.name, EXAMPLE_COMMITMENT)) + .limit(1); + + if (supplier && !existingExample) { + const start = new Date(); + const end = new Date(start.getTime() + 180 * 86_400_000); + + const [commitment] = await db + .insert(capacityCommitments) + .values({ + accountId: supplier.id, + name: EXAMPLE_COMMITMENT, + gpuType: 'H100_80GB', + socket: 'SXM5', + gpuCount: 256, + interconnectType: 'Infiniband', + securityTier: 'secure_cloud', + startsAt: start, + endsAt: end, + // 256 GPUs × 24h × 180d, at 92% of wall-clock to allow for maintenance. + totalGpuHours: String(Math.round(256 * 24 * 180 * 0.92)), + // Bulk reserved pricing sits well below market on-demand — that spread + // is the business. Figures are plausible rather than sourced. + costPerGpuHourCents: 160, + takeOrPayFloorPct: '100', + prepaidPct: '20', + usefulLifeYears: '5', + notes: + 'Illustrative seed data, not a real contract. Delete once you have entered ' + + 'your own commitments.', + }) + .onConflictDoNothing() + .returning(); + + if (commitment) { + const [customer] = await db + .select({ id: accounts.id }) + .from(accounts) + .where(eq(accounts.name, 'Ramp')) + .limit(1); + + if (customer) { + const [deal] = await db + .insert(demandDeals) + .values({ + accountId: customer.id, + name: 'EXAMPLE — post-training cluster', + productLine: 'compute_reserved', + stage: 'deployment', + acvCents: 340_000_00, + termMonths: 6, + msaExecuted: true, + dpaExecuted: true, + }) + .onConflictDoNothing() + .returning(); + + if (deal) { + /* + * Sold: 70% of the block at $2.45/GPU-hr against $1.60 cost. + * + * These proportions are chosen to demonstrate the point of the + * product rather than to flatter it. Because cost is charged against + * the FULL commitment, a 53% markup only clears break-even once + * roughly 65% of the block is sold — so this example lands at about + * +10% margin while still leaving 20% idle, and both the healthy + * margin and the idle-capacity alert are visible at once. + * + * Drop the sold share to 55% and the same block goes underwater. + * That sensitivity is the whole argument for tracking this. + */ + await db.insert(allocations).values({ + capacityCommitmentId: commitment.id, + demandDealId: deal.id, + gpuHours: String(Math.round(Number(commitment.totalGpuHours) * 0.70)), + pricePerGpuHourCents: 245, + startsAt: start, + endsAt: end, + status: 'committed', + guaranteeType: 'guaranteed', + priority: 10, + }); + + // Internal research burn: real cost, no revenue. Leaving this out is + // exactly how a book looks healthier than it is. + await db.insert(allocations).values({ + capacityCommitmentId: commitment.id, + internalTeam: 'research', + gpuHours: String(Math.round(Number(commitment.totalGpuHours) * 0.08)), + pricePerGpuHourCents: 0, + startsAt: start, + endsAt: end, + status: 'active', + guaranteeType: 'internal', + priority: 200, + notes: 'Internal research consumption — costs real money, earns none.', + }); + + console.log( + ' Worked example seeded: 1 commitment, 2 allocations (one of them internal ' + + 'research burn), ~+10% margin with 20% still idle.', + ); + } + } + } + } else if (existingExample) { + console.log(' Worked example already present — skipped.'); + } + + // ---------------------------------------------------------- the dev user + // + // Only when the table is empty. With authentication disabled in development + // the API adopts the first user it finds, so creating one unconditionally + // could hand a local session to the wrong identity. + const existing = await db.select({ id: users.id }).from(users).limit(1); + if (existing.length === 0) { + const [devUser] = await db + .insert(users) + .values({ + email: 'dev@localhost', + name: 'Development User', + handle: 'dev', + title: 'Local development', + isPlatformAdmin: true, + }) + .returning(); + + if (devUser) { + for (const team of ['supply', 'demand', 'research'] as const) { + await db + .insert(teamMemberships) + .values({ userId: devUser.id, team, role: 'admin', isPrimary: team === 'demand' }) + .onConflictDoNothing(); + } + console.log(' Development user created (dev@localhost), on all three teams.'); + } + } + + console.log('\nUnresolved names, recorded rather than invented:'); + for (const unresolved of UNRESOLVED_NAMES) { + console.log(` ${unresolved.name}: ${unresolved.note.split('.')[0]}.`); + } + + console.log('\nDone. No email addresses were seeded or inferred.'); +} + +seed() + .then(() => process.exit(0)) + .catch((error) => { + console.error('Seed failed:', error); + process.exit(1); + }); diff --git a/packages/db/src/seed/people.ts b/packages/db/src/seed/people.ts new file mode 100644 index 0000000..2a86b00 --- /dev/null +++ b/packages/db/src/seed/people.ts @@ -0,0 +1,373 @@ +/** + * Seed roster — publicly documented people at Prime Intellect. + * + * Every record carries a confidence grade and a source URL. This is not + * decoration: PIG holds claims about real people assembled from public + * sources, and some of those claims rest on a single weak citation. A CRM that + * presents a single-source LinkedIn headline with the same weight as a + * corroborated one is a misinformation store with a nice table view. + * + * Rules applied throughout, and worth keeping if you extend this file: + * + * • **No email addresses.** None are published, and guessing them from a name + * and a domain would be both unreliable and rude to the person on the + * receiving end. + * • **Authorship is not employment.** People named on papers or in + * repositories are recorded with the affiliation actually evidenced — + * `contributor`, `resident`, `alumni` — never promoted to `staff` because + * it would make the roster look fuller. + * • **"Not found" is recorded as unverified, not invented.** Where a name was + * supplied but could not be sourced, the record says so. + * + * Sourced as of August 2026. It will go stale; that is what `sourceUrl` and + * `confidenceNote` are for. + */ +import type { AffiliationKind, ConfidenceGrade, Team } from '@pig/core'; + +export interface SeedPerson { + fullName: string; + title: string | null; + affiliation: AffiliationKind; + confidence: ConfidenceGrade; + confidenceNote?: string; + sourceUrl?: string; + githubHandle?: string; + twitterHandle?: string; + linkedinUrl?: string; + websiteUrl?: string; + /** Which PIG team this person would sit on, if they were a user. */ + team?: Team; + isDecisionMaker?: boolean; + departed?: boolean; +} + +export const PRIME_INTELLECT_PEOPLE: SeedPerson[] = [ + // ------------------------------------------------------------- leadership + { + fullName: 'Vincent Weisser', + title: 'Co-founder & CEO', + affiliation: 'founder', + confidence: 'confirmed', + sourceUrl: 'https://api.github.com/users/vincentweisser', + githubHandle: 'vincentweisser', + twitterHandle: 'vincentweisser', + websiteUrl: 'https://vincentweisser.com', + linkedinUrl: 'https://www.linkedin.com/in/vincentweisser/', + isDecisionMaker: true, + }, + { + fullName: 'Johannes Hagemann', + title: 'Co-founder & CTO', + affiliation: 'founder', + confidence: 'confirmed', + confidenceNote: 'GitHub bio states "co-founder/cto @PrimeIntellect-ai".', + sourceUrl: 'https://api.github.com/users/JohannesHa', + githubHandle: 'JohannesHa', + twitterHandle: 'johannes_hage', + websiteUrl: 'https://hagemann.ai', + isDecisionMaker: true, + }, + { + fullName: 'Jannik Straube', + title: 'Founding Head of Engineering', + affiliation: 'staff', + confidence: 'probable', + confidenceNote: + 'Title from a LinkedIn headline seen via search index, not a fetched primary page. ' + + 'Employment itself is well evidenced: top contributor to the protocol and prime repos.', + sourceUrl: 'https://api.github.com/users/JannikSt', + githubHandle: 'JannikSt', + linkedinUrl: 'https://www.linkedin.com/in/jannikstraube/', + }, + + // -------------------------------------------------------------- go-to-market + { + fullName: 'Scott Cecil', + title: 'GTM Lead', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: + 'Corroborated by two independent sources. The only publicly identifiable ' + + 'commercial hire found.', + sourceUrl: 'https://theorg.com/org/prime-intellect/offices/hq', + linkedinUrl: 'https://www.linkedin.com/in/scottcecil1/', + team: 'demand', + isDecisionMaker: true, + }, + { + fullName: 'Alex Ferguson', + title: 'Head of Growth', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: + 'Quoted by name and title in a published Nebius customer story, and publishes ' + + "Prime Intellect's open-roles posts. Note: absent from GitHub org membership and " + + 'paper author lists, which is expected for a growth role and is not evidence against.', + sourceUrl: 'https://nebius.com/customer-stories/prime-intellect', + twitterHandle: 'afurgs', + linkedinUrl: 'https://www.linkedin.com/in/afurg/', + team: 'demand', + isDecisionMaker: true, + }, + { + fullName: 'Tyler Kovalcik', + title: 'AI infrastructure sales / GTM strategy', + affiliation: 'unknown', + confidence: 'unverified', + confidenceNote: + 'Single self-reported LinkedIn profile. No corroborating source found, and no ' + + 'Tyler appears in any Prime Intellect repository, paper, or org listing. ' + + 'Verify before acting on this record.', + linkedinUrl: 'https://www.linkedin.com/in/tyler-kovalcik-30342367/', + team: 'supply', + }, + + // ------------------------------------------------------------------ research + { + fullName: 'Sami Jaghouar', + title: 'Research lead', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: + 'GitHub bio reads "leading research @PrimeIntellect-ai". First author on ' + + 'INTELLECT-1, INTELLECT-2 and OpenDiLoCo.', + sourceUrl: 'https://api.github.com/users/samsja', + githubHandle: 'samsja', + twitterHandle: 'samsja19', + team: 'research', + }, + { + fullName: 'Will Brown', + title: 'Research lead — RL environments', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: + 'Creator and top contributor of `verifiers`, the library behind the Environments ' + + "Hub. Named in the Environments Hub launch post as the contact for RFCs. Exact " + + 'internal title not published; the role is inferred from ownership.', + sourceUrl: 'https://www.primeintellect.ai/blog/environments', + githubHandle: 'willccbb', + twitterHandle: 'willccbb', + websiteUrl: 'https://willcb.com', + team: 'research', + }, + { + fullName: 'Jack Min Ong', + title: 'Founding Research Engineer', + affiliation: 'staff', + confidence: 'confirmed', + sourceUrl: 'https://arxiv.org/abs/2407.07852', + githubHandle: 'Jackmin801', + twitterHandle: 'jackminong', + team: 'research', + }, + { + fullName: 'Mika Senghaas', + title: 'Research engineer', + affiliation: 'staff', + confidence: 'confirmed', + sourceUrl: 'https://api.github.com/users/mikasenghaas', + githubHandle: 'mikasenghaas', + twitterHandle: 'mikasenghaas', + websiteUrl: 'https://mikasenghaas.de', + team: 'research', + }, + { + fullName: 'Florian Brand', + title: 'Evals', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: 'GitHub bio reads "Evals @ Prime Intellect".', + sourceUrl: 'https://api.github.com/users/xeophon', + githubHandle: 'xeophon', + twitterHandle: 'xeophon', + team: 'research', + }, + { + fullName: 'Sebastian Müller', + title: 'Research Engineer', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: 'GitHub bio states the role. Co-author of the Prime Agent post.', + sourceUrl: 'https://api.github.com/users/snimu', + githubHandle: 'snimu', + twitterHandle: 'omouamoua', + team: 'research', + }, + { + fullName: 'Ameen Patel', + title: 'Inference', + affiliation: 'staff', + confidence: 'confirmed', + confidenceNote: 'GitHub bio reads "Inference @PrimeIntellect-ai".', + sourceUrl: 'https://api.github.com/users/AmeenP', + githubHandle: 'AmeenP', + twitterHandle: 'ameen_ml', + team: 'research', + }, + { + fullName: 'Kevin Jose Thomas', + title: 'Prime Agent', + affiliation: 'staff', + confidence: 'confirmed', + sourceUrl: 'https://www.primeintellect.ai/blog/prime-agent', + githubHandle: 'kevinjosethomas', + twitterHandle: 'kevinjosethomas', + team: 'research', + }, + { + fullName: 'Damian Barabonkov', + title: 'Member of Technical Staff', + affiliation: 'staff', + confidence: 'confirmed', + sourceUrl: 'https://api.github.com/users/DamianB-BitFlipper', + githubHandle: 'DamianB-BitFlipper', + twitterHandle: 'damian_b', + team: 'research', + }, + { + fullName: 'Dominik Scherm', + title: 'Member of Technical Staff', + affiliation: 'staff', + confidence: 'confirmed', + sourceUrl: 'https://api.github.com/users/d42me', + githubHandle: 'd42me', + twitterHandle: 'dominik_scherm', + team: 'research', + }, + { + fullName: 'Cooper Miller', + title: 'Member of Technical Staff', + affiliation: 'staff', + confidence: 'confirmed', + sourceUrl: 'https://api.github.com/users/kcoopermiller', + githubHandle: 'kcoopermiller', + twitterHandle: 'kcoopm', + team: 'research', + }, + { + fullName: 'Mario Sieg', + title: 'ML / HPC / compilers', + affiliation: 'staff', + confidence: 'probable', + confidenceNote: 'GitHub company field lists Prime Intellect alongside TU Berlin.', + sourceUrl: 'https://api.github.com/users/MarioSieg', + githubHandle: 'MarioSieg', + twitterHandle: '_mario_neo_', + team: 'research', + }, + { + fullName: 'Matej Sirovatka', + title: 'Research engineer', + affiliation: 'staff', + confidence: 'probable', + confidenceNote: 'GitHub company field only; no title published.', + sourceUrl: 'https://api.github.com/users/S1ro1', + githubHandle: 'S1ro1', + team: 'research', + }, + { + fullName: 'Manveer Basra', + title: null, + affiliation: 'staff', + confidence: 'probable', + confidenceNote: 'GitHub company field; co-author on INTELLECT-1 and INTELLECT-2.', + sourceUrl: 'https://arxiv.org/abs/2412.01152', + githubHandle: 'manveerxyz', + team: 'research', + }, + { + fullName: 'Jessica Li', + title: 'Applied Researcher', + affiliation: 'staff', + confidence: 'unverified', + confidenceNote: 'Single crowd-sourced org-chart listing. No primary source found.', + sourceUrl: 'https://theorg.com/org/prime-intellect/offices/hq', + team: 'research', + }, + + // ----------------------------------------------- explicitly NOT current staff + { + fullName: 'Justus Mattern', + title: 'Alumnus — now co-founder elsewhere', + affiliation: 'alumni', + confidence: 'confirmed', + confidenceNote: + 'Co-author on INTELLECT-2 and a prime-rl contributor. GitHub bio now reads ' + + '"Cofounder at Proximal", so this is a warm-intro node rather than a current ' + + 'employee. Recorded to keep the roster honest.', + sourceUrl: 'https://api.github.com/users/justusmattern27', + githubHandle: 'justusmattern27', + departed: true, + }, + { + fullName: 'Alex Wa', + title: 'RL Residency participant', + affiliation: 'resident', + confidence: 'probable', + confidenceNote: + "Real, and did develop RL environments in Prime Intellect's RL Residency — but " + + 'is a Yale undergraduate interning elsewhere, NOT staff. Distinct from Alexandr ' + + 'Wang (Scale AI / Meta), and possibly a garbling of Alex L. Zhang, a genuine ' + + 'Prime Intellect person and Prime Agent co-author.', + sourceUrl: 'https://djdumpling.github.io/', + linkedinUrl: 'https://www.linkedin.com/in/alex-wa/', + }, + { + fullName: 'Alex L. Zhang', + title: 'Prime Agent co-author', + affiliation: 'staff', + confidence: 'probable', + confidenceNote: 'Named as a co-author on the Prime Agent post. No further detail published.', + sourceUrl: 'https://www.primeintellect.ai/blog/prime-agent', + team: 'research', + }, + { + fullName: 'Seth Karten', + title: 'Prime Agent co-author', + affiliation: 'staff', + confidence: 'probable', + sourceUrl: 'https://www.primeintellect.ai/blog/prime-agent', + team: 'research', + }, +]; + +/** + * Named in the brief but not findable. + * + * Recorded deliberately rather than silently dropped: "we looked and found + * nothing" is useful information, and leaving it out invites someone to add + * the name again from memory. Absence here is weak evidence — a junior or + * deliberately non-public employee looks identical to this search. + */ +export const UNRESOLVED_NAMES = [ + { + name: 'Anirudh', + note: + 'No Anirudh of any surname could be tied to Prime Intellect in GitHub org ' + + 'membership, repository contributors, paper author lists, org charts, or blog ' + + 'bylines. Not seeded. If you know who this is, add them with a source.', + }, +]; + +/** + * Customer references the company itself publishes. + * + * Useful as accounts, but note these are named as references and integrations, + * which is not the same as a paying compute customer — a distinction worth + * keeping in a CRM. + */ +export const PUBLIC_CUSTOMER_REFERENCES = [ + { + account: 'Ramp', + person: 'Karim Atiyeh', + title: 'Co-CEO', + sourceUrl: 'https://www.primeintellect.ai/', + }, + { + account: 'Zapier', + person: 'Robin Salimans', + title: 'Principal AI Engineer', + sourceUrl: 'https://www.primeintellect.ai/', + }, +];