diff --git a/.nvmrc b/.nvmrc index 0f35649c..5bcf9c6e 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.19.3 +v24.18.0 diff --git a/AGENTS.md b/AGENTS.md index 4858c331..e94724ff 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,7 +29,7 @@ The `prototypes/` directory holds standalone HTML/CSS design mocks for explorati Before committing or opening/updating a PR, run the build checks that match the areas you changed. Use Node 20 (the repo's `.nvmrc` version): ```bash -export PATH="$HOME/.nvm/versions/node/v20.19.3/bin:$PATH" +export PATH="$HOME/.nvm/versions/node/v24.18.0/bin:$PATH" ``` - **Dashboard changes** (`apps/dashboard/**`, or shared packages consumed by the dashboard): @@ -654,7 +654,7 @@ The full setup/run flow lives in `README.md` and `DEV_SETUP_NOTES.md`. The notes The sandbox injects `/exec-daemon/node` (Node 22) at the front of `PATH`, so a bare `node`/`pnpm` runs under Node 22 even though the repo requires Node `^20.19.3` (`.nvmrc`). Node 20.19.3 is installed via nvm and set as the nvm default. Before running any `pnpm`/dev command, prepend the repo Node to `PATH`: ```bash -export PATH="$HOME/.nvm/versions/node/v20.19.3/bin:$PATH" +export PATH="$HOME/.nvm/versions/node/v24.18.0/bin:$PATH" ``` `pnpm install` itself succeeds under either version (there is no `engine-strict`), but run the dev servers and DB scripts on Node 20. diff --git a/apps/api/.env.example b/apps/api/.env.example index 0c555ed5..97266e33 100644 --- a/apps/api/.env.example +++ b/apps/api/.env.example @@ -83,6 +83,7 @@ OPENAI_API_KEY="" GOOGLE_API_KEY="" ANTHROPIC_API_KEY="" MOONSHOT_API_KEY="" +DEEPSEEK_API_KEY="" # Jina Reader — optional Bearer for higher rate limits when using fetch_documentation_url # JINA_API_KEY="" diff --git a/apps/api/src/services/agent/text-generation.ts b/apps/api/src/services/agent/text-generation.ts index 97fabcc8..48e1ff67 100644 --- a/apps/api/src/services/agent/text-generation.ts +++ b/apps/api/src/services/agent/text-generation.ts @@ -5,7 +5,8 @@ const TEXT_GEN_MODELS: Record = { [AIProvider.OPENAI]: 'gpt-4o-mini', [AIProvider.ANTHROPIC]: 'claude-haiku-4-5-20251001', [AIProvider.GOOGLE]: 'gemini-3.1-flash-lite', - [AIProvider.MOONSHOT]: 'kimi-k2.6' + [AIProvider.MOONSHOT]: 'kimi-k2.6', + [AIProvider.DEEPSEEK]: 'deepseek-chat' }; export interface GenerateFieldTextResult { diff --git a/apps/api/src/services/agent/title-generation.ts b/apps/api/src/services/agent/title-generation.ts index 4798da00..af5e51fd 100644 --- a/apps/api/src/services/agent/title-generation.ts +++ b/apps/api/src/services/agent/title-generation.ts @@ -9,7 +9,8 @@ const TITLE_MODELS: Record = { [AIProvider.OPENAI]: 'gpt-4o-mini', [AIProvider.ANTHROPIC]: 'claude-haiku-4-5-20251001', [AIProvider.GOOGLE]: 'gemini-3.1-flash-lite', - [AIProvider.MOONSHOT]: 'kimi-k2.6' + [AIProvider.MOONSHOT]: 'kimi-k2.6', + [AIProvider.DEEPSEEK]: 'deepseek-chat' }; function createTitleModel(config: AIProviderConfig) { diff --git a/apps/course-app/.nvmrc b/apps/course-app/.nvmrc index 0f35649c..5bcf9c6e 100644 --- a/apps/course-app/.nvmrc +++ b/apps/course-app/.nvmrc @@ -1 +1 @@ -v20.19.3 +v24.18.0 diff --git a/apps/dashboard/.nvmrc b/apps/dashboard/.nvmrc index 0f35649c..5bcf9c6e 100644 --- a/apps/dashboard/.nvmrc +++ b/apps/dashboard/.nvmrc @@ -1 +1 @@ -v20.19.3 +v24.18.0 diff --git a/apps/dashboard/package.json b/apps/dashboard/package.json index 852c7432..89688fca 100644 --- a/apps/dashboard/package.json +++ b/apps/dashboard/package.json @@ -133,7 +133,7 @@ }, "type": "module", "engines": { - "node": "^20.19.3" + "node": "^24.0.0" }, "browser": { "crypto": false diff --git a/apps/dashboard/src/app.css b/apps/dashboard/src/app.css index 2fd6b20f..b1315f21 100644 --- a/apps/dashboard/src/app.css +++ b/apps/dashboard/src/app.css @@ -40,6 +40,76 @@ U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } +/* ── ITC Avant Garde Std — fuente institucional Municipio de Tijuana ── */ +@font-face { + font-family: 'ITC Avant Garde Std'; + src: + local('ITC Avant Garde Gothic Std Extra Light'), + local('ITCAvantGardeStd-XLt'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff2') format('woff2'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff') format('woff'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-XLt.ttf') format('truetype'); + font-weight: 200; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'ITC Avant Garde Std'; + src: + local('ITC Avant Garde Gothic Std Book'), + local('ITCAvantGardeStd-Bk'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff2') format('woff2'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff') format('woff'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Bk.ttf') format('truetype'); + font-weight: 300; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'ITC Avant Garde Std'; + src: + local('ITC Avant Garde Gothic Std Medium'), + local('ITCAvantGardeStd-Md'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff2') format('woff2'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff') format('woff'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Md.ttf') format('truetype'); + font-weight: 500; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'ITC Avant Garde Std'; + src: + local('ITC Avant Garde Gothic Std Demi'), + local('ITCAvantGardeStd-Demi'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff2') format('woff2'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff') format('woff'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Demi.ttf') format('truetype'); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: 'ITC Avant Garde Std'; + src: + local('ITC Avant Garde Gothic Std Bold'), + local('ITCAvantGardeStd-Bold'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff2') format('woff2'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff') format('woff'), + url('/fonts/oficios-fonts/ITCAvantGardeStd-Bold.ttf') format('truetype'); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +@theme inline { + --font-cio: 'ITC Avant Garde Std', var(--font-sans); +} + /** Global scrollbar styles */ html { --scrollbarBG: #fff; diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.ttf b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.ttf new file mode 100644 index 00000000..673c29ae Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.ttf differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff new file mode 100644 index 00000000..38056ee5 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff2 b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff2 new file mode 100644 index 00000000..70b92172 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bk.woff2 differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.ttf b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.ttf new file mode 100644 index 00000000..af857017 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.ttf differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff new file mode 100644 index 00000000..28a2828d Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff2 b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff2 new file mode 100644 index 00000000..e16d2913 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Bold.woff2 differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.ttf b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.ttf new file mode 100644 index 00000000..32967899 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.ttf differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff new file mode 100644 index 00000000..dc76b2cd Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff2 b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff2 new file mode 100644 index 00000000..9b9a36dd Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Demi.woff2 differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.ttf b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.ttf new file mode 100644 index 00000000..0fa80bd4 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.ttf differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff new file mode 100644 index 00000000..1ea7bd75 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff2 b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff2 new file mode 100644 index 00000000..e8db78ae Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-Md.woff2 differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.ttf b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.ttf new file mode 100644 index 00000000..5f940908 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.ttf differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff new file mode 100644 index 00000000..566378bd Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff differ diff --git a/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff2 b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff2 new file mode 100644 index 00000000..f043fb73 Binary files /dev/null and b/apps/dashboard/static/fonts/oficios-fonts/ITCAvantGardeStd-XLt.woff2 differ diff --git a/apps/website/.nvmrc b/apps/website/.nvmrc index 0f35649c..5bcf9c6e 100644 --- a/apps/website/.nvmrc +++ b/apps/website/.nvmrc @@ -1 +1 @@ -v20.19.3 +v24.18.0 diff --git a/apps/website/package.json b/apps/website/package.json index 69e3b7a7..b51af1ec 100644 --- a/apps/website/package.json +++ b/apps/website/package.json @@ -29,7 +29,7 @@ }, "type": "module", "engines": { - "node": "^20.19.3" + "node": "^24.0.0" }, "dependencies": { "@cio/certificates": "workspace:*", diff --git a/docker-compose.yaml b/docker-compose.yaml index 8a564453..421e77d6 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -216,6 +216,9 @@ services: SMTP_SENDER: ${SMTP_SENDER:-} # Transcription + OpenAI-backed agent runs. OPENAI_API_KEY: ${OPENAI_API_KEY:-} + DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-} + ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-} + GOOGLE_API_KEY: ${GOOGLE_API_KEY:-} restart: unless-stopped volumes: diff --git a/docker/Dockerfile.api b/docker/Dockerfile.api index 0970cd37..d86ec4d3 100644 --- a/docker/Dockerfile.api +++ b/docker/Dockerfile.api @@ -1,4 +1,4 @@ -FROM node:20.19.3-slim +FROM node:24.18.0-slim WORKDIR /app diff --git a/docker/Dockerfile.dashboard b/docker/Dockerfile.dashboard index 343bb571..80dc05d9 100644 --- a/docker/Dockerfile.dashboard +++ b/docker/Dockerfile.dashboard @@ -1,4 +1,4 @@ -FROM node:20.19.3-slim +FROM node:24.18.0-slim WORKDIR /app diff --git a/docker/Dockerfile.jobs b/docker/Dockerfile.jobs index 0962b9ec..307321e7 100644 --- a/docker/Dockerfile.jobs +++ b/docker/Dockerfile.jobs @@ -1,4 +1,4 @@ -FROM node:20-bookworm-slim +FROM node:24-bookworm-slim # ffmpeg is needed for media probe / thumbnail / audio-extract / transcode tasks. RUN apt-get update \ diff --git a/package.json b/package.json index e6d25cb2..1007aba5 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "typescript": "^5.1.6" }, "engines": { - "node": "^20.19.3" + "node": "^24.0.0" }, "pnpm": { "onlyBuiltDependencies": [ diff --git a/packages/ai-assistant/package.json b/packages/ai-assistant/package.json index 485d1ff0..38823a71 100644 --- a/packages/ai-assistant/package.json +++ b/packages/ai-assistant/package.json @@ -36,6 +36,7 @@ }, "dependencies": { "@ai-sdk/anthropic": "^3.0.69", + "@ai-sdk/deepseek": "^3.0.29", "@ai-sdk/google": "^3.0.0", "@ai-sdk/moonshotai": "^2.0.21", "@ai-sdk/openai": "^3.0.52", diff --git a/packages/ai-assistant/src/providers/index.ts b/packages/ai-assistant/src/providers/index.ts index 49028d38..1594d5ce 100644 --- a/packages/ai-assistant/src/providers/index.ts +++ b/packages/ai-assistant/src/providers/index.ts @@ -2,6 +2,7 @@ import { createOpenAI } from '@ai-sdk/openai'; import { createAnthropic } from '@ai-sdk/anthropic'; import { createGoogleGenerativeAI } from '@ai-sdk/google'; import { createMoonshotAI } from '@ai-sdk/moonshotai'; +import { createDeepSeek } from '@ai-sdk/deepseek'; import type { LanguageModel } from 'ai'; import { AIProvider, type AIProviderConfig } from '../types'; @@ -9,14 +10,16 @@ const DEFAULT_MODELS: Record = { [AIProvider.OPENAI]: 'gpt-5.4-mini', [AIProvider.ANTHROPIC]: 'claude-sonnet-4-20250514', [AIProvider.GOOGLE]: 'gemini-3.1-flash-lite', - [AIProvider.MOONSHOT]: 'kimi-k2.6' + [AIProvider.MOONSHOT]: 'kimi-k2.6', + [AIProvider.DEEPSEEK]: 'deepseek-chat' }; const PROVIDER_API_KEY_ENV: Record = { [AIProvider.OPENAI]: 'OPENAI_API_KEY', [AIProvider.ANTHROPIC]: 'ANTHROPIC_API_KEY', [AIProvider.GOOGLE]: 'GOOGLE_API_KEY', - [AIProvider.MOONSHOT]: 'MOONSHOT_API_KEY' + [AIProvider.MOONSHOT]: 'MOONSHOT_API_KEY', + [AIProvider.DEEPSEEK]: 'DEEPSEEK_API_KEY' }; /** @@ -43,6 +46,10 @@ export function createModel(config: AIProviderConfig): LanguageModel { const moonshot = createMoonshotAI({ apiKey: config.apiKey }); return moonshot(modelName); } + case AIProvider.DEEPSEEK: { + const deepseek = createDeepSeek({ apiKey: config.apiKey }); + return deepseek(modelName); + } default: throw new Error(`Unsupported AI provider: ${config.provider}`); } @@ -64,7 +71,7 @@ export function getProviderConfigForProvider(provider: AIProvider): AIProviderCo * Used by routes that don't take an explicit model (status check, title generation). */ export function pickAnyConfiguredProvider(): AIProviderConfig | null { - const order: AIProvider[] = [AIProvider.GOOGLE, AIProvider.OPENAI, AIProvider.ANTHROPIC]; + const order: AIProvider[] = [AIProvider.DEEPSEEK, AIProvider.GOOGLE, AIProvider.OPENAI, AIProvider.ANTHROPIC]; for (const provider of order) { const config = getProviderConfigForProvider(provider); diff --git a/packages/ai-assistant/src/types.ts b/packages/ai-assistant/src/types.ts index 5d627132..f3f932e5 100644 --- a/packages/ai-assistant/src/types.ts +++ b/packages/ai-assistant/src/types.ts @@ -15,7 +15,8 @@ export const AIProvider = { OPENAI: 'openai', ANTHROPIC: 'anthropic', GOOGLE: 'google', - MOONSHOT: 'moonshot' + MOONSHOT: 'moonshot', + DEEPSEEK: 'deepseek' } as const; export type AIProvider = (typeof AIProvider)[keyof typeof AIProvider]; diff --git a/packages/db/src/scripts/scratch.cjs b/packages/db/src/scripts/scratch.cjs new file mode 100644 index 00000000..8c9bf50b --- /dev/null +++ b/packages/db/src/scripts/scratch.cjs @@ -0,0 +1,35 @@ +const fs = require('fs'); +let seedTs = fs.readFileSync('src/scripts/seed.ts', 'utf8'); + +const constants = ` +const TUTOR_USER_ID = '01676a50-bb56-4c5e-8a61-fb9e9190fb10'; +const TUTOR2_USER_ID = '8f3a5b2c-1d4e-4f6f-a8b9-0c1d2e3f4a5b'; +const PROF2_GROUP_ID = '11112222-3333-4444-5555-666677778888'; +const PROF2_COURSE_ID = 'aaaabbbb-cccc-dddd-eeee-ffff00001111'; +`; + +seedTs = seedTs.replace("const TUTOR_USER_ID = '01676a50-bb56-4c5e-8a61-fb9e9190fb10';", constants); + +seedTs = seedTs.replace( + 'tutorUserId: TUTOR_USER_ID,', + 'tutorUserId: TUTOR_USER_ID,\n tutor2UserId: TUTOR2_USER_ID,' +); + +seedTs = seedTs.replace('testOrgId: TEST_ORG_ID,', 'testOrgId: TEST_ORG_ID,\n prof2GroupId: PROF2_GROUP_ID,'); + +seedTs = seedTs.replace( + 'adminUserId: ADMIN_USER_ID,', + 'adminUserId: ADMIN_USER_ID,\n prof2GroupId: PROF2_GROUP_ID,' +); + +seedTs = seedTs.replace( + 'pandasGroupId: PANDAS_GROUP_ID,', + 'pandasGroupId: PANDAS_GROUP_ID,\n prof2GroupId: PROF2_GROUP_ID,' +); + +seedTs = seedTs.replace( + 'earlyAdopterGroupId: EARLY_ADOPTER_GROUP_ID', + 'earlyAdopterGroupId: EARLY_ADOPTER_GROUP_ID,\n prof2CourseId: PROF2_COURSE_ID' +); + +fs.writeFileSync('src/scripts/seed.ts', seedTs); diff --git a/packages/db/src/scripts/scratch.js b/packages/db/src/scripts/scratch.js new file mode 100644 index 00000000..9c906222 --- /dev/null +++ b/packages/db/src/scripts/scratch.js @@ -0,0 +1,32 @@ +const fs = require('fs'); +const path = './users.json'; +const users = JSON.parse(fs.readFileSync(path, 'utf8')); + +users.forEach((u) => { + if (u.email === 'admin@test.com') { + u.email = 'ulises.vargas@agenciadigitaltj.gob.mx'; + u.profile_fullname = 'Ulises Vargas Flores'; + if (u.identities && u.identities[0]) { + u.identities[0].email = 'ulises.vargas@agenciadigitaltj.gob.mx'; + u.identities[0].identity_data.email = 'ulises.vargas@agenciadigitaltj.gob.mx'; + } + } + if (u.email === 'test@test.com') { + u.email = 'gehernandez@tijuana.gob.mx'; + u.profile_fullname = 'Eloy Gustavo Hernandez Ramirez'; + if (u.identities && u.identities[0]) { + u.identities[0].email = 'gehernandez@tijuana.gob.mx'; + u.identities[0].identity_data.email = 'gehernandez@tijuana.gob.mx'; + } + } + if (u.email === 'student@test.com') { + u.email = 'mavuelvas@tijuana.gob.mx'; + u.profile_fullname = 'Marco Antonio Vuelvas Diaz'; + if (u.identities && u.identities[0]) { + u.identities[0].email = 'mavuelvas@tijuana.gob.mx'; + u.identities[0].identity_data.email = 'mavuelvas@tijuana.gob.mx'; + } + } +}); + +fs.writeFileSync(path, JSON.stringify(users, null, 2)); diff --git a/packages/db/src/scripts/scratch.ts b/packages/db/src/scripts/scratch.ts new file mode 100644 index 00000000..1e36d019 --- /dev/null +++ b/packages/db/src/scripts/scratch.ts @@ -0,0 +1,32 @@ +import 'dotenv/config'; +import { db } from '../drizzle'; +import { isCourseTeamMemberOrOrgAdmin } from '../queries/group/group'; +import postgres from 'postgres'; + +async function main() { + const courseId = 'd5309f67-e881-45c9-9d72-acc380889fef'; + const sql = postgres(process.env.DATABASE_URL!); + const [profile] = await sql`SELECT id FROM profile WHERE email = 'ulises.vargas@agenciadigitaltj.gob.mx'`; + + if (profile) { + const isTeam = await isCourseTeamMemberOrOrgAdmin(courseId, profile.id); + console.log('isTeam:', isTeam); + + // Check groupmember and organizationmember explicitly + const data = await sql` + SELECT + gm.role_id as gm_role, + om.role_id as om_role, + g.organization_id, + c.group_id + FROM course c + JOIN "group" g ON c.group_id = g.id + LEFT JOIN groupmember gm ON gm.group_id = g.id AND gm.profile_id = ${profile.id} + LEFT JOIN organizationmember om ON om.organization_id = g.organization_id AND om.profile_id = ${profile.id} + WHERE c.id = ${courseId} + `; + console.log('data:', data); + } + process.exit(0); +} +main().catch(console.error); diff --git a/packages/db/src/scripts/seed.ts b/packages/db/src/scripts/seed.ts index 470d4f94..db3b249e 100644 --- a/packages/db/src/scripts/seed.ts +++ b/packages/db/src/scripts/seed.ts @@ -21,7 +21,7 @@ import { seedUsers } from '@db/utils/seed/users'; import usersData from '../../users.json'; // Constants for IDs used across multiple seed functions -const TEST_ORG_ID = '1a1dcddd-1abc-4f72-b644-0bd18191a289'; +const ENTERPRISE_ORG_ID = '1a1dcddd-1abc-4f72-b644-0bd18191a289'; const ADMIN_USER_ID = '7ac00503-8519-43c8-a5ea-b79aeca900b1'; const MVC_GROUP_ID = 'c6b022fd-fff3-4f09-8960-c9cb06819761'; const REACT_GROUP_ID = '04a250f1-bcb9-4e0d-a3d4-a01096e7a105'; @@ -29,11 +29,17 @@ const PANDAS_GROUP_ID = '0789ced2-b8f3-472c-97ff-bdde1e80dddf'; const MVC_COURSE_ID = '98e6e798-f0bd-4f9d-a6f5-ce0816a4f97e'; const REACT_COURSE_ID = '16e3bc8d-5d1b-4708-988e-93abae288ccf'; const PANDAS_COURSE_ID = 'f0a85d18-aff4-412f-b8e6-3b34ef098dce'; + +const TUTOR_USER_ID = '01676a50-bb56-4c5e-8a61-fb9e9190fb10'; +const TUTOR2_USER_ID = '8f3a5b2c-1d4e-4f6f-a8b9-0c1d2e3f4a5b'; +const PROF2_GROUP_ID = '11112222-3333-4444-5555-666677778888'; +const PROF2_COURSE_ID = 'aaaabbbb-cccc-dddd-eeee-ffff00001111'; + const STUDENT_USER_ID = '0c256e75-aa40-4f62-8d30-0217ca1c60d9'; const ENTERPRISE_ORG_ID = '2b8f4a1c-6d3e-4b2a-9f7e-1c4d8a6e9b0f'; const ENTERPRISE_ADMIN_USER_ID = '3c9052de-7e4f-4c3a-8d8e-2d5e9b7f1a3c'; const ENTERPRISE_STUDENT_USER_ID = '4da163ef-8050-4d4b-9c9f-3e6fac802b4d'; -const EARLY_ADOPTER_ORG_ID = '5c7d4b2e-8f5a-4c3b-ae8f-2d6e9c1b0f5a'; +const ENTERPRISE_ORG_ID = '5c7d4b2e-8f5a-4c3b-ae8f-2d6e9c1b0f5a'; const EARLY_ADOPTER_ADMIN_USER_ID = '6e0163ff-9161-4d4b-be9f-3e7fbd913c5e'; const EARLY_ADOPTER_STUDENT_USER_ID = '7fb274aa-a272-4e5c-cf0a-4f8cce024d6f'; const EARLY_ADOPTER_GROUP_ID = '8ac385bb-b383-4f6d-d01b-5a9ddf135e7a'; @@ -120,21 +126,27 @@ const seedFunctions = { organizations: async () => { console.log('📝 Seeding organizations...'); await seedOrganization({ - testOrgId: TEST_ORG_ID, + testOrgId: ENTERPRISE_ORG_ID, + prof2GroupId: PROF2_GROUP_ID, enterpriseOrgId: ENTERPRISE_ORG_ID, - earlyAdopterOrgId: EARLY_ADOPTER_ORG_ID + earlyAdopterOrgId: ENTERPRISE_ORG_ID, + prof2GroupId: PROF2_GROUP_ID }); }, 'organization-members': async () => { console.log('📝 Seeding organization members...'); await seedOrganizationMember({ - testOrgId: TEST_ORG_ID, + testOrgId: ENTERPRISE_ORG_ID, adminUserId: ADMIN_USER_ID, + prof2GroupId: PROF2_GROUP_ID, + tutorUserId: TUTOR_USER_ID, + tutor2UserId: TUTOR2_USER_ID, + tutor2UserId: TUTOR2_USER_ID, studentUserId: STUDENT_USER_ID, enterpriseOrgId: ENTERPRISE_ORG_ID, enterpriseAdminUserId: ENTERPRISE_ADMIN_USER_ID, enterpriseStudentUserId: ENTERPRISE_STUDENT_USER_ID, - earlyAdopterOrgId: EARLY_ADOPTER_ORG_ID, + earlyAdopterOrgId: ENTERPRISE_ORG_ID, earlyAdopterAdminUserId: EARLY_ADOPTER_ADMIN_USER_ID, earlyAdopterStudentUserId: EARLY_ADOPTER_STUDENT_USER_ID }); @@ -143,7 +155,7 @@ const seedFunctions = { console.log('📝 Seeding enterprise organization plan...'); await seedEnterpriseOrganizationPlan({ enterpriseOrgId: ENTERPRISE_ORG_ID }); console.log('📝 Seeding early adopter organization plan...'); - await seedEarlyAdopterOrganizationPlan({ earlyAdopterOrgId: EARLY_ADOPTER_ORG_ID }); + await seedEarlyAdopterOrganizationPlan({ earlyAdopterOrgId: ENTERPRISE_ORG_ID }); }, groups: async () => { console.log('📝 Seeding groups...'); @@ -151,9 +163,11 @@ const seedFunctions = { mvcGroupId: MVC_GROUP_ID, reactGroupId: REACT_GROUP_ID, pandasGroupId: PANDAS_GROUP_ID, - testOrgId: TEST_ORG_ID, + prof2GroupId: PROF2_GROUP_ID, + testOrgId: ENTERPRISE_ORG_ID, earlyAdopterGroupId: EARLY_ADOPTER_GROUP_ID, - earlyAdopterOrgId: EARLY_ADOPTER_ORG_ID + prof2CourseId: PROF2_COURSE_ID, + earlyAdopterOrgId: ENTERPRISE_ORG_ID }); }, 'group-members': async () => { @@ -162,7 +176,10 @@ const seedFunctions = { mvcGroupId: MVC_GROUP_ID, reactGroupId: REACT_GROUP_ID, pandasGroupId: PANDAS_GROUP_ID, + prof2GroupId: PROF2_GROUP_ID, adminUserId: ADMIN_USER_ID, + tutorUserId: TUTOR_USER_ID, + tutor2UserId: TUTOR2_USER_ID, studentUserId: STUDENT_USER_ID, earlyAdopterGroupId: EARLY_ADOPTER_GROUP_ID, earlyAdopterAdminUserId: EARLY_ADOPTER_ADMIN_USER_ID, @@ -175,6 +192,7 @@ const seedFunctions = { mvcGroupId: MVC_GROUP_ID, reactGroupId: REACT_GROUP_ID, pandasGroupId: PANDAS_GROUP_ID, + prof2GroupId: PROF2_GROUP_ID, earlyAdopterGroupId: EARLY_ADOPTER_GROUP_ID }); }, diff --git a/packages/db/src/utils/seed/course.ts b/packages/db/src/utils/seed/course.ts index f5251439..f0a46fa1 100644 --- a/packages/db/src/utils/seed/course.ts +++ b/packages/db/src/utils/seed/course.ts @@ -6,10 +6,17 @@ interface SeedCourse { mvcGroupId: string; reactGroupId: string; pandasGroupId: string; + prof2GroupId: string; earlyAdopterGroupId: string; } -export async function seedCourses({ mvcGroupId, reactGroupId, pandasGroupId, earlyAdopterGroupId }: SeedCourse) { +export async function seedCourses({ + mvcGroupId, + reactGroupId, + pandasGroupId, + prof2GroupId, + earlyAdopterGroupId +}: SeedCourse) { const existingCourses = await db.select().from(course); const existingCourseIds = existingCourses.map((c) => c.id); @@ -17,13 +24,41 @@ export async function seedCourses({ mvcGroupId, reactGroupId, pandasGroupId, ear const reactCourseId = '16e3bc8d-5d1b-4708-988e-93abae288ccf'; const pandasCourseId = 'f0a85d18-aff4-412f-b8e6-3b34ef098dce'; const earlyAdopterCourseId = '9bd496cc-c494-4a7e-e12c-6baeef246f8b'; + const prof2CourseId = 'aaaabbbb-cccc-dddd-eeee-ffff00001111'; const coursesToInsert: TNewCourse[] = [ { - id: mvcCourseId, - title: 'Getting started with MVC', + id: prof2CourseId, + title: 'Introducción a la Administración Pública', description: - "Embark on a comprehensive journey into the world of Model-View-Controller (MVC) architecture with our course, 'Getting Started with MVC.' Designed for beginners and aspiring developers, this course provides a solid foundation for understanding the principles and practices behind MVC, a widely adopted design pattern in software development.", + 'Curso impartido por la profesora Laura Perez Garcia sobre los fundamentos de la administración pública y su aplicación práctica en el Ayuntamiento.', + overview: 'Welcome to this amazing course 🚀 ', + groupId: prof2GroupId, + isTemplate: false, + logo: '', + slug: 'introduccion-administracion-publica', + metadata: { + goals: '', + grading: false, + description: '', + requirements: '', + lessonDownload: false, + allowNewStudent: true + }, + cost: 0, + currency: 'NGN', + isPublished: true, + certificate: { + isDownloadable: false, + theme: 'professional' + }, + status: 'ACTIVE' + }, + { + id: mvcCourseId, + title: 'Inducción al H. Ayuntamiento de Tijuana', + description: + 'Conoce la estructura, misión y visión del gobierno municipal. Este curso es obligatorio para todos los nuevos servidores públicos de Tijuana.', overview: '

"Getting Started with MVC. is designed for beginners and aspiring developers, this course provides a solid foundation for understanding the principles and practices behind MVC, a widely adopted design pattern in software development.

', groupId: mvcGroupId, @@ -49,9 +84,9 @@ export async function seedCourses({ mvcGroupId, reactGroupId, pandasGroupId, ear }, { id: reactCourseId, - title: 'Modern Web Development with React', + title: 'Transparencia y Acceso a la Información', description: - "By the end of this course, you'll be equipped to build interactive and responsive web applications, making you a proficient React developer ready for the demands of today's web development landscape.", + 'Capacitación sobre la Ley General de Transparencia, el manejo de datos personales y la respuesta a solicitudes ciudadanas.', overview: 'Welcome to this amazing course 🚀 ', groupId: reactGroupId, isTemplate: true, @@ -76,7 +111,7 @@ export async function seedCourses({ mvcGroupId, reactGroupId, pandasGroupId, ear }, { id: pandasCourseId, - title: 'Data Science with Python and Pandas', + title: 'Atención Ciudadana y Calidad en el Servicio', description: 'Unlock the power of data with our "Data Science with Python and Pandas" course. Dive into Python programming fundamentals and then journey into the world of Pandas for efficient data manipulation and analysis. Learn essential data cleaning and preprocessing techniques before venturing into statistical analysis using Pandas. Cap off your exploration with data visualization using Matplotlib and Seaborn.', overview: 'Welcome to this amazing course 🚀 ', @@ -103,7 +138,7 @@ export async function seedCourses({ mvcGroupId, reactGroupId, pandasGroupId, ear }, { id: earlyAdopterCourseId, - title: 'Product Management Fundamentals', + title: 'Procedimientos Administrativos Locales', description: 'A practical introduction to product management covering roadmaps, prioritization frameworks, user research, and cross-functional collaboration skills needed to ship great products.', overview: 'Welcome to Product Management Fundamentals 🚀', diff --git a/packages/db/src/utils/seed/group.ts b/packages/db/src/utils/seed/group.ts index 056af281..bbca95e9 100644 --- a/packages/db/src/utils/seed/group.ts +++ b/packages/db/src/utils/seed/group.ts @@ -4,6 +4,7 @@ interface SeedGroup { mvcGroupId: string; reactGroupId: string; pandasGroupId: string; + prof2GroupId: string; testOrgId: string; earlyAdopterGroupId: string; earlyAdopterOrgId: string; @@ -13,6 +14,7 @@ export async function seedGroup({ mvcGroupId, reactGroupId, pandasGroupId, + prof2GroupId, testOrgId, earlyAdopterGroupId, earlyAdopterOrgId @@ -42,6 +44,13 @@ export async function seedGroup({ 'Unlock the power of data with our "Data Science with Python and Pandas" course. Dive into Python programming fundamentals and then journey into the world of Pandas for efficient data manipulation and analysis.', organizationId: testOrgId }, + { + id: prof2GroupId, + name: 'Introducción a la Administración Pública', + description: + 'Curso impartido por la profesora Laura Perez Garcia sobre los fundamentos de la administración pública y su aplicación práctica en el Ayuntamiento.', + organizationId: testOrgId + }, { id: earlyAdopterGroupId, name: 'Product Management Fundamentals', diff --git a/packages/db/src/utils/seed/groupmember.ts b/packages/db/src/utils/seed/groupmember.ts index 261a995f..44a6150e 100644 --- a/packages/db/src/utils/seed/groupmember.ts +++ b/packages/db/src/utils/seed/groupmember.ts @@ -4,7 +4,10 @@ interface SeedGroupmember { mvcGroupId: string; reactGroupId: string; pandasGroupId: string; + prof2GroupId: string; adminUserId: string; + tutorUserId: string; + tutor2UserId: string; studentUserId: string; earlyAdopterGroupId: string; earlyAdopterAdminUserId: string; @@ -15,7 +18,10 @@ export async function seedGroupmembers({ mvcGroupId, reactGroupId, pandasGroupId, + prof2GroupId, adminUserId, + tutorUserId, + tutor2UserId, studentUserId, earlyAdopterGroupId, earlyAdopterAdminUserId, @@ -28,20 +34,26 @@ export async function seedGroupmembers({ { groupId: mvcGroupId, roleId: 2, // TUTOR - profileId: adminUserId, - email: 'admin@test.com' + profileId: tutorUserId, + email: 'gehernandez@tijuana.gob.mx' }, { groupId: reactGroupId, roleId: 2, // TUTOR - profileId: adminUserId, - email: 'admin@test.com' + profileId: tutorUserId, + email: 'gehernandez@tijuana.gob.mx' }, { groupId: pandasGroupId, roleId: 2, // TUTOR - profileId: adminUserId, - email: 'admin@test.com' + profileId: tutorUserId, + email: 'gehernandez@tijuana.gob.mx' + }, + { + groupId: prof2GroupId, + roleId: 2, // TUTOR + profileId: tutor2UserId, + email: 'profesor2@tijuana.gob.mx' }, { groupId: pandasGroupId, diff --git a/packages/db/src/utils/seed/organization.ts b/packages/db/src/utils/seed/organization.ts index c1b1252a..44611508 100644 --- a/packages/db/src/utils/seed/organization.ts +++ b/packages/db/src/utils/seed/organization.ts @@ -1,9 +1,7 @@ import { db, organization } from '@db/drizzle'; export async function seedOrganization({ - testOrgId, - enterpriseOrgId, - earlyAdopterOrgId + enterpriseOrgId }: { testOrgId: string; enterpriseOrgId: string; @@ -13,36 +11,10 @@ export async function seedOrganization({ const existingOrgIds = existingOrgs.map((o) => o.id); const organizationsToInsert = [ - { - id: testOrgId, - name: 'Udemy Test', - siteName: 'udemy-test', - settings: {}, - landingpage: {}, - theme: '', - customization: { - apps: { poll: true, comments: true }, - course: { grading: true, newsfeed: true }, - dashboard: { exercise: true, community: true, bannerText: '', bannerImage: '' } - } - }, { id: enterpriseOrgId, - name: 'Coursera Test', - siteName: 'coursera-test', - settings: {}, - landingpage: {}, - theme: '', - customization: { - apps: { poll: true, comments: true }, - course: { grading: true, newsfeed: true }, - dashboard: { exercise: true, community: true, bannerText: '', bannerImage: '' } - } - }, - { - id: earlyAdopterOrgId, - name: 'Skillshare Test', - siteName: 'skillshare-test', + name: 'H. Ayuntamiento de Tijuana', + siteName: 'ayuntamiento-tijuana', settings: {}, landingpage: {}, theme: '', diff --git a/packages/db/src/utils/seed/organizationmember.ts b/packages/db/src/utils/seed/organizationmember.ts index c1491f99..dac0aa12 100644 --- a/packages/db/src/utils/seed/organizationmember.ts +++ b/packages/db/src/utils/seed/organizationmember.ts @@ -3,6 +3,8 @@ import { db, organizationmember } from '@db/drizzle'; interface SeedOrganizationMember { testOrgId: string; adminUserId: string; + tutorUserId: string; + tutor2UserId: string; studentUserId: string; enterpriseOrgId: string; enterpriseAdminUserId: string; @@ -13,55 +15,39 @@ interface SeedOrganizationMember { } export async function seedOrganizationMember({ - testOrgId, adminUserId, + tutorUserId, + tutor2UserId, studentUserId, - enterpriseOrgId, - enterpriseAdminUserId, - enterpriseStudentUserId, - earlyAdopterOrgId, - earlyAdopterAdminUserId, - earlyAdopterStudentUserId + enterpriseOrgId }: SeedOrganizationMember) { const existingOrgMembers = await db.select().from(organizationmember); const existingOrgMemberKeys = existingOrgMembers.map((om) => `${om.organizationId}-${om.profileId}`); const orgMembersToInsert = [ { - organizationId: testOrgId, + organizationId: enterpriseOrgId, roleId: 1, // ADMIN profileId: adminUserId, verified: false }, { - organizationId: testOrgId, + organizationId: enterpriseOrgId, + roleId: 2, // TUTOR + profileId: tutorUserId, + verified: false + }, + { + organizationId: enterpriseOrgId, + roleId: 2, // TUTOR + profileId: tutor2UserId, + verified: false + }, + { + organizationId: enterpriseOrgId, roleId: 3, // STUDENT profileId: studentUserId, verified: false - }, - { - organizationId: enterpriseOrgId, - roleId: 1, // ADMIN - profileId: enterpriseAdminUserId, - verified: false - }, - { - organizationId: enterpriseOrgId, - roleId: 3, // STUDENT - profileId: enterpriseStudentUserId, - verified: false - }, - { - organizationId: earlyAdopterOrgId, - roleId: 1, // ADMIN - profileId: earlyAdopterAdminUserId, - verified: false - }, - { - organizationId: earlyAdopterOrgId, - roleId: 3, // STUDENT - profileId: earlyAdopterStudentUserId, - verified: false } ].filter((om) => !existingOrgMemberKeys.includes(`${om.organizationId}-${om.profileId}`)); diff --git a/packages/db/users.json b/packages/db/users.json index 692d7773..cd13c05a 100644 --- a/packages/db/users.json +++ b/packages/db/users.json @@ -4,8 +4,8 @@ "id": "01676a50-bb56-4c5e-8a61-fb9e9190fb10", "aud": "authenticated", "role": "authenticated", - "email": "test@test.com", - "encrypted_password": "$2a$10$WmfPO84h.8SbkZWSzXAygead77QQQXdeO5XIMd8iXk8SFQKB3Udy2", + "email": "gehernandez@tijuana.gob.mx", + "encrypted_password": "$2a$10$n8vBI6.pyE0W/RO9DcJDseLKF/CRwsU4X4Lc2MaQogt8pQgnJavTa", "email_confirmed_at": "2023-11-22T10:09:32.250Z", "invited_at": null, "confirmation_token": "", @@ -16,7 +16,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": "2023-12-04T12:57:34.337Z", - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2023-11-22T10:09:32.171Z", @@ -39,24 +42,27 @@ { "provider_id": "01676a50-bb56-4c5e-8a61-fb9e9190fb10", "user_id": "01676a50-bb56-4c5e-8a61-fb9e9190fb10", - "identity_data": { "sub": "01676a50-bb56-4c5e-8a61-fb9e9190fb10", "email": "test@test.com" }, + "identity_data": { + "sub": "01676a50-bb56-4c5e-8a61-fb9e9190fb10", + "email": "gehernandez@tijuana.gob.mx" + }, "provider": "email", "last_sign_in_at": "2023-11-22T10:09:32.225444+00:00", "created_at": "2023-11-22T10:09:32.225521+00:00", "updated_at": "2023-11-22T10:09:32.225521+00:00", - "email": "test@test.com", + "email": "gehernandez@tijuana.gob.mx", "id": "a8961fe8-d51f-4b58-b8bb-a77d6a3c0cbd" } ], - "profile_fullname": "Alice" + "profile_fullname": "Eloy Gustavo Hernandez Ramirez" }, { "instance_id": "00000000-0000-0000-0000-000000000000", "id": "0c256e75-aa40-4f62-8d30-0217ca1c60d9", "aud": "authenticated", "role": "authenticated", - "email": "student@test.com", - "encrypted_password": "$2a$10$dgxySj.k12gDKhLx7X4x6./J.Nzhz7WQrwh5lkjLKwIwWW4o5GJcW", + "email": "mavuelvas@tijuana.gob.mx", + "encrypted_password": "$2a$10$n8vBI6.pyE0W/RO9DcJDseLKF/CRwsU4X4Lc2MaQogt8pQgnJavTa", "email_confirmed_at": "2023-12-18T17:08:57.413Z", "invited_at": null, "confirmation_token": "", @@ -67,7 +73,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": "2023-12-19T18:22:55.359Z", - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2023-12-18T17:08:57.399Z", @@ -90,23 +99,26 @@ { "provider_id": "0c256e75-aa40-4f62-8d30-0217ca1c60d9", "user_id": "0c256e75-aa40-4f62-8d30-0217ca1c60d9", - "identity_data": { "sub": "0c256e75-aa40-4f62-8d30-0217ca1c60d9", "email": "student@test.com" }, + "identity_data": { + "sub": "0c256e75-aa40-4f62-8d30-0217ca1c60d9", + "email": "mavuelvas@tijuana.gob.mx" + }, "provider": "email", "last_sign_in_at": "2023-12-18T17:08:57.410285+00:00", "created_at": "2023-12-18T17:08:57.410344+00:00", "updated_at": "2023-12-18T17:08:57.410344+00:00", - "email": "student@test.com", + "email": "mavuelvas@tijuana.gob.mx", "id": "65fa8bad-ca49-4676-8b17-ead4cd37fed6" } ], - "profile_fullname": "John Doe" + "profile_fullname": "Marco Antonio Vuelvas Diaz" }, { "instance_id": "00000000-0000-0000-0000-000000000000", "id": "7ac00503-8519-43c8-a5ea-b79aeca900b1", "aud": "authenticated", "role": "authenticated", - "email": "admin@test.com", + "email": "ulises.vargas@agenciadigitaltj.gob.mx", "encrypted_password": "$2a$10$n8vBI6.pyE0W/RO9DcJDseLKF/CRwsU4X4Lc2MaQogt8pQgnJavTa", "email_confirmed_at": "2023-12-16T14:04:38.311Z", "invited_at": null, @@ -118,7 +130,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": "2025-10-12T19:35:13.256Z", - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2023-12-16T14:04:38.281Z", @@ -141,16 +156,19 @@ { "provider_id": "7ac00503-8519-43c8-a5ea-b79aeca900b1", "user_id": "7ac00503-8519-43c8-a5ea-b79aeca900b1", - "identity_data": { "sub": "7ac00503-8519-43c8-a5ea-b79aeca900b1", "email": "admin@test.com" }, + "identity_data": { + "sub": "7ac00503-8519-43c8-a5ea-b79aeca900b1", + "email": "ulises.vargas@agenciadigitaltj.gob.mx" + }, "provider": "email", "last_sign_in_at": "2023-12-16T14:04:38.302264+00:00", "created_at": "2023-12-16T14:04:38.302326+00:00", "updated_at": "2023-12-16T14:04:38.302326+00:00", - "email": "admin@test.com", + "email": "ulises.vargas@agenciadigitaltj.gob.mx", "id": "e790ab09-9c5c-4fb4-aa6b-78a5abe8cd56" } ], - "profile_fullname": "Elon Gates" + "profile_fullname": "Ulises Vargas Flores" }, { "instance_id": "00000000-0000-0000-0000-000000000000", @@ -169,7 +187,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": null, - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2025-03-23T12:00:00.000Z", @@ -192,7 +213,10 @@ { "provider_id": "3c9052de-7e4f-4c3a-8d8e-2d5e9b7f1a3c", "user_id": "3c9052de-7e4f-4c3a-8d8e-2d5e9b7f1a3c", - "identity_data": { "sub": "3c9052de-7e4f-4c3a-8d8e-2d5e9b7f1a3c", "email": "enterprise@test.com" }, + "identity_data": { + "sub": "3c9052de-7e4f-4c3a-8d8e-2d5e9b7f1a3c", + "email": "enterprise@test.com" + }, "provider": "email", "last_sign_in_at": "2025-03-23T12:00:00.000Z", "created_at": "2025-03-23T12:00:00.000Z", @@ -220,7 +244,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": null, - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2025-03-23T12:00:00.000Z", @@ -243,7 +270,10 @@ { "provider_id": "4da163ef-8050-4d4b-9c9f-3e6fac802b4d", "user_id": "4da163ef-8050-4d4b-9c9f-3e6fac802b4d", - "identity_data": { "sub": "4da163ef-8050-4d4b-9c9f-3e6fac802b4d", "email": "enterprise-student@test.com" }, + "identity_data": { + "sub": "4da163ef-8050-4d4b-9c9f-3e6fac802b4d", + "email": "enterprise-student@test.com" + }, "provider": "email", "last_sign_in_at": "2025-03-23T12:00:00.000Z", "created_at": "2025-03-23T12:00:00.000Z", @@ -271,7 +301,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": null, - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2025-03-23T12:00:00.000Z", @@ -294,7 +327,10 @@ { "provider_id": "6e0163ff-9161-4d4b-be9f-3e7fbd913c5e", "user_id": "6e0163ff-9161-4d4b-be9f-3e7fbd913c5e", - "identity_data": { "sub": "6e0163ff-9161-4d4b-be9f-3e7fbd913c5e", "email": "early-adopter@test.com" }, + "identity_data": { + "sub": "6e0163ff-9161-4d4b-be9f-3e7fbd913c5e", + "email": "early-adopter@test.com" + }, "provider": "email", "last_sign_in_at": "2025-03-23T12:00:00.000Z", "created_at": "2025-03-23T12:00:00.000Z", @@ -322,7 +358,10 @@ "email_change": "", "email_change_sent_at": null, "last_sign_in_at": null, - "raw_app_meta_data": { "provider": "email", "providers": ["email"] }, + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, "raw_user_meta_data": {}, "is_super_admin": null, "created_at": "2025-03-23T12:00:00.000Z", @@ -345,7 +384,10 @@ { "provider_id": "7fb274aa-a272-4e5c-cf0a-4f8cce024d6f", "user_id": "7fb274aa-a272-4e5c-cf0a-4f8cce024d6f", - "identity_data": { "sub": "7fb274aa-a272-4e5c-cf0a-4f8cce024d6f", "email": "early-adopter-student@test.com" }, + "identity_data": { + "sub": "7fb274aa-a272-4e5c-cf0a-4f8cce024d6f", + "email": "early-adopter-student@test.com" + }, "provider": "email", "last_sign_in_at": "2025-03-23T12:00:00.000Z", "created_at": "2025-03-23T12:00:00.000Z", @@ -355,5 +397,62 @@ } ], "profile_fullname": "Early Adopter Student" + }, + { + "instance_id": "00000000-0000-0000-0000-000000000000", + "id": "8f3a5b2c-1d4e-4f6f-a8b9-0c1d2e3f4a5b", + "aud": "authenticated", + "role": "authenticated", + "email": "profesor2@tijuana.gob.mx", + "encrypted_password": "$2a$10$n8vBI6.pyE0W/RO9DcJDseLKF/CRwsU4X4Lc2MaQogt8pQgnJavTa", + "email_confirmed_at": "2023-11-22T10:09:32.250Z", + "invited_at": null, + "confirmation_token": "", + "confirmation_sent_at": null, + "recovery_token": "", + "recovery_sent_at": null, + "email_change_token_new": "", + "email_change": "", + "email_change_sent_at": null, + "last_sign_in_at": "2023-12-04T12:57:34.337Z", + "raw_app_meta_data": { + "provider": "email", + "providers": ["email"] + }, + "raw_user_meta_data": {}, + "is_super_admin": null, + "created_at": "2023-11-22T10:09:32.171Z", + "updated_at": "2023-12-16T14:00:35.986Z", + "phone": null, + "phone_confirmed_at": null, + "phone_change": "", + "phone_change_token": "", + "phone_change_sent_at": null, + "confirmed_at": "2023-11-22T10:09:32.250Z", + "email_change_token_current": "", + "email_change_confirm_status": 0, + "banned_until": null, + "reauthentication_token": "", + "reauthentication_sent_at": null, + "is_sso_user": false, + "deleted_at": null, + "is_anonymous": false, + "identities": [ + { + "provider_id": "8f3a5b2c-1d4e-4f6f-a8b9-0c1d2e3f4a5b", + "user_id": "8f3a5b2c-1d4e-4f6f-a8b9-0c1d2e3f4a5b", + "identity_data": { + "sub": "8f3a5b2c-1d4e-4f6f-a8b9-0c1d2e3f4a5b", + "email": "profesor2@tijuana.gob.mx" + }, + "provider": "email", + "last_sign_in_at": "2023-11-22T10:09:32.225444+00:00", + "created_at": "2023-11-22T10:09:32.225521+00:00", + "updated_at": "2023-11-22T10:09:32.225521+00:00", + "email": "profesor2@tijuana.gob.mx", + "id": "12345678-abcd-ef01-2345-6789abcdef01" + } + ], + "profile_fullname": "Laura Perez Garcia" } ] diff --git a/packages/utils/src/agent-models/index.ts b/packages/utils/src/agent-models/index.ts index ac238f44..c88d776d 100644 --- a/packages/utils/src/agent-models/index.ts +++ b/packages/utils/src/agent-models/index.ts @@ -7,10 +7,16 @@ * even though it isn't currently exposed to users. */ -export const AGENT_MODEL_IDS = ['gemini-3.1-flash-lite', 'gpt-5.4-mini', 'claude-sonnet-3-5', 'kimi-k2.6'] as const; +export const AGENT_MODEL_IDS = [ + 'gemini-3.1-flash-lite', + 'gpt-5.4-mini', + 'claude-sonnet-3-5', + 'kimi-k2.6', + 'deepseek-chat' +] as const; export type AgentModelId = (typeof AGENT_MODEL_IDS)[number]; -export type AgentModelProvider = 'google' | 'openai' | 'anthropic' | 'moonshot'; +export type AgentModelProvider = 'google' | 'openai' | 'anthropic' | 'moonshot' | 'deepseek'; export type AgentModelCostTier = 'low' | 'high'; export interface AgentModelDescriptor { @@ -58,14 +64,23 @@ export const AGENT_MODELS: Record = { isFree: true, costTier: 'low', contextWindow: 262_144 + }, + 'deepseek-chat': { + provider: 'deepseek', + label: 'DeepSeek Chat', + backendModelId: 'deepseek-chat', + isFree: true, + costTier: 'low', + contextWindow: 64000 } }; export const UI_PICKER_MODEL_IDS = [ + 'deepseek-chat', 'kimi-k2.6', 'gemini-3.1-flash-lite', 'gpt-5.4-mini', 'claude-sonnet-3-5' ] as const satisfies readonly AgentModelId[]; -export const DEFAULT_PICKER_MODEL_ID: AgentModelId = 'gemini-3.1-flash-lite'; +export const DEFAULT_PICKER_MODEL_ID: AgentModelId = 'deepseek-chat'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bffa870..12acd93f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -619,7 +619,7 @@ importers: version: 0.4.9(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@shikijs/twoslash': specifier: 4.3.1 - version: 4.3.1(typescript@6.0.3) + version: 4.3.1(typescript@5.9.3) '@tailwindcss/typography': specifier: 0.5.19 version: 0.5.19(tailwindcss@4.1.18) @@ -631,7 +631,7 @@ importers: version: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) blume: specifier: 1.2.0 - version: 1.2.0(864af55737aed5e342af6da019f32ece) + version: 1.2.0(4833f745f9fd8f626b4a7791f185a353) mermaid: specifier: ^11.16.0 version: 11.16.0 @@ -846,6 +846,9 @@ importers: '@ai-sdk/anthropic': specifier: ^3.0.69 version: 3.0.69(zod@4.2.1) + '@ai-sdk/deepseek': + specifier: ^3.0.29 + version: 3.0.29(zod@4.2.1) '@ai-sdk/google': specifier: ^3.0.0 version: 3.0.64(zod@4.2.1) @@ -1346,7 +1349,7 @@ importers: version: 10.1.10(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(esbuild@0.25.12)(rollup@4.54.0)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/sveltekit': specifier: ^8.4.2 - version: 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + version: 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/test': specifier: ^8.4.2 version: 8.6.14(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) @@ -1385,7 +1388,7 @@ importers: version: 4.21.0 typescript-svelte-plugin: specifier: ^0.3.50 - version: 0.3.50(svelte@5.46.0)(typescript@6.0.3) + version: 0.3.50(svelte@5.46.0)(typescript@5.9.3) vite: specifier: ^7.1.4 version: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) @@ -1633,6 +1636,12 @@ packages: peerDependencies: zod: 4.2.1 + '@ai-sdk/deepseek@3.0.29': + resolution: {integrity: sha512-MgcBrpQ+zfDUfzNBbMtylzCE7xBlqZtshtBtYFhQbMxpcMSPvkQsI3RBR3bNG1LWqWU4tsIe4Qzc/enriYdY2A==} + engines: {node: '>=22'} + peerDependencies: + zod: 4.2.1 + '@ai-sdk/gateway@2.0.111': resolution: {integrity: sha512-pZR4Is/0IGH1tDY6XgJltoH3hxVqZ+2StQMhWkBtCWWaa4JYKP8gAiNPDxy585HenQfcAqr1qsO9FgSYkHxo5w==} engines: {node: '>=18'} @@ -1687,6 +1696,12 @@ packages: peerDependencies: zod: 4.2.1 + '@ai-sdk/provider-utils@5.0.28': + resolution: {integrity: sha512-TnHUyd/rCYQqHg5RuiOaz/hUql6U+kbUaBW0Rp+0N5UhnAInA9CzzV0HXvuAAPwppDsK6fAx9Rd+tRawpJ/3pg==} + engines: {node: '>=22'} + peerDependencies: + zod: 4.2.1 + '@ai-sdk/provider@2.0.3': resolution: {integrity: sha512-h88OPkavHTiN9tMn2l5awAznGB0lXzjcLhgR1/rvjB2zlLprsNxbM2tt6OJsHUxduLC3klq0/eqaSf6fX5XVww==} engines: {node: '>=18'} @@ -1699,6 +1714,10 @@ packages: resolution: {integrity: sha512-oGMAgGoQdBXbZqNG0Ze56CHjDZ1IDYOwGYxYjO5KLSlz5HiNQ9udIXsPZ61VWaHGZ5XW/jyjmr6t2xz2jGVwbQ==} engines: {node: '>=18'} + '@ai-sdk/provider@4.0.7': + resolution: {integrity: sha512-6or44XprPzKbr8zkmzosowSE0pxkvJcoojBL+mCZvPUt3kvXp3XSNqeVun9golb1acEfSo6yaEBRT18h2VU+1Q==} + engines: {node: '>=22'} + '@ai-sdk/svelte@4.0.158': resolution: {integrity: sha512-SJl8YWjDRxHy6m9UDxNLYqUiyQ9nZbJL8P3gBn5g9zFU5fjX+MXN6aFiAs4B9vSXoB8Nv1J9ckZbv56glOUnHA==} peerDependencies: @@ -8361,6 +8380,9 @@ packages: '@vue/shared@3.5.26': resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + '@workflow/serde@4.1.0': + resolution: {integrity: sha512-pav4F2BoirECWR7Nf1TKt+2eETcBj7jj4cBefQ8VXQCA6NPkaKeLfj/zMgi+3zYV5ZIBT4GuUiphsj0/b9hPQQ==} + '@xmldom/is-dom-node@1.0.1': resolution: {integrity: sha512-CJDxIgE5I0FH+ttq/Fxy6nRpxP70+e2O048EPe85J2use3XKdatVM7dDVvFNjQudd9B49NPoZ+8PG49zj4Er8Q==} engines: {node: '>= 16'} @@ -10255,6 +10277,7 @@ packages: eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true peerDependencies: jiti: '*' @@ -14845,6 +14868,10 @@ packages: resolution: {integrity: sha512-6KQ/+QxK49Z/p3HO6E5ZCZWNnCasyZLa5ExaVYyvPxUwKtbCPMKELJOqh7EqOle0t9cH/7d2TaaTRRa6Nhs4YQ==} engines: {node: '>=20.18.1'} + undici@7.29.0: + resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + engines: {node: '>=20.18.1'} + undici@8.7.0: resolution: {integrity: sha512-N7iQtfyLhIMOFgQubvmLV26svHpO0bqKnAiWotTQCVKCmWrcGbBotPuW1x+xwYZ2VHdSTVUfPQQnlEt1/LouTQ==} engines: {node: '>=22.19.0'} @@ -15802,6 +15829,12 @@ snapshots: '@ai-sdk/provider-utils': 4.0.23(zod@4.2.1) zod: 4.2.1 + '@ai-sdk/deepseek@3.0.29(zod@4.2.1)': + dependencies: + '@ai-sdk/provider': 4.0.7 + '@ai-sdk/provider-utils': 5.0.28(zod@4.2.1) + zod: 4.2.1 + '@ai-sdk/gateway@2.0.111(zod@3.25.76)': dependencies: '@ai-sdk/provider': 2.0.3 @@ -15862,6 +15895,15 @@ snapshots: eventsource-parser: 3.0.8 zod: 4.2.1 + '@ai-sdk/provider-utils@5.0.28(zod@4.2.1)': + dependencies: + '@ai-sdk/provider': 4.0.7 + '@standard-schema/spec': 1.1.0 + '@workflow/serde': 4.1.0 + eventsource-parser: 3.0.8 + undici: 7.29.0 + zod: 4.2.1 + '@ai-sdk/provider@2.0.3': dependencies: json-schema: 0.4.0 @@ -15874,6 +15916,10 @@ snapshots: dependencies: json-schema: 0.4.0 + '@ai-sdk/provider@4.0.7': + dependencies: + json-schema: 0.4.0 + '@ai-sdk/svelte@4.0.158(svelte@5.46.0)(zod@4.2.1)': dependencies: '@ai-sdk/provider-utils': 4.0.23(zod@4.2.1) @@ -16121,10 +16167,10 @@ snapshots: is-docker: 4.0.0 package-manager-detector: 1.7.0 - '@astrojs/vercel@11.0.3(@aws-sdk/credential-provider-web-identity@3.958.0)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))(encoding@0.1.13)(react@19.2.3)(rollup@4.54.0)(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': + '@astrojs/vercel@11.0.3(@aws-sdk/credential-provider-web-identity@3.958.0)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))(encoding@0.1.13)(react@19.2.3)(rollup@4.54.0)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))': dependencies: '@astrojs/internal-helpers': 0.10.1 - '@vercel/analytics': 1.6.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3)) + '@vercel/analytics': 1.6.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3)) '@vercel/functions': 3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@vercel/nft': 1.10.2(encoding@0.1.13)(rollup@4.54.0) '@vercel/routing-utils': 5.3.3 @@ -20678,6 +20724,15 @@ snapshots: '@shikijs/core': 4.3.1 '@shikijs/types': 4.3.1 + '@shikijs/twoslash@4.3.1(typescript@5.9.3)': + dependencies: + '@shikijs/core': 4.3.1 + '@shikijs/types': 4.3.1 + twoslash: 0.3.9(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@shikijs/twoslash@4.3.1(typescript@6.0.3)': dependencies: '@shikijs/core': 4.3.1 @@ -21337,7 +21392,7 @@ snapshots: - rollup - webpack - '@storybook/svelte-vite@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + '@storybook/svelte-vite@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@storybook/builder-vite': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/svelte': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) @@ -21345,7 +21400,7 @@ snapshots: magic-string: 0.30.21 storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) svelte: 5.46.0 - svelte-preprocess: 5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)))(postcss@8.5.19)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3) + svelte-preprocess: 5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3) svelte2tsx: 0.7.46(svelte@5.46.0)(typescript@5.9.3) sveltedoc-parser: 4.2.1 ts-dedent: 2.2.0 @@ -21386,12 +21441,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/sveltekit@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': + '@storybook/sveltekit@8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))': dependencies: '@storybook/addon-actions': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6)) '@storybook/builder-vite': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@storybook/svelte': 8.6.15(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0) - '@storybook/svelte-vite': 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) + '@storybook/svelte-vite': 8.6.15(@babel/core@7.29.0)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(storybook@8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6))(svelte@5.46.0)(vite@7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) storybook: 8.6.15(bufferutil@4.1.0)(prettier@3.8.2)(utf-8-validate@6.0.6) svelte: 5.46.0 vite: 7.3.0(@types/node@24.10.4)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) @@ -23248,6 +23303,13 @@ snapshots: '@typescript-eslint/types': 8.50.1 eslint-visitor-keys: 4.2.1 + '@typescript/vfs@1.6.4(typescript@5.9.3)': + dependencies: + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript/vfs@1.6.4(typescript@6.0.3)': dependencies: debug: 4.4.3 @@ -23262,19 +23324,19 @@ snapshots: d3-selection: 3.0.0 d3-transition: 3.0.1(d3-selection@3.0.0) - '@vercel/analytics@1.6.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3))': + '@vercel/analytics@1.6.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))': optionalDependencies: '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) react: 19.2.3 svelte: 5.46.0 - vue: 3.5.26(typescript@6.0.3) + vue: 3.5.26(typescript@5.9.3) - '@vercel/analytics@2.0.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3))': + '@vercel/analytics@2.0.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))': optionalDependencies: '@sveltejs/kit': 2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) react: 19.2.3 svelte: 5.46.0 - vue: 3.5.26(typescript@6.0.3) + vue: 3.5.26(typescript@5.9.3) '@vercel/cli-config@0.2.0': dependencies: @@ -23615,6 +23677,8 @@ snapshots: '@vue/shared@3.5.26': optional: true + '@workflow/serde@4.1.0': {} + '@xmldom/is-dom-node@1.0.1': {} '@xmldom/xmldom@0.8.11': {} @@ -24233,14 +24297,14 @@ snapshots: bluebird@3.4.7: {} - blume@1.2.0(864af55737aed5e342af6da019f32ece): + blume@1.2.0(4833f745f9fd8f626b4a7791f185a353): dependencies: '@astrojs/check': 0.9.9(prettier@3.8.2)(typescript@6.0.3) '@astrojs/markdown-satteri': 0.3.4 '@astrojs/mdx': 7.0.3(@astrojs/markdown-satteri@0.3.4)(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@astrojs/node': 11.0.2(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) '@astrojs/react': 6.0.1(@types/node@24.10.4)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(esbuild@0.28.1)(jiti@2.6.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) - '@astrojs/vercel': 11.0.3(@aws-sdk/credential-provider-web-identity@3.958.0)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))(encoding@0.1.13)(react@19.2.3)(rollup@4.54.0)(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + '@astrojs/vercel': 11.0.3(@aws-sdk/credential-provider-web-identity@3.958.0)(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(astro@7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0))(encoding@0.1.13)(react@19.2.3)(rollup@4.54.0)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3))(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)) '@clack/prompts': 1.7.0 '@iconify-json/lucide': 1.2.117 '@iconify/types': 2.0.0 @@ -24255,7 +24319,7 @@ snapshots: '@shikijs/twoslash': 4.3.1(typescript@6.0.3) '@tailwindcss/typography': 0.5.20(tailwindcss@4.2.2) '@tailwindcss/vite': 4.1.18(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)) - '@vercel/analytics': 2.0.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@6.0.3)) + '@vercel/analytics': 2.0.1(@sveltejs/kit@2.49.2(@opentelemetry/api@1.9.1)(@sveltejs/vite-plugin-svelte@6.2.1(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(svelte@5.46.0)(vite@8.1.4(@types/node@24.10.4)(esbuild@0.28.1)(jiti@2.6.1)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0)))(react@19.2.3)(svelte@5.46.0)(vue@3.5.26(typescript@5.9.3)) ai: 5.0.212(zod@3.25.76) astro: 7.0.9(@astrojs/markdown-remark@7.2.1)(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)(@types/node@24.10.4)(@vercel/functions@3.7.5(@aws-sdk/credential-provider-web-identity@3.958.0)(ws@8.18.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)))(ioredis@5.10.1)(jiti@2.6.1)(rollup@4.54.0)(sass@1.97.1)(tsx@4.21.0)(yaml@2.9.0) babel-plugin-react-compiler: 1.0.0 @@ -29328,13 +29392,13 @@ snapshots: postcss: 8.5.6 ts-node: 10.9.2(@types/node@20.19.27)(typescript@5.9.3) - postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)): + postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)): dependencies: lilconfig: 3.1.3 yaml: 2.8.2 optionalDependencies: postcss: 8.5.19 - ts-node: 10.9.2(@types/node@24.10.4)(typescript@6.0.3) + ts-node: 10.9.2(@types/node@24.10.4)(typescript@5.9.3) optional: true postcss-load-config@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@types/node@20.19.27)(typescript@5.9.3)): @@ -30812,7 +30876,7 @@ snapshots: svelte: 5.46.0 tslib: 2.8.1 - svelte-preprocess@5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)))(postcss@8.5.19)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3): + svelte-preprocess@5.1.4(@babel/core@7.29.0)(postcss-load-config@4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)))(postcss@8.5.19)(sass@1.97.1)(svelte@5.46.0)(typescript@5.9.3): dependencies: '@types/pug': 2.0.10 detect-indent: 6.1.0 @@ -30823,7 +30887,7 @@ snapshots: optionalDependencies: '@babel/core': 7.29.0 postcss: 8.5.19 - postcss-load-config: 4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3)) + postcss-load-config: 4.0.2(postcss@8.5.19)(ts-node@10.9.2(@types/node@24.10.4)(typescript@5.9.3)) sass: 1.97.1 typescript: 5.9.3 @@ -30899,13 +30963,6 @@ snapshots: svelte: 5.46.0 typescript: 5.9.3 - svelte2tsx@0.7.46(svelte@5.46.0)(typescript@6.0.3): - dependencies: - dedent-js: 1.0.1 - scule: 1.3.0 - svelte: 5.46.0 - typescript: 6.0.3 - svelte@5.46.0: dependencies: '@jridgewell/remapping': 2.3.5 @@ -31271,25 +31328,6 @@ snapshots: yn: 3.1.1 optional: true - ts-node@10.9.2(@types/node@24.10.4)(typescript@6.0.3): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.12 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.10.4 - acorn: 8.15.0 - acorn-walk: 8.3.4 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 6.0.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - optional: true - tsc-alias@1.8.16: dependencies: chokidar: 3.6.0 @@ -31342,6 +31380,14 @@ snapshots: twoslash-protocol@0.3.9: {} + twoslash@0.3.9(typescript@5.9.3): + dependencies: + '@typescript/vfs': 1.6.4(typescript@5.9.3) + twoslash-protocol: 0.3.9 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + twoslash@0.3.9(typescript@6.0.3): dependencies: '@typescript/vfs': 1.6.4(typescript@6.0.3) @@ -31410,10 +31456,10 @@ snapshots: transitivePeerDependencies: - supports-color - typescript-svelte-plugin@0.3.50(svelte@5.46.0)(typescript@6.0.3): + typescript-svelte-plugin@0.3.50(svelte@5.46.0)(typescript@5.9.3): dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - svelte2tsx: 0.7.46(svelte@5.46.0)(typescript@6.0.3) + svelte2tsx: 0.7.46(svelte@5.46.0)(typescript@5.9.3) transitivePeerDependencies: - svelte - typescript @@ -31460,6 +31506,8 @@ snapshots: undici@7.24.8: {} + undici@7.29.0: {} + undici@8.7.0: {} unenv@2.0.0-rc.17: