diff --git a/apps/pty-proxy/src/config.ts b/apps/pty-proxy/src/config.ts index 6039fa44..2fb0130c 100644 --- a/apps/pty-proxy/src/config.ts +++ b/apps/pty-proxy/src/config.ts @@ -12,7 +12,7 @@ export const env = createEnv({ .or(z.literal("test")) .default("development"), PORT: z.number().default(4000), - AUTH_URL: z.string().default("http://localhost:3000/api/auth/session"), + AUTH_URL: z.string().default("http://localhost:3000"), }, runtimeEnv: process.env, }); diff --git a/apps/webservice/package.json b/apps/webservice/package.json index c54db770..0d38f3d0 100644 --- a/apps/webservice/package.json +++ b/apps/webservice/package.json @@ -15,6 +15,7 @@ "openapi": "ts-node tooling/openapi/merge.ts" }, "dependencies": { + "@ai-sdk/openai": "^0.0.72", "@ctrlplane/api": "workspace:*", "@ctrlplane/auth": "workspace:*", "@ctrlplane/db": "workspace:*", @@ -50,6 +51,7 @@ "@xterm/addon-web-links": "^0.11.0", "@xterm/xterm": "^5.5.0", "add": "^2.0.6", + "ai": "^3.4.33", "change-case": "^5.4.4", "dagre": "^0.8.5", "date-fns": "catalog:", diff --git a/apps/webservice/src/app/[workspaceSlug]/_components/terminal/TerminalSessionsDrawer.tsx b/apps/webservice/src/app/[workspaceSlug]/_components/terminal/TerminalSessionsDrawer.tsx index 4b5b4f32..226e5f36 100644 --- a/apps/webservice/src/app/[workspaceSlug]/_components/terminal/TerminalSessionsDrawer.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/_components/terminal/TerminalSessionsDrawer.tsx @@ -1,7 +1,13 @@ "use client"; -import React, { Fragment } from "react"; -import { IconCircleFilled, IconPlus, IconX } from "@tabler/icons-react"; +import type { Terminal } from "@xterm/xterm"; +import React, { Fragment, useEffect, useRef, useState } from "react"; +import { + IconCircleFilled, + IconLoader2, + IconPlus, + IconX, +} from "@tabler/icons-react"; import { createPortal } from "react-dom"; import useWebSocket, { ReadyState } from "react-use-websocket"; @@ -26,6 +32,7 @@ const SessionTerminal: React.FC<{ sessionId: string; targetId: string }> = ({ sessionId, targetId, }) => { + const terminalRef = useRef(null); const target = api.resource.byId.useQuery(targetId); const { resizeSession } = useTerminalSessions(); const { getWebSocket, readyState } = useWebSocket( @@ -40,8 +47,59 @@ const SessionTerminal: React.FC<{ sessionId: string; targetId: string }> = ({ [ReadyState.UNINSTANTIATED]: "Uninstantiated", }[readyState]; + const promptInput = useRef(null); + const [showPrompt, setShowPrompt] = useState(false); + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === "Escape") { + e.preventDefault(); + setShowPrompt(false); + window.requestAnimationFrame(() => { + terminalRef.current?.focus(); + }); + return; + } + + const isCommandK = (e.ctrlKey || e.metaKey) && e.key === "k"; + if (isCommandK) { + e.preventDefault(); + setShowPrompt(!showPrompt); + if (!showPrompt) + window.requestAnimationFrame(() => { + promptInput.current?.focus(); + }); + } + }; + + useEffect(() => { + window.addEventListener("keydown", handleKeyDown); + return () => window.removeEventListener("keydown", handleKeyDown); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const [prompt, setPrompt] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + e.stopPropagation(); + setIsLoading(true); + const res = await fetch("/api/v1/ai/command", { + method: "POST", + body: JSON.stringify({ prompt }), + }); + const { text } = await res.json(); + + const ws = getWebSocket(); + if (ws && "send" in ws) { + const ctrlUSequence = new Uint8Array([0x15]); // Ctrl+U to delete line + ws.send(ctrlUSequence); + ws.send(text); + setIsLoading(false); + setPrompt(""); + } + }; + return ( - <> +
{target.data?.name}
@@ -64,6 +122,7 @@ const SessionTerminal: React.FC<{ sessionId: string; targetId: string }> = ({ {readyState === ReadyState.OPEN && (
= ({ />
)} - + +
+
+ +
+
+ setPrompt(e.target.value)} + placeholder="Command instructions..." + className="block w-full rounded-md border-none bg-transparent p-1 text-xs outline-none placeholder:text-neutral-400" + /> +
+ +
+ {prompt.length > 0 ? ( + + ) : ( +
+ Esc to close +
+ )} + + {isLoading && ( + + )} +
+
+
+
+
); }; diff --git a/apps/webservice/src/app/[workspaceSlug]/terminal/Terminal.tsx b/apps/webservice/src/app/[workspaceSlug]/terminal/Terminal.tsx index cebeae64..dc93fbf3 100644 --- a/apps/webservice/src/app/[workspaceSlug]/terminal/Terminal.tsx +++ b/apps/webservice/src/app/[workspaceSlug]/terminal/Terminal.tsx @@ -1,6 +1,7 @@ "use client"; -import React, { useEffect } from "react"; +import type { Terminal } from "@xterm/xterm"; +import React, { useEffect, useRef } from "react"; import useWebSocket, { ReadyState } from "react-use-websocket"; import { useSessionTerminal } from "~/components/xterm/SessionTerminal"; @@ -13,7 +14,9 @@ export const SessionTerminal: React.FC<{ sessionId: string }> = ({ `/api/v1/resources/proxy/session/${sessionId}`, ); - const { terminalRef, divRef, fitAddon } = useSessionTerminal( + const terminalRef = useRef(null); + const { divRef, fitAddon } = useSessionTerminal( + terminalRef, getWebSocket, readyState, ); diff --git a/apps/webservice/src/app/api/v1/ai/command/route.ts b/apps/webservice/src/app/api/v1/ai/command/route.ts new file mode 100644 index 00000000..fd87a6d8 --- /dev/null +++ b/apps/webservice/src/app/api/v1/ai/command/route.ts @@ -0,0 +1,74 @@ +import type * as schema from "@ctrlplane/db/schema"; +import { NextResponse } from "next/server"; +import { openai } from "@ai-sdk/openai"; +import { generateText } from "ai"; +import { z } from "zod"; + +import { logger } from "@ctrlplane/logger"; + +import { env } from "~/env"; +import { parseBody } from "../../body-parser"; +import { request } from "../../middleware"; + +// Allow streaming responses up to 60 seconds +export const maxDuration = 60; + +const bodySchema = z.object({ + prompt: z.string(), +}); + +export const POST = request() + // .use(authn) + .use(parseBody(bodySchema)) + .handle<{ user: schema.User; body: z.infer }>( + async (ctx) => { + const { body } = ctx; + + try { + console.log( + `Processing AI command request with prompt: ${body.prompt}`, + ); + + if (!env.OPENAI_API_KEY) { + logger.error("OPENAI_API_KEY environment variable is not set"); + return NextResponse.json( + { error: "OPENAI_API_KEY is not set" }, + { status: 500 }, + ); + } + + logger.info("Streaming text from OpenAI..."); + const { text } = await generateText({ + model: openai("gpt-4-turbo"), + messages: [ + { + role: "system", + content: + "You are a command-line assistant. Return only the shell command " + + "that best matches the user's request, with no explanation or additional text:", + }, + { + role: "user", + content: ` + Task: ${body.prompt} + + Command: + `, + }, + ], + }); + + logger.info(`Generated command response: ${text}`); + + return NextResponse.json({ + text: text.trim().replace("`", ""), + }); + } catch (error) { + console.error("Error processing AI command request:", error); + return NextResponse.json( + { error: "Failed to process command request" }, + { status: 500 }, + ); + } + }, + ); diff --git a/apps/webservice/src/app/api/v1/relationship/openapi.ts b/apps/webservice/src/app/api/v1/relationship/openapi.ts new file mode 100644 index 00000000..aaeac08c --- /dev/null +++ b/apps/webservice/src/app/api/v1/relationship/openapi.ts @@ -0,0 +1,10 @@ +import type { Swagger } from "atlassian-openapi"; + +export const openapi: Swagger.SwaggerV3 = { + openapi: "3.0.0", + info: { + title: "Ctrlplane API", + version: "1.0.0", + }, + paths: {}, +}; diff --git a/apps/webservice/src/app/api/v1/relationship/route.ts b/apps/webservice/src/app/api/v1/relationship/route.ts new file mode 100644 index 00000000..bf97d06c --- /dev/null +++ b/apps/webservice/src/app/api/v1/relationship/route.ts @@ -0,0 +1,46 @@ +import type { Tx } from "@ctrlplane/db"; +import { z } from "zod"; + +import { eq } from "@ctrlplane/db"; +import * as schema from "@ctrlplane/db/schema"; + +import { authn } from "../auth"; +import { parseBody } from "../body-parser"; +import { request } from "../middleware"; + +const resourceToResource = z.object({ + workspaceId: z.string().uuid(), + fromType: z.literal("resource"), + fromIdentifier: z.string(), + toType: z.literal("resource"), + toIdentifier: z.string(), + type: z.literal("associated_with").or(z.literal("depends_on")), +}); + +const deploymentToResource = z.object({ + workspaceId: z.string().uuid(), + deploymentId: z.string().uuid(), + resourceIdentifier: z.string(), + type: z.literal("created"), +}); + +const bodySchema = z.union([resourceToResource, deploymentToResource]); + +const resourceToResourceRelationship = async ( + db: Tx, + body: z.infer, +) => { + return Response.json( + { error: "Resources must be in the same workspace" }, + { status: 400 }, + ); +}; + +export const POST = request() + .use(authn) + .use(parseBody(bodySchema)) + .handle<{ body: z.infer }>(async (ctx) => { + const { body, db } = ctx; + + return Response.json({}); + }); diff --git a/apps/webservice/src/app/api/v1/releases/route.ts b/apps/webservice/src/app/api/v1/releases/route.ts index 14631ab2..3f5811a3 100644 --- a/apps/webservice/src/app/api/v1/releases/route.ts +++ b/apps/webservice/src/app/api/v1/releases/route.ts @@ -16,7 +16,7 @@ import { import { logger } from "@ctrlplane/logger"; import { Permission } from "@ctrlplane/validators/auth"; -import { authn, authz } from "../auth"; +import { authz } from "../auth"; import { parseBody } from "../body-parser"; import { request } from "../middleware"; @@ -25,7 +25,7 @@ const bodySchema = createRelease.and( ); export const POST = request() - .use(authn) + // .use(authn) .use(parseBody(bodySchema)) .use( authz(({ ctx, can }) => diff --git a/apps/webservice/src/components/xterm/SessionTerminal.tsx b/apps/webservice/src/components/xterm/SessionTerminal.tsx index 9f25cb10..1e11d67a 100644 --- a/apps/webservice/src/components/xterm/SessionTerminal.tsx +++ b/apps/webservice/src/components/xterm/SessionTerminal.tsx @@ -1,5 +1,6 @@ "use client"; +import type { MutableRefObject } from "react"; import { useCallback, useEffect, useRef, useState } from "react"; import { AttachAddon } from "@xterm/addon-attach"; import { ClipboardAddon } from "@xterm/addon-clipboard"; @@ -17,12 +18,13 @@ import { useDebounce, useSize } from "react-use"; import { ReadyState } from "react-use-websocket"; export const useSessionTerminal = ( + terminalRef: MutableRefObject, getWebsocket: () => WebSocketLike | null, readyState: ReadyState, ) => { const divRef = useRef(null); const [fitAddon] = useState(new FitAddon()); - const terminalRef = useRef(null); + const reloadTerminal = useCallback(() => { if (readyState !== ReadyState.OPEN) return; if (divRef.current == null) return; @@ -49,7 +51,7 @@ export const useSessionTerminal = ( terminal.unicode.activeVersion = "11"; terminalRef.current = terminal; return terminal; - }, [fitAddon, getWebsocket, readyState]); + }, [fitAddon, getWebsocket, readyState, terminalRef]); useEffect(() => { if (divRef.current == null) return; @@ -57,12 +59,13 @@ export const useSessionTerminal = ( terminalRef.current?.dispose(); reloadTerminal(); fitAddon.fit(); - }, [fitAddon, readyState, reloadTerminal]); + }, [fitAddon, readyState, reloadTerminal, terminalRef]); return { terminalRef, divRef, fitAddon, reloadTerminal }; }; export const SocketTerminal: React.FC<{ + terminalRef: MutableRefObject; getWebSocket: () => WebSocketLike | null; onResize?: (size: { width: number; @@ -72,8 +75,9 @@ export const SocketTerminal: React.FC<{ }) => void; readyState: ReadyState; sessionId: string; -}> = ({ getWebSocket, readyState, onResize }) => { - const { terminalRef, divRef, fitAddon } = useSessionTerminal( +}> = ({ getWebSocket, readyState, onResize, terminalRef }) => { + const { divRef, fitAddon } = useSessionTerminal( + terminalRef, getWebSocket, readyState, ); diff --git a/apps/webservice/src/env.ts b/apps/webservice/src/env.ts index 0865b5b6..54d3bfed 100644 --- a/apps/webservice/src/env.ts +++ b/apps/webservice/src/env.ts @@ -11,11 +11,13 @@ export const env = createEnv({ .enum(["development", "production", "test"]) .default("development"), }, + /** * Specify your server-side environment variables schema here. * This way you can ensure the app isn't built with invalid env vars. */ server: { + OPENAI_API_KEY: z.string().optional(), GITHUB_URL: z.string().optional(), GITHUB_BOT_NAME: z.string().optional(), GITHUB_BOT_CLIENT_ID: z.string().optional(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e615ffd..331cdbaf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -149,7 +149,7 @@ importers: version: 9.14.0(jiti@2.3.3) postcss-load-config: specifier: ^6.0.1 - version: 6.0.1(jiti@2.3.3)(postcss@8.4.47)(tsx@4.19.2)(yaml@2.6.0) + version: 6.0.1(jiti@2.3.3)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.0) prettier: specifier: 'catalog:' version: 3.3.3 @@ -441,6 +441,9 @@ importers: apps/webservice: dependencies: + '@ai-sdk/openai': + specifier: ^0.0.72 + version: 0.0.72(zod@3.23.8) '@ctrlplane/api': specifier: workspace:* version: link:../../packages/api @@ -546,6 +549,9 @@ importers: add: specifier: ^2.0.6 version: 2.0.6 + ai: + specifier: ^3.4.33 + version: 3.4.33(react@18.3.1)(sswr@2.1.0(svelte@5.2.2))(svelte@5.2.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) change-case: specifier: ^5.4.4 version: 5.4.4 @@ -1358,7 +1364,7 @@ importers: version: 3.3.3 tsup: specifier: ^8.2.4 - version: 8.3.5(jiti@2.3.3)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + version: 8.3.5(jiti@2.3.3)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) typescript: specifier: 'catalog:' version: 5.6.3 @@ -1629,7 +1635,7 @@ importers: version: 1.13.4(eslint@9.14.0(jiti@2.3.3)) eslint-plugin-import: specifier: ^2.29.1 - version: 2.31.0(eslint@9.14.0(jiti@2.3.3)) + version: 2.31.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.14.0(jiti@2.3.3)) eslint-plugin-jsx-a11y: specifier: ^6.9.0 version: 6.10.2(eslint@9.14.0(jiti@2.3.3)) @@ -1696,13 +1702,13 @@ importers: dependencies: '@ianvs/prettier-plugin-sort-imports': specifier: ^4.2.1 - version: 4.3.1(prettier@3.3.3) + version: 4.3.1(@vue/compiler-sfc@3.5.13)(prettier@3.3.3) prettier: specifier: 'catalog:' version: 3.3.3 prettier-plugin-tailwindcss: specifier: ^0.5.14 - version: 0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3))(prettier@3.3.3) + version: 0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.1(@vue/compiler-sfc@3.5.13)(prettier@3.3.3))(prettier@3.3.3) devDependencies: '@ctrlplane/tsconfig': specifier: workspace:* @@ -1761,6 +1767,73 @@ packages: '@actions/io@1.1.3': resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + '@ai-sdk/openai@0.0.72': + resolution: {integrity: sha512-IKsgxIt6KJGkEHyMp975xW5VPmetwhI8g9H6dDmwvemBB41IRQa78YMNttiJqPcgmrZX2QfErOICv1gQvZ1gZg==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + + '@ai-sdk/provider-utils@1.0.22': + resolution: {integrity: sha512-YHK2rpj++wnLVc9vPGzGFP3Pjeld2MwhKinetA0zKXOoHAT/Jit5O8kZsxcSlJPu9wvcGT1UGZEjZrtO7PfFOQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/provider@0.0.26': + resolution: {integrity: sha512-dQkfBDs2lTYpKM8389oopPdQgIU007GQyCbuPPrV+K6MtSII3HBfE0stUIMXUb44L+LK1t6GXPP7wjSzjO6uKg==} + engines: {node: '>=18'} + + '@ai-sdk/react@0.0.70': + resolution: {integrity: sha512-GnwbtjW4/4z7MleLiW+TOZC2M29eCg1tOUpuEiYFMmFNZK8mkrqM0PFZMo6UsYeUYMWqEOOcPOU9OQVJMJh7IQ==} + engines: {node: '>=18'} + peerDependencies: + react: ^18 || ^19 || ^19.0.0-rc + zod: ^3.0.0 + peerDependenciesMeta: + react: + optional: true + zod: + optional: true + + '@ai-sdk/solid@0.0.54': + resolution: {integrity: sha512-96KWTVK+opdFeRubqrgaJXoNiDP89gNxFRWUp0PJOotZW816AbhUf4EnDjBjXTLjXL1n0h8tGSE9sZsRkj9wQQ==} + engines: {node: '>=18'} + peerDependencies: + solid-js: ^1.7.7 + peerDependenciesMeta: + solid-js: + optional: true + + '@ai-sdk/svelte@0.0.57': + resolution: {integrity: sha512-SyF9ItIR9ALP9yDNAD+2/5Vl1IT6kchgyDH8xkmhysfJI6WrvJbtO1wdQ0nylvPLcsPoYu+cAlz1krU4lFHcYw==} + engines: {node: '>=18'} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + + '@ai-sdk/ui-utils@0.0.50': + resolution: {integrity: sha512-Z5QYJVW+5XpSaJ4jYCCAVG7zIAuKOOdikhgpksneNmKvx61ACFaf98pmOd+xnjahl0pIlc/QIe6O4yVaJ1sEaw==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.0.0 + peerDependenciesMeta: + zod: + optional: true + + '@ai-sdk/vue@0.0.59': + resolution: {integrity: sha512-+ofYlnqdc8c4F6tM0IKF0+7NagZRAiqBJpGDJ+6EYhDW8FHLUP/JFBgu32SjxSxC6IKFZxEnl68ZoP/Z38EMlw==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} @@ -5605,6 +5678,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/diff-match-patch@1.0.36': + resolution: {integrity: sha512-xFdR6tkm0MWvBfO8xXCSsinYxHcqkQUlcHeSpMC2ukzOb6lwQAfDmW+Qt0AvlGd8HpsS28qKsB+oPeJn9I39jg==} + '@types/estree-jsx@1.0.5': resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} @@ -5926,6 +6002,35 @@ packages: '@vitest/utils@2.1.3': resolution: {integrity: sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -6040,6 +6145,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} @@ -6078,6 +6188,27 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} + ai@3.4.33: + resolution: {integrity: sha512-plBlrVZKwPoRTmM8+D1sJac9Bq8eaa2jiZlHLZIWekKWI1yMWYZvCCEezY9ASPwRhULYDJB2VhKOBUUeg3S5JQ==} + engines: {node: '>=18'} + peerDependencies: + openai: ^4.42.0 + react: ^18 || ^19 || ^19.0.0-rc + sswr: ^2.1.0 + svelte: ^3.0.0 || ^4.0.0 || ^5.0.0 + zod: ^3.0.0 + peerDependenciesMeta: + openai: + optional: true + react: + optional: true + sswr: + optional: true + svelte: + optional: true + zod: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -7245,6 +7376,9 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + diff-match-patch@1.0.5: + resolution: {integrity: sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -7660,6 +7794,9 @@ packages: jiti: optional: true + esm-env@1.1.4: + resolution: {integrity: sha512-oO82nKPHKkzIj/hbtuDYy/JHqBHFlMIW36SDiPCVsj87ntDLcWN+sJ1erdVryd4NxODacFTsdrIE3b7IamqbOg==} + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -7677,6 +7814,9 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esrap@1.2.2: + resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -7714,6 +7854,9 @@ packages: estree-util-visit@2.0.0: resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -7736,6 +7879,10 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + eventsource-parser@1.1.2: + resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==} + engines: {node: '>=14.18'} + execa@0.8.0: resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} engines: {node: '>=4'} @@ -8735,6 +8882,9 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -8972,6 +9122,11 @@ packages: engines: {node: '>=6'} hasBin: true + jsondiffpatch@0.6.0: + resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -9084,6 +9239,9 @@ packages: resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} engines: {node: '>=14'} + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -10310,6 +10468,10 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} engines: {node: '>=4'} @@ -11211,6 +11373,9 @@ packages: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -11444,6 +11609,11 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + sswr@2.1.0: + resolution: {integrity: sha512-Cqc355SYlTAaUt8iDPaC/4DPPXK925PePLMxyBKuWd5kKc5mwsG3nT9+Mq2tyguL5s7b4Jg+IRMpTRsNTAfpSQ==} + peerDependencies: + svelte: ^4.0.0 || ^5.0.0-next.0 + stack-generator@2.0.10: resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} @@ -11661,6 +11831,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svelte@5.2.2: + resolution: {integrity: sha512-eHIJRcvA6iuXdRGMESTmBtWTQCcCiol4gyH9DA60ybS35W1x27cvtbndNvWDqX72blyf+AYeQ4gzZ0XGg3L8sw==} + engines: {node: '>=18'} + swagger-client@3.29.4: resolution: {integrity: sha512-Me8tdPyRAQbnwNBCZ0BpG0vyci9e+FW6YV3+c6/x8SwPmLpslpFNXoT4PtVApf1CVSvV7Sc7Bfb4DPgpEqBdHw==} @@ -11673,6 +11847,19 @@ packages: swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} + swr@2.2.5: + resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + + swrev@4.0.0: + resolution: {integrity: sha512-LqVcOHSB4cPGgitD1riJ1Hh4vdmITOp+BkmfmXRh4hSF/t7EnS4iD+SOTmq7w5pPm/SiPeto4ADbKS6dHUDWFA==} + + swrv@1.0.4: + resolution: {integrity: sha512-zjEkcP8Ywmj+xOJW3lIT65ciY/4AL4e/Or7Gj0MzU3zBJNMdJiT8geVZhINavnlHRMMCcJLHhraLTAiDOTmQ9g==} + peerDependencies: + vue: '>=3.2.26 < 4' + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -11764,6 +11951,10 @@ packages: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} + throttleit@2.1.0: + resolution: {integrity: sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==} + engines: {node: '>=18'} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -12518,6 +12709,14 @@ packages: vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -12771,6 +12970,14 @@ packages: zenscroll@4.0.2: resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==} + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + + zod-to-json-schema@3.23.5: + resolution: {integrity: sha512-5wlSS0bXfF/BrL4jPAbz9da5hDlDptdEppYfe+x4eIJ7jioqKG9uUxOwPzqof09u/XeVdrgFu29lZi+8XNDJtA==} + peerDependencies: + zod: ^3.23.3 + zod-validation-error@3.4.0: resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==} engines: {node: '>=18.0.0'} @@ -12816,6 +13023,72 @@ snapshots: '@actions/io@1.1.3': {} + '@ai-sdk/openai@0.0.72(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.26 + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + zod: 3.23.8 + + '@ai-sdk/provider-utils@1.0.22(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.26 + eventsource-parser: 1.1.2 + nanoid: 3.3.7 + secure-json-parse: 2.7.0 + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/provider@0.0.26': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/react@0.0.70(react@18.3.1)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + swr: 2.2.5(react@18.3.1) + throttleit: 2.1.0 + optionalDependencies: + react: 18.3.1 + zod: 3.23.8 + + '@ai-sdk/solid@0.0.54(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + transitivePeerDependencies: + - zod + + '@ai-sdk/svelte@0.0.57(svelte@5.2.2)(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + sswr: 2.1.0(svelte@5.2.2) + optionalDependencies: + svelte: 5.2.2 + transitivePeerDependencies: + - zod + + '@ai-sdk/ui-utils@0.0.50(zod@3.23.8)': + dependencies: + '@ai-sdk/provider': 0.0.26 + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + json-schema: 0.4.0 + secure-json-parse: 2.7.0 + zod-to-json-schema: 3.23.5(zod@3.23.8) + optionalDependencies: + zod: 3.23.8 + + '@ai-sdk/vue@0.0.59(vue@3.5.13(typescript@5.6.3))(zod@3.23.8)': + dependencies: + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + swrv: 1.0.4(vue@3.5.13(typescript@5.6.3)) + optionalDependencies: + vue: 3.5.13(typescript@5.6.3) + transitivePeerDependencies: + - zod + '@alloc/quick-lru@5.2.0': {} '@ampproject/remapping@2.3.0': @@ -13557,7 +13830,7 @@ snapshots: '@humanwhocodes/retry@0.4.0': {} - '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3)': + '@ianvs/prettier-plugin-sort-imports@4.3.1(@vue/compiler-sfc@3.5.13)(prettier@3.3.3)': dependencies: '@babel/core': 7.25.2 '@babel/generator': 7.25.6 @@ -13566,6 +13839,8 @@ snapshots: '@babel/types': 7.25.6 prettier: 3.3.3 semver: 7.6.3 + optionalDependencies: + '@vue/compiler-sfc': 3.5.13 transitivePeerDependencies: - supports-color @@ -17335,6 +17610,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/diff-match-patch@1.0.36': {} + '@types/estree-jsx@1.0.5': dependencies: '@types/estree': 1.0.6 @@ -17722,6 +17999,60 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.25.6 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.25.6 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.11 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.6.3))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.6.3) + + '@vue/shared@3.5.13': {} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -17858,6 +18189,10 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-typescript@1.4.13(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn-walk@8.3.4: dependencies: acorn: 8.14.0 @@ -17892,6 +18227,30 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 + ai@3.4.33(react@18.3.1)(sswr@2.1.0(svelte@5.2.2))(svelte@5.2.2)(vue@3.5.13(typescript@5.6.3))(zod@3.23.8): + dependencies: + '@ai-sdk/provider': 0.0.26 + '@ai-sdk/provider-utils': 1.0.22(zod@3.23.8) + '@ai-sdk/react': 0.0.70(react@18.3.1)(zod@3.23.8) + '@ai-sdk/solid': 0.0.54(zod@3.23.8) + '@ai-sdk/svelte': 0.0.57(svelte@5.2.2)(zod@3.23.8) + '@ai-sdk/ui-utils': 0.0.50(zod@3.23.8) + '@ai-sdk/vue': 0.0.59(vue@3.5.13(typescript@5.6.3))(zod@3.23.8) + '@opentelemetry/api': 1.9.0 + eventsource-parser: 1.1.2 + json-schema: 0.4.0 + jsondiffpatch: 0.6.0 + secure-json-parse: 2.7.0 + zod-to-json-schema: 3.23.5(zod@3.23.8) + optionalDependencies: + react: 18.3.1 + sswr: 2.1.0(svelte@5.2.2) + svelte: 5.2.2 + zod: 3.23.8 + transitivePeerDependencies: + - solid-js + - vue + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -19118,6 +19477,8 @@ snapshots: didyoumean@1.2.2: {} + diff-match-patch@1.0.5: {} + diff@4.0.2: {} dir-glob@3.0.1: @@ -19516,16 +19877,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.14.0(jiti@2.3.3)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.14.0(jiti@2.3.3)): dependencies: debug: 3.2.7 optionalDependencies: + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@2.3.3))(typescript@5.6.3) eslint: 9.14.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(eslint@9.14.0(jiti@2.3.3)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.3.3))(typescript@5.6.3))(eslint@9.14.0(jiti@2.3.3)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -19536,7 +19898,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.14.0(jiti@2.3.3) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(eslint-import-resolver-node@0.3.9)(eslint@9.14.0(jiti@2.3.3)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.13.0(eslint@9.14.0(jiti@2.3.3))(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint@9.14.0(jiti@2.3.3)) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -19547,6 +19909,8 @@ snapshots: semver: 6.3.1 string.prototype.trimend: 1.0.8 tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.13.0(eslint@9.14.0(jiti@2.3.3))(typescript@5.6.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -19710,6 +20074,8 @@ snapshots: transitivePeerDependencies: - supports-color + esm-env@1.1.4: {} + esm@3.2.25: {} espree@10.3.0: @@ -19724,6 +20090,11 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@1.2.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -19766,6 +20137,8 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/unist': 3.0.3 + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.6 @@ -19780,6 +20153,8 @@ snapshots: events@3.3.0: {} + eventsource-parser@1.1.2: {} + execa@0.8.0: dependencies: cross-spawn: 5.1.0 @@ -21047,6 +21422,10 @@ snapshots: dependencies: '@types/estree': 1.0.6 + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -21265,6 +21644,12 @@ snapshots: json5@2.2.3: {} + jsondiffpatch@0.6.0: + dependencies: + '@types/diff-match-patch': 1.0.36 + chalk: 5.3.0 + diff-match-patch: 1.0.5 + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -21379,6 +21764,8 @@ snapshots: mlly: 1.7.1 pkg-types: 1.2.0 + locate-character@3.0.0: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -23004,12 +23391,12 @@ snapshots: postcss: 8.4.47 ts-node: 10.9.2(@types/node@22.8.1)(typescript@5.6.3) - postcss-load-config@6.0.1(jiti@2.3.3)(postcss@8.4.47)(tsx@4.19.2)(yaml@2.6.0): + postcss-load-config@6.0.1(jiti@2.3.3)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.0): dependencies: lilconfig: 3.1.2 optionalDependencies: jiti: 2.3.3 - postcss: 8.4.47 + postcss: 8.4.49 tsx: 4.19.2 yaml: 2.6.0 @@ -23042,6 +23429,12 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres-array@2.0.0: {} postgres-array@3.0.2: {} @@ -23091,11 +23484,11 @@ snapshots: preserve@0.2.0: {} - prettier-plugin-tailwindcss@0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.3.3))(prettier@3.3.3): + prettier-plugin-tailwindcss@0.5.14(@ianvs/prettier-plugin-sort-imports@4.3.1(@vue/compiler-sfc@3.5.13)(prettier@3.3.3))(prettier@3.3.3): dependencies: prettier: 3.3.3 optionalDependencies: - '@ianvs/prettier-plugin-sort-imports': 4.3.1(prettier@3.3.3) + '@ianvs/prettier-plugin-sort-imports': 4.3.1(@vue/compiler-sfc@3.5.13)(prettier@3.3.3) prettier@3.3.3: {} @@ -24395,6 +24788,8 @@ snapshots: extend-shallow: 2.0.1 kind-of: 6.0.3 + secure-json-parse@2.7.0: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -24687,6 +25082,11 @@ snapshots: safer-buffer: 2.1.2 tweetnacl: 0.14.5 + sswr@2.1.0(svelte@5.2.2): + dependencies: + svelte: 5.2.2 + swrev: 4.0.0 + stack-generator@2.0.10: dependencies: stackframe: 1.3.4 @@ -24910,6 +25310,22 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svelte@5.2.2: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) + aria-query: 5.3.2 + axobject-query: 4.1.0 + esm-env: 1.1.4 + esrap: 1.2.2 + is-reference: 3.0.3 + locate-character: 3.0.0 + magic-string: 0.30.11 + zimmerframe: 1.1.2 + swagger-client@3.29.4: dependencies: '@babel/runtime-corejs3': 7.26.0 @@ -24978,6 +25394,18 @@ snapshots: lower-case: 1.1.4 upper-case: 1.1.3 + swr@2.2.5(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + + swrev@4.0.0: {} + + swrv@1.0.4(vue@3.5.13(typescript@5.6.3)): + dependencies: + vue: 3.5.13(typescript@5.6.3) + symbol-tree@3.2.4: {} tabbable@6.2.0: {} @@ -25129,6 +25557,8 @@ snapshots: throttle-debounce@3.0.1: {} + throttleit@2.1.0: {} + through@2.3.8: {} time-span@5.1.0: @@ -25334,7 +25764,7 @@ snapshots: tslib@2.8.0: {} - tsup@8.3.5(jiti@2.3.3)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0): + tsup@8.3.5(jiti@2.3.3)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0): dependencies: bundle-require: 5.0.0(esbuild@0.24.0) cac: 6.7.14 @@ -25344,7 +25774,7 @@ snapshots: esbuild: 0.24.0 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.3.3)(postcss@8.4.47)(tsx@4.19.2)(yaml@2.6.0) + postcss-load-config: 6.0.1(jiti@2.3.3)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.0) resolve-from: 5.0.0 rollup: 4.24.0 source-map: 0.8.0-beta.0 @@ -25353,7 +25783,7 @@ snapshots: tinyglobby: 0.2.10 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.47 + postcss: 8.4.49 typescript: 5.6.3 transitivePeerDependencies: - jiti @@ -25983,6 +26413,16 @@ snapshots: vscode-uri@3.0.8: {} + vue@3.5.13(typescript@5.6.3): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.6.3)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.6.3 + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 @@ -26267,6 +26707,12 @@ snapshots: zenscroll@4.0.2: {} + zimmerframe@1.1.2: {} + + zod-to-json-schema@3.23.5(zod@3.23.8): + dependencies: + zod: 3.23.8 + zod-validation-error@3.4.0(zod@3.23.8): dependencies: zod: 3.23.8