diff --git a/.vscode/settings.json b/.vscode/settings.json index d0746e5f..ee2a1804 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,9 +1,14 @@ { "editor.insertSpaces": true, "editor.detectIndentation": false, - + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit", + "source.organizeImports": "never" + }, + "editor.tabSize": 2, - + "[typescript]": { "editor.tabSize": 2, "editor.insertSpaces": true @@ -33,4 +38,3 @@ "editor.insertSpaces": true } } - diff --git a/packages/ui/components.json b/packages/ui/components.json new file mode 100644 index 00000000..56f749c0 --- /dev/null +++ b/packages/ui/components.json @@ -0,0 +1,20 @@ +{ + "$schema": "https://shadcn-vue.com/schema.json", + "style": "new-york", + "typescript": true, + "tailwind": { + "config": "", + "css": "src/style.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "@/components", + "composables": "@/composables", + "utils": "@/lib/utils", + "ui": "@/components", + "lib": "@/lib" + }, + "iconLibrary": "lucide" +} diff --git a/packages/ui/package.json b/packages/ui/package.json index 73d22b52..352848db 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -4,7 +4,8 @@ "private": true, "type": "module", "exports": { - ".": "./src/index.ts" + ".": "./src/index.ts", + "./style.css": "./src/style.css" }, "engines": { "node": "^20.19.0 || >=22.12.0" diff --git a/packages/ui/src/style.css b/packages/ui/src/style.css index 237f740a..5a7873ab 100644 --- a/packages/ui/src/style.css +++ b/packages/ui/src/style.css @@ -1,144 +1,2 @@ @import "tailwindcss"; @import "tw-animate-css"; - -@custom-variant dark (&:is(.dark *)); - -@theme inline { - --radius-sm: calc(var(--radius) - 4px); - --radius-md: calc(var(--radius) - 2px); - --radius-lg: var(--radius); - --radius-xl: calc(var(--radius) + 4px); - --color-background: var(--background); - --color-foreground: var(--foreground); - --color-card: var(--card); - --color-card-foreground: var(--card-foreground); - --color-popover: var(--popover); - --color-popover-foreground: var(--popover-foreground); - --color-primary: var(--primary); - --color-primary-foreground: var(--primary-foreground); - --color-secondary: var(--secondary); - --color-secondary-foreground: var(--secondary-foreground); - --color-muted: var(--muted); - --color-muted-foreground: var(--muted-foreground); - --color-accent: var(--accent); - --color-accent-foreground: var(--accent-foreground); - --color-destructive: var(--destructive); - --color-border: var(--border); - --color-input: var(--input); - --color-ring: var(--ring); - --color-chart-1: var(--chart-1); - --color-chart-2: var(--chart-2); - --color-chart-3: var(--chart-3); - --color-chart-4: var(--chart-4); - --color-chart-5: var(--chart-5); - --color-sidebar: var(--sidebar); - --color-sidebar-foreground: var(--sidebar-foreground); - --color-sidebar-primary: var(--sidebar-primary); - --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); - --color-sidebar-accent: var(--sidebar-accent); - --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); - --color-sidebar-border: var(--sidebar-border); - --color-sidebar-ring: var(--sidebar-ring); -} - -:root { - --radius: 1rem; - /* Base colors - gray-50 / gray-900 */ - --background: oklch(0.985 0 0); /* gray-50 */ - --foreground: oklch(0.224 0 0); /* gray-900 */ - /* Card - white with gray border */ - --card: oklch(1 0 0); /* white */ - --card-foreground: oklch(0.224 0 0); /* gray-900 */ - /* Popover - white */ - --popover: oklch(1 0 0); - --popover-foreground: oklch(0.224 0 0); - /* Primary - blue-500 */ - --primary: oklch(0.572 0.188 255.29); /* blue-500 */ - --primary-foreground: oklch(1 0 0); /* white */ - /* Secondary - gray-100 */ - --secondary: oklch(0.965 0 0); /* gray-100 */ - --secondary-foreground: oklch(0.224 0 0); /* gray-900 */ - /* Muted - gray-100 / gray-500 */ - --muted: oklch(0.965 0 0); /* gray-100 */ - --muted-foreground: oklch(0.539 0 0); /* gray-500 */ - /* Accent - gray-100 */ - --accent: oklch(0.965 0 0); /* gray-100 */ - --accent-foreground: oklch(0.224 0 0); /* gray-900 */ - /* Destructive - red-500 */ - --destructive: oklch(0.577 0.245 27.325); - /* Border - gray-200 */ - --border: oklch(0.922 0 0); /* gray-200 */ - --input: oklch(0.922 0 0); /* gray-200 */ - /* Ring - blue-500 */ - --ring: oklch(0.572 0.188 255.29); /* blue-500 */ - /* Charts */ - --chart-1: oklch(0.646 0.222 41.116); - --chart-2: oklch(0.6 0.118 184.704); - --chart-3: oklch(0.398 0.07 227.392); - --chart-4: oklch(0.828 0.189 84.429); - --chart-5: oklch(0.769 0.188 70.08); - /* Sidebar - white */ - --sidebar: oklch(1 0 0); - --sidebar-foreground: oklch(0.224 0 0); - --sidebar-primary: oklch(0.572 0.188 255.29); /* blue-500 */ - --sidebar-primary-foreground: oklch(1 0 0); - --sidebar-accent: oklch(0.965 0 0); /* gray-100 */ - --sidebar-accent-foreground: oklch(0.224 0 0); - --sidebar-border: oklch(0.922 0 0); /* gray-200 */ - --sidebar-ring: oklch(0.572 0.188 255.29); /* blue-500 */ -} - -.dark { - /* Base colors - gray-800 / gray-100 */ - --background: oklch(0.298 0 0); /* gray-800 */ - --foreground: oklch(0.965 0 0); /* gray-100 */ - /* Card - gray-900 with gray-700 border */ - --card: oklch(0.224 0 0); /* gray-900 */ - --card-foreground: oklch(0.965 0 0); /* gray-100 */ - /* Popover - gray-900 */ - --popover: oklch(0.224 0 0); - --popover-foreground: oklch(0.965 0 0); - /* Primary - blue-500 */ - --primary: oklch(0.572 0.188 255.29); /* blue-500 */ - --primary-foreground: oklch(1 0 0); /* white */ - /* Secondary - gray-700 */ - --secondary: oklch(0.427 0 0); /* gray-700 */ - --secondary-foreground: oklch(0.965 0 0); /* gray-100 */ - /* Muted - gray-700 / gray-400 */ - --muted: oklch(0.427 0 0); /* gray-700 */ - --muted-foreground: oklch(0.642 0 0); /* gray-400 */ - /* Accent - gray-700 */ - --accent: oklch(0.427 0 0); /* gray-700 */ - --accent-foreground: oklch(0.965 0 0); /* gray-100 */ - /* Destructive - red-500 */ - --destructive: oklch(0.704 0.191 22.216); - /* Border - gray-700 */ - --border: oklch(0.427 0 0); /* gray-700 */ - --input: oklch(0.427 0 0); /* gray-700 */ - /* Ring - blue-500 */ - --ring: oklch(0.572 0.188 255.29); /* blue-500 */ - /* Charts */ - --chart-1: oklch(0.488 0.243 264.376); - --chart-2: oklch(0.696 0.17 162.48); - --chart-3: oklch(0.769 0.188 70.08); - --chart-4: oklch(0.627 0.265 303.9); - --chart-5: oklch(0.645 0.246 16.439); - /* Sidebar - gray-900 */ - --sidebar: oklch(0.224 0 0); - --sidebar-foreground: oklch(0.965 0 0); - --sidebar-primary: oklch(0.572 0.188 255.29); /* blue-500 */ - --sidebar-primary-foreground: oklch(1 0 0); - --sidebar-accent: oklch(0.427 0 0); /* gray-700 */ - --sidebar-accent-foreground: oklch(0.965 0 0); - --sidebar-border: oklch(0.427 0 0); /* gray-700 */ - --sidebar-ring: oklch(0.572 0.188 255.29); /* blue-500 */ -} - -@layer base { - * { - @apply border-border outline-ring/50; - } - body { - @apply bg-background text-foreground; - } -} \ No newline at end of file diff --git a/packages/web/package.json b/packages/web/package.json index 65992cf6..e5555319 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -9,6 +9,8 @@ "start": "vite preview" }, "dependencies": { + "@jamescoyle/vue-icon": "^0.1.2", + "@mdi/js": "^7.4.47", "@memoh/shared": "workspace:*", "@memoh/ui": "workspace:*", "@tailwindcss/vite": "^4.1.18", diff --git a/packages/web/public/logo.png b/packages/web/public/logo.png new file mode 100644 index 00000000..7d6543cb Binary files /dev/null and b/packages/web/public/logo.png differ diff --git a/packages/web/src/App.vue b/packages/web/src/App.vue index 31538144..a9f3c2c5 100644 --- a/packages/web/src/App.vue +++ b/packages/web/src/App.vue @@ -1,10 +1,8 @@ \ No newline at end of file diff --git a/packages/web/src/components/MainContainer/index.vue b/packages/web/src/components/MainContainer/index.vue new file mode 100644 index 00000000..a9fec0ce --- /dev/null +++ b/packages/web/src/components/MainContainer/index.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/packages/web/src/components/Sidebar/index.vue b/packages/web/src/components/Sidebar/index.vue new file mode 100644 index 00000000..b35b2818 --- /dev/null +++ b/packages/web/src/components/Sidebar/index.vue @@ -0,0 +1,103 @@ + + \ No newline at end of file diff --git a/packages/web/src/layout/mainLayout/index.vue b/packages/web/src/layout/mainLayout/index.vue new file mode 100644 index 00000000..a55a2a25 --- /dev/null +++ b/packages/web/src/layout/mainLayout/index.vue @@ -0,0 +1,7 @@ + + diff --git a/packages/web/src/main.ts b/packages/web/src/main.ts index 1f9340e4..23d5578d 100644 --- a/packages/web/src/main.ts +++ b/packages/web/src/main.ts @@ -4,7 +4,6 @@ import App from './App.vue' import router from './router' import { createPinia } from 'pinia' import i18n from './i18n' -import '@memoh/ui/style.css' createApp(App) .use(createPinia()) diff --git a/packages/web/src/pages/chat/index.vue b/packages/web/src/pages/chat/index.vue new file mode 100644 index 00000000..96f08f48 --- /dev/null +++ b/packages/web/src/pages/chat/index.vue @@ -0,0 +1,22 @@ + + + \ No newline at end of file diff --git a/packages/web/src/pages/login/index.vue b/packages/web/src/pages/login/index.vue new file mode 100644 index 00000000..70dbff79 --- /dev/null +++ b/packages/web/src/pages/login/index.vue @@ -0,0 +1,97 @@ + + + \ No newline at end of file diff --git a/packages/web/src/router.ts b/packages/web/src/router.ts index 6ee43e8c..ae5e45f1 100644 --- a/packages/web/src/router.ts +++ b/packages/web/src/router.ts @@ -1,8 +1,35 @@ import { createRouter, createWebHistory } from 'vue-router' + +const routes = [ + { + path: '/', + redirect: '/login' + }, + { + name: 'Login', + path: '/login', + component: () => import('@/pages/login/index.vue') + }, { + name: 'Chat', + path: '/chat', + component: () => import('@/pages/chat/index.vue'), + } + +] + + const router = createRouter({ history: createWebHistory(), - routes: [], + routes, +}) +router.beforeEach((to) => { + const token = localStorage.getItem('token') + if (to.fullPath !== '/login') { + return token ? true : { name: 'Login' } + } else { + return token ? { name: 'Chat' } : true + } }) export default router \ No newline at end of file diff --git a/packages/web/src/style.css b/packages/web/src/style.css index bc69e207..4d09ef84 100644 --- a/packages/web/src/style.css +++ b/packages/web/src/style.css @@ -1,2 +1,122 @@ @import "tailwindcss"; -@import "tw-animate-css"; \ No newline at end of file +@import "tw-animate-css"; +@custom-variant dark (&:is(.dark *)); + +:root { + --radius: 0.65rem; + --background: oklch(1 0 0); + --foreground: oklch(0.141 0.005 285.823); + --card: oklch(1 0 0); + --card-foreground: oklch(0.141 0.005 285.823); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.141 0.005 285.823); + --primary: oklch(0.488 0.243 264.376); + --primary-foreground: oklch(0.97 0.014 254.604); + --secondary: oklch(0.967 0.001 286.375); + --secondary-foreground: oklch(0.21 0.006 285.885); + --muted: oklch(0.967 0.001 286.375); + --muted-foreground: oklch(0.552 0.016 285.938); + --accent: oklch(0.967 0.001 286.375); + --accent-foreground: oklch(0.21 0.006 285.885); + --destructive: oklch(0.577 0.245 27.325); + --border: oklch(0.92 0.004 286.32); + --input: oklch(0.92 0.004 286.32); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.809 0.105 251.813); + --chart-2: oklch(0.623 0.214 259.815); + --chart-3: oklch(0.546 0.245 262.881); + --chart-4: oklch(0.488 0.243 264.376); + --chart-5: oklch(0.424 0.199 265.638); + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.141 0.005 285.823); + --sidebar-primary: oklch(0.546 0.245 262.881); + --sidebar-primary-foreground: oklch(0.97 0.014 254.604); + --sidebar-accent: oklch(0.967 0.001 286.375); + --sidebar-accent-foreground: oklch(0.21 0.006 285.885); + --sidebar-border: oklch(0.92 0.004 286.32); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.141 0.005 285.823); + --foreground: oklch(0.985 0 0); + --card: oklch(0.21 0.006 285.885); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.21 0.006 285.885); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.488 0.243 264.376); + --primary-foreground: oklch(0.97 0.014 254.604); + --secondary: oklch(0.274 0.006 286.033); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.274 0.006 286.033); + --muted-foreground: oklch(0.705 0.015 286.067); + --accent: oklch(0.274 0.006 286.033); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.704 0.191 22.216); + --border: oklch(1 0 0 / 10%); + --input: oklch(1 0 0 / 15%); + --ring: oklch(0.556 0 0); + --chart-1: oklch(0.809 0.105 251.813); + --chart-2: oklch(0.623 0.214 259.815); + --chart-3: oklch(0.546 0.245 262.881); + --chart-4: oklch(0.488 0.243 264.376); + --chart-5: oklch(0.424 0.199 265.638); + --sidebar: oklch(0.21 0.006 285.885); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.623 0.214 259.815); + --sidebar-primary-foreground: oklch(0.97 0.014 254.604); + --sidebar-accent: oklch(0.274 0.006 286.033); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(1 0 0 / 10%); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; + } + body { + @apply bg-background text-foreground; + } +} + +@source "../../ui/src"; diff --git a/packages/web/tsconfig.app.json b/packages/web/tsconfig.app.json index 8d16e425..de5b78af 100644 --- a/packages/web/tsconfig.app.json +++ b/packages/web/tsconfig.app.json @@ -12,5 +12,5 @@ "noFallthroughCasesInSwitch": true, "noUncheckedSideEffectImports": true }, - "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], } diff --git a/packages/web/vite.config.ts b/packages/web/vite.config.ts index 5083dfe9..d992b7fe 100644 --- a/packages/web/vite.config.ts +++ b/packages/web/vite.config.ts @@ -25,6 +25,7 @@ export default defineConfig({ resolve: { alias: { '#': fileURLToPath(new URL('../ui/src', import.meta.url)), + '@': fileURLToPath(new URL('./src', import.meta.url)) }, }, }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f96928d6..b545fa1b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -206,6 +206,12 @@ importers: packages/web: dependencies: + '@jamescoyle/vue-icon': + specifier: ^0.1.2 + version: 0.1.2 + '@mdi/js': + specifier: ^7.4.47 + version: 7.4.47 '@memoh/shared': specifier: workspace:* version: link:../shared @@ -1390,6 +1396,25 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jamescoyle/vue-icon@0.1.2': + resolution: {integrity: sha512-KFrImXx5TKIi6iQXlnyLEBl4rNosNKbTeRnr70ucTdUaciVmd9qK9d/pZAaKt1Ob/8xNnX2GMp8LisyHdKtEgw==} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1406,6 +1431,13 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@langchain/core@0.3.80': + resolution: {integrity: sha512-vcJDV2vk1AlCwSh3aBm/urQ1ZrlXFFBocv11bz/NBUfLWD5/UDNMzwPdaAd2dKvNmTWa9FM2lirLU3+JCf4cRA==} + engines: {node: '>=18'} + + '@mdi/js@7.4.47': + resolution: {integrity: sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ==} + '@microsoft/api-extractor-model@7.32.2': resolution: {integrity: sha512-Ussc25rAalc+4JJs9HNQE7TuO9y6jpYQX9nWD1DhqUzYPBr3Lr7O9intf+ZY8kD5HnIqeIRJX7ccCT0QyBy2Ww==} @@ -4914,6 +4946,34 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.2 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jamescoyle/vue-icon@0.1.2': {} + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 24.10.4 + '@types/yargs': 17.0.35 + chalk: 4.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -4933,6 +4993,28 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@langchain/core@0.3.80(@opentelemetry/api@1.9.0)(openai@4.104.0(encoding@0.1.13)(ws@8.19.0)(zod@4.3.5))': + dependencies: + '@cfworker/json-schema': 4.1.1 + ansi-styles: 5.2.0 + camelcase: 6.3.0 + decamelize: 1.2.0 + js-tiktoken: 1.0.21 + langsmith: 0.3.87(@opentelemetry/api@1.9.0)(openai@4.104.0(encoding@0.1.13)(ws@8.19.0)(zod@4.3.5)) + mustache: 4.2.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + uuid: 10.0.0 + zod: 3.25.76 + zod-to-json-schema: 3.25.1(zod@3.25.76) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - openai + + '@mdi/js@7.4.47': {} + '@microsoft/api-extractor-model@7.32.2(@types/node@24.10.4)': dependencies: '@microsoft/tsdoc': 0.16.0