History

Add shadcn UI components, fix Tailwind monorepo scanning, improve secret selector UX

- Add shadcn/ui component library (button, card, input, popover, command, dialog, etc.) - Fix Tailwind CSS not scanning workspace packages by adding correct @source directives in globals.css (root cause: paths needed ../../../ not ../../ from apps/web/src/) - Improve secret selector: replace trigger button + separate search with single search input that expands into results on focus - Update auth sections across plugins to use rounded bordered containers

Rhys Sullivan committed 7 months ago

Commit 05b2c841 parent 3fea5fb46 files · +1905 −792Browse files

Unified · Split

46 files
  1. apps/web/components.json +21 −0
  2. apps/web/package.json +4 −1
  3. apps/web/src/components/code-block.tsx +6 −3
  4. apps/web/src/components/local-mcp-install-card.tsx +6 −8
  5. apps/web/src/components/shell.tsx +15 −10
  6. apps/web/src/components/source-plugins-reset-state.tsx +1 −1
  7. apps/web/src/components/source-recovery-state.tsx +1 −2
  8. apps/web/src/components/ui/badge.tsx +0 −43
  9. apps/web/src/components/ui/button.tsx +0 −34
  10. apps/web/src/globals.css +49 −2
  11. apps/web/src/lib/utils.ts +4 −4
  12. apps/web/src/plugins/pages.tsx +12 −11
  13. apps/web/src/views/home.tsx +5 −6
  14. apps/web/src/views/secrets.tsx +99 −106
  15. apps/web/tsconfig.json +5 −1
  16. apps/web/vite.config.ts +6 −0
  17. bun.lock +355 −4
  18. packages/clients/react/components.json +21 −0
  19. packages/clients/react/package.json +8 −3
  20. packages/clients/react/src/components/secret-reference-field.tsx +35 −44
  21. packages/clients/react/src/plugins/components/badge.tsx +0 −44
  22. packages/clients/react/src/plugins/components/code-block.tsx +6 −3
  23. packages/clients/react/src/plugins/components/source-tool-explorer.tsx +1 −1
  24. packages/clients/react/src/plugins/components/source-tool-workbench.tsx +37 −29
  25. packages/clients/react/src/plugins/components/ui/alert.tsx +80 −0
  26. packages/clients/react/src/plugins/components/ui/badge.tsx +57 −0
  27. packages/clients/react/src/plugins/components/ui/button.tsx +63 −0
  28. packages/clients/react/src/plugins/components/ui/card.tsx +103 −0
  29. packages/clients/react/src/plugins/components/ui/command.tsx +144 −0
  30. packages/clients/react/src/plugins/components/ui/dialog.tsx +159 −0
  31. packages/clients/react/src/plugins/components/ui/input.tsx +26 −0
  32. packages/clients/react/src/plugins/components/ui/label.tsx +18 −0
  33. packages/clients/react/src/plugins/components/ui/popover.tsx +48 −0
  34. packages/clients/react/src/plugins/components/ui/select.tsx +24 −0
  35. packages/clients/react/src/plugins/components/ui/separator.tsx +23 −0
  36. packages/clients/react/src/plugins/components/ui/textarea.tsx +18 −0
  37. packages/clients/react/src/plugins/index.ts +13 −4
  38. packages/clients/react/src/plugins/lib/utils.ts +6 −0
  39. packages/clients/react/tsconfig.json +5 −1
  40. plugins/execution-history/react/components.tsx +15 −10
  41. plugins/google-discovery/react/components.tsx +92 −91
  42. plugins/graphql/react/components.tsx +60 −57
  43. plugins/local-tools/react/components.tsx +12 −9
  44. plugins/mcp/react/components.tsx +127 −140
  45. plugins/onepassword/react/components.tsx +46 −59
  46. plugins/openapi/react/components.tsx +69 −61
apps/web/components.json+21−0
@@ -0,0 +1,21 @@
1{
2 "$schema": "https://ui.shadcn.com/schema.json",
3 "style": "base-nova",
4 "rsc": false,
5 "tsx": true,
6 "tailwind": {
7 "config": "",
8 "css": "src/globals.css",
9 "baseColor": "neutral",
10 "cssVariables": true,
11 "prefix": ""
12 },
13 "iconLibrary": "lucide",
14 "aliases": {
15 "components": "@/components",
16 "hooks": "@/hooks",
17 "lib": "@/lib",
18 "utils": "@/lib/utils",
19 "ui": "@/components/ui"
20 }
21}
apps/web/package.json+4−1
@@ -9,13 +9,14 @@ · 8 unmodified lines
9 "start": "NODE_ENV=production bun src/server.ts"9 "start": "NODE_ENV=production bun src/server.ts"
10 },10 },
11 "dependencies": {11 "dependencies": {
12 "@base-ui/react": "^1.3.0",
12 "@executor/plugin-execution-history-react": "workspace:*",13 "@executor/plugin-execution-history-react": "workspace:*",
13 "@executor/plugin-google-discovery-react": "workspace:*",14 "@executor/plugin-google-discovery-react": "workspace:*",
14 "@executor/plugin-graphql-react": "workspace:*",15 "@executor/plugin-graphql-react": "workspace:*",
15 "@executor/plugin-local-tools-react": "workspace:*",16 "@executor/plugin-local-tools-react": "workspace:*",
16 "@executor/plugin-mcp-react": "workspace:*",17 "@executor/plugin-mcp-react": "workspace:*",
17 "@executor/plugin-openapi-react": "workspace:*",
18 "@executor/plugin-onepassword-react": "workspace:*",18 "@executor/plugin-onepassword-react": "workspace:*",
19 "@executor/plugin-openapi-react": "workspace:*",
19 "@executor/react": "workspace:*",20 "@executor/react": "workspace:*",
20 "@executor/server": "workspace:*",21 "@executor/server": "workspace:*",
21 "@shikijs/langs": "^4.0.1",22 "@shikijs/langs": "^4.0.1",
@@ -24,9 +25,11 @@ · 2 unmodified lines
24 "class-variance-authority": "^0.7.1",25 "class-variance-authority": "^0.7.1",
25 "clsx": "^2.1.1",26 "clsx": "^2.1.1",
26 "effect": "catalog:",27 "effect": "catalog:",
28 "lucide-react": "^1.7.0",
27 "react": "^19.2.0",29 "react": "^19.2.0",
28 "react-dom": "^19.2.0",30 "react-dom": "^19.2.0",
29 "react-grab": "^0.1.26",31 "react-grab": "^0.1.26",
32 "shadcn": "^4.1.1",
30 "shiki": "^4.0.1",33 "shiki": "^4.0.1",
31 "streamdown": "^2.3.0",34 "streamdown": "^2.3.0",
32 "tailwind-merge": "^3.5.0",35 "tailwind-merge": "^3.5.0",
apps/web/src/components/code-block.tsx+6−3
@@ -1,4 +1,5 @@
1import { useEffect, useState, useRef, useCallback } from "react";1import { useEffect, useState, useRef, useCallback } from "react";
2import { Button } from "@executor/react/plugins";
2import { codeToHtml, resolveLang } from "../lib/shiki";3import { codeToHtml, resolveLang } from "../lib/shiki";
3import { cn } from "../lib/utils";4import { cn } from "../lib/utils";
4import { IconCopy, IconCheck } from "./icons";5import { IconCopy, IconCheck } from "./icons";
@@ -68,14 +69,16 @@ export function CodeBlock(props: { · 63 unmodified lines
68 return (69 return (
69 <div className={cn("group relative overflow-auto", className)}>70 <div className={cn("group relative overflow-auto", className)}>
70 {/* Copy button */}71 {/* Copy button */}
71 <button72 <Button
72 type="button"73 type="button"
74 variant="ghost"
75 size="icon"
73 onClick={handleCopy}76 onClick={handleCopy}
74 className="absolute right-2 top-2 z-10 rounded-md border border-border bg-card/90 p-1.5 text-muted-foreground/40 opacity-0 backdrop-blur-sm transition-all hover:text-foreground group-hover:opacity-100"77 className="absolute right-2 top-2 z-10 size-7 rounded-md border border-border bg-card/90 text-muted-foreground/40 opacity-0 backdrop-blur-sm transition-all hover:text-foreground group-hover:opacity-100"
75 title="Copy to clipboard"78 title="Copy to clipboard"
76 >79 >
77 {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />}80 {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />}
78 </button>81 </Button>
79 82
80 {html ? (83 {html ? (
81 <div84 <div
apps/web/src/components/local-mcp-install-card.tsx+6−8
@@ -1,4 +1,5 @@
1import { useEffect, useState } from "react";1import { useEffect, useState } from "react";
2import { Button } from "@executor/react/plugins";
2import { CodeBlock } from "./code-block";3import { CodeBlock } from "./code-block";
3import { cn } from "../lib/utils";4import { cn } from "../lib/utils";
4 5
@@ -44,19 +45,16 @@ export function LocalMcpInstallCard(props: { · 39 unmodified lines
44 { key: "stdio" as const, label: "Standard I/O" },45 { key: "stdio" as const, label: "Standard I/O" },
45 { key: "http" as const, label: "Remote HTTP" },46 { key: "http" as const, label: "Remote HTTP" },
46 ].map((option) => (47 ].map((option) => (
47 <button48 <Button
48 key={option.key}49 key={option.key}
49 type="button"50 type="button"
51 variant={mode === option.key ? "default" : "ghost"}
52 size="sm"
50 onClick={() => setMode(option.key)}53 onClick={() => setMode(option.key)}
51 className={cn(54 className="rounded-md px-3 py-1.5"
52 "rounded-md px-3 py-1.5 text-xs font-medium transition-colors",
53 mode === option.key
54 ? "bg-primary text-primary-foreground"
55 : "text-muted-foreground hover:bg-accent hover:text-accent-foreground",
56 )}
57 >55 >
58 {option.label}56 {option.label}
59 </button>57 </Button>
60 ))}58 ))}
61 </div>59 </div>
62 <CodeBlock code={command} lang="bash" className="rounded-xl border border-border bg-background/70" />60 <CodeBlock code={command} lang="bash" className="rounded-xl border border-border bg-background/70" />
apps/web/src/components/shell.tsx+15−10
@@ -1,7 +1,7 @@
1import { Link, Outlet, useLocation, useMatchRoute } from "@tanstack/react-router";1import { Link, Outlet, useLocation, useMatchRoute } from "@tanstack/react-router";
2import { useCallback, useEffect, useState } from "react";2import { useCallback, useEffect, useState } from "react";
3import { useSources, type Source } from "@executor/react";3import { useSources, type Source } from "@executor/react";
4import { sourcePluginsIndexPath } from "@executor/react/plugins";4import { Button, sourcePluginsIndexPath } from "@executor/react/plugins";
5import { cn } from "../lib/utils";5import { cn } from "../lib/utils";
6import { IconPlus, IconCopy, IconCheck, IconClose, IconMenu } from "./icons";6import { IconPlus, IconCopy, IconCheck, IconClose, IconMenu } from "./icons";
7import { LoadableBlock } from "./loadable";7import { LoadableBlock } from "./loadable";
@@ -199,10 +199,11 @@ function UpdateCard(props: { latestVersion: string; channel: UpdateChannel }) { · 191 unmodified lines
199 </p>199 </p>
200 </div>200 </div>
201 </div>201 </div>
202 <button202 <Button
203 type="button"203 type="button"
204 variant="outline"
204 onClick={handleCopy}205 onClick={handleCopy}
205 className="mt-2.5 flex w-full items-center justify-between gap-2 rounded-lg border border-border/60 bg-background/50 px-2.5 py-1.5 text-left transition-colors hover:bg-background/80"206 className="mt-2.5 flex w-full items-center justify-between gap-2 rounded-lg border-border/60 bg-background/50 px-2.5 py-1.5 text-left hover:bg-background/80"
206 >207 >
207 <code className="truncate font-mono text-[10px] text-sidebar-foreground">208 <code className="truncate font-mono text-[10px] text-sidebar-foreground">
208 {command}209 {command}
@@ -214,7 +215,7 @@ function UpdateCard(props: { latestVersion: string; channel: UpdateChannel }) { · 5 unmodified lines
214 <IconCopy className="size-3" />215 <IconCopy className="size-3" />
215 )}216 )}
216 </span>217 </span>
217 </button>218 </Button>
218 </div>219 </div>
219 );220 );
220}221}
@@ -285,14 +286,16 @@ export function AppShell() { · 64 unmodified lines
285 v3286 v3
286 </span>287 </span>
287 </Link>288 </Link>
288 <button289 <Button
289 type="button"290 type="button"
291 variant="ghost"
292 size="icon"
290 aria-label="Close navigation"293 aria-label="Close navigation"
291 onClick={() => setMobileSidebarOpen(false)}294 onClick={() => setMobileSidebarOpen(false)}
292 className="inline-flex size-8 items-center justify-center rounded-md text-sidebar-foreground transition-colors hover:bg-sidebar-active hover:text-foreground"295 className="size-8 text-sidebar-foreground hover:bg-sidebar-active hover:text-foreground"
293 >296 >
294 <IconClose className="size-3.5" />297 <IconClose className="size-3.5" />
295 </button>298 </Button>
296 </div>299 </div>
297 <SidebarContent300 <SidebarContent
298 isHome={!!isHome}301 isHome={!!isHome}
@@ -314,14 +317,16 @@ export function AppShell() { · 15 unmodified lines
314 {/* Main content */}317 {/* Main content */}
315 <main className="flex min-h-0 flex-1 flex-col min-w-0 overflow-hidden">318 <main className="flex min-h-0 flex-1 flex-col min-w-0 overflow-hidden">
316 <div className="flex h-12 shrink-0 items-center justify-between border-b border-border bg-background px-4 md:hidden">319 <div className="flex h-12 shrink-0 items-center justify-between border-b border-border bg-background px-4 md:hidden">
317 <button320 <Button
318 type="button"321 type="button"
322 variant="outline"
323 size="icon"
319 aria-label="Open navigation"324 aria-label="Open navigation"
320 onClick={() => setMobileSidebarOpen(true)}325 onClick={() => setMobileSidebarOpen(true)}
321 className="inline-flex size-8 items-center justify-center rounded-md border border-border bg-card text-foreground transition-colors hover:bg-accent/50"326 className="size-8 bg-card hover:bg-accent/50"
322 >327 >
323 <IconMenu className="size-4" />328 <IconMenu className="size-4" />
324 </button>329 </Button>
325 <Link to="/" className="flex items-center gap-1.5">330 <Link to="/" className="flex items-center gap-1.5">
326 <span className="font-display text-base tracking-tight text-foreground">331 <span className="font-display text-base tracking-tight text-foreground">
327 executor332 executor
apps/web/src/components/source-plugins-reset-state.tsx+1−1
@@ -10,7 +10,7 @@ export function SourcePluginsResetState( · 9 unmodified lines
10 input: SourcePluginsResetStateProps,10 input: SourcePluginsResetStateProps,
11) {11) {
12 return (12 return (
13 <div className="min-h-0 flex-1 overflow-y-auto max-w-[300px]">13 <div className="min-h-0 flex-1 overflow-y-auto">
14 <div className="mx-auto max-w-3xl px-6 py-10 lg:px-10 lg:py-14">14 <div className="mx-auto max-w-3xl px-6 py-10 lg:px-10 lg:py-14">
15 <div className="rounded-2xl border border-border bg-card p-8">15 <div className="rounded-2xl border border-border bg-card p-8">
16 <h2 className="font-display text-xl tracking-tight text-foreground">16 <h2 className="font-display text-xl tracking-tight text-foreground">
apps/web/src/components/source-recovery-state.tsx+1−2
@@ -1,8 +1,7 @@
1import type { Source } from "@executor/react";1import type { Source } from "@executor/react";
2 2
3import { Badge, Button } from "@executor/react/plugins";
3import { cn } from "../lib/utils";4import { cn } from "../lib/utils";
4import { Button } from "./ui/button";
5import { Badge } from "./ui/badge";
6import { IconSpinner, IconTool } from "./icons";5import { IconSpinner, IconTool } from "./icons";
7 6
8export function SourceRecoveryState(props: {7export function SourceRecoveryState(props: {
apps/web/src/components/ui/badge.tsx+0−43
@@ -1,43 +0,0 @@
1import type { HTMLAttributes } from "react";
2import { cva, type VariantProps } from "class-variance-authority";
3import { cn } from "../../lib/utils";
4
5const badgeVariants = cva(
6 "inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-medium tracking-wide uppercase",
7 {
8 variants: {
9 variant: {
10 default: "border-transparent bg-primary/15 text-primary",
11 secondary: "border-transparent bg-secondary text-secondary-foreground",
12 outline: "border-border text-muted-foreground",
13 muted: "border-transparent bg-muted text-muted-foreground",
14 get: "border-[var(--method-get)]/20 bg-[var(--method-get)]/10 text-[var(--method-get)]",
15 post: "border-[var(--method-post)]/20 bg-[var(--method-post)]/10 text-[var(--method-post)]",
16 put: "border-[var(--method-put)]/20 bg-[var(--method-put)]/10 text-[var(--method-put)]",
17 delete: "border-[var(--method-delete)]/20 bg-[var(--method-delete)]/10 text-[var(--method-delete)]",
18 destructive: "border-destructive/20 bg-destructive/10 text-destructive",
19 },
20 },
21 defaultVariants: {
22 variant: "default",
23 },
24 },
25);
26
27export type BadgeProps = HTMLAttributes<HTMLSpanElement> & VariantProps<typeof badgeVariants>;
28
29export function Badge({ className, variant, ...props }: BadgeProps) {
30 return <span className={cn(badgeVariants({ variant }), className)} {...props} />;
31}
32
33export function MethodBadge({ method }: { method: string }) {
34 const variant = ({
35 GET: "get",
36 POST: "post",
37 PUT: "put",
38 PATCH: "put",
39 DELETE: "delete",
40 } as const)[method.toUpperCase()] ?? "outline";
41
42 return <Badge variant={variant}>{method}</Badge>;
43}
apps/web/src/components/ui/button.tsx+0−34
@@ -1,34 +0,0 @@
1import type { ButtonHTMLAttributes } from "react";
2import { cva, type VariantProps } from "class-variance-authority";
3import { cn } from "../../lib/utils";
4
5const buttonVariants = cva(
6 "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 outline-none focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:ring-offset-1 focus-visible:ring-offset-background cursor-pointer",
7 {
8 variants: {
9 variant: {
10 default: "bg-primary text-primary-foreground hover:bg-primary/90",
11 secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
12 outline: "border border-input bg-transparent hover:bg-accent hover:text-accent-foreground",
13 ghost: "hover:bg-accent hover:text-accent-foreground",
14 destructive: "bg-destructive text-white hover:bg-destructive/90",
15 },
16 size: {
17 default: "h-9 px-4 py-2",
18 sm: "h-7 rounded-md px-2.5 text-xs",
19 lg: "h-10 rounded-md px-6",
20 icon: "h-8 w-8",
21 },
22 },
23 defaultVariants: {
24 variant: "default",
25 size: "default",
26 },
27 },
28);
29
30type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & VariantProps<typeof buttonVariants>;
31
32export function Button({ className, variant, size, ...props }: ButtonProps) {
33 return <button className={cn(buttonVariants({ variant, size }), className)} {...props} />;
34}
apps/web/src/globals.css+49−2
@@ -1,7 +1,10 @@
1@import "tailwindcss";1@import "tailwindcss";
2@import "tw-animate-css";2@import "tw-animate-css";
3@import "shadcn/tailwind.css";
3 4
4@source "../../node_modules/streamdown/dist/*.js";5@source "../../../packages/clients/react/src/**/*.{ts,tsx}";
6@source "../../../plugins/*/react/**/*.{ts,tsx}";
7@source "../node_modules/streamdown/dist/*.js";
5 8
6@custom-variant dark (&:is(.dark *));9@custom-variant dark (&:is(.dark *));
7 10
@@ -9,6 +12,7 @@ · 1 unmodified line
9 --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif;12 --font-sans: "DM Sans", ui-sans-serif, system-ui, sans-serif;
10 --font-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;13 --font-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, monospace;
11 --font-display: "Instrument Serif", Georgia, serif;14 --font-display: "Instrument Serif", Georgia, serif;
15 --font-heading: var(--font-sans);
12 16
13 --color-background: var(--background);17 --color-background: var(--background);
14 --color-foreground: var(--foreground);18 --color-foreground: var(--foreground);
@@ -33,6 +37,25 @@ · 18 unmodified lines
33 --color-sidebar-foreground: var(--sidebar-foreground);37 --color-sidebar-foreground: var(--sidebar-foreground);
34 --color-sidebar-border: var(--sidebar-border);38 --color-sidebar-border: var(--sidebar-border);
35 --color-sidebar-active: var(--sidebar-active);39 --color-sidebar-active: var(--sidebar-active);
40 --color-sidebar-ring: var(--sidebar-ring);
41 --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
42 --color-sidebar-accent: var(--sidebar-accent);
43 --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
44 --color-sidebar-primary: var(--sidebar-primary);
45
46 --color-chart-5: var(--chart-5);
47 --color-chart-4: var(--chart-4);
48 --color-chart-3: var(--chart-3);
49 --color-chart-2: var(--chart-2);
50 --color-chart-1: var(--chart-1);
51
52 --radius-sm: calc(var(--radius) * 0.6);
53 --radius-md: calc(var(--radius) * 0.8);
54 --radius-lg: var(--radius);
55 --radius-xl: calc(var(--radius) * 1.4);
56 --radius-2xl: calc(var(--radius) * 1.8);
57 --radius-3xl: calc(var(--radius) * 2.2);
58 --radius-4xl: calc(var(--radius) * 2.6);
36}59}
37 60
38/*61/*
@@ -44,6 +67,8 @@ · 5 unmodified lines
44/* ——— Light theme (default) ——— */67/* ——— Light theme (default) ——— */
45:root {68:root {
46 color-scheme: light dark;69 color-scheme: light dark;
70 --radius: 0.625rem;
71
47 --background: oklch(0.985 0.002 260);72 --background: oklch(0.985 0.002 260);
48 --foreground: oklch(0.145 0.005 260);73 --foreground: oklch(0.145 0.005 260);
49 --card: oklch(0.99 0.001 260);74 --card: oklch(0.99 0.001 260);
@@ -67,6 +92,17 @@ · 17 unmodified lines
67 --sidebar-foreground: oklch(0.32 0.008 260);92 --sidebar-foreground: oklch(0.32 0.008 260);
68 --sidebar-border: oklch(0.90 0.005 260);93 --sidebar-border: oklch(0.90 0.005 260);
69 --sidebar-active: oklch(0.935 0.006 260);94 --sidebar-active: oklch(0.935 0.006 260);
95 --sidebar-primary: oklch(0.55 0.17 175);
96 --sidebar-primary-foreground: oklch(0.98 0.005 175);
97 --sidebar-accent: oklch(0.94 0.006 260);
98 --sidebar-accent-foreground: oklch(0.145 0.005 260);
99 --sidebar-ring: oklch(0.55 0.17 175);
100
101 --chart-1: oklch(0.55 0.17 175);
102 --chart-2: oklch(0.52 0.16 230);
103 --chart-3: oklch(0.58 0.16 85);
104 --chart-4: oklch(0.55 0.22 25);
105 --chart-5: oklch(0.50 0.01 250);
70 106
71 /* Method colors */107 /* Method colors */
72 --method-get: oklch(0.55 0.18 155);108 --method-get: oklch(0.55 0.18 155);
@@ -104,6 +140,17 @@ · 31 unmodified lines
104 --sidebar-foreground: oklch(0.72 0.008 250);140 --sidebar-foreground: oklch(0.72 0.008 250);
105 --sidebar-border: oklch(0.20 0.006 260);141 --sidebar-border: oklch(0.20 0.006 260);
106 --sidebar-active: oklch(0.18 0.008 260);142 --sidebar-active: oklch(0.18 0.008 260);
143 --sidebar-primary: oklch(0.72 0.15 175);
144 --sidebar-primary-foreground: oklch(0.12 0.01 175);
145 --sidebar-accent: oklch(0.195 0.008 260);
146 --sidebar-accent-foreground: oklch(0.90 0.008 250);
147 --sidebar-ring: oklch(0.72 0.15 175);
148
149 --chart-1: oklch(0.72 0.15 175);
150 --chart-2: oklch(0.72 0.14 230);
151 --chart-3: oklch(0.78 0.14 85);
152 --chart-4: oklch(0.70 0.18 25);
153 --chart-5: oklch(0.56 0.01 250);
107 154
108 /* Method colors */155 /* Method colors */
109 --method-get: oklch(0.75 0.16 155);156 --method-get: oklch(0.75 0.16 155);
@@ -118,7 +165,7 @@ · 8 unmodified lines
118 165
119@layer base {166@layer base {
120 * {167 * {
121 @apply border-border;168 @apply border-border outline-ring/50;
122 }169 }
123 170
124 html,171 html,
apps/web/src/lib/utils.ts+4−4
@@ -1,6 +1,6 @@
1import { clsx, type ClassValue } from "clsx";1import { clsx, type ClassValue } from "clsx"
2import { twMerge } from "tailwind-merge";2import { twMerge } from "tailwind-merge"
3 3
4export function cn(...inputs: ReadonlyArray<ClassValue>): string {4export function cn(...inputs: ClassValue[]) {
5 return twMerge(clsx(inputs));5 return twMerge(clsx(inputs))
6}6}
apps/web/src/plugins/pages.tsx+12−11
@@ -1,6 +1,10 @@
1import { useState, type FormEvent } from "react";1import { useState, type FormEvent } from "react";
2import { Link, useNavigate } from "@tanstack/react-router";2import { Link, useNavigate } from "@tanstack/react-router";
3import {3import {
4 Alert,
5 Button,
6 Card,
7 Input,
4 ExecutorPluginRouteProvider,8 ExecutorPluginRouteProvider,
5 createSourcePluginPaths,9 createSourcePluginPaths,
6 type ExecutorPluginNavigation,10 type ExecutorPluginNavigation,
@@ -61,7 +65,7 @@ const SourceQuickEntry = () => { · 54 unmodified lines
61 };65 };
62 66
63 return (67 return (
64 <div className="rounded-2xl border border-border bg-card p-6">68 <Card className="rounded-2xl">
65 <h2 className="font-display text-lg font-semibold tracking-tight text-foreground">69 <h2 className="font-display text-lg font-semibold tracking-tight text-foreground">
66 Quick add70 Quick add
67 </h2>71 </h2>
@@ -71,27 +75,24 @@ const SourceQuickEntry = () => { · 3 unmodified lines
71 75
72 <form onSubmit={handleSubmit} className="mt-4">76 <form onSubmit={handleSubmit} className="mt-4">
73 <div className="flex flex-col gap-3 sm:flex-row">77 <div className="flex flex-col gap-3 sm:flex-row">
74 <input78 <Input
75 value={value}79 value={value}
76 onChange={(event) => setValue(event.target.value)}80 onChange={(event) => setValue(event.target.value)}
77 placeholder="https://api.github.com/graphql or npx -y chrome-devtools-mcp@latest"81 placeholder="https://api.github.com/graphql or npx -y chrome-devtools-mcp@latest"
78 className="h-10 flex-1 rounded-lg border border-input bg-background px-3.5 text-sm text-foreground outline-none transition-colors placeholder:text-muted-foreground/45 focus:border-ring focus:ring-1 focus:ring-ring/25"82 className="h-10 flex-1 px-3.5 text-sm"
79 />83 />
80 <button84 <Button type="submit" className="h-10">
81 type="submit"
82 className="inline-flex h-10 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90"
83 >
84 Add source85 Add source
85 </button>86 </Button>
86 </div>87 </div>
87 88
88 {error && (89 {error && (
89 <div className="mt-3 rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">90 <Alert variant="destructive" className="mt-3">
90 {error}91 {error}
91 </div>92 </Alert>
92 )}93 )}
93 </form>94 </form>
94 </div>95 </Card>
95 );96 );
96};97};
97 98
apps/web/src/views/home.tsx+5−6
@@ -4,8 +4,7 @@ import { sourcePluginsIndexPath } from "@executor/react/plugins"; · 3 unmodified lines
4import { LoadableBlock } from "../components/loadable";4import { LoadableBlock } from "../components/loadable";
5import { LocalMcpInstallCard } from "../components/local-mcp-install-card";5import { LocalMcpInstallCard } from "../components/local-mcp-install-card";
6import { SourceFavicon } from "../components/source-favicon";6import { SourceFavicon } from "../components/source-favicon";
7import { Badge } from "../components/ui/badge";7import { Alert, Badge, Button, Card } from "@executor/react/plugins";
8import { Button } from "../components/ui/button";
9import { IconSources, IconPlus } from "../components/icons";8import { IconSources, IconPlus } from "../components/icons";
10import {9import {
11 getSourceFrontendPaths,10 getSourceFrontendPaths,
@@ -48,9 +47,9 @@ export function HomePage() { · 36 unmodified lines
48 <LoadableBlock loadable={sources} loading="Loading sources...">47 <LoadableBlock loadable={sources} loading="Loading sources...">
49 {(items) =>48 {(items) =>
50 !Array.isArray(items) ? (49 !Array.isArray(items) ? (
51 <div className="rounded-xl border border-destructive/20 bg-destructive/5 px-5 py-4 text-sm text-destructive">50 <Alert variant="destructive" className="px-5 py-4">
52 Sources returned an unexpected payload.51 Sources returned an unexpected payload.
53 </div>52 </Alert>
54 ) : items.length === 0 ? (53 ) : items.length === 0 ? (
55 <div className="flex flex-col items-center justify-center rounded-2xl border border-dashed border-border py-20">54 <div className="flex flex-col items-center justify-center rounded-2xl border border-dashed border-border py-20">
56 <div className="flex size-12 items-center justify-center rounded-2xl bg-muted text-muted-foreground mb-4">55 <div className="flex size-12 items-center justify-center rounded-2xl bg-muted text-muted-foreground mb-4">
@@ -74,7 +73,7 @@ export function HomePage() { · 17 unmodified lines
74 {items.map((source) => {73 {items.map((source) => {
75 const paths = getSourceFrontendPaths(source.kind);74 const paths = getSourceFrontendPaths(source.kind);
76 const card = (75 const card = (
77 <div className="flex h-full flex-col rounded-2xl border border-border bg-card px-5 py-4 transition-colors hover:border-primary/25 hover:bg-card/90">76 <Card className="flex h-full flex-col rounded-2xl px-5 py-4 transition-colors hover:border-primary/25 hover:bg-card/90">
78 <div className="flex items-start gap-3">77 <div className="flex items-start gap-3">
79 <div className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground">78 <div className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground">
80 <SourceFavicon source={source} className="size-4" />79 <SourceFavicon source={source} className="size-4" />
@@ -93,7 +92,7 @@ export function HomePage() { · 12 unmodified lines
93 </div>92 </div>
94 </div>93 </div>
95 </div>94 </div>
96 </div>95 </Card>
97 );96 );
98 97
99 if (!paths) {98 if (!paths) {
apps/web/src/views/secrets.tsx+99−106
@@ -19,8 +19,15 @@ import { · 18 unmodified lines
19} from "@executor/react";19} from "@executor/react";
20 20
21import { LoadableBlock } from "../components/loadable";21import { LoadableBlock } from "../components/loadable";
22import { Badge } from "../components/ui/badge";22import { Badge } from "@executor/react/plugins";
23import { Button } from "../components/ui/button";23import {
24 Alert,
25 Button,
26 Card,
27 Input,
28 Label,
29 Select,
30} from "@executor/react/plugins";
24import {31import {
25 IconPencil,32 IconPencil,
26 IconPlus,33 IconPlus,
@@ -194,7 +201,7 @@ export function SecretsPage() { · 167 unmodified lines
194 }}201 }}
195 />202 />
196 ) : (203 ) : (
197 <div className="overflow-hidden rounded-xl border border-border bg-card/80">204 <Card className="overflow-hidden p-0">
198 {items.map((secret, index) => (205 {items.map((secret, index) => (
199 <div206 <div
200 key={secret.id}207 key={secret.id}
@@ -212,7 +219,7 @@ export function SecretsPage() { · 11 unmodified lines
212 />219 />
213 </div>220 </div>
214 ))}221 ))}
215 </div>222 </Card>
216 )223 )
217 }224 }
218 </LoadableBlock>225 </LoadableBlock>
@@ -283,29 +290,29 @@ function CreateSecretStoreForm(props: { · 64 unmodified lines
283 ) : (290 ) : (
284 <>291 <>
285 <div className="grid gap-4 sm:grid-cols-2">292 <div className="grid gap-4 sm:grid-cols-2">
286 <FieldLabel label="Store type">293 <div className="grid gap-2">
287 <select294 <Label>Store type</Label>
295 <Select
288 value={kind}296 value={kind}
289 onChange={(event) => setKind(event.target.value)}297 onChange={(event) => setKind(event.target.value)}
290 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
291 >298 >
292 {props.pluginOptions.map((plugin) => (299 {props.pluginOptions.map((plugin) => (
293 <option key={plugin.kind} value={plugin.kind}>300 <option key={plugin.kind} value={plugin.kind}>
294 {plugin.displayName}301 {plugin.displayName}
295 </option>302 </option>
296 ))}303 ))}
297 </select>304 </Select>
298 </FieldLabel>305 </div>
299 {!StoreCreateForm && (306 {!StoreCreateForm && (
300 <FieldLabel label="Name">307 <div className="grid gap-2">
301 <input308 <Label>Name</Label>
309 <Input
302 value={name}310 value={name}
303 onChange={(event) => setName(event.target.value)}311 onChange={(event) => setName(event.target.value)}
304 placeholder="Secret store"312 placeholder="Secret store"
305 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
306 autoFocus313 autoFocus
307 />314 />
308 </FieldLabel>315 </div>
309 )}316 )}
310 </div>317 </div>
311 318
@@ -582,50 +589,51 @@ function CreateSecretForm(props: { · 270 unmodified lines
582 >589 >
583 {error && <ErrorBanner>{error}</ErrorBanner>}590 {error && <ErrorBanner>{error}</ErrorBanner>}
584 <div className="grid gap-4 sm:grid-cols-2">591 <div className="grid gap-4 sm:grid-cols-2">
585 <FieldLabel label="Store">592 <div className="grid gap-2">
586 <select593 <Label>Store</Label>
594 <Select
587 value={storeId}595 value={storeId}
588 onChange={(event) => setStoreId(event.target.value)}596 onChange={(event) => setStoreId(event.target.value)}
589 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
590 >597 >
591 {props.storeOptions.map((store) => (598 {props.storeOptions.map((store) => (
592 <option key={store.id} value={store.id}>599 <option key={store.id} value={store.id}>
593 {store.name}600 {store.name}
594 </option>601 </option>
595 ))}602 ))}
596 </select>603 </Select>
597 </FieldLabel>604 </div>
598 {canImportSecrets && canCreateSecrets && (605 {canImportSecrets && canCreateSecrets && (
599 <FieldLabel label="Mode">606 <div className="grid gap-2">
600 <select607 <Label>Mode</Label>
608 <Select
601 value={mode}609 value={mode}
602 onChange={(event) => setMode(event.target.value as "create" | "import")}610 onChange={(event) => setMode(event.target.value as "create" | "import")}
603 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
604 >611 >
605 <option value="import">Import from store</option>612 <option value="import">Import from store</option>
606 <option value="create">Create new secret</option>613 <option value="create">Create new secret</option>
607 </select>614 </Select>
608 </FieldLabel>615 </div>
609 )}616 )}
610 <FieldLabel label="Name">617 <div className="grid gap-2">
611 <input618 <Label>Name</Label>
619 <Input
612 value={name}620 value={name}
613 onChange={(event) => setName(event.target.value)}621 onChange={(event) => setName(event.target.value)}
614 placeholder={mode === "import" ? "Optional override name" : "GitHub PAT"}622 placeholder={mode === "import" ? "Optional override name" : "GitHub PAT"}
615 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"
616 autoFocus623 autoFocus
617 />624 />
618 </FieldLabel>625 </div>
619 {mode === "create" && (626 {mode === "create" && (
620 <FieldLabel label="Value">627 <div className="grid gap-2">
621 <input628 <Label>Value</Label>
629 <Input
622 type="password"630 type="password"
623 value={value}631 value={value}
624 onChange={(event) => setValue(event.target.value)}632 onChange={(event) => setValue(event.target.value)}
625 placeholder="ghp_..."633 placeholder="ghp_..."
626 className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-[12px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"634 className="font-mono text-[12px]"
627 />635 />
628 </FieldLabel>636 </div>
629 )}637 )}
630 </div>638 </div>
631 {mode === "import" && canImportSecrets && (639 {mode === "import" && canImportSecrets && (
@@ -644,11 +652,11 @@ function CreateSecretForm(props: { · 12 unmodified lines
644 Back652 Back
645 </Button>653 </Button>
646 )}654 )}
647 <input655 <Input
648 value={browserQuery}656 value={browserQuery}
649 onChange={(event) => setBrowserQuery(event.target.value)}657 onChange={(event) => setBrowserQuery(event.target.value)}
650 placeholder="Search this store"658 placeholder="Search this store"
651 className="h-9 min-w-0 flex-1 rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"659 className="min-w-0 flex-1"
652 />660 />
653 </div>661 </div>
654 {browserStack.length > 0 && (662 {browserStack.length > 0 && (
@@ -673,12 +681,12 @@ function CreateSecretForm(props: { · 18 unmodified lines
673 </div>681 </div>
674 ) : (682 ) : (
675 browserEntries.map((entry, index) => (683 browserEntries.map((entry, index) => (
676 <button684 <Button
677 key={entry.key}685 key={entry.key}
678 type="button"686 variant="ghost"
679 onClick={() => handleBrowserEntryClick(entry)}687 onClick={() => handleBrowserEntryClick(entry)}
680 className={cn(688 className={cn(
681 "flex w-full items-center justify-between gap-3 px-4 py-3 text-left transition-colors hover:bg-accent/50",689 "flex h-auto w-full items-center justify-between gap-3 rounded-none px-4 py-3 text-left",
682 index > 0 && "border-t border-border",690 index > 0 && "border-t border-border",
683 selectedImportKey === entry.key && "bg-accent/60",691 selectedImportKey === entry.key && "bg-accent/60",
684 )}692 )}
@@ -696,7 +704,7 @@ function CreateSecretForm(props: { · 11 unmodified lines
696 <Badge variant="outline">704 <Badge variant="outline">
697 {entry.kind === "group" ? "Open" : "Secret"}705 {entry.kind === "group" ? "Open" : "Secret"}
698 </Badge>706 </Badge>
699 </button>707 </Button>
700 ))708 ))
701 )}709 )}
702 </div>710 </div>
@@ -742,7 +750,7 @@ function SecretStoreCard(props: { · 39 unmodified lines
742 };750 };
743 751
744 return (752 return (
745 <div className="rounded-xl border border-border bg-card/80 p-4">753 <Card className="p-4">
746 <div className="flex items-start justify-between gap-3">754 <div className="flex items-start justify-between gap-3">
747 <div className="min-w-0">755 <div className="min-w-0">
748 <div className="flex flex-wrap items-center gap-2">756 <div className="flex flex-wrap items-center gap-2">
@@ -764,40 +772,41 @@ function SecretStoreCard(props: { · 15 unmodified lines
764 {props.canManage ? (772 {props.canManage ? (
765 confirmDelete ? (773 confirmDelete ? (
766 <div className="flex items-center gap-1">774 <div className="flex items-center gap-1">
767 <button775 <Button
768 type="button"776 variant="ghost"
777 size="sm"
769 onClick={() => setConfirmDelete(false)}778 onClick={() => setConfirmDelete(false)}
770 disabled={isDeleting}779 disabled={isDeleting}
771 className="rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:opacity-50"
772 >780 >
773 Cancel781 Cancel
774 </button>782 </Button>
775 <button783 <Button
776 type="button"784 variant="destructive-outline"
785 size="sm"
777 onClick={() => {786 onClick={() => {
778 void handleDelete();787 void handleDelete();
779 }}788 }}
780 disabled={isDeleting}789 disabled={isDeleting}
781 className="inline-flex items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-destructive transition-colors hover:bg-destructive/8 disabled:opacity-50"
782 >790 >
783 {isDeleting791 {isDeleting
784 ? <IconSpinner className="size-3" />792 ? <IconSpinner className="size-3" />
785 : <IconTrash className="size-3" />}793 : <IconTrash className="size-3" />}
786 Delete794 Delete
787 </button>795 </Button>
788 </div>796 </div>
789 ) : (797 ) : (
790 <button798 <Button
791 type="button"799 variant="ghost"
800 size="sm"
792 onClick={() => setConfirmDelete(true)}801 onClick={() => setConfirmDelete(true)}
793 disabled={isDeleting}802 disabled={isDeleting}
794 className="inline-flex items-center gap-1 rounded-md px-2 py-1 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-destructive/8 hover:text-destructive disabled:opacity-50"803 className="text-muted-foreground hover:bg-destructive/8 hover:text-destructive"
795 >804 >
796 {isDeleting805 {isDeleting
797 ? <IconSpinner className="size-3" />806 ? <IconSpinner className="size-3" />
798 : <IconTrash className="size-3" />}807 : <IconTrash className="size-3" />}
799 Remove808 Remove
800 </button>809 </Button>
801 )810 )
802 ) : (811 ) : (
803 <span className="text-[10px] font-medium uppercase tracking-[0.12em] text-muted-foreground/45">812 <span className="text-[10px] font-medium uppercase tracking-[0.12em] text-muted-foreground/45">
@@ -805,7 +814,7 @@ function SecretStoreCard(props: { · 1 unmodified line
805 </span>814 </span>
806 )}815 )}
807 </div>816 </div>
808 </div>817 </Card>
809 );818 );
810}819}
811 820
@@ -868,11 +877,11 @@ function SecretRow(props: { · 56 unmodified lines
868 )}877 )}
869 </div>878 </div>
870 <div className="flex shrink-0 items-center gap-1.5">879 <div className="flex shrink-0 items-center gap-1.5">
871 <button880 <Button
872 type="button"881 variant="ghost"
882 size="sm"
873 onClick={props.onEdit}883 onClick={props.onEdit}
874 className={cn(884 className={cn(
875 "inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium transition-colors",
876 props.isEditing885 props.isEditing
877 ? "bg-primary/10 text-primary"886 ? "bg-primary/10 text-primary"
878 : "text-muted-foreground hover:bg-accent/50 hover:text-foreground",887 : "text-muted-foreground hover:bg-accent/50 hover:text-foreground",
@@ -880,43 +889,44 @@ function SecretRow(props: { · 1 unmodified line
880 >889 >
881 <IconPencil className="size-3" />890 <IconPencil className="size-3" />
882 Edit891 Edit
883 </button>892 </Button>
884 {confirmDelete ? (893 {confirmDelete ? (
885 <>894 <>
886 <button895 <Button
887 type="button"896 variant="ghost"
897 size="sm"
888 onClick={() => setConfirmDelete(false)}898 onClick={() => setConfirmDelete(false)}
889 disabled={isDeleting}899 disabled={isDeleting}
890 className="rounded-md px-2 py-1.5 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:opacity-50"
891 >900 >
892 Cancel901 Cancel
893 </button>902 </Button>
894 <button903 <Button
895 type="button"904 variant="destructive-outline"
905 size="sm"
896 onClick={() => {906 onClick={() => {
897 void handleDelete();907 void handleDelete();
898 }}908 }}
899 disabled={isDeleting}909 disabled={isDeleting}
900 className="inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium text-destructive transition-colors hover:bg-destructive/8 disabled:opacity-50"
901 >910 >
902 {isDeleting911 {isDeleting
903 ? <IconSpinner className="size-3" />912 ? <IconSpinner className="size-3" />
904 : <IconTrash className="size-3" />}913 : <IconTrash className="size-3" />}
905 Delete914 Delete
906 </button>915 </Button>
907 </>916 </>
908 ) : (917 ) : (
909 <button918 <Button
910 type="button"919 variant="ghost"
920 size="sm"
911 onClick={() => setConfirmDelete(true)}921 onClick={() => setConfirmDelete(true)}
912 disabled={isDeleting}922 disabled={isDeleting}
913 className="inline-flex items-center gap-1 rounded-md px-2 py-1.5 text-[11px] font-medium text-muted-foreground transition-colors hover:bg-destructive/8 hover:text-destructive disabled:opacity-50"923 className="text-muted-foreground hover:bg-destructive/8 hover:text-destructive"
914 >924 >
915 {isDeleting925 {isDeleting
916 ? <IconSpinner className="size-3" />926 ? <IconSpinner className="size-3" />
917 : <IconTrash className="size-3" />}927 : <IconTrash className="size-3" />}
918 Delete928 Delete
919 </button>929 </Button>
920 )}930 )}
921 </div>931 </div>
922 </div>932 </div>
@@ -968,33 +978,35 @@ function EditSecretForm(props: { · 45 unmodified lines
968 <div className="mt-3 border-t border-border/50 pt-3">978 <div className="mt-3 border-t border-border/50 pt-3">
969 {error && <ErrorBanner className="mb-3">{error}</ErrorBanner>}979 {error && <ErrorBanner className="mb-3">{error}</ErrorBanner>}
970 <div className="grid gap-3 sm:grid-cols-2">980 <div className="grid gap-3 sm:grid-cols-2">
971 <FieldLabel label="Name">981 <div className="grid gap-2">
972 <input982 <Label>Name</Label>
983 <Input
973 value={name}984 value={name}
974 onChange={(event) => setName(event.target.value)}985 onChange={(event) => setName(event.target.value)}
975 placeholder="Secret name"986 placeholder="Secret name"
976 className="h-8 w-full rounded-lg border border-input bg-background px-3 text-[12px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"987 className="h-8 text-[12px]"
977 autoFocus988 autoFocus
978 />989 />
979 </FieldLabel>990 </div>
980 <FieldLabel label="New value">991 <div className="grid gap-2">
981 <input992 <Label>New value</Label>
993 <Input
982 type="password"994 type="password"
983 value={value}995 value={value}
984 onChange={(event) => setValue(event.target.value)}996 onChange={(event) => setValue(event.target.value)}
985 placeholder="Leave empty to keep existing"997 placeholder="Leave empty to keep existing"
986 className="h-8 w-full rounded-lg border border-input bg-background px-3 font-mono text-[11px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25"998 className="h-8 font-mono text-[11px]"
987 />999 />
988 </FieldLabel>1000 </div>
989 </div>1001 </div>
990 <div className="mt-3 flex items-center justify-end gap-2">1002 <div className="mt-3 flex items-center justify-end gap-2">
991 <button1003 <Button
992 type="button"1004 variant="ghost"
1005 size="sm"
993 onClick={props.onClose}1006 onClick={props.onClose}
994 className="rounded-md px-3 py-1.5 text-[12px] font-medium text-muted-foreground transition-colors hover:text-foreground"
995 >1007 >
996 Cancel1008 Cancel
997 </button>1009 </Button>
998 <Button1010 <Button
999 size="sm"1011 size="sm"
1000 onClick={handleSubmit}1012 onClick={handleSubmit}
@@ -1015,19 +1027,19 @@ function FormCard(props: { · 14 unmodified lines
1015 children: ReactNode;1027 children: ReactNode;
1016}) {1028}) {
1017 return (1029 return (
1018 <div className={cn("rounded-xl border border-primary/20 bg-card/80", props.className)}>1030 <Card className={cn("border-primary/20 p-0", props.className)}>
1019 <div className="flex items-center justify-between border-b border-border px-5 py-3">1031 <div className="flex items-center justify-between border-b border-border px-5 py-3">
1020 <h3 className="text-sm font-semibold text-foreground">{props.title}</h3>1032 <h3 className="text-sm font-semibold text-foreground">{props.title}</h3>
1021 <button1033 <Button
1022 type="button"1034 variant="ghost"
1035 size="sm"
1023 onClick={props.onClose}1036 onClick={props.onClose}
1024 className="text-[12px] text-muted-foreground transition-colors hover:text-foreground"
1025 >1037 >
1026 Cancel1038 Cancel
1027 </button>1039 </Button>
1028 </div>1040 </div>
1029 <div className="space-y-4 p-5">{props.children}</div>1041 <div className="space-y-4 p-5">{props.children}</div>
1030 </div>1042 </Card>
1031 );1043 );
1032}1044}
1033 1045
@@ -1036,14 +1048,9 @@ function ErrorBanner(props: { · 2 unmodified lines
1036 className?: string;1048 className?: string;
1037}) {1049}) {
1038 return (1050 return (
1039 <div1051 <Alert variant="destructive" className={cn("text-[13px]", props.className)}>
1040 className={cn(
1041 "rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-[13px] text-destructive",
1042 props.className,
1043 )}
1044 >
1045 {props.children}1052 {props.children}
1046 </div>1053 </Alert>
1047 );1054 );
1048}1055}
1049 1056
@@ -1069,20 +1076,6 @@ function SectionEmptyState(props: { · 19 unmodified lines
1069 );1076 );
1070}1077}
1071 1078
1072function FieldLabel(props: {
1073 label: string;
1074 children: ReactNode;
1075}) {
1076 return (
1077 <label className="block space-y-1">
1078 <span className="text-[11px] font-medium text-muted-foreground">
1079 {props.label}
1080 </span>
1081 {props.children}
1082 </label>
1083 );
1084}
1085
1086const formatDate = (value: number): string =>1079const formatDate = (value: number): string =>
1087 new Date(value).toLocaleDateString(undefined, {1080 new Date(value).toLocaleDateString(undefined, {
1088 month: "short",1081 month: "short",
apps/web/tsconfig.json+5−1
@@ -8,7 +8,11 @@ · 7 unmodified lines
8 "noEmit": true,8 "noEmit": true,
9 "lib": ["ES2022", "DOM", "DOM.Iterable"],9 "lib": ["ES2022", "DOM", "DOM.Iterable"],
10 "jsx": "react-jsx",10 "jsx": "react-jsx",
11 "types": ["bun-types"]11 "types": ["bun-types"],
12 "baseUrl": ".",
13 "paths": {
14 "@/*": ["./src/*"]
15 }
12 },16 },
13 "include": [17 "include": [
14 "src/**/*.ts",18 "src/**/*.ts",
apps/web/vite.config.ts+6−0
@@ -1,4 +1,5 @@
1import { readFileSync } from "node:fs";1import { readFileSync } from "node:fs";
2import path from "node:path";
2import { defineConfig } from "vite";3import { defineConfig } from "vite";
3import react from "@vitejs/plugin-react";4import react from "@vitejs/plugin-react";
4import tailwindcss from "@tailwindcss/vite";5import tailwindcss from "@tailwindcss/vite";
@@ -35,6 +36,11 @@ const workspaceExecutorPackages = Object.keys(webPackage.dependencies ?? {}).fil · 30 unmodified lines
35 36
36export default defineConfig({37export default defineConfig({
37 root: "src",38 root: "src",
39 resolve: {
40 alias: {
41 "@": path.resolve(import.meta.dirname, "./src"),
42 },
43 },
38 plugins: [44 plugins: [
39 tailwindcss(),45 tailwindcss(),
40 react(),46 react(),
bun.lock+355−4
@@ -57,6 +57,7 @@ · 56 unmodified lines
57 "name": "@executor/web",57 "name": "@executor/web",
58 "version": "0.0.0",58 "version": "0.0.0",
59 "dependencies": {59 "dependencies": {
60 "@base-ui/react": "^1.3.0",
60 "@executor/plugin-execution-history-react": "workspace:*",61 "@executor/plugin-execution-history-react": "workspace:*",
61 "@executor/plugin-google-discovery-react": "workspace:*",62 "@executor/plugin-google-discovery-react": "workspace:*",
62 "@executor/plugin-graphql-react": "workspace:*",63 "@executor/plugin-graphql-react": "workspace:*",
@@ -72,9 +73,11 @@ · 9 unmodified lines
72 "class-variance-authority": "^0.7.1",73 "class-variance-authority": "^0.7.1",
73 "clsx": "^2.1.1",74 "clsx": "^2.1.1",
74 "effect": "catalog:",75 "effect": "catalog:",
76 "lucide-react": "^1.7.0",
75 "react": "^19.2.0",77 "react": "^19.2.0",
76 "react-dom": "^19.2.0",78 "react-dom": "^19.2.0",
77 "react-grab": "^0.1.26",79 "react-grab": "^0.1.26",
80 "shadcn": "^4.1.1",
78 "shiki": "^4.0.1",81 "shiki": "^4.0.1",
79 "streamdown": "^2.3.0",82 "streamdown": "^2.3.0",
80 "tailwind-merge": "^3.5.0",83 "tailwind-merge": "^3.5.0",
@@ -132,6 +135,7 @@ · 51 unmodified lines
132 "name": "@executor/react",135 "name": "@executor/react",
133 "version": "0.0.0",136 "version": "0.0.0",
134 "dependencies": {137 "dependencies": {
138 "@base-ui/react": "^1.3.0",
135 "@effect-atom/atom": "0.5.3",139 "@effect-atom/atom": "0.5.3",
136 "@effect-atom/atom-react": "0.5.0",140 "@effect-atom/atom-react": "0.5.0",
137 "@effect/platform": "catalog:",141 "@effect/platform": "catalog:",
@@ -141,6 +145,7 @@ · 3 unmodified lines
141 "@shikijs/themes": "^4.0.1",145 "@shikijs/themes": "^4.0.1",
142 "class-variance-authority": "^0.7.1",146 "class-variance-authority": "^0.7.1",
143 "clsx": "^2.1.1",147 "clsx": "^2.1.1",
148 "cmdk": "^1.1.1",
144 "effect": "catalog:",149 "effect": "catalog:",
145 "shiki": "^4.0.1",150 "shiki": "^4.0.1",
146 "streamdown": "^2.3.0",151 "streamdown": "^2.3.0",
@@ -833,16 +838,28 @@ · 686 unmodified lines
833 838
834 "@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=="],839 "@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=="],
835 840
841 "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="],
842
836 "@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=="],843 "@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=="],
837 844
845 "@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=="],
846
838 "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],847 "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
839 848
849 "@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=="],
850
840 "@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=="],851 "@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=="],
841 852
842 "@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=="],853 "@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=="],
843 854
855 "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="],
856
844 "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],857 "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
845 858
859 "@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=="],
860
861 "@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=="],
862
846 "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],863 "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
847 864
848 "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],865 "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
@@ -853,10 +870,20 @@ · 4 unmodified lines
853 870
854 "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],871 "@babel/parser": ["@babel/parser@7.29.0", "", { "dependencies": { "@babel/types": "^7.29.0" }, "bin": "./bin/babel-parser.js" }, "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww=="],
855 872
873 "@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=="],
874
875 "@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=="],
876
877 "@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=="],
878
856 "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],879 "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="],
857 880
858 "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],881 "@babel/plugin-transform-react-jsx-source": ["@babel/plugin-transform-react-jsx-source@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw=="],
859 882
883 "@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=="],
884
885 "@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=="],
886
860 "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],887 "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],
861 888
862 "@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=="],889 "@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=="],
@@ -865,6 +892,10 @@ · 2 unmodified lines
865 892
866 "@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=="],893 "@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=="],
867 894
895 "@base-ui/react": ["@base-ui/react@1.3.0", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@base-ui/utils": "0.2.6", "@floating-ui/react-dom": "^2.1.8", "@floating-ui/utils": "^0.2.11", "tabbable": "^6.4.0", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-FwpKqZbPz14AITp1CVgf4AjhKPe1OeeVKSBMdgD10zbFlj3QSWelmtCMLi2+/PFZZcIm3l87G7rwtCZJwHyXWA=="],
896
897 "@base-ui/utils": ["@base-ui/utils@0.2.6", "", { "dependencies": { "@babel/runtime": "^7.28.6", "@floating-ui/utils": "^0.2.11", "reselect": "^5.1.1", "use-sync-external-store": "^1.6.0" }, "peerDependencies": { "@types/react": "^17 || ^18 || ^19", "react": "^17 || ^18 || ^19", "react-dom": "^17 || ^18 || ^19" }, "optionalPeers": ["@types/react"] }, "sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw=="],
898
868 "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="],899 "@changesets/apply-release-plan": ["@changesets/apply-release-plan@7.1.0", "", { "dependencies": { "@changesets/config": "^3.1.3", "@changesets/get-version-range-type": "^0.4.0", "@changesets/git": "^3.0.4", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "detect-indent": "^6.0.0", "fs-extra": "^7.0.1", "lodash.startcase": "^4.4.0", "outdent": "^0.5.0", "prettier": "^2.7.1", "resolve-from": "^5.0.0", "semver": "^7.5.3" } }, "sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ=="],
869 900
870 "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],901 "@changesets/assemble-release-plan": ["@changesets/assemble-release-plan@6.0.9", "", { "dependencies": { "@changesets/errors": "^0.2.0", "@changesets/get-dependents-graph": "^2.1.3", "@changesets/should-skip-package": "^0.1.2", "@changesets/types": "^6.1.0", "@manypkg/get-packages": "^1.1.3", "semver": "^7.5.3" } }, "sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ=="],
@@ -909,6 +940,10 @@ · 38 unmodified lines
909 940
910 "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="],941 "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.4", "", {}, "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw=="],
911 942
943 "@dotenvx/dotenvx": ["@dotenvx/dotenvx@1.59.1", "", { "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-Qg+meC+XFxliuVSDlEPkKnaUjdaJKK6FNx/Wwl2UxhQR8pyPIuLhMavsF7ePdB9qFZUWV1jEK3ckbJir/WmF4w=="],
944
945 "@ecies/ciphers": ["@ecies/ciphers@0.2.5", "", { "peerDependencies": { "@noble/ciphers": "^1.0.0" } }, "sha512-GalEZH4JgOMHYYcYmVqnFirFsjZHeoGMDt9IxEnM9F7GRUUyUksJ7Ou53L83WHJq3RWKD3AcBpo0iQh0oMpf8A=="],
946
912 "@effect-atom/atom": ["@effect-atom/atom@0.5.3", "", { "peerDependencies": { "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.2", "@effect/rpc": "^0.73.0", "effect": "^3.19.15" } }, "sha512-TRZv/i+YT3TtnN0oFORJqXdxSs1fc7lrJlH+1xZvDFyjC9hgoVnrcKbeZsDFmr6r0wYRqVo7U3IftxiQNjpNZA=="],947 "@effect-atom/atom": ["@effect-atom/atom@0.5.3", "", { "peerDependencies": { "@effect/experimental": "^0.58.0", "@effect/platform": "^0.94.2", "@effect/rpc": "^0.73.0", "effect": "^3.19.15" } }, "sha512-TRZv/i+YT3TtnN0oFORJqXdxSs1fc7lrJlH+1xZvDFyjC9hgoVnrcKbeZsDFmr6r0wYRqVo7U3IftxiQNjpNZA=="],
913 948
914 "@effect-atom/atom-react": ["@effect-atom/atom-react@0.5.0", "", { "dependencies": { "@effect-atom/atom": "^0.5.0" }, "peerDependencies": { "effect": "^3.19", "react": ">=18 <20", "scheduler": "*" } }, "sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw=="],949 "@effect-atom/atom-react": ["@effect-atom/atom-react@0.5.0", "", { "dependencies": { "@effect-atom/atom": "^0.5.0" }, "peerDependencies": { "effect": "^3.19", "react": ">=18 <20", "scheduler": "*" } }, "sha512-aFfjWi4rEJCqfM12Oi36/EKaDm/W6n4/N6yM5vL0t/QozKhJhK05rQL/GY4XMxlH2eqkQ4ih8jBQa3Yyp0Fiqw=="],
@@ -1095,6 +1130,14 @@ · 180 unmodified lines
1095 1130
1096 "@executor/web": ["@executor/web@workspace:apps/web"],1131 "@executor/web": ["@executor/web@workspace:apps/web"],
1097 1132
1133 "@floating-ui/core": ["@floating-ui/core@1.7.5", "", { "dependencies": { "@floating-ui/utils": "^0.2.11" } }, "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ=="],
1134
1135 "@floating-ui/dom": ["@floating-ui/dom@1.7.6", "", { "dependencies": { "@floating-ui/core": "^1.7.5", "@floating-ui/utils": "^0.2.11" } }, "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ=="],
1136
1137 "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.8", "", { "dependencies": { "@floating-ui/dom": "^1.7.6" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A=="],
1138
1139 "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="],
1140
1098 "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="],1141 "@grpc/grpc-js": ["@grpc/grpc-js@1.14.3", "", { "dependencies": { "@grpc/proto-loader": "^0.8.0", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA=="],
1099 1142
1100 "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="],1143 "@grpc/proto-loader": ["@grpc/proto-loader@0.8.0", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.5.3", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ=="],
@@ -1103,8 +1146,18 @@ · 2 unmodified lines
1103 1146
1104 "@hono/vite-dev-server": ["@hono/vite-dev-server@0.25.0", "", { "dependencies": { "@hono/node-server": "^1.14.2", "minimatch": "^9.0.3" }, "peerDependencies": { "hono": "*", "miniflare": "*", "wrangler": "*" }, "optionalPeers": ["miniflare", "wrangler"] }, "sha512-4j5rs7yUTOObU2/yCEHeWbf3C8m95SD9lhdUUE6CJ462Emp9vS94yiza2dsA8+ly5pdaIQW0cd4nhNVcwYL5tA=="],1147 "@hono/vite-dev-server": ["@hono/vite-dev-server@0.25.0", "", { "dependencies": { "@hono/node-server": "^1.14.2", "minimatch": "^9.0.3" }, "peerDependencies": { "hono": "*", "miniflare": "*", "wrangler": "*" }, "optionalPeers": ["miniflare", "wrangler"] }, "sha512-4j5rs7yUTOObU2/yCEHeWbf3C8m95SD9lhdUUE6CJ462Emp9vS94yiza2dsA8+ly5pdaIQW0cd4nhNVcwYL5tA=="],
1105 1148
1149 "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="],
1150
1151 "@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=="],
1152
1153 "@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=="],
1154
1106 "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],1155 "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],
1107 1156
1157 "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="],
1158
1159 "@inquirer/type": ["@inquirer/type@3.0.10", "", { "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA=="],
1160
1108 "@jitl/quickjs-ffi-types": ["@jitl/quickjs-ffi-types@0.31.0", "", {}, "sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw=="],1161 "@jitl/quickjs-ffi-types": ["@jitl/quickjs-ffi-types@0.31.0", "", {}, "sha512-1yrgvXlmXH2oNj3eFTrkwacGJbmM0crwipA3ohCrjv52gBeDaD7PsTvFYinlAnqU8iPME3LGP437yk05a2oejw=="],
1109 1162
1110 "@jitl/quickjs-wasmfile-debug-asyncify": ["@jitl/quickjs-wasmfile-debug-asyncify@0.31.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.31.0" } }, "sha512-YkdzQdr1uaftFhgEnTRjTTZHk2SFZdpWO7XhOmRVbi6CEVsH9g5oNF8Ta1q3OuSJHRwwT8YsuR1YzEiEIJEk6w=="],1163 "@jitl/quickjs-wasmfile-debug-asyncify": ["@jitl/quickjs-wasmfile-debug-asyncify@0.31.0", "", { "dependencies": { "@jitl/quickjs-ffi-types": "0.31.0" } }, "sha512-YkdzQdr1uaftFhgEnTRjTTZHk2SFZdpWO7XhOmRVbi6CEVsH9g5oNF8Ta1q3OuSJHRwwT8YsuR1YzEiEIJEk6w=="],
@@ -1147,14 +1200,28 @@ · 36 unmodified lines
1147 1200
1148 "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="],1201 "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="],
1149 1202
1203 "@mswjs/interceptors": ["@mswjs/interceptors@0.41.3", "", { "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-cXu86tF4VQVfwz8W1SPbhoRyHJkti6mjH/XJIxp40jhO4j2k1m4KYrEykxqWPkFF3vrK4rgQppBh//AwyGSXPA=="],
1204
1150 "@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" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],1205 "@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" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="],
1151 1206
1207 "@noble/ciphers": ["@noble/ciphers@1.3.0", "", {}, "sha512-2I0gnIVPtfnMw9ee9h1dJG7tp81+8Ob3OJb3Mv37rx5L40/b0i7djjCVvGOVqc9AEIQyvyu1i6ypKdFw8R8gQw=="],
1208
1209 "@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="],
1210
1211 "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
1212
1152 "@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=="],1213 "@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=="],
1153 1214
1154 "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],1215 "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
1155 1216
1156 "@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=="],1217 "@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=="],
1157 1218
1219 "@open-draft/deferred-promise": ["@open-draft/deferred-promise@2.2.0", "", {}, "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA=="],
1220
1221 "@open-draft/logger": ["@open-draft/logger@0.3.0", "", { "dependencies": { "is-node-process": "^1.2.0", "outvariant": "^1.4.0" } }, "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ=="],
1222
1223 "@open-draft/until": ["@open-draft/until@2.1.0", "", {}, "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg=="],
1224
1158 "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],1225 "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="],
1159 1226
1160 "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],1227 "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.213.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-zRM5/Qj6G84Ej3F1yt33xBVY/3tnMxtL1fiDIxYbDWYaZ/eudVw3/PBiZ8G7JwUxXxjW8gU4g6LnOyfGKYHYgw=="],
@@ -1311,6 +1378,40 @@ · 150 unmodified lines
1311 1378
1312 "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],1379 "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="],
1313 1380
1381 "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="],
1382
1383 "@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=="],
1384
1385 "@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=="],
1386
1387 "@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=="],
1388
1389 "@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=="],
1390
1391 "@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=="],
1392
1393 "@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=="],
1394
1395 "@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=="],
1396
1397 "@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=="],
1398
1399 "@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=="],
1400
1401 "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.4", "", { "dependencies": { "@radix-ui/react-slot": "1.2.4" }, "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-9hQc4+GNVtJAIEPEqlYqW5RiYdrr8ea5XQ0ZOnD6fgru+83kqT15mq2OCcbe8KnjRZl5vF3ks69AKz3kh1jrhg=="],
1402
1403 "@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=="],
1404
1405 "@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=="],
1406
1407 "@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=="],
1408
1409 "@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=="],
1410
1411 "@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=="],
1412
1413 "@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=="],
1414
1314 "@react-grab/cli": ["@react-grab/cli@0.1.26", "", { "dependencies": { "@antfu/ni": "^0.23.0", "commander": "^14.0.0", "ignore": "^7.0.5", "jsonc-parser": "^3.3.1", "ora": "^8.2.0", "picocolors": "^1.1.1", "prompts": "^2.4.2", "smol-toml": "^1.6.0" }, "bin": { "react-grab": "dist/cli.js" } }, "sha512-nNOBdrJ2K7jji6L/X9ARCpU1o/CQ33KYZUtW7vAtrfDM2hyvAIA224ps+Syl97FxhS7pO8b59Bnhc7YLG6h3nA=="],1415 "@react-grab/cli": ["@react-grab/cli@0.1.26", "", { "dependencies": { "@antfu/ni": "^0.23.0", "commander": "^14.0.0", "ignore": "^7.0.5", "jsonc-parser": "^3.3.1", "ora": "^8.2.0", "picocolors": "^1.1.1", "prompts": "^2.4.2", "smol-toml": "^1.6.0" }, "bin": { "react-grab": "dist/cli.js" } }, "sha512-nNOBdrJ2K7jji6L/X9ARCpU1o/CQ33KYZUtW7vAtrfDM2hyvAIA224ps+Syl97FxhS7pO8b59Bnhc7YLG6h3nA=="],
1315 1416
1316 "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="],1417 "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="],
@@ -1365,6 +1466,8 @@ · 48 unmodified lines
1365 1466
1366 "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="],1467 "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.59.0", "", { "os": "win32", "cpu": "x64" }, "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA=="],
1367 1468
1469 "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="],
1470
1368 "@shikijs/core": ["@shikijs/core@4.0.1", "", { "dependencies": { "@shikijs/primitive": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg=="],1471 "@shikijs/core": ["@shikijs/core@4.0.1", "", { "dependencies": { "@shikijs/primitive": "4.0.1", "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" } }, "sha512-vWvqi9JNgz1dRL9Nvog5wtx7RuNkf7MEPl2mU/cyUUxJeH1CAr3t+81h8zO8zs7DK6cKLMoU9TvukWIDjP4Lzg=="],
1369 1472
1370 "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg=="],1473 "@shikijs/engine-javascript": ["@shikijs/engine-javascript@4.0.1", "", { "dependencies": { "@shikijs/types": "4.0.1", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.4" } }, "sha512-DJK9NiwtGYqMuKCRO4Ip0FKNDQpmaiS+K5bFjJ7DWFn4zHueDWgaUG8kAofkrnXF6zPPYYQY7J5FYVW9MbZyBg=="],
@@ -1381,6 +1484,8 @@ · 10 unmodified lines
1381 1484
1382 "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],1485 "@shikijs/vscode-textmate": ["@shikijs/vscode-textmate@10.0.2", "", {}, "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg=="],
1383 1486
1487 "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="],
1488
1384 "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],1489 "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="],
1385 1490
1386 "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],1491 "@tailwindcss/node": ["@tailwindcss/node@4.2.1", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.19.0", "jiti": "^2.6.1", "lightningcss": "1.31.1", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.2.1" } }, "sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg=="],
@@ -1423,6 +1528,8 @@ · 36 unmodified lines
1423 1528
1424 "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="],1529 "@tanstack/store": ["@tanstack/store@0.9.2", "", {}, "sha512-K013lUJEFJK2ofFQ/hZKJUmCnpcV00ebLyOyFOWQvyQHUOZp/iYO84BM6aOGiV81JzwbX0APTVmW8YI7yiG5oA=="],
1425 1530
1531 "@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=="],
1532
1426 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],1533 "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
1427 1534
1428 "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],1535 "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
@@ -1459,10 +1566,14 @@ · 30 unmodified lines
1459 1566
1460 "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],1567 "@types/react-reconciler": ["@types/react-reconciler@0.28.9", "", { "peerDependencies": { "@types/react": "*" } }, "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg=="],
1461 1568
1569 "@types/statuses": ["@types/statuses@2.0.6", "", {}, "sha512-xMAgYwceFhRA2zY+XbEA7mxYbA093wdiW8Vu6gZPGWy9cmOyU9XesH1tNcEWsKFd5Vzrqx5T3D38PWx1FIIXkA=="],
1570
1462 "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="],1571 "@types/tough-cookie": ["@types/tough-cookie@4.0.5", "", {}, "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA=="],
1463 1572
1464 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],1573 "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
1465 1574
1575 "@types/validate-npm-package-name": ["@types/validate-npm-package-name@4.0.2", "", {}, "sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw=="],
1576
1466 "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],1577 "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
1467 1578
1468 "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],1579 "@vercel/oidc": ["@vercel/oidc@3.1.0", "", {}, "sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w=="],
@@ -1501,10 +1612,14 @@ · 32 unmodified lines
1501 1612
1502 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],1613 "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
1503 1614
1615 "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="],
1616
1504 "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],1617 "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="],
1505 1618
1506 "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],1619 "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
1507 1620
1621 "ast-types": ["ast-types@0.16.1", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg=="],
1622
1508 "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],1623 "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
1509 1624
1510 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],1625 "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
@@ -1525,6 +1640,8 @@ · 14 unmodified lines
1525 1640
1526 "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],1641 "bun-types": ["bun-types@1.3.10", "", { "dependencies": { "@types/node": "*" } }, "sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg=="],
1527 1642
1643 "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
1644
1528 "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],1645 "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
1529 1646
1530 "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],1647 "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="],
@@ -1533,6 +1650,8 @@ · 2 unmodified lines
1533 1650
1534 "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],1651 "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
1535 1652
1653 "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
1654
1536 "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="],1655 "caniuse-lite": ["caniuse-lite@1.0.30001777", "", {}, "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ=="],
1537 1656
1538 "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],1657 "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
@@ -1559,10 +1678,16 @@ · 20 unmodified lines
1559 1678
1560 "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],1679 "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
1561 1680
1681 "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
1682
1562 "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=="],1683 "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=="],
1563 1684
1564 "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],1685 "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
1565 1686
1687 "cmdk": ["cmdk@1.1.1", "", { "dependencies": { "@radix-ui/react-compose-refs": "^1.1.1", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-Vsv7kFaXm+ptHDMZ7izaRsP70GgrW9NBNGswt9OZaVBLlE0SNpDq8eu/VGXyF9r7M0azK3Wy7OlYXsuyYLFzHg=="],
1688
1689 "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="],
1690
1566 "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],1691 "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
1567 1692
1568 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],1693 "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
@@ -1585,12 +1710,18 @@ · 16 unmodified lines
1585 1710
1586 "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],1711 "cors": ["cors@2.8.6", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw=="],
1587 1712
1713 "cosmiconfig": ["cosmiconfig@9.0.1", "", { "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-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ=="],
1714
1588 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],1715 "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
1589 1716
1717 "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
1718
1590 "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="],1719 "cssstyle": ["cssstyle@4.6.0", "", { "dependencies": { "@asamuzakjp/css-color": "^3.2.0", "rrweb-cssom": "^0.8.0" } }, "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg=="],
1591 1720
1592 "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],1721 "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
1593 1722
1723 "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
1724
1594 "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="],1725 "data-urls": ["data-urls@5.0.0", "", { "dependencies": { "whatwg-mimetype": "^4.0.0", "whatwg-url": "^14.0.0" } }, "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg=="],
1595 1726
1596 "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],1727 "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
@@ -1599,8 +1730,18 @@ · 2 unmodified lines
1599 1730
1600 "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],1731 "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],
1601 1732
1733 "dedent": ["dedent@1.7.2", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA=="],
1734
1602 "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],1735 "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="],
1603 1736
1737 "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
1738
1739 "default-browser": ["default-browser@5.5.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw=="],
1740
1741 "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
1742
1743 "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
1744
1604 "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],1745 "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
1605 1746
1606 "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],1747 "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
@@ -1609,14 +1750,22 @@ · 2 unmodified lines
1609 1750
1610 "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],1751 "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
1611 1752
1753 "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="],
1754
1612 "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],1755 "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
1613 1756
1757 "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
1758
1614 "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],1759 "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="],
1615 1760
1761 "dotenv": ["dotenv@17.3.1", "", {}, "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA=="],
1762
1616 "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="],1763 "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="],
1617 1764
1618 "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=="],1765 "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=="],
1619 1766
1767 "eciesjs": ["eciesjs@0.4.18", "", { "dependencies": { "@ecies/ciphers": "^0.2.5", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.7", "@noble/hashes": "^1.8.0" } }, "sha512-wG99Zcfcys9fZux7Cft8BAX/YrOJLJSZ3jyYPfhZHqN2E+Ffx+QXBDsv3gubEgPtV6dTzJMSQUwk1H98/t/0wQ=="],
1768
1620 "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],1769 "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
1621 1770
1622 "effect": ["effect@3.19.19", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-Yc8U/SVXo2dHnaP7zNBlAo83h/nzSJpi7vph6Hzyl4ulgMBIgPmz3UzOjb9sBgpFE00gC0iETR244sfXDNLHRg=="],1771 "effect": ["effect@3.19.19", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-Yc8U/SVXo2dHnaP7zNBlAo83h/nzSJpi7vph6Hzyl4ulgMBIgPmz3UzOjb9sBgpFE00gC0iETR244sfXDNLHRg=="],
@@ -1633,6 +1782,10 @@ · 10 unmodified lines
1633 1782
1634 "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],1783 "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
1635 1784
1785 "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
1786
1787 "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
1788
1636 "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],1789 "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
1637 1790
1638 "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],1791 "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
@@ -1661,6 +1814,8 @@ · 22 unmodified lines
1661 1814
1662 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],1815 "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="],
1663 1816
1817 "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=="],
1818
1664 "executor": ["executor@workspace:apps/executor"],1819 "executor": ["executor@workspace:apps/executor"],
1665 1820
1666 "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],1821 "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="],
@@ -1687,6 +1842,10 @@ · 20 unmodified lines
1687 1842
1688 "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],1843 "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
1689 1844
1845 "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
1846
1847 "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="],
1848
1690 "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],1849 "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
1691 1850
1692 "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=="],1851 "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=="],
@@ -1697,6 +1856,8 @@ · 4 unmodified lines
1697 1856
1698 "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="],1857 "formatly": ["formatly@0.3.0", "", { "dependencies": { "fd-package-json": "^2.0.0" }, "bin": { "formatly": "bin/index.mjs" } }, "sha512-9XNj/o4wrRFyhSMJOvsuyMwy8aUfBaZ1VrqHVfohyXf0Sw0e+yfKG+xZaY3arGCOMdwFsqObtzVOc1gU9KiT9w=="],
1699 1858
1859 "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
1860
1700 "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],1861 "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
1701 1862
1702 "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],1863 "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="],
@@ -1707,6 +1868,8 @@ · 4 unmodified lines
1707 1868
1708 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],1869 "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
1709 1870
1871 "fuzzysort": ["fuzzysort@3.1.0", "", {}, "sha512-sR9BNCjBg6LNgwvxlBd0sBABvQitkLzoVY9MYYROQVX/FvfJ4Mai9LsGhDgd8qYdds0bY77VzYd5iuB+v5rwQQ=="],
1872
1710 "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],1873 "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
1711 1874
1712 "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],1875 "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
@@ -1715,8 +1878,14 @@ · 2 unmodified lines
1715 1878
1716 "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=="],1879 "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=="],
1717 1880
1881 "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="],
1882
1883 "get-own-enumerable-keys": ["get-own-enumerable-keys@1.0.0", "", {}, "sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA=="],
1884
1718 "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],1885 "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
1719 1886
1887 "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=="],
1888
1720 "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],1889 "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
1721 1890
1722 "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],1891 "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="],
@@ -1749,6 +1918,8 @@ · 26 unmodified lines
1749 1918
1750 "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],1919 "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
1751 1920
1921 "headers-polyfill": ["headers-polyfill@4.0.3", "", {}, "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ=="],
1922
1752 "hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="],1923 "hono": ["hono@4.12.5", "", {}, "sha512-3qq+FUBtlTHhtYxbxheZgY8NIFnkkC/MR8u5TTsr7YZ3wixryQ3cCwn3iZbg8p8B88iDBBAYSfZDS75t8MN7Vg=="],
1753 1924
1754 "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="],1925 "html-encoding-sniffer": ["html-encoding-sniffer@4.0.0", "", { "dependencies": { "whatwg-encoding": "^3.1.1" } }, "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ=="],
@@ -1765,10 +1936,14 @@ · 10 unmodified lines
1765 1936
1766 "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],1937 "human-id": ["human-id@4.1.3", "", { "bin": { "human-id": "dist/cli.js" } }, "sha512-tsYlhAYpjCKa//8rXZ9DqKEawhPoSytweBC2eNvcaDK+57RZLHGqNs3PZTQO6yekLFSuvA6AlnAfrw1uBvtb+Q=="],
1767 1938
1939 "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="],
1940
1768 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],1941 "iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
1769 1942
1770 "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],1943 "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
1771 1944
1945 "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
1946
1772 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],1947 "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
1773 1948
1774 "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="],1949 "ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="],
@@ -1783,8 +1958,12 @@ · 8 unmodified lines
1783 1958
1784 "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],1959 "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
1785 1960
1961 "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
1962
1786 "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],1963 "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
1787 1964
1965 "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
1966
1788 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],1967 "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
1789 1968
1790 "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],1969 "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
@@ -1793,22 +1972,36 @@ · 2 unmodified lines
1793 1972
1794 "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],1973 "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
1795 1974
1975 "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="],
1976
1977 "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=="],
1978
1796 "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],1979 "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
1797 1980
1981 "is-node-process": ["is-node-process@1.2.0", "", {}, "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw=="],
1982
1798 "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],1983 "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
1799 1984
1985 "is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="],
1986
1800 "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],1987 "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
1801 1988
1802 "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],1989 "is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],
1803 1990
1804 "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],1991 "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="],
1805 1992
1993 "is-regexp": ["is-regexp@3.1.0", "", {}, "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA=="],
1994
1995 "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="],
1996
1806 "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="],1997 "is-subdir": ["is-subdir@1.2.0", "", { "dependencies": { "better-path-resolve": "1.0.0" } }, "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw=="],
1807 1998
1808 "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],1999 "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
1809 2000
1810 "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],2001 "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="],
1811 2002
2003 "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="],
2004
1812 "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="],2005 "isbot": ["isbot@5.1.35", "", {}, "sha512-waFfC72ZNfwLLuJ2iLaoVaqcNo+CAaLR7xCpAn0Y5WfGzkNHv7ZN39Vbi1y+kb+Zs46XHOX3tZNExroFUPX+Kg=="],
1813 2006
1814 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],2007 "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
@@ -1825,6 +2018,8 @@ · 10 unmodified lines
1825 2018
1826 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],2019 "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
1827 2020
2021 "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
2022
1828 "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="],2023 "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="],
1829 2024
1830 "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],2025 "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
@@ -1837,7 +2032,7 @@ · 6 unmodified lines
1837 2032
1838 "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],2033 "jsonfile": ["jsonfile@4.0.0", "", { "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg=="],
1839 2034
1840 "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],2035 "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
1841 2036
1842 "knip": ["knip@5.85.0", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-V2kyON+DZiYdNNdY6GALseiNCwX7dYdpz9Pv85AUn69Gk0UKCts+glOKWfe5KmaMByRjM9q17Mzj/KinTVOyxg=="],2037 "knip": ["knip@5.85.0", "", { "dependencies": { "@nodelib/fs.walk": "^1.2.3", "fast-glob": "^3.3.3", "formatly": "^0.3.0", "jiti": "^2.6.0", "js-yaml": "^4.1.1", "minimist": "^1.2.8", "oxc-resolver": "^11.15.0", "picocolors": "^1.1.1", "picomatch": "^4.0.1", "smol-toml": "^1.5.2", "strip-json-comments": "5.0.3", "zod": "^4.1.11" }, "peerDependencies": { "@types/node": ">=18", "typescript": ">=5.0.4 <7" }, "bin": { "knip": "bin/knip.js", "knip-bun": "bin/knip-bun.js" } }, "sha512-V2kyON+DZiYdNNdY6GALseiNCwX7dYdpz9Pv85AUn69Gk0UKCts+glOKWfe5KmaMByRjM9q17Mzj/KinTVOyxg=="],
1843 2038
@@ -1867,6 +2062,8 @@ · 23 unmodified lines
1867 2062
1868 "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],2063 "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.31.1", "", { "os": "win32", "cpu": "x64" }, "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw=="],
1869 2064
2065 "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
2066
1870 "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],2067 "locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
1871 2068
1872 "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],2069 "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
@@ -1883,6 +2080,8 @@ · 10 unmodified lines
1883 2080
1884 "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],2081 "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
1885 2082
2083 "lucide-react": ["lucide-react@1.7.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-yI7BeItCLZJTXikmK4KNUGCKoGzSvbKlfCvw44bU4fXAL6v3gYS4uHD1jzsLkfwODYwI6Drw5Tu9Z5ulDe0TSg=="],
2084
1886 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],2085 "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
1887 2086
1888 "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],2087 "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
@@ -1925,6 +2124,8 @@ · 36 unmodified lines
1925 2124
1926 "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],2125 "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
1927 2126
2127 "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
2128
1928 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],2129 "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
1929 2130
1930 "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],2131 "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
@@ -1991,6 +2192,8 @@ · 60 unmodified lines
1991 2192
1992 "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],2193 "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="],
1993 2194
2195 "mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
2196
1994 "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],2197 "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
1995 2198
1996 "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],2199 "minimatch": ["minimatch@9.0.9", "", { "dependencies": { "brace-expansion": "^2.0.2" } }, "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg=="],
@@ -2005,38 +2208,54 @@ · 8 unmodified lines
2005 2208
2006 "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="],2209 "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="],
2007 2210
2211 "msw": ["msw@2.12.14", "", { "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-4KXa4nVBIBjbDbd7vfQNuQ25eFxug0aropCQFoI0JdOBuJWamkT1yLVIWReFI8SiTRc+H1hKzaNk+cLk2N9rtQ=="],
2212
2008 "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="],2213 "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="],
2009 2214
2215 "mute-stream": ["mute-stream@2.0.0", "", {}, "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA=="],
2216
2010 "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],2217 "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
2011 2218
2012 "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],2219 "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="],
2013 2220
2014 "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],2221 "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="],
2015 2222
2223 "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
2224
2225 "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=="],
2226
2016 "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],2227 "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="],
2017 2228
2018 "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],2229 "node-releases": ["node-releases@2.0.36", "", {}, "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA=="],
2019 2230
2231 "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="],
2232
2020 "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="],2233 "nwsapi": ["nwsapi@2.2.23", "", {}, "sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ=="],
2021 2234
2022 "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],2235 "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
2023 2236
2024 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],2237 "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
2025 2238
2239 "object-treeify": ["object-treeify@1.1.33", "", {}, "sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A=="],
2240
2026 "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],2241 "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
2027 2242
2028 "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],2243 "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
2029 2244
2030 "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],2245 "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
2031 2246
2032 "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],2247 "oniguruma-parser": ["oniguruma-parser@0.12.1", "", {}, "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w=="],
2033 2248
2034 "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],2249 "oniguruma-to-es": ["oniguruma-to-es@4.3.4", "", { "dependencies": { "oniguruma-parser": "^0.12.1", "regex": "^6.0.1", "regex-recursion": "^6.0.2" } }, "sha512-3VhUGN3w2eYxnTzHn+ikMI+fp/96KoRSVK9/kMTcFqj1NRDh2IhQCKvYxDnWePKRXY/AqH+Fuiyb7VHSzBjHfA=="],
2035 2250
2251 "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=="],
2252
2036 "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=="],2253 "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=="],
2037 2254
2038 "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],2255 "outdent": ["outdent@0.5.0", "", {}, "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q=="],
2039 2256
2257 "outvariant": ["outvariant@1.4.3", "", {}, "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA=="],
2258
2040 "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],2259 "oxc-resolver": ["oxc-resolver@11.19.1", "", { "optionalDependencies": { "@oxc-resolver/binding-android-arm-eabi": "11.19.1", "@oxc-resolver/binding-android-arm64": "11.19.1", "@oxc-resolver/binding-darwin-arm64": "11.19.1", "@oxc-resolver/binding-darwin-x64": "11.19.1", "@oxc-resolver/binding-freebsd-x64": "11.19.1", "@oxc-resolver/binding-linux-arm-gnueabihf": "11.19.1", "@oxc-resolver/binding-linux-arm-musleabihf": "11.19.1", "@oxc-resolver/binding-linux-arm64-gnu": "11.19.1", "@oxc-resolver/binding-linux-arm64-musl": "11.19.1", "@oxc-resolver/binding-linux-ppc64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-gnu": "11.19.1", "@oxc-resolver/binding-linux-riscv64-musl": "11.19.1", "@oxc-resolver/binding-linux-s390x-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-gnu": "11.19.1", "@oxc-resolver/binding-linux-x64-musl": "11.19.1", "@oxc-resolver/binding-openharmony-arm64": "11.19.1", "@oxc-resolver/binding-wasm32-wasi": "11.19.1", "@oxc-resolver/binding-win32-arm64-msvc": "11.19.1", "@oxc-resolver/binding-win32-ia32-msvc": "11.19.1", "@oxc-resolver/binding-win32-x64-msvc": "11.19.1" } }, "sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg=="],
2041 2260
2042 "oxlint": ["oxlint@1.56.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.56.0", "@oxlint/binding-android-arm64": "1.56.0", "@oxlint/binding-darwin-arm64": "1.56.0", "@oxlint/binding-darwin-x64": "1.56.0", "@oxlint/binding-freebsd-x64": "1.56.0", "@oxlint/binding-linux-arm-gnueabihf": "1.56.0", "@oxlint/binding-linux-arm-musleabihf": "1.56.0", "@oxlint/binding-linux-arm64-gnu": "1.56.0", "@oxlint/binding-linux-arm64-musl": "1.56.0", "@oxlint/binding-linux-ppc64-gnu": "1.56.0", "@oxlint/binding-linux-riscv64-gnu": "1.56.0", "@oxlint/binding-linux-riscv64-musl": "1.56.0", "@oxlint/binding-linux-s390x-gnu": "1.56.0", "@oxlint/binding-linux-x64-gnu": "1.56.0", "@oxlint/binding-linux-x64-musl": "1.56.0", "@oxlint/binding-openharmony-arm64": "1.56.0", "@oxlint/binding-win32-arm64-msvc": "1.56.0", "@oxlint/binding-win32-ia32-msvc": "1.56.0", "@oxlint/binding-win32-x64-msvc": "1.56.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.15.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g=="],2261 "oxlint": ["oxlint@1.56.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.56.0", "@oxlint/binding-android-arm64": "1.56.0", "@oxlint/binding-darwin-arm64": "1.56.0", "@oxlint/binding-darwin-x64": "1.56.0", "@oxlint/binding-freebsd-x64": "1.56.0", "@oxlint/binding-linux-arm-gnueabihf": "1.56.0", "@oxlint/binding-linux-arm-musleabihf": "1.56.0", "@oxlint/binding-linux-arm64-gnu": "1.56.0", "@oxlint/binding-linux-arm64-musl": "1.56.0", "@oxlint/binding-linux-ppc64-gnu": "1.56.0", "@oxlint/binding-linux-riscv64-gnu": "1.56.0", "@oxlint/binding-linux-riscv64-musl": "1.56.0", "@oxlint/binding-linux-s390x-gnu": "1.56.0", "@oxlint/binding-linux-x64-gnu": "1.56.0", "@oxlint/binding-linux-x64-musl": "1.56.0", "@oxlint/binding-openharmony-arm64": "1.56.0", "@oxlint/binding-win32-arm64-msvc": "1.56.0", "@oxlint/binding-win32-ia32-msvc": "1.56.0", "@oxlint/binding-win32-x64-msvc": "1.56.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.15.0" }, "optionalPeers": ["oxlint-tsgolint"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g=="],
@@ -2053,17 +2272,25 @@ · 10 unmodified lines
2053 2272
2054 "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],2273 "package-manager-detector": ["package-manager-detector@0.2.11", "", { "dependencies": { "quansync": "^0.2.7" } }, "sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ=="],
2055 2274
2275 "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
2276
2056 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],2277 "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
2057 2278
2279 "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=="],
2280
2281 "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="],
2282
2058 "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],2283 "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
2059 2284
2060 "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],2285 "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
2061 2286
2287 "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
2288
2062 "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],2289 "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
2063 2290
2064 "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],2291 "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
2065 2292
2066 "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],2293 "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
2067 2294
2068 "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],2295 "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
2069 2296
@@ -2081,8 +2308,14 @@ · 11 unmodified lines
2081 2308
2082 "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],2309 "postcss": ["postcss@8.5.8", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg=="],
2083 2310
2311 "postcss-selector-parser": ["postcss-selector-parser@7.1.1", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg=="],
2312
2313 "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="],
2314
2084 "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],2315 "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="],
2085 2316
2317 "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="],
2318
2086 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],2319 "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
2087 2320
2088 "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],2321 "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
@@ -2117,8 +2350,16 @@ · 28 unmodified lines
2117 2350
2118 "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],2351 "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="],
2119 2352
2353 "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=="],
2354
2355 "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=="],
2356
2357 "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=="],
2358
2120 "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="],2359 "read-yaml-file": ["read-yaml-file@1.1.0", "", { "dependencies": { "graceful-fs": "^4.1.5", "js-yaml": "^3.6.1", "pify": "^4.0.1", "strip-bom": "^3.0.0" } }, "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA=="],
2121 2360
2361 "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=="],
2362
2122 "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],2363 "regex": ["regex@6.1.0", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg=="],
2123 2364
2124 "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],2365 "regex-recursion": ["regex-recursion@6.0.2", "", { "dependencies": { "regex-utilities": "^2.3.0" } }, "sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg=="],
@@ -2145,10 +2386,14 @@ · 20 unmodified lines
2145 2386
2146 "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],2387 "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
2147 2388
2389 "reselect": ["reselect@5.1.1", "", {}, "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w=="],
2390
2148 "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],2391 "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
2149 2392
2150 "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],2393 "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
2151 2394
2395 "rettime": ["rettime@0.10.1", "", {}, "sha512-uyDrIlUEH37cinabq0AX4QbgV4HbFZ/gqoiunWQ1UqBtRvTTytwhNYjE++pO/MjPTZL5KQCf2bEoJ/BJNVQ5Kw=="],
2396
2152 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],2397 "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
2153 2398
2154 "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="],2399 "rollup": ["rollup@4.59.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg=="],
@@ -2157,6 +2402,8 @@ · 2 unmodified lines
2157 2402
2158 "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],2403 "rrweb-cssom": ["rrweb-cssom@0.8.0", "", {}, "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw=="],
2159 2404
2405 "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
2406
2160 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],2407 "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
2161 2408
2162 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],2409 "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
@@ -2179,6 +2426,8 @@ · 16 unmodified lines
2179 2426
2180 "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],2427 "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
2181 2428
2429 "shadcn": ["shadcn@4.1.1", "", { "dependencies": { "@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-nBj+7LYC9kzV9v9QmRPpoOhfW4KctJVQejywdAt/K+K+z4RYlJOcO2a4AaF7elrRWkfCbgXeGK02liV0KB9HvQ=="],
2430
2182 "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],2431 "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
2183 2432
2184 "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],2433 "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
@@ -2205,6 +2454,8 @@ · 20 unmodified lines
2205 2454
2206 "solid-js": ["solid-js@1.9.11", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="],2455 "solid-js": ["solid-js@1.9.11", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="],
2207 2456
2457 "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
2458
2208 "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],2459 "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
2209 2460
2210 "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],2461 "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
@@ -2223,14 +2474,20 @@ · 12 unmodified lines
2223 2474
2224 "streamdown": ["streamdown@2.4.0", "", { "dependencies": { "clsx": "^2.1.1", "hast-util-to-jsx-runtime": "^2.3.6", "html-url-attributes": "^3.0.1", "marked": "^17.0.1", "rehype-harden": "^1.1.8", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remend": "1.2.2", "tailwind-merge": "^3.4.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-fRk4HEYNznRLmxoVeT8wsGBwHF6/Yrdey6k+ZrE1Qtp4NyKwm7G/6e2Iw8penY4yLx31TlAHWT5Bsg1weZ9FZg=="],2475 "streamdown": ["streamdown@2.4.0", "", { "dependencies": { "clsx": "^2.1.1", "hast-util-to-jsx-runtime": "^2.3.6", "html-url-attributes": "^3.0.1", "marked": "^17.0.1", "rehype-harden": "^1.1.8", "rehype-raw": "^7.0.0", "rehype-sanitize": "^6.0.0", "remark-gfm": "^4.0.1", "remark-parse": "^11.0.0", "remark-rehype": "^11.1.2", "remend": "1.2.2", "tailwind-merge": "^3.4.0", "unified": "^11.0.5", "unist-util-visit": "^5.0.0", "unist-util-visit-parents": "^6.0.0" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" } }, "sha512-fRk4HEYNznRLmxoVeT8wsGBwHF6/Yrdey6k+ZrE1Qtp4NyKwm7G/6e2Iw8penY4yLx31TlAHWT5Bsg1weZ9FZg=="],
2225 2476
2477 "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="],
2478
2226 "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=="],2479 "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=="],
2227 2480
2228 "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],2481 "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
2229 2482
2483 "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=="],
2484
2230 "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],2485 "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
2231 2486
2232 "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],2487 "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
2233 2488
2489 "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="],
2490
2234 "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="],2491 "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="],
2235 2492
2236 "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="],2493 "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="],
@@ -2241,6 +2498,10 @@ · 4 unmodified lines
2241 2498
2242 "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],2499 "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],
2243 2500
2501 "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="],
2502
2503 "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="],
2504
2244 "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],2505 "tailwind-merge": ["tailwind-merge@3.5.0", "", {}, "sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A=="],
2245 2506
2246 "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],2507 "tailwindcss": ["tailwindcss@4.2.1", "", {}, "sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw=="],
@@ -2283,6 +2544,10 @@ · 36 unmodified lines
2283 2544
2284 "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],2545 "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
2285 2546
2547 "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=="],
2548
2549 "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=="],
2550
2286 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],2551 "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
2287 2552
2288 "turbo": ["turbo@2.8.14", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.14", "turbo-darwin-arm64": "2.8.14", "turbo-linux-64": "2.8.14", "turbo-linux-arm64": "2.8.14", "turbo-windows-64": "2.8.14", "turbo-windows-arm64": "2.8.14" }, "bin": { "turbo": "bin/turbo" } }, "sha512-UCTxeMNYT1cKaHiIFdLCQ7ulI+jw5i5uOnJOrRXsgUD7G3+OjlUjwVd7JfeVt2McWSVGjYA3EVW/v1FSsJ5DtA=="],2553 "turbo": ["turbo@2.8.14", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.14", "turbo-darwin-arm64": "2.8.14", "turbo-linux-64": "2.8.14", "turbo-linux-arm64": "2.8.14", "turbo-windows-64": "2.8.14", "turbo-windows-arm64": "2.8.14" }, "bin": { "turbo": "bin/turbo" } }, "sha512-UCTxeMNYT1cKaHiIFdLCQ7ulI+jw5i5uOnJOrRXsgUD7G3+OjlUjwVd7JfeVt2McWSVGjYA3EVW/v1FSsJ5DtA=="],
@@ -2301,6 +2566,8 @@ · 12 unmodified lines
2301 2566
2302 "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],2567 "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="],
2303 2568
2569 "type-fest": ["type-fest@5.5.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g=="],
2570
2304 "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=="],2571 "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=="],
2305 2572
2306 "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],2573 "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
@@ -2309,6 +2576,8 @@ · 2 unmodified lines
2309 2576
2310 "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],2577 "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="],
2311 2578
2579 "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="],
2580
2312 "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],2581 "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="],
2313 2582
2314 "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],2583 "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
@@ -2325,12 +2594,22 @@ · 10 unmodified lines
2325 2594
2326 "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],2595 "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
2327 2596
2597 "until-async": ["until-async@3.0.2", "", {}, "sha512-IiSk4HlzAMqTUseHHe3VhIGyuFmN90zMTpD3Z3y8jeQbzLIq500MVM7Jq2vUAnTKAFPJrqwkzr6PoTcPhGcOiw=="],
2598
2328 "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=="],2599 "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=="],
2329 2600
2601 "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=="],
2602
2603 "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=="],
2604
2330 "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=="],2605 "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=="],
2331 2606
2607 "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
2608
2332 "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],2609 "uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
2333 2610
2611 "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="],
2612
2334 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],2613 "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
2335 2614
2336 "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],2615 "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
@@ -2351,6 +2630,8 @@ · 14 unmodified lines
2351 2630
2352 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],2631 "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
2353 2632
2633 "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
2634
2354 "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],2635 "webidl-conversions": ["webidl-conversions@7.0.0", "", {}, "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="],
2355 2636
2356 "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="],2637 "whatwg-encoding": ["whatwg-encoding@3.1.1", "", { "dependencies": { "iconv-lite": "0.6.3" } }, "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ=="],
@@ -2363,12 +2644,14 @@ · 6 unmodified lines
2363 2644
2364 "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],2645 "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
2365 2646
2366 "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=="],2647 "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=="],
2367 2648
2368 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],2649 "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
2369 2650
2370 "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],2651 "ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
2371 2652
2653 "wsl-utils": ["wsl-utils@0.3.1", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg=="],
2654
2372 "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],2655 "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
2373 2656
2374 "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],2657 "xmlchars": ["xmlchars@2.2.0", "", {}, "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="],
@@ -2383,6 +2666,10 @@ · 8 unmodified lines
2383 2666
2384 "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],2667 "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
2385 2668
2669 "yoctocolors": ["yoctocolors@2.1.2", "", {}, "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug=="],
2670
2671 "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="],
2672
2386 "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],2673 "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="],
2387 2674
2388 "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],2675 "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
@@ -2397,10 +2684,20 @@ · 8 unmodified lines
2397 2684
2398 "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],2685 "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
2399 2686
2687 "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
2688
2400 "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],2689 "@changesets/apply-release-plan/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
2401 2690
2402 "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],2691 "@changesets/write/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="],
2403 2692
2693 "@dotenvx/dotenvx/commander": ["commander@11.1.0", "", {}, "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ=="],
2694
2695 "@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=="],
2696
2697 "@dotenvx/dotenvx/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
2698
2699 "@dotenvx/dotenvx/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="],
2700
2404 "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],2701 "@manypkg/find-root/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],
2405 2702
2406 "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],2703 "@manypkg/find-root/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
@@ -2409,6 +2706,16 @@ · 2 unmodified lines
2409 2706
2410 "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],2707 "@manypkg/get-packages/fs-extra": ["fs-extra@8.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g=="],
2411 2708
2709 "@radix-ui/react-dialog/@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=="],
2710
2711 "@radix-ui/react-dismissable-layer/@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=="],
2712
2713 "@radix-ui/react-focus-scope/@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=="],
2714
2715 "@radix-ui/react-portal/@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=="],
2716
2717 "@radix-ui/react-primitive/@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.4", "", { "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-Jl+bCv8HxKnlTLVrcDE8zTMJ09R9/ukw4qBs/oZClOfoQk/cOTbDn+NceXfV7j09YPVQUryJPHurafcSg6EVKA=="],
2718
2412 "@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=="],2719 "@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=="],
2413 2720
2414 "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],2721 "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
@@ -2421,20 +2728,42 @@ · 6 unmodified lines
2421 2728
2422 "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],2729 "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
2423 2730
2731 "@ts-morph/common/minimatch": ["minimatch@10.2.4", "", { "dependencies": { "brace-expansion": "^5.0.2" } }, "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg=="],
2732
2424 "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=="],2733 "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=="],
2425 2734
2735 "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=="],
2736
2426 "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],2737 "globby/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
2427 2738
2739 "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
2740
2428 "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],2741 "log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
2429 2742
2430 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],2743 "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
2431 2744
2745 "msw/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
2746
2747 "msw/tough-cookie": ["tough-cookie@6.0.1", "", { "dependencies": { "tldts": "^7.0.5" } }, "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw=="],
2748
2749 "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
2750
2432 "ora/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],2751 "ora/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
2433 2752
2434 "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],2753 "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
2435 2754
2755 "prompts/kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
2756
2436 "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],2757 "read-yaml-file/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
2437 2758
2759 "restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
2760
2761 "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="],
2762
2763 "shadcn/fs-extra": ["fs-extra@11.3.4", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA=="],
2764
2765 "shadcn/zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
2766
2438 "string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],2767 "string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="],
2439 2768
2440 "tough-cookie/tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="],2769 "tough-cookie/tldts": ["tldts@6.1.86", "", { "dependencies": { "tldts-core": "^6.1.86" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ=="],
@@ -2445,12 +2774,32 @@ · 4 unmodified lines
2445 2774
2446 "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=="],2775 "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=="],
2447 2776
2777 "@dotenvx/dotenvx/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
2778
2779 "@dotenvx/dotenvx/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
2780
2781 "@dotenvx/dotenvx/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
2782
2783 "@dotenvx/dotenvx/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
2784
2785 "@dotenvx/dotenvx/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
2786
2787 "@dotenvx/dotenvx/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
2788
2789 "@dotenvx/dotenvx/which/isexe": ["isexe@3.1.5", "", {}, "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w=="],
2790
2791 "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@5.0.5", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ=="],
2792
2448 "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],2793 "cliui/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
2449 2794
2450 "ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],2795 "ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
2451 2796
2452 "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],2797 "read-yaml-file/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
2453 2798
2799 "shadcn/fs-extra/jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
2800
2801 "shadcn/fs-extra/universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
2802
2454 "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],2803 "string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
2455 2804
2456 "tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="],2805 "tough-cookie/tldts/tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="],
@@ -2458,5 +2807,7 @@ · 1 unmodified line
2458 "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],2807 "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
2459 2808
2460 "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],2809 "yargs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
2810
2811 "@ts-morph/common/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
2461 }2812 }
2462}2813}
packages/clients/react/components.json+21−0
@@ -0,0 +1,21 @@
1{
2 "$schema": "https://ui.shadcn.com/schema.json",
3 "style": "base-nova",
4 "rsc": false,
5 "tsx": true,
6 "tailwind": {
7 "config": "",
8 "css": "../../apps/web/src/globals.css",
9 "baseColor": "neutral",
10 "cssVariables": true,
11 "prefix": ""
12 },
13 "iconLibrary": "lucide",
14 "aliases": {
15 "components": "@/components/ui",
16 "utils": "@/lib/utils",
17 "hooks": "@/hooks",
18 "lib": "@/lib",
19 "ui": "@/components/ui"
20 }
21}
packages/clients/react/package.json+8−3
@@ -5,7 +5,10 @@ · 4 unmodified lines
5 "exports": {5 "exports": {
6 ".": "./src/index.ts",6 ".": "./src/index.ts",
7 "./plugins": "./src/plugins/index.ts",7 "./plugins": "./src/plugins/index.ts",
8 "./source-plugins": "./src/source-plugins/index.ts"8 "./source-plugins": "./src/source-plugins/index.ts",
9 "./components/*": "./src/plugins/components/ui/*.tsx",
10 "./lib/*": "./src/plugins/lib/*.ts",
11 "./hooks/*": "./src/hooks/*.ts"
9 },12 },
10 "scripts": {13 "scripts": {
11 "typecheck": "bunx tsc --noEmit -p tsconfig.json",14 "typecheck": "bunx tsc --noEmit -p tsconfig.json",
@@ -13,15 +16,17 @@ · 1 unmodified line
13 "test:watch": "bunx vitest"16 "test:watch": "bunx vitest"
14 },17 },
15 "dependencies": {18 "dependencies": {
16 "@shikijs/langs": "^4.0.1",19 "@base-ui/react": "^1.3.0",
17 "@shikijs/themes": "^4.0.1",
18 "@effect-atom/atom": "0.5.3",20 "@effect-atom/atom": "0.5.3",
19 "@effect-atom/atom-react": "0.5.0",21 "@effect-atom/atom-react": "0.5.0",
20 "@effect/platform": "catalog:",22 "@effect/platform": "catalog:",
21 "@executor/platform-api": "workspace:*",23 "@executor/platform-api": "workspace:*",
22 "@executor/platform-sdk": "workspace:*",24 "@executor/platform-sdk": "workspace:*",
25 "@shikijs/langs": "^4.0.1",
26 "@shikijs/themes": "^4.0.1",
23 "class-variance-authority": "^0.7.1",27 "class-variance-authority": "^0.7.1",
24 "clsx": "^2.1.1",28 "clsx": "^2.1.1",
29 "cmdk": "^1.1.1",
25 "effect": "catalog:",30 "effect": "catalog:",
26 "shiki": "^4.0.1",31 "shiki": "^4.0.1",
27 "streamdown": "^2.3.0",32 "streamdown": "^2.3.0",
packages/clients/react/src/components/secret-reference-field.tsx+35−44
@@ -290,53 +290,33 @@ export function SecretReferenceField(props: SecretReferenceFieldProps) { · 289 unmodified lines
290 <div className="grid gap-2">290 <div className="grid gap-2">
291 <span className="text-xs font-medium text-foreground">{props.label}</span>291 <span className="text-xs font-medium text-foreground">{props.label}</span>
292 292
293 <button293 <input
294 type="button"294 value={showFinder ? finderQuery : (selectedSecret ? (selectedSecret.name ?? selectedSecret.id) : "")}
295 onClick={() => {295 onChange={(event) => {
296 setShowCreate(false);296 setFinderQuery(event.target.value);
297 setShowFinder((current) => !current);297 if (!showFinder) {
298 setShowFinder(true);
299 setShowCreate(false);
300 }
298 }}301 }}
299 className="flex min-h-9 w-full items-center justify-between gap-3 rounded-lg border border-input bg-background px-3 py-2 text-left text-sm text-foreground outline-none transition-colors hover:bg-accent/30 focus:border-ring focus:ring-1 focus:ring-ring/25"302 onFocus={() => {
300 >303 if (!showFinder) {
301 <div className="min-w-0">304 setShowFinder(true);
302 <div className="truncate">305 setShowCreate(false);
303 {selectedSecret306 }
304 ? (selectedSecret.name ?? selectedSecret.id)307 }}
305 : props.emptyLabel}308 onBlur={(event) => {
306 </div>309 // Don't close if clicking inside the results
307 {selectedSecret && (310 if (event.relatedTarget?.closest("[data-secret-results]")) return;
308 <div className="truncate text-[11px] text-muted-foreground">311 setShowFinder(false);
309 {selectedSecret.storeName} · {selectedSecret.storeKind}312 setFinderQuery("");
310 </div>313 }}
311 )}314 placeholder={selectedSecret ? (selectedSecret.name ?? selectedSecret.id) : props.emptyLabel}
312 </div>315 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
313 <div className="shrink-0 text-[11px] font-medium text-muted-foreground">316 />
314 {showFinder ? "Close" : "Choose"}
315 </div>
316 </button>
317
318 <div className="flex flex-wrap items-center gap-2">
319 <button
320 type="button"
321 onClick={() => {
322 setShowFinder(false);
323 setShowCreate((current) => !current);
324 }}
325 className={buttonClassName}
326 >
327 {showCreate ? "Hide create" : "Create new secret"}
328 </button>
329 </div>
330 317
331 {showFinder && (318 {showFinder && (
332 <div className="space-y-3 border-l-2 border-border pl-4">319 <div className="space-y-3" data-secret-results>
333 <input
334 value={finderQuery}
335 onChange={(event) => setFinderQuery(event.target.value)}
336 placeholder="Search all secrets"
337 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
338 autoFocus
339 />
340 320
341 {finderError && (321 {finderError && (
342 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-3 py-2 text-xs text-destructive">322 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-3 py-2 text-xs text-destructive">
@@ -345,6 +325,17 @@ export function SecretReferenceField(props: SecretReferenceFieldProps) { · 2 unmodified lines
345 )}325 )}
346 326
347 <div className="max-h-64 space-y-2 overflow-y-auto pr-1">327 <div className="max-h-64 space-y-2 overflow-y-auto pr-1">
328 <button
329 type="button"
330 onClick={() => {
331 setShowFinder(false);
332 setShowCreate(true);
333 }}
334 className="flex w-full items-start justify-between gap-3 rounded-lg border border-input bg-background px-3 py-2 text-left transition-colors hover:bg-accent/40"
335 >
336 <span className="text-sm text-foreground">Create new secret</span>
337 </button>
338
348 {finderStatus === "pending" && (339 {finderStatus === "pending" && (
349 <div className="rounded-lg border border-border px-3 py-2 text-xs text-muted-foreground">340 <div className="rounded-lg border border-border px-3 py-2 text-xs text-muted-foreground">
350 Loading secrets...341 Loading secrets...
packages/clients/react/src/plugins/components/badge.tsx+0−44
@@ -1,44 +0,0 @@
1import type { HTMLAttributes } from "react";
2import { cva, type VariantProps } from "class-variance-authority";
3
4import { cn } from "../lib/cn";
5
6const badgeVariants = cva(
7 "inline-flex items-center rounded-full border px-2 py-0.5 text-[10px] font-medium tracking-wide uppercase",
8 {
9 variants: {
10 variant: {
11 default: "border-transparent bg-primary/15 text-primary",
12 secondary: "border-transparent bg-secondary text-secondary-foreground",
13 outline: "border-border text-muted-foreground",
14 muted: "border-transparent bg-muted text-muted-foreground",
15 get: "border-[var(--method-get)]/20 bg-[var(--method-get)]/10 text-[var(--method-get)]",
16 post: "border-[var(--method-post)]/20 bg-[var(--method-post)]/10 text-[var(--method-post)]",
17 put: "border-[var(--method-put)]/20 bg-[var(--method-put)]/10 text-[var(--method-put)]",
18 delete: "border-[var(--method-delete)]/20 bg-[var(--method-delete)]/10 text-[var(--method-delete)]",
19 destructive: "border-destructive/20 bg-destructive/10 text-destructive",
20 },
21 },
22 defaultVariants: {
23 variant: "default",
24 },
25 },
26);
27
28export type BadgeProps = HTMLAttributes<HTMLSpanElement> & VariantProps<typeof badgeVariants>;
29
30export function Badge({ className, variant, ...props }: BadgeProps) {
31 return <span className={cn(badgeVariants({ variant }), className)} {...props} />;
32}
33
34export function MethodBadge({ method }: { method: string }) {
35 const variant = ({
36 GET: "get",
37 POST: "post",
38 PUT: "put",
39 PATCH: "put",
40 DELETE: "delete",
41 } as const)[method.toUpperCase()] ?? "outline";
42
43 return <Badge variant={variant}>{method}</Badge>;
44}
packages/clients/react/src/plugins/components/code-block.tsx+6−3
@@ -2,6 +2,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; · 1 unmodified line
2 2
3import { codeToHtml, resolveLang } from "../lib/shiki";3import { codeToHtml, resolveLang } from "../lib/shiki";
4import { cn } from "../lib/cn";4import { cn } from "../lib/cn";
5import { Button } from "./ui/button";
5import { IconCheck, IconCopy } from "./icons";6import { IconCheck, IconCopy } from "./icons";
6 7
7const highlightCache = new Map<string, string>();8const highlightCache = new Map<string, string>();
@@ -80,14 +81,16 @@ export function CodeBlock(props: { · 72 unmodified lines
80 81
81 return (82 return (
82 <div className={cn("group relative overflow-auto", className)}>83 <div className={cn("group relative overflow-auto", className)}>
83 <button84 <Button
84 type="button"85 type="button"
86 variant="outline"
87 size="icon"
85 onClick={handleCopy}88 onClick={handleCopy}
86 className="absolute right-2 top-2 z-10 rounded-md border border-border bg-card/90 p-1.5 text-muted-foreground/40 opacity-0 backdrop-blur-sm transition-all hover:text-foreground group-hover:opacity-100"89 className="absolute right-2 top-2 z-10 bg-card/90 p-1.5 text-muted-foreground/40 opacity-0 backdrop-blur-sm hover:text-foreground group-hover:opacity-100"
87 title="Copy to clipboard"90 title="Copy to clipboard"
88 >91 >
89 {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />}92 {copied ? <IconCheck className="size-3" /> : <IconCopy className="size-3" />}
90 </button>93 </Button>
91 94
92 {html ? (95 {html ? (
93 <div96 <div
packages/clients/react/src/plugins/components/source-tool-explorer.tsx+1−1
@@ -7,7 +7,7 @@ import { · 6 unmodified lines
7 useSourceInspection,7 useSourceInspection,
8 useSourceToolDetail,8 useSourceToolDetail,
9} from "../../hooks/sources";9} from "../../hooks/sources";
10import { Badge } from "./badge";10import { Badge } from "./ui/badge";
11import { LoadableBlock } from "./loadable";11import { LoadableBlock } from "./loadable";
12import {12import {
13 SourceToolModelWorkbench,13 SourceToolModelWorkbench,
packages/clients/react/src/plugins/components/source-tool-workbench.tsx+37−29
@@ -8,7 +8,7 @@ import type { · 7 unmodified lines
8 SourceInspection,8 SourceInspection,
9 SourceInspectionToolDetail,9 SourceInspectionToolDetail,
10} from "@executor/platform-sdk/schema";10} from "@executor/platform-sdk/schema";
11import { MethodBadge } from "./badge";11import { MethodBadge } from "./ui/badge";
12import { CodeBlock } from "./code-block";12import { CodeBlock } from "./code-block";
13import { DocumentPanel } from "./document-panel";13import { DocumentPanel } from "./document-panel";
14import { EmptyState, LoadableBlock } from "./loadable";14import { EmptyState, LoadableBlock } from "./loadable";
@@ -22,6 +22,8 @@ import { · 7 unmodified lines
22 IconSearch,22 IconSearch,
23 IconTool,23 IconTool,
24} from "./icons";24} from "./icons";
25import { Button } from "./ui/button";
26import { Input } from "./ui/input";
25import { cn } from "../lib/cn";27import { cn } from "../lib/cn";
26 28
27type ToolTreeNode = {29type ToolTreeNode = {
@@ -173,16 +175,18 @@ const CopyButton = (props: { · 145 unmodified lines
173 copiedField: string | null;175 copiedField: string | null;
174 onCopy: (text: string, field: string) => void | Promise<void>;176 onCopy: (text: string, field: string) => void | Promise<void>;
175}) => (177}) => (
176 <button178 <Button
177 type="button"179 type="button"
180 variant="ghost"
181 size="icon"
178 onClick={() => {182 onClick={() => {
179 void props.onCopy(props.text, props.field);183 void props.onCopy(props.text, props.field);
180 }}184 }}
181 className="shrink-0 rounded p-1 text-muted-foreground/30 transition-colors hover:text-muted-foreground"185 className="size-6 shrink-0 text-muted-foreground/30 hover:text-muted-foreground"
182 title={`Copy ${props.field}`}186 title={`Copy ${props.field}`}
183 >187 >
184 {props.copiedField === props.field ? <IconCheck /> : <IconCopy />}188 {props.copiedField === props.field ? <IconCheck /> : <IconCopy />}
185 </button>189 </Button>
186);190);
187 191
188const SourceToolTree = (props: {192const SourceToolTree = (props: {
@@ -295,17 +299,19 @@ const SourceToolTreeNodeView = (props: { · 106 unmodified lines
295 <div>299 <div>
296 {node.tool ? (300 {node.tool ? (
297 <div className="flex items-center">301 <div className="flex items-center">
298 <button302 <Button
299 type="button"303 type="button"
304 variant="ghost"
305 size="icon"
300 onClick={() => setOpen((value) => !value)}306 onClick={() => setOpen((value) => !value)}
301 className="shrink-0 rounded p-0.5 text-muted-foreground/30 hover:text-muted-foreground"307 className="shrink-0 size-auto rounded p-0.5 text-muted-foreground/30 hover:text-muted-foreground"
302 style={{ marginLeft: paddingLeft }}308 style={{ marginLeft: paddingLeft }}
303 >309 >
304 <IconChevron310 <IconChevron
305 className={cn("shrink-0 transition-transform duration-150", open && "rotate-90")}311 className={cn("shrink-0 transition-transform duration-150", open && "rotate-90")}
306 style={{ width: 8, height: 8 }}312 style={{ width: 8, height: 8 }}
307 />313 />
308 </button>314 </Button>
309 <SourceToolListItem315 <SourceToolListItem
310 tool={node.tool as SourceInspection["tools"][number]}316 tool={node.tool as SourceInspection["tools"][number]}
311 active={node.tool?.path === selectedToolPath}317 active={node.tool?.path === selectedToolPath}
@@ -318,11 +324,12 @@ const SourceToolTreeNodeView = (props: { · 6 unmodified lines
318 />324 />
319 </div>325 </div>
320 ) : (326 ) : (
321 <button327 <Button
322 type="button"328 type="button"
329 variant="ghost"
323 onClick={() => setOpen((value) => !value)}330 onClick={() => setOpen((value) => !value)}
324 className={cn(331 className={cn(
325 "group flex w-full items-center gap-1.5 rounded-md py-1 pr-2.5 text-[12px] transition-colors hover:bg-accent/40",332 "group flex h-auto w-full items-center gap-1.5 rounded-md py-1 pr-2.5 text-[12px] hover:bg-accent/40",
326 open ? "text-foreground/80" : "text-muted-foreground/60",333 open ? "text-foreground/80" : "text-muted-foreground/60",
327 )}334 )}
328 style={{ paddingLeft }}335 style={{ paddingLeft }}
@@ -344,7 +351,7 @@ const SourceToolTreeNodeView = (props: { · 15 unmodified lines
344 <span className="shrink-0 tabular-nums text-[10px] text-muted-foreground/25">351 <span className="shrink-0 tabular-nums text-[10px] text-muted-foreground/25">
345 {leafCount}352 {leafCount}
346 </span>353 </span>
347 </button>354 </Button>
348 )}355 )}
349 356
350 {open && hasChildren && (357 {open && hasChildren && (
@@ -397,15 +404,16 @@ const SourceToolListItem = (props: { · 46 unmodified lines
397 : props.tool.path;404 : props.tool.path;
398 405
399 return (406 return (
400 <button407 <Button
401 ref={ref}408 ref={ref}
402 type="button"409 type="button"
410 variant="ghost"
403 onMouseEnter={() => {411 onMouseEnter={() => {
404 props.prefetch(props.sourceId, props.tool.path);412 props.prefetch(props.sourceId, props.tool.path);
405 }}413 }}
406 onClick={props.onSelect}414 onClick={props.onSelect}
407 className={cn(415 className={cn(
408 "group flex w-full items-center gap-2 rounded-md py-1.5 pr-2.5 text-left transition-colors",416 "group flex h-auto w-full items-center gap-2 rounded-md py-1.5 pr-2.5 text-left",
409 props.active417 props.active
410 ? "border-l-2 border-l-primary bg-primary/10 text-foreground"418 ? "border-l-2 border-l-primary bg-primary/10 text-foreground"
411 : "text-foreground/70 hover:bg-accent/50 hover:text-foreground",419 : "text-foreground/70 hover:bg-accent/50 hover:text-foreground",
@@ -418,7 +426,7 @@ const SourceToolListItem = (props: { · 6 unmodified lines
418 {highlightMatch(label, props.search)}426 {highlightMatch(label, props.search)}
419 </span>427 </span>
420 {props.tool.method && <MethodBadge method={props.tool.method} />}428 {props.tool.method && <MethodBadge method={props.tool.method} />}
421 </button>429 </Button>
422 );430 );
423};431};
424 432
@@ -599,21 +607,23 @@ export const SourceToolModelWorkbench = ( · 174 unmodified lines
599 <div className="shrink-0 border-b border-border px-3 py-2">607 <div className="shrink-0 border-b border-border px-3 py-2">
600 <div className="flex h-8 items-center gap-2 rounded-md border border-input bg-background px-2.5">608 <div className="flex h-8 items-center gap-2 rounded-md border border-input bg-background px-2.5">
601 <IconSearch className="size-3.5 shrink-0 text-muted-foreground/40" />609 <IconSearch className="size-3.5 shrink-0 text-muted-foreground/40" />
602 <input610 <Input
603 ref={searchRef}611 ref={searchRef}
604 value={search}612 value={search}
605 onChange={(event) => setSearch(event.target.value)}613 onChange={(event) => setSearch(event.target.value)}
606 placeholder={`Filter ${props.bundle.toolCount} tools...`}614 placeholder={`Filter ${props.bundle.toolCount} tools...`}
607 className="min-w-0 flex-1 bg-transparent text-[13px] outline-none placeholder:text-muted-foreground/40"615 className="min-w-0 flex-1 border-0 bg-transparent p-0 text-[13px] shadow-none ring-0 focus:border-0 focus:ring-0"
608 />616 />
609 {search.length > 0 ? (617 {search.length > 0 ? (
610 <button618 <Button
611 type="button"619 type="button"
620 variant="ghost"
621 size="icon"
612 onClick={() => setSearch("")}622 onClick={() => setSearch("")}
613 className="shrink-0 rounded p-0.5 text-muted-foreground/40 hover:text-foreground"623 className="size-5 shrink-0 text-muted-foreground/40 hover:text-foreground"
614 >624 >
615 <IconClose />625 <IconClose />
616 </button>626 </Button>
617 ) : (627 ) : (
618 <kbd className="shrink-0 rounded border border-border bg-muted px-1 py-px text-[10px] leading-none text-muted-foreground/50">628 <kbd className="shrink-0 rounded border border-border bg-muted px-1 py-px text-[10px] leading-none text-muted-foreground/50">
619 /629 /
@@ -622,7 +632,7 @@ export const SourceToolModelWorkbench = ( · 2 unmodified lines
622 </div>632 </div>
623 </div>633 </div>
624 634
625 <div className="flex-1 overflow-y-auto max-w-[300px]">635 <div className="flex-1 overflow-y-auto">
626 {filteredTools.length === 0 ? (636 {filteredTools.length === 0 ? (
627 <div className="p-4 text-center text-[13px] text-muted-foreground/50">637 <div className="p-4 text-center text-[13px] text-muted-foreground/50">
628 {terms.length > 0 ? "No tools match your filter" : "No tools available"}638 {terms.length > 0 ? "No tools match your filter" : "No tools available"}
@@ -687,19 +697,16 @@ export const SourceToolDiscoveryPanel = < · 58 unmodified lines
687 >697 >
688 <div className="relative flex-1">698 <div className="relative flex-1">
689 <IconSearch className="absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground/40" />699 <IconSearch className="absolute left-3 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground/40" />
690 <input700 <Input
691 value={draftQuery}701 value={draftQuery}
692 onChange={(event) => setDraftQuery(event.target.value)}702 onChange={(event) => setDraftQuery(event.target.value)}
693 placeholder="Search tools..."703 placeholder="Search tools..."
694 className="h-9 w-full rounded-md border border-input bg-background pl-9 pr-3 text-sm outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/30"704 className="pl-9 pr-3 text-sm"
695 />705 />
696 </div>706 </div>
697 <button707 <Button type="submit" variant="outline">
698 type="submit"
699 className="inline-flex h-9 items-center rounded-md border border-input bg-card px-3 text-xs font-medium text-foreground transition-colors hover:bg-accent/50"
700 >
701 Search708 Search
702 </button>709 </Button>
703 </form>710 </form>
704 </div>711 </div>
705 712
@@ -719,11 +726,12 @@ export const SourceToolDiscoveryPanel = < · 13 unmodified lines
719 ) : (726 ) : (
720 <div className="max-w-3xl space-y-2">727 <div className="max-w-3xl space-y-2">
721 {result.results.map((item, index) => (728 {result.results.map((item, index) => (
722 <button729 <Button
723 key={item.path}730 key={item.path}
724 type="button"731 type="button"
732 variant="outline"
725 onClick={() => props.onOpenTool(item.path)}733 onClick={() => props.onOpenTool(item.path)}
726 className="group w-full rounded-lg border border-border bg-card/60 p-3.5 text-left transition-all hover:border-primary/30 hover:shadow-sm"734 className="group h-auto w-full rounded-lg bg-card/60 p-3.5 text-left hover:border-primary/30 hover:shadow-sm"
727 >735 >
728 <div className="mb-1.5 flex items-center justify-between gap-3">736 <div className="mb-1.5 flex items-center justify-between gap-3">
729 <div className="flex min-w-0 items-center gap-2.5">737 <div className="flex min-w-0 items-center gap-2.5">
@@ -743,7 +751,7 @@ export const SourceToolDiscoveryPanel = < · 13 unmodified lines
743 {item.description}751 {item.description}
744 </p>752 </p>
745 )}753 )}
746 </button>754 </Button>
747 ))}755 ))}
748 </div>756 </div>
749 )757 )
packages/clients/react/src/plugins/components/ui/alert.tsx+80−0
@@ -0,0 +1,80 @@
1import * as React from "react";
2import { cva, type VariantProps } from "class-variance-authority";
3
4import { cn } from "../../lib/cn";
5
6const alertVariants = cva(
7 "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4",
8 {
9 variants: {
10 variant: {
11 default: "bg-card text-card-foreground",
12 destructive:
13 "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current",
14 warning:
15 "border-amber-500/25 bg-amber-500/8 text-amber-700 dark:text-amber-400",
16 success:
17 "border-primary/25 bg-primary/8 text-primary",
18 },
19 },
20 defaultVariants: {
21 variant: "default",
22 },
23 },
24);
25
26function Alert({
27 className,
28 variant,
29 ...props
30}: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>) {
31 return (
32 <div
33 data-slot="alert"
34 role="alert"
35 className={cn(alertVariants({ variant }), className)}
36 {...props}
37 />
38 );
39}
40
41function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
42 return (
43 <div
44 data-slot="alert-title"
45 className={cn(
46 "font-heading font-medium group-has-[>svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground",
47 className,
48 )}
49 {...props}
50 />
51 );
52}
53
54function AlertDescription({
55 className,
56 ...props
57}: React.ComponentProps<"div">) {
58 return (
59 <div
60 data-slot="alert-description"
61 className={cn(
62 "text-sm text-balance text-muted-foreground md:text-pretty [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground [&_p:not(:last-child)]:mb-4",
63 className,
64 )}
65 {...props}
66 />
67 );
68}
69
70function AlertAction({ className, ...props }: React.ComponentProps<"div">) {
71 return (
72 <div
73 data-slot="alert-action"
74 className={cn("absolute top-2 right-2", className)}
75 {...props}
76 />
77 );
78}
79
80export { Alert, alertVariants, AlertTitle, AlertDescription, AlertAction };
packages/clients/react/src/plugins/components/ui/badge.tsx+57−0
@@ -0,0 +1,57 @@
1import { cva, type VariantProps } from "class-variance-authority";
2
3import { cn } from "../../lib/cn";
4
5const badgeVariants = cva(
6 "inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all [&>svg]:pointer-events-none [&>svg]:size-3!",
7 {
8 variants: {
9 variant: {
10 default: "bg-primary text-primary-foreground",
11 secondary: "bg-secondary text-secondary-foreground",
12 destructive:
13 "bg-destructive/10 text-destructive dark:bg-destructive/20",
14 outline: "border-border text-foreground",
15 muted: "bg-muted text-muted-foreground",
16 get: "border-[var(--method-get)]/20 bg-[var(--method-get)]/10 text-[var(--method-get)]",
17 post: "border-[var(--method-post)]/20 bg-[var(--method-post)]/10 text-[var(--method-post)]",
18 put: "border-[var(--method-put)]/20 bg-[var(--method-put)]/10 text-[var(--method-put)]",
19 delete:
20 "border-[var(--method-delete)]/20 bg-[var(--method-delete)]/10 text-[var(--method-delete)]",
21 },
22 },
23 defaultVariants: {
24 variant: "default",
25 },
26 },
27);
28
29export type BadgeProps = React.ComponentProps<"span"> &
30 VariantProps<typeof badgeVariants>;
31
32function Badge({ className, variant, ...props }: BadgeProps) {
33 return (
34 <span
35 data-slot="badge"
36 className={cn(badgeVariants({ variant }), className)}
37 {...props}
38 />
39 );
40}
41
42function MethodBadge({ method }: { method: string }) {
43 const variant =
44 (
45 {
46 GET: "get",
47 POST: "post",
48 PUT: "put",
49 PATCH: "put",
50 DELETE: "delete",
51 } as const
52 )[method.toUpperCase()] ?? "outline";
53
54 return <Badge variant={variant}>{method}</Badge>;
55}
56
57export { Badge, badgeVariants, MethodBadge };
packages/clients/react/src/plugins/components/ui/button.tsx+63−0
@@ -0,0 +1,63 @@
1import { Button as ButtonPrimitive } from "@base-ui/react/button";
2import { cva, type VariantProps } from "class-variance-authority";
3
4import { cn } from "../../lib/cn";
5
6const buttonVariants = cva(
7 "group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
8 {
9 variants: {
10 variant: {
11 default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
12 outline:
13 "border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
14 secondary:
15 "bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
16 ghost:
17 "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
18 destructive:
19 "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
20 "destructive-outline":
21 "border-destructive/25 bg-destructive/5 text-destructive hover:bg-destructive/10",
22 link: "text-primary underline-offset-4 hover:underline",
23 },
24 size: {
25 default:
26 "h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
27 xs: "h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",
28 sm: "h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",
29 lg: "h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
30 icon: "size-8",
31 "icon-xs":
32 "size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3",
33 "icon-sm":
34 "size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg",
35 "icon-lg": "size-9",
36 },
37 },
38 defaultVariants: {
39 variant: "default",
40 size: "default",
41 },
42 },
43);
44
45export type ButtonProps = ButtonPrimitive.Props &
46 VariantProps<typeof buttonVariants>;
47
48function Button({
49 className,
50 variant = "default",
51 size = "default",
52 ...props
53}: ButtonProps) {
54 return (
55 <ButtonPrimitive
56 data-slot="button"
57 className={cn(buttonVariants({ variant, size, className }))}
58 {...props}
59 />
60 );
61}
62
63export { Button, buttonVariants };
packages/clients/react/src/plugins/components/ui/card.tsx+103−0
@@ -0,0 +1,103 @@
1import * as React from "react";
2
3import { cn } from "../../lib/cn";
4
5function Card({
6 className,
7 size = "default",
8 ...props
9}: React.ComponentProps<"div"> & { size?: "default" | "sm" }) {
10 return (
11 <div
12 data-slot="card"
13 data-size={size}
14 className={cn(
15 "group/card flex flex-col gap-4 overflow-hidden rounded-xl bg-card py-4 text-sm text-card-foreground ring-1 ring-foreground/10 has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:gap-3 data-[size=sm]:py-3 data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
16 className,
17 )}
18 {...props}
19 />
20 );
21}
22
23function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
24 return (
25 <div
26 data-slot="card-header"
27 className={cn(
28 "group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-t-xl px-4 group-data-[size=sm]/card:px-3 has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-4 group-data-[size=sm]/card:[.border-b]:pb-3",
29 className,
30 )}
31 {...props}
32 />
33 );
34}
35
36function CardTitle({ className, ...props }: React.ComponentProps<"div">) {
37 return (
38 <div
39 data-slot="card-title"
40 className={cn(
41 "font-heading text-base leading-snug font-medium group-data-[size=sm]/card:text-sm",
42 className,
43 )}
44 {...props}
45 />
46 );
47}
48
49function CardDescription({ className, ...props }: React.ComponentProps<"div">) {
50 return (
51 <div
52 data-slot="card-description"
53 className={cn("text-sm text-muted-foreground", className)}
54 {...props}
55 />
56 );
57}
58
59function CardAction({ className, ...props }: React.ComponentProps<"div">) {
60 return (
61 <div
62 data-slot="card-action"
63 className={cn(
64 "col-start-2 row-span-2 row-start-1 self-start justify-self-end",
65 className,
66 )}
67 {...props}
68 />
69 );
70}
71
72function CardContent({ className, ...props }: React.ComponentProps<"div">) {
73 return (
74 <div
75 data-slot="card-content"
76 className={cn("px-4 group-data-[size=sm]/card:px-3", className)}
77 {...props}
78 />
79 );
80}
81
82function CardFooter({ className, ...props }: React.ComponentProps<"div">) {
83 return (
84 <div
85 data-slot="card-footer"
86 className={cn(
87 "flex items-center rounded-b-xl border-t bg-muted/50 p-4 group-data-[size=sm]/card:p-3",
88 className,
89 )}
90 {...props}
91 />
92 );
93}
94
95export {
96 Card,
97 CardHeader,
98 CardFooter,
99 CardTitle,
100 CardAction,
101 CardDescription,
102 CardContent,
103};
packages/clients/react/src/plugins/components/ui/command.tsx+144−0
@@ -0,0 +1,144 @@
1import * as React from "react";
2import { Command as CommandPrimitive } from "cmdk";
3
4import { cn } from "../../lib/cn";
5import { IconSearch } from "../icons";
6
7function Command({
8 className,
9 ...props
10}: React.ComponentProps<typeof CommandPrimitive>) {
11 return (
12 <CommandPrimitive
13 data-slot="command"
14 className={cn(
15 "flex size-full flex-col overflow-hidden rounded-xl bg-popover p-1 text-popover-foreground",
16 className,
17 )}
18 {...props}
19 />
20 );
21}
22
23function CommandInput({
24 className,
25 ...props
26}: React.ComponentProps<typeof CommandPrimitive.Input>) {
27 return (
28 <div
29 data-slot="command-input-wrapper"
30 className="flex items-center gap-2 border-b border-border px-2.5 pb-2"
31 >
32 <IconSearch className="size-3.5 shrink-0 opacity-50" />
33 <CommandPrimitive.Input
34 data-slot="command-input"
35 className={cn(
36 "w-full bg-transparent text-sm outline-hidden placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
37 className,
38 )}
39 {...props}
40 />
41 </div>
42 );
43}
44
45function CommandList({
46 className,
47 ...props
48}: React.ComponentProps<typeof CommandPrimitive.List>) {
49 return (
50 <CommandPrimitive.List
51 data-slot="command-list"
52 className={cn(
53 "no-scrollbar max-h-72 scroll-py-1 overflow-x-hidden overflow-y-auto outline-none",
54 className,
55 )}
56 {...props}
57 />
58 );
59}
60
61function CommandEmpty({
62 className,
63 ...props
64}: React.ComponentProps<typeof CommandPrimitive.Empty>) {
65 return (
66 <CommandPrimitive.Empty
67 data-slot="command-empty"
68 className={cn("py-6 text-center text-sm", className)}
69 {...props}
70 />
71 );
72}
73
74function CommandGroup({
75 className,
76 ...props
77}: React.ComponentProps<typeof CommandPrimitive.Group>) {
78 return (
79 <CommandPrimitive.Group
80 data-slot="command-group"
81 className={cn(
82 "overflow-hidden p-1 text-foreground **:[[cmdk-group-heading]]:px-2 **:[[cmdk-group-heading]]:py-1.5 **:[[cmdk-group-heading]]:text-xs **:[[cmdk-group-heading]]:font-medium **:[[cmdk-group-heading]]:text-muted-foreground",
83 className,
84 )}
85 {...props}
86 />
87 );
88}
89
90function CommandSeparator({
91 className,
92 ...props
93}: React.ComponentProps<typeof CommandPrimitive.Separator>) {
94 return (
95 <CommandPrimitive.Separator
96 data-slot="command-separator"
97 className={cn("-mx-1 h-px bg-border", className)}
98 {...props}
99 />
100 );
101}
102
103function CommandItem({
104 className,
105 ...props
106}: React.ComponentProps<typeof CommandPrimitive.Item>) {
107 return (
108 <CommandPrimitive.Item
109 data-slot="command-item"
110 className={cn(
111 "group/command-item relative flex cursor-default items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-hidden select-none data-[disabled=true]:pointer-events-none data-[disabled=true]:opacity-50 data-selected:bg-muted data-selected:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
112 className,
113 )}
114 {...props}
115 />
116 );
117}
118
119function CommandShortcut({
120 className,
121 ...props
122}: React.ComponentProps<"span">) {
123 return (
124 <span
125 data-slot="command-shortcut"
126 className={cn(
127 "ml-auto text-xs tracking-widest text-muted-foreground group-data-selected/command-item:text-foreground",
128 className,
129 )}
130 {...props}
131 />
132 );
133}
134
135export {
136 Command,
137 CommandInput,
138 CommandList,
139 CommandEmpty,
140 CommandGroup,
141 CommandItem,
142 CommandShortcut,
143 CommandSeparator,
144};
packages/clients/react/src/plugins/components/ui/dialog.tsx+159−0
@@ -0,0 +1,159 @@
1"use client"
2
3import * as React from "react"
4import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
5
6import { cn } from "../../lib/cn"
7import { Button } from "./button"
8import { IconClose } from "../icons"
9
10function Dialog({ ...props }: DialogPrimitive.Root.Props) {
11 return <DialogPrimitive.Root data-slot="dialog" {...props} />
12}
13
14function DialogTrigger({ ...props }: DialogPrimitive.Trigger.Props) {
15 return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />
16}
17
18function DialogPortal({ ...props }: DialogPrimitive.Portal.Props) {
19 return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />
20}
21
22function DialogClose({ ...props }: DialogPrimitive.Close.Props) {
23 return <DialogPrimitive.Close data-slot="dialog-close" {...props} />
24}
25
26function DialogOverlay({
27 className,
28 ...props
29}: DialogPrimitive.Backdrop.Props) {
30 return (
31 <DialogPrimitive.Backdrop
32 data-slot="dialog-overlay"
33 className={cn(
34 "fixed inset-0 isolate z-50 bg-black/10 duration-100 supports-backdrop-filter:backdrop-blur-xs data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0",
35 className
36 )}
37 {...props}
38 />
39 )
40}
41
42function DialogContent({
43 className,
44 children,
45 showCloseButton = true,
46 ...props
47}: DialogPrimitive.Popup.Props & {
48 showCloseButton?: boolean
49}) {
50 return (
51 <DialogPortal>
52 <DialogOverlay />
53 <DialogPrimitive.Popup
54 data-slot="dialog-content"
55 className={cn(
56 "fixed top-1/2 left-1/2 z-50 grid w-full max-w-[calc(100%-2rem)] -translate-x-1/2 -translate-y-1/2 gap-4 rounded-xl bg-popover p-4 text-sm text-popover-foreground ring-1 ring-foreground/10 duration-100 outline-none sm:max-w-sm data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
57 className
58 )}
59 {...props}
60 >
61 {children}
62 {showCloseButton && (
63 <DialogPrimitive.Close
64 data-slot="dialog-close"
65 render={
66 <Button
67 variant="ghost"
68 className="absolute top-2 right-2"
69 size="icon-sm"
70 />
71 }
72 >
73 <IconClose className="size-3.5" />
74 <span className="sr-only">Close</span>
75 </DialogPrimitive.Close>
76 )}
77 </DialogPrimitive.Popup>
78 </DialogPortal>
79 )
80}
81
82function DialogHeader({ className, ...props }: React.ComponentProps<"div">) {
83 return (
84 <div
85 data-slot="dialog-header"
86 className={cn("flex flex-col gap-2", className)}
87 {...props}
88 />
89 )
90}
91
92function DialogFooter({
93 className,
94 showCloseButton = false,
95 children,
96 ...props
97}: React.ComponentProps<"div"> & {
98 showCloseButton?: boolean
99}) {
100 return (
101 <div
102 data-slot="dialog-footer"
103 className={cn(
104 "-mx-4 -mb-4 flex flex-col-reverse gap-2 rounded-b-xl border-t bg-muted/50 p-4 sm:flex-row sm:justify-end",
105 className
106 )}
107 {...props}
108 >
109 {children}
110 {showCloseButton && (
111 <DialogPrimitive.Close render={<Button variant="outline" />}>
112 Close
113 </DialogPrimitive.Close>
114 )}
115 </div>
116 )
117}
118
119function DialogTitle({ className, ...props }: DialogPrimitive.Title.Props) {
120 return (
121 <DialogPrimitive.Title
122 data-slot="dialog-title"
123 className={cn(
124 "text-base leading-none font-medium",
125 className
126 )}
127 {...props}
128 />
129 )
130}
131
132function DialogDescription({
133 className,
134 ...props
135}: DialogPrimitive.Description.Props) {
136 return (
137 <DialogPrimitive.Description
138 data-slot="dialog-description"
139 className={cn(
140 "text-sm text-muted-foreground *:[a]:underline *:[a]:underline-offset-3 *:[a]:hover:text-foreground",
141 className
142 )}
143 {...props}
144 />
145 )
146}
147
148export {
149 Dialog,
150 DialogClose,
151 DialogContent,
152 DialogDescription,
153 DialogFooter,
154 DialogHeader,
155 DialogOverlay,
156 DialogPortal,
157 DialogTitle,
158 DialogTrigger,
159}
packages/clients/react/src/plugins/components/ui/input.tsx+26−0
@@ -0,0 +1,26 @@
1import * as React from "react";
2import { Input as InputPrimitive } from "@base-ui/react/input";
3
4import { cn } from "../../lib/cn";
5
6const Input = React.forwardRef<
7 HTMLInputElement,
8 React.ComponentProps<"input">
9>(({ className, type, ...props }, ref) => {
10 return (
11 <InputPrimitive
12 ref={ref}
13 type={type}
14 data-slot="input"
15 className={cn(
16 "h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
17 className,
18 )}
19 {...props}
20 />
21 );
22});
23
24Input.displayName = "Input";
25
26export { Input };
packages/clients/react/src/plugins/components/ui/label.tsx+18−0
@@ -0,0 +1,18 @@
1import * as React from "react";
2
3import { cn } from "../../lib/cn";
4
5function Label({ className, ...props }: React.ComponentProps<"label">) {
6 return (
7 <label
8 data-slot="label"
9 className={cn(
10 "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",
11 className,
12 )}
13 {...props}
14 />
15 );
16}
17
18export { Label };
packages/clients/react/src/plugins/components/ui/popover.tsx+48−0
@@ -0,0 +1,48 @@
1import * as React from "react";
2import { Popover as PopoverPrimitive } from "@base-ui/react/popover";
3
4import { cn } from "../../lib/cn";
5
6function Popover({ ...props }: PopoverPrimitive.Root.Props) {
7 return <PopoverPrimitive.Root data-slot="popover" {...props} />;
8}
9
10function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) {
11 return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
12}
13
14function PopoverContent({
15 className,
16 align = "center",
17 alignOffset = 0,
18 side = "bottom",
19 sideOffset = 4,
20 ...props
21}: PopoverPrimitive.Popup.Props &
22 Pick<
23 PopoverPrimitive.Positioner.Props,
24 "align" | "alignOffset" | "side" | "sideOffset"
25 >) {
26 return (
27 <PopoverPrimitive.Portal>
28 <PopoverPrimitive.Positioner
29 align={align}
30 alignOffset={alignOffset}
31 side={side}
32 sideOffset={sideOffset}
33 className="isolate z-50"
34 >
35 <PopoverPrimitive.Popup
36 data-slot="popover-content"
37 className={cn(
38 "z-50 flex w-72 origin-(--transform-origin) flex-col gap-2.5 rounded-lg bg-popover p-2.5 text-sm text-popover-foreground shadow-md ring-1 ring-foreground/10 outline-hidden duration-100 data-[side=bottom]:slide-in-from-top-2 data-[side=inline-end]:slide-in-from-left-2 data-[side=inline-start]:slide-in-from-right-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 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95",
39 className,
40 )}
41 {...props}
42 />
43 </PopoverPrimitive.Positioner>
44 </PopoverPrimitive.Portal>
45 );
46}
47
48export { Popover, PopoverContent, PopoverTrigger };
packages/clients/react/src/plugins/components/ui/select.tsx+24−0
@@ -0,0 +1,24 @@
1import * as React from "react";
2
3import { cn } from "../../lib/cn";
4
5function Select({
6 className,
7 children,
8 ...props
9}: React.ComponentProps<"select">) {
10 return (
11 <select
12 data-slot="select"
13 className={cn(
14 "h-8 w-full rounded-lg border border-input bg-transparent px-2.5 text-base outline-none transition-colors focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm dark:bg-input/30",
15 className,
16 )}
17 {...props}
18 >
19 {children}
20 </select>
21 );
22}
23
24export { Select };
packages/clients/react/src/plugins/components/ui/separator.tsx+23−0
@@ -0,0 +1,23 @@
1import { Separator as SeparatorPrimitive } from "@base-ui/react/separator";
2
3import { cn } from "../../lib/cn";
4
5function Separator({
6 className,
7 orientation = "horizontal",
8 ...props
9}: SeparatorPrimitive.Props) {
10 return (
11 <SeparatorPrimitive
12 data-slot="separator"
13 orientation={orientation}
14 className={cn(
15 "shrink-0 bg-border data-horizontal:h-px data-horizontal:w-full data-vertical:w-px data-vertical:self-stretch",
16 className,
17 )}
18 {...props}
19 />
20 );
21}
22
23export { Separator };
packages/clients/react/src/plugins/components/ui/textarea.tsx+18−0
@@ -0,0 +1,18 @@
1import * as React from "react";
2
3import { cn } from "../../lib/cn";
4
5function Textarea({ className, ...props }: React.ComponentProps<"textarea">) {
6 return (
7 <textarea
8 data-slot="textarea"
9 className={cn(
10 "flex field-sizing-content min-h-16 w-full rounded-lg border border-input bg-transparent px-2.5 py-2 text-base transition-colors outline-none placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",
11 className,
12 )}
13 {...props}
14 />
15 );
16}
17
18export { Textarea };
packages/clients/react/src/plugins/index.ts+13−4
@@ -63,10 +63,6 @@ export { · 62 unmodified lines
63 cn,63 cn,
64} from "./lib/cn";64} from "./lib/cn";
65 65
66export {
67 Badge,
68 MethodBadge,
69} from "./components/badge";
70export {66export {
71 CodeBlock,67 CodeBlock,
72} from "./components/code-block";68} from "./components/code-block";
@@ -106,3 +102,16 @@ export { · 33 unmodified lines
106 type SourceToolDetailPanelProps,102 type SourceToolDetailPanelProps,
107 type SourceToolDiscoveryResult,103 type SourceToolDiscoveryResult,
108} from "./components/source-tool-workbench";104} from "./components/source-tool-workbench";
105
106// ── UI primitives (shadcn/ui) ────────────────────────────────────────────
107export { Alert, alertVariants, AlertTitle, AlertDescription, AlertAction } from "./components/ui/alert";
108export { Badge, badgeVariants, MethodBadge, type BadgeProps } from "./components/ui/badge";
109export { Button, buttonVariants, type ButtonProps } from "./components/ui/button";
110export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent } from "./components/ui/card";
111export { Input } from "./components/ui/input";
112export { Label } from "./components/ui/label";
113export { Select } from "./components/ui/select";
114export { Separator } from "./components/ui/separator";
115export { Textarea } from "./components/ui/textarea";
116export { Popover, PopoverContent, PopoverTrigger } from "./components/ui/popover";
117export { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandShortcut, CommandSeparator } from "./components/ui/command";
packages/clients/react/src/plugins/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: ReadonlyArray<ClassValue>): string {
5 return twMerge(clsx(inputs));
6}
packages/clients/react/tsconfig.json+5−1
@@ -8,7 +8,11 @@ · 7 unmodified lines
8 "noEmit": true,8 "noEmit": true,
9 "lib": ["ES2022", "DOM"],9 "lib": ["ES2022", "DOM"],
10 "jsx": "react-jsx",10 "jsx": "react-jsx",
11 "types": ["bun-types"]11 "types": ["bun-types"],
12 "baseUrl": ".",
13 "paths": {
14 "@/*": ["./src/plugins/*"]
15 }
12 },16 },
13 "include": [17 "include": [
14 "src/**/*.ts",18 "src/**/*.ts",
plugins/execution-history/react/components.tsx+15−10
@@ -7,7 +7,10 @@ import { · 6 unmodified lines
7 useExecutions,7 useExecutions,
8} from "@executor/react";8} from "@executor/react";
9import {9import {
10 Alert,
10 Badge,11 Badge,
12 Button,
13 Card,
11 DocumentPanel,14 DocumentPanel,
12 EmptyState,15 EmptyState,
13 LoadableBlock,16 LoadableBlock,
@@ -81,12 +84,12 @@ const MetadataItem = (props: { · 67 unmodified lines
81 label: string;84 label: string;
82 value: string;85 value: string;
83}) => (86}) => (
84 <div className="rounded-lg border border-border bg-card/60 px-3 py-2">87 <Card className="bg-card/60 px-3 py-2">
85 <div className="text-[10px] font-medium uppercase tracking-wider text-muted-foreground/70">88 <div className="text-[10px] font-medium uppercase tracking-wider text-muted-foreground/70">
86 {props.label}89 {props.label}
87 </div>90 </div>
88 <div className="mt-1 text-sm text-foreground">{props.value}</div>91 <div className="mt-1 text-sm text-foreground">{props.value}</div>
89 </div>92 </Card>
90);93);
91 94
92const ExecutionCard = (props: {95const ExecutionCard = (props: {
@@ -96,10 +99,11 @@ const ExecutionCard = (props: { · 3 unmodified lines
96 const { execution } = props;99 const { execution } = props;
97 100
98 return (101 return (
99 <button102 <Button
103 variant="ghost"
100 type="button"104 type="button"
101 onClick={props.onOpen}105 onClick={props.onOpen}
102 className="w-full rounded-2xl border border-border bg-card px-5 py-4 text-left transition-colors hover:border-primary/25 hover:bg-card/90"106 className="h-auto w-full rounded-2xl border border-border bg-card px-5 py-4 text-left transition-colors hover:border-primary/25 hover:bg-card/90"
103 >107 >
104 <div className="flex items-start justify-between gap-3">108 <div className="flex items-start justify-between gap-3">
105 <div className="min-w-0 flex-1">109 <div className="min-w-0 flex-1">
@@ -122,11 +126,11 @@ const ExecutionCard = (props: { · 16 unmodified lines
122 </div>126 </div>
123 127
124 {execution.errorText && (128 {execution.errorText && (
125 <div className="mt-3 rounded-lg border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive">129 <Alert variant="destructive" className="mt-3 text-xs">
126 {execution.errorText}130 {execution.errorText}
127 </div>131 </Alert>
128 )}132 )}
129 </button>133 </Button>
130 );134 );
131};135};
132 136
@@ -275,15 +279,16 @@ export function ExecutionHistoryDetailPage() { · 142 unmodified lines
275 <div className="mx-auto max-w-6xl px-6 py-10 lg:px-10 lg:py-14">279 <div className="mx-auto max-w-6xl px-6 py-10 lg:px-10 lg:py-14">
276 <div className="mb-8 flex flex-wrap items-center justify-between gap-4">280 <div className="mb-8 flex flex-wrap items-center justify-between gap-4">
277 <div>281 <div>
278 <button282 <Button
283 variant="ghost"
279 type="button"284 type="button"
280 onClick={() => {285 onClick={() => {
281 void navigation.route();286 void navigation.route();
282 }}287 }}
283 className="mb-3 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-colors hover:text-foreground"288 className="mb-3 h-auto p-0 text-xs font-medium uppercase tracking-wider text-muted-foreground transition-colors hover:text-foreground"
284 >289 >
285 Back to history290 Back to history
286 </button>291 </Button>
287 <div className="flex items-center gap-3">292 <div className="flex items-center gap-3">
288 <h1 className="font-display text-2xl tracking-tight text-foreground lg:text-3xl">293 <h1 className="font-display text-2xl tracking-tight text-foreground lg:text-3xl">
289 {executionId}294 {executionId}
plugins/google-discovery/react/components.tsx+92−91
@@ -11,9 +11,17 @@ import { · 10 unmodified lines
11 useSource,11 useSource,
12} from "@executor/react";12} from "@executor/react";
13import {13import {
14 Alert,
14 Badge,15 Badge,
16 Button,
17 Card,
15 IconPencil,18 IconPencil,
19 Input,
20 Label,
21 Select,
22 Separator,
16 SourceToolExplorer,23 SourceToolExplorer,
24 Textarea,
17 parseSourceToolExplorerSearch,25 parseSourceToolExplorerSearch,
18 type SourceToolExplorerSearch,26 type SourceToolExplorerSearch,
19 useSourcePluginNavigation,27 useSourcePluginNavigation,
@@ -565,80 +573,74 @@ function GoogleDiscoverySourceForm(props: { · 545 unmodified lines
565 };573 };
566 574
567 return (575 return (
568 <div className="space-y-6 rounded-xl border border-border p-6">576 <Card className="space-y-6 p-6">
569 <div className="grid gap-4 sm:grid-cols-2">577 <div className="grid gap-4 sm:grid-cols-2">
570 <label className="grid gap-2 sm:col-span-2">578 <div className="grid gap-2 sm:col-span-2">
571 <span className="text-xs font-medium text-foreground">Name</span>579 <Label>Name</Label>
572 <input580 <Input
573 value={name}581 value={name}
574 onChange={(event) => setName(event.target.value)}582 onChange={(event) => setName(event.target.value)}
575 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
576 />583 />
577 </label>584 </div>
578 <label className="grid gap-2">585 <div className="grid gap-2">
579 <span className="text-xs font-medium text-foreground">Service</span>586 <Label>Service</Label>
580 <input587 <Input
581 value={service}588 value={service}
582 onChange={(event) => setService(event.target.value)}589 onChange={(event) => setService(event.target.value)}
583 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
584 />590 />
585 </label>591 </div>
586 <label className="grid gap-2">592 <div className="grid gap-2">
587 <span className="text-xs font-medium text-foreground">Version</span>593 <Label>Version</Label>
588 <input594 <Input
589 value={version}595 value={version}
590 onChange={(event) => setVersion(event.target.value)}596 onChange={(event) => setVersion(event.target.value)}
591 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
592 />597 />
593 </label>598 </div>
594 <label className="grid gap-2 sm:col-span-2">599 <div className="grid gap-2 sm:col-span-2">
595 <span className="text-xs font-medium text-foreground">Discovery URL</span>600 <Label>Discovery URL</Label>
596 <input601 <Input
597 value={discoveryUrl}602 value={discoveryUrl}
598 onChange={(event) => setDiscoveryUrl(event.target.value)}603 onChange={(event) => setDiscoveryUrl(event.target.value)}
599 placeholder={defaultGoogleDiscoveryUrl(service || "sheets", version || "v4")}604 placeholder={defaultGoogleDiscoveryUrl(service || "sheets", version || "v4")}
600 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"605 className="font-mono text-xs"
601 />606 />
602 </label>607 </div>
603 </div>608 </div>
604 609
605 <label className="grid gap-2">610 <div className="grid gap-2">
606 <span className="text-xs font-medium text-foreground">Default Headers</span>611 <Label>Default Headers</Label>
607 <textarea612 <Textarea
608 value={headersText}613 value={headersText}
609 onChange={(event) => setHeadersText(event.target.value)}614 onChange={(event) => setHeadersText(event.target.value)}
610 rows={3}615 rows={3}
611 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
612 />616 />
613 </label>617 </div>
614 618
615 <label className="grid gap-2">619 <div className="grid gap-2">
616 <span className="text-xs font-medium text-foreground">Scopes</span>620 <Label>Scopes</Label>
617 <textarea621 <Textarea
618 value={scopesText}622 value={scopesText}
619 onChange={(event) => setScopesText(event.target.value)}623 onChange={(event) => setScopesText(event.target.value)}
620 rows={3}624 rows={3}
621 placeholder="Leave blank to infer from the discovery document."625 placeholder="Leave blank to infer from the discovery document."
622 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
623 />626 />
624 </label>627 </div>
625 628
626 <label className="grid gap-2">629 <div className="grid gap-2">
627 <span className="text-xs font-medium text-foreground">Auth</span>630 <Label>Auth</Label>
628 <select631 <Select
629 value={authKind}632 value={authKind}
630 onChange={(event) =>633 onChange={(event) =>
631 setAuthKind(event.target.value as GoogleDiscoveryConnectionAuth["kind"])}634 setAuthKind(event.target.value as GoogleDiscoveryConnectionAuth["kind"])}
632 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
633 >635 >
634 <option value="none">None</option>636 <option value="none">None</option>
635 <option value="bearer">Bearer Secret</option>637 <option value="bearer">Bearer Secret</option>
636 <option value="oauth2">Google OAuth</option>638 <option value="oauth2">Google OAuth</option>
637 </select>639 </Select>
638 </label>640 </div>
639 641
640 {authKind === "bearer" && (642 {authKind === "bearer" && (
641 <div className="border-l-2 border-border pl-4">643 <div className="rounded-lg border border-border bg-muted/20 p-4">
642 <SecretReferenceField644 <SecretReferenceField
643 label="Secret"645 label="Secret"
644 value={bearerSecretRef}646 value={bearerSecretRef}
@@ -651,15 +653,14 @@ function GoogleDiscoverySourceForm(props: { · 6 unmodified lines
651 )}653 )}
652 654
653 {authKind === "oauth2" && (655 {authKind === "oauth2" && (
654 <div className="space-y-4 border-l-2 border-border pl-4">656 <div className="space-y-4 rounded-lg border border-border bg-muted/20 p-4">
655 <label className="grid gap-2">657 <div className="grid gap-2">
656 <span className="text-xs font-medium text-foreground">Client ID</span>658 <Label>Client ID</Label>
657 <input659 <Input
658 value={clientId}660 value={clientId}
659 onChange={(event) => setClientId(event.target.value)}661 onChange={(event) => setClientId(event.target.value)}
660 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
661 />662 />
662 </label>663 </div>
663 <SecretReferenceField664 <SecretReferenceField
664 label="Client Secret"665 label="Client Secret"
665 value={clientSecretRef}666 value={clientSecretRef}
@@ -669,7 +670,8 @@ function GoogleDiscoverySourceForm(props: { · 3 unmodified lines
669 onChange={setClientSecretRef}670 onChange={setClientSecretRef}
670 />671 />
671 <div className="flex items-center gap-3">672 <div className="flex items-center gap-3">
672 <button673 <Button
674 variant="outline"
673 type="button"675 type="button"
674 onClick={() => {676 onClick={() => {
675 void (async () => {677 void (async () => {
@@ -685,14 +687,13 @@ function GoogleDiscoverySourceForm(props: { · 9 unmodified lines
685 })();687 })();
686 }}688 }}
687 disabled={oauthStatus === "pending"}689 disabled={oauthStatus === "pending"}
688 className="inline-flex h-9 items-center justify-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
689 >690 >
690 {oauthStatus === "pending"691 {oauthStatus === "pending"
691 ? "Connecting..."692 ? "Connecting..."
692 : oauthStatus === "connected"693 : oauthStatus === "connected"
693 ? "Reconnect"694 ? "Reconnect"
694 : "Connect with Google"}695 : "Connect with Google"}
695 </button>696 </Button>
696 {oauthStatus === "connected" && (697 {oauthStatus === "connected" && (
697 <span className="text-xs text-primary">Connected</span>698 <span className="text-xs text-primary">Connected</span>
698 )}699 )}
@@ -701,13 +702,13 @@ function GoogleDiscoverySourceForm(props: { · 2 unmodified lines
701 )}702 )}
702 703
703 {error && (704 {error && (
704 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">705 <Alert variant="destructive">
705 {error}706 {error}
706 </div>707 </Alert>
707 )}708 )}
708 709
709 <div className="flex items-center justify-end">710 <div className="flex items-center justify-end">
710 <button711 <Button
711 type="button"712 type="button"
712 onClick={() => {713 onClick={() => {
713 void (async () => {714 void (async () => {
@@ -746,14 +747,13 @@ function GoogleDiscoverySourceForm(props: { · 32 unmodified lines
746 })();747 })();
747 }}748 }}
748 disabled={submitMutation.status === "pending"}749 disabled={submitMutation.status === "pending"}
749 className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
750 >750 >
751 {submitMutation.status === "pending"751 {submitMutation.status === "pending"
752 ? props.mode === "create" ? "Creating..." : "Saving..."752 ? props.mode === "create" ? "Creating..." : "Saving..."
753 : props.mode === "create" ? "Create Source" : "Save Changes"}753 : props.mode === "create" ? "Create Source" : "Save Changes"}
754 </button>754 </Button>
755 </div>755 </div>
756 </div>756 </Card>
757 );757 );
758}758}
759 759
@@ -857,7 +857,7 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 97 unmodified lines
857 };857 };
858 858
859 return (859 return (
860 <div className="space-y-6 rounded-xl border border-border p-6">860 <Card className="space-y-6 p-6">
861 <div>861 <div>
862 <h2 className="text-base font-semibold text-foreground">862 <h2 className="text-base font-semibold text-foreground">
863 Connect multiple Google APIs863 Connect multiple Google APIs
@@ -874,14 +874,17 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 10 unmodified lines
874 : `${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"} selected.`}874 : `${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"} selected.`}
875 </div>875 </div>
876 <div className="flex items-center gap-2">876 <div className="flex items-center gap-2">
877 <button877 <Button
878 variant="outline"
879 size="sm"
878 type="button"880 type="button"
879 onClick={() => setSelectedTemplateIds([])}881 onClick={() => setSelectedTemplateIds([])}
880 className="inline-flex h-8 items-center justify-center rounded-lg border border-input bg-card px-3 text-xs font-medium text-foreground transition-colors hover:bg-accent/50"
881 >882 >
882 Clear883 Clear
883 </button>884 </Button>
884 <button885 <Button
886 variant="outline"
887 size="sm"
885 type="button"888 type="button"
886 onClick={() =>889 onClick={() =>
887 setSelectedTemplateIds(890 setSelectedTemplateIds(
@@ -890,12 +893,11 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 2 unmodified lines
890 : GOOGLE_DISCOVERY_BATCH_TEMPLATES.map((template) => template.id),893 : GOOGLE_DISCOVERY_BATCH_TEMPLATES.map((template) => template.id),
891 )894 )
892 }895 }
893 className="inline-flex h-8 items-center justify-center rounded-lg border border-input bg-card px-3 text-xs font-medium text-foreground transition-colors hover:bg-accent/50"
894 >896 >
895 {selectedTemplateIds.length === GOOGLE_DISCOVERY_BATCH_TEMPLATES.length897 {selectedTemplateIds.length === GOOGLE_DISCOVERY_BATCH_TEMPLATES.length
896 ? "Deselect all"898 ? "Deselect all"
897 : "Select all"}899 : "Select all"}
898 </button>900 </Button>
899 </div>901 </div>
900 </div>902 </div>
901 903
@@ -905,14 +907,15 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 3 unmodified lines
905 const iconUrl = getGoogleDiscoveryIconUrlForService(template.service);907 const iconUrl = getGoogleDiscoveryIconUrlForService(template.service);
906 908
907 return (909 return (
908 <button910 <Button
909 key={template.id}911 key={template.id}
912 variant="ghost"
910 type="button"913 type="button"
911 onClick={() => toggleTemplate(template.id)}914 onClick={() => toggleTemplate(template.id)}
912 className={915 className={
913 selected916 selected
914 ? "rounded-lg border border-primary/30 bg-primary/5 px-4 py-3 text-left transition-colors"917 ? "h-auto rounded-lg border border-primary/30 bg-primary/5 px-4 py-3 text-left"
915 : "rounded-lg border border-border px-4 py-3 text-left transition-colors hover:bg-accent/40"918 : "h-auto rounded-lg border border-border px-4 py-3 text-left hover:bg-accent/40"
916 }919 }
917 >920 >
918 <div className="flex items-start gap-3">921 <div className="flex items-start gap-3">
@@ -954,21 +957,20 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 35 unmodified lines
954 </div>957 </div>
955 </div>958 </div>
956 </div>959 </div>
957 </button>960 </Button>
958 );961 );
959 })}962 })}
960 </div>963 </div>
961 964
962 <div className="grid gap-4 md:grid-cols-2">965 <div className="grid gap-4 md:grid-cols-2">
963 <label className="grid gap-2 md:col-span-2">966 <div className="grid gap-2 md:col-span-2">
964 <span className="text-xs font-medium text-foreground">Client ID</span>967 <Label>Client ID</Label>
965 <input968 <Input
966 value={clientId}969 value={clientId}
967 onChange={(event) => setClientId(event.target.value)}970 onChange={(event) => setClientId(event.target.value)}
968 placeholder="1234567890-abcdef.apps.googleusercontent.com"971 placeholder="1234567890-abcdef.apps.googleusercontent.com"
969 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
970 />972 />
971 </label>973 </div>
972 <div className="md:col-span-2">974 <div className="md:col-span-2">
973 <SecretReferenceField975 <SecretReferenceField
974 label="Client Secret"976 label="Client Secret"
@@ -982,13 +984,13 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 7 unmodified lines
982 </div>984 </div>
983 985
984 {error && (986 {error && (
985 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">987 <Alert variant="destructive">
986 {error}988 {error}
987 </div>989 </Alert>
988 )}990 )}
989 991
990 <div className="flex items-center justify-end gap-3">992 <div className="flex items-center justify-end gap-3">
991 <button993 <Button
992 type="button"994 type="button"
993 onClick={() => {995 onClick={() => {
994 void handleConnect();996 void handleConnect();
@@ -998,16 +1000,15 @@ function GoogleDiscoveryBatchConnectPanel(props: { · 3 unmodified lines
998 || selectedTemplates.length === 01000 || selectedTemplates.length === 0
999 || clientId.trim().length === 01001 || clientId.trim().length === 0
1000 }1002 }
1001 className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
1002 >1003 >
1003 {status === "connecting"1004 {status === "connecting"
1004 ? "Connecting..."1005 ? "Connecting..."
1005 : selectedTemplates.length > 01006 : selectedTemplates.length > 0
1006 ? `Connect ${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"}`1007 ? `Connect ${selectedTemplates.length} Google API${selectedTemplates.length === 1 ? "" : "s"}`
1007 : "Connect Google APIs"}1008 : "Connect Google APIs"}
1008 </button>1009 </Button>
1009 </div>1010 </div>
1010 </div>1011 </Card>
1011 );1012 );
1012}1013}
1013 1014
@@ -1043,11 +1044,11 @@ export function GoogleDiscoveryAddPage() { · 29 unmodified lines
1043 />1044 />
1044 1045
1045 <div className="flex items-center gap-3">1046 <div className="flex items-center gap-3">
1046 <div className="h-px flex-1 bg-border" />1047 <Separator className="flex-1" />
1047 <div className="text-xs font-medium text-muted-foreground">1048 <div className="text-xs font-medium text-muted-foreground">
1048 or add a single API1049 or add a single API
1049 </div>1050 </div>
1050 <div className="h-px flex-1 bg-border" />1051 <Separator className="flex-1" />
1051 </div>1052 </div>
1052 1053
1053 <GoogleDiscoverySourceForm1054 <GoogleDiscoverySourceForm
@@ -1108,9 +1109,9 @@ export function GoogleDiscoveryEditPage(props: { · 54 unmodified lines
1108 1109
1109 if (Result.isFailure(configResult)) {1110 if (Result.isFailure(configResult)) {
1110 return (1111 return (
1111 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">1112 <Alert variant="destructive">
1112 Failed loading source configuration.1113 Failed loading source configuration.
1113 </div>1114 </Alert>
1114 );1115 );
1115 }1116 }
1116 1117
@@ -1238,48 +1239,48 @@ export function GoogleDiscoveryDetailPage(props: { · 121 unmodified lines
1238 summary={summary}1239 summary={summary}
1239 actions={(1240 actions={(
1240 <>1241 <>
1241 <button1242 <Button
1243 variant="outline"
1242 type="button"1244 type="button"
1243 onClick={() =>1245 onClick={() =>
1244 void navigation.edit(props.source.id)}1246 void navigation.edit(props.source.id)}
1245 className="inline-flex h-9 items-center gap-1.5 rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50"
1246 >1247 >
1247 <IconPencil className="size-3.5" />1248 <IconPencil className="size-3.5" />
1248 Edit1249 Edit
1249 </button>1250 </Button>
1250 {confirmDelete ? (1251 {confirmDelete ? (
1251 <div className="flex items-center gap-2">1252 <div className="flex items-center gap-2">
1252 <span className="text-xs font-medium text-destructive">1253 <span className="text-xs font-medium text-destructive">
1253 Confirm delete?1254 Confirm delete?
1254 </span>1255 </span>
1255 <button1256 <Button
1257 variant="outline"
1256 type="button"1258 type="button"
1257 onClick={() => setConfirmDelete(false)}1259 onClick={() => setConfirmDelete(false)}
1258 disabled={isDeleting}1260 disabled={isDeleting}
1259 className="inline-flex h-9 items-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
1260 >1261 >
1261 Cancel1262 Cancel
1262 </button>1263 </Button>
1263 <button1264 <Button
1265 variant="destructive-outline"
1264 type="button"1266 type="button"
1265 onClick={() => {1267 onClick={() => {
1266 void handleDelete().catch(() => {});1268 void handleDelete().catch(() => {});
1267 }}1269 }}
1268 disabled={isDeleting}1270 disabled={isDeleting}
1269 className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
1270 >1271 >
1271 {isDeleting ? "Deleting..." : "Delete"}1272 {isDeleting ? "Deleting..." : "Delete"}
1272 </button>1273 </Button>
1273 </div>1274 </div>
1274 ) : (1275 ) : (
1275 <button1276 <Button
1277 variant="destructive-outline"
1276 type="button"1278 type="button"
1277 onClick={() => setConfirmDelete(true)}1279 onClick={() => setConfirmDelete(true)}
1278 disabled={isDeleting}1280 disabled={isDeleting}
1279 className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
1280 >1281 >
1281 Delete1282 Delete
1282 </button>1283 </Button>
1283 )}1284 )}
1284 </>1285 </>
1285 )}1286 )}
plugins/graphql/react/components.tsx+60−57
@@ -14,10 +14,17 @@ import { · 13 unmodified lines
14 useSource,14 useSource,
15} from "@executor/react";15} from "@executor/react";
16import {16import {
17 Alert,
17 Badge,18 Badge,
19 Button,
20 Card,
18 IconPencil,21 IconPencil,
22 Input,
23 Label,
24 Select,
19 SourceToolDetailPanel,25 SourceToolDetailPanel,
20 SourceToolExplorer,26 SourceToolExplorer,
27 Textarea,
21 parseSourceToolExplorerSearch,28 parseSourceToolExplorerSearch,
22 useSourcePluginRouteParams,29 useSourcePluginRouteParams,
23 type SourceToolExplorerSearch,30 type SourceToolExplorerSearch,
@@ -207,52 +214,49 @@ function GraphqlSourceForm(props: { · 183 unmodified lines
207 const [error, setError] = useState<string | null>(null);214 const [error, setError] = useState<string | null>(null);
208 215
209 return (216 return (
210 <div className="space-y-6 rounded-xl border border-border p-6">217 <Card className="space-y-6 p-6">
211 <div className="grid gap-4">218 <div className="grid gap-4">
212 <label className="grid gap-2">219 <div className="grid gap-2">
213 <span className="text-xs font-medium text-foreground">Name</span>220 <Label>Name</Label>
214 <input221 <Input
215 value={name}222 value={name}
216 onChange={(event) => setName(event.target.value)}223 onChange={(event) => setName(event.target.value)}
217 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
218 />224 />
219 </label>225 </div>
220 226
221 <label className="grid gap-2">227 <div className="grid gap-2">
222 <span className="text-xs font-medium text-foreground">Endpoint</span>228 <Label>Endpoint</Label>
223 <input229 <Input
224 value={endpoint}230 value={endpoint}
225 onChange={(event) => setEndpoint(event.target.value)}231 onChange={(event) => setEndpoint(event.target.value)}
226 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"232 className="font-mono text-xs"
227 />233 />
228 </label>234 </div>
229 235
230 <label className="grid gap-2">236 <div className="grid gap-2">
231 <span className="text-xs font-medium text-foreground">Default Headers</span>237 <Label>Default Headers</Label>
232 <textarea238 <Textarea
233 value={headersText}239 value={headersText}
234 onChange={(event) => setHeadersText(event.target.value)}240 onChange={(event) => setHeadersText(event.target.value)}
235 rows={3}241 rows={3}
236 placeholder='{"x-api-version":"2026-03-23"}'242 placeholder='{"x-api-version":"2026-03-23"}'
237 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
238 />243 />
239 </label>244 </div>
240 245
241 <label className="grid gap-2">246 <div className="grid gap-2">
242 <span className="text-xs font-medium text-foreground">Auth</span>247 <Label>Auth</Label>
243 <select248 <Select
244 value={authKind}249 value={authKind}
245 onChange={(event) =>250 onChange={(event) =>
246 setAuthKind(event.target.value as GraphqlConnectionAuth["kind"])}251 setAuthKind(event.target.value as GraphqlConnectionAuth["kind"])}
247 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
248 >252 >
249 <option value="none">None</option>253 <option value="none">None</option>
250 <option value="bearer">Bearer Secret</option>254 <option value="bearer">Bearer Secret</option>
251 </select>255 </Select>
252 </label>256 </div>
253 257
254 {authKind === "bearer" && (258 {authKind === "bearer" && (
255 <div className="space-y-4 border-l-2 border-border pl-4">259 <div className="space-y-4 rounded-lg border border-border bg-muted/20 p-4">
256 <SecretReferenceField260 <SecretReferenceField
257 label="Secret"261 label="Secret"
258 value={secretRef}262 value={secretRef}
@@ -263,38 +267,38 @@ function GraphqlSourceForm(props: { · 4 unmodified lines
263 />267 />
264 268
265 <div className="grid gap-4 sm:grid-cols-2">269 <div className="grid gap-4 sm:grid-cols-2">
266 <label className="grid gap-2">270 <div className="grid gap-2">
267 <span className="text-xs font-medium text-foreground">Header Name</span>271 <Label>Header Name</Label>
268 <input272 <Input
269 value={authHeaderName}273 value={authHeaderName}
270 onChange={(event) => setAuthHeaderName(event.target.value)}274 onChange={(event) => setAuthHeaderName(event.target.value)}
271 placeholder={DEFAULT_BEARER_HEADER_NAME}275 placeholder={DEFAULT_BEARER_HEADER_NAME}
272 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"276 className="font-mono text-xs"
273 />277 />
274 </label>278 </div>
275 279
276 <label className="grid gap-2">280 <div className="grid gap-2">
277 <span className="text-xs font-medium text-foreground">Prefix</span>281 <Label>Prefix</Label>
278 <input282 <Input
279 value={authPrefix}283 value={authPrefix}
280 onChange={(event) => setAuthPrefix(event.target.value)}284 onChange={(event) => setAuthPrefix(event.target.value)}
281 placeholder={DEFAULT_BEARER_PREFIX}285 placeholder={DEFAULT_BEARER_PREFIX}
282 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"286 className="font-mono text-xs"
283 />287 />
284 </label>288 </div>
285 </div>289 </div>
286 </div>290 </div>
287 )}291 )}
288 </div>292 </div>
289 293
290 {error && (294 {error && (
291 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">295 <Alert variant="destructive">
292 {error}296 {error}
293 </div>297 </Alert>
294 )}298 )}
295 299
296 <div className="flex items-center justify-end">300 <div className="flex items-center justify-end">
297 <button301 <Button
298 type="button"302 type="button"
299 onClick={() => {303 onClick={() => {
300 void (async () => {304 void (async () => {
@@ -317,14 +321,13 @@ function GraphqlSourceForm(props: { · 16 unmodified lines
317 })();321 })();
318 }}322 }}
319 disabled={submitMutation.status === "pending"}323 disabled={submitMutation.status === "pending"}
320 className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
321 >324 >
322 {submitMutation.status === "pending"325 {submitMutation.status === "pending"
323 ? props.mode === "create" ? "Creating..." : "Saving..."326 ? props.mode === "create" ? "Creating..." : "Saving..."
324 : props.mode === "create" ? "Create Source" : "Save Changes"}327 : props.mode === "create" ? "Create Source" : "Save Changes"}
325 </button>328 </Button>
326 </div>329 </div>
327 </div>330 </Card>
328 );331 );
329}332}
330 333
@@ -400,9 +403,9 @@ export function GraphqlEditPage(props: { · 69 unmodified lines
400 403
401 if (Result.isFailure(configResult)) {404 if (Result.isFailure(configResult)) {
402 return (405 return (
403 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">406 <Alert variant="destructive">
404 Failed loading source configuration.407 Failed loading source configuration.
405 </div>408 </Alert>
406 );409 );
407 }410 }
408 411
@@ -556,47 +559,47 @@ function GraphqlDetailExplorer(props: { · 147 unmodified lines
556 ) : undefined}559 ) : undefined}
557 actions={(560 actions={(
558 <>561 <>
559 <button562 <Button
560 type="button"563 variant="outline"
564 size="sm"
561 onClick={() => void navigation.edit(props.source.id)}565 onClick={() => void navigation.edit(props.source.id)}
562 className="inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
563 >566 >
564 <IconPencil className="size-3" />567 <IconPencil className="size-3" />
565 Edit568 Edit
566 </button>569 </Button>
567 {confirmDelete ? (570 {confirmDelete ? (
568 <div className="flex items-center gap-2">571 <div className="flex items-center gap-2">
569 <span className="text-[11px] font-medium text-destructive">572 <span className="text-[11px] font-medium text-destructive">
570 Confirm delete?573 Confirm delete?
571 </span>574 </span>
572 <button575 <Button
573 type="button"576 variant="outline"
577 size="sm"
574 onClick={() => setConfirmDelete(false)}578 onClick={() => setConfirmDelete(false)}
575 disabled={isDeleting}579 disabled={isDeleting}
576 className="inline-flex items-center rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:pointer-events-none disabled:opacity-50"
577 >580 >
578 Cancel581 Cancel
579 </button>582 </Button>
580 <button583 <Button
581 type="button"584 variant="destructive-outline"
585 size="sm"
582 onClick={() => {586 onClick={() => {
583 void handleDelete().catch(() => {});587 void handleDelete().catch(() => {});
584 }}588 }}
585 disabled={isDeleting}589 disabled={isDeleting}
586 className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
587 >590 >
588 {isDeleting ? "Deleting..." : "Delete"}591 {isDeleting ? "Deleting..." : "Delete"}
589 </button>592 </Button>
590 </div>593 </div>
591 ) : (594 ) : (
592 <button595 <Button
593 type="button"596 variant="destructive-outline"
597 size="sm"
594 onClick={() => setConfirmDelete(true)}598 onClick={() => setConfirmDelete(true)}
595 disabled={isDeleting}599 disabled={isDeleting}
596 className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
597 >600 >
598 Delete601 Delete
599 </button>602 </Button>
600 )}603 )}
601 </>604 </>
602 )}605 )}
plugins/local-tools/react/components.tsx+12−9
@@ -7,6 +7,9 @@ import { · 6 unmodified lines
7 useSources,7 useSources,
8} from "@executor/react";8} from "@executor/react";
9import {9import {
10 Alert,
11 Button,
12 Card,
10 SourceToolExplorer,13 SourceToolExplorer,
11 parseSourceToolExplorerSearch,14 parseSourceToolExplorerSearch,
12 useSourcePluginNavigation,15 useSourcePluginNavigation,
@@ -116,7 +119,7 @@ export function LocalToolsAddPage() { · 103 unmodified lines
116 119
117 return (120 return (
118 <div className="mx-auto w-full max-w-3xl px-6 py-10">121 <div className="mx-auto w-full max-w-3xl px-6 py-10">
119 <div className="rounded-2xl border border-border bg-card p-6">122 <Card className="p-6">
120 <h1 className="font-display text-2xl tracking-tight text-foreground">123 <h1 className="font-display text-2xl tracking-tight text-foreground">
121 Local Tools124 Local Tools
122 </h1>125 </h1>
@@ -125,7 +128,7 @@ export function LocalToolsAddPage() { · 2 unmodified lines
125 {" "}into a first-class source with inspection and discovery.128 {" "}into a first-class source with inspection and discovery.
126 </p>129 </p>
127 130
128 <div className="mt-6 rounded-xl border border-border/70 bg-background/60 p-4 text-sm text-muted-foreground">131 <Card className="mt-6 bg-background/60 p-4 text-sm text-muted-foreground">
129 <p>132 <p>
130 The source is provisioned automatically when the executor session starts and finds133 The source is provisioned automatically when the executor session starts and finds
131 local tool files in <code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code>.134 local tool files in <code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code>.
@@ -135,11 +138,12 @@ export function LocalToolsAddPage() { · 3 unmodified lines
135 {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools/demo.ts</code>138 {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools/demo.ts</code>
136 {" "}still appears as <code className="rounded bg-muted px-1 py-0.5 font-mono">tools.demo(...)</code>.139 {" "}still appears as <code className="rounded bg-muted px-1 py-0.5 font-mono">tools.demo(...)</code>.
137 </p>140 </p>
138 </div>141 </Card>
139 142
140 <div className="mt-6 flex flex-wrap items-center gap-3">143 <div className="mt-6 flex flex-wrap items-center gap-3">
141 {localToolsSource ? (144 {localToolsSource ? (
142 <button145 <Button
146 size="lg"
143 type="button"147 type="button"
144 onClick={() => {148 onClick={() => {
145 startTransition(() => {149 startTransition(() => {
@@ -148,19 +152,18 @@ export function LocalToolsAddPage() { · 2 unmodified lines
148 });152 });
149 });153 });
150 }}154 }}
151 className="inline-flex h-10 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90"
152 >155 >
153 Open Local Tools Source156 Open Local Tools Source
154 </button>157 </Button>
155 ) : (158 ) : (
156 <div className="rounded-lg border border-amber-500/25 bg-amber-500/8 px-4 py-2.5 text-sm text-amber-700">159 <Alert variant="warning">
157 No local tools source is active yet. Create a tool in160 No local tools source is active yet. Create a tool in
158 {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code>161 {" "}<code className="rounded bg-muted px-1 py-0.5 font-mono">.executor/tools</code>
159 {" "}and restart the executor session.162 {" "}and restart the executor session.
160 </div>163 </Alert>
161 )}164 )}
162 </div>165 </div>
163 </div>166 </Card>
164 </div>167 </div>
165 );168 );
166}169}
plugins/mcp/react/components.tsx+127−140
@@ -10,12 +10,20 @@ import { · 9 unmodified lines
10 useSource,10 useSource,
11} from "@executor/react";11} from "@executor/react";
12import {12import {
13 Alert,
13 Badge,14 Badge,
15 Button,
16 Card,
17 cn,
14 IconCheck,18 IconCheck,
15 IconPencil,19 IconPencil,
16 IconSearch,20 IconSearch,
17 IconSpinner,21 IconSpinner,
22 Input,
23 Label,
24 Select,
18 SourceToolExplorer,25 SourceToolExplorer,
26 Textarea,
19 parseSourceToolExplorerSearch,27 parseSourceToolExplorerSearch,
20 type SourceToolExplorerSearch,28 type SourceToolExplorerSearch,
21 useSourcePluginNavigation,29 useSourcePluginNavigation,
@@ -584,7 +592,7 @@ function McpSourceForm(props: { · 562 unmodified lines
584 return (592 return (
585 <div className="space-y-8">593 <div className="space-y-8">
586 {props.mode === "create" && (594 {props.mode === "create" && (
587 <div className="rounded-xl border border-border p-6">595 <Card className="p-6">
588 <div className="text-sm font-medium text-foreground">Presets</div>596 <div className="text-sm font-medium text-foreground">Presets</div>
589 <div className="mt-3 grid gap-3 sm:grid-cols-2">597 <div className="mt-3 grid gap-3 sm:grid-cols-2">
590 {mcpQuickPresets.map((preset) => {598 {mcpQuickPresets.map((preset) => {
@@ -595,152 +603,145 @@ function McpSourceForm(props: { · 4 unmodified lines
595 : !isStdio && endpoint.trim() === (preset.input.endpoint ?? "");603 : !isStdio && endpoint.trim() === (preset.input.endpoint ?? "");
596 604
597 return (605 return (
598 <button606 <Button
599 key={preset.id}607 key={preset.id}
600 type="button"608 type="button"
609 variant="outline"
601 onClick={() => applyPreset(preset)}610 onClick={() => applyPreset(preset)}
602 className={611 className={cn(
603 selected612 "h-auto flex-col items-start px-4 py-3 text-left",
604 ? "rounded-lg border border-primary/30 bg-primary/5 px-4 py-3 text-left"613 selected && "border-primary/30 bg-primary/5",
605 : "rounded-lg border border-border px-4 py-3 text-left transition-colors hover:bg-accent/40"614 )}
606 }
607 >615 >
608 <div className="flex items-center gap-2">616 <div className="flex items-center gap-2">
609 {selected ? <IconCheck className="size-3.5 text-primary" /> : null}617 {selected ? <IconCheck className="size-3.5 text-primary" /> : null}
610 <div className="text-sm font-medium text-foreground">{preset.name}</div>618 <div className="text-sm font-medium text-foreground">{preset.name}</div>
611 </div>619 </div>
612 <div className="mt-1 text-xs text-muted-foreground">{preset.summary}</div>620 <div className="mt-1 text-xs text-muted-foreground">{preset.summary}</div>
613 </button>621 </Button>
614 );622 );
615 })}623 })}
616 </div>624 </div>
617 </div>625 </Card>
618 )}626 )}
619 627
620 {props.mode === "create" && (628 {props.mode === "create" && (
621 <div className="rounded-xl border border-border p-6">629 <Card className="p-6">
622 <div>630 <div>
623 <div className="flex items-center justify-between gap-3">631 <div className="flex items-center justify-between gap-3">
624 <div className="text-sm font-medium text-foreground">Discover</div>632 <div className="text-sm font-medium text-foreground">Discover</div>
625 <button633 <Button
626 type="button"634 variant="ghost"
627 onClick={() => setShowProbeAuth((current) => !current)}635 onClick={() => setShowProbeAuth((current) => !current)}
628 className="text-xs font-medium text-muted-foreground transition-colors hover:text-foreground"636 className="text-xs font-medium text-muted-foreground transition-colors hover:text-foreground"
629 >637 >
630 {showProbeAuth ? "Hide auth" : "Need auth?"}638 {showProbeAuth ? "Hide auth" : "Need auth?"}
631 </button>639 </Button>
632 </div>640 </div>
633 641
634 <div className="mt-2 flex flex-col gap-3 sm:flex-row">642 <div className="mt-2 flex flex-col gap-3 sm:flex-row">
635 <input643 <Input
636 value={discoveryEndpoint}644 value={discoveryEndpoint}
637 onChange={(event) => setDiscoveryEndpoint(event.target.value)}645 onChange={(event) => setDiscoveryEndpoint(event.target.value)}
638 placeholder="https://mcp.example.com/mcp"646 placeholder="https://mcp.example.com/mcp"
639 className="h-9 flex-1 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"647 className="flex-1 font-mono text-xs"
640 />648 />
641 <button649 <Button
642 type="button"650 variant="outline"
643 onClick={() => {651 onClick={() => {
644 void handleDiscover();652 void handleDiscover();
645 }}653 }}
646 disabled={discoverMutation.status === "pending"}654 disabled={discoverMutation.status === "pending"}
647 className="inline-flex h-9 items-center justify-center gap-2 rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
648 >655 >
649 {discoverMutation.status === "pending"656 {discoverMutation.status === "pending"
650 ? <IconSpinner className="size-3.5" />657 ? <IconSpinner className="size-3.5" />
651 : <IconSearch className="size-3.5" />}658 : <IconSearch className="size-3.5" />}
652 {discoverMutation.status === "pending" ? "Discovering..." : "Discover"}659 {discoverMutation.status === "pending" ? "Discovering..." : "Discover"}
653 </button>660 </Button>
654 </div>661 </div>
655 662
656 {showProbeAuth && (663 {showProbeAuth && (
657 <div className="mt-3 space-y-3 border-l-2 border-border pl-4">664 <div className="mt-3 space-y-3 rounded-lg border border-border bg-muted/20 p-4">
658 <label className="grid gap-2">665 <div className="grid gap-2">
659 <span className="text-xs font-medium text-foreground">Discovery auth</span>666 <Label>Discovery auth</Label>
660 <select667 <Select
661 value={probeAuth.kind}668 value={probeAuth.kind}
662 onChange={(event) =>669 onChange={(event) =>
663 setProbeAuth((current) => ({670 setProbeAuth((current) => ({
664 ...current,671 ...current,
665 kind: event.target.value as ProbeAuthState["kind"],672 kind: event.target.value as ProbeAuthState["kind"],
666 }))}673 }))}
667 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
668 >674 >
669 <option value="none">None</option>675 <option value="none">None</option>
670 <option value="bearer">Bearer</option>676 <option value="bearer">Bearer</option>
671 <option value="basic">Basic</option>677 <option value="basic">Basic</option>
672 <option value="headers">Custom headers</option>678 <option value="headers">Custom headers</option>
673 </select>679 </Select>
674 </label>680 </div>
675 681
676 {probeAuth.kind === "bearer" && (682 {probeAuth.kind === "bearer" && (
677 <div className="grid gap-4 md:grid-cols-2">683 <div className="grid gap-4 md:grid-cols-2">
678 <label className="grid gap-2">684 <div className="grid gap-2">
679 <span className="text-xs font-medium text-foreground">Header name</span>685 <Label>Header name</Label>
680 <input686 <Input
681 value={probeAuth.headerName}687 value={probeAuth.headerName}
682 onChange={(event) =>688 onChange={(event) =>
683 setProbeAuth((current) => ({ ...current, headerName: event.target.value }))}689 setProbeAuth((current) => ({ ...current, headerName: event.target.value }))}
684 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
685 />690 />
686 </label>691 </div>
687 <label className="grid gap-2">692 <div className="grid gap-2">
688 <span className="text-xs font-medium text-foreground">Prefix</span>693 <Label>Prefix</Label>
689 <input694 <Input
690 value={probeAuth.prefix}695 value={probeAuth.prefix}
691 onChange={(event) =>696 onChange={(event) =>
692 setProbeAuth((current) => ({ ...current, prefix: event.target.value }))}697 setProbeAuth((current) => ({ ...current, prefix: event.target.value }))}
693 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
694 />698 />
695 </label>699 </div>
696 <label className="grid gap-2 md:col-span-2">700 <div className="grid gap-2 md:col-span-2">
697 <span className="text-xs font-medium text-foreground">Token</span>701 <Label>Token</Label>
698 <input702 <Input
699 value={probeAuth.token}703 value={probeAuth.token}
700 onChange={(event) =>704 onChange={(event) =>
701 setProbeAuth((current) => ({ ...current, token: event.target.value }))}705 setProbeAuth((current) => ({ ...current, token: event.target.value }))}
702 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"706 className="font-mono text-xs"
703 />707 />
704 </label>708 </div>
705 </div>709 </div>
706 )}710 )}
707 711
708 {probeAuth.kind === "basic" && (712 {probeAuth.kind === "basic" && (
709 <div className="grid gap-4 md:grid-cols-2">713 <div className="grid gap-4 md:grid-cols-2">
710 <label className="grid gap-2">714 <div className="grid gap-2">
711 <span className="text-xs font-medium text-foreground">Username</span>715 <Label>Username</Label>
712 <input716 <Input
713 value={probeAuth.username}717 value={probeAuth.username}
714 onChange={(event) =>718 onChange={(event) =>
715 setProbeAuth((current) => ({ ...current, username: event.target.value }))}719 setProbeAuth((current) => ({ ...current, username: event.target.value }))}
716 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
717 />720 />
718 </label>721 </div>
719 <label className="grid gap-2">722 <div className="grid gap-2">
720 <span className="text-xs font-medium text-foreground">Password</span>723 <Label>Password</Label>
721 <input724 <Input
722 value={probeAuth.password}725 value={probeAuth.password}
723 onChange={(event) =>726 onChange={(event) =>
724 setProbeAuth((current) => ({ ...current, password: event.target.value }))}727 setProbeAuth((current) => ({ ...current, password: event.target.value }))}
725 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
726 type="password"728 type="password"
727 />729 />
728 </label>730 </div>
729 </div>731 </div>
730 )}732 )}
731 733
732 {probeAuth.kind === "headers" && (734 {probeAuth.kind === "headers" && (
733 <label className="grid gap-2">735 <div className="grid gap-2">
734 <span className="text-xs font-medium text-foreground">Headers JSON</span>736 <Label>Headers JSON</Label>
735 <textarea737 <Textarea
736 value={probeAuth.headersText}738 value={probeAuth.headersText}
737 onChange={(event) =>739 onChange={(event) =>
738 setProbeAuth((current) => ({ ...current, headersText: event.target.value }))}740 setProbeAuth((current) => ({ ...current, headersText: event.target.value }))}
739 rows={3}741 rows={3}
740 placeholder='{"x-api-key":"..."}'742 placeholder='{"x-api-key":"..."}'
741 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
742 />743 />
743 </label>744 </div>
744 )}745 )}
745 </div>746 </div>
746 )}747 )}
@@ -751,22 +752,21 @@ function McpSourceForm(props: { · 4 unmodified lines
751 </div>752 </div>
752 )}753 )}
753 </div>754 </div>
754 </div>755 </Card>
755 )}756 )}
756 757
757 <div className="space-y-6 rounded-xl border border-border p-6">758 <Card className="space-y-6 p-6">
758 <label className="grid gap-2">759 <div className="grid gap-2">
759 <span className="text-xs font-medium text-foreground">Name</span>760 <Label>Name</Label>
760 <input761 <Input
761 value={name}762 value={name}
762 onChange={(event) => setName(event.target.value)}763 onChange={(event) => setName(event.target.value)}
763 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
764 />764 />
765 </label>765 </div>
766 766
767 <label className="grid gap-2">767 <div className="grid gap-2">
768 <span className="text-xs font-medium text-foreground">Transport</span>768 <Label>Transport</Label>
769 <select769 <Select
770 value={transportFields.transport}770 value={transportFields.transport}
771 onChange={(event) => {771 onChange={(event) => {
772 const nextTransport = event.target.value as McpTransportValue;772 const nextTransport = event.target.value as McpTransportValue;
@@ -779,34 +779,33 @@ function McpSourceForm(props: { · 6 unmodified lines
779 setOauthStatus("idle");779 setOauthStatus("idle");
780 }780 }
781 }}781 }}
782 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
783 >782 >
784 <option value="">Auto (remote)</option>783 <option value="">Auto (remote)</option>
785 <option value="auto">Auto</option>784 <option value="auto">Auto</option>
786 <option value="streamable-http">Streamable HTTP</option>785 <option value="streamable-http">Streamable HTTP</option>
787 <option value="sse">SSE</option>786 <option value="sse">SSE</option>
788 <option value="stdio">stdio</option>787 <option value="stdio">stdio</option>
789 </select>788 </Select>
790 </label>789 </div>
791 790
792 {isStdio ? (791 {isStdio ? (
793 <div className="grid gap-4 md:grid-cols-2">792 <div className="grid gap-4 md:grid-cols-2">
794 <label className="grid gap-2 md:col-span-2">793 <div className="grid gap-2 md:col-span-2">
795 <span className="text-xs font-medium text-foreground">Command</span>794 <Label>Command</Label>
796 <input795 <Input
797 value={transportFields.command}796 value={transportFields.command}
798 onChange={(event) =>797 onChange={(event) =>
799 setTransportFields({798 setTransportFields({
800 ...transportFields,799 ...transportFields,
801 command: event.target.value,800 command: event.target.value,
802 })}801 })}
803 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"802 className="font-mono text-xs"
804 />803 />
805 </label>804 </div>
806 805
807 <label className="grid gap-2">806 <div className="grid gap-2">
808 <span className="text-xs font-medium text-foreground">Args</span>807 <Label>Args</Label>
809 <textarea808 <Textarea
810 value={transportFields.argsText}809 value={transportFields.argsText}
811 onChange={(event) =>810 onChange={(event) =>
812 setTransportFields({811 setTransportFields({
@@ -815,13 +814,12 @@ function McpSourceForm(props: { · 2 unmodified lines
815 })}814 })}
816 rows={3}815 rows={3}
817 placeholder='["server.js","--port","8787"]'816 placeholder='["server.js","--port","8787"]'
818 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
819 />817 />
820 </label>818 </div>
821 819
822 <label className="grid gap-2">820 <div className="grid gap-2">
823 <span className="text-xs font-medium text-foreground">Environment</span>821 <Label>Environment</Label>
824 <textarea822 <Textarea
825 value={transportFields.envText}823 value={transportFields.envText}
826 onChange={(event) =>824 onChange={(event) =>
827 setTransportFields({825 setTransportFields({
@@ -830,37 +828,36 @@ function McpSourceForm(props: { · 2 unmodified lines
830 })}828 })}
831 rows={3}829 rows={3}
832 placeholder='{"NODE_ENV":"production"}'830 placeholder='{"NODE_ENV":"production"}'
833 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
834 />831 />
835 </label>832 </div>
836 833
837 <label className="grid gap-2 md:col-span-2">834 <div className="grid gap-2 md:col-span-2">
838 <span className="text-xs font-medium text-foreground">Working Directory</span>835 <Label>Working Directory</Label>
839 <input836 <Input
840 value={transportFields.cwd}837 value={transportFields.cwd}
841 onChange={(event) =>838 onChange={(event) =>
842 setTransportFields({839 setTransportFields({
843 ...transportFields,840 ...transportFields,
844 cwd: event.target.value,841 cwd: event.target.value,
845 })}842 })}
846 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"843 className="font-mono text-xs"
847 />844 />
848 </label>845 </div>
849 </div>846 </div>
850 ) : (847 ) : (
851 <div className="grid gap-4 md:grid-cols-2">848 <div className="grid gap-4 md:grid-cols-2">
852 <label className="grid gap-2 md:col-span-2">849 <div className="grid gap-2 md:col-span-2">
853 <span className="text-xs font-medium text-foreground">Endpoint</span>850 <Label>Endpoint</Label>
854 <input851 <Input
855 value={endpoint}852 value={endpoint}
856 onChange={(event) => setEndpoint(event.target.value)}853 onChange={(event) => setEndpoint(event.target.value)}
857 className="h-9 rounded-lg border border-input bg-background px-3 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"854 className="font-mono text-xs"
858 />855 />
859 </label>856 </div>
860 857
861 <label className="grid gap-2">858 <div className="grid gap-2">
862 <span className="text-xs font-medium text-foreground">Query Params</span>859 <Label>Query Params</Label>
863 <textarea860 <Textarea
864 value={transportFields.queryParamsText}861 value={transportFields.queryParamsText}
865 onChange={(event) =>862 onChange={(event) =>
866 setTransportFields({863 setTransportFields({
@@ -869,13 +866,12 @@ function McpSourceForm(props: { · 2 unmodified lines
869 })}866 })}
870 rows={3}867 rows={3}
871 placeholder='{"transport":"streamable-http"}'868 placeholder='{"transport":"streamable-http"}'
872 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
873 />869 />
874 </label>870 </div>
875 871
876 <label className="grid gap-2">872 <div className="grid gap-2">
877 <span className="text-xs font-medium text-foreground">Headers</span>873 <Label>Headers</Label>
878 <textarea874 <Textarea
879 value={transportFields.headersText}875 value={transportFields.headersText}
880 onChange={(event) =>876 onChange={(event) =>
881 setTransportFields({877 setTransportFields({
@@ -884,16 +880,15 @@ function McpSourceForm(props: { · 2 unmodified lines
884 })}880 })}
885 rows={3}881 rows={3}
886 placeholder='{"x-api-key":"..."}'882 placeholder='{"x-api-key":"..."}'
887 className="rounded-lg border border-input bg-background px-3 py-2 font-mono text-xs outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
888 />883 />
889 </label>884 </div>
890 </div>885 </div>
891 )}886 )}
892 887
893 {!isStdio && (888 {!isStdio && (
894 <label className="grid gap-2">889 <div className="grid gap-2">
895 <span className="text-xs font-medium text-foreground">Auth</span>890 <Label>Auth</Label>
896 <select891 <Select
897 value={authKind}892 value={authKind}
898 onChange={(event) => {893 onChange={(event) => {
899 const nextKind = event.target.value as McpConnectionAuth["kind"];894 const nextKind = event.target.value as McpConnectionAuth["kind"];
@@ -903,16 +898,15 @@ function McpSourceForm(props: { · 3 unmodified lines
903 setOauthStatus("idle");898 setOauthStatus("idle");
904 }899 }
905 }}900 }}
906 className="h-9 rounded-lg border border-input bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
907 >901 >
908 <option value="none">None</option>902 <option value="none">None</option>
909 <option value="oauth2">OAuth 2.0</option>903 <option value="oauth2">OAuth 2.0</option>
910 </select>904 </Select>
911 </label>905 </div>
912 )}906 )}
913 907
914 {!isStdio && authKind === "oauth2" && (908 {!isStdio && authKind === "oauth2" && (
915 <div className="border-l-2 border-border pl-4">909 <div className="rounded-lg border border-border bg-muted/20 p-4">
916 <div className="flex flex-wrap items-center justify-between gap-3">910 <div className="flex flex-wrap items-center justify-between gap-3">
917 <div>911 <div>
918 <div className="text-sm font-medium text-foreground">OAuth</div>912 <div className="text-sm font-medium text-foreground">OAuth</div>
@@ -920,8 +914,8 @@ function McpSourceForm(props: { · 1 unmodified line
920 Authenticate with the MCP server's built-in OAuth flow.914 Authenticate with the MCP server's built-in OAuth flow.
921 </div>915 </div>
922 </div>916 </div>
923 <button917 <Button
924 type="button"918 variant="outline"
925 onClick={() => {919 onClick={() => {
926 setError(null);920 setError(null);
927 setOauthStatus("pending");921 setOauthStatus("pending");
@@ -933,10 +927,9 @@ function McpSourceForm(props: { · 5 unmodified lines
933 );927 );
934 });928 });
935 }}929 }}
936 className="inline-flex h-9 items-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50"
937 >930 >
938 {oauthStatus === "connected" ? "Reconnect OAuth" : "Connect OAuth"}931 {oauthStatus === "connected" ? "Reconnect OAuth" : "Connect OAuth"}
939 </button>932 </Button>
940 </div>933 </div>
941 {oauthStatus === "connected" && (934 {oauthStatus === "connected" && (
942 <div className="mt-3 text-xs text-primary">935 <div className="mt-3 text-xs text-primary">
@@ -947,14 +940,13 @@ function McpSourceForm(props: { · 4 unmodified lines
947 )}940 )}
948 941
949 {error && (942 {error && (
950 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">943 <Alert variant="destructive">
951 {error}944 {error}
952 </div>945 </Alert>
953 )}946 )}
954 947
955 <div className="flex items-center justify-end gap-3">948 <div className="flex items-center justify-end gap-3">
956 <button949 <Button
957 type="button"
958 onClick={() => {950 onClick={() => {
959 setError(null);951 setError(null);
960 void submitMutation952 void submitMutation
@@ -964,7 +956,6 @@ function McpSourceForm(props: { · 3 unmodified lines
964 );956 );
965 }}957 }}
966 disabled={submitMutation.status === "pending"}958 disabled={submitMutation.status === "pending"}
967 className="inline-flex h-9 items-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
968 >959 >
969 {submitMutation.status === "pending"960 {submitMutation.status === "pending"
970 ? props.mode === "create"961 ? props.mode === "create"
@@ -973,9 +964,9 @@ function McpSourceForm(props: { · 2 unmodified lines
973 : props.mode === "create"964 : props.mode === "create"
974 ? "Create Source"965 ? "Create Source"
975 : "Save Changes"}966 : "Save Changes"}
976 </button>967 </Button>
977 </div>
978 </div>968 </div>
969 </Card>
979 </div>970 </div>
980 );971 );
981}972}
@@ -1052,9 +1043,9 @@ export function McpEditPage(props: { · 70 unmodified lines
1052 1043
1053 if (Result.isFailure(configResult)) {1044 if (Result.isFailure(configResult)) {
1054 return (1045 return (
1055 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-3 text-sm text-destructive">1046 <Alert variant="destructive">
1056 Failed loading source configuration.1047 Failed loading source configuration.
1057 </div>1048 </Alert>
1058 );1049 );
1059 }1050 }
1060 1051
@@ -1185,48 +1176,44 @@ export function McpDetailPage(props: { · 124 unmodified lines
1185 summary={summary}1176 summary={summary}
1186 actions={(1177 actions={(
1187 <>1178 <>
1188 <button1179 <Button
1189 type="button"1180 variant="outline"
1190 onClick={() =>1181 onClick={() =>
1191 void navigation.edit(props.source.id)}1182 void navigation.edit(props.source.id)}
1192 className="inline-flex h-9 items-center gap-1.5 rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50"
1193 >1183 >
1194 <IconPencil className="size-3.5" />1184 <IconPencil className="size-3.5" />
1195 Edit1185 Edit
1196 </button>1186 </Button>
1197 {confirmDelete ? (1187 {confirmDelete ? (
1198 <div className="flex items-center gap-2">1188 <div className="flex items-center gap-2">
1199 <span className="text-xs font-medium text-destructive">1189 <span className="text-xs font-medium text-destructive">
1200 Confirm delete?1190 Confirm delete?
1201 </span>1191 </span>
1202 <button1192 <Button
1203 type="button"1193 variant="outline"
1204 onClick={() => setConfirmDelete(false)}1194 onClick={() => setConfirmDelete(false)}
1205 disabled={isDeleting}1195 disabled={isDeleting}
1206 className="inline-flex h-9 items-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
1207 >1196 >
1208 Cancel1197 Cancel
1209 </button>1198 </Button>
1210 <button1199 <Button
1211 type="button"1200 variant="destructive-outline"
1212 onClick={() => {1201 onClick={() => {
1213 void handleDelete().catch(() => {});1202 void handleDelete().catch(() => {});
1214 }}1203 }}
1215 disabled={isDeleting}1204 disabled={isDeleting}
1216 className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
1217 >1205 >
1218 {isDeleting ? "Deleting..." : "Delete"}1206 {isDeleting ? "Deleting..." : "Delete"}
1219 </button>1207 </Button>
1220 </div>1208 </div>
1221 ) : (1209 ) : (
1222 <button1210 <Button
1223 type="button"1211 variant="destructive-outline"
1224 onClick={() => setConfirmDelete(true)}1212 onClick={() => setConfirmDelete(true)}
1225 disabled={isDeleting}1213 disabled={isDeleting}
1226 className="inline-flex h-9 items-center rounded-lg border border-destructive/25 bg-destructive/5 px-3 text-sm font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
1227 >1214 >
1228 Delete1215 Delete
1229 </button>1216 </Button>
1230 )}1217 )}
1231 </>1218 </>
1232 )}1219 )}
plugins/onepassword/react/components.tsx+46−59
@@ -1,4 +1,4 @@
1import { useEffect, useState, type ReactNode } from "react";1import { useEffect, useState } from "react";
2 2
3import {3import {
4 getExecutorApiBaseUrl,4 getExecutorApiBaseUrl,
@@ -8,6 +8,13 @@ import { · 3 unmodified lines
8import type {8import type {
9 SecretStoreCreateFormProps,9 SecretStoreCreateFormProps,
10} from "@executor/react/plugins";10} from "@executor/react/plugins";
11import {
12 Alert,
13 Button,
14 Input,
15 Label,
16 Select,
17} from "@executor/react/plugins";
11import {18import {
12 type OnePasswordDiscoverVaultsInput,19 type OnePasswordDiscoverVaultsInput,
13 type OnePasswordDiscoverVaultsResult,20 type OnePasswordDiscoverVaultsResult,
@@ -15,26 +22,6 @@ import { · 1 unmodified line
15 type OnePasswordVault,22 type OnePasswordVault,
16} from "@executor/plugin-onepassword-shared";23} from "@executor/plugin-onepassword-shared";
17 24
18const fieldClassName =
19 "h-9 w-full rounded-lg border border-input bg-background px-3 text-[13px] text-foreground outline-none transition-colors placeholder:text-muted-foreground/35 focus:border-ring focus:ring-1 focus:ring-ring/25";
20
21const buttonClassName =
22 "inline-flex h-9 items-center justify-center rounded-lg border border-input bg-card px-3 text-[13px] font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50";
23
24const primaryButtonClassName =
25 "inline-flex h-9 items-center justify-center rounded-lg bg-primary px-3 text-[13px] font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50";
26
27function FieldLabel(props: {
28 label: string;
29 children: ReactNode;
30}) {
31 return (
32 <label className="grid gap-2">
33 <span className="text-[12px] font-medium text-foreground">{props.label}</span>
34 {props.children}
35 </label>
36 );
37}
38 25
39export function OnePasswordSecretStoreCreateForm(26export function OnePasswordSecretStoreCreateForm(
40 props: SecretStoreCreateFormProps,27 props: SecretStoreCreateFormProps,
@@ -189,66 +176,66 @@ export function OnePasswordSecretStoreCreateForm( · 148 unmodified lines
189 return (176 return (
190 <div className="space-y-4">177 <div className="space-y-4">
191 {error && (178 {error && (
192 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-[13px] text-destructive">179 <Alert variant="destructive">
193 {error}180 {error}
194 </div>181 </Alert>
195 )}182 )}
196 183
197 <FieldLabel label="Name">184 <div className="grid gap-2">
198 <input185 <Label>Name</Label>
186 <Input
199 value={name}187 value={name}
200 onChange={(event) => setName(event.target.value)}188 onChange={(event) => setName(event.target.value)}
201 placeholder="Team 1Password"189 placeholder="Team 1Password"
202 className={fieldClassName}
203 autoFocus190 autoFocus
204 />191 />
205 </FieldLabel>192 </div>
206 193
207 <div className="grid gap-4 sm:grid-cols-2">194 <div className="grid gap-4 sm:grid-cols-2">
208 <FieldLabel label="Auth method">195 <div className="grid gap-2">
209 <select196 <Label>Auth method</Label>
197 <Select
210 value={authKind}198 value={authKind}
211 onChange={(event) =>199 onChange={(event) =>
212 setAuthKind(event.target.value as "desktop-app" | "service-account")}200 setAuthKind(event.target.value as "desktop-app" | "service-account")}
213 className={fieldClassName}
214 >201 >
215 <option value="desktop-app">Desktop app</option>202 <option value="desktop-app">Desktop app</option>
216 <option value="service-account">Service account</option>203 <option value="service-account">Service account</option>
217 </select>204 </Select>
218 </FieldLabel>205 </div>
219 <div className="flex items-end">206 <div className="flex items-end">
220 <button207 <Button
208 variant="outline"
221 type="button"209 type="button"
222 onClick={() => {210 onClick={() => {
223 void handleDiscoverVaults();211 void handleDiscoverVaults();
224 }}212 }}
225 disabled={discoverVaultsMutation.status === "pending"}213 disabled={discoverVaultsMutation.status === "pending"}
226 className={buttonClassName}
227 >214 >
228 {discoverVaultsMutation.status === "pending" ? "Loading..." : "Load vaults"}215 {discoverVaultsMutation.status === "pending" ? "Loading..." : "Load vaults"}
229 </button>216 </Button>
230 </div>217 </div>
231 </div>218 </div>
232 219
233 {authKind === "desktop-app" ? (220 {authKind === "desktop-app" ? (
234 <FieldLabel label="Account name or UUID">221 <div className="grid gap-2">
235 <input222 <Label>Account name or UUID</Label>
223 <Input
236 value={accountName}224 value={accountName}
237 onChange={(event) => setAccountName(event.target.value)}225 onChange={(event) => setAccountName(event.target.value)}
238 placeholder="my.1password.com"226 placeholder="my.1password.com"
239 className={fieldClassName}
240 />227 />
241 <div className="text-[11px] text-muted-foreground">228 <div className="text-[11px] text-muted-foreground">
242 Use the account shown in the 1Password desktop app sidebar or the229 Use the account shown in the 1Password desktop app sidebar or the
243 account UUID from <code>op account list --format json</code>.230 account UUID from <code>op account list --format json</code>.
244 </div>231 </div>
245 </FieldLabel>232 </div>
246 ) : (233 ) : (
247 <FieldLabel label="Service Account Token Secret">234 <div className="grid gap-2">
248 <select235 <Label>Service Account Token Secret</Label>
236 <Select
249 value={tokenSecretId}237 value={tokenSecretId}
250 onChange={(event) => setTokenSecretId(event.target.value)}238 onChange={(event) => setTokenSecretId(event.target.value)}
251 className={fieldClassName}
252 >239 >
253 <option value="">240 <option value="">
254 {props.secrets.status === "ready"241 {props.secrets.status === "ready"
@@ -261,60 +248,60 @@ export function OnePasswordSecretStoreCreateForm( · 6 unmodified lines
261 {secret.name ?? secret.id}248 {secret.name ?? secret.id}
262 </option>249 </option>
263 ))}250 ))}
264 </select>251 </Select>
265 <div className="text-[11px] text-muted-foreground">252 <div className="text-[11px] text-muted-foreground">
266 Use this for remote or headless automation. Desktop app auth is better for253 Use this for remote or headless automation. Desktop app auth is better for
267 local Executor use.254 local Executor use.
268 </div>255 </div>
269 </FieldLabel>256 </div>
270 )}257 )}
271 258
272 {discoveredVaults.length > 0 && (259 {discoveredVaults.length > 0 && (
273 <FieldLabel label="Discovered vaults">260 <div className="grid gap-2">
274 <select261 <Label>Discovered vaults</Label>
262 <Select
275 value={vaultId}263 value={vaultId}
276 onChange={(event) => setVaultId(event.target.value)}264 onChange={(event) => setVaultId(event.target.value)}
277 className={fieldClassName}
278 >265 >
279 {discoveredVaults.map((vault) => (266 {discoveredVaults.map((vault) => (
280 <option key={vault.id} value={vault.id}>267 <option key={vault.id} value={vault.id}>
281 {vault.name}268 {vault.name}
282 </option>269 </option>
283 ))}270 ))}
284 </select>271 </Select>
285 <div className="text-[11px] text-muted-foreground">272 <div className="text-[11px] text-muted-foreground">
286 Pick from the vaults visible to this account, or override the id below.273 Pick from the vaults visible to this account, or override the id below.
287 </div>274 </div>
288 </FieldLabel>275 </div>
289 )}276 )}
290 277
291 <FieldLabel label="Vault ID">278 <div className="grid gap-2">
292 <input279 <Label>Vault ID</Label>
280 <Input
293 value={vaultId}281 value={vaultId}
294 onChange={(event) => setVaultId(event.target.value)}282 onChange={(event) => setVaultId(event.target.value)}
295 placeholder="vlt_..."283 placeholder="vlt_..."
296 className={`${fieldClassName} font-mono text-[12px]`}284 className="font-mono text-[12px]"
297 />285 />
298 </FieldLabel>286 </div>
299 287
300 <div className="flex justify-end gap-2">288 <div className="flex justify-end gap-2">
301 <button289 <Button
290 variant="outline"
302 type="button"291 type="button"
303 onClick={props.onCancel}292 onClick={props.onCancel}
304 className={buttonClassName}
305 >293 >
306 Cancel294 Cancel
307 </button>295 </Button>
308 <button296 <Button
309 type="button"297 type="button"
310 onClick={() => {298 onClick={() => {
311 void handleSubmit();299 void handleSubmit();
312 }}300 }}
313 disabled={props.isSubmitting}301 disabled={props.isSubmitting}
314 className={primaryButtonClassName}
315 >302 >
316 {props.isSubmitting ? "Creating..." : "Create store"}303 {props.isSubmitting ? "Creating..." : "Create store"}
317 </button>304 </Button>
318 </div>305 </div>
319 </div>306 </div>
320 );307 );
plugins/openapi/react/components.tsx+69−61
@@ -13,8 +13,14 @@ import { · 12 unmodified lines
13 useWorkspaceRequestContext,13 useWorkspaceRequestContext,
14} from "@executor/react";14} from "@executor/react";
15import {15import {
16 Alert,
17 Button,
18 Card,
16 DocumentPanel,19 DocumentPanel,
17 IconPencil,20 IconPencil,
21 Input,
22 Label,
23 Select,
18 SourceToolDetailPanel,24 SourceToolDetailPanel,
19 SourceToolExplorer,25 SourceToolExplorer,
20 parseSourceToolExplorerSearch,26 parseSourceToolExplorerSearch,
@@ -381,63 +387,61 @@ function OpenApiSourceForm(props: { · 360 unmodified lines
381 };387 };
382 388
383 return (389 return (
384 <div className="space-y-6 rounded-xl border border-border p-6">390 <Card className="space-y-6 p-6">
385 <Section title="Connection">391 <Section title="Connection">
386 <div className="grid gap-4">392 <div className="grid gap-4">
387 <label className="grid gap-2">393 <div className="grid gap-2">
388 <span className="text-xs font-medium text-foreground">Name</span>394 <Label>Name</Label>
389 <input395 <Input
390 value={name}396 value={name}
391 onChange={(event) => {397 onChange={(event) => {
392 setNameEdited(true);398 setNameEdited(true);
393 setName(event.target.value);399 setName(event.target.value);
394 }}400 }}
395 placeholder="GitHub REST"401 placeholder="GitHub REST"
396 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"
397 />402 />
398 </label>403 </div>
399 404
400 <label className="grid gap-2">405 <div className="grid gap-2">
401 <span className="text-xs font-medium text-foreground">Spec URL</span>406 <Label>Spec URL</Label>
402 <input407 <Input
403 value={specUrl}408 value={specUrl}
404 onChange={(event) => setSpecUrl(event.target.value)}409 onChange={(event) => setSpecUrl(event.target.value)}
405 onBlur={() => {410 onBlur={() => {
406 void runPreview({ mode: "manual" });411 void runPreview({ mode: "manual" });
407 }}412 }}
408 placeholder="https://example.com/openapi.json"413 placeholder="https://example.com/openapi.json"
409 className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"414 className="font-mono text-xs"
410 />415 />
411 </label>416 </div>
412 417
413 <label className="grid gap-2">418 <div className="grid gap-2">
414 <span className="text-xs font-medium text-foreground">Base URL</span>419 <Label>Base URL</Label>
415 <input420 <Input
416 value={baseUrl}421 value={baseUrl}
417 onChange={(event) => {422 onChange={(event) => {
418 setBaseUrlEdited(true);423 setBaseUrlEdited(true);
419 setBaseUrl(event.target.value);424 setBaseUrl(event.target.value);
420 }}425 }}
421 placeholder="https://api.example.com"426 placeholder="https://api.example.com"
422 className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"427 className="font-mono text-xs"
423 />428 />
424 </label>429 </div>
425 430
426 <label className="grid gap-2">431 <div className="grid gap-2">
427 <span className="text-xs font-medium text-foreground">Auth</span>432 <Label>Auth</Label>
428 <select433 <Select
429 value={authKind}434 value={authKind}
430 onChange={(event) =>435 onChange={(event) =>
431 setAuthKind(event.target.value as OpenApiConnectInput["auth"]["kind"])}436 setAuthKind(event.target.value as OpenApiConnectInput["auth"]["kind"])}
432 className="h-9 w-full rounded-lg border border-input bg-background px-3 text-sm text-foreground outline-none transition-colors focus:border-ring focus:ring-1 focus:ring-ring/25"
433 >437 >
434 <option value="none">None</option>438 <option value="none">None</option>
435 <option value="bearer">Bearer Secret</option>439 <option value="bearer">Bearer Secret</option>
436 </select>440 </Select>
437 </label>441 </div>
438 442
439 {authKind === "bearer" && (443 {authKind === "bearer" && (
440 <div className="space-y-4 border-l-2 border-border pl-4">444 <div className="space-y-4 rounded-lg border border-border bg-muted/20 p-4">
441 <SecretReferenceField445 <SecretReferenceField
442 label="Secret"446 label="Secret"
443 value={tokenSecretRef}447 value={tokenSecretRef}
@@ -448,25 +452,25 @@ function OpenApiSourceForm(props: { · 4 unmodified lines
448 />452 />
449 453
450 <div className="grid gap-4 sm:grid-cols-2">454 <div className="grid gap-4 sm:grid-cols-2">
451 <label className="grid gap-2">455 <div className="grid gap-2">
452 <span className="text-xs font-medium text-foreground">Header Name</span>456 <Label>Header Name</Label>
453 <input457 <Input
454 value={authHeaderName}458 value={authHeaderName}
455 onChange={(event) => setAuthHeaderName(event.target.value)}459 onChange={(event) => setAuthHeaderName(event.target.value)}
456 placeholder={DEFAULT_BEARER_HEADER_NAME}460 placeholder={DEFAULT_BEARER_HEADER_NAME}
457 className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"461 className="font-mono text-xs"
458 />462 />
459 </label>463 </div>
460 464
461 <label className="grid gap-2">465 <div className="grid gap-2">
462 <span className="text-xs font-medium text-foreground">Prefix</span>466 <Label>Prefix</Label>
463 <input467 <Input
464 value={authPrefix}468 value={authPrefix}
465 onChange={(event) => setAuthPrefix(event.target.value)}469 onChange={(event) => setAuthPrefix(event.target.value)}
466 placeholder={DEFAULT_BEARER_PREFIX}470 placeholder={DEFAULT_BEARER_PREFIX}
467 className="h-9 w-full rounded-lg border border-input bg-background px-3 font-mono text-xs text-foreground outline-none transition-colors placeholder:text-muted-foreground/40 focus:border-ring focus:ring-1 focus:ring-ring/25"471 className="font-mono text-xs"
468 />472 />
469 </label>473 </div>
470 </div>474 </div>
471 </div>475 </div>
472 )}476 )}
@@ -475,16 +479,16 @@ function OpenApiSourceForm(props: { · 2 unmodified lines
475 479
476 <Section title="Preview">480 <Section title="Preview">
477 <div className="flex items-center gap-3">481 <div className="flex items-center gap-3">
478 <button482 <Button
483 variant="outline"
479 type="button"484 type="button"
480 onClick={() => {485 onClick={() => {
481 void runPreview({ mode: "manual" });486 void runPreview({ mode: "manual" });
482 }}487 }}
483 disabled={previewMutation.status === "pending" || submitMutation.status === "pending"}488 disabled={previewMutation.status === "pending" || submitMutation.status === "pending"}
484 className="inline-flex h-9 items-center justify-center rounded-lg border border-input bg-card px-3 text-sm font-medium text-foreground transition-colors hover:bg-accent/50 disabled:pointer-events-none disabled:opacity-50"
485 >489 >
486 {previewMutation.status === "pending" ? "Previewing..." : "Preview Spec"}490 {previewMutation.status === "pending" ? "Previewing..." : "Preview Spec"}
487 </button>491 </Button>
488 {preview && (492 {preview && (
489 <div className="text-xs text-muted-foreground">493 <div className="text-xs text-muted-foreground">
490 {preview.operationCount} operations494 {preview.operationCount} operations
@@ -519,33 +523,32 @@ function OpenApiSourceForm(props: { · 28 unmodified lines
519 )}523 )}
520 </dl>524 </dl>
521 {preview.warnings.length > 0 && (525 {preview.warnings.length > 0 && (
522 <div className="mt-3 rounded-md border border-amber-300/40 bg-amber-100/20 px-3 py-2 text-xs text-amber-800">526 <Alert variant="warning" className="mt-3 text-xs">
523 {preview.warnings.join(" ")}527 {preview.warnings.join(" ")}
524 </div>528 </Alert>
525 )}529 )}
526 </div>530 </div>
527 )}531 )}
528 </Section>532 </Section>
529 533
530 {error && (534 {error && (
531 <div className="rounded-lg border border-destructive/30 bg-destructive/8 px-4 py-2.5 text-sm text-destructive">535 <Alert variant="destructive">
532 {error}536 {error}
533 </div>537 </Alert>
534 )}538 )}
535 539
536 <div className="flex items-center justify-end">540 <div className="flex items-center justify-end">
537 <button541 <Button
538 type="button"542 type="button"
539 onClick={() => {543 onClick={() => {
540 void handleSubmit();544 void handleSubmit();
541 }}545 }}
542 disabled={submitMutation.status === "pending"}546 disabled={submitMutation.status === "pending"}
543 className="inline-flex h-9 items-center justify-center rounded-lg bg-primary px-4 text-sm font-medium text-primary-foreground transition-opacity hover:opacity-90 disabled:pointer-events-none disabled:opacity-50"
544 >547 >
545 {submitMutation.status === "pending" ? props.busyLabel : props.submitLabel}548 {submitMutation.status === "pending" ? props.busyLabel : props.submitLabel}
546 </button>549 </Button>
547 </div>550 </div>
548 </div>551 </Card>
549 );552 );
550}553}
551 554
@@ -641,9 +644,9 @@ function OpenApiEditSourcePageReady(props: { · 89 unmodified lines
641 if (Result.isFailure(configResult)) {644 if (Result.isFailure(configResult)) {
642 return (645 return (
643 <Section title="Edit Source">646 <Section title="Edit Source">
644 <div className="rounded-lg border border-destructive/30 bg-destructive/8 p-4 text-sm text-destructive">647 <Alert variant="destructive">
645 Failed loading source configuration.648 Failed loading source configuration.
646 </div>649 </Alert>
647 </Section>650 </Section>
648 );651 );
649 }652 }
@@ -778,38 +781,43 @@ function OpenApiSourceDetailPageReady(props: { · 128 unmodified lines
778 })}781 })}
779 actions={(782 actions={(
780 <>783 <>
781 <button784 <Button
785 variant="outline"
786 size="sm"
782 type="button"787 type="button"
783 onClick={() => {788 onClick={() => {
784 void refreshMutation.mutateAsync(props.source.id);789 void refreshMutation.mutateAsync(props.source.id);
785 }}790 }}
786 disabled={refreshMutation.status === "pending"}791 disabled={refreshMutation.status === "pending"}
787 className="inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:pointer-events-none disabled:opacity-50"
788 >792 >
789 {refreshMutation.status === "pending" ? "Refreshing..." : "Refresh"}793 {refreshMutation.status === "pending" ? "Refreshing..." : "Refresh"}
790 </button>794 </Button>
791 <button795 <Button
796 variant="outline"
797 size="sm"
792 type="button"798 type="button"
793 onClick={() => void navigation.edit(props.source.id)}799 onClick={() => void navigation.edit(props.source.id)}
794 className="inline-flex items-center gap-1.5 rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground"
795 >800 >
796 <IconPencil className="size-3" />801 <IconPencil className="size-3" />
797 Edit802 Edit
798 </button>803 </Button>
799 {confirmDelete ? (804 {confirmDelete ? (
800 <div className="flex items-center gap-2">805 <div className="flex items-center gap-2">
801 <span className="text-[11px] font-medium text-destructive">806 <span className="text-[11px] font-medium text-destructive">
802 Confirm delete?807 Confirm delete?
803 </span>808 </span>
804 <button809 <Button
810 variant="outline"
811 size="sm"
805 type="button"812 type="button"
806 onClick={() => setConfirmDelete(false)}813 onClick={() => setConfirmDelete(false)}
807 disabled={removeMutation.status === "pending"}814 disabled={removeMutation.status === "pending"}
808 className="inline-flex items-center rounded-md border border-border bg-card px-2.5 py-1 text-[12px] font-medium text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground disabled:pointer-events-none disabled:opacity-50"
809 >815 >
810 Cancel816 Cancel
811 </button>817 </Button>
812 <button818 <Button
819 variant="destructive-outline"
820 size="sm"
813 type="button"821 type="button"
814 onClick={() => {822 onClick={() => {
815 void removeMutation.mutateAsync(props.source.id).then(() => {823 void removeMutation.mutateAsync(props.source.id).then(() => {
@@ -821,20 +829,20 @@ function OpenApiSourceDetailPageReady(props: { · 5 unmodified lines
821 });829 });
822 }}830 }}
823 disabled={removeMutation.status === "pending"}831 disabled={removeMutation.status === "pending"}
824 className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
825 >832 >
826 {removeMutation.status === "pending" ? "Deleting..." : "Delete"}833 {removeMutation.status === "pending" ? "Deleting..." : "Delete"}
827 </button>834 </Button>
828 </div>835 </div>
829 ) : (836 ) : (
830 <button837 <Button
838 variant="destructive-outline"
839 size="sm"
831 type="button"840 type="button"
832 onClick={() => setConfirmDelete(true)}841 onClick={() => setConfirmDelete(true)}
833 disabled={removeMutation.status === "pending"}842 disabled={removeMutation.status === "pending"}
834 className="inline-flex items-center rounded-md border border-destructive/25 bg-destructive/5 px-2.5 py-1 text-[12px] font-medium text-destructive transition-colors hover:bg-destructive/10 disabled:pointer-events-none disabled:opacity-50"
835 >843 >
836 Delete844 Delete
837 </button>845 </Button>
838 )}846 )}
839 </>847 </>
840 )}848 )}