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 @@
1import webApp from "../../web/index.html";
2import { ExecutorDatabase } from "./database";1import { ExecutorDatabase } from "./database";
3import { TaskEventHub } from "./events";2import { TaskEventHub } from "./events";
4import { LocalBunRuntime } from "./runtimes/local-bun-runtime";3import { LocalBunRuntime } from "./runtimes/local-bun-runtime";
@@ -48,7 +47,10 @@ const toolSourceConfigs = (() => { · 43 unmodified lines
48 }47 }
49})();48})();
50 49
51const externalTools = await loadExternalTools(toolSourceConfigs);50const { tools: externalTools, warnings: externalToolWarnings } = await loadExternalTools(toolSourceConfigs);
51if (externalToolWarnings.length > 0) {
52 for (const w of externalToolWarnings) console.warn(`[executor] ${w}`);
53}
52const tools = [...DEFAULT_TOOLS, ...externalTools];54const tools = [...DEFAULT_TOOLS, ...externalTools];
53 55
54const service = new ExecutorService(new ExecutorDatabase(), new TaskEventHub(), [56const service = new ExecutorService(new ExecutorDatabase(), new TaskEventHub(), [
@@ -63,7 +65,7 @@ const service = new ExecutorService(new ExecutorDatabase(), new TaskEventHub(), · 8 unmodified lines
63const jsonHeaders = {65const jsonHeaders = {
64 "content-type": "application/json; charset=utf-8",66 "content-type": "application/json; charset=utf-8",
65 "access-control-allow-origin": "*",67 "access-control-allow-origin": "*",
66 "access-control-allow-methods": "GET,POST,OPTIONS",68 "access-control-allow-methods": "GET,POST,DELETE,OPTIONS",
67 "access-control-allow-headers": "content-type",69 "access-control-allow-headers": "content-type",
68};70};
69 71
@@ -171,7 +173,6 @@ function createTaskEventsResponse(taskId: string): Response { · 101 unmodified lines
171const server = Bun.serve({173const server = Bun.serve({
172 port,174 port,
173 routes: {175 routes: {
174 "/": webApp,
175 "/api/health": {176 "/api/health": {
176 GET: () => json({ ok: true, tools: service.getBaseToolCount() }),177 GET: () => json({ ok: true, tools: service.getBaseToolCount() }),
177 },178 },
executor/apps/server/src/service.ts+8−2
@@ -109,6 +109,7 @@ export class ExecutorService { · 108 unmodified lines
109 string,109 string,
110 { signature: string; loadedAt: number; tools: Map<string, ToolDefinition> }110 { signature: string; loadedAt: number; tools: Map<string, ToolDefinition> }
111 >();111 >();
112 private readonly workspaceToolLoadWarnings = new Map<string, string[]>();
112 private readonly inFlightTaskIds = new Set<string>();113 private readonly inFlightTaskIds = new Set<string>();
113 private readonly approvalWaiters = new Map<string, ApprovalWaiter>();114 private readonly approvalWaiters = new Map<string, ApprovalWaiter>();
114 115
@@ -224,7 +225,8 @@ export class ExecutorService { · 109 unmodified lines
224 const source = this.db.upsertToolSource(input);225 const source = this.db.upsertToolSource(input);
225 this.workspaceToolCache.delete(source.workspaceId);226 this.workspaceToolCache.delete(source.workspaceId);
226 await this.getWorkspaceTools(source.workspaceId);227 await this.getWorkspaceTools(source.workspaceId);
227 return source;228 const warnings = this.workspaceToolLoadWarnings.get(source.workspaceId) ?? [];
229 return { ...source, warnings };
228 }230 }
229 231
230 async deleteToolSource(workspaceId: string, sourceId: string): Promise<boolean> {232 async deleteToolSource(workspaceId: string, sourceId: string): Promise<boolean> {
@@ -472,16 +474,20 @@ export class ExecutorService { · 241 unmodified lines
472 }474 }
473 475
474 const configs: ExternalToolSourceConfig[] = [];476 const configs: ExternalToolSourceConfig[] = [];
477 const warnings: string[] = [];
475 for (const source of sources) {478 for (const source of sources) {
476 try {479 try {
477 configs.push(normalizeExternalToolSource(source));480 configs.push(normalizeExternalToolSource(source));
478 } catch (error) {481 } catch (error) {
479 const message = error instanceof Error ? error.message : String(error);482 const message = error instanceof Error ? error.message : String(error);
483 warnings.push(`Source '${source.name}': ${message}`);
480 console.warn(`[executor] skipping invalid source ${source.id}: ${message}`);484 console.warn(`[executor] skipping invalid source ${source.id}: ${message}`);
481 }485 }
482 }486 }
483 487
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);
485 491
486 const merged = new Map<string, ToolDefinition>();492 const merged = new Map<string, ToolDefinition>();
487 for (const tool of this.baseTools.values()) {493 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
413 413
414export async function loadExternalTools(sources: ExternalToolSourceConfig[]): Promise<ToolDefinition[]> {414export async function loadExternalTools(sources: ExternalToolSourceConfig[]): Promise<ToolDefinition[]> {
415 const loaded: ToolDefinition[] = [];415 const loaded: ToolDefinition[] = [];
416 const warnings: string[] = [];
416 417
417 for (const source of sources) {418 for (const source of sources) {
418 try {419 try {
@@ -423,9 +424,10 @@ export async function loadExternalTools(sources: ExternalToolSourceConfig[]): Pr · 4 unmodified lines
423 }424 }
424 } catch (error) {425 } catch (error) {
425 const message = error instanceof Error ? error.message : String(error);426 const message = error instanceof Error ? error.message : String(error);
427 warnings.push(`Failed to load ${source.type} source '${source.name}': ${message}`);
426 console.warn(`[executor] failed to load tool source ${source.type}:${source.name}: ${message}`);428 console.warn(`[executor] failed to load tool source ${source.type}:${source.name}: ${message}`);
427 }429 }
428 }430 }
429 431
430 return loaded;432 return { tools: loaded, warnings };
431}433}
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
28npm-debug.log*
29yarn-debug.log*
30yarn-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
41next-env.d.ts
executor/apps/web/README.md+36−0
@@ -0,0 +1,36 @@
1This 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
5First, run the development server:
6
7```bash
8npm run dev
9# or
10yarn dev
11# or
12pnpm dev
13# or
14bun dev
15```
16
17Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18
19You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20
21This 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
25To 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
30You 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
34The 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
36Check 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 @@
1import { defineConfig, globalIgnores } from "eslint/config";
2import nextVitals from "eslint-config-next/core-web-vitals";
3import nextTs from "eslint-config-next/typescript";
4
5const 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
18export 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({});
72console.log("time", now.iso);
73
74await tools.admin.send_announcement({
75 channel: "ops",
76 message: "Deploy candidate ready for review"
77});
78
79const sum = await tools.math.add({ a: 2, b: 5 });
80console.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 @@
1import type { NextConfig } from "next";
2
3const nextConfig: NextConfig = {
4 async rewrites() {
5 return [
6 {
7 source: "/api/:path*",
8 destination: "http://localhost:4001/api/:path*",
9 },
10 ];
11 },
12};
13
14export default nextConfig;
executor/apps/web/package.json+42−1
@@ -1,5 +1,46 @@
1{1{
2 "name": "@executor/web",2 "name": "@executor/web",
3 "version": "0.1.0",
3 "private": true,4 "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 ]
5}46}
executor/apps/web/postcss.config.mjs+7−0
@@ -0,0 +1,7 @@
1const config = {
2 plugins: {
3 "@tailwindcss/postcss": {},
4 },
5};
6
7export default config;
executor/apps/web/src/app/approvals/page.tsx+10−0
@@ -0,0 +1,10 @@
1import { AppShell } from "@/components/app-shell";
2import { ApprovalsView } from "@/components/approvals-view";
3
4export 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 @@
1import type { Metadata } from "next";
2import { JetBrains_Mono, Inter } from "next/font/google";
3import { Toaster } from "sonner";
4import { SessionProvider } from "@/lib/session-context";
5import "./globals.css";
6
7const inter = Inter({
8 variable: "--font-geist-sans",
9 subsets: ["latin"],
10});
11
12const jetbrainsMono = JetBrains_Mono({
13 variable: "--font-geist-mono",
14 subsets: ["latin"],
15});
16
17export const metadata: Metadata = {
18 title: "Executor Console",
19 description: "Approval-first runtime console for AI-generated code execution",
20};
21
22export 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 @@
1import { AppShell } from "@/components/app-shell";
2import { DashboardView } from "@/components/dashboard-view";
3
4export 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 @@
1import { Suspense } from "react";
2import { AppShell } from "@/components/app-shell";
3import { TasksView } from "@/components/tasks-view";
4
5export 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 @@
1import { AppShell } from "@/components/app-shell";
2import { ToolsView } from "@/components/tools-view";
3
4export 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
3import { useState } from "react";
4import Link from "next/link";
5import { usePathname } from "next/navigation";
6import {
7 LayoutDashboard,
8 Play,
9 ShieldCheck,
10 Wrench,
11 Menu,
12 X,
13 Terminal,
14 RotateCcw,
15} from "lucide-react";
16import { Button } from "@/components/ui/button";
17import { Sheet, SheetContent, SheetTrigger, SheetTitle } from "@/components/ui/sheet";
18import { Separator } from "@/components/ui/separator";
19import { useSession } from "@/lib/session-context";
20import { cn } from "@/lib/utils";
21
22const 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
29function 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
60function 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
99function 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
118function 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
157export 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
3import { useState } from "react";
4import {
5 ShieldCheck,
6 ShieldX,
7 RefreshCw,
8 CheckCircle2,
9 Clock,
10} from "lucide-react";
11import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
12import { Button } from "@/components/ui/button";
13import { Skeleton } from "@/components/ui/skeleton";
14import { Separator } from "@/components/ui/separator";
15import { PageHeader } from "@/components/page-header";
16import { TaskStatusBadge } from "@/components/status-badge";
17import { useSession } from "@/lib/session-context";
18import { usePoll } from "@/hooks/use-poll";
19import * as api from "@/lib/api";
20import type { PendingApprovalRecord } from "@/lib/types";
21import { toast } from "sonner";
22
23function 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
30function 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
135export 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
3import { useRef, useEffect, useCallback } from "react";
4import Editor, { type OnMount, type BeforeMount, type Monaco } from "@monaco-editor/react";
5import type { ToolDescriptor } from "@/lib/types";
6
7// ── Generate TypeScript declarations for the tools proxy ──
8
9interface NamespaceNode {
10 children: Map<string, NamespaceNode>;
11 tools: ToolDescriptor[];
12}
13
14function 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
35function 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
52function 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
81function 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
89function 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
130const BASE_ENVIRONMENT_DTS = `
131interface 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}
141declare var console: Console;
142
143declare function setTimeout(callback: (...args: any[]) => void, ms?: number, ...args: any[]): number;
144declare function clearTimeout(id: number): void;
145declare function setInterval(callback: (...args: any[]) => void, ms?: number, ...args: any[]): number;
146declare function clearInterval(id: number): void;
147`;
148
149interface CodeEditorProps {
150 value: string;
151 onChange: (value: string) => void;
152 tools: ToolDescriptor[];
153 className?: string;
154 height?: string;
155}
156
157export 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
3import { useRouter } from "next/navigation";
4import {
5 Play,
6 ShieldCheck,
7 Clock,
8 CheckCircle2,
9 XCircle,
10 AlertTriangle,
11 ArrowRight,
12} from "lucide-react";
13import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
14import { Button } from "@/components/ui/button";
15import { Skeleton } from "@/components/ui/skeleton";
16import { PageHeader } from "@/components/page-header";
17import { TaskStatusBadge } from "@/components/status-badge";
18import { useSession } from "@/lib/session-context";
19import { usePoll } from "@/hooks/use-poll";
20import * as api from "@/lib/api";
21import type { TaskRecord, PendingApprovalRecord } from "@/lib/types";
22
23function formatTime(ts: number) {
24 return new Date(ts).toLocaleTimeString([], {
25 hour: "2-digit",
26 minute: "2-digit",
27 second: "2-digit",
28 });
29}
30
31function 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
38function 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
77function 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
98function 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
118export 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
3interface PageHeaderProps {
4 title: string;
5 description?: string;
6 children?: React.ReactNode;
7}
8
9export 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
3import { Badge } from "@/components/ui/badge";
4import { cn } from "@/lib/utils";
5import type { TaskStatus, ApprovalStatus } from "@/lib/types";
6
7const 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
39const 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
59export 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
74export 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
3import { useState, useEffect, useCallback, useRef } from "react";
4import { useSearchParams, useRouter } from "next/navigation";
5import {
6 Play,
7 RefreshCw,
8 ChevronRight,
9 X,
10 Send,
11} from "lucide-react";
12import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
13import { Button } from "@/components/ui/button";
14import { Input } from "@/components/ui/input";
15import { Label } from "@/components/ui/label";
16import { CodeEditor } from "@/components/code-editor";
17import {
18 Select,
19 SelectContent,
20 SelectItem,
21 SelectTrigger,
22 SelectValue,
23} from "@/components/ui/select";
24import { Skeleton } from "@/components/ui/skeleton";
25import { Separator } from "@/components/ui/separator";
26import { PageHeader } from "@/components/page-header";
27import { TaskStatusBadge } from "@/components/status-badge";
28import { useSession } from "@/lib/session-context";
29import { usePoll } from "@/hooks/use-poll";
30import * as api from "@/lib/api";
31import type {
32 TaskRecord,
33 RuntimeTargetDescriptor,
34 TaskEventRecord,
35 ToolDescriptor,
36} from "@/lib/types";
37import { toast } from "sonner";
38import { cn } from "@/lib/utils";
39
40const DEFAULT_CODE = `// Example: call some tools
41const time = await tools.utils.get_time();
42console.log("Current time:", time.iso);
43
44const result = await tools.math.add({ a: 7, b: 35 });
45console.log("7 + 35 =", result.result);
46
47// This will require approval:
48await tools.admin.send_announcement({
49 channel: "general",
50 message: "Hello from executor!"
51});`;
52
53function formatTime(ts: number) {
54 return new Date(ts).toLocaleTimeString([], {
55 hour: "2-digit",
56 minute: "2-digit",
57 second: "2-digit",
58 });
59}
60
61function 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
72function 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
183function 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
225function 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
381export 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
3import { useState } from "react";
4import {
5 Wrench,
6 Plus,
7 Trash2,
8 RefreshCw,
9 ShieldCheck,
10 Globe,
11 Server,
12 Zap,
13 Search,
14} from "lucide-react";
15import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
16import { Button } from "@/components/ui/button";
17import { Input } from "@/components/ui/input";
18import { Label } from "@/components/ui/label";
19import { Badge } from "@/components/ui/badge";
20import {
21 Select,
22 SelectContent,
23 SelectItem,
24 SelectTrigger,
25 SelectValue,
26} from "@/components/ui/select";
27import {
28 Dialog,
29 DialogContent,
30 DialogHeader,
31 DialogTitle,
32 DialogTrigger,
33} from "@/components/ui/dialog";
34import { Separator } from "@/components/ui/separator";
35import { Skeleton } from "@/components/ui/skeleton";
36import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
37import { PageHeader } from "@/components/page-header";
38import { useSession } from "@/lib/session-context";
39import { usePoll } from "@/hooks/use-poll";
40import * as api from "@/lib/api";
41import type { ToolSourceRecord, ToolDescriptor } from "@/lib/types";
42import { parse as parseDomain } from "tldts";
43import { toast } from "sonner";
44import { cn } from "@/lib/utils";
45
46// ── Add Source Dialog ──
47
48const RAW_HOSTS = new Set([
49 "raw.githubusercontent.com",
50 "cdn.jsdelivr.net",
51 "unpkg.com",
52 "raw.github.com",
53]);
54
55function 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
82function 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
241function 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
313function 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
376export 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
3import * as React from "react"
4import { Avatar as AvatarPrimitive } from "radix-ui"
5
6import { cn } from "@/lib/utils"
7
8function 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
28function 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
41function 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
57function 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
73function 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
86function 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
102export {
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 @@
1import * as React from "react"
2import { cva, type VariantProps } from "class-variance-authority"
3import { Slot } from "radix-ui"
4
5import { cn } from "@/lib/utils"
6
7const 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
29function 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
48export { Badge, badgeVariants }
executor/apps/web/src/components/ui/button.tsx+64−0
@@ -0,0 +1,64 @@
1import * as React from "react"
2import { cva, type VariantProps } from "class-variance-authority"
3import { Slot } from "radix-ui"
4
5import { cn } from "@/lib/utils"
6
7const 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
41function 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
64export { Button, buttonVariants }
executor/apps/web/src/components/ui/card.tsx+92−0
@@ -0,0 +1,92 @@
1import * as React from "react"
2
3import { cn } from "@/lib/utils"
4
5function 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
18function 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
31function 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
41function 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
51function 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
64function 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
74function 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
84export {
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
3import * as React from "react"
4import { XIcon } from "lucide-react"
5import { Dialog as DialogPrimitive } from "radix-ui"
6
7import { cn } from "@/lib/utils"
8import { Button } from "@/components/ui/button"
9
10function Dialog({
11 ...props
12}: React.ComponentProps<typeof DialogPrimitive.Root>) {
13 return <DialogPrimitive.Root data-slot="dialog" {...props} />
14}
15
16function DialogTrigger({
17 ...props
18}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
19 return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
20}
21
22function DialogPortal({
23 ...props
24}: React.ComponentProps<typeof DialogPrimitive.Portal>) {
25 return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
26}
27
28function DialogClose({
29 ...props
30}: React.ComponentProps<typeof DialogPrimitive.Close>) {
31 return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
32}
33
34function 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
50function 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
84function 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
94function 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
121function 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
134function 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
147export {
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
3import * as React from "react"
4import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"
5import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui"
6
7import { cn } from "@/lib/utils"
8
9function DropdownMenu({
10 ...props
11}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
12 return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />
13}
14
15function DropdownMenuPortal({
16 ...props
17}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
18 return (
19 <DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
20 )
21}
22
23function 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
34function 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
54function DropdownMenuGroup({
55 ...props
56}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
57 return (
58 <DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
59 )
60}
61
62function 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
85function 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
111function 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
122function 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
146function 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
166function 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
179function 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
195function DropdownMenuSub({
196 ...props
197}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
198 return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />
199}
200
201function 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
225function 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
241export {
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 @@
1import * as React from "react"
2
3import { cn } from "@/lib/utils"
4
5function 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
21export { Input }
executor/apps/web/src/components/ui/label.tsx+24−0
@@ -0,0 +1,24 @@
1"use client"
2
3import * as React from "react"
4import { Label as LabelPrimitive } from "radix-ui"
5
6import { cn } from "@/lib/utils"
7
8function 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
24export { Label }
executor/apps/web/src/components/ui/scroll-area.tsx+58−0
@@ -0,0 +1,58 @@
1"use client"
2
3import * as React from "react"
4import { ScrollArea as ScrollAreaPrimitive } from "radix-ui"
5
6import { cn } from "@/lib/utils"
7
8function 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
31function 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
58export { ScrollArea, ScrollBar }
executor/apps/web/src/components/ui/select.tsx+190−0
@@ -0,0 +1,190 @@
1"use client"
2
3import * as React from "react"
4import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"
5import { Select as SelectPrimitive } from "radix-ui"
6
7import { cn } from "@/lib/utils"
8
9function Select({
10 ...props
11}: React.ComponentProps<typeof SelectPrimitive.Root>) {
12 return <SelectPrimitive.Root data-slot="select" {...props} />
13}
14
15function SelectGroup({
16 ...props
17}: React.ComponentProps<typeof SelectPrimitive.Group>) {
18 return <SelectPrimitive.Group data-slot="select-group" {...props} />
19}
20
21function SelectValue({
22 ...props
23}: React.ComponentProps<typeof SelectPrimitive.Value>) {
24 return <SelectPrimitive.Value data-slot="select-value" {...props} />
25}
26
27function 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
53function 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
90function 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
103function 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
130function 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
143function 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
161function 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
179export {
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
3import * as React from "react"
4import { Separator as SeparatorPrimitive } from "radix-ui"
5
6import { cn } from "@/lib/utils"
7
8function 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
28export { Separator }
executor/apps/web/src/components/ui/sheet.tsx+143−0
@@ -0,0 +1,143 @@
1"use client"
2
3import * as React from "react"
4import { XIcon } from "lucide-react"
5import { Dialog as SheetPrimitive } from "radix-ui"
6
7import { cn } from "@/lib/utils"
8
9function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
10 return <SheetPrimitive.Root data-slot="sheet" {...props} />
11}
12
13function SheetTrigger({
14 ...props
15}: React.ComponentProps<typeof SheetPrimitive.Trigger>) {
16 return <SheetPrimitive.Trigger data-slot="sheet-trigger" {...props} />
17}
18
19function SheetClose({
20 ...props
21}: React.ComponentProps<typeof SheetPrimitive.Close>) {
22 return <SheetPrimitive.Close data-slot="sheet-close" {...props} />
23}
24
25function SheetPortal({
26 ...props
27}: React.ComponentProps<typeof SheetPrimitive.Portal>) {
28 return <SheetPrimitive.Portal data-slot="sheet-portal" {...props} />
29}
30
31function 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
47function 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
88function 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
98function 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
108function 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
121function 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
134export {
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 @@
1import { cn } from "@/lib/utils"
2
3function 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
13export { Skeleton }
executor/apps/web/src/components/ui/sonner.tsx+40−0
@@ -0,0 +1,40 @@
1"use client"
2
3import {
4 CircleCheckIcon,
5 InfoIcon,
6 Loader2Icon,
7 OctagonXIcon,
8 TriangleAlertIcon,
9} from "lucide-react"
10import { useTheme } from "next-themes"
11import { Toaster as Sonner, type ToasterProps } from "sonner"
12
13const 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
40export { Toaster }
executor/apps/web/src/components/ui/switch.tsx+35−0
@@ -0,0 +1,35 @@
1"use client"
2
3import * as React from "react"
4import { Switch as SwitchPrimitive } from "radix-ui"
5
6import { cn } from "@/lib/utils"
7
8function 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
35export { Switch }
executor/apps/web/src/components/ui/tabs.tsx+91−0
@@ -0,0 +1,91 @@
1"use client"
2
3import * as React from "react"
4import { cva, type VariantProps } from "class-variance-authority"
5import { Tabs as TabsPrimitive } from "radix-ui"
6
7import { cn } from "@/lib/utils"
8
9function 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
28const 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
43function 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
59function 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
78function 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
91export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }
executor/apps/web/src/components/ui/textarea.tsx+18−0
@@ -0,0 +1,18 @@
1import * as React from "react"
2
3import { cn } from "@/lib/utils"
4
5function 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
18export { Textarea }
executor/apps/web/src/components/ui/tooltip.tsx+57−0
@@ -0,0 +1,57 @@
1"use client"
2
3import * as React from "react"
4import { Tooltip as TooltipPrimitive } from "radix-ui"
5
6import { cn } from "@/lib/utils"
7
8function 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
21function Tooltip({
22 ...props
23}: React.ComponentProps<typeof TooltipPrimitive.Root>) {
24 return <TooltipPrimitive.Root data-slot="tooltip" {...props} />
25}
26
27function TooltipTrigger({
28 ...props
29}: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
30 return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
31}
32
33function 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
57export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
executor/apps/web/src/hooks/use-poll.ts+53−0
@@ -0,0 +1,53 @@
1"use client";
2
3import { useEffect, useState, useCallback, useRef } from "react";
4
5interface UsePollOptions<T> {
6 fetcher: () => Promise<T>;
7 interval?: number;
8 enabled?: boolean;
9}
10
11interface UsePollResult<T> {
12 data: T | null;
13 loading: boolean;
14 error: string | null;
15 refresh: () => Promise<void>;
16}
17
18export 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
3import 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
19const BASE = "";
20
21async 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
31export 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
44export 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
55export 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
62export 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
74export 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
83export 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
93export 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
110export 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
119export 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
133export 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
142export 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
158export 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
171export 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
180export 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
199export 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
208export 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
226export 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
3import {
4 createContext,
5 useContext,
6 useEffect,
7 useState,
8 useCallback,
9 type ReactNode,
10} from "react";
11import { bootstrapAnonymousContext } from "./api";
12import type { AnonymousContext } from "./types";
13
14interface SessionState {
15 context: AnonymousContext | null;
16 loading: boolean;
17 error: string | null;
18 resetWorkspace: () => Promise<void>;
19}
20
21const SessionContext = createContext<SessionState>({
22 context: null,
23 loading: true,
24 error: null,
25 resetWorkspace: async () => {},
26});
27
28const SESSION_KEY = "executor_session_id";
29
30export 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
66export 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
4export type TaskStatus =
5 | "queued"
6 | "running"
7 | "completed"
8 | "failed"
9 | "timed_out"
10 | "denied";
11
12export type ApprovalStatus = "pending" | "approved" | "denied";
13export type ApprovalDecision = "approved" | "denied";
14export type PolicyDecision = "allow" | "require_approval" | "deny";
15export type CredentialScope = "workspace" | "actor";
16
17export 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
27export interface CreateTaskResponse {
28 taskId: string;
29 status: TaskStatus;
30}
31
32export 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
52export 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
64export interface PendingApprovalRecord extends ApprovalRecord {
65 task: Pick<
66 TaskRecord,
67 "id" | "status" | "runtimeId" | "timeoutMs" | "createdAt"
68 >;
69}
70
71export interface ResolveApprovalRequest {
72 workspaceId: string;
73 decision: ApprovalDecision;
74 reviewerId?: string;
75 reason?: string;
76}
77
78export interface AnonymousContext {
79 sessionId: string;
80 workspaceId: string;
81 actorId: string;
82 clientId: string;
83 createdAt: number;
84 lastSeenAt: number;
85}
86
87export interface RuntimeTargetDescriptor {
88 id: string;
89 label: string;
90 description: string;
91}
92
93export interface ToolDescriptor {
94 path: string;
95 description: string;
96 approval: "auto" | "required";
97 source?: string;
98 argsType?: string;
99 returnsType?: string;
100}
101
102export 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
114export interface CredentialDescriptor {
115 id: string;
116 workspaceId: string;
117 sourceKey: string;
118 scope: CredentialScope;
119 actorId?: string;
120 hasSecret: boolean;
121}
122
123export 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
134export 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 @@
1import { clsx, type ClassValue } from "clsx"
2import { twMerge } from "tailwind-merge"
3
4export function cn(...inputs: ClassValue[]) {
5 return twMerge(clsx(inputs))
6}
executor/apps/web/src/main.ts+0−643
@@ -1,643 +0,0 @@
1type TaskStatus =
2 | "queued"
3 | "running"
4 | "completed"
5 | "failed"
6 | "timed_out"
7 | "denied";
8
9interface 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
24interface 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
39interface RuntimeTarget {
40 id: string;
41 label: string;
42 description: string;
43}
44
45interface ToolDescriptor {
46 path: string;
47 description: string;
48 approval: "auto" | "required";
49 source?: string;
50 argsType?: string;
51 returnsType?: string;
52}
53
54interface 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
65interface AnonymousContext {
66 sessionId: string;
67 workspaceId: string;
68 actorId: string;
69 clientId: string;
70}
71
72const 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
82const 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
115let selectedTaskStream: EventSource | null = null;
116const ANON_SESSION_STORAGE_KEY = "executor.anonymous.session_id";
117
118async 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
127function escapeHtml(value: string): string {
128 return value
129 .replaceAll("&", "&amp;")
130 .replaceAll("<", "&lt;")
131 .replaceAll(">", "&gt;")
132 .replaceAll('"', "&quot;")
133 .replaceAll("'", "&#39;");
134}
135
136function prettyJson(value: unknown): string {
137 try {
138 return JSON.stringify(value, null, 2);
139 } catch {
140 return String(value);
141 }
142}
143
144function fmtTime(timestamp?: number): string {
145 if (!timestamp) return "-";
146 return new Date(timestamp).toLocaleTimeString();
147}
148
149function statusClass(status: TaskStatus): string {
150 return `status status-${status.replaceAll("_", "-")}`;
151}
152
153function labelStatus(status: TaskStatus): string {
154 return status.replaceAll("_", " ");
155}
156
157function shortId(value: string): string {
158 return value.length <= 22 ? value : `${value.slice(0, 18)}...`;
159}
160
161function 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
181function 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
197function 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
225function 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
250function 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
268function 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
286function renderRuntimeOptions(): void {
287 els.runtimeSelect.innerHTML = state.runtimes
288 .map((runtime) => `<option value="${runtime.id}">${escapeHtml(runtime.label)}</option>`)
289 .join("");
290}
291
292function 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
320function 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
341function 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
367function renderAll(): void {
368 renderContext();
369 renderSourceFormVisibility();
370 renderMetrics();
371 renderRuntimeOptions();
372 renderToolSources();
373 renderToolInventory();
374 renderApprovals();
375 renderTasks();
376 renderTaskDetail();
377}
378
379async 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
411async 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
432async 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
449async 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
461async 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
469function 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
500async 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
548async 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
561els.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
569els.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
577els.sourceType?.addEventListener("change", () => {
578 renderSourceFormVisibility();
579});
580
581els.openapiAuthMode?.addEventListener("change", () => {
582 renderSourceFormVisibility();
583});
584
585els.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
597els.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
612els.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
621els.refreshButton.addEventListener("click", () => {
622 void refreshData({ keepSelection: true });
623});
624
625els.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
632void (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
22body {
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
201h2 {
202 margin: 0;
203 font-family: "Iowan Old Style", "Palatino Linotype", serif;
204 font-size: 1.16rem;
205 letter-spacing: -0.01em;
206}
207
208form {
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
230label {
231 display: grid;
232 gap: 0.35rem;
233 font-size: 0.85rem;
234}
235
236input,
237textarea,
238select,
239button {
240 font: inherit;
241}
242
243input,
244textarea,
245select {
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
254input:focus,
255textarea:focus,
256select: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
262textarea,
263pre {
264 font-family: "IBM Plex Mono", "Fira Code", monospace;
265 font-size: 0.84rem;
266}
267
268pre {
269 white-space: pre-wrap;
270 word-break: break-word;
271}
272
273textarea {
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
329button {
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
339button:hover {
340 transform: translateY(-1px);
341 filter: saturate(1.06);
342}
343
344button.secondary {
345 background: rgba(15, 91, 102, 0.14);
346 color: var(--text);
347}
348
349button.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
506code {
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
23 },23 },
24 "apps/web": {24 "apps/web": {
25 "name": "@executor/web",25 "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 },
26 },54 },
27 "packages/client": {55 "packages/client": {
28 "name": "@executor/client",56 "name": "@executor/client",
@@ -34,7 +62,15 @@ · 5 unmodified lines
34 "name": "@executor/contracts",62 "name": "@executor/contracts",
35 },63 },
36 },64 },
65 "trustedDependencies": [
66 "sharp",
67 "unrs-resolver",
68 ],
37 "packages": {69 "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
38 "@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=="],74 "@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=="],
39 75
40 "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="],76 "@apidevtools/openapi-schemas": ["@apidevtools/openapi-schemas@2.1.0", "", {}, "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ=="],
@@ -43,6 +79,90 @@ · 2 unmodified lines
43 79
44 "@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=="],80 "@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=="],
45 81
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
46 "@executor/client": ["@executor/client@workspace:packages/client"],166 "@executor/client": ["@executor/client@workspace:packages/client"],
47 167
48 "@executor/contracts": ["@executor/contracts@workspace:packages/contracts"],168 "@executor/contracts": ["@executor/contracts@workspace:packages/contracts"],
@@ -51,244 +171,1502 @@ · 2 unmodified lines
51 171
52 "@executor/web": ["@executor/web@workspace:apps/web"],172 "@executor/web": ["@executor/web@workspace:apps/web"],
53 173
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
54 "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],182 "@hono/node-server": ["@hono/node-server@1.19.9", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw=="],
55 183
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
56 "@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=="],266 "@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=="],
57 267
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=="],
59 269
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=="],
61 271
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=="],
63 273
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=="],
65 275
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=="],
67 277
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=="],
69 279
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=="],
71 281
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=="],
73 283
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=="],
75 285
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=="],
77 287
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=="],
79 289
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=="],
81 291
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=="],
83 293
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=="],
85 295
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=="],
87 297
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=="],
89 299
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=="],
91 301
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=="],
93 303
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=="],
95 305
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=="],
97 307
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=="],
99 309
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=="],
101 311
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=="],
103 313
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=="],
105 315
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=="],
107 317
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=="],
109 319
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=="],
111 321
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=="],
113 323
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=="],
115 325
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=="],
117 327
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=="],
119 329
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=="],
121 331
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=="],
123 333
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=="],
125 335
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=="],
127 337
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=="],
129 339
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=="],
131 341
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=="],
133 343
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=="],
135 345
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=="],
137 347
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=="],
139 349
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=="],
141 351
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=="],
143 353
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=="],
145 355
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=="],
147 357
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=="],
149 359
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=="],
151 361
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=="],
153 363
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=="],
155 365
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=="],
157 367
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=="],
159 369
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=="],
161 371
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=="],
163 373
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=="],
165 375
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=="],
167 377
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=="],
169 379
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=="],
171 381
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=="],
173 383
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=="],
175 385
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=="],
177 387
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=="],
179 389
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=="],
181 391
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=="],
183 393
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=="],
185 395
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=="],
187 397
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=="],
189 399
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=="],
191 401
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=="],
193 403
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=="],
195 405
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=="],
197 407
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=="],
199 409
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=="],
201 411
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=="],
203 413
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=="],
205 415
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=="],
207 417
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=="],
209 419
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=="],
211 421
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=="],
213 423
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=="],
215 425
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=="],
217 427
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=="],
219 429
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=="],
221 431
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=="],
223 433
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=="],
225 435
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=="],
227 437
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=="],
229 439
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=="],
231 441
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=="],
233 443
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=="],
235 445
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=="],
237 447
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=="],
239 449
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=="],
241 451
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=="],
243 453
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=="],
245 455
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=="],
247 457
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=="],
249 459
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=="],
251 461
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=="],
253 463
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=="],
255 465
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=="],
257 467
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=="],
259 469
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=="],
261 471
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=="],
263 473
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=="],
265 475
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=="],
267 477
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=="],
269 479
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=="],
271 481
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=="],
273 483
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=="],
275 485
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=="],
277 487
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=="],
279 489
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=="],
281 491
282 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],492 "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
283 493
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=="],
285 495
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=="],
287 497
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=="],
289 499
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=="],
291 501
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=="],
293 }1671 }
294}1672}
executor/package.json+2−0
@@ -8,6 +8,8 @@ · 7 unmodified lines
8 ],8 ],
9 "scripts": {9 "scripts": {
10 "dev": "bun run --cwd apps/server dev",10 "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",
11 "start": "bun run --cwd apps/server start",13 "start": "bun run --cwd apps/server start",
12 "test": "bun test",14 "test": "bun test",
13 "typecheck": "bunx tsc --noEmit -p tsconfig.json"15 "typecheck": "bunx tsc --noEmit -p tsconfig.json"