History

ui

Rhys Sullivan committed 9 months ago

Commit 2e3e7fc1 parent 1119ba554 files · +6130 −1595Browse files

Unified · Split

54 files
  1. executor/apps/server/src/index.ts +5 −4
  2. executor/apps/server/src/service.ts +8 −2
  3. executor/apps/server/src/tool-sources.ts +3 −1
  4. executor/apps/web/.gitignore +41 −0
  5. executor/apps/web/README.md +36 −0
  6. executor/apps/web/components.json +23 −0
  7. executor/apps/web/eslint.config.mjs +18 −0
  8. executor/apps/web/index.html +0 −176
  9. executor/apps/web/next.config.ts +14 −0
  10. executor/apps/web/package.json +42 −1
  11. executor/apps/web/postcss.config.mjs +7 −0
  12. executor/apps/web/src/app/approvals/page.tsx +10 −0
  13. executor/apps/web/src/app/favicon.ico +0 −0
  14. executor/apps/web/src/app/globals.css +169 −0
  15. executor/apps/web/src/app/layout.tsx +49 −0
  16. executor/apps/web/src/app/page.tsx +10 −0
  17. executor/apps/web/src/app/tasks/page.tsx +13 −0
  18. executor/apps/web/src/app/tools/page.tsx +10 −0
  19. executor/apps/web/src/components/app-shell.tsx +167 −0
  20. executor/apps/web/src/components/approvals-view.tsx +213 −0
  21. executor/apps/web/src/components/code-editor.tsx +361 −0
  22. executor/apps/web/src/components/dashboard-view.tsx +305 −0
  23. executor/apps/web/src/components/page-header.tsx +21 −0
  24. executor/apps/web/src/components/status-badge.tsx +87 −0
  25. executor/apps/web/src/components/tasks-view.tsx +499 −0
  26. executor/apps/web/src/components/tools-view.tsx +525 −0
  27. executor/apps/web/src/components/ui/avatar.tsx +109 −0
  28. executor/apps/web/src/components/ui/badge.tsx +48 −0
  29. executor/apps/web/src/components/ui/button.tsx +64 −0
  30. executor/apps/web/src/components/ui/card.tsx +92 −0
  31. executor/apps/web/src/components/ui/dialog.tsx +158 −0
  32. executor/apps/web/src/components/ui/dropdown-menu.tsx +257 −0
  33. executor/apps/web/src/components/ui/input.tsx +21 −0
  34. executor/apps/web/src/components/ui/label.tsx +24 −0
  35. executor/apps/web/src/components/ui/scroll-area.tsx +58 −0
  36. executor/apps/web/src/components/ui/select.tsx +190 −0
  37. executor/apps/web/src/components/ui/separator.tsx +28 −0
  38. executor/apps/web/src/components/ui/sheet.tsx +143 −0
  39. executor/apps/web/src/components/ui/skeleton.tsx +13 −0
  40. executor/apps/web/src/components/ui/sonner.tsx +40 −0
  41. executor/apps/web/src/components/ui/switch.tsx +35 −0
  42. executor/apps/web/src/components/ui/tabs.tsx +91 −0
  43. executor/apps/web/src/components/ui/textarea.tsx +18 −0
  44. executor/apps/web/src/components/ui/tooltip.tsx +57 −0
  45. executor/apps/web/src/hooks/use-poll.ts +53 −0
  46. executor/apps/web/src/lib/api.ts +249 −0
  47. executor/apps/web/src/lib/session-context.tsx +68 −0
  48. executor/apps/web/src/lib/types.ts +141 −0
  49. executor/apps/web/src/lib/utils.ts +6 −0
  50. executor/apps/web/src/main.ts +0 −643
  51. executor/apps/web/src/styles.css +0 −651
  52. executor/apps/web/tsconfig.json +34 −0
  53. executor/bun.lock +1496 −118
  54. executor/package.json +2 −0
executor/apps/server/src/index.ts+5−4
@@ -1,4 +1,3 @@
1−import webApp from "../../web/index.html";
21 import { ExecutorDatabase } from "./database";
32 import { TaskEventHub } from "./events";
43 import { LocalBunRuntime } from "./runtimes/local-bun-runtime";
@@ -48,7 +47,10 @@ const toolSourceConfigs = (() => { · 43 unmodified lines
4847 }
4948 })();
5049
51−const externalTools = await loadExternalTools(toolSourceConfigs);
50+const { tools: externalTools, warnings: externalToolWarnings } = await loadExternalTools(toolSourceConfigs);
51+if (externalToolWarnings.length > 0) {
52+ for (const w of externalToolWarnings) console.warn(`[executor] ${w}`);
53+}
5254 const tools = [...DEFAULT_TOOLS, ...externalTools];
5355
5456 const service = new ExecutorService(new ExecutorDatabase(), new TaskEventHub(), [
@@ -63,7 +65,7 @@ const service = new ExecutorService(new ExecutorDatabase(), new TaskEventHub(), · 8 unmodified lines
6365 const jsonHeaders = {
6466 "content-type": "application/json; charset=utf-8",
6567 "access-control-allow-origin": "*",
66− "access-control-allow-methods": "GET,POST,OPTIONS",
68+ "access-control-allow-methods": "GET,POST,DELETE,OPTIONS",
6769 "access-control-allow-headers": "content-type",
6870 };
6971
@@ -171,7 +173,6 @@ function createTaskEventsResponse(taskId: string): Response { · 101 unmodified lines
171173 const server = Bun.serve({
172174 port,
173175 routes: {
174− "/": webApp,
175176 "/api/health": {
176177 GET: () => json({ ok: true, tools: service.getBaseToolCount() }),
177178 },
executor/apps/server/src/service.ts+8−2
@@ -109,6 +109,7 @@ export class ExecutorService { · 108 unmodified lines
109109 string,
110110 { signature: string; loadedAt: number; tools: Map<string, ToolDefinition> }
111111 >();
112+ private readonly workspaceToolLoadWarnings = new Map<string, string[]>();
112113 private readonly inFlightTaskIds = new Set<string>();
113114 private readonly approvalWaiters = new Map<string, ApprovalWaiter>();
114115
@@ -224,7 +225,8 @@ export class ExecutorService { · 109 unmodified lines
224225 const source = this.db.upsertToolSource(input);
225226 this.workspaceToolCache.delete(source.workspaceId);
226227 await this.getWorkspaceTools(source.workspaceId);
227− return source;
228+ const warnings = this.workspaceToolLoadWarnings.get(source.workspaceId) ?? [];
229+ return { ...source, warnings };
228230 }
229231
230232 async deleteToolSource(workspaceId: string, sourceId: string): Promise<boolean> {
@@ -472,16 +474,20 @@ export class ExecutorService { · 241 unmodified lines
472474 }
473475
474476 const configs: ExternalToolSourceConfig[] = [];
477+ const warnings: string[] = [];
475478 for (const source of sources) {
476479 try {
477480 configs.push(normalizeExternalToolSource(source));
478481 } catch (error) {
479482 const message = error instanceof Error ? error.message : String(error);
483+ warnings.push(`Source '${source.name}': ${message}`);
480484 console.warn(`[executor] skipping invalid source ${source.id}: ${message}`);
481485 }
482486 }
483487
484− const externalTools = await loadExternalTools(configs);
488+ const { tools: externalTools, warnings: loadWarnings } = await loadExternalTools(configs);
489+ warnings.push(...loadWarnings);
490+ this.workspaceToolLoadWarnings.set(workspaceId, warnings);
485491
486492 const merged = new Map<string, ToolDefinition>();
487493 for (const tool of this.baseTools.values()) {
executor/apps/server/src/tool-sources.ts+3−1
@@ -413,6 +413,7 @@ export function parseToolSourcesFromEnv(raw: string | undefined): ExternalToolSo · 412 unmodified lines
413413
414414 export async function loadExternalTools(sources: ExternalToolSourceConfig[]): Promise<ToolDefinition[]> {
415415 const loaded: ToolDefinition[] = [];
416+ const warnings: string[] = [];
416417
417418 for (const source of sources) {
418419 try {
@@ -423,9 +424,10 @@ export async function loadExternalTools(sources: ExternalToolSourceConfig[]): Pr · 4 unmodified lines
423424 }
424425 } catch (error) {
425426 const message = error instanceof Error ? error.message : String(error);
427+ warnings.push(`Failed to load ${source.type} source '${source.name}': ${message}`);
426428 console.warn(`[executor] failed to load tool source ${source.type}:${source.name}: ${message}`);
427429 }
428430 }
429431
430− return loaded;
432+ return { tools: loaded, warnings };
431433 }
executor/apps/web/.gitignore+41−0
@@ -0,0 +1,41 @@
1+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+# dependencies
4+/node_modules
5+/.pnp
6+.pnp.*
7+.yarn/*
8+!.yarn/patches
9+!.yarn/plugins
10+!.yarn/releases
11+!.yarn/versions
12+
13+# testing
14+/coverage
15+
16+# next.js
17+/.next/
18+/out/
19+
20+# production
21+/build
22+
23+# misc
24+.DS_Store
25+*.pem
26+
27+# debug
28+npm-debug.log*
29+yarn-debug.log*
30+yarn-error.log*
31+.pnpm-debug.log*
32+
33+# env files (can opt-in for committing if needed)
34+.env*
35+
36+# vercel
37+.vercel
38+
39+# typescript
40+*.tsbuildinfo
41+next-env.d.ts
executor/apps/web/README.md+36−0
@@ -0,0 +1,36 @@
1+This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
2+
3+## Getting Started
4+
5+First, run the development server:
6+
7+```bash
8+npm run dev
9+# or
10+yarn dev
11+# or
12+pnpm dev
13+# or
14+bun dev
15+```
16+
17+Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18+
19+You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20+
21+This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
22+
23+## Learn More
24+
25+To learn more about Next.js, take a look at the following resources:
26+
27+- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28+- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29+
30+You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
31+
32+## Deploy on Vercel
33+
34+The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35+
36+Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
executor/apps/web/components.json+23−0
@@ -0,0 +1,23 @@
1+{
2+ "$schema": "https://ui.shadcn.com/schema.json",
3+ "style": "new-york",
4+ "rsc": true,
5+ "tsx": true,
6+ "tailwind": {
7+ "config": "",
8+ "css": "src/app/globals.css",
9+ "baseColor": "neutral",
10+ "cssVariables": true,
11+ "prefix": ""
12+ },
13+ "iconLibrary": "lucide",
14+ "rtl": false,
15+ "aliases": {
16+ "components": "@/components",
17+ "utils": "@/lib/utils",
18+ "ui": "@/components/ui",
19+ "lib": "@/lib",
20+ "hooks": "@/hooks"
21+ },
22+ "registries": {}
23+}
executor/apps/web/eslint.config.mjs+18−0
@@ -0,0 +1,18 @@
1+import { defineConfig, globalIgnores } from "eslint/config";
2+import nextVitals from "eslint-config-next/core-web-vitals";
3+import nextTs from "eslint-config-next/typescript";
4+
5+const eslintConfig = defineConfig([
6+ ...nextVitals,
7+ ...nextTs,
8+ // Override default ignores of eslint-config-next.
9+ globalIgnores([
10+ // Default ignores of eslint-config-next:
11+ ".next/**",
12+ "out/**",
13+ "build/**",
14+ "next-env.d.ts",
15+ ]),
16+]);
17+
18+export default eslintConfig;
executor/apps/web/index.html+0−176
@@ -1,176 +0,0 @@
1−<!doctype html>
2−<html lang="en">
3− <head>
4− <meta charset="utf-8" />
5− <meta name="viewport" content="width=device-width, initial-scale=1" />
6− <title>Executor Control Plane</title>
7− <link rel="stylesheet" href="./src/styles.css" />
8− </head>
9− <body>
10− <div class="background-glow glow-one"></div>
11− <div class="background-glow glow-two"></div>
12− <div class="grain-overlay"></div>
13− <main class="layout">
14− <header class="hero">
15− <p class="eyebrow">Executor / Control Room</p>
16− <h1>Approval-First Runtime Console</h1>
17− <p>Run generated code, intercept sensitive tool calls, and approve each action with full traceability.</p>
18− <div class="context-strip" id="context-strip">
19− <div class="context-item">
20− <span>Workspace</span>
21− <strong id="context-workspace">-</strong>
22− </div>
23− <div class="context-item">
24− <span>Actor</span>
25− <strong id="context-actor">-</strong>
26− </div>
27− <div class="context-item">
28− <span>Session</span>
29− <strong id="context-session">-</strong>
30− </div>
31− <button id="reset-session-button" class="secondary" type="button">New anonymous workspace</button>
32− </div>
33− <div class="hero-metrics">
34− <article class="metric-card">
35− <span>Pending approvals</span>
36− <strong id="metric-pending">0</strong>
37− </article>
38− <article class="metric-card">
39− <span>Total tasks</span>
40− <strong id="metric-total-tasks">0</strong>
41− </article>
42− <article class="metric-card">
43− <span>Active runs</span>
44− <strong id="metric-running">0</strong>
45− </article>
46− </div>
47− </header>
48−
49− <section class="panel composer-panel" id="new-task-panel">
50− <div class="section-title">
51− <h2>Queue task</h2>
52− <p class="section-note">Generated JavaScript can call <code>tools.*</code>. Required tools pause for approval.</p>
53− </div>
54− <form id="new-task-form">
55− <div class="form-top-grid">
56− <label>
57− Runtime target
58− <select id="runtime-id"></select>
59− </label>
60− <label>
61− Timeout (ms)
62− <input id="timeout-ms" type="number" min="100" value="15000" />
63− </label>
64− </div>
65− <label>
66− Code payload
67− <textarea
68− id="task-code"
69− spellcheck="false"
70− rows="10"
71− >const now = await tools.utils.get_time({});
72−console.log("time", now.iso);
73−
74−await tools.admin.send_announcement({
75− channel: "ops",
76− message: "Deploy candidate ready for review"
77−});
78−
79−const sum = await tools.math.add({ a: 2, b: 5 });
80−console.log("sum", sum.result);</textarea>
81− </label>
82− <div class="composer-actions">
83− <button type="submit">Create task</button>
84− </div>
85− </form>
86− </section>
87−
88− <section class="panel" id="sources-panel">
89− <div class="section-title">
90− <h2>Tool sources</h2>
91− <p class="section-note">Attach MCP or OpenAPI sources to this workspace.</p>
92− </div>
93− <form id="source-form" class="source-form">
94− <div class="source-grid">
95− <label>
96− Source type
97− <select id="source-type">
98− <option value="mcp">MCP server</option>
99− <option value="openapi">OpenAPI server</option>
100− </select>
101− </label>
102− <label>
103− Source name
104− <input id="source-name" type="text" placeholder="billing" />
105− </label>
106− </div>
107− <label>
108− Endpoint / spec URL
109− <input id="source-url" type="url" placeholder="https://example.com/mcp or openapi.json" />
110− </label>
111− <label id="openapi-base-url-wrap">
112− OpenAPI base URL (optional)
113− <input id="openapi-base-url" type="url" placeholder="https://api.example.com" />
114− </label>
115− <div class="source-grid" id="openapi-auth-grid">
116− <label>
117− OpenAPI auth mode
118− <select id="openapi-auth-mode">
119− <option value="none">No auth</option>
120− <option value="static-bearer">Static bearer token</option>
121− <option value="static-api-key">Static API key</option>
122− <option value="workspace-bearer">Workspace shared bearer</option>
123− <option value="actor-bearer">Per-actor bearer (BYO)</option>
124− <option value="workspace-api-key">Workspace shared API key</option>
125− <option value="actor-api-key">Per-actor API key (BYO)</option>
126− </select>
127− </label>
128− <label>
129− API key header (optional)
130− <input id="openapi-api-key-header" type="text" placeholder="x-api-key" />
131− </label>
132− </div>
133− <label id="openapi-static-token-wrap">
134− Static token / key value
135− <input id="openapi-static-token" type="password" placeholder="only for static mode" />
136− </label>
137− <div class="composer-actions">
138− <button type="submit">Add source</button>
139− </div>
140− </form>
141− <div id="tool-sources-list" class="source-list"></div>
142− </section>
143−
144− <section class="panel" id="inventory-panel">
145− <div class="section-title">
146− <h2>Workspace tool inventory</h2>
147− <span id="tool-count" class="pill">0</span>
148− </div>
149− <div id="tool-inventory-list" class="inventory-list"></div>
150− </section>
151−
152− <section class="panel" id="approvals-panel" aria-live="polite">
153− <div class="section-title">
154− <h2>Pending tool approvals</h2>
155− <span id="approval-count" class="pill">0</span>
156− </div>
157− <div id="approvals-list" class="approval-list"></div>
158− </section>
159−
160− <section class="panel" id="tasks-panel">
161− <div class="section-title">
162− <h2>Task history</h2>
163− <button id="refresh-button" class="secondary">Refresh</button>
164− </div>
165− <div id="tasks-list" class="task-list"></div>
166− </section>
167−
168− <section class="panel" id="task-detail-panel">
169− <h2>Task details</h2>
170− <div id="task-detail" class="task-detail empty">Select a task to inspect logs.</div>
171− </section>
172− </main>
173−
174− <script type="module" src="./src/main.ts"></script>
175− </body>
176−</html>
executor/apps/web/next.config.ts+14−0
@@ -0,0 +1,14 @@
1+import type { NextConfig } from "next";
2+
3+const nextConfig: NextConfig = {
4+ async rewrites() {
5+ return [
6+ {
7+ source: "/api/:path*",
8+ destination: "http://localhost:4001/api/:path*",
9+ },
10+ ];
11+ },
12+};
13+
14+export default nextConfig;
executor/apps/web/package.json+42−1
@@ -1,5 +1,46 @@
11 {
22 "name": "@executor/web",
3+ "version": "0.1.0",
34 "private": true,
4− "type": "module"
5+ "scripts": {
6+ "dev": "next dev",
7+ "build": "next build",
8+ "start": "next start",
9+ "lint": "eslint"
10+ },
11+ "dependencies": {
12+ "@monaco-editor/react": "^4.7.0",
13+ "class-variance-authority": "^0.7.1",
14+ "clsx": "^2.1.1",
15+ "lucide-react": "^0.563.0",
16+ "monaco-editor": "^0.55.1",
17+ "next": "16.1.6",
18+ "next-themes": "^0.4.6",
19+ "radix-ui": "^1.4.3",
20+ "react": "19.2.3",
21+ "react-dom": "19.2.3",
22+ "sonner": "^2.0.7",
23+ "tailwind-merge": "^3.4.0",
24+ "tldts": "^7.0.22"
25+ },
26+ "devDependencies": {
27+ "@tailwindcss/postcss": "^4",
28+ "@types/node": "^20",
29+ "@types/react": "^19",
30+ "@types/react-dom": "^19",
31+ "eslint": "^9",
32+ "eslint-config-next": "16.1.6",
33+ "shadcn": "^3.8.4",
34+ "tailwindcss": "^4",
35+ "tw-animate-css": "^1.4.0",
36+ "typescript": "^5"
37+ },
38+ "ignoreScripts": [
39+ "sharp",
40+ "unrs-resolver"
41+ ],
42+ "trustedDependencies": [
43+ "sharp",
44+ "unrs-resolver"
45+ ]
546 }
executor/apps/web/postcss.config.mjs+7−0
@@ -0,0 +1,7 @@
1+const config = {
2+ plugins: {
3+ "@tailwindcss/postcss": {},
4+ },
5+};
6+
7+export default config;
executor/apps/web/src/app/approvals/page.tsx+10−0
@@ -0,0 +1,10 @@
1+import { AppShell } from "@/components/app-shell";
2+import { ApprovalsView } from "@/components/approvals-view";
3+
4+export default function ApprovalsPage() {
5+ return (
6+ <AppShell>
7+ <ApprovalsView />
8+ </AppShell>
9+ );
10+}
executor/apps/web/src/app/favicon.ico+0−0

Binary file not shown.

executor/apps/web/src/app/globals.css+169−0
@@ -0,0 +1,169 @@
1+@import "tailwindcss";
2+@import "tw-animate-css";
3+@import "shadcn/tailwind.css";
4+
5+@custom-variant dark (&:is(.dark *));
6+
7+@theme inline {
8+ --color-background: var(--background);
9+ --color-foreground: var(--foreground);
10+ --font-sans: var(--font-geist-sans);
11+ --font-mono: var(--font-geist-mono);
12+ --color-sidebar-ring: var(--sidebar-ring);
13+ --color-sidebar-border: var(--sidebar-border);
14+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
15+ --color-sidebar-accent: var(--sidebar-accent);
16+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
17+ --color-sidebar-primary: var(--sidebar-primary);
18+ --color-sidebar-foreground: var(--sidebar-foreground);
19+ --color-sidebar: var(--sidebar);
20+ --color-chart-5: var(--chart-5);
21+ --color-chart-4: var(--chart-4);
22+ --color-chart-3: var(--chart-3);
23+ --color-chart-2: var(--chart-2);
24+ --color-chart-1: var(--chart-1);
25+ --color-ring: var(--ring);
26+ --color-input: var(--input);
27+ --color-border: var(--border);
28+ --color-destructive: var(--destructive);
29+ --color-accent-foreground: var(--accent-foreground);
30+ --color-accent: var(--accent);
31+ --color-muted-foreground: var(--muted-foreground);
32+ --color-muted: var(--muted);
33+ --color-secondary-foreground: var(--secondary-foreground);
34+ --color-secondary: var(--secondary);
35+ --color-primary-foreground: var(--primary-foreground);
36+ --color-primary: var(--primary);
37+ --color-popover-foreground: var(--popover-foreground);
38+ --color-popover: var(--popover);
39+ --color-card-foreground: var(--card-foreground);
40+ --color-card: var(--card);
41+ --radius-sm: calc(var(--radius) - 4px);
42+ --radius-md: calc(var(--radius) - 2px);
43+ --radius-lg: var(--radius);
44+ --radius-xl: calc(var(--radius) + 4px);
45+ --radius-2xl: calc(var(--radius) + 8px);
46+ --radius-3xl: calc(var(--radius) + 12px);
47+ --radius-4xl: calc(var(--radius) + 16px);
48+ --color-terminal-green: oklch(0.75 0.18 155);
49+ --color-terminal-amber: oklch(0.78 0.16 75);
50+ --color-terminal-red: oklch(0.65 0.22 25);
51+ --color-terminal-cyan: oklch(0.75 0.12 200);
52+ --color-surface-raised: var(--card);
53+}
54+
55+:root {
56+ --radius: 0.5rem;
57+ --background: oklch(0.11 0.005 260);
58+ --foreground: oklch(0.88 0.01 250);
59+ --card: oklch(0.15 0.005 260);
60+ --card-foreground: oklch(0.88 0.01 250);
61+ --popover: oklch(0.15 0.005 260);
62+ --popover-foreground: oklch(0.88 0.01 250);
63+ --primary: oklch(0.75 0.18 155);
64+ --primary-foreground: oklch(0.13 0.01 155);
65+ --secondary: oklch(0.2 0.008 260);
66+ --secondary-foreground: oklch(0.75 0.01 250);
67+ --muted: oklch(0.18 0.005 260);
68+ --muted-foreground: oklch(0.55 0.01 250);
69+ --accent: oklch(0.2 0.01 260);
70+ --accent-foreground: oklch(0.88 0.01 250);
71+ --destructive: oklch(0.65 0.22 25);
72+ --border: oklch(0.24 0.008 260);
73+ --input: oklch(0.2 0.008 260);
74+ --ring: oklch(0.75 0.18 155);
75+ --chart-1: oklch(0.75 0.18 155);
76+ --chart-2: oklch(0.78 0.16 75);
77+ --chart-3: oklch(0.75 0.12 200);
78+ --chart-4: oklch(0.65 0.22 25);
79+ --chart-5: oklch(0.7 0.15 300);
80+ --sidebar: oklch(0.13 0.005 260);
81+ --sidebar-foreground: oklch(0.75 0.01 250);
82+ --sidebar-primary: oklch(0.75 0.18 155);
83+ --sidebar-primary-foreground: oklch(0.13 0.01 155);
84+ --sidebar-accent: oklch(0.18 0.008 260);
85+ --sidebar-accent-foreground: oklch(0.88 0.01 250);
86+ --sidebar-border: oklch(0.22 0.008 260);
87+ --sidebar-ring: oklch(0.75 0.18 155);
88+}
89+
90+@layer base {
91+ * {
92+ @apply border-border outline-ring/50;
93+ }
94+ body {
95+ @apply bg-background text-foreground;
96+ }
97+}
98+
99+/* Scrollbar styling */
100+::-webkit-scrollbar {
101+ width: 6px;
102+ height: 6px;
103+}
104+::-webkit-scrollbar-track {
105+ background: transparent;
106+}
107+::-webkit-scrollbar-thumb {
108+ background: oklch(0.3 0.005 260);
109+ border-radius: 3px;
110+}
111+::-webkit-scrollbar-thumb:hover {
112+ background: oklch(0.4 0.005 260);
113+}
114+
115+/* Terminal code blocks */
116+.terminal-block {
117+ background: oklch(0.09 0.005 260);
118+ border: 1px solid oklch(0.2 0.008 260);
119+ font-family: var(--font-geist-mono), ui-monospace, monospace;
120+ font-size: 0.8125rem;
121+ line-height: 1.6;
122+ padding: 1rem;
123+ border-radius: 0.375rem;
124+ overflow-x: auto;
125+ white-space: pre-wrap;
126+ word-break: break-all;
127+}
128+
129+/* Scanline effect on hero */
130+.scanline-overlay {
131+ pointer-events: none;
132+ position: absolute;
133+ inset: 0;
134+ background: repeating-linear-gradient(
135+ 0deg,
136+ transparent,
137+ transparent 2px,
138+ oklch(0 0 0 / 0.03) 2px,
139+ oklch(0 0 0 / 0.03) 4px
140+ );
141+}
142+
143+/* Glow effects */
144+.glow-green {
145+ box-shadow: 0 0 20px oklch(0.75 0.18 155 / 0.15), 0 0 60px oklch(0.75 0.18 155 / 0.05);
146+}
147+.glow-amber {
148+ box-shadow: 0 0 20px oklch(0.78 0.16 75 / 0.15), 0 0 60px oklch(0.78 0.16 75 / 0.05);
149+}
150+.glow-red {
151+ box-shadow: 0 0 20px oklch(0.65 0.22 25 / 0.15), 0 0 60px oklch(0.65 0.22 25 / 0.05);
152+}
153+
154+/* Pulse animation for pending indicators */
155+@keyframes pulse-dot {
156+ 0%, 100% { opacity: 1; }
157+ 50% { opacity: 0.4; }
158+}
159+.pulse-dot {
160+ animation: pulse-dot 2s ease-in-out infinite;
161+}
162+
163+/* Subtle grid background */
164+.grid-bg {
165+ background-image:
166+ linear-gradient(oklch(0.2 0.005 260 / 0.5) 1px, transparent 1px),
167+ linear-gradient(90deg, oklch(0.2 0.005 260 / 0.5) 1px, transparent 1px);
168+ background-size: 24px 24px;
169+}
executor/apps/web/src/app/layout.tsx+49−0
@@ -0,0 +1,49 @@
1+import type { Metadata } from "next";
2+import { JetBrains_Mono, Inter } from "next/font/google";
3+import { Toaster } from "sonner";
4+import { SessionProvider } from "@/lib/session-context";
5+import "./globals.css";
6+
7+const inter = Inter({
8+ variable: "--font-geist-sans",
9+ subsets: ["latin"],
10+});
11+
12+const jetbrainsMono = JetBrains_Mono({
13+ variable: "--font-geist-mono",
14+ subsets: ["latin"],
15+});
16+
17+export const metadata: Metadata = {
18+ title: "Executor Console",
19+ description: "Approval-first runtime console for AI-generated code execution",
20+};
21+
22+export default function RootLayout({
23+ children,
24+}: Readonly<{
25+ children: React.ReactNode;
26+}>) {
27+ return (
28+ <html lang="en" className="dark">
29+ <body
30+ className={`${inter.variable} ${jetbrainsMono.variable} antialiased`}
31+ >
32+ <SessionProvider>
33+ {children}
34+ </SessionProvider>
35+ <Toaster
36+ theme="dark"
37+ position="bottom-right"
38+ toastOptions={{
39+ style: {
40+ background: "oklch(0.15 0.005 260)",
41+ border: "1px solid oklch(0.24 0.008 260)",
42+ color: "oklch(0.88 0.01 250)",
43+ },
44+ }}
45+ />
46+ </body>
47+ </html>
48+ );
49+}
executor/apps/web/src/app/page.tsx+10−0
@@ -0,0 +1,10 @@
1+import { AppShell } from "@/components/app-shell";
2+import { DashboardView } from "@/components/dashboard-view";
3+
4+export default function DashboardPage() {
5+ return (
6+ <AppShell>
7+ <DashboardView />
8+ </AppShell>
9+ );
10+}
executor/apps/web/src/app/tasks/page.tsx+13−0
@@ -0,0 +1,13 @@
1+import { Suspense } from "react";
2+import { AppShell } from "@/components/app-shell";
3+import { TasksView } from "@/components/tasks-view";
4+
5+export default function TasksPage() {
6+ return (
7+ <AppShell>
8+ <Suspense>
9+ <TasksView />
10+ </Suspense>
11+ </AppShell>
12+ );
13+}
executor/apps/web/src/app/tools/page.tsx+10−0
@@ -0,0 +1,10 @@
1+import { AppShell } from "@/components/app-shell";
2+import { ToolsView } from "@/components/tools-view";
3+
4+export default function ToolsPage() {
5+ return (
6+ <AppShell>
7+ <ToolsView />
8+ </AppShell>
9+ );
10+}
executor/apps/web/src/components/app-shell.tsx+167−0
@@ -0,0 +1,167 @@
1+"use client";
2+
3+import { useState } from "react";
4+import Link from "next/link";
5+import { usePathname } from "next/navigation";
6+import {
7+ LayoutDashboard,
8+ Play,
9+ ShieldCheck,
10+ Wrench,
11+ Menu,
12+ X,
13+ Terminal,
14+ RotateCcw,
15+} from "lucide-react";
16+import { Button } from "@/components/ui/button";
17+import { Sheet, SheetContent, SheetTrigger, SheetTitle } from "@/components/ui/sheet";
18+import { Separator } from "@/components/ui/separator";
19+import { useSession } from "@/lib/session-context";
20+import { cn } from "@/lib/utils";
21+
22+const NAV_ITEMS = [
23+ { href: "/", label: "Dashboard", icon: LayoutDashboard },
24+ { href: "/tasks", label: "Tasks", icon: Play },
25+ { href: "/approvals", label: "Approvals", icon: ShieldCheck },
26+ { href: "/tools", label: "Tools", icon: Wrench },
27+];
28+
29+function NavLinks({ onClick }: { onClick?: () => void }) {
30+ const pathname = usePathname();
31+
32+ return (
33+ <nav className="flex flex-col gap-1">
34+ {NAV_ITEMS.map((item) => {
35+ const isActive =
36+ item.href === "/"
37+ ? pathname === "/"
38+ : pathname.startsWith(item.href);
39+ return (
40+ <Link
41+ key={item.href}
42+ href={item.href}
43+ onClick={onClick}
44+ className={cn(
45+ "flex items-center gap-3 px-3 py-2.5 rounded-md text-sm font-medium transition-colors",
46+ isActive
47+ ? "bg-primary/10 text-primary"
48+ : "text-muted-foreground hover:text-foreground hover:bg-accent",
49+ )}
50+ >
51+ <item.icon className="h-4 w-4 shrink-0" />
52+ {item.label}
53+ </Link>
54+ );
55+ })}
56+ </nav>
57+ );
58+}
59+
60+function SessionInfo() {
61+ const { context, loading, resetWorkspace } = useSession();
62+
63+ if (loading || !context) return null;
64+
65+ return (
66+ <div className="px-3 space-y-3">
67+ <Separator />
68+ <div className="space-y-2">
69+ <div className="flex items-center justify-between">
70+ <span className="text-[10px] font-mono uppercase tracking-widest text-muted-foreground">
71+ Session
72+ </span>
73+ <Button
74+ variant="ghost"
75+ size="icon"
76+ className="h-5 w-5 text-muted-foreground hover:text-foreground"
77+ onClick={resetWorkspace}
78+ title="Reset workspace"
79+ >
80+ <RotateCcw className="h-3 w-3" />
81+ </Button>
82+ </div>
83+ <div className="space-y-1">
84+ <div className="flex items-center gap-2">
85+ <div className="h-1.5 w-1.5 rounded-full bg-terminal-green pulse-dot" />
86+ <span className="text-[11px] font-mono text-muted-foreground truncate">
87+ {context.workspaceId}
88+ </span>
89+ </div>
90+ <span className="text-[11px] font-mono text-muted-foreground/60 block pl-3.5 truncate">
91+ {context.actorId}
92+ </span>
93+ </div>
94+ </div>
95+ </div>
96+ );
97+}
98+
99+function Sidebar() {
100+ return (
101+ <aside className="hidden md:flex md:w-56 lg:w-60 flex-col border-r border-border bg-sidebar h-screen sticky top-0">
102+ <div className="flex items-center gap-2.5 px-4 h-14 border-b border-border shrink-0">
103+ <div className="flex items-center justify-center h-7 w-7 rounded bg-primary/15 text-primary">
104+ <Terminal className="h-4 w-4" />
105+ </div>
106+ <span className="font-semibold text-sm tracking-tight">Executor</span>
107+ </div>
108+ <div className="flex-1 overflow-y-auto py-4 px-2">
109+ <NavLinks />
110+ </div>
111+ <div className="pb-4">
112+ <SessionInfo />
113+ </div>
114+ </aside>
115+ );
116+}
117+
118+function MobileHeader() {
119+ const [open, setOpen] = useState(false);
120+
121+ return (
122+ <header className="md:hidden flex items-center justify-between h-14 px-4 border-b border-border bg-sidebar sticky top-0 z-50">
123+ <div className="flex items-center gap-2.5">
124+ <div className="flex items-center justify-center h-7 w-7 rounded bg-primary/15 text-primary">
125+ <Terminal className="h-4 w-4" />
126+ </div>
127+ <span className="font-semibold text-sm tracking-tight">Executor</span>
128+ </div>
129+ <Sheet open={open} onOpenChange={setOpen}>
130+ <SheetTrigger asChild>
131+ <Button variant="ghost" size="icon" className="h-8 w-8">
132+ {open ? <X className="h-4 w-4" /> : <Menu className="h-4 w-4" />}
133+ </Button>
134+ </SheetTrigger>
135+ <SheetContent side="left" className="w-64 bg-sidebar p-0">
136+ <SheetTitle className="sr-only">Navigation</SheetTitle>
137+ <div className="flex items-center gap-2.5 px-4 h-14 border-b border-border">
138+ <div className="flex items-center justify-center h-7 w-7 rounded bg-primary/15 text-primary">
139+ <Terminal className="h-4 w-4" />
140+ </div>
141+ <span className="font-semibold text-sm tracking-tight">
142+ Executor
143+ </span>
144+ </div>
145+ <div className="py-4 px-2">
146+ <NavLinks onClick={() => setOpen(false)} />
147+ </div>
148+ <div className="mt-auto pb-4">
149+ <SessionInfo />
150+ </div>
151+ </SheetContent>
152+ </Sheet>
153+ </header>
154+ );
155+}
156+
157+export function AppShell({ children }: { children: React.ReactNode }) {
158+ return (
159+ <div className="flex min-h-screen">
160+ <Sidebar />
161+ <div className="flex-1 flex flex-col min-w-0">
162+ <MobileHeader />
163+ <main className="flex-1 p-4 md:p-6 lg:p-8">{children}</main>
164+ </div>
165+ </div>
166+ );
167+}
executor/apps/web/src/components/approvals-view.tsx+213−0
@@ -0,0 +1,213 @@
1+"use client";
2+
3+import { useState } from "react";
4+import {
5+ ShieldCheck,
6+ ShieldX,
7+ RefreshCw,
8+ CheckCircle2,
9+ Clock,
10+} from "lucide-react";
11+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
12+import { Button } from "@/components/ui/button";
13+import { Skeleton } from "@/components/ui/skeleton";
14+import { Separator } from "@/components/ui/separator";
15+import { PageHeader } from "@/components/page-header";
16+import { TaskStatusBadge } from "@/components/status-badge";
17+import { useSession } from "@/lib/session-context";
18+import { usePoll } from "@/hooks/use-poll";
19+import * as api from "@/lib/api";
20+import type { PendingApprovalRecord } from "@/lib/types";
21+import { toast } from "sonner";
22+
23+function formatTimeAgo(ts: number) {
24+ const diff = Date.now() - ts;
25+ if (diff < 60_000) return `${Math.floor(diff / 1000)}s ago`;
26+ if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;
27+ return `${Math.floor(diff / 3_600_000)}h ago`;
28+}
29+
30+function ApprovalCard({
31+ approval,
32+ onResolve,
33+}: {
34+ approval: PendingApprovalRecord;
35+ onResolve: () => void;
36+}) {
37+ const { context } = useSession();
38+ const [resolving, setResolving] = useState<"approved" | "denied" | null>(
39+ null,
40+ );
41+
42+ const handleResolve = async (decision: "approved" | "denied") => {
43+ if (!context) return;
44+ setResolving(decision);
45+ try {
46+ await api.resolveApproval(approval.id, {
47+ workspaceId: context.workspaceId,
48+ decision,
49+ reviewerId: context.actorId,
50+ });
51+ toast.success(
52+ decision === "approved"
53+ ? `Approved: ${approval.toolPath}`
54+ : `Denied: ${approval.toolPath}`,
55+ );
56+ onResolve();
57+ } catch (err) {
58+ toast.error(err instanceof Error ? err.message : "Failed to resolve");
59+ } finally {
60+ setResolving(null);
61+ }
62+ };
63+
64+ const inputStr = JSON.stringify(approval.input, null, 2);
65+
66+ return (
67+ <Card className="bg-card border-border border-l-2 border-l-terminal-amber glow-amber">
68+ <CardContent className="p-4 space-y-3">
69+ {/* Header */}
70+ <div className="flex items-start justify-between gap-3">
71+ <div className="min-w-0">
72+ <div className="flex items-center gap-2">
73+ <ShieldCheck className="h-4 w-4 text-terminal-amber shrink-0" />
74+ <span className="text-sm font-mono font-medium text-foreground truncate">
75+ {approval.toolPath}
76+ </span>
77+ </div>
78+ <div className="flex items-center gap-2 mt-1 pl-6">
79+ <span className="text-[11px] text-muted-foreground">
80+ Task: {approval.taskId}
81+ </span>
82+ <span className="text-[11px] text-muted-foreground">
83+ &middot;
84+ </span>
85+ <span className="text-[11px] text-muted-foreground">
86+ {formatTimeAgo(approval.createdAt)}
87+ </span>
88+ </div>
89+ </div>
90+ <TaskStatusBadge status={approval.task.status} />
91+ </div>
92+
93+ {/* Input */}
94+ {inputStr !== "null" && inputStr !== "{}" && (
95+ <div>
96+ <span className="text-[10px] uppercase tracking-widest text-muted-foreground block mb-1.5">
97+ Input
98+ </span>
99+ <pre className="terminal-block max-h-36 overflow-y-auto text-xs">
100+ {inputStr}
101+ </pre>
102+ </div>
103+ )}
104+
105+ <Separator />
106+
107+ {/* Actions */}
108+ <div className="flex items-center gap-2">
109+ <Button
110+ onClick={() => handleResolve("approved")}
111+ disabled={resolving !== null}
112+ className="flex-1 bg-terminal-green/15 text-terminal-green border border-terminal-green/30 hover:bg-terminal-green/25 h-9"
113+ variant="outline"
114+ size="sm"
115+ >
116+ <CheckCircle2 className="h-3.5 w-3.5 mr-1.5" />
117+ {resolving === "approved" ? "Approving..." : "Approve"}
118+ </Button>
119+ <Button
120+ onClick={() => handleResolve("denied")}
121+ disabled={resolving !== null}
122+ className="flex-1 bg-terminal-red/15 text-terminal-red border border-terminal-red/30 hover:bg-terminal-red/25 h-9"
123+ variant="outline"
124+ size="sm"
125+ >
126+ <ShieldX className="h-3.5 w-3.5 mr-1.5" />
127+ {resolving === "denied" ? "Denying..." : "Deny"}
128+ </Button>
129+ </div>
130+ </CardContent>
131+ </Card>
132+ );
133+}
134+
135+export function ApprovalsView() {
136+ const { context, loading: sessionLoading } = useSession();
137+
138+ const {
139+ data: approvals,
140+ loading: approvalsLoading,
141+ refresh,
142+ } = usePoll({
143+ fetcher: () => api.listPendingApprovals(context!.workspaceId),
144+ enabled: !!context,
145+ interval: 3000,
146+ });
147+
148+ if (sessionLoading) {
149+ return (
150+ <div className="space-y-6">
151+ <Skeleton className="h-8 w-48" />
152+ <div className="space-y-4">
153+ {Array.from({ length: 3 }).map((_, i) => (
154+ <Skeleton key={i} className="h-40" />
155+ ))}
156+ </div>
157+ </div>
158+ );
159+ }
160+
161+ const count = approvals?.length ?? 0;
162+
163+ return (
164+ <div className="space-y-6">
165+ <PageHeader
166+ title="Approvals"
167+ description="Review and approve pending tool calls"
168+ >
169+ <Button
170+ variant="outline"
171+ size="sm"
172+ className="h-8 text-xs"
173+ onClick={refresh}
174+ >
175+ <RefreshCw className="h-3.5 w-3.5 mr-1.5" />
176+ Refresh
177+ </Button>
178+ </PageHeader>
179+
180+ {approvalsLoading ? (
181+ <div className="space-y-4">
182+ {Array.from({ length: 3 }).map((_, i) => (
183+ <Skeleton key={i} className="h-40" />
184+ ))}
185+ </div>
186+ ) : count === 0 ? (
187+ <Card className="bg-card border-border">
188+ <CardContent className="flex flex-col items-center justify-center py-20 gap-3">
189+ <div className="h-12 w-12 rounded-full bg-terminal-green/10 flex items-center justify-center">
190+ <CheckCircle2 className="h-6 w-6 text-terminal-green/60" />
191+ </div>
192+ <p className="text-sm text-muted-foreground">
193+ No pending approvals
194+ </p>
195+ <p className="text-[11px] text-muted-foreground/60">
196+ Tool calls requiring approval will appear here
197+ </p>
198+ </CardContent>
199+ </Card>
200+ ) : (
201+ <div className="space-y-4 max-w-2xl">
202+ <div className="flex items-center gap-2 text-xs text-muted-foreground">
203+ <Clock className="h-3.5 w-3.5" />
204+ {count} pending approval{count !== 1 ? "s" : ""}
205+ </div>
206+ {approvals!.map((a) => (
207+ <ApprovalCard key={a.id} approval={a} onResolve={refresh} />
208+ ))}
209+ </div>
210+ )}
211+ </div>
212+ );
213+}
executor/apps/web/src/components/code-editor.tsx+361−0
@@ -0,0 +1,361 @@
1+"use client";
2+
3+import { useRef, useEffect, useCallback } from "react";
4+import Editor, { type OnMount, type BeforeMount, type Monaco } from "@monaco-editor/react";
5+import type { ToolDescriptor } from "@/lib/types";
6+
7+// ── Generate TypeScript declarations for the tools proxy ──
8+
9+interface NamespaceNode {
10+ children: Map<string, NamespaceNode>;
11+ tools: ToolDescriptor[];
12+}
13+
14+function buildTree(tools: ToolDescriptor[]): NamespaceNode {
15+ const root: NamespaceNode = { children: new Map(), tools: [] };
16+ for (const tool of tools) {
17+ const parts = tool.path.split(".");
18+ if (parts.length === 1) {
19+ root.tools.push(tool);
20+ } else {
21+ // Navigate/create namespace nodes for all segments except the last (which is the method name)
22+ let node = root;
23+ for (let i = 0; i < parts.length - 1; i++) {
24+ if (!node.children.has(parts[i])) {
25+ node.children.set(parts[i], { children: new Map(), tools: [] });
26+ }
27+ node = node.children.get(parts[i])!;
28+ }
29+ node.tools.push(tool);
30+ }
31+ }
32+ return root;
33+}
34+
35+function emitToolMethod(tool: ToolDescriptor): string {
36+ const funcName = tool.path.split(".").pop()!;
37+ const approvalNote =
38+ tool.approval === "required"
39+ ? " **Requires approval** - execution will pause until approved."
40+ : "";
41+ const desc = tool.description
42+ ? `${tool.description}${approvalNote}`
43+ : approvalNote || "Call this tool.";
44+
45+ return ` /**
46+ * ${desc}
47+ *${tool.source ? ` @source ${tool.source}` : ""}
48+ */
49+ ${funcName}(input?: Record<string, unknown>): Promise<Record<string, unknown>>;`;
50+}
51+
52+function emitNamespaceInterface(
53+ name: string,
54+ node: NamespaceNode,
55+ out: string[],
56+): void {
57+ // First, recursively emit child namespace interfaces
58+ for (const [childName, childNode] of node.children) {
59+ emitNamespaceInterface(`${name}_${childName}`, childNode, out);
60+ }
61+
62+ // Build this namespace's interface
63+ const members: string[] = [];
64+
65+ // Add child namespace accessors
66+ for (const [childName, childNode] of node.children) {
67+ const toolCount =
68+ childNode.tools.length + countAllTools(childNode);
69+ members.push(` /** ${toolCount} tool${toolCount !== 1 ? "s" : ""} in the \`${childName}\` namespace */
70+ readonly ${childName}: ToolNS_${name}_${childName};`);
71+ }
72+
73+ // Add tool methods
74+ for (const tool of node.tools) {
75+ members.push(emitToolMethod(tool));
76+ }
77+
78+ out.push(`interface ToolNS_${name} {\n${members.join("\n\n")}\n}`);
79+}
80+
81+function countAllTools(node: NamespaceNode): number {
82+ let count = node.tools.length;
83+ for (const child of node.children.values()) {
84+ count += countAllTools(child);
85+ }
86+ return count;
87+}
88+
89+function generateToolsDts(tools: ToolDescriptor[]): string {
90+ const root = buildTree(tools);
91+
92+ const interfaces: string[] = [];
93+
94+ // Emit all namespace interfaces recursively
95+ for (const [name, node] of root.children) {
96+ emitNamespaceInterface(name, node, interfaces);
97+ }
98+
99+ // Build root ToolsProxy interface
100+ const rootMembers: string[] = [];
101+
102+ // Root-level namespace accessors
103+ for (const [name] of root.children) {
104+ rootMembers.push(` readonly ${name}: ToolNS_${name};`);
105+ }
106+
107+ // Root-level tools (rare but possible)
108+ for (const tool of root.tools) {
109+ rootMembers.push(emitToolMethod(tool));
110+ }
111+
112+ let dts = `
113+/**
114+ * The \`tools\` object is a proxy that lets you call registered executor tools.
115+ * Each call returns a Promise with the tool's result.
116+ * Tools marked with "approval: required" will pause execution until approved.
117+ */
118+`;
119+ dts += interfaces.join("\n\n") + "\n\n";
120+ dts += `interface ToolsProxy {\n${rootMembers.join("\n\n")}\n}\n\n`;
121+ dts += `declare const tools: ToolsProxy;\n`;
122+
123+ return dts;
124+}
125+
126+// ── Base environment declarations ──
127+// These provide types for the executor runtime environment
128+// (console, setTimeout, etc.) since we don't include the full DOM lib.
129+
130+const BASE_ENVIRONMENT_DTS = `
131+interface Console {
132+ /** Log output to stdout (visible in task detail). */
133+ log(...args: any[]): void;
134+ /** Log output to stderr (visible in task detail). */
135+ error(...args: any[]): void;
136+ /** Log a warning to stderr. */
137+ warn(...args: any[]): void;
138+ info(...args: any[]): void;
139+ debug(...args: any[]): void;
140+}
141+declare var console: Console;
142+
143+declare function setTimeout(callback: (...args: any[]) => void, ms?: number, ...args: any[]): number;
144+declare function clearTimeout(id: number): void;
145+declare function setInterval(callback: (...args: any[]) => void, ms?: number, ...args: any[]): number;
146+declare function clearInterval(id: number): void;
147+`;
148+
149+interface CodeEditorProps {
150+ value: string;
151+ onChange: (value: string) => void;
152+ tools: ToolDescriptor[];
153+ className?: string;
154+ height?: string;
155+}
156+
157+export function CodeEditor({
158+ value,
159+ onChange,
160+ tools,
161+ className,
162+ height = "240px",
163+}: CodeEditorProps) {
164+ const editorRef = useRef<Parameters<OnMount>[0] | null>(null);
165+ const monacoRef = useRef<Monaco | null>(null);
166+ const extraLibDisposables = useRef<{ dispose: () => void }[]>([]);
167+
168+ const updateToolTypes = useCallback(
169+ (monaco: Monaco) => {
170+ // Dispose old extra libs
171+ for (const d of extraLibDisposables.current) d.dispose();
172+ extraLibDisposables.current = [];
173+
174+ const dts = generateToolsDts(tools);
175+
176+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
177+ const ts = (monaco.languages as any).typescript;
178+ extraLibDisposables.current.push(
179+ ts.javascriptDefaults.addExtraLib(BASE_ENVIRONMENT_DTS, "ts:env.d.ts"),
180+ ts.javascriptDefaults.addExtraLib(dts, "ts:tools.d.ts"),
181+ );
182+ },
183+ [tools],
184+ );
185+
186+ // Update types when tools change
187+ useEffect(() => {
188+ if (monacoRef.current) {
189+ updateToolTypes(monacoRef.current);
190+ }
191+ }, [tools, updateToolTypes]);
192+
193+ // Clean up on unmount
194+ useEffect(() => {
195+ return () => {
196+ for (const d of extraLibDisposables.current) d.dispose();
197+ };
198+ }, []);
199+
200+ const handleBeforeMount: BeforeMount = (monaco) => {
201+ monacoRef.current = monaco;
202+
203+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
204+ const ts = (monaco.languages as any).typescript;
205+
206+ // Configure JavaScript/TypeScript defaults for our execution environment
207+ // Code runs inside an AsyncFunction body so top-level await is valid
208+ // and there are no imports/exports.
209+ ts.javascriptDefaults.setDiagnosticsOptions({
210+ noSemanticValidation: false,
211+ noSyntaxValidation: false,
212+ diagnosticCodesToIgnore: [
213+ 1375, // 'await' expressions are only allowed at the top level of a file when that file is a module
214+ 1378, // Top-level 'await' expressions are only allowed when the 'module' option is set to 'es2022'...
215+ 2307, // Cannot find module
216+ 80005, // 'require' call may be converted to an import
217+ ],
218+ });
219+
220+ ts.javascriptDefaults.setCompilerOptions({
221+ target: ts.ScriptTarget.ESNext,
222+ module: ts.ModuleKind.ESNext,
223+ moduleResolution: ts.ModuleResolutionKind.NodeJs,
224+ allowNonTsExtensions: true,
225+ checkJs: true,
226+ strict: false,
227+ noEmit: true,
228+ allowJs: true,
229+ lib: ["esnext"],
230+ });
231+
232+ // Add our tools type declarations
233+ updateToolTypes(monaco);
234+
235+ // Define the dark theme matching our UI
236+ monaco.editor.defineTheme("executor-dark", {
237+ base: "vs-dark",
238+ inherit: true,
239+ rules: [
240+ { token: "comment", foreground: "5a6370", fontStyle: "italic" },
241+ { token: "keyword", foreground: "6bdfb8" },
242+ { token: "string", foreground: "c4a46c" },
243+ { token: "number", foreground: "c4a46c" },
244+ { token: "type", foreground: "6bdfb8" },
245+ { token: "function", foreground: "dcdcaa" },
246+ { token: "variable", foreground: "c8ccd4" },
247+ { token: "operator", foreground: "8a93a5" },
248+ ],
249+ colors: {
250+ "editor.background": "#0f1117",
251+ "editor.foreground": "#c8ccd4",
252+ "editor.lineHighlightBackground": "#161922",
253+ "editor.selectionBackground": "#264f78",
254+ "editor.inactiveSelectionBackground": "#1d2536",
255+ "editorCursor.foreground": "#6bdfb8",
256+ "editorLineNumber.foreground": "#3a3f4b",
257+ "editorLineNumber.activeForeground": "#5a6370",
258+ "editorIndentGuide.background": "#1e2230",
259+ "editorIndentGuide.activeBackground": "#2a3040",
260+ "editor.selectionHighlightBackground": "#264f7830",
261+ "editorWidget.background": "#161922",
262+ "editorWidget.border": "#2a3040",
263+ "editorSuggestWidget.background": "#161922",
264+ "editorSuggestWidget.border": "#2a3040",
265+ "editorSuggestWidget.selectedBackground": "#1d2a3a",
266+ "editorSuggestWidget.highlightForeground": "#6bdfb8",
267+ "editorHoverWidget.background": "#161922",
268+ "editorHoverWidget.border": "#2a3040",
269+ "input.background": "#0f1117",
270+ "input.border": "#2a3040",
271+ "scrollbar.shadow": "#00000000",
272+ "scrollbarSlider.background": "#2a304080",
273+ "scrollbarSlider.hoverBackground": "#3a4050",
274+ "scrollbarSlider.activeBackground": "#4a5060",
275+ "focusBorder": "#6bdfb830",
276+ },
277+ });
278+ };
279+
280+ const handleMount: OnMount = (editor) => {
281+ editorRef.current = editor;
282+
283+ // Set up code completions for tools.* trigger
284+ editor.addAction({
285+ id: "trigger-tools-suggest",
286+ label: "Trigger tools suggest",
287+ keybindings: [],
288+ run: () => {
289+ editor.trigger("tools", "editor.action.triggerSuggest", {});
290+ },
291+ });
292+ };
293+
294+ return (
295+ <div className={className}>
296+ <Editor
297+ height={height}
298+ language="javascript"
299+ theme="executor-dark"
300+ value={value}
301+ onChange={(v) => onChange(v ?? "")}
302+ beforeMount={handleBeforeMount}
303+ onMount={handleMount}
304+ options={{
305+ minimap: { enabled: false },
306+ fontSize: 13,
307+ lineHeight: 22,
308+ fontFamily: "var(--font-geist-mono), 'JetBrains Mono', monospace",
309+ fontLigatures: true,
310+ tabSize: 2,
311+ padding: { top: 12, bottom: 12 },
312+ scrollBeyondLastLine: false,
313+ renderLineHighlight: "gutter",
314+ guides: {
315+ indentation: true,
316+ bracketPairs: true,
317+ },
318+ bracketPairColorization: {
319+ enabled: true,
320+ },
321+ suggest: {
322+ showMethods: true,
323+ showFunctions: true,
324+ showFields: true,
325+ showVariables: true,
326+ showModules: true,
327+ preview: true,
328+ },
329+ quickSuggestions: {
330+ other: true,
331+ comments: false,
332+ strings: true,
333+ },
334+ parameterHints: {
335+ enabled: true,
336+ },
337+ wordWrap: "on",
338+ automaticLayout: true,
339+ overviewRulerLanes: 0,
340+ hideCursorInOverviewRuler: true,
341+ overviewRulerBorder: false,
342+ scrollbar: {
343+ vertical: "auto",
344+ horizontal: "auto",
345+ verticalScrollbarSize: 6,
346+ horizontalScrollbarSize: 6,
347+ },
348+ roundedSelection: true,
349+ cursorBlinking: "smooth",
350+ cursorSmoothCaretAnimation: "on",
351+ smoothScrolling: true,
352+ }}
353+ loading={
354+ <div className="flex items-center justify-center h-full bg-[#0f1117] text-muted-foreground text-xs font-mono">
355+ Loading editor...
356+ </div>
357+ }
358+ />
359+ </div>
360+ );
361+}
executor/apps/web/src/components/dashboard-view.tsx+305−0
@@ -0,0 +1,305 @@
1+"use client";
2+
3+import { useRouter } from "next/navigation";
4+import {
5+ Play,
6+ ShieldCheck,
7+ Clock,
8+ CheckCircle2,
9+ XCircle,
10+ AlertTriangle,
11+ ArrowRight,
12+} from "lucide-react";
13+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
14+import { Button } from "@/components/ui/button";
15+import { Skeleton } from "@/components/ui/skeleton";
16+import { PageHeader } from "@/components/page-header";
17+import { TaskStatusBadge } from "@/components/status-badge";
18+import { useSession } from "@/lib/session-context";
19+import { usePoll } from "@/hooks/use-poll";
20+import * as api from "@/lib/api";
21+import type { TaskRecord, PendingApprovalRecord } from "@/lib/types";
22+
23+function formatTime(ts: number) {
24+ return new Date(ts).toLocaleTimeString([], {
25+ hour: "2-digit",
26+ minute: "2-digit",
27+ second: "2-digit",
28+ });
29+}
30+
31+function formatTimeAgo(ts: number) {
32+ const diff = Date.now() - ts;
33+ if (diff < 60_000) return `${Math.floor(diff / 1000)}s ago`;
34+ if (diff < 3_600_000) return `${Math.floor(diff / 60_000)}m ago`;
35+ return `${Math.floor(diff / 3_600_000)}h ago`;
36+}
37+
38+function StatCard({
39+ label,
40+ value,
41+ icon: Icon,
42+ accent,
43+}: {
44+ label: string;
45+ value: number | string;
46+ icon: React.ComponentType<{ className?: string }>;
47+ accent?: "green" | "amber" | "red" | "default";
48+}) {
49+ const accentClass = {
50+ green: "text-terminal-green",
51+ amber: "text-terminal-amber",
52+ red: "text-terminal-red",
53+ default: "text-muted-foreground",
54+ }[accent ?? "default"];
55+
56+ return (
57+ <Card className="bg-card border-border">
58+ <CardContent className="p-4">
59+ <div className="flex items-center justify-between">
60+ <div>
61+ <p className="text-[11px] font-mono uppercase tracking-widest text-muted-foreground">
62+ {label}
63+ </p>
64+ <p className={`text-2xl font-semibold mt-1 font-mono ${accentClass}`}>
65+ {value}
66+ </p>
67+ </div>
68+ <div className={`${accentClass} opacity-40`}>
69+ <Icon className="h-8 w-8" />
70+ </div>
71+ </div>
72+ </CardContent>
73+ </Card>
74+ );
75+}
76+
77+function PendingApprovalRow({ approval }: { approval: PendingApprovalRecord }) {
78+ const router = useRouter();
79+ return (
80+ <button
81+ onClick={() => router.push("/approvals")}
82+ className="w-full flex items-center gap-3 px-3 py-2.5 rounded-md hover:bg-accent/50 transition-colors text-left group"
83+ >
84+ <div className="h-2 w-2 rounded-full bg-terminal-amber pulse-dot shrink-0" />
85+ <div className="flex-1 min-w-0">
86+ <span className="text-sm font-mono text-foreground">
87+ {approval.toolPath}
88+ </span>
89+ <span className="text-[11px] text-muted-foreground ml-2">
90+ {formatTimeAgo(approval.createdAt)}
91+ </span>
92+ </div>
93+ <ArrowRight className="h-3.5 w-3.5 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0" />
94+ </button>
95+ );
96+}
97+
98+function RecentTaskRow({ task }: { task: TaskRecord }) {
99+ const router = useRouter();
100+ return (
101+ <button
102+ onClick={() => router.push(`/tasks?selected=${task.id}`)}
103+ className="w-full flex items-center gap-3 px-3 py-2.5 rounded-md hover:bg-accent/50 transition-colors text-left group"
104+ >
105+ <div className="flex-1 min-w-0">
106+ <span className="text-sm font-mono text-foreground truncate block">
107+ {task.id}
108+ </span>
109+ <span className="text-[11px] text-muted-foreground">
110+ {task.runtimeId} &middot; {formatTime(task.createdAt)}
111+ </span>
112+ </div>
113+ <TaskStatusBadge status={task.status} />
114+ </button>
115+ );
116+}
117+
118+export function DashboardView() {
119+ const { context, loading: sessionLoading } = useSession();
120+
121+ const { data: tasks } = usePoll({
122+ fetcher: () => api.listTasks(context!.workspaceId),
123+ enabled: !!context,
124+ });
125+
126+ const { data: approvals } = usePoll({
127+ fetcher: () => api.listPendingApprovals(context!.workspaceId),
128+ enabled: !!context,
129+ });
130+
131+ const { data: tools } = usePoll({
132+ fetcher: () =>
133+ api.listToolsForContext({
134+ workspaceId: context!.workspaceId,
135+ actorId: context!.actorId,
136+ clientId: context!.clientId,
137+ }),
138+ enabled: !!context,
139+ interval: 10000,
140+ });
141+
142+ if (sessionLoading) {
143+ return (
144+ <div className="space-y-6">
145+ <Skeleton className="h-8 w-48" />
146+ <div className="grid grid-cols-2 lg:grid-cols-4 gap-4">
147+ {Array.from({ length: 4 }).map((_, i) => (
148+ <Skeleton key={i} className="h-24" />
149+ ))}
150+ </div>
151+ </div>
152+ );
153+ }
154+
155+ const pendingCount = approvals?.length ?? 0;
156+ const runningCount =
157+ tasks?.filter((t) => t.status === "running").length ?? 0;
158+ const completedCount =
159+ tasks?.filter((t) => t.status === "completed").length ?? 0;
160+ const failedCount =
161+ tasks?.filter((t) => ["failed", "timed_out", "denied"].includes(t.status))
162+ .length ?? 0;
163+ const recentTasks = (tasks ?? []).slice(0, 8);
164+
165+ return (
166+ <div className="space-y-6">
167+ <PageHeader
168+ title="Dashboard"
169+ description="Overview of your executor workspace"
170+ />
171+
172+ {/* Stats row */}
173+ <div className="grid grid-cols-2 lg:grid-cols-4 gap-4">
174+ <StatCard
175+ label="Pending Approvals"
176+ value={pendingCount}
177+ icon={ShieldCheck}
178+ accent={pendingCount > 0 ? "amber" : "default"}
179+ />
180+ <StatCard
181+ label="Running"
182+ value={runningCount}
183+ icon={Play}
184+ accent={runningCount > 0 ? "green" : "default"}
185+ />
186+ <StatCard
187+ label="Completed"
188+ value={completedCount}
189+ icon={CheckCircle2}
190+ accent="green"
191+ />
192+ <StatCard
193+ label="Failed"
194+ value={failedCount}
195+ icon={XCircle}
196+ accent={failedCount > 0 ? "red" : "default"}
197+ />
198+ </div>
199+
200+ {/* Two column layout */}
201+ <div className="grid lg:grid-cols-2 gap-6">
202+ {/* Pending approvals */}
203+ <Card className="bg-card border-border">
204+ <CardHeader className="pb-3">
205+ <div className="flex items-center justify-between">
206+ <CardTitle className="text-sm font-medium flex items-center gap-2">
207+ <AlertTriangle className="h-4 w-4 text-terminal-amber" />
208+ Pending Approvals
209+ {pendingCount > 0 && (
210+ <span className="text-[10px] font-mono bg-terminal-amber/15 text-terminal-amber px-1.5 py-0.5 rounded">
211+ {pendingCount}
212+ </span>
213+ )}
214+ </CardTitle>
215+ <Button
216+ variant="ghost"
217+ size="sm"
218+ className="text-xs h-7"
219+ asChild
220+ >
221+ <a href="/approvals">View all</a>
222+ </Button>
223+ </div>
224+ </CardHeader>
225+ <CardContent className="pt-0">
226+ {pendingCount === 0 ? (
227+ <div className="flex items-center justify-center py-8 text-sm text-muted-foreground">
228+ <CheckCircle2 className="h-4 w-4 mr-2 text-terminal-green/50" />
229+ No pending approvals
230+ </div>
231+ ) : (
232+ <div className="space-y-0.5">
233+ {(approvals ?? []).slice(0, 5).map((a) => (
234+ <PendingApprovalRow key={a.id} approval={a} />
235+ ))}
236+ </div>
237+ )}
238+ </CardContent>
239+ </Card>
240+
241+ {/* Recent tasks */}
242+ <Card className="bg-card border-border">
243+ <CardHeader className="pb-3">
244+ <div className="flex items-center justify-between">
245+ <CardTitle className="text-sm font-medium flex items-center gap-2">
246+ <Clock className="h-4 w-4 text-muted-foreground" />
247+ Recent Tasks
248+ </CardTitle>
249+ <Button
250+ variant="ghost"
251+ size="sm"
252+ className="text-xs h-7"
253+ asChild
254+ >
255+ <a href="/tasks">View all</a>
256+ </Button>
257+ </div>
258+ </CardHeader>
259+ <CardContent className="pt-0">
260+ {recentTasks.length === 0 ? (
261+ <div className="flex items-center justify-center py-8 text-sm text-muted-foreground">
262+ No tasks yet
263+ </div>
264+ ) : (
265+ <div className="space-y-0.5">
266+ {recentTasks.map((t) => (
267+ <RecentTaskRow key={t.id} task={t} />
268+ ))}
269+ </div>
270+ )}
271+ </CardContent>
272+ </Card>
273+ </div>
274+
275+ {/* Tools summary */}
276+ {tools && tools.length > 0 && (
277+ <Card className="bg-card border-border">
278+ <CardHeader className="pb-3">
279+ <CardTitle className="text-sm font-medium flex items-center gap-2">
280+ Available Tools
281+ <span className="text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded">
282+ {tools.length}
283+ </span>
284+ </CardTitle>
285+ </CardHeader>
286+ <CardContent className="pt-0">
287+ <div className="flex flex-wrap gap-2">
288+ {tools.map((tool) => (
289+ <span
290+ key={tool.path}
291+ className="inline-flex items-center gap-1 text-[11px] font-mono px-2 py-1 rounded bg-muted text-muted-foreground"
292+ >
293+ {tool.approval === "required" && (
294+ <ShieldCheck className="h-3 w-3 text-terminal-amber" />
295+ )}
296+ {tool.path}
297+ </span>
298+ ))}
299+ </div>
300+ </CardContent>
301+ </Card>
302+ )}
303+ </div>
304+ );
305+}
executor/apps/web/src/components/page-header.tsx+21−0
@@ -0,0 +1,21 @@
1+"use client";
2+
3+interface PageHeaderProps {
4+ title: string;
5+ description?: string;
6+ children?: React.ReactNode;
7+}
8+
9+export function PageHeader({ title, description, children }: PageHeaderProps) {
10+ return (
11+ <div className="flex flex-col gap-1 sm:flex-row sm:items-center sm:justify-between mb-6">
12+ <div>
13+ <h1 className="text-xl font-semibold tracking-tight">{title}</h1>
14+ {description && (
15+ <p className="text-sm text-muted-foreground mt-0.5">{description}</p>
16+ )}
17+ </div>
18+ {children && <div className="flex items-center gap-2 mt-2 sm:mt-0">{children}</div>}
19+ </div>
20+ );
21+}
executor/apps/web/src/components/status-badge.tsx+87−0
@@ -0,0 +1,87 @@
1+"use client";
2+
3+import { Badge } from "@/components/ui/badge";
4+import { cn } from "@/lib/utils";
5+import type { TaskStatus, ApprovalStatus } from "@/lib/types";
6+
7+const TASK_STATUS_CONFIG: Record<
8+ TaskStatus,
9+ { label: string; className: string }
10+> = {
11+ queued: {
12+ label: "Queued",
13+ className: "bg-muted text-muted-foreground border-muted",
14+ },
15+ running: {
16+ label: "Running",
17+ className:
18+ "bg-terminal-amber/10 text-terminal-amber border-terminal-amber/30",
19+ },
20+ completed: {
21+ label: "Completed",
22+ className:
23+ "bg-terminal-green/10 text-terminal-green border-terminal-green/30",
24+ },
25+ failed: {
26+ label: "Failed",
27+ className: "bg-terminal-red/10 text-terminal-red border-terminal-red/30",
28+ },
29+ timed_out: {
30+ label: "Timed Out",
31+ className: "bg-terminal-red/10 text-terminal-red border-terminal-red/30",
32+ },
33+ denied: {
34+ label: "Denied",
35+ className: "bg-terminal-red/10 text-terminal-red border-terminal-red/30",
36+ },
37+};
38+
39+const APPROVAL_STATUS_CONFIG: Record<
40+ ApprovalStatus,
41+ { label: string; className: string }
42+> = {
43+ pending: {
44+ label: "Pending",
45+ className:
46+ "bg-terminal-amber/10 text-terminal-amber border-terminal-amber/30",
47+ },
48+ approved: {
49+ label: "Approved",
50+ className:
51+ "bg-terminal-green/10 text-terminal-green border-terminal-green/30",
52+ },
53+ denied: {
54+ label: "Denied",
55+ className: "bg-terminal-red/10 text-terminal-red border-terminal-red/30",
56+ },
57+};
58+
59+export function TaskStatusBadge({ status }: { status: TaskStatus }) {
60+ const config = TASK_STATUS_CONFIG[status];
61+ return (
62+ <Badge
63+ variant="outline"
64+ className={cn("text-[10px] font-mono uppercase tracking-wider", config.className)}
65+ >
66+ {status === "running" && (
67+ <span className="inline-block h-1.5 w-1.5 rounded-full bg-current mr-1.5 pulse-dot" />
68+ )}
69+ {config.label}
70+ </Badge>
71+ );
72+}
73+
74+export function ApprovalStatusBadge({ status }: { status: ApprovalStatus }) {
75+ const config = APPROVAL_STATUS_CONFIG[status];
76+ return (
77+ <Badge
78+ variant="outline"
79+ className={cn("text-[10px] font-mono uppercase tracking-wider", config.className)}
80+ >
81+ {status === "pending" && (
82+ <span className="inline-block h-1.5 w-1.5 rounded-full bg-current mr-1.5 pulse-dot" />
83+ )}
84+ {config.label}
85+ </Badge>
86+ );
87+}
executor/apps/web/src/components/tasks-view.tsx+499−0
@@ -0,0 +1,499 @@
1+"use client";
2+
3+import { useState, useEffect, useCallback, useRef } from "react";
4+import { useSearchParams, useRouter } from "next/navigation";
5+import {
6+ Play,
7+ RefreshCw,
8+ ChevronRight,
9+ X,
10+ Send,
11+} from "lucide-react";
12+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
13+import { Button } from "@/components/ui/button";
14+import { Input } from "@/components/ui/input";
15+import { Label } from "@/components/ui/label";
16+import { CodeEditor } from "@/components/code-editor";
17+import {
18+ Select,
19+ SelectContent,
20+ SelectItem,
21+ SelectTrigger,
22+ SelectValue,
23+} from "@/components/ui/select";
24+import { Skeleton } from "@/components/ui/skeleton";
25+import { Separator } from "@/components/ui/separator";
26+import { PageHeader } from "@/components/page-header";
27+import { TaskStatusBadge } from "@/components/status-badge";
28+import { useSession } from "@/lib/session-context";
29+import { usePoll } from "@/hooks/use-poll";
30+import * as api from "@/lib/api";
31+import type {
32+ TaskRecord,
33+ RuntimeTargetDescriptor,
34+ TaskEventRecord,
35+ ToolDescriptor,
36+} from "@/lib/types";
37+import { toast } from "sonner";
38+import { cn } from "@/lib/utils";
39+
40+const DEFAULT_CODE = `// Example: call some tools
41+const time = await tools.utils.get_time();
42+console.log("Current time:", time.iso);
43+
44+const result = await tools.math.add({ a: 7, b: 35 });
45+console.log("7 + 35 =", result.result);
46+
47+// This will require approval:
48+await tools.admin.send_announcement({
49+ channel: "general",
50+ message: "Hello from executor!"
51+});`;
52+
53+function formatTime(ts: number) {
54+ return new Date(ts).toLocaleTimeString([], {
55+ hour: "2-digit",
56+ minute: "2-digit",
57+ second: "2-digit",
58+ });
59+}
60+
61+function formatDate(ts: number) {
62+ return new Date(ts).toLocaleDateString([], {
63+ month: "short",
64+ day: "numeric",
65+ hour: "2-digit",
66+ minute: "2-digit",
67+ });
68+}
69+
70+// ── Task Composer ──
71+
72+function TaskComposer({ onCreated }: { onCreated: () => void }) {
73+ const { context } = useSession();
74+ const [code, setCode] = useState(DEFAULT_CODE);
75+ const [runtimeId, setRuntimeId] = useState("local-bun");
76+ const [timeoutMs, setTimeoutMs] = useState("15000");
77+ const [submitting, setSubmitting] = useState(false);
78+
79+ const { data: runtimes } = usePoll({
80+ fetcher: api.listRuntimeTargets,
81+ interval: 30000,
82+ enabled: !!context,
83+ });
84+
85+ const { data: tools } = usePoll({
86+ fetcher: () =>
87+ api.listToolsForContext({
88+ workspaceId: context!.workspaceId,
89+ actorId: context!.actorId,
90+ clientId: context!.clientId,
91+ }),
92+ enabled: !!context,
93+ interval: 10000,
94+ });
95+
96+ const handleSubmit = async () => {
97+ if (!context || !code.trim()) return;
98+ setSubmitting(true);
99+ try {
100+ const result = await api.createTask({
101+ code,
102+ runtimeId,
103+ timeoutMs: parseInt(timeoutMs) || 15000,
104+ workspaceId: context.workspaceId,
105+ actorId: context.actorId,
106+ clientId: context.clientId,
107+ });
108+ toast.success(`Task created: ${result.taskId}`);
109+ onCreated();
110+ } catch (err) {
111+ toast.error(
112+ err instanceof Error ? err.message : "Failed to create task",
113+ );
114+ } finally {
115+ setSubmitting(false);
116+ }
117+ };
118+
119+ return (
120+ <Card className="bg-card border-border">
121+ <CardHeader className="pb-3">
122+ <CardTitle className="text-sm font-medium flex items-center gap-2">
123+ <Play className="h-4 w-4 text-terminal-green" />
124+ New Task
125+ </CardTitle>
126+ </CardHeader>
127+ <CardContent className="space-y-4">
128+ <div className="grid grid-cols-2 gap-3">
129+ <div className="space-y-1.5">
130+ <Label className="text-xs text-muted-foreground">Runtime</Label>
131+ <Select value={runtimeId} onValueChange={setRuntimeId}>
132+ <SelectTrigger className="h-8 text-xs font-mono bg-background">
133+ <SelectValue />
134+ </SelectTrigger>
135+ <SelectContent>
136+ {(runtimes ?? []).map((r) => (
137+ <SelectItem key={r.id} value={r.id} className="text-xs">
138+ {r.label}
139+ </SelectItem>
140+ ))}
141+ </SelectContent>
142+ </Select>
143+ </div>
144+ <div className="space-y-1.5">
145+ <Label className="text-xs text-muted-foreground">
146+ Timeout (ms)
147+ </Label>
148+ <Input
149+ type="number"
150+ value={timeoutMs}
151+ onChange={(e) => setTimeoutMs(e.target.value)}
152+ className="h-8 text-xs font-mono bg-background"
153+ />
154+ </div>
155+ </div>
156+ <div className="space-y-1.5">
157+ <Label className="text-xs text-muted-foreground">Code</Label>
158+ <div className="rounded-md border border-border overflow-hidden">
159+ <CodeEditor
160+ value={code}
161+ onChange={setCode}
162+ tools={tools ?? []}
163+ height="240px"
164+ />
165+ </div>
166+ </div>
167+ <Button
168+ onClick={handleSubmit}
169+ disabled={submitting || !code.trim()}
170+ className="w-full bg-primary text-primary-foreground hover:bg-primary/90 h-9"
171+ size="sm"
172+ >
173+ <Send className="h-3.5 w-3.5 mr-2" />
174+ {submitting ? "Creating..." : "Execute Task"}
175+ </Button>
176+ </CardContent>
177+ </Card>
178+ );
179+}
180+
181+// ── Task List ──
182+
183+function TaskListItem({
184+ task,
185+ selected,
186+ onClick,
187+}: {
188+ task: TaskRecord;
189+ selected: boolean;
190+ onClick: () => void;
191+}) {
192+ return (
193+ <button
194+ onClick={onClick}
195+ className={cn(
196+ "w-full flex items-center gap-3 px-3 py-2.5 rounded-md transition-colors text-left group",
197+ selected
198+ ? "bg-primary/10 border border-primary/20"
199+ : "hover:bg-accent/50 border border-transparent",
200+ )}
201+ >
202+ <div className="flex-1 min-w-0">
203+ <div className="flex items-center gap-2">
204+ <span className="text-xs font-mono text-foreground truncate">
205+ {task.id}
206+ </span>
207+ </div>
208+ <div className="flex items-center gap-2 mt-0.5">
209+ <span className="text-[10px] font-mono text-muted-foreground">
210+ {task.runtimeId}
211+ </span>
212+ <span className="text-[10px] text-muted-foreground">
213+ {formatDate(task.createdAt)}
214+ </span>
215+ </div>
216+ </div>
217+ <TaskStatusBadge status={task.status} />
218+ <ChevronRight className="h-3.5 w-3.5 text-muted-foreground opacity-0 group-hover:opacity-100 transition-opacity shrink-0" />
219+ </button>
220+ );
221+}
222+
223+// ── Task Detail ──
224+
225+function TaskDetail({
226+ task,
227+ workspaceId,
228+ onClose,
229+}: {
230+ task: TaskRecord;
231+ workspaceId: string;
232+ onClose: () => void;
233+}) {
234+ const [liveTask, setLiveTask] = useState(task);
235+ const [liveStdout, setLiveStdout] = useState(task.stdout ?? "");
236+ const [liveStderr, setLiveStderr] = useState(task.stderr ?? "");
237+ const eventSourceRef = useRef<EventSource | null>(null);
238+
239+ useEffect(() => {
240+ setLiveTask(task);
241+ setLiveStdout(task.stdout ?? "");
242+ setLiveStderr(task.stderr ?? "");
243+ }, [task]);
244+
245+ useEffect(() => {
246+ const isTerminal = ["completed", "failed", "timed_out", "denied"].includes(
247+ liveTask.status,
248+ );
249+ if (isTerminal) return;
250+
251+ const source = api.subscribeToTaskEvents(
252+ task.id,
253+ workspaceId,
254+ (_eventName: string, event: TaskEventRecord) => {
255+ const payload = event.payload as Record<string, unknown>;
256+ if (event.type === "task.completed" || event.type === "task.failed" || event.type === "task.timed_out" || event.type === "task.denied") {
257+ // Refetch full task
258+ api.getTask(task.id, workspaceId).then(setLiveTask);
259+ }
260+ if (event.type === "task.running") {
261+ setLiveTask((prev) => ({ ...prev, status: "running" }));
262+ }
263+ if (event.type === "task.stdout") {
264+ setLiveStdout((prev) => prev + (payload.line as string) + "\n");
265+ }
266+ if (event.type === "task.stderr") {
267+ setLiveStderr((prev) => prev + (payload.line as string) + "\n");
268+ }
269+ },
270+ );
271+ eventSourceRef.current = source;
272+
273+ return () => {
274+ source.close();
275+ };
276+ }, [task.id, workspaceId, liveTask.status]);
277+
278+ const duration =
279+ liveTask.completedAt && liveTask.startedAt
280+ ? `${((liveTask.completedAt - liveTask.startedAt) / 1000).toFixed(2)}s`
281+ : liveTask.startedAt
282+ ? "running..."
283+ : "—";
284+
285+ return (
286+ <Card className="bg-card border-border">
287+ <CardHeader className="pb-3">
288+ <div className="flex items-center justify-between">
289+ <CardTitle className="text-sm font-medium font-mono truncate pr-4">
290+ {liveTask.id}
291+ </CardTitle>
292+ <Button
293+ variant="ghost"
294+ size="icon"
295+ className="h-7 w-7 shrink-0"
296+ onClick={onClose}
297+ >
298+ <X className="h-4 w-4" />
299+ </Button>
300+ </div>
301+ </CardHeader>
302+ <CardContent className="space-y-4">
303+ {/* Metadata grid */}
304+ <div className="grid grid-cols-2 sm:grid-cols-4 gap-3">
305+ {[
306+ { label: "Status", value: <TaskStatusBadge status={liveTask.status} /> },
307+ { label: "Runtime", value: <span className="font-mono text-xs">{liveTask.runtimeId}</span> },
308+ { label: "Duration", value: <span className="font-mono text-xs">{duration}</span> },
309+ {
310+ label: "Exit Code",
311+ value: (
312+ <span className={cn("font-mono text-xs", liveTask.exitCode === 0 ? "text-terminal-green" : liveTask.exitCode ? "text-terminal-red" : "text-muted-foreground")}>
313+ {liveTask.exitCode ?? "—"}
314+ </span>
315+ ),
316+ },
317+ ].map((item) => (
318+ <div key={item.label}>
319+ <span className="text-[10px] uppercase tracking-widest text-muted-foreground block mb-1">
320+ {item.label}
321+ </span>
322+ {item.value}
323+ </div>
324+ ))}
325+ </div>
326+
327+ <Separator />
328+
329+ {/* Code */}
330+ <div>
331+ <span className="text-[10px] uppercase tracking-widest text-muted-foreground block mb-2">
332+ Code
333+ </span>
334+ <pre className="terminal-block max-h-48 overflow-y-auto">
335+ {liveTask.code}
336+ </pre>
337+ </div>
338+
339+ {/* Stdout */}
340+ {liveStdout && (
341+ <div>
342+ <span className="text-[10px] uppercase tracking-widest text-terminal-green block mb-2">
343+ Stdout
344+ </span>
345+ <pre className="terminal-block max-h-48 overflow-y-auto text-terminal-green/80">
346+ {liveStdout}
347+ </pre>
348+ </div>
349+ )}
350+
351+ {/* Stderr */}
352+ {liveStderr && (
353+ <div>
354+ <span className="text-[10px] uppercase tracking-widest text-terminal-amber block mb-2">
355+ Stderr
356+ </span>
357+ <pre className="terminal-block max-h-48 overflow-y-auto text-terminal-amber/80">
358+ {liveStderr}
359+ </pre>
360+ </div>
361+ )}
362+
363+ {/* Error */}
364+ {liveTask.error && (
365+ <div>
366+ <span className="text-[10px] uppercase tracking-widest text-terminal-red block mb-2">
367+ Error
368+ </span>
369+ <pre className="terminal-block max-h-48 overflow-y-auto text-terminal-red/80">
370+ {liveTask.error}
371+ </pre>
372+ </div>
373+ )}
374+ </CardContent>
375+ </Card>
376+ );
377+}
378+
379+// ── Tasks View ──
380+
381+export function TasksView() {
382+ const { context, loading: sessionLoading } = useSession();
383+ const router = useRouter();
384+ const searchParams = useSearchParams();
385+ const selectedId = searchParams.get("selected");
386+
387+ const {
388+ data: tasks,
389+ loading: tasksLoading,
390+ refresh,
391+ } = usePoll({
392+ fetcher: () => api.listTasks(context!.workspaceId),
393+ enabled: !!context,
394+ });
395+
396+ const selectedTask = tasks?.find((t) => t.id === selectedId);
397+
398+ const selectTask = useCallback(
399+ (taskId: string | null) => {
400+ if (taskId) {
401+ router.push(`/tasks?selected=${taskId}`, { scroll: false });
402+ } else {
403+ router.push("/tasks", { scroll: false });
404+ }
405+ },
406+ [router],
407+ );
408+
409+ if (sessionLoading) {
410+ return (
411+ <div className="space-y-6">
412+ <Skeleton className="h-8 w-48" />
413+ <Skeleton className="h-64" />
414+ </div>
415+ );
416+ }
417+
418+ return (
419+ <div className="space-y-6">
420+ <PageHeader
421+ title="Tasks"
422+ description="Execute code and manage task history"
423+ >
424+ <Button
425+ variant="outline"
426+ size="sm"
427+ className="h-8 text-xs"
428+ onClick={refresh}
429+ >
430+ <RefreshCw className="h-3.5 w-3.5 mr-1.5" />
431+ Refresh
432+ </Button>
433+ </PageHeader>
434+
435+ <div className="grid lg:grid-cols-2 gap-6">
436+ {/* Left: composer + list */}
437+ <div className="space-y-6">
438+ <TaskComposer onCreated={refresh} />
439+
440+ <Card className="bg-card border-border">
441+ <CardHeader className="pb-3">
442+ <CardTitle className="text-sm font-medium flex items-center gap-2">
443+ Task History
444+ {tasks && (
445+ <span className="text-[10px] font-mono bg-muted text-muted-foreground px-1.5 py-0.5 rounded">
446+ {tasks.length}
447+ </span>
448+ )}
449+ </CardTitle>
450+ </CardHeader>
451+ <CardContent className="pt-0">
452+ {tasksLoading ? (
453+ <div className="space-y-2">
454+ {Array.from({ length: 4 }).map((_, i) => (
455+ <Skeleton key={i} className="h-14" />
456+ ))}
457+ </div>
458+ ) : !tasks || tasks.length === 0 ? (
459+ <div className="flex items-center justify-center py-12 text-sm text-muted-foreground">
460+ No tasks yet. Create one above.
461+ </div>
462+ ) : (
463+ <div className="space-y-1 max-h-[500px] overflow-y-auto">
464+ {tasks.map((task) => (
465+ <TaskListItem
466+ key={task.id}
467+ task={task}
468+ selected={task.id === selectedId}
469+ onClick={() => selectTask(task.id)}
470+ />
471+ ))}
472+ </div>
473+ )}
474+ </CardContent>
475+ </Card>
476+ </div>
477+
478+ {/* Right: detail panel */}
479+ <div>
480+ {selectedTask ? (
481+ <TaskDetail
482+ task={selectedTask}
483+ workspaceId={context!.workspaceId}
484+ onClose={() => selectTask(null)}
485+ />
486+ ) : (
487+ <Card className="bg-card border-border">
488+ <CardContent className="flex items-center justify-center py-24">
489+ <p className="text-sm text-muted-foreground">
490+ Select a task to view details
491+ </p>
492+ </CardContent>
493+ </Card>
494+ )}
495+ </div>
496+ </div>
497+ </div>
498+ );
499+}
executor/apps/web/src/components/tools-view.tsx+525−0
@@ -0,0 +1,525 @@
1+"use client";
2+
3+import { useState } from "react";
4+import {
5+ Wrench,
6+ Plus,
7+ Trash2,
8+ RefreshCw,
9+ ShieldCheck,
10+ Globe,
11+ Server,
12+ Zap,
13+ Search,
14+} from "lucide-react";
15+import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
16+import { Button } from "@/components/ui/button";
17+import { Input } from "@/components/ui/input";
18+import { Label } from "@/components/ui/label";
19+import { Badge } from "@/components/ui/badge";
20+import {
21+ Select,
22+ SelectContent,
23+ SelectItem,
24+ SelectTrigger,
25+ SelectValue,
26+} from "@/components/ui/select";
27+import {
28+ Dialog,
29+ DialogContent,
30+ DialogHeader,
31+ DialogTitle,
32+ DialogTrigger,
33+} from "@/components/ui/dialog";
34+import { Separator } from "@/components/ui/separator";
35+import { Skeleton } from "@/components/ui/skeleton";
36+import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
37+import { PageHeader } from "@/components/page-header";
38+import { useSession } from "@/lib/session-context";
39+import { usePoll } from "@/hooks/use-poll";
40+import * as api from "@/lib/api";
41+import type { ToolSourceRecord, ToolDescriptor } from "@/lib/types";
42+import { parse as parseDomain } from "tldts";
43+import { toast } from "sonner";
44+import { cn } from "@/lib/utils";
45+
46+// ── Add Source Dialog ──
47+
48+const RAW_HOSTS = new Set([
49+ "raw.githubusercontent.com",
50+ "cdn.jsdelivr.net",
51+ "unpkg.com",
52+ "raw.github.com",
53+]);
54+
55+function inferNameFromUrl(url: string): string {
56+ try {
57+ const u = new URL(url);
58+ const parsed = parseDomain(url);
59+
60+ // For raw/CDN hosts, infer from the first meaningful path segment
61+ // e.g. raw.githubusercontent.com/github/rest-api-description/... -> "github"
62+ if (RAW_HOSTS.has(u.hostname)) {
63+ const segments = u.pathname.split("/").filter(Boolean);
64+ if (segments.length > 0) return segments[0].toLowerCase();
65+ }
66+
67+ // For subdomains like "api.github.com", prefer the domain name
68+ if (parsed.domainWithoutSuffix) {
69+ return parsed.domainWithoutSuffix;
70+ }
71+
72+ if (parsed.domain) {
73+ return parsed.domain.split(".")[0];
74+ }
75+
76+ return u.hostname.replace(/\./g, "-");
77+ } catch {
78+ return "";
79+ }
80+}
81+
82+function AddSourceDialog({ onAdded }: { onAdded: () => void }) {
83+ const { context } = useSession();
84+ const [open, setOpen] = useState(false);
85+ const [type, setType] = useState<"mcp" | "openapi">("mcp");
86+ const [name, setName] = useState("");
87+ const [nameManuallyEdited, setNameManuallyEdited] = useState(false);
88+ const [endpoint, setEndpoint] = useState("");
89+ const [baseUrl, setBaseUrl] = useState("");
90+ const [submitting, setSubmitting] = useState(false);
91+
92+ const handleEndpointChange = (value: string) => {
93+ setEndpoint(value);
94+ // Auto-infer name from URL if user hasn't manually edited the name
95+ if (!nameManuallyEdited) {
96+ const inferred = inferNameFromUrl(value);
97+ if (inferred) setName(inferred);
98+ }
99+ };
100+
101+ const handleNameChange = (value: string) => {
102+ setName(value);
103+ setNameManuallyEdited(true);
104+ };
105+
106+ const handleOpenChange = (isOpen: boolean) => {
107+ setOpen(isOpen);
108+ if (!isOpen) {
109+ // Reset on close
110+ setName("");
111+ setEndpoint("");
112+ setBaseUrl("");
113+ setNameManuallyEdited(false);
114+ }
115+ };
116+
117+ const handleSubmit = async () => {
118+ if (!context || !name.trim() || !endpoint.trim()) return;
119+ setSubmitting(true);
120+ try {
121+ const config: Record<string, unknown> =
122+ type === "mcp"
123+ ? { url: endpoint }
124+ : { spec: endpoint, ...(baseUrl ? { baseUrl } : {}) };
125+
126+ const result = await api.upsertToolSource({
127+ workspaceId: context.workspaceId,
128+ name: name.trim(),
129+ type,
130+ config,
131+ });
132+ const warnings = (result as unknown as Record<string, unknown>).warnings as string[] | undefined;
133+ if (warnings && warnings.length > 0) {
134+ toast.warning(`Source "${name}" saved but had issues`, {
135+ description: warnings.join("\n"),
136+ duration: 10000,
137+ });
138+ } else {
139+ toast.success(`Source "${name}" added`);
140+ }
141+ setName("");
142+ setEndpoint("");
143+ setBaseUrl("");
144+ setNameManuallyEdited(false);
145+ setOpen(false);
146+ onAdded();
147+ } catch (err) {
148+ toast.error(err instanceof Error ? err.message : "Failed to add source");
149+ } finally {
150+ setSubmitting(false);
151+ }
152+ };
153+
154+ return (
155+ <Dialog open={open} onOpenChange={handleOpenChange}>
156+ <DialogTrigger asChild>
157+ <Button size="sm" className="h-8 text-xs">
158+ <Plus className="h-3.5 w-3.5 mr-1.5" />
159+ Add Source
160+ </Button>
161+ </DialogTrigger>
162+ <DialogContent className="bg-card border-border sm:max-w-md">
163+ <DialogHeader>
164+ <DialogTitle className="text-sm font-medium">
165+ Add Tool Source
166+ </DialogTitle>
167+ </DialogHeader>
168+ <div className="space-y-4 pt-2">
169+ <div className="space-y-1.5">
170+ <Label className="text-xs text-muted-foreground">Type</Label>
171+ <Select
172+ value={type}
173+ onValueChange={(v) => setType(v as "mcp" | "openapi")}
174+ >
175+ <SelectTrigger className="h-8 text-xs bg-background">
176+ <SelectValue />
177+ </SelectTrigger>
178+ <SelectContent>
179+ <SelectItem value="mcp" className="text-xs">
180+ MCP Server
181+ </SelectItem>
182+ <SelectItem value="openapi" className="text-xs">
183+ OpenAPI Spec
184+ </SelectItem>
185+ </SelectContent>
186+ </Select>
187+ </div>
188+ <div className="space-y-1.5">
189+ <Label className="text-xs text-muted-foreground">
190+ {type === "mcp" ? "Endpoint URL" : "Spec URL"}
191+ </Label>
192+ <Input
193+ value={endpoint}
194+ onChange={(e) => handleEndpointChange(e.target.value)}
195+ placeholder={
196+ type === "mcp"
197+ ? "https://mcp-server.example.com/sse"
198+ : "https://api.example.com/openapi.json"
199+ }
200+ className="h-8 text-xs font-mono bg-background"
201+ />
202+ </div>
203+ <div className="space-y-1.5">
204+ <Label className="text-xs text-muted-foreground">Name</Label>
205+ <Input
206+ value={name}
207+ onChange={(e) => handleNameChange(e.target.value)}
208+ placeholder="e.g. my-service"
209+ className="h-8 text-xs font-mono bg-background"
210+ />
211+ </div>
212+ {type === "openapi" && (
213+ <div className="space-y-1.5">
214+ <Label className="text-xs text-muted-foreground">
215+ Base URL (optional)
216+ </Label>
217+ <Input
218+ value={baseUrl}
219+ onChange={(e) => setBaseUrl(e.target.value)}
220+ placeholder="https://api.example.com"
221+ className="h-8 text-xs font-mono bg-background"
222+ />
223+ </div>
224+ )}
225+ <Button
226+ onClick={handleSubmit}
227+ disabled={submitting || !name.trim() || !endpoint.trim()}
228+ className="w-full h-9"
229+ size="sm"
230+ >
231+ {submitting ? "Adding..." : "Add Source"}
232+ </Button>
233+ </div>
234+ </DialogContent>
235+ </Dialog>
236+ );
237+}
238+
239+// ── Source Card ──
240+
241+function SourceCard({
242+ source,
243+ onDeleted,
244+}: {
245+ source: ToolSourceRecord;
246+ onDeleted: () => void;
247+}) {
248+ const { context } = useSession();
249+ const [deleting, setDeleting] = useState(false);
250+
251+ const handleDelete = async () => {
252+ if (!context) return;
253+ setDeleting(true);
254+ try {
255+ await api.deleteToolSource(context.workspaceId, source.id);
256+ toast.success(`Removed "${source.name}"`);
257+ onDeleted();
258+ } catch (err) {
259+ toast.error(err instanceof Error ? err.message : "Failed to delete");
260+ } finally {
261+ setDeleting(false);
262+ }
263+ };
264+
265+ const TypeIcon = source.type === "mcp" ? Server : Globe;
266+
267+ return (
268+ <div className="flex items-center gap-3 px-3 py-2.5 rounded-md bg-muted/40 group">
269+ <div className="h-8 w-8 rounded bg-muted flex items-center justify-center shrink-0">
270+ <TypeIcon className="h-4 w-4 text-muted-foreground" />
271+ </div>
272+ <div className="flex-1 min-w-0">
273+ <div className="flex items-center gap-2">
274+ <span className="text-sm font-mono font-medium truncate">
275+ {source.name}
276+ </span>
277+ <Badge
278+ variant="outline"
279+ className="text-[9px] font-mono uppercase tracking-wider"
280+ >
281+ {source.type}
282+ </Badge>
283+ {!source.enabled && (
284+ <Badge
285+ variant="outline"
286+ className="text-[9px] font-mono uppercase tracking-wider text-terminal-red border-terminal-red/30"
287+ >
288+ disabled
289+ </Badge>
290+ )}
291+ </div>
292+ <span className="text-[11px] text-muted-foreground font-mono truncate block">
293+ {source.type === "mcp"
294+ ? (source.config.url as string)
295+ : (source.config.spec as string)}
296+ </span>
297+ </div>
298+ <Button
299+ variant="ghost"
300+ size="icon"
301+ className="h-7 w-7 opacity-0 group-hover:opacity-100 transition-opacity text-muted-foreground hover:text-terminal-red shrink-0"
302+ onClick={handleDelete}
303+ disabled={deleting}
304+ >
305+ <Trash2 className="h-3.5 w-3.5" />
306+ </Button>
307+ </div>
308+ );
309+}
310+
311+// ── Tool Inventory ──
312+
313+function ToolInventory({ tools }: { tools: ToolDescriptor[] }) {
314+ const [search, setSearch] = useState("");
315+
316+ const filtered = tools.filter(
317+ (t) =>
318+ t.path.toLowerCase().includes(search.toLowerCase()) ||
319+ t.description.toLowerCase().includes(search.toLowerCase()),
320+ );
321+
322+ return (
323+ <div className="space-y-3">
324+ <div className="relative">
325+ <Search className="absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground" />
326+ <Input
327+ value={search}
328+ onChange={(e) => setSearch(e.target.value)}
329+ placeholder="Search tools..."
330+ className="h-8 text-xs pl-8 bg-background"
331+ />
332+ </div>
333+ <div className="space-y-1 max-h-[500px] overflow-y-auto">
334+ {filtered.length === 0 ? (
335+ <div className="flex items-center justify-center py-8 text-sm text-muted-foreground">
336+ {search ? "No tools match your search" : "No tools available"}
337+ </div>
338+ ) : (
339+ filtered.map((tool) => (
340+ <div
341+ key={tool.path}
342+ className="flex items-start gap-3 px-3 py-2.5 rounded-md hover:bg-accent/30 transition-colors"
343+ >
344+ <Zap className="h-3.5 w-3.5 mt-0.5 text-primary shrink-0" />
345+ <div className="flex-1 min-w-0">
346+ <div className="flex items-center gap-2 flex-wrap">
347+ <span className="text-sm font-mono font-medium">
348+ {tool.path}
349+ </span>
350+ {tool.approval === "required" && (
351+ <span className="inline-flex items-center gap-1 text-[9px] font-mono uppercase tracking-wider text-terminal-amber bg-terminal-amber/10 px-1.5 py-0.5 rounded border border-terminal-amber/20">
352+ <ShieldCheck className="h-2.5 w-2.5" />
353+ approval
354+ </span>
355+ )}
356+ {tool.source && (
357+ <span className="text-[9px] font-mono text-muted-foreground bg-muted px-1.5 py-0.5 rounded">
358+ {tool.source}
359+ </span>
360+ )}
361+ </div>
362+ <p className="text-[11px] text-muted-foreground mt-0.5 leading-relaxed">
363+ {tool.description}
364+ </p>
365+ </div>
366+ </div>
367+ ))
368+ )}
369+ </div>
370+ </div>
371+ );
372+}
373+
374+// ── Tools View ──
375+
376+export function ToolsView() {
377+ const { context, loading: sessionLoading } = useSession();
378+
379+ const {
380+ data: sources,
381+ loading: sourcesLoading,
382+ refresh: refreshSources,
383+ } = usePoll({
384+ fetcher: () => api.listToolSources(context!.workspaceId),
385+ enabled: !!context,
386+ interval: 10000,
387+ });
388+
389+ const {
390+ data: tools,
391+ loading: toolsLoading,
392+ refresh: refreshTools,
393+ } = usePoll({
394+ fetcher: () =>
395+ api.listToolsForContext({
396+ workspaceId: context!.workspaceId,
397+ actorId: context!.actorId,
398+ clientId: context!.clientId,
399+ }),
400+ enabled: !!context,
401+ interval: 10000,
402+ });
403+
404+ const refreshAll = () => {
405+ refreshSources();
406+ refreshTools();
407+ };
408+
409+ if (sessionLoading) {
410+ return (
411+ <div className="space-y-6">
412+ <Skeleton className="h-8 w-48" />
413+ <Skeleton className="h-64" />
414+ </div>
415+ );
416+ }
417+
418+ return (
419+ <div className="space-y-6">
420+ <PageHeader
421+ title="Tools"
422+ description="Manage tool sources and view available tools"
423+ >
424+ <Button
425+ variant="outline"
426+ size="sm"
427+ className="h-8 text-xs"
428+ onClick={refreshAll}
429+ >
430+ <RefreshCw className="h-3.5 w-3.5 mr-1.5" />
431+ Refresh
432+ </Button>
433+ </PageHeader>
434+
435+ <Tabs defaultValue="sources" className="w-full">
436+ <TabsList className="bg-muted/50 h-9">
437+ <TabsTrigger value="sources" className="text-xs data-[state=active]:bg-background">
438+ Sources
439+ {sources && (
440+ <span className="ml-1.5 text-[10px] font-mono text-muted-foreground">
441+ {sources.length}
442+ </span>
443+ )}
444+ </TabsTrigger>
445+ <TabsTrigger value="inventory" className="text-xs data-[state=active]:bg-background">
446+ Inventory
447+ {tools && (
448+ <span className="ml-1.5 text-[10px] font-mono text-muted-foreground">
449+ {tools.length}
450+ </span>
451+ )}
452+ </TabsTrigger>
453+ </TabsList>
454+
455+ <TabsContent value="sources" className="mt-4">
456+ <Card className="bg-card border-border">
457+ <CardHeader className="pb-3">
458+ <div className="flex items-center justify-between">
459+ <CardTitle className="text-sm font-medium flex items-center gap-2">
460+ <Server className="h-4 w-4 text-muted-foreground" />
461+ Tool Sources
462+ </CardTitle>
463+ <AddSourceDialog onAdded={refreshAll} />
464+ </div>
465+ </CardHeader>
466+ <CardContent className="pt-0">
467+ {sourcesLoading ? (
468+ <div className="space-y-2">
469+ {Array.from({ length: 3 }).map((_, i) => (
470+ <Skeleton key={i} className="h-16" />
471+ ))}
472+ </div>
473+ ) : !sources || sources.length === 0 ? (
474+ <div className="flex flex-col items-center justify-center py-12 gap-3">
475+ <div className="h-12 w-12 rounded-full bg-muted flex items-center justify-center">
476+ <Wrench className="h-6 w-6 text-muted-foreground/40" />
477+ </div>
478+ <p className="text-sm text-muted-foreground">
479+ No external tool sources
480+ </p>
481+ <p className="text-[11px] text-muted-foreground/60">
482+ Add MCP or OpenAPI sources to extend available tools
483+ </p>
484+ </div>
485+ ) : (
486+ <div className="space-y-2">
487+ {sources.map((s) => (
488+ <SourceCard key={s.id} source={s} onDeleted={refreshAll} />
489+ ))}
490+ </div>
491+ )}
492+ </CardContent>
493+ </Card>
494+ </TabsContent>
495+
496+ <TabsContent value="inventory" className="mt-4">
497+ <Card className="bg-card border-border">
498+ <CardHeader className="pb-3">
499+ <CardTitle className="text-sm font-medium flex items-center gap-2">
500+ <Zap className="h-4 w-4 text-primary" />
501+ Available Tools
502+ {tools && (
503+ <span className="text-[10px] font-mono bg-primary/10 text-primary px-1.5 py-0.5 rounded">
504+ {tools.length}
505+ </span>
506+ )}
507+ </CardTitle>
508+ </CardHeader>
509+ <CardContent className="pt-0">
510+ {toolsLoading ? (
511+ <div className="space-y-2">
512+ {Array.from({ length: 5 }).map((_, i) => (
513+ <Skeleton key={i} className="h-14" />
514+ ))}
515+ </div>
516+ ) : (
517+ <ToolInventory tools={tools ?? []} />
518+ )}
519+ </CardContent>
520+ </Card>
521+ </TabsContent>
522+ </Tabs>
523+ </div>
524+ );
525+}
executor/apps/web/src/components/ui/avatar.tsx+109−0
@@ -0,0 +1,109 @@
1+"use client"
2+
3+import * as React from "react"
4+import { Avatar as AvatarPrimitive } from "radix-ui"
5+
6+import { cn } from "@/lib/utils"
7+
8+function Avatar({
9+ className,
10+ size = "default",
11+ ...props
12+}: React.ComponentProps<typeof AvatarPrimitive.Root> & {
13+ size?: "default" | "sm" | "lg"
14+}) {
15+ return (
16+ <AvatarPrimitive.Root
17+ data-slot="avatar"
18+ data-size={size}
19+ className={cn(
20+ "group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6",
21+ className
22+ )}
23+ {...props}
24+ />
25+ )
26+}
27+
28+function AvatarImage({
29+ className,
30+ ...props
31+}: React.ComponentProps<typeof AvatarPrimitive.Image>) {
32+ return (
33+ <AvatarPrimitive.Image
34+ data-slot="avatar-image"
35+ className={cn("aspect-square size-full", className)}
36+ {...props}
37+ />
38+ )
39+}
40+
41+function AvatarFallback({
42+ className,
43+ ...props
44+}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
45+ return (
46+ <AvatarPrimitive.Fallback
47+ data-slot="avatar-fallback"
48+ className={cn(
49+ "bg-muted text-muted-foreground flex size-full items-center justify-center rounded-full text-sm group-data-[size=sm]/avatar:text-xs",
50+ className
51+ )}
52+ {...props}
53+ />
54+ )
55+}
56+
57+function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
58+ return (
59+ <span
60+ data-slot="avatar-badge"
61+ className={cn(
62+ "bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full ring-2 select-none",
63+ "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
64+ "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
65+ "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
66+ className
67+ )}
68+ {...props}
69+ />
70+ )
71+}
72+
73+function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
74+ return (
75+ <div
76+ data-slot="avatar-group"
77+ className={cn(
78+ "*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2",
79+ className
80+ )}
81+ {...props}
82+ />
83+ )
84+}
85+
86+function AvatarGroupCount({
87+ className,
88+ ...props
89+}: React.ComponentProps<"div">) {
90+ return (
91+ <div
92+ data-slot="avatar-group-count"
93+ className={cn(
94+ "bg-muted text-muted-foreground ring-background relative flex size-8 shrink-0 items-center justify-center rounded-full text-sm ring-2 group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
95+ className
96+ )}
97+ {...props}
98+ />
99+ )
100+}
101+
102+export {
103+ Avatar,
104+ AvatarImage,
105+ AvatarFallback,
106+ AvatarBadge,
107+ AvatarGroup,
108+ AvatarGroupCount,
109+}
executor/apps/web/src/components/ui/badge.tsx+48−0
@@ -0,0 +1,48 @@
1+import * as React from "react"
2+import { cva, type VariantProps } from "class-variance-authority"
3+import { Slot } from "radix-ui"
4+
5+import { cn } from "@/lib/utils"
6+
7+const badgeVariants = cva(
8+ "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
9+ {
10+ variants: {
11+ variant: {
12+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
13+ secondary:
14+ "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
15+ destructive:
16+ "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
17+ outline:
18+ "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
19+ ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
20+ link: "text-primary underline-offset-4 [a&]:hover:underline",
21+ },
22+ },
23+ defaultVariants: {
24+ variant: "default",
25+ },
26+ }
27+)
28+
29+function Badge({
30+ className,
31+ variant = "default",
32+ asChild = false,
33+ ...props
34+}: React.ComponentProps<"span"> &
35+ VariantProps<typeof badgeVariants> & { asChild?: boolean }) {
36+ const Comp = asChild ? Slot.Root : "span"
37+
38+ return (
39+ <Comp
40+ data-slot="badge"
41+ data-variant={variant}
42+ className={cn(badgeVariants({ variant }), className)}
43+ {...props}
44+ />
45+ )
46+}
47+
48+export { Badge, badgeVariants }
executor/apps/web/src/components/ui/button.tsx+64−0
@@ -0,0 +1,64 @@
1+import * as React from "react"
2+import { cva, type VariantProps } from "class-variance-authority"
3+import { Slot } from "radix-ui"
4+
5+import { cn } from "@/lib/utils"
6+
7+const buttonVariants = cva(
8+ "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
9+ {
10+ variants: {
11+ variant: {
12+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
13+ destructive:
14+ "bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
15+ outline:
16+ "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
17+ secondary:
18+ "bg-secondary text-secondary-foreground hover:bg-secondary/80",
19+ ghost:
20+ "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
21+ link: "text-primary underline-offset-4 hover:underline",
22+ },
23+ size: {
24+ default: "h-9 px-4 py-2 has-[>svg]:px-3",
25+ xs: "h-6 gap-1 rounded-md px-2 text-xs has-[>svg]:px-1.5 [&_svg:not([class*='size-'])]:size-3",
26+ sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
27+ lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
28+ icon: "size-9",
29+ "icon-xs": "size-6 rounded-md [&_svg:not([class*='size-'])]:size-3",
30+ "icon-sm": "size-8",
31+ "icon-lg": "size-10",
32+ },
33+ },
34+ defaultVariants: {
35+ variant: "default",
36+ size: "default",
37+ },
38+ }
39+)
40+
41+function Button({
42+ className,
43+ variant = "default",
44+ size = "default",
45+ asChild = false,
46+ ...props
47+}: React.ComponentProps<"button"> &
48+ VariantProps<typeof buttonVariants> & {
49+ asChild?: boolean
50+ }) {
51+ const Comp = asChild ? Slot.Root : "button"
52+
53+ return (
54+ <Comp
55+ data-slot="button"
56+ data-variant={variant}
57+ data-size={size}
58+ className={cn(buttonVariants({ variant, size, className }))}
59+ {...props}
60+ />
61+ )
62+}
63+
64+export { Button, buttonVariants }
executor/apps/web/src/components/ui/card.tsx+92−0
@@ -0,0 +1,92 @@
1+import * as React from "react"
2+
3+import { cn } from "@/lib/utils"
4+
5+function Card({ className, ...props }: React.ComponentProps<"div">) {
6+ return (
7+ <div
8+ data-slot="card"
9+ className={cn(
10+ "bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
11+ className
12+ )}
13+ {...props}
14+ />
15+ )
16+}
17+
18+function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
19+ return (
20+ <div
21+ data-slot="card-header"
22+ className={cn(
23+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
24+ className
25+ )}
26+ {...props}
27+ />
28+ )
29+}
30+
31+function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
32+ return (
33+ <div
34+ data-slot="card-title"
35+ className={cn("leading-none font-semibold", className)}
36+ {...props}
37+ />
38+ )
39+}
40+
41+function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
42+ return (
43+ <div
44+ data-slot="card-description"
45+ className={cn("text-muted-foreground text-sm", className)}
46+ {...props}
47+ />
48+ )
49+}
50+
51+function CardAction({ className, ...props }: React.ComponentProps<"div">) {
52+ return (
53+ <div
54+ data-slot="card-action"
55+ className={cn(
56+ "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
57+ className
58+ )}
59+ {...props}
60+ />
61+ )
62+}
63+
64+function CardContent({ className, ...props }: React.ComponentProps<"div">) {
65+ return (
66+ <div
67+ data-slot="card-content"
68+ className={cn("px-6", className)}
69+ {...props}
70+ />
71+ )
72+}
73+
74+function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
75+ return (
76+ <div
77+ data-slot="card-footer"
78+ className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
79+ {...props}
80+ />
81+ )
82+}
83+
84+export {
85+ Card,
86+ CardHeader,
87+ CardFooter,
88+ CardTitle,
89+ CardAction,
90+ CardDescription,
91+ CardContent,
92+}
executor/apps/web/src/components/ui/dialog.tsx+158−0
@@ -0,0 +1,158 @@
1+"use client"
2+
3+import * as React from "react"
4+import { XIcon } from "lucide-react"
5+import { Dialog as DialogPrimitive } from "radix-ui"
6+
7+import { cn } from "@/lib/utils"
8+import { Button } from "@/components/ui/button"
9+
10+function Dialog({
11+ ...props
12+}: React.ComponentProps<typeof DialogPrimitive.Root>) {
13+ return <DialogPrimitive.Root data-slot="dialog" {...props} />
14+}
15+
16+function DialogTrigger({
17+ ...props
18+}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
19+ return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
20+}
21+
22+function DialogPortal({
23+ ...props
24+}: React.ComponentProps<typeof DialogPrimitive.Portal>) {
25+ return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
26+}
27+
28+function DialogClose({
29+ ...props
30+}: React.ComponentProps<typeof DialogPrimitive.Close>) {
31+ return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
32+}
33+
34+function DialogOverlay({
35+ className,
36+ ...props
37+}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
38+ return (
39+ <DialogPrimitive.Overlay
40+ data-slot="dialog-overlay"
41+ className={cn(
42+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
43+ className
44+ )}
45+ {...props}
46+ />
47+ )
48+}
49+
50+function DialogContent({
51+ className,
52+ children,
53+ showCloseButton = true,
54+ ...props
55+}: React.ComponentProps<typeof DialogPrimitive.Content> & {
56+ showCloseButton?: boolean
57+}) {
58+ return (
59+ <DialogPortal data-slot="dialog-portal">
60+ <DialogOverlay />
61+ <DialogPrimitive.Content
62+ data-slot="dialog-content"
63+ className={cn(
64+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg",
65+ className
66+ )}
67+ {...props}
68+ >
69+ {children}
70+ {showCloseButton && (
71+ <DialogPrimitive.Close
72+ data-slot="dialog-close"
73+ className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4"
74+ >
75+ <XIcon />
76+ <span className="sr-only">Close</span>
77+ </DialogPrimitive.Close>
78+ )}
79+ </DialogPrimitive.Content>
80+ </DialogPortal>
81+ )
82+}
83+
84+function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
85+ return (
86+ <div
87+ data-slot="dialog-header"
88+ className={cn("flex flex-col gap-2 text-center sm:text-left", className)}
89+ {...props}
90+ />
91+ )
92+}
93+
94+function DialogFooter({
95+ className,
96+ showCloseButton = false,
97+ children,
98+ ...props
99+}: React.ComponentProps<"div"> & {
100+ showCloseButton?: boolean
101+}) {
102+ return (
103+ <div
104+ data-slot="dialog-footer"
105+ className={cn(
106+ "flex flex-col-reverse gap-2 sm:flex-row sm:justify-end",
107+ className
108+ )}
109+ {...props}
110+ >
111+ {children}
112+ {showCloseButton && (
113+ <DialogPrimitive.Close asChild>
114+ <Button variant="outline">Close</Button>
115+ </DialogPrimitive.Close>
116+ )}
117+ </div>
118+ )
119+}
120+
121+function DialogTitle({
122+ className,
123+ ...props
124+}: React.ComponentProps<typeof DialogPrimitive.Title>) {
125+ return (
126+ <DialogPrimitive.Title
127+ data-slot="dialog-title"
128+ className={cn("text-lg leading-none font-semibold", className)}
129+ {...props}
130+ />
131+ )
132+}
133+
134+function DialogDescription({
135+ className,
136+ ...props
137+}: React.ComponentProps<typeof DialogPrimitive.Description>) {
138+ return (
139+ <DialogPrimitive.Description
140+ data-slot="dialog-description"
141+ className={cn("text-muted-foreground text-sm", className)}
142+ {...props}
143+ />
144+ )
145+}
146+
147+export {
148+ Dialog,
149+ DialogClose,
150+ DialogContent,
151+ DialogDescription,
152+ DialogFooter,
153+ DialogHeader,
154+ DialogOverlay,
155+ DialogPortal,
156+ DialogTitle,
157+ DialogTrigger,
158+}
executor/apps/web/src/components/ui/dropdown-menu.tsx+257−0
@@ -0,0 +1,257 @@
1+"use client"
2+
3+import * as React from "react"
4+import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
5+import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"
6+
7+import { cn } from "@/lib/utils"
8+
9+function DropdownMenu({
10+ ...props
11+}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
12+ return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
13+}
14+
15+function DropdownMenuPortal({
16+ ...props
17+}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
18+ return (
19+ <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
20+ )
21+}
22+
23+function DropdownMenuTrigger({
24+ ...props
25+}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
26+ return (
27+ <DropdownMenuPrimitive.Trigger
28+ data-slot="dropdown-menu-trigger"
29+ {...props}
30+ />
31+ )
32+}
33+
34+function DropdownMenuContent({
35+ className,
36+ sideOffset = 4,
37+ ...props
38+}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {
39+ return (
40+ <DropdownMenuPrimitive.Portal>
41+ <DropdownMenuPrimitive.Content
42+ data-slot="dropdown-menu-content"
43+ sideOffset={sideOffset}
44+ className={cn(
45+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md",
46+ className
47+ )}
48+ {...props}
49+ />
50+ </DropdownMenuPrimitive.Portal>
51+ )
52+}
53+
54+function DropdownMenuGroup({
55+ ...props
56+}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
57+ return (
58+ <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
59+ )
60+}
61+
62+function DropdownMenuItem({
63+ className,
64+ inset,
65+ variant = "default",
66+ ...props
67+}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
68+ inset?: boolean
69+ variant?: "default" | "destructive"
70+}) {
71+ return (
72+ <DropdownMenuPrimitive.Item
73+ data-slot="dropdown-menu-item"
74+ data-inset={inset}
75+ data-variant={variant}
76+ className={cn(
77+ "focus:bg-accent focus:text-accent-foreground data-[variant=destructive]:text-destructive data-[variant=destructive]:focus:bg-destructive/10 dark:data-[variant=destructive]:focus:bg-destructive/20 data-[variant=destructive]:focus:text-destructive data-[variant=destructive]:*:[svg]:!text-destructive [&_svg:not([class*='text-'])]:text-muted-foreground relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
78+ className
79+ )}
80+ {...props}
81+ />
82+ )
83+}
84+
85+function DropdownMenuCheckboxItem({
86+ className,
87+ children,
88+ checked,
89+ ...props
90+}: React.ComponentProps<typeof DropdownMenuPrimitive.CheckboxItem>) {
91+ return (
92+ <DropdownMenuPrimitive.CheckboxItem
93+ data-slot="dropdown-menu-checkbox-item"
94+ className={cn(
95+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
96+ className
97+ )}
98+ checked={checked}
99+ {...props}
100+ >
101+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
102+ <DropdownMenuPrimitive.ItemIndicator>
103+ <CheckIcon className="size-4" />
104+ </DropdownMenuPrimitive.ItemIndicator>
105+ </span>
106+ {children}
107+ </DropdownMenuPrimitive.CheckboxItem>
108+ )
109+}
110+
111+function DropdownMenuRadioGroup({
112+ ...props
113+}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioGroup>) {
114+ return (
115+ <DropdownMenuPrimitive.RadioGroup
116+ data-slot="dropdown-menu-radio-group"
117+ {...props}
118+ />
119+ )
120+}
121+
122+function DropdownMenuRadioItem({
123+ className,
124+ children,
125+ ...props
126+}: React.ComponentProps<typeof DropdownMenuPrimitive.RadioItem>) {
127+ return (
128+ <DropdownMenuPrimitive.RadioItem
129+ data-slot="dropdown-menu-radio-item"
130+ className={cn(
131+ "focus:bg-accent focus:text-accent-foreground relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
132+ className
133+ )}
134+ {...props}
135+ >
136+ <span className="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
137+ <DropdownMenuPrimitive.ItemIndicator>
138+ <CircleIcon className="size-2 fill-current" />
139+ </DropdownMenuPrimitive.ItemIndicator>
140+ </span>
141+ {children}
142+ </DropdownMenuPrimitive.RadioItem>
143+ )
144+}
145+
146+function DropdownMenuLabel({
147+ className,
148+ inset,
149+ ...props
150+}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
151+ inset?: boolean
152+}) {
153+ return (
154+ <DropdownMenuPrimitive.Label
155+ data-slot="dropdown-menu-label"
156+ data-inset={inset}
157+ className={cn(
158+ "px-2 py-1.5 text-sm font-medium data-[inset]:pl-8",
159+ className
160+ )}
161+ {...props}
162+ />
163+ )
164+}
165+
166+function DropdownMenuSeparator({
167+ className,
168+ ...props
169+}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
170+ return (
171+ <DropdownMenuPrimitive.Separator
172+ data-slot="dropdown-menu-separator"
173+ className={cn("bg-border -mx-1 my-1 h-px", className)}
174+ {...props}
175+ />
176+ )
177+}
178+
179+function DropdownMenuShortcut({
180+ className,
181+ ...props
182+}: React.ComponentProps<"span">) {
183+ return (
184+ <span
185+ data-slot="dropdown-menu-shortcut"
186+ className={cn(
187+ "text-muted-foreground ml-auto text-xs tracking-widest",
188+ className
189+ )}
190+ {...props}
191+ />
192+ )
193+}
194+
195+function DropdownMenuSub({
196+ ...props
197+}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
198+ return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
199+}
200+
201+function DropdownMenuSubTrigger({
202+ className,
203+ inset,
204+ children,
205+ ...props
206+}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
207+ inset?: boolean
208+}) {
209+ return (
210+ <DropdownMenuPrimitive.SubTrigger
211+ data-slot="dropdown-menu-sub-trigger"
212+ data-inset={inset}
213+ className={cn(
214+ "focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[inset]:pl-8 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
215+ className
216+ )}
217+ {...props}
218+ >
219+ {children}
220+ <ChevronRightIcon className="ml-auto size-4" />
221+ </DropdownMenuPrimitive.SubTrigger>
222+ )
223+}
224+
225+function DropdownMenuSubContent({
226+ className,
227+ ...props
228+}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
229+ return (
230+ <DropdownMenuPrimitive.SubContent
231+ data-slot="dropdown-menu-sub-content"
232+ className={cn(
233+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-md border p-1 shadow-lg",
234+ className
235+ )}
236+ {...props}
237+ />
238+ )
239+}
240+
241+export {
242+ DropdownMenu,
243+ DropdownMenuPortal,
244+ DropdownMenuTrigger,
245+ DropdownMenuContent,
246+ DropdownMenuGroup,
247+ DropdownMenuLabel,
248+ DropdownMenuItem,
249+ DropdownMenuCheckboxItem,
250+ DropdownMenuRadioGroup,
251+ DropdownMenuRadioItem,
252+ DropdownMenuSeparator,
253+ DropdownMenuShortcut,
254+ DropdownMenuSub,
255+ DropdownMenuSubTrigger,
256+ DropdownMenuSubContent,
257+}
executor/apps/web/src/components/ui/input.tsx+21−0
@@ -0,0 +1,21 @@
1+import * as React from "react"
2+
3+import { cn } from "@/lib/utils"
4+
5+function Input({ className, type, ...props }: React.ComponentProps<"input">) {
6+ return (
7+ <input
8+ type={type}
9+ data-slot="input"
10+ className={cn(
11+ "file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
12+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
13+ "aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
14+ className
15+ )}
16+ {...props}
17+ />
18+ )
19+}
20+
21+export { Input }
executor/apps/web/src/components/ui/label.tsx+24−0
@@ -0,0 +1,24 @@
1+"use client"
2+
3+import * as React from "react"
4+import { Label as LabelPrimitive } from "radix-ui"
5+
6+import { cn } from "@/lib/utils"
7+
8+function Label({
9+ className,
10+ ...props
11+}: React.ComponentProps<typeof LabelPrimitive.Root>) {
12+ return (
13+ <LabelPrimitive.Root
14+ data-slot="label"
15+ className={cn(
16+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
17+ className
18+ )}
19+ {...props}
20+ />
21+ )
22+}
23+
24+export { Label }
executor/apps/web/src/components/ui/scroll-area.tsx+58−0
@@ -0,0 +1,58 @@
1+"use client"
2+
3+import * as React from "react"
4+import { ScrollArea as ScrollAreaPrimitive } from "radix-ui"
5+
6+import { cn } from "@/lib/utils"
7+
8+function ScrollArea({
9+ className,
10+ children,
11+ ...props
12+}: React.ComponentProps<typeof ScrollAreaPrimitive.Root>) {
13+ return (
14+ <ScrollAreaPrimitive.Root
15+ data-slot="scroll-area"
16+ className={cn("relative", className)}
17+ {...props}
18+ >
19+ <ScrollAreaPrimitive.Viewport
20+ data-slot="scroll-area-viewport"
21+ className="focus-visible:ring-ring/50 size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:outline-1"
22+ >
23+ {children}
24+ </ScrollAreaPrimitive.Viewport>
25+ <ScrollBar />
26+ <ScrollAreaPrimitive.Corner />
27+ </ScrollAreaPrimitive.Root>
28+ )
29+}
30+
31+function ScrollBar({
32+ className,
33+ orientation = "vertical",
34+ ...props
35+}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {
36+ return (
37+ <ScrollAreaPrimitive.ScrollAreaScrollbar
38+ data-slot="scroll-area-scrollbar"
39+ orientation={orientation}
40+ className={cn(
41+ "flex touch-none p-px transition-colors select-none",
42+ orientation === "vertical" &&
43+ "h-full w-2.5 border-l border-l-transparent",
44+ orientation === "horizontal" &&
45+ "h-2.5 flex-col border-t border-t-transparent",
46+ className
47+ )}
48+ {...props}
49+ >
50+ <ScrollAreaPrimitive.ScrollAreaThumb
51+ data-slot="scroll-area-thumb"
52+ className="bg-border relative flex-1 rounded-full"
53+ />
54+ </ScrollAreaPrimitive.ScrollAreaScrollbar>
55+ )
56+}
57+
58+export { ScrollArea, ScrollBar }
executor/apps/web/src/components/ui/select.tsx+190−0
@@ -0,0 +1,190 @@
1+"use client"
2+
3+import * as React from "react"
4+import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"
5+import { Select as SelectPrimitive } from "radix-ui"
6+
7+import { cn } from "@/lib/utils"
8+
9+function Select({
10+ ...props
11+}: React.ComponentProps<typeof SelectPrimitive.Root>) {
12+ return <SelectPrimitive.Root data-slot="select" {...props} />
13+}
14+
15+function SelectGroup({
16+ ...props
17+}: React.ComponentProps<typeof SelectPrimitive.Group>) {
18+ return <SelectPrimitive.Group data-slot="select-group" {...props} />
19+}
20+
21+function SelectValue({
22+ ...props
23+}: React.ComponentProps<typeof SelectPrimitive.Value>) {
24+ return <SelectPrimitive.Value data-slot="select-value" {...props} />
25+}
26+
27+function SelectTrigger({
28+ className,
29+ size = "default",
30+ children,
31+ ...props
32+}: React.ComponentProps<typeof SelectPrimitive.Trigger> & {
33+ size?: "sm" | "default"
34+}) {
35+ return (
36+ <SelectPrimitive.Trigger
37+ data-slot="select-trigger"
38+ data-size={size}
39+ className={cn(
40+ "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*='text-'])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
41+ className
42+ )}
43+ {...props}
44+ >
45+ {children}
46+ <SelectPrimitive.Icon asChild>
47+ <ChevronDownIcon className="size-4 opacity-50" />
48+ </SelectPrimitive.Icon>
49+ </SelectPrimitive.Trigger>
50+ )
51+}
52+
53+function SelectContent({
54+ className,
55+ children,
56+ position = "item-aligned",
57+ align = "center",
58+ ...props
59+}: React.ComponentProps<typeof SelectPrimitive.Content>) {
60+ return (
61+ <SelectPrimitive.Portal>
62+ <SelectPrimitive.Content
63+ data-slot="select-content"
64+ className={cn(
65+ "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-[8rem] origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md",
66+ position === "popper" &&
67+ "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1",
68+ className
69+ )}
70+ position={position}
71+ align={align}
72+ {...props}
73+ >
74+ <SelectScrollUpButton />
75+ <SelectPrimitive.Viewport
76+ className={cn(
77+ "p-1",
78+ position === "popper" &&
79+ "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1"
80+ )}
81+ >
82+ {children}
83+ </SelectPrimitive.Viewport>
84+ <SelectScrollDownButton />
85+ </SelectPrimitive.Content>
86+ </SelectPrimitive.Portal>
87+ )
88+}
89+
90+function SelectLabel({
91+ className,
92+ ...props
93+}: React.ComponentProps<typeof SelectPrimitive.Label>) {
94+ return (
95+ <SelectPrimitive.Label
96+ data-slot="select-label"
97+ className={cn("text-muted-foreground px-2 py-1.5 text-xs", className)}
98+ {...props}
99+ />
100+ )
101+}
102+
103+function SelectItem({
104+ className,
105+ children,
106+ ...props
107+}: React.ComponentProps<typeof SelectPrimitive.Item>) {
108+ return (
109+ <SelectPrimitive.Item
110+ data-slot="select-item"
111+ className={cn(
112+ "focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2",
113+ className
114+ )}
115+ {...props}
116+ >
117+ <span
118+ data-slot="select-item-indicator"
119+ className="absolute right-2 flex size-3.5 items-center justify-center"
120+ >
121+ <SelectPrimitive.ItemIndicator>
122+ <CheckIcon className="size-4" />
123+ </SelectPrimitive.ItemIndicator>
124+ </span>
125+ <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
126+ </SelectPrimitive.Item>
127+ )
128+}
129+
130+function SelectSeparator({
131+ className,
132+ ...props
133+}: React.ComponentProps<typeof SelectPrimitive.Separator>) {
134+ return (
135+ <SelectPrimitive.Separator
136+ data-slot="select-separator"
137+ className={cn("bg-border pointer-events-none -mx-1 my-1 h-px", className)}
138+ {...props}
139+ />
140+ )
141+}
142+
143+function SelectScrollUpButton({
144+ className,
145+ ...props
146+}: React.ComponentProps<typeof SelectPrimitive.ScrollUpButton>) {
147+ return (
148+ <SelectPrimitive.ScrollUpButton
149+ data-slot="select-scroll-up-button"
150+ className={cn(
151+ "flex cursor-default items-center justify-center py-1",
152+ className
153+ )}
154+ {...props}
155+ >
156+ <ChevronUpIcon className="size-4" />
157+ </SelectPrimitive.ScrollUpButton>
158+ )
159+}
160+
161+function SelectScrollDownButton({
162+ className,
163+ ...props
164+}: React.ComponentProps<typeof SelectPrimitive.ScrollDownButton>) {
165+ return (
166+ <SelectPrimitive.ScrollDownButton
167+ data-slot="select-scroll-down-button"
168+ className={cn(
169+ "flex cursor-default items-center justify-center py-1",
170+ className
171+ )}
172+ {...props}
173+ >
174+ <ChevronDownIcon className="size-4" />
175+ </SelectPrimitive.ScrollDownButton>
176+ )
177+}
178+
179+export {
180+ Select,
181+ SelectContent,
182+ SelectGroup,
183+ SelectItem,
184+ SelectLabel,
185+ SelectScrollDownButton,
186+ SelectScrollUpButton,
187+ SelectSeparator,
188+ SelectTrigger,
189+ SelectValue,
190+}
executor/apps/web/src/components/ui/separator.tsx+28−0
@@ -0,0 +1,28 @@
1+"use client"
2+
3+import * as React from "react"
4+import { Separator as SeparatorPrimitive } from "radix-ui"
5+
6+import { cn } from "@/lib/utils"
7+
8+function Separator({
9+ className,
10+ orientation = "horizontal",
11+ decorative = true,
12+ ...props
13+}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
14+ return (
15+ <SeparatorPrimitive.Root
16+ data-slot="separator"
17+ decorative={decorative}
18+ orientation={orientation}
19+ className={cn(
20+ "bg-border shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
21+ className
22+ )}
23+ {...props}
24+ />
25+ )
26+}
27+
28+export { Separator }
executor/apps/web/src/components/ui/sheet.tsx+143−0
@@ -0,0 +1,143 @@
1+"use client"
2+
3+import * as React from "react"
4+import { XIcon } from "lucide-react"
5+import { Dialog as SheetPrimitive } from "radix-ui"
6+
7+import { cn } from "@/lib/utils"
8+
9+function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
10+ return <SheetPrimitive.Root data-slot="sheet" {...props} />
11+}
12+
13+function SheetTrigger({
14+ ...props
15+}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
16+ return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />
17+}
18+
19+function SheetClose({
20+ ...props
21+}: React.ComponentProps<typeof SheetPrimitive.Close>) {
22+ return <SheetPrimitive.Close data-slot="sheet-close" {...props} />
23+}
24+
25+function SheetPortal({
26+ ...props
27+}: React.ComponentProps<typeof SheetPrimitive.Portal>) {
28+ return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />
29+}
30+
31+function SheetOverlay({
32+ className,
33+ ...props
34+}: React.ComponentProps<typeof SheetPrimitive.Overlay>) {
35+ return (
36+ <SheetPrimitive.Overlay
37+ data-slot="sheet-overlay"
38+ className={cn(
39+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
40+ className
41+ )}
42+ {...props}
43+ />
44+ )
45+}
46+
47+function SheetContent({
48+ className,
49+ children,
50+ side = "right",
51+ showCloseButton = true,
52+ ...props
53+}: React.ComponentProps<typeof SheetPrimitive.Content> & {
54+ side?: "top" | "right" | "bottom" | "left"
55+ showCloseButton?: boolean
56+}) {
57+ return (
58+ <SheetPortal>
59+ <SheetOverlay />
60+ <SheetPrimitive.Content
61+ data-slot="sheet-content"
62+ className={cn(
63+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-500",
64+ side === "right" &&
65+ "data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right inset-y-0 right-0 h-full w-3/4 border-l sm:max-w-sm",
66+ side === "left" &&
67+ "data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left inset-y-0 left-0 h-full w-3/4 border-r sm:max-w-sm",
68+ side === "top" &&
69+ "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
70+ side === "bottom" &&
71+ "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
72+ className
73+ )}
74+ {...props}
75+ >
76+ {children}
77+ {showCloseButton && (
78+ <SheetPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-secondary absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none">
79+ <XIcon className="size-4" />
80+ <span className="sr-only">Close</span>
81+ </SheetPrimitive.Close>
82+ )}
83+ </SheetPrimitive.Content>
84+ </SheetPortal>
85+ )
86+}
87+
88+function SheetHeader({ className, ...props }: React.ComponentProps<"div">) {
89+ return (
90+ <div
91+ data-slot="sheet-header"
92+ className={cn("flex flex-col gap-1.5 p-4", className)}
93+ {...props}
94+ />
95+ )
96+}
97+
98+function SheetFooter({ className, ...props }: React.ComponentProps<"div">) {
99+ return (
100+ <div
101+ data-slot="sheet-footer"
102+ className={cn("mt-auto flex flex-col gap-2 p-4", className)}
103+ {...props}
104+ />
105+ )
106+}
107+
108+function SheetTitle({
109+ className,
110+ ...props
111+}: React.ComponentProps<typeof SheetPrimitive.Title>) {
112+ return (
113+ <SheetPrimitive.Title
114+ data-slot="sheet-title"
115+ className={cn("text-foreground font-semibold", className)}
116+ {...props}
117+ />
118+ )
119+}
120+
121+function SheetDescription({
122+ className,
123+ ...props
124+}: React.ComponentProps<typeof SheetPrimitive.Description>) {
125+ return (
126+ <SheetPrimitive.Description
127+ data-slot="sheet-description"
128+ className={cn("text-muted-foreground text-sm", className)}
129+ {...props}
130+ />
131+ )
132+}
133+
134+export {
135+ Sheet,
136+ SheetTrigger,
137+ SheetClose,
138+ SheetContent,
139+ SheetHeader,
140+ SheetFooter,
141+ SheetTitle,
142+ SheetDescription,
143+}
executor/apps/web/src/components/ui/skeleton.tsx+13−0
@@ -0,0 +1,13 @@
1+import { cn } from "@/lib/utils"
2+
3+function Skeleton({ className, ...props }: React.ComponentProps<"div">) {
4+ return (
5+ <div
6+ data-slot="skeleton"
7+ className={cn("bg-accent animate-pulse rounded-md", className)}
8+ {...props}
9+ />
10+ )
11+}
12+
13+export { Skeleton }
executor/apps/web/src/components/ui/sonner.tsx+40−0
@@ -0,0 +1,40 @@
1+"use client"
2+
3+import {
4+ CircleCheckIcon,
5+ InfoIcon,
6+ Loader2Icon,
7+ OctagonXIcon,
8+ TriangleAlertIcon,
9+} from "lucide-react"
10+import { useTheme } from "next-themes"
11+import { Toaster as Sonner, type ToasterProps } from "sonner"
12+
13+const Toaster = ({ ...props }: ToasterProps) => {
14+ const { theme = "system" } = useTheme()
15+
16+ return (
17+ <Sonner
18+ theme={theme as ToasterProps["theme"]}
19+ className="toaster group"
20+ icons={{
21+ success: <CircleCheckIcon className="size-4" />,
22+ info: <InfoIcon className="size-4" />,
23+ warning: <TriangleAlertIcon className="size-4" />,
24+ error: <OctagonXIcon className="size-4" />,
25+ loading: <Loader2Icon className="size-4 animate-spin" />,
26+ }}
27+ style={
28+ {
29+ "--normal-bg": "var(--popover)",
30+ "--normal-text": "var(--popover-foreground)",
31+ "--normal-border": "var(--border)",
32+ "--border-radius": "var(--radius)",
33+ } as React.CSSProperties
34+ }
35+ {...props}
36+ />
37+ )
38+}
39+
40+export { Toaster }
executor/apps/web/src/components/ui/switch.tsx+35−0
@@ -0,0 +1,35 @@
1+"use client"
2+
3+import * as React from "react"
4+import { Switch as SwitchPrimitive } from "radix-ui"
5+
6+import { cn } from "@/lib/utils"
7+
8+function Switch({
9+ className,
10+ size = "default",
11+ ...props
12+}: React.ComponentProps<typeof SwitchPrimitive.Root> & {
13+ size?: "sm" | "default"
14+}) {
15+ return (
16+ <SwitchPrimitive.Root
17+ data-slot="switch"
18+ data-size={size}
19+ className={cn(
20+ "peer data-[state=checked]:bg-primary data-[state=unchecked]:bg-input focus-visible:border-ring focus-visible:ring-ring/50 dark:data-[state=unchecked]:bg-input/80 group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6",
21+ className
22+ )}
23+ {...props}
24+ >
25+ <SwitchPrimitive.Thumb
26+ data-slot="switch-thumb"
27+ className={cn(
28+ "bg-background dark:data-[state=unchecked]:bg-foreground dark:data-[state=checked]:bg-primary-foreground pointer-events-none block rounded-full ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0"
29+ )}
30+ />
31+ </SwitchPrimitive.Root>
32+ )
33+}
34+
35+export { Switch }
executor/apps/web/src/components/ui/tabs.tsx+91−0
@@ -0,0 +1,91 @@
1+"use client"
2+
3+import * as React from "react"
4+import { cva, type VariantProps } from "class-variance-authority"
5+import { Tabs as TabsPrimitive } from "radix-ui"
6+
7+import { cn } from "@/lib/utils"
8+
9+function Tabs({
10+ className,
11+ orientation = "horizontal",
12+ ...props
13+}: React.ComponentProps<typeof TabsPrimitive.Root>) {
14+ return (
15+ <TabsPrimitive.Root
16+ data-slot="tabs"
17+ data-orientation={orientation}
18+ orientation={orientation}
19+ className={cn(
20+ "group/tabs flex gap-2 data-[orientation=horizontal]:flex-col",
21+ className
22+ )}
23+ {...props}
24+ />
25+ )
26+}
27+
28+const tabsListVariants = cva(
29+ "rounded-lg p-[3px] group-data-[orientation=horizontal]/tabs:h-9 data-[variant=line]:rounded-none group/tabs-list text-muted-foreground inline-flex w-fit items-center justify-center group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
30+ {
31+ variants: {
32+ variant: {
33+ default: "bg-muted",
34+ line: "gap-1 bg-transparent",
35+ },
36+ },
37+ defaultVariants: {
38+ variant: "default",
39+ },
40+ }
41+)
42+
43+function TabsList({
44+ className,
45+ variant = "default",
46+ ...props
47+}: React.ComponentProps<typeof TabsPrimitive.List> &
48+ VariantProps<typeof tabsListVariants>) {
49+ return (
50+ <TabsPrimitive.List
51+ data-slot="tabs-list"
52+ data-variant={variant}
53+ className={cn(tabsListVariants({ variant }), className)}
54+ {...props}
55+ />
56+ )
57+}
58+
59+function TabsTrigger({
60+ className,
61+ ...props
62+}: React.ComponentProps<typeof TabsPrimitive.Trigger>) {
63+ return (
64+ <TabsPrimitive.Trigger
65+ data-slot="tabs-trigger"
66+ className={cn(
67+ "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring text-foreground/60 hover:text-foreground dark:text-muted-foreground dark:hover:text-foreground relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-md border border-transparent px-2 py-1 text-sm font-medium whitespace-nowrap transition-all group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 group-data-[variant=default]/tabs-list:data-[state=active]:shadow-sm group-data-[variant=line]/tabs-list:data-[state=active]:shadow-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
68+ "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:border-transparent dark:group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent",
69+ "data-[state=active]:bg-background dark:data-[state=active]:text-foreground dark:data-[state=active]:border-input dark:data-[state=active]:bg-input/30 data-[state=active]:text-foreground",
70+ "after:bg-foreground after:absolute after:opacity-0 after:transition-opacity group-data-[orientation=horizontal]/tabs:after:inset-x-0 group-data-[orientation=horizontal]/tabs:after:bottom-[-5px] group-data-[orientation=horizontal]/tabs:after:h-0.5 group-data-[orientation=vertical]/tabs:after:inset-y-0 group-data-[orientation=vertical]/tabs:after:-right-1 group-data-[orientation=vertical]/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",
71+ className
72+ )}
73+ {...props}
74+ />
75+ )
76+}
77+
78+function TabsContent({
79+ className,
80+ ...props
81+}: React.ComponentProps<typeof TabsPrimitive.Content>) {
82+ return (
83+ <TabsPrimitive.Content
84+ data-slot="tabs-content"
85+ className={cn("flex-1 outline-none", className)}
86+ {...props}
87+ />
88+ )
89+}
90+
91+export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
executor/apps/web/src/components/ui/textarea.tsx+18−0
@@ -0,0 +1,18 @@
1+import * as React from "react"
2+
3+import { cn } from "@/lib/utils"
4+
5+function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6+ return (
7+ <textarea
8+ data-slot="textarea"
9+ className={cn(
10+ "border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-xs transition-[color,box-shadow] outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
11+ className
12+ )}
13+ {...props}
14+ />
15+ )
16+}
17+
18+export { Textarea }
executor/apps/web/src/components/ui/tooltip.tsx+57−0
@@ -0,0 +1,57 @@
1+"use client"
2+
3+import * as React from "react"
4+import { Tooltip as TooltipPrimitive } from "radix-ui"
5+
6+import { cn } from "@/lib/utils"
7+
8+function TooltipProvider({
9+ delayDuration = 0,
10+ ...props
11+}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
12+ return (
13+ <TooltipPrimitive.Provider
14+ data-slot="tooltip-provider"
15+ delayDuration={delayDuration}
16+ {...props}
17+ />
18+ )
19+}
20+
21+function Tooltip({
22+ ...props
23+}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
24+ return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
25+}
26+
27+function TooltipTrigger({
28+ ...props
29+}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
30+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
31+}
32+
33+function TooltipContent({
34+ className,
35+ sideOffset = 0,
36+ children,
37+ ...props
38+}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
39+ return (
40+ <TooltipPrimitive.Portal>
41+ <TooltipPrimitive.Content
42+ data-slot="tooltip-content"
43+ sideOffset={sideOffset}
44+ className={cn(
45+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
46+ className
47+ )}
48+ {...props}
49+ >
50+ {children}
51+ <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
52+ </TooltipPrimitive.Content>
53+ </TooltipPrimitive.Portal>
54+ )
55+}
56+
57+export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
executor/apps/web/src/hooks/use-poll.ts+53−0
@@ -0,0 +1,53 @@
1+"use client";
2+
3+import { useEffect, useState, useCallback, useRef } from "react";
4+
5+interface UsePollOptions<T> {
6+ fetcher: () => Promise<T>;
7+ interval?: number;
8+ enabled?: boolean;
9+}
10+
11+interface UsePollResult<T> {
12+ data: T | null;
13+ loading: boolean;
14+ error: string | null;
15+ refresh: () => Promise<void>;
16+}
17+
18+export function usePoll<T>({
19+ fetcher,
20+ interval = 4000,
21+ enabled = true,
22+}: UsePollOptions<T>): UsePollResult<T> {
23+ const [data, setData] = useState<T | null>(null);
24+ const [loading, setLoading] = useState(true);
25+ const [error, setError] = useState<string | null>(null);
26+ const fetcherRef = useRef(fetcher);
27+ fetcherRef.current = fetcher;
28+
29+ const refresh = useCallback(async () => {
30+ try {
31+ const result = await fetcherRef.current();
32+ setData(result);
33+ setError(null);
34+ } catch (err) {
35+ setError(err instanceof Error ? err.message : "Fetch failed");
36+ } finally {
37+ setLoading(false);
38+ }
39+ }, []);
40+
41+ useEffect(() => {
42+ if (!enabled) {
43+ setLoading(false);
44+ return;
45+ }
46+
47+ refresh();
48+ const timer = setInterval(refresh, interval);
49+ return () => clearInterval(timer);
50+ }, [enabled, interval, refresh]);
51+
52+ return { data, loading, error, refresh };
53+}
executor/apps/web/src/lib/api.ts+249−0
@@ -0,0 +1,249 @@
1+// Thin API client that calls through the Next.js rewrite proxy (/api/* -> backend)
2+
3+import type {
4+ AnonymousContext,
5+ TaskRecord,
6+ CreateTaskRequest,
7+ CreateTaskResponse,
8+ ApprovalRecord,
9+ PendingApprovalRecord,
10+ ResolveApprovalRequest,
11+ RuntimeTargetDescriptor,
12+ ToolDescriptor,
13+ ToolSourceRecord,
14+ AccessPolicyRecord,
15+ CredentialDescriptor,
16+ TaskEventRecord,
17+} from "./types";
18+
19+const BASE = "";
20+
21+async function json<T>(res: Response): Promise<T> {
22+ if (!res.ok) {
23+ const text = await res.text();
24+ throw new Error(`${res.status} ${res.statusText}: ${text}`);
25+ }
26+ return res.json() as Promise<T>;
27+}
28+
29+// ── Auth ──
30+
31+export async function bootstrapAnonymousContext(
32+ sessionId?: string,
33+): Promise<AnonymousContext> {
34+ const res = await fetch(`${BASE}/api/auth/anonymous/bootstrap`, {
35+ method: "POST",
36+ headers: { "content-type": "application/json" },
37+ body: JSON.stringify({ sessionId }),
38+ });
39+ return json<AnonymousContext>(res);
40+}
41+
42+// ── Tasks ──
43+
44+export async function createTask(
45+ request: CreateTaskRequest,
46+): Promise<CreateTaskResponse> {
47+ const res = await fetch(`${BASE}/api/tasks`, {
48+ method: "POST",
49+ headers: { "content-type": "application/json" },
50+ body: JSON.stringify(request),
51+ });
52+ return json<CreateTaskResponse>(res);
53+}
54+
55+export async function listTasks(workspaceId: string): Promise<TaskRecord[]> {
56+ const res = await fetch(
57+ `${BASE}/api/tasks?workspaceId=${encodeURIComponent(workspaceId)}`,
58+ );
59+ return json<TaskRecord[]>(res);
60+}
61+
62+export async function getTask(
63+ taskId: string,
64+ workspaceId: string,
65+): Promise<TaskRecord> {
66+ const res = await fetch(
67+ `${BASE}/api/tasks/${encodeURIComponent(taskId)}?workspaceId=${encodeURIComponent(workspaceId)}`,
68+ );
69+ return json<TaskRecord>(res);
70+}
71+
72+// ── Approvals ──
73+
74+export async function listPendingApprovals(
75+ workspaceId: string,
76+): Promise<PendingApprovalRecord[]> {
77+ const res = await fetch(
78+ `${BASE}/api/approvals?workspaceId=${encodeURIComponent(workspaceId)}&status=pending`,
79+ );
80+ return json<PendingApprovalRecord[]>(res);
81+}
82+
83+export async function listApprovals(
84+ workspaceId: string,
85+ status?: string,
86+): Promise<ApprovalRecord[]> {
87+ const params = new URLSearchParams({ workspaceId });
88+ if (status) params.set("status", status);
89+ const res = await fetch(`${BASE}/api/approvals?${params.toString()}`);
90+ return json<ApprovalRecord[]>(res);
91+}
92+
93+export async function resolveApproval(
94+ approvalId: string,
95+ request: ResolveApprovalRequest,
96+): Promise<{ approval: ApprovalRecord; task: TaskRecord }> {
97+ const res = await fetch(
98+ `${BASE}/api/approvals/${encodeURIComponent(approvalId)}`,
99+ {
100+ method: "POST",
101+ headers: { "content-type": "application/json" },
102+ body: JSON.stringify(request),
103+ },
104+ );
105+ return json<{ approval: ApprovalRecord; task: TaskRecord }>(res);
106+}
107+
108+// ── Runtimes ──
109+
110+export async function listRuntimeTargets(): Promise<
111+ RuntimeTargetDescriptor[]
112+> {
113+ const res = await fetch(`${BASE}/api/runtime-targets`);
114+ return json<RuntimeTargetDescriptor[]>(res);
115+}
116+
117+// ── Tools ──
118+
119+export async function listToolsForContext(context: {
120+ workspaceId: string;
121+ actorId?: string;
122+ clientId?: string;
123+}): Promise<ToolDescriptor[]> {
124+ const params = new URLSearchParams({ workspaceId: context.workspaceId });
125+ if (context.actorId) params.set("actorId", context.actorId);
126+ if (context.clientId) params.set("clientId", context.clientId);
127+ const res = await fetch(`${BASE}/api/tools?${params.toString()}`);
128+ return json<ToolDescriptor[]>(res);
129+}
130+
131+// ── Tool Sources ──
132+
133+export async function listToolSources(
134+ workspaceId: string,
135+): Promise<ToolSourceRecord[]> {
136+ const res = await fetch(
137+ `${BASE}/api/tool-sources?workspaceId=${encodeURIComponent(workspaceId)}`,
138+ );
139+ return json<ToolSourceRecord[]>(res);
140+}
141+
142+export async function upsertToolSource(request: {
143+ id?: string;
144+ workspaceId: string;
145+ name: string;
146+ type: "mcp" | "openapi";
147+ config: Record<string, unknown>;
148+ enabled?: boolean;
149+}): Promise<ToolSourceRecord> {
150+ const res = await fetch(`${BASE}/api/tool-sources`, {
151+ method: "POST",
152+ headers: { "content-type": "application/json" },
153+ body: JSON.stringify(request),
154+ });
155+ return json<ToolSourceRecord>(res);
156+}
157+
158+export async function deleteToolSource(
159+ workspaceId: string,
160+ sourceId: string,
161+): Promise<{ ok: boolean }> {
162+ const res = await fetch(
163+ `${BASE}/api/tool-sources/${encodeURIComponent(sourceId)}?workspaceId=${encodeURIComponent(workspaceId)}`,
164+ { method: "DELETE" },
165+ );
166+ return json<{ ok: boolean }>(res);
167+}
168+
169+// ── Policies ──
170+
171+export async function listPolicies(
172+ workspaceId: string,
173+): Promise<AccessPolicyRecord[]> {
174+ const res = await fetch(
175+ `${BASE}/api/policies?workspaceId=${encodeURIComponent(workspaceId)}`,
176+ );
177+ return json<AccessPolicyRecord[]>(res);
178+}
179+
180+export async function upsertPolicy(request: {
181+ id?: string;
182+ workspaceId: string;
183+ actorId?: string;
184+ clientId?: string;
185+ toolPathPattern: string;
186+ decision: string;
187+ priority?: number;
188+}): Promise<AccessPolicyRecord> {
189+ const res = await fetch(`${BASE}/api/policies`, {
190+ method: "POST",
191+ headers: { "content-type": "application/json" },
192+ body: JSON.stringify(request),
193+ });
194+ return json<AccessPolicyRecord>(res);
195+}
196+
197+// ── Credentials ──
198+
199+export async function listCredentials(
200+ workspaceId: string,
201+): Promise<CredentialDescriptor[]> {
202+ const res = await fetch(
203+ `${BASE}/api/credentials?workspaceId=${encodeURIComponent(workspaceId)}`,
204+ );
205+ return json<CredentialDescriptor[]>(res);
206+}
207+
208+export async function upsertCredential(request: {
209+ id?: string;
210+ workspaceId: string;
211+ sourceKey: string;
212+ scope: string;
213+ actorId?: string;
214+ secretJson: Record<string, unknown>;
215+}): Promise<CredentialDescriptor> {
216+ const res = await fetch(`${BASE}/api/credentials`, {
217+ method: "POST",
218+ headers: { "content-type": "application/json" },
219+ body: JSON.stringify(request),
220+ });
221+ return json<CredentialDescriptor>(res);
222+}
223+
224+// ── SSE ──
225+
226+export function subscribeToTaskEvents(
227+ taskId: string,
228+ workspaceId: string,
229+ onEvent: (
230+ eventName: TaskEventRecord["eventName"],
231+ event: TaskEventRecord,
232+ ) => void,
233+): EventSource {
234+ const source = new EventSource(
235+ `${BASE}/api/tasks/${encodeURIComponent(taskId)}/events?workspaceId=${encodeURIComponent(workspaceId)}`,
236+ );
237+
238+ source.addEventListener("task", (event) => {
239+ const message = event as MessageEvent<string>;
240+ onEvent("task", JSON.parse(message.data) as TaskEventRecord);
241+ });
242+
243+ source.addEventListener("approval", (event) => {
244+ const message = event as MessageEvent<string>;
245+ onEvent("approval", JSON.parse(message.data) as TaskEventRecord);
246+ });
247+
248+ return source;
249+}
executor/apps/web/src/lib/session-context.tsx+68−0
@@ -0,0 +1,68 @@
1+"use client";
2+
3+import {
4+ createContext,
5+ useContext,
6+ useEffect,
7+ useState,
8+ useCallback,
9+ type ReactNode,
10+} from "react";
11+import { bootstrapAnonymousContext } from "./api";
12+import type { AnonymousContext } from "./types";
13+
14+interface SessionState {
15+ context: AnonymousContext | null;
16+ loading: boolean;
17+ error: string | null;
18+ resetWorkspace: () => Promise<void>;
19+}
20+
21+const SessionContext = createContext<SessionState>({
22+ context: null,
23+ loading: true,
24+ error: null,
25+ resetWorkspace: async () => {},
26+});
27+
28+const SESSION_KEY = "executor_session_id";
29+
30+export function SessionProvider({ children }: { children: ReactNode }) {
31+ const [context, setContext] = useState<AnonymousContext | null>(null);
32+ const [loading, setLoading] = useState(true);
33+ const [error, setError] = useState<string | null>(null);
34+
35+ const bootstrap = useCallback(async (sessionId?: string) => {
36+ setLoading(true);
37+ setError(null);
38+ try {
39+ const ctx = await bootstrapAnonymousContext(sessionId);
40+ localStorage.setItem(SESSION_KEY, ctx.sessionId);
41+ setContext(ctx);
42+ } catch (err) {
43+ setError(err instanceof Error ? err.message : "Failed to bootstrap session");
44+ } finally {
45+ setLoading(false);
46+ }
47+ }, []);
48+
49+ useEffect(() => {
50+ const stored = localStorage.getItem(SESSION_KEY);
51+ bootstrap(stored ?? undefined);
52+ }, [bootstrap]);
53+
54+ const resetWorkspace = useCallback(async () => {
55+ localStorage.removeItem(SESSION_KEY);
56+ await bootstrap();
57+ }, [bootstrap]);
58+
59+ return (
60+ <SessionContext.Provider value={{ context, loading, error, resetWorkspace }}>
61+ {children}
62+ </SessionContext.Provider>
63+ );
64+}
65+
66+export function useSession() {
67+ return useContext(SessionContext);
68+}
executor/apps/web/src/lib/types.ts+141−0
@@ -0,0 +1,141 @@
1+// Re-declare types locally since we can't use the monorepo contracts package
2+// from the Next.js app easily. These mirror @executor/contracts exactly.
3+
4+export type TaskStatus =
5+ | "queued"
6+ | "running"
7+ | "completed"
8+ | "failed"
9+ | "timed_out"
10+ | "denied";
11+
12+export type ApprovalStatus = "pending" | "approved" | "denied";
13+export type ApprovalDecision = "approved" | "denied";
14+export type PolicyDecision = "allow" | "require_approval" | "deny";
15+export type CredentialScope = "workspace" | "actor";
16+
17+export interface CreateTaskRequest {
18+ code: string;
19+ runtimeId?: string;
20+ timeoutMs?: number;
21+ metadata?: Record<string, unknown>;
22+ workspaceId: string;
23+ actorId: string;
24+ clientId?: string;
25+}
26+
27+export interface CreateTaskResponse {
28+ taskId: string;
29+ status: TaskStatus;
30+}
31+
32+export interface TaskRecord {
33+ id: string;
34+ code: string;
35+ runtimeId: string;
36+ timeoutMs: number;
37+ metadata: Record<string, unknown>;
38+ workspaceId: string;
39+ actorId?: string;
40+ clientId?: string;
41+ status: TaskStatus;
42+ createdAt: number;
43+ updatedAt: number;
44+ startedAt?: number;
45+ completedAt?: number;
46+ stdout?: string;
47+ stderr?: string;
48+ exitCode?: number;
49+ error?: string;
50+}
51+
52+export interface ApprovalRecord {
53+ id: string;
54+ taskId: string;
55+ toolPath: string;
56+ input: unknown;
57+ status: ApprovalStatus;
58+ createdAt: number;
59+ resolvedAt?: number;
60+ reviewerId?: string;
61+ reason?: string;
62+}
63+
64+export interface PendingApprovalRecord extends ApprovalRecord {
65+ task: Pick<
66+ TaskRecord,
67+ "id" | "status" | "runtimeId" | "timeoutMs" | "createdAt"
68+ >;
69+}
70+
71+export interface ResolveApprovalRequest {
72+ workspaceId: string;
73+ decision: ApprovalDecision;
74+ reviewerId?: string;
75+ reason?: string;
76+}
77+
78+export interface AnonymousContext {
79+ sessionId: string;
80+ workspaceId: string;
81+ actorId: string;
82+ clientId: string;
83+ createdAt: number;
84+ lastSeenAt: number;
85+}
86+
87+export interface RuntimeTargetDescriptor {
88+ id: string;
89+ label: string;
90+ description: string;
91+}
92+
93+export interface ToolDescriptor {
94+ path: string;
95+ description: string;
96+ approval: "auto" | "required";
97+ source?: string;
98+ argsType?: string;
99+ returnsType?: string;
100+}
101+
102+export interface AccessPolicyRecord {
103+ id: string;
104+ workspaceId: string;
105+ actorId?: string;
106+ clientId?: string;
107+ toolPathPattern: string;
108+ decision: PolicyDecision;
109+ priority: number;
110+ createdAt: number;
111+ updatedAt: number;
112+}
113+
114+export interface CredentialDescriptor {
115+ id: string;
116+ workspaceId: string;
117+ sourceKey: string;
118+ scope: CredentialScope;
119+ actorId?: string;
120+ hasSecret: boolean;
121+}
122+
123+export interface ToolSourceRecord {
124+ id: string;
125+ workspaceId: string;
126+ name: string;
127+ type: "mcp" | "openapi";
128+ config: Record<string, unknown>;
129+ enabled: boolean;
130+ createdAt: number;
131+ updatedAt: number;
132+}
133+
134+export interface TaskEventRecord {
135+ id: number;
136+ taskId: string;
137+ eventName: "task" | "approval";
138+ type: string;
139+ payload: Record<string, unknown>;
140+ createdAt: number;
141+}
executor/apps/web/src/lib/utils.ts+6−0
@@ -0,0 +1,6 @@
1+import { clsx, type ClassValue } from "clsx"
2+import { twMerge } from "tailwind-merge"
3+
4+export function cn(...inputs: ClassValue[]) {
5+ return twMerge(clsx(inputs))
6+}
executor/apps/web/src/main.ts+0−643
@@ -1,643 +0,0 @@
1−type TaskStatus =
2− | "queued"
3− | "running"
4− | "completed"
5− | "failed"
6− | "timed_out"
7− | "denied";
8−
9−interface TaskRecord {
10− id: string;
11− runtimeId: string;
12− timeoutMs: number;
13− status: TaskStatus;
14− code: string;
15− createdAt: number;
16− startedAt?: number;
17− completedAt?: number;
18− stdout?: string;
19− stderr?: string;
20− error?: string;
21− exitCode?: number;
22−}
23−
24−interface PendingApproval {
25− id: string;
26− taskId: string;
27− toolPath: string;
28− input: unknown;
29− createdAt: number;
30− task: {
31− id: string;
32− status: TaskStatus;
33− runtimeId: string;
34− timeoutMs: number;
35− createdAt: number;
36− };
37−}
38−
39−interface RuntimeTarget {
40− id: string;
41− label: string;
42− description: string;
43−}
44−
45−interface ToolDescriptor {
46− path: string;
47− description: string;
48− approval: "auto" | "required";
49− source?: string;
50− argsType?: string;
51− returnsType?: string;
52−}
53−
54−interface ToolSourceRecord {
55− id: string;
56− workspaceId: string;
57− name: string;
58− type: "mcp" | "openapi";
59− config: Record<string, unknown>;
60− enabled: boolean;
61− createdAt: number;
62− updatedAt: number;
63−}
64−
65−interface AnonymousContext {
66− sessionId: string;
67− workspaceId: string;
68− actorId: string;
69− clientId: string;
70−}
71−
72−const state = {
73− tasks: [] as TaskRecord[],
74− approvals: [] as PendingApproval[],
75− runtimes: [] as RuntimeTarget[],
76− toolSources: [] as ToolSourceRecord[],
77− tools: [] as ToolDescriptor[],
78− selectedTaskId: null as string | null,
79− context: null as AnonymousContext | null,
80−};
81−
82−const els = {
83− form: document.querySelector<HTMLFormElement>("#new-task-form")!,
84− runtimeSelect: document.querySelector<HTMLSelectElement>("#runtime-id")!,
85− timeoutInput: document.querySelector<HTMLInputElement>("#timeout-ms")!,
86− code: document.querySelector<HTMLTextAreaElement>("#task-code")!,
87− contextWorkspace: document.querySelector<HTMLElement>("#context-workspace"),
88− contextActor: document.querySelector<HTMLElement>("#context-actor"),
89− contextSession: document.querySelector<HTMLElement>("#context-session"),
90− resetSessionButton: document.querySelector<HTMLButtonElement>("#reset-session-button"),
91− sourceForm: document.querySelector<HTMLFormElement>("#source-form"),
92− sourceType: document.querySelector<HTMLSelectElement>("#source-type"),
93− sourceName: document.querySelector<HTMLInputElement>("#source-name"),
94− sourceUrl: document.querySelector<HTMLInputElement>("#source-url"),
95− openapiBaseUrlWrap: document.querySelector<HTMLElement>("#openapi-base-url-wrap"),
96− openapiBaseUrl: document.querySelector<HTMLInputElement>("#openapi-base-url"),
97− openapiAuthGrid: document.querySelector<HTMLElement>("#openapi-auth-grid"),
98− openapiAuthMode: document.querySelector<HTMLSelectElement>("#openapi-auth-mode"),
99− openapiApiKeyHeader: document.querySelector<HTMLInputElement>("#openapi-api-key-header"),
100− openapiStaticTokenWrap: document.querySelector<HTMLElement>("#openapi-static-token-wrap"),
101− openapiStaticToken: document.querySelector<HTMLInputElement>("#openapi-static-token"),
102− toolSourcesList: document.querySelector<HTMLDivElement>("#tool-sources-list"),
103− toolInventoryList: document.querySelector<HTMLDivElement>("#tool-inventory-list"),
104− toolCount: document.querySelector<HTMLElement>("#tool-count"),
105− metricPending: document.querySelector<HTMLElement>("#metric-pending"),
106− metricTotalTasks: document.querySelector<HTMLElement>("#metric-total-tasks"),
107− metricRunning: document.querySelector<HTMLElement>("#metric-running"),
108− approvalsList: document.querySelector<HTMLDivElement>("#approvals-list")!,
109− approvalCount: document.querySelector<HTMLSpanElement>("#approval-count")!,
110− tasksList: document.querySelector<HTMLDivElement>("#tasks-list")!,
111− taskDetail: document.querySelector<HTMLDivElement>("#task-detail")!,
112− refreshButton: document.querySelector<HTMLButtonElement>("#refresh-button")!,
113−};
114−
115−let selectedTaskStream: EventSource | null = null;
116−const ANON_SESSION_STORAGE_KEY = "executor.anonymous.session_id";
117−
118−async function requestJson<T>(path: string, init?: RequestInit): Promise<T> {
119− const response = await fetch(path, init);
120− if (!response.ok) {
121− const message = await response.text();
122− throw new Error(message || `${response.status} ${response.statusText}`);
123− }
124− return (await response.json()) as T;
125−}
126−
127−function escapeHtml(value: string): string {
128− return value
129− .replaceAll("&", "&amp;")
130− .replaceAll("<", "&lt;")
131− .replaceAll(">", "&gt;")
132− .replaceAll('"', "&quot;")
133− .replaceAll("'", "&#39;");
134−}
135−
136−function prettyJson(value: unknown): string {
137− try {
138− return JSON.stringify(value, null, 2);
139− } catch {
140− return String(value);
141− }
142−}
143−
144−function fmtTime(timestamp?: number): string {
145− if (!timestamp) return "-";
146− return new Date(timestamp).toLocaleTimeString();
147−}
148−
149−function statusClass(status: TaskStatus): string {
150− return `status status-${status.replaceAll("_", "-")}`;
151−}
152−
153−function labelStatus(status: TaskStatus): string {
154− return status.replaceAll("_", " ");
155−}
156−
157−function shortId(value: string): string {
158− return value.length <= 22 ? value : `${value.slice(0, 18)}...`;
159−}
160−
161−function renderContext(): void {
162− const context = state.context;
163− if (!context) return;
164−
165− if (els.contextWorkspace) {
166− els.contextWorkspace.textContent = shortId(context.workspaceId);
167− els.contextWorkspace.title = context.workspaceId;
168− }
169−
170− if (els.contextActor) {
171− els.contextActor.textContent = shortId(context.actorId);
172− els.contextActor.title = context.actorId;
173− }
174−
175− if (els.contextSession) {
176− els.contextSession.textContent = shortId(context.sessionId);
177− els.contextSession.title = context.sessionId;
178− }
179−}
180−
181−function renderSourceFormVisibility(): void {
182− const type = els.sourceType?.value ?? "mcp";
183− const isOpenApi = type === "openapi";
184−
185− if (els.openapiBaseUrlWrap) {
186− els.openapiBaseUrlWrap.style.display = isOpenApi ? "grid" : "none";
187− }
188− if (els.openapiAuthGrid) {
189− els.openapiAuthGrid.style.display = isOpenApi ? "grid" : "none";
190− }
191− if (els.openapiStaticTokenWrap) {
192− const mode = els.openapiAuthMode?.value ?? "none";
193− els.openapiStaticTokenWrap.style.display = isOpenApi && mode.startsWith("static-") ? "grid" : "none";
194− }
195−}
196−
197−function renderToolSources(): void {
198− if (!els.toolSourcesList) return;
199−
200− if (state.toolSources.length === 0) {
201− els.toolSourcesList.innerHTML = '<p class="empty">No workspace tool sources yet.</p>';
202− return;
203− }
204−
205− els.toolSourcesList.innerHTML = state.toolSources
206− .map((source) => {
207− const configText = prettyJson(source.config);
208− return `
209− <article class="source-card">
210− <header>
211− <strong>${escapeHtml(source.name)}</strong>
212− <span class="tag">${escapeHtml(source.type)}</span>
213− </header>
214− <p class="source-meta">${escapeHtml(source.id)} • updated ${fmtTime(source.updatedAt)}</p>
215− <pre>${escapeHtml(configText)}</pre>
216− <div class="source-actions">
217− <button class="danger" data-source-delete="${source.id}">Remove</button>
218− </div>
219− </article>
220− `;
221− })
222− .join("");
223−}
224−
225−function renderToolInventory(): void {
226− if (els.toolCount) {
227− els.toolCount.textContent = String(state.tools.length);
228− }
229−
230− if (!els.toolInventoryList) return;
231− if (state.tools.length === 0) {
232− els.toolInventoryList.innerHTML = '<p class="empty">No tools discovered for this workspace yet.</p>';
233− return;
234− }
235−
236− els.toolInventoryList.innerHTML = state.tools
237− .map((tool) => `
238− <article class="inventory-card">
239− <header>
240− <strong>${escapeHtml(tool.path)}</strong>
241− <span class="tag">${escapeHtml(tool.approval)}</span>
242− </header>
243− <p class="inventory-meta">source: ${escapeHtml(tool.source ?? "local")}</p>
244− <p class="inventory-meta">${escapeHtml(tool.description)}</p>
245− </article>
246− `)
247− .join("");
248−}
249−
250−function renderMetrics(): void {
251− const runningCount = state.tasks.filter(
252− (task) => task.status === "running" || task.status === "queued",
253− ).length;
254−
255− if (els.metricPending) {
256− els.metricPending.textContent = String(state.approvals.length);
257− }
258−
259− if (els.metricTotalTasks) {
260− els.metricTotalTasks.textContent = String(state.tasks.length);
261− }
262−
263− if (els.metricRunning) {
264− els.metricRunning.textContent = String(runningCount);
265− }
266−}
267−
268−function connectToSelectedTask(taskId: string | null): void {
269− if (selectedTaskStream) {
270− selectedTaskStream.close();
271− selectedTaskStream = null;
272− }
273− if (!taskId) return;
274− if (!state.context) return;
275−
276− selectedTaskStream = new EventSource(
277− `/api/tasks/${encodeURIComponent(taskId)}/events?workspaceId=${encodeURIComponent(state.context.workspaceId)}`,
278− );
279− const onEvent = () => {
280− void refreshData({ keepSelection: true });
281− };
282− selectedTaskStream.addEventListener("task", onEvent);
283− selectedTaskStream.addEventListener("approval", onEvent);
284−}
285−
286−function renderRuntimeOptions(): void {
287− els.runtimeSelect.innerHTML = state.runtimes
288− .map((runtime) => `<option value="${runtime.id}">${escapeHtml(runtime.label)}</option>`)
289− .join("");
290−}
291−
292−function renderApprovals(): void {
293− els.approvalCount.textContent = String(state.approvals.length);
294− if (state.approvals.length === 0) {
295− els.approvalsList.innerHTML = '<p class="empty">No pending tool approvals.</p>';
296− return;
297− }
298−
299− els.approvalsList.innerHTML = state.approvals
300− .map((approval) => {
301− const inputJson = prettyJson(approval.input);
302− return `
303− <article class="approval-card">
304− <header>
305− <strong>${escapeHtml(approval.toolPath)}</strong>
306− <span>${escapeHtml(approval.taskId)}</span>
307− </header>
308− <p class="meta">Requested ${fmtTime(approval.createdAt)} • status ${escapeHtml(approval.task.status)}</p>
309− <pre>${escapeHtml(inputJson)}</pre>
310− <div class="actions">
311− <button data-action="approve" data-approval-id="${approval.id}">Approve call</button>
312− <button class="danger" data-action="deny" data-approval-id="${approval.id}">Deny call</button>
313− </div>
314− </article>
315− `;
316− })
317− .join("");
318−}
319−
320−function renderTasks(): void {
321− if (state.tasks.length === 0) {
322− els.tasksList.innerHTML = '<p class="empty">No tasks yet.</p>';
323− return;
324− }
325−
326− els.tasksList.innerHTML = state.tasks
327− .map((task) => {
328− const selected = task.id === state.selectedTaskId ? "selected" : "";
329− return `
330− <button class="task-row ${selected}" data-task-id="${task.id}">
331− <span>${escapeHtml(task.id)}</span>
332− <span>${escapeHtml(task.runtimeId)}</span>
333− <span class="${statusClass(task.status)}">${labelStatus(task.status)}</span>
334− <span>${fmtTime(task.createdAt)}</span>
335− </button>
336− `;
337− })
338− .join("");
339−}
340−
341−function renderTaskDetail(): void {
342− const task = state.tasks.find((entry) => entry.id === state.selectedTaskId);
343− if (!task) {
344− els.taskDetail.classList.add("empty");
345− els.taskDetail.textContent = "Select a task to inspect logs.";
346− return;
347− }
348−
349− els.taskDetail.classList.remove("empty");
350− els.taskDetail.innerHTML = `
351− <div class="detail-grid">
352− <div><span>Task</span><strong>${escapeHtml(task.id)}</strong></div>
353− <div><span>Status</span><strong>${escapeHtml(labelStatus(task.status))}</strong></div>
354− <div><span>Runtime</span><strong>${escapeHtml(task.runtimeId)}</strong></div>
355− <div><span>Exit code</span><strong>${task.exitCode ?? "-"}</strong></div>
356− </div>
357− <h3>Code</h3>
358− <pre>${escapeHtml(task.code)}</pre>
359− <h3>Stdout</h3>
360− <pre>${escapeHtml(task.stdout ?? "")}</pre>
361− <h3>Stderr</h3>
362− <pre>${escapeHtml(task.stderr ?? "")}</pre>
363− ${task.error ? `<h3>Error</h3><pre>${escapeHtml(task.error)}</pre>` : ""}
364− `;
365−}
366−
367−function renderAll(): void {
368− renderContext();
369− renderSourceFormVisibility();
370− renderMetrics();
371− renderRuntimeOptions();
372− renderToolSources();
373− renderToolInventory();
374− renderApprovals();
375− renderTasks();
376− renderTaskDetail();
377−}
378−
379−async function refreshData(options?: { keepSelection?: boolean }): Promise<void> {
380− if (!state.context) {
381− throw new Error("Anonymous context missing");
382− }
383−
384− const [approvals, tasks, runtimes, toolSources, tools] = await Promise.all([
385− requestJson<PendingApproval[]>(
386− `/api/approvals?workspaceId=${encodeURIComponent(state.context.workspaceId)}&status=pending`,
387− ),
388− requestJson<TaskRecord[]>(`/api/tasks?workspaceId=${encodeURIComponent(state.context.workspaceId)}`),
389− requestJson<RuntimeTarget[]>("/api/runtime-targets"),
390− requestJson<ToolSourceRecord[]>(`/api/tool-sources?workspaceId=${encodeURIComponent(state.context.workspaceId)}`),
391− requestJson<ToolDescriptor[]>(
392− `/api/tools?workspaceId=${encodeURIComponent(state.context.workspaceId)}&actorId=${encodeURIComponent(state.context.actorId)}&clientId=${encodeURIComponent(state.context.clientId)}`,
393− ),
394− ]);
395−
396− state.approvals = approvals;
397− state.tasks = tasks;
398− state.runtimes = runtimes;
399− state.toolSources = toolSources;
400− state.tools = tools;
401−
402− const selectedStillExists = state.tasks.some((task) => task.id === state.selectedTaskId);
403− if (!selectedStillExists || !options?.keepSelection) {
404− state.selectedTaskId = state.tasks[0]?.id ?? null;
405− connectToSelectedTask(state.selectedTaskId);
406− }
407−
408− renderAll();
409−}
410−
411−async function createTask(): Promise<void> {
412− if (!state.context) {
413− throw new Error("Anonymous context missing");
414− }
415−
416− await requestJson("/api/tasks", {
417− method: "POST",
418− headers: { "content-type": "application/json" },
419− body: JSON.stringify({
420− code: els.code.value,
421− timeoutMs: Number(els.timeoutInput.value),
422− runtimeId: els.runtimeSelect.value,
423− workspaceId: state.context.workspaceId,
424− actorId: state.context.actorId,
425− clientId: state.context.clientId,
426− }),
427− });
428−
429− await refreshData();
430−}
431−
432−async function resolveApproval(approvalId: string, decision: "approved" | "denied"): Promise<void> {
433− if (!state.context) {
434− throw new Error("Anonymous context missing");
435− }
436−
437− await requestJson(`/api/approvals/${encodeURIComponent(approvalId)}`, {
438− method: "POST",
439− headers: { "content-type": "application/json" },
440− body: JSON.stringify({
441− workspaceId: state.context.workspaceId,
442− decision,
443− reviewerId: state.context.actorId,
444− }),
445− });
446− await refreshData({ keepSelection: true });
447−}
448−
449−async function bootstrapAnonymousContext(): Promise<void> {
450− const sessionId = window.localStorage.getItem(ANON_SESSION_STORAGE_KEY) ?? undefined;
451− const context = await requestJson<AnonymousContext>("/api/auth/anonymous/bootstrap", {
452− method: "POST",
453− headers: { "content-type": "application/json" },
454− body: JSON.stringify({ sessionId }),
455− });
456−
457− state.context = context;
458− window.localStorage.setItem(ANON_SESSION_STORAGE_KEY, context.sessionId);
459−}
460−
461−async function resetAnonymousContext(): Promise<void> {
462− window.localStorage.removeItem(ANON_SESSION_STORAGE_KEY);
463− await bootstrapAnonymousContext();
464− state.selectedTaskId = null;
465− connectToSelectedTask(null);
466− await refreshData();
467−}
468−
469−function buildOpenApiAuthConfig(): Record<string, unknown> {
470− const mode = els.openapiAuthMode?.value ?? "none";
471− if (mode === "none") {
472− return { type: "none" };
473− }
474−
475− const token = (els.openapiStaticToken?.value ?? "").trim();
476− const headerName = (els.openapiApiKeyHeader?.value ?? "").trim() || "x-api-key";
477−
478− if (mode === "static-bearer") {
479− return { type: "bearer", mode: "static", token };
480− }
481− if (mode === "static-api-key") {
482− return { type: "apiKey", mode: "static", header: headerName, value: token };
483− }
484− if (mode === "workspace-bearer") {
485− return { type: "bearer", mode: "workspace" };
486− }
487− if (mode === "actor-bearer") {
488− return { type: "bearer", mode: "actor" };
489− }
490− if (mode === "workspace-api-key") {
491− return { type: "apiKey", mode: "workspace", header: headerName };
492− }
493− if (mode === "actor-api-key") {
494− return { type: "apiKey", mode: "actor", header: headerName };
495− }
496−
497− return { type: "none" };
498−}
499−
500−async function createToolSourceFromForm(): Promise<void> {
501− if (!state.context) {
502− throw new Error("Anonymous context missing");
503− }
504−
505− const type = (els.sourceType?.value ?? "mcp") as "mcp" | "openapi";
506− const name = (els.sourceName?.value ?? "").trim();
507− const url = (els.sourceUrl?.value ?? "").trim();
508− const baseUrl = (els.openapiBaseUrl?.value ?? "").trim();
509−
510− if (!name) {
511− throw new Error("Source name is required");
512− }
513− if (!url) {
514− throw new Error("Endpoint/spec URL is required");
515− }
516−
517− const config: Record<string, unknown> =
518− type === "mcp"
519− ? { url }
520− : {
521− spec: url,
522− ...(baseUrl ? { baseUrl } : {}),
523− auth: buildOpenApiAuthConfig(),
524− };
525−
526− await requestJson("/api/tool-sources", {
527− method: "POST",
528− headers: { "content-type": "application/json" },
529− body: JSON.stringify({
530− workspaceId: state.context.workspaceId,
531− name,
532− type,
533− config,
534− enabled: true,
535− }),
536− });
537−
538− if (els.sourceForm) {
539− els.sourceForm.reset();
540− if (els.sourceType) els.sourceType.value = "mcp";
541− if (els.openapiAuthMode) els.openapiAuthMode.value = "none";
542− renderSourceFormVisibility();
543− }
544−
545− await refreshData({ keepSelection: true });
546−}
547−
548−async function deleteToolSource(sourceId: string): Promise<void> {
549− if (!state.context) {
550− throw new Error("Anonymous context missing");
551− }
552−
553− await requestJson(
554− `/api/tool-sources/${encodeURIComponent(sourceId)}?workspaceId=${encodeURIComponent(state.context.workspaceId)}`,
555− { method: "DELETE" },
556− );
557−
558− await refreshData({ keepSelection: true });
559−}
560−
561−els.form.addEventListener("submit", (event) => {
562− event.preventDefault();
563− void createTask().catch((cause) => {
564− console.error(cause);
565− window.alert(`Failed to create task: ${String(cause)}`);
566− });
567−});
568−
569−els.sourceForm?.addEventListener("submit", (event) => {
570− event.preventDefault();
571− void createToolSourceFromForm().catch((cause) => {
572− console.error(cause);
573− window.alert(`Failed to create tool source: ${String(cause)}`);
574− });
575−});
576−
577−els.sourceType?.addEventListener("change", () => {
578− renderSourceFormVisibility();
579−});
580−
581−els.openapiAuthMode?.addEventListener("change", () => {
582− renderSourceFormVisibility();
583−});
584−
585−els.toolSourcesList?.addEventListener("click", (event) => {
586− const button = (event.target as HTMLElement).closest<HTMLButtonElement>("button[data-source-delete]");
587− if (!button) return;
588− const sourceId = button.dataset.sourceDelete;
589− if (!sourceId) return;
590−
591− void deleteToolSource(sourceId).catch((cause) => {
592− console.error(cause);
593− window.alert(`Failed to remove tool source: ${String(cause)}`);
594− });
595−});
596−
597−els.approvalsList.addEventListener("click", (event) => {
598− const target = event.target;
599− if (!(target instanceof HTMLElement)) return;
600−
601− const action = target.dataset.action;
602− const approvalId = target.dataset.approvalId;
603− if (!action || !approvalId) return;
604−
605− const decision = action === "approve" ? "approved" : "denied";
606− void resolveApproval(approvalId, decision).catch((cause) => {
607− console.error(cause);
608− window.alert(`Failed to resolve approval: ${String(cause)}`);
609− });
610−});
611−
612−els.tasksList.addEventListener("click", (event) => {
613− const button = (event.target as HTMLElement).closest<HTMLButtonElement>("button.task-row");
614− if (!button) return;
615− state.selectedTaskId = button.dataset.taskId ?? null;
616− connectToSelectedTask(state.selectedTaskId);
617− renderTasks();
618− renderTaskDetail();
619−});
620−
621−els.refreshButton.addEventListener("click", () => {
622− void refreshData({ keepSelection: true });
623−});
624−
625−els.resetSessionButton?.addEventListener("click", () => {
626− void resetAnonymousContext().catch((cause) => {
627− console.error(cause);
628− window.alert(`Failed to reset anonymous workspace: ${String(cause)}`);
629− });
630−});
631−
632−void (async () => {
633− try {
634− await bootstrapAnonymousContext();
635− await refreshData();
636− setInterval(() => {
637− void refreshData({ keepSelection: true });
638− }, 5_000);
639− } catch (cause) {
640− console.error(cause);
641− window.alert(`Failed to load executor dashboard: ${String(cause)}`);
642− }
643−})();
executor/apps/web/src/styles.css+0−651
@@ -1,651 +0,0 @@
1−:root {
2− --bg-top: #f3efe7;
3− --bg-bottom: #d7ddd8;
4− --panel: rgba(255, 253, 248, 0.86);
5− --panel-strong: rgba(255, 253, 248, 0.94);
6− --text: #1e2628;
7− --muted: #5f6f72;
8− --line: rgba(34, 53, 57, 0.16);
9− --line-strong: rgba(34, 53, 57, 0.28);
10− --ok: #2f8554;
11− --warn: #a96a1e;
12− --bad: #b03d35;
13− --chip: #0f5b66;
14− --radius: 18px;
15− --shadow: 0 18px 48px rgba(26, 38, 40, 0.16);
16−}
17−
18−* {
19− box-sizing: border-box;
20−}
21−
22−body {
23− margin: 0;
24− min-height: 100vh;
25− font-family: "Avenir Next", "IBM Plex Sans", "Segoe UI", sans-serif;
26− color: var(--text);
27− background:
28− linear-gradient(165deg, var(--bg-top), var(--bg-bottom));
29− overflow-x: hidden;
30−}
31−
32−.background-glow {
33− position: fixed;
34− z-index: 0;
35− pointer-events: none;
36− border-radius: 999px;
37− filter: blur(44px);
38−}
39−
40−.glow-one {
41− top: -120px;
42− left: -90px;
43− width: 340px;
44− height: 340px;
45− background: radial-gradient(circle, rgba(241, 173, 96, 0.42), rgba(241, 173, 96, 0));
46−}
47−
48−.glow-two {
49− right: -110px;
50− top: 45vh;
51− width: 300px;
52− height: 300px;
53− background: radial-gradient(circle, rgba(81, 146, 163, 0.34), rgba(81, 146, 163, 0));
54−}
55−
56−.grain-overlay {
57− position: fixed;
58− inset: 0;
59− pointer-events: none;
60− z-index: 0;
61− opacity: 0.2;
62− background-image:
63− radial-gradient(rgba(17, 31, 34, 0.22) 0.48px, transparent 0.48px);
64− background-size: 3px 3px;
65−}
66−
67−.layout {
68− position: relative;
69− z-index: 1;
70− width: min(1160px, calc(100% - 2rem));
71− margin: 1.6rem auto 2.8rem;
72− display: grid;
73− gap: 1rem;
74− grid-template-columns: minmax(0, 1.25fr) minmax(0, 0.95fr);
75− animation: page-enter 420ms ease-out;
76−}
77−
78−.hero,
79−.panel {
80− border: 1px solid var(--line);
81− border-radius: var(--radius);
82− background: var(--panel);
83− box-shadow: var(--shadow);
84− backdrop-filter: blur(11px);
85−}
86−
87−.hero {
88− grid-column: 1 / -1;
89− padding: 1.3rem 1.35rem;
90−}
91−
92−.eyebrow {
93− margin: 0;
94− text-transform: uppercase;
95− letter-spacing: 0.09em;
96− font-weight: 700;
97− font-size: 0.73rem;
98− color: var(--warn);
99−}
100−
101−.hero h1 {
102− margin: 0.2rem 0 0;
103− font-family: "Iowan Old Style", "Palatino Linotype", serif;
104− font-size: clamp(1.7rem, 3.8vw, 2.55rem);
105− letter-spacing: -0.02em;
106− line-height: 1.1;
107−}
108−
109−.hero > p {
110− margin: 0.45rem 0 0;
111− color: var(--muted);
112− max-width: 74ch;
113−}
114−
115−.context-strip {
116− margin-top: 0.75rem;
117− border: 1px solid var(--line);
118− border-radius: 14px;
119− padding: 0.55rem 0.58rem;
120− background: rgba(255, 255, 255, 0.78);
121− display: grid;
122− grid-template-columns: repeat(3, minmax(0, 1fr)) auto;
123− gap: 0.45rem;
124− align-items: center;
125−}
126−
127−.context-item {
128− min-width: 0;
129− display: grid;
130− gap: 0.12rem;
131−}
132−
133−.context-item span {
134− font-size: 0.72rem;
135− color: var(--muted);
136− text-transform: uppercase;
137− letter-spacing: 0.04em;
138−}
139−
140−.context-item strong {
141− font-family: "IBM Plex Mono", "Fira Code", monospace;
142− font-size: 0.74rem;
143− white-space: nowrap;
144− overflow: hidden;
145− text-overflow: ellipsis;
146−}
147−
148−.hero-metrics {
149− margin-top: 0.95rem;
150− display: grid;
151− grid-template-columns: repeat(3, minmax(0, 1fr));
152− gap: 0.6rem;
153−}
154−
155−.metric-card {
156− border: 1px solid var(--line);
157− border-radius: 14px;
158− padding: 0.65rem 0.7rem;
159− background: linear-gradient(180deg, var(--panel-strong), rgba(255, 253, 248, 0.72));
160− display: grid;
161− gap: 0.2rem;
162−}
163−
164−.metric-card span {
165− font-size: 0.77rem;
166− color: var(--muted);
167−}
168−
169−.metric-card strong {
170− font-size: 1.34rem;
171− line-height: 1;
172−}
173−
174−.panel {
175− padding: 0.92rem;
176−}
177−
178−.composer-panel {
179− grid-column: 1 / -1;
180−}
181−
182−#sources-panel,
183−#inventory-panel {
184− min-height: 100%;
185−}
186−
187−.section-title {
188− display: flex;
189− justify-content: space-between;
190− align-items: center;
191− gap: 0.55rem;
192−}
193−
194−.section-note {
195− margin: 0;
196− font-size: 0.78rem;
197− color: var(--muted);
198− text-align: right;
199−}
200−
201−h2 {
202− margin: 0;
203− font-family: "Iowan Old Style", "Palatino Linotype", serif;
204− font-size: 1.16rem;
205− letter-spacing: -0.01em;
206−}
207−
208−form {
209− margin-top: 0.7rem;
210− display: grid;
211− gap: 0.78rem;
212−}
213−
214−.source-form {
215− margin-top: 0.6rem;
216−}
217−
218−.source-grid {
219− display: grid;
220− grid-template-columns: repeat(2, minmax(0, 1fr));
221− gap: 0.62rem;
222−}
223−
224−.form-top-grid {
225− display: grid;
226− grid-template-columns: 1fr 0.52fr;
227− gap: 0.65rem;
228−}
229−
230−label {
231− display: grid;
232− gap: 0.35rem;
233− font-size: 0.85rem;
234−}
235−
236−input,
237−textarea,
238−select,
239−button {
240− font: inherit;
241−}
242−
243−input,
244−textarea,
245−select {
246− border: 1px solid var(--line);
247− border-radius: 12px;
248− background: rgba(255, 255, 255, 0.86);
249− color: var(--text);
250− padding: 0.58rem 0.66rem;
251− transition: border-color 120ms ease, box-shadow 120ms ease;
252−}
253−
254−input:focus,
255−textarea:focus,
256−select:focus {
257− outline: none;
258− border-color: rgba(15, 91, 102, 0.6);
259− box-shadow: 0 0 0 3px rgba(15, 91, 102, 0.14);
260−}
261−
262−textarea,
263−pre {
264− font-family: "IBM Plex Mono", "Fira Code", monospace;
265− font-size: 0.84rem;
266−}
267−
268−pre {
269− white-space: pre-wrap;
270− word-break: break-word;
271−}
272−
273−textarea {
274− min-height: 230px;
275−}
276−
277−.composer-actions {
278− display: flex;
279− justify-content: flex-end;
280−}
281−
282−.source-list,
283−.inventory-list {
284− margin-top: 0.7rem;
285− display: grid;
286− gap: 0.56rem;
287−}
288−
289−.source-card,
290−.inventory-card {
291− border: 1px solid var(--line);
292− border-radius: 12px;
293− padding: 0.62rem;
294− background: rgba(255, 255, 255, 0.82);
295− display: grid;
296− gap: 0.4rem;
297−}
298−
299−.source-card header,
300−.inventory-card header {
301− display: flex;
302− justify-content: space-between;
303− gap: 0.45rem;
304− align-items: center;
305−}
306−
307−.source-meta,
308−.inventory-meta {
309− margin: 0;
310− color: var(--muted);
311− font-size: 0.76rem;
312−}
313−
314−.source-actions {
315− display: flex;
316− gap: 0.4rem;
317− flex-wrap: wrap;
318−}
319−
320−.tag {
321− display: inline-block;
322− border-radius: 999px;
323− padding: 0.12rem 0.45rem;
324− font-size: 0.71rem;
325− border: 1px solid var(--line);
326− background: rgba(255, 255, 255, 0.68);
327−}
328−
329−button {
330− border: none;
331− border-radius: 999px;
332− padding: 0.5rem 0.95rem;
333− color: #f8fbfc;
334− background: linear-gradient(120deg, var(--chip), #16707b);
335− cursor: pointer;
336− transition: transform 140ms ease, filter 140ms ease;
337−}
338−
339−button:hover {
340− transform: translateY(-1px);
341− filter: saturate(1.06);
342−}
343−
344−button.secondary {
345− background: rgba(15, 91, 102, 0.14);
346− color: var(--text);
347−}
348−
349−button.danger {
350− background: linear-gradient(120deg, #b03d35, #ca4d44);
351−}
352−
353−.pill {
354− border-radius: 999px;
355− padding: 0.22rem 0.56rem;
356− font-size: 0.75rem;
357− background: rgba(15, 91, 102, 0.12);
358− border: 1px solid rgba(15, 91, 102, 0.18);
359−}
360−
361−.approval-list,
362−.task-list {
363− margin-top: 0.72rem;
364− display: grid;
365− gap: 0.62rem;
366−}
367−
368−.approval-card {
369− border: 1px solid var(--line);
370− border-radius: 14px;
371− padding: 0.68rem;
372− background: rgba(255, 255, 255, 0.82);
373−}
374−
375−.approval-card header {
376− display: flex;
377− justify-content: space-between;
378− gap: 0.6rem;
379− font-size: 0.84rem;
380−}
381−
382−.approval-card .meta {
383− margin: 0.24rem 0 0.5rem;
384− color: var(--muted);
385− font-size: 0.78rem;
386−}
387−
388−.approval-card pre {
389− margin: 0;
390− max-height: 180px;
391− overflow: auto;
392− border: 1px solid var(--line);
393− border-radius: 10px;
394− padding: 0.58rem;
395− background: rgba(17, 40, 45, 0.92);
396− color: #d8ebee;
397−}
398−
399−.actions {
400− margin-top: 0.52rem;
401− display: flex;
402− flex-wrap: wrap;
403− gap: 0.4rem;
404−}
405−
406−.task-row {
407− border: 1px solid var(--line);
408− border-radius: 12px;
409− padding: 0.6rem 0.68rem;
410− background: rgba(255, 255, 255, 0.84);
411− color: inherit;
412− display: grid;
413− grid-template-columns: minmax(0, 1.6fr) minmax(0, 0.8fr) auto auto;
414− align-items: center;
415− gap: 0.52rem;
416− text-align: left;
417−}
418−
419−.task-row.selected {
420− border-color: var(--line-strong);
421− box-shadow: 0 0 0 2px rgba(15, 91, 102, 0.16);
422−}
423−
424−.task-row > span {
425− overflow: hidden;
426− text-overflow: ellipsis;
427− white-space: nowrap;
428−}
429−
430−.status {
431− border-radius: 999px;
432− width: fit-content;
433− padding: 0.16rem 0.45rem;
434− font-size: 0.74rem;
435− text-transform: capitalize;
436−}
437−
438−.status-completed {
439− background: rgba(47, 133, 84, 0.16);
440− color: var(--ok);
441−}
442−
443−.status-failed,
444−.status-denied {
445− background: rgba(176, 61, 53, 0.16);
446− color: var(--bad);
447−}
448−
449−.status-queued,
450−.status-running,
451−.status-timed-out {
452− background: rgba(169, 106, 30, 0.16);
453− color: var(--warn);
454−}
455−
456−.task-detail {
457− margin-top: 0.7rem;
458− display: grid;
459− gap: 0.68rem;
460−}
461−
462−.task-detail.empty,
463−.empty {
464− color: var(--muted);
465−}
466−
467−.detail-grid {
468− display: grid;
469− grid-template-columns: repeat(4, minmax(0, 1fr));
470− gap: 0.48rem;
471−}
472−
473−.detail-grid div {
474− border: 1px solid var(--line);
475− border-radius: 10px;
476− background: rgba(255, 255, 255, 0.84);
477− padding: 0.46rem 0.52rem;
478− display: grid;
479− gap: 0.18rem;
480−}
481−
482−.detail-grid span {
483− color: var(--muted);
484− font-size: 0.75rem;
485−}
486−
487−.task-detail h3 {
488− margin: 0.1rem 0 0;
489− font-size: 0.84rem;
490− letter-spacing: 0.02em;
491− text-transform: uppercase;
492− color: var(--muted);
493−}
494−
495−.task-detail pre {
496− margin: 0;
497− max-height: 220px;
498− overflow: auto;
499− border-radius: 12px;
500− border: 1px solid var(--line);
501− padding: 0.7rem;
502− background: rgba(17, 40, 45, 0.94);
503− color: #d8ebee;
504−}
505−
506−code {
507− font-family: "IBM Plex Mono", "Fira Code", monospace;
508− font-size: 0.8em;
509−}
510−
511−@keyframes page-enter {
512− from {
513− opacity: 0;
514− transform: translateY(8px);
515− }
516− to {
517− opacity: 1;
518− transform: translateY(0);
519− }
520−}
521−
522−@media (max-width: 980px) {
523− .layout {
524− grid-template-columns: 1fr;
525− }
526−
527− .section-title {
528− align-items: flex-start;
529− flex-direction: column;
530− }
531−
532− .section-note {
533− text-align: left;
534− }
535−
536− .detail-grid {
537− grid-template-columns: repeat(2, minmax(0, 1fr));
538− }
539−
540− .source-grid {
541− grid-template-columns: 1fr;
542− }
543−
544− .context-strip {
545− grid-template-columns: repeat(2, minmax(0, 1fr));
546− }
547−}
548−
549−@media (max-width: 700px) {
550− .layout {
551− width: calc(100% - 0.9rem);
552− margin-top: 0.62rem;
553− gap: 0.72rem;
554− }
555−
556− .hero,
557− .panel {
558− padding: 0.78rem;
559− border-radius: 14px;
560− }
561−
562− .hero h1 {
563− font-size: 1.45rem;
564− }
565−
566− .hero > p {
567− font-size: 0.9rem;
568− }
569−
570− .hero-metrics {
571− grid-template-columns: 1fr;
572− }
573−
574− .context-strip {
575− grid-template-columns: 1fr;
576− }
577−
578− .context-item strong {
579− white-space: normal;
580− word-break: break-word;
581− }
582−
583− .metric-card strong {
584− font-size: 1.12rem;
585− }
586−
587− h2 {
588− font-size: 1rem;
589− }
590−
591− label {
592− font-size: 0.8rem;
593− }
594−
595− .form-top-grid {
596− grid-template-columns: 1fr;
597− }
598−
599− textarea {
600− min-height: 148px;
601− font-size: 0.78rem;
602− }
603−
604− .task-row {
605− grid-template-columns: 1fr;
606− gap: 0.3rem;
607− }
608−
609− .task-row > span {
610− white-space: normal;
611− overflow: visible;
612− text-overflow: clip;
613− word-break: break-word;
614− }
615−
616− .detail-grid {
617− grid-template-columns: 1fr;
618− }
619−
620− .task-detail pre,
621− .approval-card pre {
622− max-height: 160px;
623− font-size: 0.76rem;
624− }
625−}
626−
627−@media (max-width: 460px) {
628− .layout {
629− width: calc(100% - 0.55rem);
630− margin-top: 0.45rem;
631− }
632−
633− .hero,
634− .panel {
635− padding: 0.66rem;
636− }
637−
638− .hero h1 {
639− font-size: 1.3rem;
640− }
641−
642− .hero > p,
643− .section-note {
644− font-size: 0.82rem;
645− }
646−
647− button {
648− padding: 0.42rem 0.78rem;
649− font-size: 0.84rem;
650− }
651−}
executor/apps/web/tsconfig.json+34−0
@@ -0,0 +1,34 @@
1+{
2+ "compilerOptions": {
3+ "target": "ES2017",
4+ "lib": ["dom", "dom.iterable", "esnext"],
5+ "allowJs": true,
6+ "skipLibCheck": true,
7+ "strict": true,
8+ "noEmit": true,
9+ "esModuleInterop": true,
10+ "module": "esnext",
11+ "moduleResolution": "bundler",
12+ "resolveJsonModule": true,
13+ "isolatedModules": true,
14+ "jsx": "react-jsx",
15+ "incremental": true,
16+ "plugins": [
17+ {
18+ "name": "next"
19+ }
20+ ],
21+ "paths": {
22+ "@/*": ["./src/*"]
23+ }
24+ },
25+ "include": [
26+ "next-env.d.ts",
27+ "**/*.ts",
28+ "**/*.tsx",
29+ ".next/types/**/*.ts",
30+ ".next/dev/types/**/*.ts",
31+ "**/*.mts"
32+ ],
33+ "exclude": ["node_modules"]
34+}
executor/bun.lock+1496−118
@@ -23,6 +23,34 @@ · 22 unmodified lines
2323 },
2424 "apps/web": {
2525 "name": "@executor/web",
26+ "version": "0.1.0",
27+ "dependencies": {
28+ "@monaco-editor/react": "^4.7.0",
29+ "class-variance-authority": "^0.7.1",
30+ "clsx": "^2.1.1",
31+ "lucide-react": "^0.563.0",
32+ "monaco-editor": "^0.55.1",
33+ "next": "16.1.6",
34+ "next-themes": "^0.4.6",
35+ "radix-ui": "^1.4.3",
36+ "react": "19.2.3",
37+ "react-dom": "19.2.3",
38+ "sonner": "^2.0.7",
39+ "tailwind-merge": "^3.4.0",
40+ "tldts": "^7.0.22",
41+ },
42+ "devDependencies": {
43+ "@tailwindcss/postcss": "^4",
44+ "@types/node": "^20",
45+ "@types/react": "^19",
46+ "@types/react-dom": "^19",
47+ "eslint": "^9",
48+ "eslint-config-next": "16.1.6",
49+ "shadcn": "^3.8.4",
50+ "tailwindcss": "^4",
51+ "tw-animate-css": "^1.4.0",
52+ "typescript": "^5",
53+ },
2654 },
2755 "packages/client": {
2856 "name": "@executor/client",
@@ -34,7 +62,15 @@ · 5 unmodified lines
3462 "name": "@executor/contracts",
3563 },
3664 },
65+ "trustedDependencies": [
66+ "sharp",
67+ "unrs-resolver",
68+ ],
3769 "packages": {
70+ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
71+
72+ "@antfu/ni": ["@antfu/ni@25.0.0", "", { "dependencies": { "ansis": "^4.0.0", "fzf": "^0.5.2", "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" }, "bin": { "na": "bin/na.mjs", "ni": "bin/ni.mjs", "nr": "bin/nr.mjs", "nci": "bin/nci.mjs", "nlx": "bin/nlx.mjs", "nun": "bin/nun.mjs", "nup": "bin/nup.mjs" } }, "sha512-9q/yCljni37pkMr4sPrI3G4jqdIk074+iukc5aFJl7kmDCCsiJrbZ6zKxnES1Gwg+i9RcDZwvktl23puGslmvA=="],
73+
3874 "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@14.0.1", "", { "dependencies": { "@types/json-schema": "^7.0.15", "js-yaml": "^4.1.0" } }, "sha512-Oc96zvmxx1fqoSEdUmfmvvb59/KDOnUoJ7s2t7bISyAn0XEz57LCCw8k2Y4Pf3mwKaZLMciESALORLgfe2frCw=="],
3975
4076 "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="],
@@ -43,6 +79,90 @@ · 2 unmodified lines
4379
4480 "@apidevtools/swagger-parser": ["@apidevtools/swagger-parser@12.1.0", "", { "dependencies": { "@apidevtools/json-schema-ref-parser": "14.0.1", "@apidevtools/openapi-schemas": "^2.1.0", "@apidevtools/swagger-methods": "^3.0.2", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "call-me-maybe": "^1.0.2" }, "peerDependencies": { "openapi-types": ">=7" } }, "sha512-e5mJoswsnAX0jG+J09xHFYQXb/bUc5S3pLpMxUuRUA2H8T2kni3yEoyz2R3Dltw5f4A6j6rPNMpWTK+iVDFlng=="],
4581
82+ "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="],
83+
84+ "@babel/compat-data": ["@babel/compat-data@7.29.0", "", {}, "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg=="],
85+
86+ "@babel/core": ["@babel/core@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/traverse": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA=="],
87+
88+ "@babel/generator": ["@babel/generator@7.29.1", "", { "dependencies": { "@babel/parser": "^7.29.0", "@babel/types": "^7.29.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw=="],
89+
90+ "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="],
91+
92+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
93+
94+ "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="],
95+
96+ "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
97+
98+ "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="],
99+
100+ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
101+
102+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
103+
104+ "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="],
105+
106+ "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
107+
108+ "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="],
109+
110+ "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="],
111+
112+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
113+
114+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
115+
116+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
117+
118+ "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="],
119+
120+ "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
121+
122+ "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="],
123+
124+ "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="],
125+
126+ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="],
127+
128+ "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="],
129+
130+ "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="],
131+
132+ "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
133+
134+ "@babel/traverse": ["@babel/traverse@7.29.0", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.29.0", "@babel/template": "^7.28.6", "@babel/types": "^7.29.0", "debug": "^4.3.1" } }, "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA=="],
135+
136+ "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="],
137+
138+ "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.52.0", "", { "dependencies": { "commander": "^11.1.0", "dotenv": "^17.2.1", "eciesjs": "^0.4.10", "execa": "^5.1.1", "fdir": "^6.2.0", "ignore": "^5.3.0", "object-treeify": "1.1.33", "picomatch": "^4.0.2", "which": "^4.0.0" }, "bin": { "dotenvx": "src/cli/dotenvx.js" } }, "sha512-CaQcc8JvtzQhUSm9877b6V4Tb7HCotkcyud9X2YwdqtQKwgljkMRwU96fVYKnzN3V0Hj74oP7Es+vZ0mS+Aa1w=="],
139+
140+ "@ecies/ciphers": ["@ecies/ciphers@0.2.5", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A=="],
141+
142+ "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
143+
144+ "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
145+
146+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
147+
148+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
149+
150+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
151+
152+ "@eslint/config-array": ["@eslint/config-array@0.21.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA=="],
153+
154+ "@eslint/config-helpers": ["@eslint/config-helpers@0.4.2", "", { "dependencies": { "@eslint/core": "^0.17.0" } }, "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw=="],
155+
156+ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="],
157+
158+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="],
159+
160+ "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="],
161+
162+ "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
163+
164+ "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="],
165+
46166 "@executor/client": ["@executor/client@workspace:packages/client"],
47167
48168 "@executor/contracts": ["@executor/contracts@workspace:packages/contracts"],
@@ -51,244 +171,1502 @@ · 2 unmodified lines
51171
52172 "@executor/web": ["@executor/web@workspace:apps/web"],
53173
174+ "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="],
175+
176+ "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="],
177+
178+ "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.7", "", { "dependencies": { "@floating-ui/dom": "^1.7.5" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg=="],
179+
180+ "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="],
181+
54182 "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],
55183
184+ "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="],
185+
186+ "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="],
187+
188+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
189+
190+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="],
191+
192+ "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="],
193+
194+ "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="],
195+
196+ "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" }, "os": "darwin", "cpu": "x64" }, "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw=="],
197+
198+ "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g=="],
199+
200+ "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg=="],
201+
202+ "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.4", "", { "os": "linux", "cpu": "arm" }, "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A=="],
203+
204+ "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw=="],
205+
206+ "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.4", "", { "os": "linux", "cpu": "ppc64" }, "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA=="],
207+
208+ "@img/sharp-libvips-linux-riscv64": ["@img/sharp-libvips-linux-riscv64@1.2.4", "", { "os": "linux", "cpu": "none" }, "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA=="],
209+
210+ "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ=="],
211+
212+ "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw=="],
213+
214+ "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw=="],
215+
216+ "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg=="],
217+
218+ "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" }, "os": "linux", "cpu": "arm" }, "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw=="],
219+
220+ "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg=="],
221+
222+ "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" }, "os": "linux", "cpu": "ppc64" }, "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA=="],
223+
224+ "@img/sharp-linux-riscv64": ["@img/sharp-linux-riscv64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" }, "os": "linux", "cpu": "none" }, "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw=="],
225+
226+ "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" }, "os": "linux", "cpu": "s390x" }, "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg=="],
227+
228+ "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ=="],
229+
230+ "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" }, "os": "linux", "cpu": "arm64" }, "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg=="],
231+
232+ "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" }, "os": "linux", "cpu": "x64" }, "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q=="],
233+
234+ "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.5", "", { "dependencies": { "@emnapi/runtime": "^1.7.0" }, "cpu": "none" }, "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw=="],
235+
236+ "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g=="],
237+
238+ "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg=="],
239+
240+ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="],
241+
242+ "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="],
243+
244+ "@inquirer/confirm": ["@inquirer/confirm@5.1.21", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ=="],
245+
246+ "@inquirer/core": ["@inquirer/core@10.3.2", "", { "dependencies": { "@inquirer/ansi": "^1.0.2", "@inquirer/figures": "^1.0.15", "@inquirer/type": "^3.0.10", "cli-width": "^4.1.0", "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.3" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A=="],
247+
248+ "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="],
249+
250+ "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="],
251+
252+ "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="],
253+
254+ "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.1", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-WMz71T1JS624nWj2n2fnYAuPovhv7EUhk69R6i9dsVyzxt5eM3bjwvgk9L+APE1TRscGysAVMANkB0jh0LQZrQ=="],
255+
256+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
257+
258+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
259+
260+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
261+
262+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
263+
264+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
265+
56266 "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.26.0", "", { "dependencies": { "@hono/node-server": "^1.19.9", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.2.1", "express-rate-limit": "^8.2.1", "hono": "^4.11.4", "jose": "^6.1.3", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.1" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg=="],
57267
58− "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],
268+ "@monaco-editor/loader": ["@monaco-editor/loader@1.7.0", "", { "dependencies": { "state-local": "^1.0.6" } }, "sha512-gIwR1HrJrrx+vfyOhYmCZ0/JcWqG5kbfG7+d3f/C1LXk2EvzAbHSg3MQ5lO2sMlo9izoAZ04shohfKLVT6crVA=="],
59269
60− "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
270+ "@monaco-editor/react": ["@monaco-editor/react@4.7.0", "", { "dependencies": { "@monaco-editor/loader": "^1.5.0" }, "peerDependencies": { "monaco-editor": ">= 0.25.0 < 1", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA=="],
61271
62− "@types/node": ["@types/node@25.2.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg=="],
272+ "@mswjs/interceptors": ["@mswjs/interceptors@0.41.2", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-7G0Uf0yK3f2bjElBLGHIQzgRgMESczOMyYVasq1XK8P5HaXtlW4eQhz9MBL+TQILZLaruq+ClGId+hH0w4jvWw=="],
63273
64− "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
274+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
65275
66− "@vercel/sandbox": ["@vercel/sandbox@1.4.1", "", { "dependencies": { "@vercel/oidc": "^3.1.0", "async-retry": "1.3.3", "jsonlines": "0.1.1", "ms": "2.1.3", "picocolors": "^1.1.1", "tar-stream": "3.1.7", "undici": "^7.16.0", "xdg-app-paths": "5.1.0", "zod": "3.24.4" } }, "sha512-5jaNLv6QJ0112ZFhCv9hQDCV3IYogpbEn5LzMcY5E8TZsf5tF0avat2tBe7McOJvgVs0SDkuzjvGjUMKtTkjrA=="],
276+ "@next/env": ["@next/env@16.1.6", "", {}, "sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ=="],
67277
68− "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
278+ "@next/eslint-plugin-next": ["@next/eslint-plugin-next@16.1.6", "", { "dependencies": { "fast-glob": "3.3.1" } }, "sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ=="],
69279
70− "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
280+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@16.1.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw=="],
71281
72− "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
282+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@16.1.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ=="],
73283
74− "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
284+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@16.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw=="],
75285
76− "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
286+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@16.1.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ=="],
77287
78− "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="],
288+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@16.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ=="],
79289
80− "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="],
290+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@16.1.6", "", { "os": "linux", "cpu": "x64" }, "sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg=="],
81291
82− "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="],
292+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@16.1.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw=="],
83293
84− "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
294+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@16.1.6", "", { "os": "win32", "cpu": "x64" }, "sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A=="],
85295
86− "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],
296+ "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="],
87297
88− "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
298+ "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="],
89299
90− "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
300+ "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
91301
92− "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
302+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
93303
94− "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="],
304+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
95305
96− "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
306+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
97307
98− "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
308+ "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],
99309
100− "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
310+ "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
101311
102− "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
312+ "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="],
103313
104− "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
314+ "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="],
105315
106− "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
316+ "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="],
107317
108− "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
318+ "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="],
109319
110− "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
320+ "@radix-ui/react-accessible-icon": ["@radix-ui/react-accessible-icon@1.1.7", "", { "dependencies": { "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XM+E4WXl0OqUJFovy6GjmxxFyx9opfCAIUku4dlKRd5YEPqt4kALOkQOp0Of6reHuUkJuiPBEc5k0o4z4lTC8A=="],
111321
112− "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
322+ "@radix-ui/react-accordion": ["@radix-ui/react-accordion@1.2.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-T4nygeh9YE9dLRPhAHSeOZi7HBXo+0kYIPJXayZfvWOWA0+n3dESrZbjfDPUABkUNym6Hd+f2IR113To8D2GPA=="],
113323
114− "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
324+ "@radix-ui/react-alert-dialog": ["@radix-ui/react-alert-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-oTVLkEw5GpdRe29BqJ0LSDFWI3qu0vR1M0mUkOQWDIUnY/QIkLpgDMWuKxP94c2NAC2LGcgVhG1ImF3jkZ5wXw=="],
115325
116− "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
326+ "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w=="],
117327
118− "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
328+ "@radix-ui/react-aspect-ratio": ["@radix-ui/react-aspect-ratio@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Yq6lvO9HQyPwev1onK1daHCHqXVLzPhSVjmsNjCa2Zcxy2f7uJD2itDtxknv6FzAKCwD1qQkeVDmX/cev13n/g=="],
119329
120− "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
330+ "@radix-ui/react-avatar": ["@radix-ui/react-avatar@1.1.10", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-V8piFfWapM5OmNCXTzVQY+E1rDa53zY+MQ4Y7356v4fFz6vqCyUtIz2rUD44ZEdwg78/jKmMJHj07+C/Z/rcog=="],
121331
122− "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
332+ "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw=="],
123333
124− "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
334+ "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Uu+mSh4agx2ib1uIGPP4/CKNULyajb3p92LsVXmH2EHVMTfZWpll88XJ0j4W0z3f8NK1eYl1+Mf/szHPmcHzyA=="],
125335
126− "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
336+ "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw=="],
127337
128− "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="],
338+ "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg=="],
129339
130− "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
340+ "@radix-ui/react-context": ["@radix-ui/react-context@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA=="],
131341
132− "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
342+ "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.2.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-O8morBEW+HsVG28gYDZPTrT9UUovQUlJue5YO836tiTJhuIWBm/zQHc7j388sHWtdH/xUZurK9olD2+pcqx5ww=="],
133343
134− "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
344+ "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw=="],
135345
136− "express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="],
346+ "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw=="],
137347
138− "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
348+ "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-escape-keydown": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg=="],
139349
140− "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
350+ "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-1PLGQEynI/3OX/ftV54COn+3Sud/Mn8vALg2rWnBLnRaGtJDduNW/22XjlGgPdpcIbiQxjKtb7BkcjP00nqfJw=="],
141351
142− "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
352+ "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-0rFg/Rj2Q62NCm62jZw0QX7a3sz6QCQU0LpZdNrJX8byRGaGVTqbrW9jAoIAHyMQqsNpeZ81YgSizOt5WXq0Pw=="],
143353
144− "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
354+ "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.7", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw=="],
145355
146− "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
356+ "@radix-ui/react-form": ["@radix-ui/react-form@0.1.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-QM70k4Zwjttifr5a4sZFts9fn8FzHYvQ5PiB19O2HsYibaHSVt9fH9rzB0XZo/YcM+b7t/p7lYCT/F5eOeF5yQ=="],
147357
148− "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
358+ "@radix-ui/react-hover-card": ["@radix-ui/react-hover-card@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-qgTkjNT1CfKMoP0rcasmlH2r1DAiYicWsDsufxl940sT2wHNEWWv6FMWIQXWhVdmC1d/HYfbhQx60KYyAtKxjg=="],
149359
150− "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
360+ "@radix-ui/react-id": ["@radix-ui/react-id@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg=="],
151361
152− "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
362+ "@radix-ui/react-label": ["@radix-ui/react-label@2.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YT1GqPSL8kJn20djelMX7/cTRp/Y9w5IZHvfxQTVHrOqa2yMl7i/UfMqKRU5V7mEyKTrUVgJXhNQPVCG8PBLoQ=="],
153363
154− "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
364+ "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-72F2T+PLlphrqLcAotYPp0uJMr5SjP5SL01wfEspJbru5Zs5vQaSHb4VB3ZMJPimgHHCHG7gMOeOB9H3Hdmtxg=="],
155365
156− "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
366+ "@radix-ui/react-menubar": ["@radix-ui/react-menubar@1.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-EB1FktTz5xRRi2Er974AUQZWg2yVBb1yjip38/lgwtCVRd3a+maUoGHN/xs9Yv8SY8QwbSEb+YrxGadVWbEutA=="],
157367
158− "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
368+ "@radix-ui/react-navigation-menu": ["@radix-ui/react-navigation-menu@1.2.14", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-YB9mTFQvCOAQMHU+C/jVl96WmuWeltyUEpRJJky51huhds5W2FQr1J8D/16sQlf0ozxkPK8uF3niQMdUwZPv5w=="],
159369
160− "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
370+ "@radix-ui/react-one-time-password-field": ["@radix-ui/react-one-time-password-field@0.1.8", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-ycS4rbwURavDPVjCb5iS3aG4lURFDILi6sKI/WITUMZ13gMmn/xGjpLoqBAalhJaDk8I3UbCM5GzKHrnzwHbvg=="],
161371
162− "hono": ["hono@4.11.8", "", {}, "sha512-eVkB/CYCCei7K2WElZW9yYQFWssG0DhaDhVvr7wy5jJ22K+ck8fWW0EsLpB0sITUTvPnc97+rrbQqIr5iqiy9Q=="],
372+ "@radix-ui/react-password-toggle-field": ["@radix-ui/react-password-toggle-field@0.1.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-is-hydrated": "0.1.0" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/UuCrDBWravcaMix4TdT+qlNdVwOM1Nck9kWx/vafXsdfj1ChfhOdfi3cy9SGBpWgTXwYCuboT/oYpJy3clqfw=="],
163373
164− "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
374+ "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kr0X2+6Yy/vJzLYJUPCZEc8SfQcf+1COFoAqauJm74umQhta9M7lNJHP7QQS3vkvcGLQUbWpMzwrXYwrYztHKA=="],
165375
166− "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
376+ "@radix-ui/react-popper": ["@radix-ui/react-popper@1.2.8", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-rect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0NJQ4LFFUuWkE7Oxf0htBKS6zLkkjBH+hM1uk7Ng705ReR8m/uelduy1DBo0PyBXPKVnBA6YBlU94MBGXrSBCw=="],
167377
168− "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
378+ "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ=="],
169379
170− "ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="],
380+ "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ=="],
171381
172− "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
382+ "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.3", "", { "dependencies": { "@radix-ui/react-slot": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ=="],
173383
174− "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
384+ "@radix-ui/react-progress": ["@radix-ui/react-progress@1.1.7", "", { "dependencies": { "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-vPdg/tF6YC/ynuBIJlk1mm7Le0VgW6ub6J2UWnTQ7/D23KXcPI1qy+0vBkgKgd38RCMJavBXpB83HPNFMTb0Fg=="],
175385
176− "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
386+ "@radix-ui/react-radio-group": ["@radix-ui/react-radio-group@1.3.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-VBKYIYImA5zsxACdisNQ3BjCBfmbGH3kQlnFVqlWU4tXwjy7cGX8ta80BcrO+WJXIn5iBylEH3K6ZTlee//lgQ=="],
177387
178− "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
388+ "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7A6S9jSgm/S+7MdtNDSb+IU859vQqJ/QAtcYQcfFC6W8RS4IxIZDldLR0xqCFZ6DCyrQLjLPsxtTNch5jVA4lA=="],
179389
180− "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
390+ "@radix-ui/react-scroll-area": ["@radix-ui/react-scroll-area@1.2.10", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tAXIa1g3sM5CGpVT0uIbUx/U3Gs5N8T52IICuCtObaos1S8fzsrPXG5WObkQN3S6NVl6wKgPhAIiBGbWnvc97A=="],
181391
182− "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
392+ "@radix-ui/react-select": ["@radix-ui/react-select@2.2.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.6.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-I30RydO+bnn2PQztvo25tswPH+wFBjehVGtmagkU78yMdwTwVf12wnAOF+AeP8S2N8xD+5UPbGhkUfPyvT+mwQ=="],
183393
184− "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="],
394+ "@radix-ui/react-separator": ["@radix-ui/react-separator@1.1.7", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-0HEb8R9E8A+jZjvmFCy/J4xhbXy3TV+9XSnGJ3KvTtjlIUy/YQ/p6UYZvi7YbeoeXdyU9+Y3scizK6hkY37baA=="],
185395
186− "jsonlines": ["jsonlines@0.1.1", "", {}, "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA=="],
396+ "@radix-ui/react-slider": ["@radix-ui/react-slider@1.3.6", "", { "dependencies": { "@radix-ui/number": "1.1.1", "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-JPYb1GuM1bxfjMRlNLE+BcmBC8onfCi60Blk7OBqi2MLTFdS+8401U4uFjnwkOr49BLmXxLC6JHkvAsx5OJvHw=="],
187397
188− "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
398+ "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.3", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A=="],
189399
190− "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
400+ "@radix-ui/react-switch": ["@radix-ui/react-switch@1.2.6", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-previous": "1.1.1", "@radix-ui/react-use-size": "1.1.1" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-bByzr1+ep1zk4VubeEVViV592vu2lHE2BZY5OnzehZqOOgogN80+mNtCqPkhn2gklJqOpxWgPoYTSnhBCqpOXQ=="],
191401
192− "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
402+ "@radix-ui/react-tabs": ["@radix-ui/react-tabs@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-7xdcatg7/U+7+Udyoj2zodtI9H/IIopqo+YOIcZOq1nJwXWBZ9p8xiu5llXlekDbZkca79a/fozEYQXIA4sW6A=="],
193403
194− "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
404+ "@radix-ui/react-toast": ["@radix-ui/react-toast@1.2.15", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g=="],
195405
196− "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
406+ "@radix-ui/react-toggle": ["@radix-ui/react-toggle@1.1.10", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ=="],
197407
198− "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
408+ "@radix-ui/react-toggle-group": ["@radix-ui/react-toggle-group@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-use-controllable-state": "1.2.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-5umnS0T8JQzQT6HbPyO7Hh9dgd82NmS36DQr+X/YJ9ctFNCiiQd6IJAYYZ33LUwm8M+taCz5t2ui29fHZc4Y6Q=="],
199409
200− "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
410+ "@radix-ui/react-toolbar": ["@radix-ui/react-toolbar@1.1.11", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-toggle-group": "1.1.11" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-4ol06/1bLoFu1nwUqzdD4Y5RZ9oDdKeiHIsntug54Hcr1pgaHiPqHFEaXI1IFP/EsOfROQZ8Mig9VTIRza6Tjg=="],
201411
202− "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
412+ "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.8", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-id": "1.1.1", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tY7sVt1yL9ozIxvmbtN5qtmH2krXcBCfjEiCgKGLqunJHvgvZG2Pcl2oQ3kbcZARb1BGEHdkLzcYGO8ynVlieg=="],
203413
204− "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
414+ "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg=="],
205415
206− "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
416+ "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.2", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg=="],
207417
208− "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
418+ "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA=="],
209419
210− "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
420+ "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.1", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g=="],
211421
212− "os-paths": ["os-paths@4.4.0", "", {}, "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg=="],
422+ "@radix-ui/react-use-is-hydrated": ["@radix-ui/react-use-is-hydrated@0.1.0", "", { "dependencies": { "use-sync-external-store": "^1.5.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-U+UORVEq+cTnRIaostJv9AGdV3G6Y+zbVd+12e18jQ5A3c0xL03IhnHuiU4UV69wolOQp5GfR58NW/EgdQhwOA=="],
213423
214− "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
424+ "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ=="],
215425
216− "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
426+ "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.1", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ=="],
217427
218− "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
428+ "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.1", "", { "dependencies": { "@radix-ui/rect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w=="],
219429
220− "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
430+ "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.1", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.1" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ=="],
221431
222− "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
432+ "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.3", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug=="],
223433
224− "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
434+ "@radix-ui/rect": ["@radix-ui/rect@1.1.1", "", {}, "sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw=="],
225435
226− "qs": ["qs@6.14.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ=="],
436+ "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="],
227437
228− "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
438+ "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
229439
230− "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
440+ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
231441
232− "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
442+ "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="],
233443
234− "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
444+ "@tailwindcss/node": ["@tailwindcss/node@4.1.18", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "enhanced-resolve": "^5.18.3", "jiti": "^2.6.1", "lightningcss": "1.30.2", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.1.18" } }, "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ=="],
235445
236− "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
446+ "@tailwindcss/oxide": ["@tailwindcss/oxide@4.1.18", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.1.18", "@tailwindcss/oxide-darwin-arm64": "4.1.18", "@tailwindcss/oxide-darwin-x64": "4.1.18", "@tailwindcss/oxide-freebsd-x64": "4.1.18", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", "@tailwindcss/oxide-linux-x64-musl": "4.1.18", "@tailwindcss/oxide-wasm32-wasi": "4.1.18", "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A=="],
237447
238− "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
448+ "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.1.18", "", { "os": "android", "cpu": "arm64" }, "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q=="],
239449
240− "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
450+ "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.1.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A=="],
241451
242− "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
452+ "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.1.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw=="],
243453
244− "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
454+ "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.1.18", "", { "os": "freebsd", "cpu": "x64" }, "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA=="],
245455
246− "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
456+ "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.1.18", "", { "os": "linux", "cpu": "arm" }, "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA=="],
247457
248− "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
458+ "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw=="],
249459
250− "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
460+ "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.1.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg=="],
251461
252− "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
462+ "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g=="],
253463
254− "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
464+ "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.1.18", "", { "os": "linux", "cpu": "x64" }, "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ=="],
255465
256− "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
466+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.1.18", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@emnapi/wasi-threads": "^1.1.0", "@napi-rs/wasm-runtime": "^1.1.0", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.4.0" }, "cpu": "none" }, "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA=="],
257467
258− "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
468+ "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.1.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA=="],
259469
260− "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="],
470+ "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.1.18", "", { "os": "win32", "cpu": "x64" }, "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q=="],
261471
262− "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
472+ "@tailwindcss/postcss": ["@tailwindcss/postcss@4.1.18", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.1.18", "@tailwindcss/oxide": "4.1.18", "postcss": "^8.4.41", "tailwindcss": "4.1.18" } }, "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g=="],
263473
264− "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="],
474+ "@ts-morph/common": ["@ts-morph/common@0.27.0", "", { "dependencies": { "fast-glob": "^3.3.3", "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ=="],
265475
266− "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
476+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
267477
268− "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
478+ "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="],
269479
270− "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
480+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
271481
272− "undici": ["undici@7.21.0", "", {}, "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg=="],
482+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
273483
274− "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
484+ "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="],
275485
276− "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
486+ "@types/node": ["@types/node@20.19.32", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-Ez8QE4DMfhjjTsES9K2dwfV258qBui7qxUsoaixZDiTzbde4U12e1pXGNu/ECsUIOi5/zoCxAQxIhQnaUQ2VvA=="],
277487
278− "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
488+ "@types/react": ["@types/react@19.2.13", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-KkiJeU6VbYbUOp5ITMIc7kBfqlYkKA5KhEHVrGMmUUMt7NeaZg65ojdPk+FtNrBAOXNVM5QM72jnADjM+XVRAQ=="],
279489
280− "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
490+ "@types/react-dom": ["@types/react-dom@19.2.3", "", { "peerDependencies": { "@types/react": "^19.2.0" } }, "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ=="],
281491
282− "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
492+ "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
283493
284− "xdg-app-paths": ["xdg-app-paths@5.1.0", "", { "dependencies": { "xdg-portable": "^7.0.0" } }, "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA=="],
494+ "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
285495
286− "xdg-portable": ["xdg-portable@7.3.0", "", { "dependencies": { "os-paths": "^4.0.1" } }, "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw=="],
496+ "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
287497
288− "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
498+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.54.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/type-utils": "8.54.0", "@typescript-eslint/utils": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ=="],
289499
290− "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
500+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.54.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA=="],
291501
292− "@vercel/sandbox/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="],
502+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.54.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.54.0", "@typescript-eslint/types": "^8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g=="],
503+
504+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0" } }, "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg=="],
505+
506+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.54.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw=="],
507+
508+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA=="],
509+
510+ "@typescript-eslint/types": ["@typescript-eslint/types@8.54.0", "", {}, "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA=="],
511+
512+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.54.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.54.0", "@typescript-eslint/tsconfig-utils": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA=="],
513+
514+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.54.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA=="],
515+
516+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA=="],
517+
518+ "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="],
519+
520+ "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="],
521+
522+ "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="],
523+
524+ "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="],
525+
526+ "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="],
527+
528+ "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="],
529+
530+ "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="],
531+
532+ "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="],
533+
534+ "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="],
535+
536+ "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="],
537+
538+ "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="],
539+
540+ "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="],
541+
542+ "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="],
543+
544+ "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="],
545+
546+ "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="],
547+
548+ "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="],
549+
550+ "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="],
551+
552+ "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="],
553+
554+ "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="],
555+
556+ "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
557+
558+ "@vercel/sandbox": ["@vercel/sandbox@1.4.1", "", { "dependencies": { "@vercel/oidc": "^3.1.0", "async-retry": "1.3.3", "jsonlines": "0.1.1", "ms": "2.1.3", "picocolors": "^1.1.1", "tar-stream": "3.1.7", "undici": "^7.16.0", "xdg-app-paths": "5.1.0", "zod": "3.24.4" } }, "sha512-5jaNLv6QJ0112ZFhCv9hQDCV3IYogpbEn5LzMcY5E8TZsf5tF0avat2tBe7McOJvgVs0SDkuzjvGjUMKtTkjrA=="],
559+
560+ "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="],
561+
562+ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
563+
564+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
565+
566+ "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
567+
568+ "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="],
569+
570+ "ajv-draft-04": ["ajv-draft-04@1.0.0", "", { "peerDependencies": { "ajv": "^8.5.0" }, "optionalPeers": ["ajv"] }, "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw=="],
571+
572+ "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
573+
574+ "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
575+
576+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
577+
578+ "ansis": ["ansis@4.2.0", "", {}, "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig=="],
579+
580+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
581+
582+ "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
583+
584+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
585+
586+ "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
587+
588+ "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="],
589+
590+ "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="],
591+
592+ "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="],
593+
594+ "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="],
595+
596+ "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="],
597+
598+ "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="],
599+
600+ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
601+
602+ "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="],
603+
604+ "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="],
605+
606+ "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
607+
608+ "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="],
609+
610+ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
611+
612+ "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],
613+
614+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
615+
616+ "b4a": ["b4a@1.7.3", "", { "peerDependencies": { "react-native-b4a": "*" }, "optionalPeers": ["react-native-b4a"] }, "sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q=="],
617+
618+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
619+
620+ "bare-events": ["bare-events@2.8.2", "", { "peerDependencies": { "bare-abort-controller": "*" }, "optionalPeers": ["bare-abort-controller"] }, "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ=="],
621+
622+ "baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="],
623+
624+ "body-parser": ["body-parser@2.2.2", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.1", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA=="],
625+
626+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
627+
628+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
629+
630+ "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
631+
632+ "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="],
633+
634+ "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
635+
636+ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
637+
638+ "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
639+
640+ "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
641+
642+ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
643+
644+ "call-me-maybe": ["call-me-maybe@1.0.2", "", {}, "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ=="],
645+
646+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
647+
648+ "caniuse-lite": ["caniuse-lite@1.0.30001769", "", {}, "sha512-BCfFL1sHijQlBGWBMuJyhZUhzo7wer5sVj9hqekB/7xn0Ypy+pER/edCYQm4exbXj4WiySGp40P8UuTh6w1srg=="],
649+
650+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
651+
652+ "class-variance-authority": ["class-variance-authority@0.7.1", "", { "dependencies": { "clsx": "^2.1.1" } }, "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg=="],
653+
654+ "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
655+
656+ "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
657+
658+ "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
659+
660+ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
661+
662+ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
663+
664+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
665+
666+ "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="],
667+
668+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
669+
670+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
671+
672+ "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
673+
674+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
675+
676+ "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="],
677+
678+ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
679+
680+ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
681+
682+ "cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
683+
684+ "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
685+
686+ "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
687+
688+ "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="],
689+
690+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
691+
692+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
693+
694+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
695+
696+ "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="],
697+
698+ "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
699+
700+ "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
701+
702+ "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
703+
704+ "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
705+
706+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
707+
708+ "dedent": ["dedent@1.7.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="],
709+
710+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
711+
712+ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
713+
714+ "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="],
715+
716+ "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
717+
718+ "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
719+
720+ "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
721+
722+ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
723+
724+ "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
725+
726+ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
727+
728+ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
729+
730+ "diff": ["diff@8.0.3", "", {}, "sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ=="],
731+
732+ "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
733+
734+ "dompurify": ["dompurify@3.2.7", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-WhL/YuveyGXJaerVlMYGWhvQswa7myDG17P7Vu65EWC05o8vfeNbvNf4d/BOvH99+ZW+LlQsc1GDKMa1vNK6dw=="],
735+
736+ "dotenv": ["dotenv@17.2.4", "", {}, "sha512-mudtfb4zRB4bVvdj0xRo+e6duH1csJRM8IukBqfTRvHotn9+LBXB8ynAidP9zHqoRC/fsllXgk4kCKlR21fIhw=="],
737+
738+ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
739+
740+ "eciesjs": ["eciesjs@0.4.17", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-TOOURki4G7sD1wDCjj7NfLaXZZ49dFOeEb5y39IXpb8p0hRzVvfvzZHOi5JcT+PpyAbi/Y+lxPb8eTag2WYH8w=="],
741+
742+ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
743+
744+ "electron-to-chromium": ["electron-to-chromium@1.5.286", "", {}, "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A=="],
745+
746+ "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
747+
748+ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="],
749+
750+ "enhanced-resolve": ["enhanced-resolve@5.19.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.0" } }, "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg=="],
751+
752+ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
753+
754+ "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
755+
756+ "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="],
757+
758+ "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
759+
760+ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
761+
762+ "es-iterator-helpers": ["es-iterator-helpers@1.2.2", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" } }, "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w=="],
763+
764+ "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
765+
766+ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
767+
768+ "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="],
769+
770+ "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
771+
772+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
773+
774+ "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
775+
776+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
777+
778+ "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="],
779+
780+ "eslint-config-next": ["eslint-config-next@16.1.6", "", { "dependencies": { "@next/eslint-plugin-next": "16.1.6", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA=="],
781+
782+ "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="],
783+
784+ "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="],
785+
786+ "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="],
787+
788+ "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="],
789+
790+ "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
791+
792+ "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="],
793+
794+ "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="],
795+
796+ "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
797+
798+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
799+
800+ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
801+
802+ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
803+
804+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
805+
806+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
807+
808+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
809+
810+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
811+
812+ "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
813+
814+ "events-universal": ["events-universal@1.0.1", "", { "dependencies": { "bare-events": "^2.7.0" } }, "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw=="],
815+
816+ "eventsource": ["eventsource@3.0.7", "", { "dependencies": { "eventsource-parser": "^3.0.1" } }, "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA=="],
817+
818+ "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
819+
820+ "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="],
821+
822+ "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="],
823+
824+ "express-rate-limit": ["express-rate-limit@8.2.1", "", { "dependencies": { "ip-address": "10.0.1" }, "peerDependencies": { "express": ">= 4.11" } }, "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g=="],
825+
826+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
827+
828+ "fast-fifo": ["fast-fifo@1.3.2", "", {}, "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="],
829+
830+ "fast-glob": ["fast-glob@3.3.3", "", { "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" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
831+
832+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
833+
834+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
835+
836+ "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
837+
838+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
839+
840+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
841+
842+ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
843+
844+ "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="],
845+
846+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
847+
848+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
849+
850+ "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="],
851+
852+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
853+
854+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
855+
856+ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
857+
858+ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
859+
860+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
861+
862+ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
863+
864+ "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
865+
866+ "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="],
867+
868+ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
869+
870+ "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
871+
872+ "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
873+
874+ "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="],
875+
876+ "fzf": ["fzf@0.5.2", "", {}, "sha512-Tt4kuxLXFKHy8KT40zwsUPUkg1CrsgY25FxA2U/j/0WgEDCk3ddc/zLTCCcbSHX9FcKtLuVaDGtGE/STWC+j3Q=="],
877+
878+ "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="],
879+
880+ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
881+
882+ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
883+
884+ "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
885+
886+ "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
887+
888+ "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
889+
890+ "get-own-enumerable-keys": ["get-own-enumerable-keys@1.0.0", "", {}, "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA=="],
891+
892+ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
893+
894+ "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="],
895+
896+ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
897+
898+ "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="],
899+
900+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
901+
902+ "globals": ["globals@16.4.0", "", {}, "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw=="],
903+
904+ "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
905+
906+ "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
907+
908+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
909+
910+ "graphql": ["graphql@16.12.0", "", {}, "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ=="],
911+
912+ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
913+
914+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
915+
916+ "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
917+
918+ "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
919+
920+ "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
921+
922+ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
923+
924+ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
925+
926+ "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="],
927+
928+ "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="],
929+
930+ "hermes-parser": ["hermes-parser@0.25.1", "", { "dependencies": { "hermes-estree": "0.25.1" } }, "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA=="],
931+
932+ "hono": ["hono@4.11.8", "", {}, "sha512-eVkB/CYCCei7K2WElZW9yYQFWssG0DhaDhVvr7wy5jJ22K+ck8fWW0EsLpB0sITUTvPnc97+rrbQqIr5iqiy9Q=="],
933+
934+ "http-errors": ["http-errors@2.0.1", "", { "dependencies": { "depd": "~2.0.0", "inherits": "~2.0.4", "setprototypeof": "~1.2.0", "statuses": "~2.0.2", "toidentifier": "~1.0.1" } }, "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ=="],
935+
936+ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
937+
938+ "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
939+
940+ "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
941+
942+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
943+
944+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
945+
946+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
947+
948+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
949+
950+ "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
951+
952+ "ip-address": ["ip-address@10.0.1", "", {}, "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA=="],
953+
954+ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
955+
956+ "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
957+
958+ "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
959+
960+ "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
961+
962+ "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
963+
964+ "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
965+
966+ "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="],
967+
968+ "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
969+
970+ "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
971+
972+ "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
973+
974+ "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
975+
976+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
977+
978+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
979+
980+ "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
981+
982+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
983+
984+ "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="],
985+
986+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
987+
988+ "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="],
989+
990+ "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
991+
992+ "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
993+
994+ "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
995+
996+ "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="],
997+
998+ "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="],
999+
1000+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
1001+
1002+ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
1003+
1004+ "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="],
1005+
1006+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
1007+
1008+ "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
1009+
1010+ "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
1011+
1012+ "is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="],
1013+
1014+ "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
1015+
1016+ "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
1017+
1018+ "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
1019+
1020+ "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
1021+
1022+ "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
1023+
1024+ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
1025+
1026+ "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
1027+
1028+ "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
1029+
1030+ "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
1031+
1032+ "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
1033+
1034+ "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
1035+
1036+ "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
1037+
1038+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
1039+
1040+ "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="],
1041+
1042+ "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
1043+
1044+ "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="],
1045+
1046+ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
1047+
1048+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
1049+
1050+ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
1051+
1052+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
1053+
1054+ "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
1055+
1056+ "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
1057+
1058+ "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="],
1059+
1060+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
1061+
1062+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
1063+
1064+ "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
1065+
1066+ "jsonlines": ["jsonlines@0.1.1", "", {}, "sha512-ekDrAGso79Cvf+dtm+mL8OBI2bmAOt3gssYs833De/C9NmIpWDWyUO4zPgB5x2/OhY366dkhgfPMYfwZF7yOZA=="],
1067+
1068+ "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
1069+
1070+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
1071+
1072+ "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
1073+
1074+ "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="],
1075+
1076+ "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="],
1077+
1078+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
1079+
1080+ "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="],
1081+
1082+ "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="],
1083+
1084+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.30.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA=="],
1085+
1086+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.30.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ=="],
1087+
1088+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.30.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA=="],
1089+
1090+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.30.2", "", { "os": "linux", "cpu": "arm" }, "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA=="],
1091+
1092+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A=="],
1093+
1094+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.30.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA=="],
1095+
1096+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w=="],
1097+
1098+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.30.2", "", { "os": "linux", "cpu": "x64" }, "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA=="],
1099+
1100+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.30.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ=="],
1101+
1102+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.30.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw=="],
1103+
1104+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
1105+
1106+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
1107+
1108+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
1109+
1110+ "log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
1111+
1112+ "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
1113+
1114+ "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
1115+
1116+ "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="],
1117+
1118+ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
1119+
1120+ "marked": ["marked@14.0.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ=="],
1121+
1122+ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
1123+
1124+ "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="],
1125+
1126+ "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
1127+
1128+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
1129+
1130+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
1131+
1132+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
1133+
1134+ "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="],
1135+
1136+ "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
1137+
1138+ "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
1139+
1140+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
1141+
1142+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
1143+
1144+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
1145+
1146+ "monaco-editor": ["monaco-editor@0.55.1", "", { "dependencies": { "dompurify": "3.2.7", "marked": "14.0.0" } }, "sha512-jz4x+TJNFHwHtwuV9vA9rMujcZRb0CEilTEwG2rRSpe/A7Jdkuj8xPKttCgOh+v/lkHy7HsZ64oj+q3xoAFl9A=="],
1147+
1148+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
1149+
1150+ "msw": ["msw@2.12.9", "", { "dependencies": { "@inquirer/confirm": "^5.0.0", "@mswjs/interceptors": "^0.41.2", "@open-draft/deferred-promise": "^2.2.0", "@types/statuses": "^2.0.6", "cookie": "^1.0.2", "graphql": "^16.12.0", "headers-polyfill": "^4.0.2", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "path-to-regexp": "^6.3.0", "picocolors": "^1.1.1", "rettime": "^0.10.1", "statuses": "^2.0.2", "strict-event-emitter": "^0.5.1", "tough-cookie": "^6.0.0", "type-fest": "^5.2.0", "until-async": "^3.0.2", "yargs": "^17.7.2" }, "peerDependencies": { "typescript": ">= 4.8.x" }, "optionalPeers": ["typescript"], "bin": { "msw": "cli/index.js" } }, "sha512-NYbi51C6M3dujGmcmuGemu68jy12KqQPoVWGeroKToLGsBgrwG5ErM8WctoIIg49/EV49SEvYM9WSqO4G7kNeQ=="],
1151+
1152+ "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="],
1153+
1154+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
1155+
1156+ "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="],
1157+
1158+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
1159+
1160+ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
1161+
1162+ "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="],
1163+
1164+ "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="],
1165+
1166+ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
1167+
1168+ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
1169+
1170+ "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
1171+
1172+ "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
1173+
1174+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
1175+
1176+ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
1177+
1178+ "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
1179+
1180+ "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="],
1181+
1182+ "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
1183+
1184+ "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="],
1185+
1186+ "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="],
1187+
1188+ "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="],
1189+
1190+ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
1191+
1192+ "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
1193+
1194+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
1195+
1196+ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
1197+
1198+ "open": ["open@11.0.0", "", { "dependencies": { "default-browser": "^5.4.0", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.1.0", "wsl-utils": "^0.3.0" } }, "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw=="],
1199+
1200+ "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
1201+
1202+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
1203+
1204+ "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="],
1205+
1206+ "os-paths": ["os-paths@4.4.0", "", {}, "sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg=="],
1207+
1208+ "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="],
1209+
1210+ "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
1211+
1212+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
1213+
1214+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
1215+
1216+ "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="],
1217+
1218+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
1219+
1220+ "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
1221+
1222+ "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
1223+
1224+ "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
1225+
1226+ "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
1227+
1228+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
1229+
1230+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
1231+
1232+ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
1233+
1234+ "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
1235+
1236+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
1237+
1238+ "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
1239+
1240+ "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="],
1241+
1242+ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
1243+
1244+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
1245+
1246+ "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
1247+
1248+ "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
1249+
1250+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
1251+
1252+ "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
1253+
1254+ "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
1255+
1256+ "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
1257+
1258+ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
1259+
1260+ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
1261+
1262+ "qs": ["qs@6.14.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ=="],
1263+
1264+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
1265+
1266+ "radix-ui": ["radix-ui@1.4.3", "", { "dependencies": { "@radix-ui/primitive": "1.1.3", "@radix-ui/react-accessible-icon": "1.1.7", "@radix-ui/react-accordion": "1.2.12", "@radix-ui/react-alert-dialog": "1.1.15", "@radix-ui/react-arrow": "1.1.7", "@radix-ui/react-aspect-ratio": "1.1.7", "@radix-ui/react-avatar": "1.1.10", "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-collapsible": "1.1.12", "@radix-ui/react-collection": "1.1.7", "@radix-ui/react-compose-refs": "1.1.2", "@radix-ui/react-context": "1.1.2", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-direction": "1.1.1", "@radix-ui/react-dismissable-layer": "1.1.11", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-focus-guards": "1.1.3", "@radix-ui/react-focus-scope": "1.1.7", "@radix-ui/react-form": "0.1.8", "@radix-ui/react-hover-card": "1.1.15", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-menu": "2.1.16", "@radix-ui/react-menubar": "1.1.16", "@radix-ui/react-navigation-menu": "1.2.14", "@radix-ui/react-one-time-password-field": "0.1.8", "@radix-ui/react-password-toggle-field": "0.1.3", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-popper": "1.2.8", "@radix-ui/react-portal": "1.1.9", "@radix-ui/react-presence": "1.1.5", "@radix-ui/react-primitive": "2.1.3", "@radix-ui/react-progress": "1.1.7", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-roving-focus": "1.1.11", "@radix-ui/react-scroll-area": "1.2.10", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-separator": "1.1.7", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", "@radix-ui/react-tabs": "1.1.13", "@radix-ui/react-toast": "1.2.15", "@radix-ui/react-toggle": "1.1.10", "@radix-ui/react-toggle-group": "1.1.11", "@radix-ui/react-toolbar": "1.1.11", "@radix-ui/react-tooltip": "1.2.8", "@radix-ui/react-use-callback-ref": "1.1.1", "@radix-ui/react-use-controllable-state": "1.2.2", "@radix-ui/react-use-effect-event": "0.0.2", "@radix-ui/react-use-escape-keydown": "1.1.1", "@radix-ui/react-use-is-hydrated": "0.1.0", "@radix-ui/react-use-layout-effect": "1.1.1", "@radix-ui/react-use-size": "1.1.1", "@radix-ui/react-visually-hidden": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA=="],
1267+
1268+ "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
1269+
1270+ "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="],
1271+
1272+ "react": ["react@19.2.3", "", {}, "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA=="],
1273+
1274+ "react-dom": ["react-dom@19.2.3", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.3" } }, "sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg=="],
1275+
1276+ "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
1277+
1278+ "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="],
1279+
1280+ "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="],
1281+
1282+ "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="],
1283+
1284+ "recast": ["recast@0.23.11", "", { "dependencies": { "ast-types": "^0.16.1", "esprima": "~4.0.0", "source-map": "~0.6.1", "tiny-invariant": "^1.3.3", "tslib": "^2.0.1" } }, "sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA=="],
1285+
1286+ "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
1287+
1288+ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
1289+
1290+ "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
1291+
1292+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
1293+
1294+ "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
1295+
1296+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
1297+
1298+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
1299+
1300+ "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
1301+
1302+ "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
1303+
1304+ "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="],
1305+
1306+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
1307+
1308+ "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="],
1309+
1310+ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
1311+
1312+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
1313+
1314+ "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="],
1315+
1316+ "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
1317+
1318+ "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
1319+
1320+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
1321+
1322+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
1323+
1324+ "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
1325+
1326+ "send": ["send@1.2.1", "", { "dependencies": { "debug": "^4.4.3", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", "http-errors": "^2.0.1", "mime-types": "^3.0.2", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", "statuses": "^2.0.2" } }, "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ=="],
1327+
1328+ "serve-static": ["serve-static@2.2.1", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw=="],
1329+
1330+ "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
1331+
1332+ "set-function-name": ["set-function-name@2.0.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
1333+
1334+ "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
1335+
1336+ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
1337+
1338+ "shadcn": ["shadcn@3.8.4", "", { "dependencies": { "@antfu/ni": "^25.0.0", "@babel/core": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/plugin-transform-typescript": "^7.28.0", "@babel/preset-typescript": "^7.27.1", "@dotenvx/dotenvx": "^1.48.4", "@modelcontextprotocol/sdk": "^1.26.0", "@types/validate-npm-package-name": "^4.0.2", "browserslist": "^4.26.2", "commander": "^14.0.0", "cosmiconfig": "^9.0.0", "dedent": "^1.6.0", "deepmerge": "^4.3.1", "diff": "^8.0.2", "execa": "^9.6.0", "fast-glob": "^3.3.3", "fs-extra": "^11.3.1", "fuzzysort": "^3.1.0", "https-proxy-agent": "^7.0.6", "kleur": "^4.1.5", "msw": "^2.10.4", "node-fetch": "^3.3.2", "open": "^11.0.0", "ora": "^8.2.0", "postcss": "^8.5.6", "postcss-selector-parser": "^7.1.0", "prompts": "^2.4.2", "recast": "^0.23.11", "stringify-object": "^5.0.0", "tailwind-merge": "^3.0.1", "ts-morph": "^26.0.0", "tsconfig-paths": "^4.2.0", "validate-npm-package-name": "^7.0.1", "zod": "^3.24.1", "zod-to-json-schema": "^3.24.6" }, "bin": { "shadcn": "dist/index.js" } }, "sha512-pSad/m1+PGzB0aLsRBV0EkyGg9al1nJqYUuucg6d8v8xZspPZ5/ehGNEp5M4b1KQYqdO5/gGPbkhVbgmXqG9Pw=="],
1339+
1340+ "sharp": ["sharp@0.34.5", "", { "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg=="],
1341+
1342+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
1343+
1344+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
1345+
1346+ "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
1347+
1348+ "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
1349+
1350+ "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
1351+
1352+ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
1353+
1354+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
1355+
1356+ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
1357+
1358+ "sonner": ["sonner@2.0.7", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-W6ZN4p58k8aDKA4XPcx2hpIQXBRAgyiWVkYhT7CvK6D3iAu7xjvVyhQHg2/iaKJZ1XVJ4r7XuwGL+WGEK37i9w=="],
1359+
1360+ "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
1361+
1362+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
1363+
1364+ "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
1365+
1366+ "state-local": ["state-local@1.0.7", "", {}, "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w=="],
1367+
1368+ "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="],
1369+
1370+ "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
1371+
1372+ "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
1373+
1374+ "streamx": ["streamx@2.23.0", "", { "dependencies": { "events-universal": "^1.0.0", "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" } }, "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg=="],
1375+
1376+ "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="],
1377+
1378+ "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
1379+
1380+ "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="],
1381+
1382+ "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="],
1383+
1384+ "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="],
1385+
1386+ "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
1387+
1388+ "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
1389+
1390+ "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
1391+
1392+ "stringify-object": ["stringify-object@5.0.0", "", { "dependencies": { "get-own-enumerable-keys": "^1.0.0", "is-obj": "^3.0.0", "is-regexp": "^3.1.0" } }, "sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg=="],
1393+
1394+ "strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
1395+
1396+ "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
1397+
1398+ "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
1399+
1400+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
1401+
1402+ "styled-jsx": ["styled-jsx@5.1.6", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" } }, "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA=="],
1403+
1404+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
1405+
1406+ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
1407+
1408+ "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
1409+
1410+ "tailwind-merge": ["tailwind-merge@3.4.0", "", {}, "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g=="],
1411+
1412+ "tailwindcss": ["tailwindcss@4.1.18", "", {}, "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw=="],
1413+
1414+ "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
1415+
1416+ "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="],
1417+
1418+ "text-decoder": ["text-decoder@1.2.3", "", { "dependencies": { "b4a": "^1.6.4" } }, "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA=="],
1419+
1420+ "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="],
1421+
1422+ "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
1423+
1424+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
1425+
1426+ "tldts": ["tldts@7.0.22", "", { "dependencies": { "tldts-core": "^7.0.22" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-nqpKFC53CgopKPjT6Wfb6tpIcZXHcI6G37hesvikhx0EmUGPkZrujRyAjgnmp1SHNgpQfKVanZ+KfpANFt2Hxw=="],
1427+
1428+ "tldts-core": ["tldts-core@7.0.22", "", {}, "sha512-KgbTDC5wzlL6j/x6np6wCnDSMUq4kucHNm00KXPbfNzmllCmtmvtykJHfmgdHntwIeupW04y8s1N/43S1PkQDw=="],
1429+
1430+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
1431+
1432+ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
1433+
1434+ "tough-cookie": ["tough-cookie@6.0.0", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w=="],
1435+
1436+ "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="],
1437+
1438+ "ts-morph": ["ts-morph@26.0.0", "", { "dependencies": { "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug=="],
1439+
1440+ "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="],
1441+
1442+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
1443+
1444+ "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
1445+
1446+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
1447+
1448+ "type-fest": ["type-fest@5.4.3", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-AXSAQJu79WGc79/3e9/CR77I/KQgeY1AhNvcShIH4PTcGYyC4xv6H4R4AUOwkPS5799KlVDAu8zExeCrkGquiA=="],
1449+
1450+ "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="],
1451+
1452+ "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
1453+
1454+ "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
1455+
1456+ "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
1457+
1458+ "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
1459+
1460+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
1461+
1462+ "typescript-eslint": ["typescript-eslint@8.54.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.54.0", "@typescript-eslint/parser": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ=="],
1463+
1464+ "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
1465+
1466+ "undici": ["undici@7.21.0", "", {}, "sha512-Hn2tCQpoDt1wv23a68Ctc8Cr/BHpUSfaPYrkajTXOS9IKpxVRx/X5m1K2YkbK2ipgZgxXSgsUinl3x+2YdSSfg=="],
1467+
1468+ "undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
1469+
1470+ "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
1471+
1472+ "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
1473+
1474+ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
1475+
1476+ "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="],
1477+
1478+ "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="],
1479+
1480+ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
1481+
1482+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
1483+
1484+ "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="],
1485+
1486+ "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="],
1487+
1488+ "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="],
1489+
1490+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
1491+
1492+ "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
1493+
1494+ "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
1495+
1496+ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
1497+
1498+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
1499+
1500+ "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
1501+
1502+ "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
1503+
1504+ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
1505+
1506+ "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="],
1507+
1508+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
1509+
1510+ "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
1511+
1512+ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
1513+
1514+ "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
1515+
1516+ "xdg-app-paths": ["xdg-app-paths@5.1.0", "", { "dependencies": { "xdg-portable": "^7.0.0" } }, "sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA=="],
1517+
1518+ "xdg-portable": ["xdg-portable@7.3.0", "", { "dependencies": { "os-paths": "^4.0.1" } }, "sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw=="],
1519+
1520+ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
1521+
1522+ "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
1523+
1524+ "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
1525+
1526+ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
1527+
1528+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
1529+
1530+ "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
1531+
1532+ "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="],
1533+
1534+ "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
1535+
1536+ "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
1537+
1538+ "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="],
1539+
1540+ "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
1541+
1542+ "@dotenvx/dotenvx/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
1543+
1544+ "@dotenvx/dotenvx/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
1545+
1546+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
1547+
1548+ "@eslint/eslintrc/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
1549+
1550+ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
1551+
1552+ "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "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.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="],
1553+
1554+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" }, "bundled": true }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
1555+
1556+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
1557+
1558+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
1559+
1560+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" }, "bundled": true }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
1561+
1562+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
1563+
1564+ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
1565+
1566+ "@ts-morph/common/minimatch": ["minimatch@10.1.2", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.1" } }, "sha512-fu656aJ0n2kcXwsnwnv9g24tkU5uSmOlTjd6WyyaKm2Z+h1qmY6bAjrcaIxF/BslFqbZ8UBtbJi7KgQOZD2PTw=="],
1567+
1568+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
1569+
1570+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
1571+
1572+ "@typescript-eslint/typescript-estree/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1573+
1574+ "@vercel/sandbox/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="],
1575+
1576+ "bun-types/@types/node": ["@types/node@25.2.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-CPrnr8voK8vC6eEtyRzvMpgp3VyVRhgclonE7qYi6P9sXwYb59ucfrnmFBTaP0yUi8Gk4yZg/LlTJULGxvTNsg=="],
1577+
1578+ "cliui/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
1579+
1580+ "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
1581+
1582+ "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
1583+
1584+ "eslint/ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
1585+
1586+ "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
1587+
1588+ "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
1589+
1590+ "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
1591+
1592+ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],
1593+
1594+ "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
1595+
1596+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1597+
1598+ "is-bun-module/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1599+
1600+ "log-symbols/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
1601+
1602+ "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
1603+
1604+ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
1605+
1606+ "msw/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
1607+
1608+ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
1609+
1610+ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
1611+
1612+ "ora/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
1613+
1614+ "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
1615+
1616+ "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
1617+
1618+ "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
1619+
1620+ "shadcn/zod": ["zod@3.24.4", "", {}, "sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg=="],
1621+
1622+ "sharp/semver": ["semver@7.7.4", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA=="],
1623+
1624+ "string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
1625+
1626+ "wrap-ansi/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
1627+
1628+ "wrap-ansi/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
1629+
1630+ "yargs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
1631+
1632+ "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
1633+
1634+ "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
1635+
1636+ "@dotenvx/dotenvx/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
1637+
1638+ "@dotenvx/dotenvx/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
1639+
1640+ "@dotenvx/dotenvx/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
1641+
1642+ "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
1643+
1644+ "@dotenvx/dotenvx/which/isexe": ["isexe@3.1.2", "", {}, "sha512-mIcis6w+JiQf3P7t7mg/35GKB4T1FQsBOtMIvuKw4YErj5RjtbhcTd5/I30fmkmGMwvI0WlzSNN+27K0QCMkAw=="],
1645+
1646+ "@eslint/eslintrc/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
1647+
1648+ "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1649+
1650+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
1651+
1652+ "bun-types/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
1653+
1654+ "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
1655+
1656+ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
1657+
1658+ "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
1659+
1660+ "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
1661+
1662+ "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
1663+
1664+ "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
1665+
1666+ "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
1667+
1668+ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
1669+
1670+ "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
2931671 }
2941672 }
executor/package.json+2−0
@@ -8,6 +8,8 @@ · 7 unmodified lines
88 ],
99 "scripts": {
1010 "dev": "bun run --cwd apps/server dev",
11+ "dev:web": "bun run --cwd apps/web dev",
12+ "dev:all": "bun run dev & bun run dev:web",
1113 "start": "bun run --cwd apps/server start",
1214 "test": "bun test",
1315 "typecheck": "bunx tsc --noEmit -p tsconfig.json"