diff --git a/.secrets.example b/.secrets.example
index 220bfe52..28360234 100644
--- a/.secrets.example
+++ b/.secrets.example
@@ -32,5 +32,7 @@ S3_ACCESS_KEY = 'storage-access-key-never-use-this-value'
S3_SECRET_KEY = 'storage-secret-key-never-use-this-value'
## AI
+OPENAI_ORG_ID = ''
+OPENAI_PROJECT_ID = ''
OPENAI_API_KEY = ''
GRAPHITE_WEBHOOK_SECRET = ''
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 73c8481b..5110f00f 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -8,14 +8,12 @@
"eamodio.gitlens",
"github.github-vscode-theme",
"github.vscode-pull-request-github",
- "esbenp.prettier-vscode",
"yzhang.markdown-all-in-one",
"EditorConfig.EditorConfig",
"humao.rest-client",
"PKief.material-icon-theme",
"hediet.vscode-drawio",
"mikestead.dotenv",
- "vivaxy.vscode-conventional-commits",
"alberto-varela.monorepo-focus-workspace",
"biomejs.biome",
// inlang (i18n)
@@ -38,11 +36,9 @@
"codezombiech.gitignore",
"GitHub.vscode-github-actions",
"csstools.postcss",
- "dbaeumer.vscode-eslint",
"ms-playwright.playwright",
"ms-vsliveshare.vsliveshare",
"streetsidesoftware.code-spell-checker",
- "stylelint.vscode-stylelint",
"svelte.svelte-vscode",
"ardenivanov.svelte-intellisense",
"JakobKruse.svelte-kit-snippets",
diff --git a/apps/console/.secrets.example b/apps/console/.secrets.example
index 458b6d11..5a0b7771 100644
--- a/apps/console/.secrets.example
+++ b/apps/console/.secrets.example
@@ -2,3 +2,7 @@
# https://generate-secret.vercel.app/64 to generate a secret.
# or copy (openssl rand -hex 64) output here
RATE_LIMIT_SECRET='fill-me-in'
+## AI
+OPENAI_ORG_ID = ''
+OPENAI_PROJECT_ID = ''
+OPENAI_API_KEY = ''
diff --git a/apps/console/package.json b/apps/console/package.json
index 8c264880..8dec72f3 100644
--- a/apps/console/package.json
+++ b/apps/console/package.json
@@ -29,6 +29,7 @@
"test:unit:ui": "dotenv-run -f .env -f .secrets -v -- vitest --ui"
},
"devDependencies": {
+ "@ai-sdk/openai": "0.0.14",
"@floating-ui/dom": "1.6.5",
"@fontsource-variable/inter": "5.0.18",
"@inlang/cli": "2.16.8",
@@ -60,6 +61,7 @@
"@vincjo/datatables": "1.14.5",
"@vitest/coverage-v8": "1.6.0",
"@xyflow/svelte": "0.1.3",
+ "ai": "3.1.14",
"autoprefixer": "10.4.19",
"d3-array": "3.2.4",
"d3-scale": "4.0.2",
diff --git a/apps/console/src/lib/components/magic-spell-textarea/README.md b/apps/console/src/lib/components/magic-spell-textarea/README.md
new file mode 100644
index 00000000..115d3f3d
--- /dev/null
+++ b/apps/console/src/lib/components/magic-spell-textarea/README.md
@@ -0,0 +1,3 @@
+# Magic Spell
+
+Based on nextjs [magic-spell](https://github.com/ai-ng/magic-spell/tree/main)
diff --git a/apps/console/src/lib/components/magic-spell-textarea/index.ts b/apps/console/src/lib/components/magic-spell-textarea/index.ts
new file mode 100644
index 00000000..0997939d
--- /dev/null
+++ b/apps/console/src/lib/components/magic-spell-textarea/index.ts
@@ -0,0 +1,2 @@
+// Reexport your entry components here
+export { default as MagicSpellTextarea } from './magic-spell-textarea.svelte';
diff --git a/apps/console/src/lib/components/magic-spell-textarea/loader-icon.svelte b/apps/console/src/lib/components/magic-spell-textarea/loader-icon.svelte
new file mode 100644
index 00000000..f8912a56
--- /dev/null
+++ b/apps/console/src/lib/components/magic-spell-textarea/loader-icon.svelte
@@ -0,0 +1,15 @@
+
diff --git a/apps/console/src/lib/components/magic-spell-textarea/magic-spell-textarea.svelte b/apps/console/src/lib/components/magic-spell-textarea/magic-spell-textarea.svelte
new file mode 100644
index 00000000..c48752f0
--- /dev/null
+++ b/apps/console/src/lib/components/magic-spell-textarea/magic-spell-textarea.svelte
@@ -0,0 +1,65 @@
+
+
+
diff --git a/apps/console/src/lib/links.ts b/apps/console/src/lib/links.ts
index 928f83e6..758dca95 100644
--- a/apps/console/src/lib/links.ts
+++ b/apps/console/src/lib/links.ts
@@ -26,9 +26,14 @@ export const menuNavLinks: MenuNavLinks = {
},
{
title: 'Experiments',
+ list: [{ href: '/customers', label: 'Customers', keywords: 'customers, users' }]
+ },
+ {
+ title: 'AI',
list: [
- { href: '/customers', label: 'Customers', keywords: 'customers, users' },
- { href: '/play', label: 'Play', keywords: 'play, users' }
+ { href: '/magic-spell', label: 'Magic Spell', keywords: 'magic-spell, ai, completion' },
+ { href: '/assistants', label: 'Assistants', keywords: 'assistants, ai' },
+ { href: '/chatbot', label: 'Chat Bot', keywords: 'chatbot, OpenAI' }
]
}
],
diff --git a/apps/console/src/routes/(app)/magic-spell/+page.server.ts b/apps/console/src/routes/(app)/magic-spell/+page.server.ts
new file mode 100644
index 00000000..1af48f0a
--- /dev/null
+++ b/apps/console/src/routes/(app)/magic-spell/+page.server.ts
@@ -0,0 +1,39 @@
+import { fail } from '@sveltejs/kit';
+import { message, superValidate } from 'sveltekit-superforms';
+import { zod } from 'sveltekit-superforms/adapters';
+import { z } from 'zod';
+import { Logger, sleep } from '@spectacular/utils';
+
+const aiSchema = z.object({
+ commentOne: z
+ .string({ required_error: 'First Comment is required' })
+ .min(10, { message: 'First Comment must contain at least 10 character(s)' })
+ .max(256)
+ .trim(),
+ commentTwo: z
+ .string({ required_error: 'Second Comment is required' })
+ .min(10, { message: 'Second Name Comment contain at least 10 character(s)' })
+ .max(256)
+ .trim()
+});
+
+const log = new Logger('server:ai:ms');
+
+export const load = async () => {
+ const form = await superValidate(zod(aiSchema));
+ return { form };
+};
+
+export const actions = {
+ default: async ({ request }) => {
+ const form = await superValidate(request, zod(aiSchema));
+
+ await sleep(1000);
+
+ if (!form.valid) return fail(400, { form });
+
+ const { commentOne, commentTwo } = form.data;
+ log.debug({ commentOne, commentTwo });
+ return message(form, { type: 'success', message: 'AI sucessfull 😎' });
+ }
+};
diff --git a/apps/console/src/routes/(app)/magic-spell/+page.svelte b/apps/console/src/routes/(app)/magic-spell/+page.svelte
new file mode 100644
index 00000000..c8b6d588
--- /dev/null
+++ b/apps/console/src/routes/(app)/magic-spell/+page.svelte
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/console/src/routes/(app)/play/+page.svelte b/apps/console/src/routes/(app)/play/+page.svelte
deleted file mode 100644
index f4e5ebd8..00000000
--- a/apps/console/src/routes/(app)/play/+page.svelte
+++ /dev/null
@@ -1,75 +0,0 @@
-
-
-
-
-
-
-
-
- First name
- Last name
- Email
-
-
-
-
-
-
-
-
- {#each $rows as row}
-
- {row.first_name} |
- {row.last_name} |
- {row.email} |
-
- {/each}
-
-
-
-
-
-
-
-
-
- First Name
- Last Name
- Email
-
-
-
-
-
-
-
-
- {#each $rows as row}
-
- {row.first_name} |
- {row.last_name} |
- {row.email} |
-
- {/each}
-
-
-
-
-
diff --git a/apps/console/src/routes/api/completion/+server.ts b/apps/console/src/routes/api/completion/+server.ts
new file mode 100644
index 00000000..ada3ed14
--- /dev/null
+++ b/apps/console/src/routes/api/completion/+server.ts
@@ -0,0 +1,31 @@
+import { createOpenAI } from '@ai-sdk/openai';
+import { StreamingTextResponse, streamText } from 'ai';
+
+import { Logger } from '@spectacular/utils';
+import { env } from '$env/dynamic/private';
+// import { limiter } from '$lib/server/limiter/limiter'; // TODO
+
+const log = new Logger('experiments:ai:completion:server');
+
+// https://sdk.vercel.ai/docs/getting-started/svelte
+const openai = createOpenAI({
+ organization: env.OPENAI_ORG_ID,
+ project: env.OPENAI_PROJECT_ID,
+ apiKey: env.OPENAI_API_KEY
+});
+
+// free https://platform.openai.com/docs/guides/rate-limits/free-tier-rate-limits
+const model = openai('gpt-3.5-turbo');
+// const model = openai("llama3-8b-8192")
+const system =
+ 'You are a text editor. You will be given a prompt and a text to edit, which may be empty or incomplete. Edit the text to match the prompt, and only respond with the full edited version of the text - do not include any other information, context, or explanation. If you add on to the text, respond with the full version, not just the new portion. Do not include the prompt or otherwise preface your response. Do not enclose the response in quotes.';
+
+export const POST = async ({ request }) => {
+ const { text, prompt } = await request.json();
+ log.debug({ text, prompt });
+ if (!prompt) return new Response('Prompt is required', { status: 400 });
+
+ const result = await streamText({ model, system, prompt: `Prompt: ${prompt}\nText: ${text}` });
+
+ return new StreamingTextResponse(result.toAIStream());
+};
diff --git a/apps/console/turbo.json b/apps/console/turbo.json
index 7e18d3b7..28b1ef51 100644
--- a/apps/console/turbo.json
+++ b/apps/console/turbo.json
@@ -52,6 +52,9 @@
"BUN_ENV",
"SW_DEV",
"GCP_BUILDPACKS",
+ "OPENAI_ORG_ID",
+ "OPENAI_PROJECT_ID",
+ "OPENAI_API_KEY",
"npm_package_version"
]
},
diff --git a/packages/skeleton-ui/src/components/auto-resize-textarea/README.md b/packages/skeleton-ui/src/components/auto-resize-textarea/README.md
new file mode 100644
index 00000000..2b57c382
--- /dev/null
+++ b/packages/skeleton-ui/src/components/auto-resize-textarea/README.md
@@ -0,0 +1,31 @@
+# Auto-resize Textarea for Svelte
+
+An in-built auto-resize functionality for a textarea element using the scroll height of a singleton proxy textarea element attached to the document body. This is the 100% accurate implementation and does not break irrespective of the borders, padding, or amount of text.
+
+## Install
+
+`npm install svelte-autoresize-textarea`
+
+## Usage
+
+```svelte
+
+
+
+
+
+```
+
+## Props
+
+| prop | type | description |
+| --------- | -------- | -------------------------------------------------------- |
+| `maxRows` | `number` | Maximum number of rows up to which the textarea can grow |
+| `minRows` | `number` | Minimum number of rows to show for textarea |
+
+Apart from these, the component accepts all props that are accepted by ``.
diff --git a/packages/skeleton-ui/src/components/auto-resize-textarea/auto-resize-textarea.svelte b/packages/skeleton-ui/src/components/auto-resize-textarea/auto-resize-textarea.svelte
new file mode 100644
index 00000000..e731d485
--- /dev/null
+++ b/packages/skeleton-ui/src/components/auto-resize-textarea/auto-resize-textarea.svelte
@@ -0,0 +1,32 @@
+
+
+
diff --git a/packages/skeleton-ui/src/components/auto-resize-textarea/core.ts b/packages/skeleton-ui/src/components/auto-resize-textarea/core.ts
new file mode 100644
index 00000000..029f0dbf
--- /dev/null
+++ b/packages/skeleton-ui/src/components/auto-resize-textarea/core.ts
@@ -0,0 +1,208 @@
+type Undefineable = T | undefined;
+
+type SetupType = {
+ styles: CSSStyleDeclaration;
+ minRows: Undefineable;
+ maxRows: Undefineable;
+}
+
+const PROXY_TEXTAREA_ELEMENT_HIDDEN_STYLE = `
+ height: 0 !important;
+ visibility: hidden !important;
+ overflow: hidden !important;
+ position: absolute !important;
+ z-index: -1000 !important;
+ top: 0 !important;
+ right: 0 !important;
+ pointer-events: none !important;
+ opacity: 0 !important;
+`;
+
+const CONTEXT_STYLE = [
+ "letter-spacing",
+ "line-height",
+ "padding-top",
+ "padding-bottom",
+ "font-family",
+ "font-weight",
+ "font-size",
+ "text-rendering",
+ "text-transform",
+ "width",
+ "text-indent",
+ "padding-left",
+ "padding-right",
+ "border-width",
+ "box-sizing",
+];
+
+function parseNumber(value: number | string | undefined) {
+ if (value) {
+ if (typeof value === "string") {
+ const parsedValue = Number.parseInt(value, 10);
+ if (!Number.isNaN(value)) {
+ return parsedValue;
+ }
+ }
+
+ if (typeof value === "number") return value;
+ }
+
+ return 0;
+}
+
+function getSizingData(styles: CSSStyleDeclaration) {
+ const boxSizing = styles.getPropertyValue("box-sizing");
+ const paddingSize =
+ Number.parseFloat(styles.getPropertyValue("padding-bottom")) +
+ Number.parseFloat(styles.getPropertyValue("padding-top"));
+ const borderSize =
+ Number.parseFloat(styles.getPropertyValue("border-bottom-width")) +
+ Number.parseFloat(styles.getPropertyValue("border-top-width"));
+
+ return { boxSizing, paddingSize, borderSize };
+}
+
+function isBorderBox(boxSizing: string) {
+ return boxSizing === "border-box";
+}
+
+function isContentBox(boxSizing: string) {
+ return boxSizing === "content-box";
+}
+
+class ProxyTextareaElement {
+ static _proxyTextareaElement: HTMLTextAreaElement | undefined = undefined;
+
+ _element: HTMLTextAreaElement | undefined = undefined;
+ _minRows = 0;
+ _maxRows = 0;
+ _minHeightFromResizeObserver = 0;
+ _sourceStyles: Undefineable = undefined;
+ _hasDragStarted = false;
+ _lastCalculatedHeight = 0;
+ _probablyResizeHappen = false;
+ hasStarted = false;
+
+ __onpointerdown = (e: PointerEvent) => {
+ this._element!.setPointerCapture(e.pointerId);
+ this._hasDragStarted = true;
+ }
+
+ __onpointermove = () => {
+ this._probablyResizeHappen = true;
+ }
+
+ __onpointerup = (e: PointerEvent) => {
+ this._element!.releasePointerCapture(e.pointerId);
+ this._hasDragStarted = false;
+ if (this._probablyResizeHappen) {
+ const newHeight = parseNumber(this._element!.style.getPropertyValue('height'));
+ if (!Number.isNaN(newHeight) && newHeight !== this._lastCalculatedHeight) {
+ this._minHeightFromResizeObserver = newHeight;
+ }
+ }
+
+ this._probablyResizeHappen = false;
+ }
+
+ __setup({ styles, maxRows, minRows }: SetupType) {
+ this._sourceStyles = styles;
+ this._maxRows = parseNumber(maxRows);
+ this._minRows = parseNumber(minRows);
+
+ this._element!.addEventListener('pointerdown', this.__onpointerdown);
+ this._element!.addEventListener('pointermove', this.__onpointermove);
+ this._element!.addEventListener('pointerup', this.__onpointerup);
+
+ // setup proxy textarea element
+ // if not present
+ if (ProxyTextareaElement._proxyTextareaElement === undefined) {
+ ProxyTextareaElement._proxyTextareaElement = document.createElement("textarea");
+ const contextStyle = CONTEXT_STYLE.map(
+ (name) => `${name}:${styles.getPropertyValue(name)}`
+ ).join(";");
+
+ ProxyTextareaElement._proxyTextareaElement.setAttribute(
+ "style",
+ `${contextStyle};${PROXY_TEXTAREA_ELEMENT_HIDDEN_STYLE}`
+ );
+ if (
+ ProxyTextareaElement._proxyTextareaElement.parentNode === null ||
+ ProxyTextareaElement._proxyTextareaElement.parentNode !== document.body
+ ) {
+ document.body.appendChild(ProxyTextareaElement._proxyTextareaElement);
+ }
+ }
+ }
+
+ __updateText(text: string) {
+ ProxyTextareaElement._proxyTextareaElement!.value = text;
+ }
+
+ __getComputedHeight() {
+ const { boxSizing, paddingSize, borderSize } = getSizingData(this._sourceStyles!);
+ let finalHeight = ProxyTextareaElement._proxyTextareaElement!.scrollHeight;
+
+ if (isBorderBox(boxSizing)) {
+ finalHeight += borderSize;
+ } else if (isContentBox(boxSizing)) {
+ finalHeight -= paddingSize;
+ }
+
+ if (this._maxRows !== 0 || this._minRows !== 0) {
+ ProxyTextareaElement._proxyTextareaElement!.value = "";
+ const singleRowHeight = ProxyTextareaElement._proxyTextareaElement!.scrollHeight - paddingSize;
+ if (this._minRows !== 0) {
+ let minHeight = singleRowHeight * this._minRows;
+ if (isBorderBox(boxSizing)) {
+ minHeight += paddingSize + borderSize;
+ }
+
+ finalHeight = Math.max(finalHeight, minHeight);
+ }
+
+ if (this._maxRows !== 0) {
+ let maxHeight = singleRowHeight * this._maxRows;
+ if (isBorderBox(boxSizing)) {
+ maxHeight += paddingSize + borderSize;
+ }
+
+ finalHeight = Math.min(finalHeight, maxHeight);
+ }
+ }
+
+ finalHeight = Math.max(finalHeight, this._minHeightFromResizeObserver);
+
+ this._lastCalculatedHeight = finalHeight;
+ return finalHeight;
+ }
+
+ start(element: HTMLTextAreaElement, minRows?: number, maxRows?: number) {
+ if (this.hasStarted) return;
+ this._element = element;
+ const sourceStyles = getComputedStyle(element);
+ this.__setup({
+ styles: sourceStyles,
+ maxRows,
+ minRows,
+ });
+ this.hasStarted = true;
+ }
+
+ onUpdateText(text: string) {
+ this.__updateText(text);
+ this._element!.style.setProperty(
+ "height",
+ this.__getComputedHeight() + "px"
+ );
+ }
+
+ cleanUp() {
+ this._element?.removeEventListener('pointerdown', this.__onpointerdown);
+ this._element?.removeEventListener('pointermove', this.__onpointermove);
+ this._element?.removeEventListener('pointerup', this.__onpointerup);
+ }
+};
+
+export default ProxyTextareaElement;
diff --git a/packages/skeleton-ui/src/components/auto-resize-textarea/index.ts b/packages/skeleton-ui/src/components/auto-resize-textarea/index.ts
new file mode 100644
index 00000000..96b5d87c
--- /dev/null
+++ b/packages/skeleton-ui/src/components/auto-resize-textarea/index.ts
@@ -0,0 +1,2 @@
+// Reexport your entry components here
+export { default as AutoResizeTextarea } from "./auto-resize-textarea.svelte";
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 53db26ed..d954e09a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -93,6 +93,9 @@ importers:
specifier: 1.6.0
version: 1.6.0(vitest@1.6.0)
devDependencies:
+ '@ai-sdk/openai':
+ specifier: 0.0.14
+ version: 0.0.14(zod@3.23.8)
'@floating-ui/dom':
specifier: 1.6.5
version: 1.6.5
@@ -176,7 +179,7 @@ importers:
version: 7.10.0(eslint@8.57.0)(typescript@5.4.5)
'@vercel/analytics':
specifier: 1.3.1
- version: 1.3.1
+ version: 1.3.1(react@18.3.1)
'@vincjo/datatables':
specifier: 1.14.5
version: 1.14.5(svelte@4.2.17)
@@ -186,6 +189,9 @@ importers:
'@xyflow/svelte':
specifier: 0.1.3
version: 0.1.3(@babel/core@7.24.6)(postcss-load-config@5.1.0(postcss@8.4.38))(postcss@8.4.38)(svelte@4.2.17)(typescript@5.4.5)
+ ai:
+ specifier: 3.1.14
+ version: 3.1.14(react@18.3.1)(solid-js@1.7.11)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8)
autoprefixer:
specifier: 10.4.19
version: 10.4.19(postcss@8.4.38)
@@ -406,10 +412,10 @@ importers:
version: 7.10.0(eslint@8.57.0)(typescript@5.4.5)
'@vercel/analytics':
specifier: 1.3.1
- version: 1.3.1
+ version: 1.3.1(react@18.3.1)
'@vercel/speed-insights':
specifier: 1.0.11
- version: 1.0.11(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)
+ version: 1.0.11(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(react@18.3.1)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))
'@vite-pwa/assets-generator':
specifier: 0.2.4
version: 0.2.4
@@ -650,7 +656,7 @@ importers:
version: 7.10.0(eslint@8.57.0)(typescript@5.4.5)
'@vercel/analytics':
specifier: 1.3.1
- version: 1.3.1
+ version: 1.3.1(react@18.3.1)
'@vincjo/datatables':
specifier: 1.14.5
version: 1.14.5(svelte@4.2.17)
@@ -776,7 +782,7 @@ importers:
version: 5.1.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))(tailwindcss@3.4.3)
'@astrojs/vercel':
specifier: 7.6.0
- version: 7.6.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))
+ version: 7.6.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))(react@18.3.1)
'@fontsource-variable/inter':
specifier: 5.0.18
version: 5.0.18
@@ -898,7 +904,7 @@ importers:
version: 7.10.0(eslint@8.57.0)(typescript@5.4.5)
'@vercel/analytics':
specifier: 1.3.1
- version: 1.3.1
+ version: 1.3.1(react@18.3.1)
'@vincjo/datatables':
specifier: 1.14.5
version: 1.14.5(svelte@4.2.17)
@@ -1052,7 +1058,7 @@ importers:
version: 5.1.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))(tailwindcss@3.4.3)
'@astrojs/vercel':
specifier: 7.6.0
- version: 7.6.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))
+ version: 7.6.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))(react@18.3.1)
'@fontsource-variable/inter':
specifier: 5.0.18
version: 5.0.18
@@ -1445,6 +1451,28 @@ packages:
'@adobe/css-tools@4.3.3':
resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==}
+ '@ai-sdk/openai@0.0.14':
+ resolution: {integrity: sha512-ZiW2ETP2/K9eBUBZBAAnjLC0sJwViFPsRWpgRTy+KzMOYqkwkRScdQlFreczvfvi8M8ahzx+cavMd64O9pg2AA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.0.0
+ peerDependenciesMeta:
+ zod:
+ optional: true
+
+ '@ai-sdk/provider-utils@0.0.9':
+ resolution: {integrity: sha512-bZFTVp/GIZ3Yz4VejYs0B93bmnwfk+RoSHAQxAe9WamkQFrZLuNgd2ngAFjF6b4naLynWe1ZCk+dLWEtozCciw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ zod: ^3.0.0
+ peerDependenciesMeta:
+ zod:
+ optional: true
+
+ '@ai-sdk/provider@0.0.6':
+ resolution: {integrity: sha512-kiPqIsSnUimckaUn87WepxfjPNdy8SXlPP7P6yWuG3e1NmyFHcyuH6EBBZxXLmu0oZtkb+QEeP3UDWGSc+wwKQ==}
+ engines: {node: '>=18'}
+
'@alloc/quick-lru@5.2.0':
resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
engines: {node: '>=10'}
@@ -4639,6 +4667,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/eslint@8.56.10':
resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==}
@@ -5015,6 +5046,35 @@ packages:
'@vscode/l10n@0.0.18':
resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==}
+ '@vue/compiler-core@3.4.27':
+ resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==}
+
+ '@vue/compiler-dom@3.4.27':
+ resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==}
+
+ '@vue/compiler-sfc@3.4.27':
+ resolution: {integrity: sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==}
+
+ '@vue/compiler-ssr@3.4.27':
+ resolution: {integrity: sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==}
+
+ '@vue/reactivity@3.4.27':
+ resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==}
+
+ '@vue/runtime-core@3.4.27':
+ resolution: {integrity: sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==}
+
+ '@vue/runtime-dom@3.4.27':
+ resolution: {integrity: sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==}
+
+ '@vue/server-renderer@3.4.27':
+ resolution: {integrity: sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==}
+ peerDependencies:
+ vue: 3.4.27
+
+ '@vue/shared@3.4.27':
+ resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==}
+
'@whatwg-node/events@0.1.1':
resolution: {integrity: sha512-AyQEn5hIPV7Ze+xFoXVU3QTHXVbWPrzaOkxtENMPMuNL6VVHrp4hHfDt9nrQpjO7BgvuM95dMtkycX5M/DZR3w==}
engines: {node: '>=16.0.0'}
@@ -5080,6 +5140,30 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
+ ai@3.1.14:
+ resolution: {integrity: sha512-yW9ipraLm2PzzWc74eWUUVUIVZbO/Ggv//83iBfDkOTndrBmFqyIk6DtVVzf+RwKNUYuZzj8v5MKcgnHQhceXw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ openai: ^4.42.0
+ react: ^18 || ^19
+ solid-js: ^1.7.7
+ svelte: ^3.0.0 || ^4.0.0
+ vue: ^3.3.4
+ zod: ^3.0.0
+ peerDependenciesMeta:
+ openai:
+ optional: true
+ react:
+ optional: true
+ solid-js:
+ optional: true
+ svelte:
+ optional: true
+ vue:
+ optional: true
+ zod:
+ optional: true
+
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@@ -6214,6 +6298,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-sequences@29.6.3:
resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -6675,6 +6762,10 @@ packages:
eventemitter3@5.0.1:
resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ eventsource-parser@1.1.2:
+ resolution: {integrity: sha512-v0eOBUbiaFojBu2s2NPBfYUoRR9GjcDNvCXVaqEf5vVfpIAh9f8RCo4vXTP8c63QRKCFwoLpMpTdPwwhEKVgzA==}
+ engines: {node: '>=14.18'}
+
execa@6.1.0:
resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -7736,6 +7827,11 @@ packages:
resolution: {integrity: sha512-B281bLCT2TRMQa+AQUQY5AGcqSOXBOKaYGP4wDzoA/+QswUfN8sODektbPEs9Baq7LGKun5jQbNFpzwGuVYKhw==}
engines: {node: '>=8'}
+ jsondiffpatch@0.6.0:
+ resolution: {integrity: sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
jsonfile@4.0.0:
resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
@@ -7922,6 +8018,10 @@ packages:
longest-streak@3.1.0:
resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
loupe@2.3.7:
resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
@@ -8341,6 +8441,11 @@ packages:
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+ nanoid@3.3.6:
+ resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
nanoid@3.3.7:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -9434,6 +9539,10 @@ packages:
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
@@ -9715,6 +9824,9 @@ packages:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
+ secure-json-parse@2.7.0:
+ resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==}
+
semver@5.7.2:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
hasBin: true
@@ -9871,6 +9983,13 @@ packages:
solid-js@1.7.11:
resolution: {integrity: sha512-JkuvsHt8jqy7USsy9xJtT18aF9r2pFO+GB8JQ2XGTvtF49rGTObB46iebD25sE3qVNvIbwglXOXdALnJq9IHtQ==}
+ solid-swr-store@0.10.7:
+ resolution: {integrity: sha512-A6d68aJmRP471aWqKKPE2tpgOiR5fH4qXQNfKIec+Vap+MGQm3tvXlT8n0I8UgJSlNAsSAUuw2VTviH2h3Vv5g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ solid-js: ^1.2
+ swr-store: ^0.10
+
sorcery@0.11.0:
resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==}
hasBin: true
@@ -9933,6 +10052,11 @@ packages:
sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ sswr@2.0.0:
+ resolution: {integrity: sha512-mV0kkeBHcjcb0M5NqKtKVg/uTIYNlIIniyDfSGrSfxpEdM9C365jK0z55pl9K0xAkNTJi2OAOVFQpgMPUk+V0w==}
+ peerDependencies:
+ svelte: ^4.0.0
+
stackback@0.0.2:
resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
@@ -10321,6 +10445,23 @@ packages:
resolution: {integrity: sha512-80MSxonyTxrGcaWj9YgvvhD8OG0B9/9IVZP33vhIEvyWvmKjnQDBieO+29wKvMx285sAtvZyrWBdkxaw6+D3aw==}
engines: {node: '>= 4.7.0'}
+ swr-store@0.10.6:
+ resolution: {integrity: sha512-xPjB1hARSiRaNNlUQvWSVrG5SirCjk2TmaUyzzvk69SZQan9hCJqw/5rG9iL7xElHU784GxRPISClq4488/XVw==}
+ engines: {node: '>=10'}
+
+ swr@2.2.0:
+ resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==}
+ 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==}
@@ -10805,6 +10946,11 @@ packages:
urlpattern-polyfill@10.0.0:
resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==}
+ use-sync-external-store@1.2.2:
+ resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -11071,6 +11217,14 @@ packages:
vscode-uri@3.0.8:
resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+ vue@3.4.27:
+ resolution: {integrity: sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
@@ -11326,6 +11480,11 @@ packages:
yup@1.4.0:
resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==}
+ zod-to-json-schema@3.22.5:
+ resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==}
+ peerDependencies:
+ zod: ^3.22.4
+
zod-to-json-schema@3.23.0:
resolution: {integrity: sha512-az0uJ243PxsRIa2x1WmNE/pnuA05gUq/JB8Lwe1EDCCL/Fz9MgjYQ0fPlyc2Tcv6aF2ZA7WM5TWaRZVEFaAIag==}
peerDependencies:
@@ -11347,6 +11506,26 @@ snapshots:
'@adobe/css-tools@4.3.3': {}
+ '@ai-sdk/openai@0.0.14(zod@3.23.8)':
+ dependencies:
+ '@ai-sdk/provider': 0.0.6
+ '@ai-sdk/provider-utils': 0.0.9(zod@3.23.8)
+ optionalDependencies:
+ zod: 3.23.8
+
+ '@ai-sdk/provider-utils@0.0.9(zod@3.23.8)':
+ dependencies:
+ '@ai-sdk/provider': 0.0.6
+ eventsource-parser: 1.1.2
+ nanoid: 3.3.6
+ secure-json-parse: 2.7.0
+ optionalDependencies:
+ zod: 3.23.8
+
+ '@ai-sdk/provider@0.0.6':
+ dependencies:
+ json-schema: 0.4.0
+
'@alloc/quick-lru@5.2.0': {}
'@ampproject/remapping@2.3.0':
@@ -11549,10 +11728,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@astrojs/vercel@7.6.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))':
+ '@astrojs/vercel@7.6.0(astro@4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5))(react@18.3.1)':
dependencies:
'@astrojs/internal-helpers': 0.4.0
- '@vercel/analytics': 1.3.1
+ '@vercel/analytics': 1.3.1(react@18.3.1)
'@vercel/edge': 1.1.1
'@vercel/nft': 0.26.5
astro: 4.9.1(@types/node@20.12.12)(terser@5.31.0)(typescript@5.4.5)
@@ -15201,6 +15380,8 @@ snapshots:
dependencies:
'@types/ms': 0.7.34
+ '@types/diff-match-patch@1.0.36': {}
+
'@types/eslint@8.56.10':
dependencies:
'@types/estree': 1.0.5
@@ -15488,9 +15669,11 @@ snapshots:
'@ungap/structured-clone@1.2.0': {}
- '@vercel/analytics@1.3.1':
+ '@vercel/analytics@1.3.1(react@18.3.1)':
dependencies:
server-only: 0.0.1
+ optionalDependencies:
+ react: 18.3.1
'@vercel/edge@1.1.1': {}
@@ -15512,10 +15695,12 @@ snapshots:
- encoding
- supports-color
- '@vercel/speed-insights@1.0.11(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)':
+ '@vercel/speed-insights@1.0.11(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(react@18.3.1)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))':
optionalDependencies:
'@sveltejs/kit': 2.5.10(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0)))(svelte@4.2.17)(vite@5.2.11(@types/node@20.12.12)(terser@5.31.0))
+ react: 18.3.1
svelte: 4.2.17
+ vue: 3.4.27(typescript@5.4.5)
'@vincjo/datatables@1.14.5(svelte@4.2.17)':
dependencies:
@@ -15673,6 +15858,59 @@ snapshots:
'@vscode/l10n@0.0.18': {}
+ '@vue/compiler-core@3.4.27':
+ dependencies:
+ '@babel/parser': 7.24.6
+ '@vue/shared': 3.4.27
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.0
+
+ '@vue/compiler-dom@3.4.27':
+ dependencies:
+ '@vue/compiler-core': 3.4.27
+ '@vue/shared': 3.4.27
+
+ '@vue/compiler-sfc@3.4.27':
+ dependencies:
+ '@babel/parser': 7.24.6
+ '@vue/compiler-core': 3.4.27
+ '@vue/compiler-dom': 3.4.27
+ '@vue/compiler-ssr': 3.4.27
+ '@vue/shared': 3.4.27
+ estree-walker: 2.0.2
+ magic-string: 0.30.10
+ postcss: 8.4.38
+ source-map-js: 1.2.0
+
+ '@vue/compiler-ssr@3.4.27':
+ dependencies:
+ '@vue/compiler-dom': 3.4.27
+ '@vue/shared': 3.4.27
+
+ '@vue/reactivity@3.4.27':
+ dependencies:
+ '@vue/shared': 3.4.27
+
+ '@vue/runtime-core@3.4.27':
+ dependencies:
+ '@vue/reactivity': 3.4.27
+ '@vue/shared': 3.4.27
+
+ '@vue/runtime-dom@3.4.27':
+ dependencies:
+ '@vue/runtime-core': 3.4.27
+ '@vue/shared': 3.4.27
+ csstype: 3.1.3
+
+ '@vue/server-renderer@3.4.27(vue@3.4.27(typescript@5.4.5))':
+ dependencies:
+ '@vue/compiler-ssr': 3.4.27
+ '@vue/shared': 3.4.27
+ vue: 3.4.27(typescript@5.4.5)
+
+ '@vue/shared@3.4.27': {}
+
'@whatwg-node/events@0.1.1': {}
'@whatwg-node/fetch@0.9.17':
@@ -15757,6 +15995,28 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
+ ai@3.1.14(react@18.3.1)(solid-js@1.7.11)(svelte@4.2.17)(vue@3.4.27(typescript@5.4.5))(zod@3.23.8):
+ dependencies:
+ '@ai-sdk/provider': 0.0.6
+ '@ai-sdk/provider-utils': 0.0.9(zod@3.23.8)
+ eventsource-parser: 1.1.2
+ json-schema: 0.4.0
+ jsondiffpatch: 0.6.0
+ nanoid: 3.3.6
+ secure-json-parse: 2.7.0
+ solid-swr-store: 0.10.7(solid-js@1.7.11)(swr-store@0.10.6)
+ sswr: 2.0.0(svelte@4.2.17)
+ swr: 2.2.0(react@18.3.1)
+ swr-store: 0.10.6
+ swrv: 1.0.4(vue@3.4.27(typescript@5.4.5))
+ zod-to-json-schema: 3.22.5(zod@3.23.8)
+ optionalDependencies:
+ react: 18.3.1
+ solid-js: 1.7.11
+ svelte: 4.2.17
+ vue: 3.4.27(typescript@5.4.5)
+ zod: 3.23.8
+
ajv@6.12.6:
dependencies:
fast-deep-equal: 3.1.3
@@ -17067,6 +17327,8 @@ snapshots:
didyoumean@1.2.2: {}
+ diff-match-patch@1.0.5: {}
+
diff-sequences@29.6.3: {}
diff3@0.0.4: {}
@@ -17807,6 +18069,8 @@ snapshots:
eventemitter3@5.0.1: {}
+ eventsource-parser@1.1.2: {}
+
execa@6.1.0:
dependencies:
cross-spawn: 7.0.3
@@ -19022,6 +19286,12 @@ snapshots:
strip-bom: 4.0.0
strip-json-comments: 3.1.1
+ jsondiffpatch@0.6.0:
+ dependencies:
+ '@types/diff-match-patch': 1.0.36
+ chalk: 5.3.0
+ diff-match-patch: 1.0.5
+
jsonfile@4.0.0:
optionalDependencies:
graceful-fs: 4.2.11
@@ -19255,6 +19525,10 @@ snapshots:
longest-streak@3.1.0: {}
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
loupe@2.3.7:
dependencies:
get-func-name: 2.0.2
@@ -19988,6 +20262,8 @@ snapshots:
object-assign: 4.1.1
thenify-all: 1.6.0
+ nanoid@3.3.6: {}
+
nanoid@3.3.7: {}
nanoid@4.0.2: {}
@@ -21025,6 +21301,10 @@ snapshots:
react-is@18.3.1: {}
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
read-cache@1.0.0:
dependencies:
pify: 2.3.0
@@ -21435,6 +21715,8 @@ snapshots:
extend-shallow: 2.0.1
kind-of: 6.0.3
+ secure-json-parse@2.7.0: {}
+
semver@5.7.2: {}
semver@6.3.1: {}
@@ -21642,6 +21924,11 @@ snapshots:
csstype: 3.1.3
seroval: 0.5.1
+ solid-swr-store@0.10.7(solid-js@1.7.11)(swr-store@0.10.6):
+ dependencies:
+ solid-js: 1.7.11
+ swr-store: 0.10.6
+
sorcery@0.11.0:
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
@@ -21714,6 +22001,11 @@ snapshots:
sprintf-js@1.0.3: {}
+ sswr@2.0.0(svelte@4.2.17):
+ dependencies:
+ svelte: 4.2.17
+ swrev: 4.0.0
+
stackback@0.0.2: {}
statuses@2.0.1: {}
@@ -22215,6 +22507,21 @@ snapshots:
swiper@11.1.3: {}
+ swr-store@0.10.6:
+ dependencies:
+ dequal: 2.0.3
+
+ swr@2.2.0(react@18.3.1):
+ dependencies:
+ 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.4.27(typescript@5.4.5)):
+ dependencies:
+ vue: 3.4.27(typescript@5.4.5)
+
symbol-tree@3.2.4: {}
synckit@0.9.0:
@@ -22765,6 +23072,10 @@ snapshots:
urlpattern-polyfill@10.0.0: {}
+ use-sync-external-store@1.2.2(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
util-deprecate@1.0.2: {}
uuid@9.0.1: {}
@@ -23055,6 +23366,16 @@ snapshots:
vscode-uri@3.0.8: {}
+ vue@3.4.27(typescript@5.4.5):
+ dependencies:
+ '@vue/compiler-dom': 3.4.27
+ '@vue/compiler-sfc': 3.4.27
+ '@vue/runtime-dom': 3.4.27
+ '@vue/server-renderer': 3.4.27(vue@3.4.27(typescript@5.4.5))
+ '@vue/shared': 3.4.27
+ optionalDependencies:
+ typescript: 5.4.5
+
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
@@ -23371,6 +23692,10 @@ snapshots:
type-fest: 2.19.0
optional: true
+ zod-to-json-schema@3.22.5(zod@3.23.8):
+ dependencies:
+ zod: 3.23.8
+
zod-to-json-schema@3.23.0(zod@3.23.8):
dependencies:
zod: 3.23.8