diff --git a/.github/workflows/website-deploy.yml b/.github/workflows/website-deploy.yml index e2fb19c071..20eea4288a 100644 --- a/.github/workflows/website-deploy.yml +++ b/.github/workflows/website-deploy.yml @@ -13,9 +13,24 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} jobs: + check-secrets: + runs-on: ubuntu-latest + outputs: + has-vercel-token: ${{ steps.check.outputs.has-vercel-token }} + steps: + - name: Check if VERCEL_TOKEN exists + id: check + run: | + if [ -n "${{ secrets.VERCEL_TOKEN }}" ]; then + echo "has-vercel-token=true" >> $GITHUB_OUTPUT + else + echo "has-vercel-token=false" >> $GITHUB_OUTPUT + fi + deploy: runs-on: ubuntu-latest - if: ${{ secrets.VERCEL_TOKEN != '' }} + needs: check-secrets + if: ${{ needs.check-secrets.outputs.has-vercel-token == 'true' }} steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/.github/workflows/website-preview.yml b/.github/workflows/website-preview.yml index 1692b8737b..49523e0686 100644 --- a/.github/workflows/website-preview.yml +++ b/.github/workflows/website-preview.yml @@ -13,9 +13,24 @@ env: VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} jobs: + check-secrets: + runs-on: ubuntu-latest + outputs: + has-vercel-token: ${{ steps.check.outputs.has-vercel-token }} + steps: + - name: Check if VERCEL_TOKEN exists + id: check + run: | + if [ -n "${{ secrets.VERCEL_TOKEN }}" ]; then + echo "has-vercel-token=true" >> $GITHUB_OUTPUT + else + echo "has-vercel-token=false" >> $GITHUB_OUTPUT + fi + preview: runs-on: ubuntu-latest - if: ${{ secrets.VERCEL_TOKEN != '' }} + needs: check-secrets + if: ${{ needs.check-secrets.outputs.has-vercel-token == 'true' }} steps: - name: Checkout code uses: actions/checkout@v4 diff --git a/apps/vscode-e2e/package.json b/apps/vscode-e2e/package.json index 5a2c0d0dfc..1d19ffebf2 100644 --- a/apps/vscode-e2e/package.json +++ b/apps/vscode-e2e/package.json @@ -14,7 +14,7 @@ "@roo-code/config-typescript": "workspace:^", "@roo-code/types": "workspace:^", "@types/mocha": "^10.0.10", - "@types/node": "^22.14.1", + "@types/node": "20.x", "@types/vscode": "^1.95.0", "@vscode/test-cli": "^0.0.11", "@vscode/test-electron": "^2.4.0", diff --git a/apps/web-evals/package.json b/apps/web-evals/package.json index 99fa68829c..701bd1b1e9 100644 --- a/apps/web-evals/package.json +++ b/apps/web-evals/package.json @@ -11,7 +11,7 @@ "start": "next start" }, "dependencies": { - "@hookform/resolvers": "^4.1.3", + "@hookform/resolvers": "^5.1.1", "@radix-ui/react-alert-dialog": "^1.1.7", "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.7", @@ -44,7 +44,7 @@ "tailwind-merge": "^3.3.0", "tailwindcss-animate": "^1.0.7", "vaul": "^1.1.2", - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", diff --git a/apps/web-evals/src/app/home.tsx b/apps/web-evals/src/app/home.tsx deleted file mode 100644 index 60a0b3bfe8..0000000000 --- a/apps/web-evals/src/app/home.tsx +++ /dev/null @@ -1,158 +0,0 @@ -"use client" - -import { useCallback, useState, useRef } from "react" -import { useRouter } from "next/navigation" -import Link from "next/link" -import { Ellipsis, Rocket } from "lucide-react" - -import type { Run, TaskMetrics } from "@roo-code/evals" - -import { deleteRun } from "@/actions/runs" -import { formatCurrency, formatDuration, formatTokens, formatToolUsageSuccessRate } from "@/lib/formatters" -import { - Button, - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, - DropdownMenu, - DropdownMenuContent, - DropdownMenuItem, - DropdownMenuTrigger, - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, -} from "@/components/ui" - -export function Home({ runs }: { runs: (Run & { taskMetrics: TaskMetrics | null })[] }) { - const router = useRouter() - - const [deleteRunId, setDeleteRunId] = useState() - const continueRef = useRef(null) - - const onConfirmDelete = useCallback(async () => { - if (!deleteRunId) { - return - } - - try { - await deleteRun(deleteRunId) - setDeleteRunId(undefined) - } catch (error) { - console.error(error) - } - }, [deleteRunId]) - - return ( - <> - - - - Model - Passed - Failed - % Correct - Tokens In / Out - Diff Edits - Cost - Duration - - - - - {runs.length ? ( - runs.map(({ taskMetrics, ...run }) => ( - - {run.model} - {run.passed} - {run.failed} - - {run.passed + run.failed > 0 && ( - {((run.passed / (run.passed + run.failed)) * 100).toFixed(1)}% - )} - - - {taskMetrics && ( -
-
{formatTokens(taskMetrics.tokensIn)}
/ -
{formatTokens(taskMetrics.tokensOut)}
-
- )} -
- - {taskMetrics?.toolUsage?.apply_diff && ( -
-
{taskMetrics.toolUsage.apply_diff.attempts}
-
/
-
{formatToolUsageSuccessRate(taskMetrics.toolUsage.apply_diff)}
-
- )} -
- {taskMetrics && formatCurrency(taskMetrics.cost)} - {taskMetrics && formatDuration(taskMetrics.duration)} - - - - - - View Tasks - - { - setDeleteRunId(run.id) - setTimeout(() => continueRef.current?.focus(), 0) - }}> - Delete - - - - -
- )) - ) : ( - - - No eval runs yet. - - one now. - - - )} -
-
- - setDeleteRunId(undefined)}> - - - Are you sure? - This action cannot be undone. - - - Cancel - - Continue - - - - - - ) -} diff --git a/apps/web-evals/src/app/page.tsx b/apps/web-evals/src/app/page.tsx index 7ad5f8fa63..3dcb26aebf 100644 --- a/apps/web-evals/src/app/page.tsx +++ b/apps/web-evals/src/app/page.tsx @@ -1,10 +1,10 @@ import { getRuns } from "@roo-code/evals" -import { Home } from "./home" +import { Runs } from "@/components/home/runs" export const dynamic = "force-dynamic" export default async function Page() { const runs = await getRuns() - return + return } diff --git a/apps/web-evals/src/app/runs/new/new-run.tsx b/apps/web-evals/src/app/runs/new/new-run.tsx index 63a83ab41a..444086bd59 100644 --- a/apps/web-evals/src/app/runs/new/new-run.tsx +++ b/apps/web-evals/src/app/runs/new/new-run.tsx @@ -15,8 +15,8 @@ import { globalSettingsSchema, providerSettingsSchema, EVALS_SETTINGS, getModelI import { createRun } from "@/actions/runs" import { getExercises } from "@/actions/exercises" import { - createRunSchema as formSchema, - type CreateRun as FormValues, + createRunSchema, + type CreateRun, MODEL_DEFAULT, CONCURRENCY_MIN, CONCURRENCY_MAX, @@ -68,8 +68,8 @@ export function NewRun() { const models = useOpenRouterModels() const exercises = useQuery({ queryKey: ["getExercises"], queryFn: () => getExercises() }) - const form = useForm({ - resolver: zodResolver(formSchema), + const form = useForm({ + resolver: zodResolver(createRunSchema), defaultValues: { model: MODEL_DEFAULT, description: "", @@ -94,7 +94,7 @@ export function NewRun() { const systemPromptRef = useRef(null) const onSubmit = useCallback( - async (values: FormValues) => { + async (values: CreateRun) => { try { if (mode === "openrouter") { values.settings = { ...(values.settings || {}), openRouterModelId: model } diff --git a/apps/web-evals/src/components/home/run.tsx b/apps/web-evals/src/components/home/run.tsx new file mode 100644 index 0000000000..c35673885c --- /dev/null +++ b/apps/web-evals/src/components/home/run.tsx @@ -0,0 +1,149 @@ +import { useCallback, useState, useRef } from "react" +import Link from "next/link" +import { Ellipsis, ClipboardList, Copy, Check, LoaderCircle, Trash } from "lucide-react" + +import type { Run as EvalsRun, TaskMetrics as EvalsTaskMetrics } from "@roo-code/evals" + +import { deleteRun } from "@/actions/runs" +import { formatCurrency, formatDuration, formatTokens, formatToolUsageSuccessRate } from "@/lib/formatters" +import { useCopyRun } from "@/hooks/use-copy-run" +import { + Button, + TableCell, + TableRow, + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, + AlertDialog, + AlertDialogAction, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, +} from "@/components/ui" + +type RunProps = { + run: EvalsRun + taskMetrics: EvalsTaskMetrics | null +} + +export function Run({ run, taskMetrics }: RunProps) { + const [deleteRunId, setDeleteRunId] = useState() + const continueRef = useRef(null) + const { isPending, copyRun, copied } = useCopyRun(run.id) + + const onConfirmDelete = useCallback(async () => { + if (!deleteRunId) { + return + } + + try { + await deleteRun(deleteRunId) + setDeleteRunId(undefined) + } catch (error) { + console.error(error) + } + }, [deleteRunId]) + + return ( + <> + + {run.model} + {run.passed} + {run.failed} + + {run.passed + run.failed > 0 && ( + {((run.passed / (run.passed + run.failed)) * 100).toFixed(1)}% + )} + + + {taskMetrics && ( +
+
{formatTokens(taskMetrics.tokensIn)}
/ +
{formatTokens(taskMetrics.tokensOut)}
+
+ )} +
+ + {taskMetrics?.toolUsage?.apply_diff && ( +
+
{taskMetrics.toolUsage.apply_diff.attempts}
+
/
+
{formatToolUsageSuccessRate(taskMetrics.toolUsage.apply_diff)}
+
+ )} +
+ {taskMetrics && formatCurrency(taskMetrics.cost)} + {taskMetrics && formatDuration(taskMetrics.duration)} + + + + + + +
+ +
View Tasks
+
+ +
+ {run.taskMetricsId && ( + copyRun()} disabled={isPending || copied}> +
+ {isPending ? ( + <> + + Copying... + + ) : copied ? ( + <> + + Copied! + + ) : ( + <> + + Copy to Production + + )} +
+
+ )} + { + setDeleteRunId(run.id) + setTimeout(() => continueRef.current?.focus(), 0) + }}> +
+ +
Delete
+
+
+
+
+
+
+ setDeleteRunId(undefined)}> + + + Are you sure? + This action cannot be undone. + + + Cancel + + Continue + + + + + + ) +} diff --git a/apps/web-evals/src/components/home/runs.tsx b/apps/web-evals/src/components/home/runs.tsx new file mode 100644 index 0000000000..8bc8739b28 --- /dev/null +++ b/apps/web-evals/src/components/home/runs.tsx @@ -0,0 +1,56 @@ +"use client" + +import { useRouter } from "next/navigation" +import { Rocket } from "lucide-react" + +import type { Run, TaskMetrics } from "@roo-code/evals" + +import { Button, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui" +import { Run as Row } from "@/components/home/run" + +type RunWithTaskMetrics = Run & { taskMetrics: TaskMetrics | null } + +export function Runs({ runs }: { runs: RunWithTaskMetrics[] }) { + const router = useRouter() + + return ( + <> + + + + Model + Passed + Failed + % Correct + Tokens In / Out + Diff Edits + Cost + Duration + + + + + {runs.length ? ( + runs.map(({ taskMetrics, ...run }) => ) + ) : ( + + + No eval runs yet. + + one now. + + + )} + +
+ + + ) +} diff --git a/apps/web-evals/src/hooks/use-copy-run.ts b/apps/web-evals/src/hooks/use-copy-run.ts new file mode 100644 index 0000000000..eac9cabf46 --- /dev/null +++ b/apps/web-evals/src/hooks/use-copy-run.ts @@ -0,0 +1,28 @@ +import { useState } from "react" +import { useMutation } from "@tanstack/react-query" +import { toast } from "sonner" + +import { copyRunToProduction } from "@/lib/actions" + +export function useCopyRun(runId: number) { + const [copied, setCopied] = useState(false) + + const { isPending, mutate: copyRun } = useMutation({ + mutationFn: () => copyRunToProduction(runId), + onSuccess: (result) => { + if (result.success) { + toast.success(result.message) + setCopied(true) + setTimeout(() => setCopied(false), 3000) + } else { + toast.error(result.error) + } + }, + onError: (error) => { + console.error("Copy to production failed:", error) + toast.error("Failed to copy run to production") + }, + }) + + return { isPending, copyRun, copied } +} diff --git a/apps/web-evals/src/lib/actions.ts b/apps/web-evals/src/lib/actions.ts new file mode 100644 index 0000000000..c8def61377 --- /dev/null +++ b/apps/web-evals/src/lib/actions.ts @@ -0,0 +1,19 @@ +"use server" + +import { client, getProductionClient, copyRun } from "@roo-code/evals" + +export async function copyRunToProduction(runId: number) { + try { + await copyRun({ sourceDb: client, targetDb: getProductionClient(), runId }) + + return { + success: true, + message: `Run ${runId} successfully copied to production.`, + } + } catch (error) { + return { + success: false, + error: `Failed to copy run ${runId} to production: ${error instanceof Error ? error.message : "Unknown error"}.`, + } + } +} diff --git a/apps/web-evals/src/lib/schemas.ts b/apps/web-evals/src/lib/schemas.ts index 4609820aee..3c5f199e85 100644 --- a/apps/web-evals/src/lib/schemas.ts +++ b/apps/web-evals/src/lib/schemas.ts @@ -19,7 +19,7 @@ export const createRunSchema = z suite: z.enum(["full", "partial"]), exercises: z.array(z.string()).optional(), settings: rooCodeSettingsSchema.optional(), - concurrency: z.number().int().min(CONCURRENCY_MIN).max(CONCURRENCY_MAX).default(CONCURRENCY_DEFAULT), + concurrency: z.number().int().min(CONCURRENCY_MIN).max(CONCURRENCY_MAX), systemPrompt: z.string().optional(), }) .refine((data) => data.suite === "full" || (data.exercises || []).length > 0, { diff --git a/apps/web-roo-code/.env.example b/apps/web-roo-code/.env.example index 9e3e927dd2..734a9a2a08 100644 --- a/apps/web-roo-code/.env.example +++ b/apps/web-roo-code/.env.example @@ -6,6 +6,3 @@ NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com # Basin Form Endpoint for Static Form Submissions # Replace this with your actual Basin form endpoint (e.g., https://usebasin.com/f/your-form-id) NEXT_PUBLIC_BASIN_ENDPOINT=https://usebasin.com/f/your-form-id-here - -TURSO_CONNECTION_URL=libsql://development-roo-code.aws-us-east-1.turso.io -TURSO_AUTH_TOKEN=your-auth-token-here diff --git a/apps/web-roo-code/drizzle.config.ts b/apps/web-roo-code/drizzle.config.ts deleted file mode 100644 index 0ebce84cbd..0000000000 --- a/apps/web-roo-code/drizzle.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { defineConfig } from "drizzle-kit" - -const dialect = process.env.BENCHMARKS_DB_PATH ? "sqlite" : "turso" - -const dbCredentials = process.env.BENCHMARKS_DB_PATH - ? { url: process.env.BENCHMARKS_DB_PATH } - : { url: process.env.TURSO_CONNECTION_URL!, authToken: process.env.TURSO_AUTH_TOKEN! } - -export default defineConfig({ - out: "./drizzle", - schema: "./src/db/schema.ts", - dialect, - dbCredentials, -}) diff --git a/apps/web-roo-code/package.json b/apps/web-roo-code/package.json index d915f3fdf1..f621afade0 100644 --- a/apps/web-roo-code/package.json +++ b/apps/web-roo-code/package.json @@ -7,26 +7,16 @@ "check-types": "tsc --noEmit", "dev": "next dev", "build": "next build", - "start": "next start", - "drizzle-kit": "dotenvx run -f .env -- tsx node_modules/drizzle-kit/bin.cjs", - "db:generate": "pnpm drizzle-kit generate", - "db:migrate": "pnpm drizzle-kit migrate", - "db:push": "pnpm drizzle-kit push", - "db:pull": "pnpm drizzle-kit pull", - "db:check": "pnpm drizzle-kit check", - "db:up": "pnpm drizzle-kit up", - "db:studio": "pnpm drizzle-kit studio" + "start": "next start" }, "dependencies": { - "@libsql/client": "^0.15.7", "@radix-ui/react-dialog": "^1.1.14", "@radix-ui/react-slot": "^1.2.3", + "@roo-code/evals": "workspace:^", "@roo-code/types": "workspace:^", "@tanstack/react-query": "^5.79.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "drizzle-orm": "^0.44.0", - "drizzle-zod": "^0.8.0", "embla-carousel-auto-scroll": "^8.6.0", "embla-carousel-autoplay": "^8.6.0", "embla-carousel-react": "^8.6.0", @@ -41,17 +31,16 @@ "recharts": "^2.15.3", "tailwind-merge": "^3.3.0", "tailwindcss-animate": "^1.0.7", - "zod": "^3.25.41" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", "@tailwindcss/typography": "^0.5.16", - "@types/node": "^20.17.54", + "@types/node": "20.x", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.7", "autoprefixer": "^10.4.21", - "drizzle-kit": "^0.31.0", "postcss": "^8.5.4", "tailwindcss": "^3.4.17" } diff --git a/apps/web-roo-code/src/actions/evals.ts b/apps/web-roo-code/src/actions/evals.ts new file mode 100644 index 0000000000..c0835d408f --- /dev/null +++ b/apps/web-roo-code/src/actions/evals.ts @@ -0,0 +1,29 @@ +"use server" + +import { getModelId, rooCodeSettingsSchema } from "@roo-code/types" +import { getRuns, getLanguageScores } from "@roo-code/evals" + +import { formatScore } from "@/lib" + +export async function getEvalRuns() { + const languageScores = await getLanguageScores() + + const runs = (await getRuns()) + .filter((run) => !!run.taskMetrics) + .filter(({ settings }) => rooCodeSettingsSchema.safeParse(settings).success) + .sort((a, b) => b.passed - a.passed) + .map((run) => { + const settings = rooCodeSettingsSchema.parse(run.settings) + + return { + ...run, + label: run.description || run.model, + score: formatScore(run.passed / (run.passed + run.failed)), + languageScores: languageScores[run.id], + taskMetrics: run.taskMetrics!, + modelId: getModelId(settings), + } + }) + + return runs +} diff --git a/apps/web-roo-code/src/app/evals/evals.tsx b/apps/web-roo-code/src/app/evals/evals.tsx index 4fada39f46..b94bc62224 100644 --- a/apps/web-roo-code/src/app/evals/evals.tsx +++ b/apps/web-roo-code/src/app/evals/evals.tsx @@ -3,14 +3,17 @@ import { useMemo } from "react" import { ScatterChart, Scatter, XAxis, YAxis, Label, Customized, Cross } from "recharts" -import { TaskMetrics, type Run } from "@/db" +import type { TaskMetrics, Run } from "@roo-code/evals" -import { ChartConfig, ChartLegend, ChartLegendContent } from "@/components/ui/chart" import { formatTokens, formatCurrency, formatDuration, formatScore } from "@/lib" +import { useOpenRouterModels } from "@/lib/hooks" import { ChartContainer, ChartTooltip, ChartTooltipContent, + ChartConfig, + ChartLegend, + ChartLegendContent, Table, TableBody, TableCaption, @@ -19,7 +22,6 @@ import { TableHeader, TableRow, } from "@/components/ui" -import { useOpenRouterModels } from "@/lib/hooks/use-open-router-models" export function Evals({ runs, @@ -126,7 +128,7 @@ export function Evals({ {tableData.map((run) => ( -
{run.model?.name || run.label}
+
{run.label}
{formatTokens(run.modelInfo?.contextWindow ?? 0)}
diff --git a/apps/web-roo-code/src/app/evals/page.tsx b/apps/web-roo-code/src/app/evals/page.tsx index 8171292544..b97b025348 100644 --- a/apps/web-roo-code/src/app/evals/page.tsx +++ b/apps/web-roo-code/src/app/evals/page.tsx @@ -1,14 +1,11 @@ import type { Metadata } from "next" -import { rooCodeSettingsSchema, getModelId } from "@roo-code/types" - -import { getRuns } from "@/db" -import { getLanguageScores } from "@/lib/server" -import { formatScore } from "@/lib" +import { getEvalRuns } from "@/actions/evals" import { Evals } from "./evals" export const revalidate = 300 +export const dynamic = "force-dynamic" export const metadata: Metadata = { title: "Roo Code Evals", @@ -26,24 +23,7 @@ export const metadata: Metadata = { } export default async function Page() { - const languageScores = await getLanguageScores() - - const runs = (await getRuns()) - .filter((run) => !!run.taskMetrics) - .filter(({ settings }) => rooCodeSettingsSchema.safeParse(settings).success) - .sort((a, b) => b.passed - a.passed) - .map((run) => { - const settings = rooCodeSettingsSchema.parse(run.settings) - - return { - ...run, - label: run.description || run.model, - score: formatScore(run.passed / (run.passed + run.failed)), - languageScores: languageScores[run.id], - taskMetrics: run.taskMetrics!, - modelId: getModelId(settings), - } - }) + const runs = await getEvalRuns() return } diff --git a/apps/web-roo-code/src/db/db.ts b/apps/web-roo-code/src/db/db.ts deleted file mode 100644 index 8acd5243a8..0000000000 --- a/apps/web-roo-code/src/db/db.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { drizzle } from "drizzle-orm/libsql" - -import { schema } from "./schema" - -if ((!process.env.TURSO_CONNECTION_URL || !process.env.TURSO_AUTH_TOKEN) && !process.env.BENCHMARKS_DB_PATH) { - throw new Error("TURSO_CONNECTION_URL and TURSO_AUTH_TOKEN or BENCHMARKS_DB_PATH must be set") -} - -const connection = process.env.BENCHMARKS_DB_PATH - ? { url: process.env.BENCHMARKS_DB_PATH, concurrency: 50 } - : { url: process.env.TURSO_CONNECTION_URL!, authToken: process.env.TURSO_AUTH_TOKEN! } - -export const db = drizzle({ schema, connection }) diff --git a/apps/web-roo-code/src/db/index.ts b/apps/web-roo-code/src/db/index.ts deleted file mode 100644 index bce8580328..0000000000 --- a/apps/web-roo-code/src/db/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { db } from "./db" -export * from "./schema" - -export * from "./queries/runs" -export * from "./queries/tasks" -export * from "./queries/taskMetrics" diff --git a/apps/web-roo-code/src/db/queries/errors.ts b/apps/web-roo-code/src/db/queries/errors.ts deleted file mode 100644 index 38ff8e2790..0000000000 --- a/apps/web-roo-code/src/db/queries/errors.ts +++ /dev/null @@ -1,3 +0,0 @@ -export class RecordNotFoundError extends Error {} - -export class RecordNotCreatedError extends Error {} diff --git a/apps/web-roo-code/src/db/queries/runs.ts b/apps/web-roo-code/src/db/queries/runs.ts deleted file mode 100644 index 12e30e9e67..0000000000 --- a/apps/web-roo-code/src/db/queries/runs.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { desc, eq } from "drizzle-orm" - -import { RecordNotFoundError } from "./errors" -import { schema } from "../schema" -import { db } from "../db" - -const table = schema.runs - -export const findRun = async (id: number) => { - const run = await db.query.runs.findFirst({ where: eq(table.id, id) }) - - if (!run) { - throw new RecordNotFoundError() - } - - return run -} - -export const getRuns = async () => db.query.runs.findMany({ orderBy: desc(table.id), with: { taskMetrics: true } }) diff --git a/apps/web-roo-code/src/db/queries/taskMetrics.ts b/apps/web-roo-code/src/db/queries/taskMetrics.ts deleted file mode 100644 index 3d54f9e17a..0000000000 --- a/apps/web-roo-code/src/db/queries/taskMetrics.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { eq } from "drizzle-orm" - -import { RecordNotFoundError } from "./errors" -import { taskMetrics } from "../schema" -import { db } from "../db" - -const table = taskMetrics - -export const findTaskMetrics = async (id: number) => { - const run = await db.query.taskMetrics.findFirst({ where: eq(table.id, id) }) - - if (!run) { - throw new RecordNotFoundError() - } - - return run -} diff --git a/apps/web-roo-code/src/db/queries/tasks.ts b/apps/web-roo-code/src/db/queries/tasks.ts deleted file mode 100644 index 817500775a..0000000000 --- a/apps/web-roo-code/src/db/queries/tasks.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { and, eq } from "drizzle-orm" - -import { RecordNotFoundError } from "./errors" -import { tasks } from "../schema" -import { db } from "../db" - -export const findTask = async (id: number) => { - const run = await db.query.tasks.findFirst({ where: eq(tasks.id, id) }) - - if (!run) { - throw new RecordNotFoundError() - } - - return run -} - -type GetTask = { - runId: number - language: string - exercise: string -} - -export const getTask = async ({ runId, language, exercise }: GetTask) => - db.query.tasks.findFirst({ - where: and(eq(tasks.runId, runId), eq(tasks.language, language), eq(tasks.exercise, exercise)), - }) - -export const getTasks = async (runId: number) => - db.query.tasks.findMany({ where: eq(tasks.runId, runId), with: { taskMetrics: true } }) diff --git a/apps/web-roo-code/src/db/schema.ts b/apps/web-roo-code/src/db/schema.ts deleted file mode 100644 index 25b3a75efe..0000000000 --- a/apps/web-roo-code/src/db/schema.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { sqliteTable, text, real, integer, blob, uniqueIndex } from "drizzle-orm/sqlite-core" -import { relations } from "drizzle-orm" - -/** - * runs - */ - -export const runs = sqliteTable("runs", { - id: integer({ mode: "number" }).primaryKey({ autoIncrement: true }), - taskMetricsId: integer({ mode: "number" }).references(() => taskMetrics.id), - model: text().notNull(), - description: text(), - settings: blob({ mode: "json" }).$type(), - pid: integer({ mode: "number" }), - socketPath: text().notNull(), - passed: integer({ mode: "number" }).default(0).notNull(), - failed: integer({ mode: "number" }).default(0).notNull(), - createdAt: integer({ mode: "timestamp" }).notNull(), -}) - -export const runsRelations = relations(runs, ({ one }) => ({ - taskMetrics: one(taskMetrics, { fields: [runs.taskMetricsId], references: [taskMetrics.id] }), -})) - -export type Run = typeof runs.$inferSelect - -/** - * tasks - */ - -export const tasks = sqliteTable( - "tasks", - { - id: integer({ mode: "number" }).primaryKey({ autoIncrement: true }), - runId: integer({ mode: "number" }) - .references(() => runs.id) - .notNull(), - taskMetricsId: integer({ mode: "number" }).references(() => taskMetrics.id), - language: text().notNull(), - exercise: text().notNull(), - passed: integer({ mode: "boolean" }), - startedAt: integer({ mode: "timestamp" }), - finishedAt: integer({ mode: "timestamp" }), - createdAt: integer({ mode: "timestamp" }).notNull(), - }, - (table) => [uniqueIndex("tasks_language_exercise_idx").on(table.runId, table.language, table.exercise)], -) - -export const tasksRelations = relations(tasks, ({ one }) => ({ - run: one(runs, { fields: [tasks.runId], references: [runs.id] }), - taskMetrics: one(taskMetrics, { fields: [tasks.taskMetricsId], references: [taskMetrics.id] }), -})) - -export type Task = typeof tasks.$inferSelect - -/** - * taskMetrics - */ - -export const taskMetrics = sqliteTable("taskMetrics", { - id: integer({ mode: "number" }).primaryKey({ autoIncrement: true }), - tokensIn: integer({ mode: "number" }).notNull(), - tokensOut: integer({ mode: "number" }).notNull(), - tokensContext: integer({ mode: "number" }).notNull(), - cacheWrites: integer({ mode: "number" }).notNull(), - cacheReads: integer({ mode: "number" }).notNull(), - cost: real().notNull(), - duration: integer({ mode: "number" }).notNull(), - createdAt: integer({ mode: "timestamp" }).notNull(), -}) - -export type TaskMetrics = typeof taskMetrics.$inferSelect - -/** - * schema - */ - -export const schema = { runs, runsRelations, tasks, tasksRelations, taskMetrics } diff --git a/apps/web-roo-code/src/drizzle/0000_elite_raza.sql b/apps/web-roo-code/src/drizzle/0000_elite_raza.sql deleted file mode 100644 index 4af2be3564..0000000000 --- a/apps/web-roo-code/src/drizzle/0000_elite_raza.sql +++ /dev/null @@ -1,40 +0,0 @@ -CREATE TABLE `runs` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `taskMetricsId` integer, - `model` text NOT NULL, - `description` text, - `pid` integer, - `socketPath` text NOT NULL, - `passed` integer DEFAULT 0 NOT NULL, - `failed` integer DEFAULT 0 NOT NULL, - `createdAt` integer NOT NULL, - FOREIGN KEY (`taskMetricsId`) REFERENCES `taskMetrics`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE TABLE `taskMetrics` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `tokensIn` integer NOT NULL, - `tokensOut` integer NOT NULL, - `tokensContext` integer NOT NULL, - `cacheWrites` integer NOT NULL, - `cacheReads` integer NOT NULL, - `cost` real NOT NULL, - `duration` integer NOT NULL, - `createdAt` integer NOT NULL -); ---> statement-breakpoint -CREATE TABLE `tasks` ( - `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL, - `runId` integer NOT NULL, - `taskMetricsId` integer, - `language` text NOT NULL, - `exercise` text NOT NULL, - `passed` integer, - `startedAt` integer, - `finishedAt` integer, - `createdAt` integer NOT NULL, - FOREIGN KEY (`runId`) REFERENCES `runs`(`id`) ON UPDATE no action ON DELETE no action, - FOREIGN KEY (`taskMetricsId`) REFERENCES `taskMetrics`(`id`) ON UPDATE no action ON DELETE no action -); ---> statement-breakpoint -CREATE UNIQUE INDEX `tasks_language_exercise_idx` ON `tasks` (`runId`,`language`,`exercise`); \ No newline at end of file diff --git a/apps/web-roo-code/src/drizzle/0001_lush_reavers.sql b/apps/web-roo-code/src/drizzle/0001_lush_reavers.sql deleted file mode 100644 index 25eebac810..0000000000 --- a/apps/web-roo-code/src/drizzle/0001_lush_reavers.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE `runs` ADD `settings` blob; \ No newline at end of file diff --git a/apps/web-roo-code/src/drizzle/meta/0000_snapshot.json b/apps/web-roo-code/src/drizzle/meta/0000_snapshot.json deleted file mode 100644 index 1b8c44283a..0000000000 --- a/apps/web-roo-code/src/drizzle/meta/0000_snapshot.json +++ /dev/null @@ -1,274 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "c0fa8491-b5c0-493d-aa32-ddf280259c30", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "runs": { - "name": "runs", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "taskMetricsId": { - "name": "taskMetricsId", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "model": { - "name": "model", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "pid": { - "name": "pid", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "socketPath": { - "name": "socketPath", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "passed": { - "name": "passed", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "failed": { - "name": "failed", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "createdAt": { - "name": "createdAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "runs_taskMetricsId_taskMetrics_id_fk": { - "name": "runs_taskMetricsId_taskMetrics_id_fk", - "tableFrom": "runs", - "tableTo": "taskMetrics", - "columnsFrom": ["taskMetricsId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "taskMetrics": { - "name": "taskMetrics", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "tokensIn": { - "name": "tokensIn", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "tokensOut": { - "name": "tokensOut", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "tokensContext": { - "name": "tokensContext", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "cacheWrites": { - "name": "cacheWrites", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "cacheReads": { - "name": "cacheReads", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "cost": { - "name": "cost", - "type": "real", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "duration": { - "name": "duration", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tasks": { - "name": "tasks", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "runId": { - "name": "runId", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "taskMetricsId": { - "name": "taskMetricsId", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "language": { - "name": "language", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "exercise": { - "name": "exercise", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "passed": { - "name": "passed", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "startedAt": { - "name": "startedAt", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "finishedAt": { - "name": "finishedAt", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "tasks_language_exercise_idx": { - "name": "tasks_language_exercise_idx", - "columns": ["runId", "language", "exercise"], - "isUnique": true - } - }, - "foreignKeys": { - "tasks_runId_runs_id_fk": { - "name": "tasks_runId_runs_id_fk", - "tableFrom": "tasks", - "tableTo": "runs", - "columnsFrom": ["runId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "tasks_taskMetricsId_taskMetrics_id_fk": { - "name": "tasks_taskMetricsId_taskMetrics_id_fk", - "tableFrom": "tasks", - "tableTo": "taskMetrics", - "columnsFrom": ["taskMetricsId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} diff --git a/apps/web-roo-code/src/drizzle/meta/0001_snapshot.json b/apps/web-roo-code/src/drizzle/meta/0001_snapshot.json deleted file mode 100644 index 0c087603da..0000000000 --- a/apps/web-roo-code/src/drizzle/meta/0001_snapshot.json +++ /dev/null @@ -1,281 +0,0 @@ -{ - "version": "6", - "dialect": "sqlite", - "id": "8906647f-81d6-498a-897c-b1638c04c69a", - "prevId": "c0fa8491-b5c0-493d-aa32-ddf280259c30", - "tables": { - "runs": { - "name": "runs", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "taskMetricsId": { - "name": "taskMetricsId", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "model": { - "name": "model", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "settings": { - "name": "settings", - "type": "blob", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "pid": { - "name": "pid", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "socketPath": { - "name": "socketPath", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "passed": { - "name": "passed", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "failed": { - "name": "failed", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "createdAt": { - "name": "createdAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": { - "runs_taskMetricsId_taskMetrics_id_fk": { - "name": "runs_taskMetricsId_taskMetrics_id_fk", - "tableFrom": "runs", - "tableTo": "taskMetrics", - "columnsFrom": ["taskMetricsId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "taskMetrics": { - "name": "taskMetrics", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "tokensIn": { - "name": "tokensIn", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "tokensOut": { - "name": "tokensOut", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "tokensContext": { - "name": "tokensContext", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "cacheWrites": { - "name": "cacheWrites", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "cacheReads": { - "name": "cacheReads", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "cost": { - "name": "cost", - "type": "real", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "duration": { - "name": "duration", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - }, - "tasks": { - "name": "tasks", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": true - }, - "runId": { - "name": "runId", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "taskMetricsId": { - "name": "taskMetricsId", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "language": { - "name": "language", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "exercise": { - "name": "exercise", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "passed": { - "name": "passed", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "startedAt": { - "name": "startedAt", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "finishedAt": { - "name": "finishedAt", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "tasks_language_exercise_idx": { - "name": "tasks_language_exercise_idx", - "columns": ["runId", "language", "exercise"], - "isUnique": true - } - }, - "foreignKeys": { - "tasks_runId_runs_id_fk": { - "name": "tasks_runId_runs_id_fk", - "tableFrom": "tasks", - "tableTo": "runs", - "columnsFrom": ["runId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - }, - "tasks_taskMetricsId_taskMetrics_id_fk": { - "name": "tasks_taskMetricsId_taskMetrics_id_fk", - "tableFrom": "tasks", - "tableTo": "taskMetrics", - "columnsFrom": ["taskMetricsId"], - "columnsTo": ["id"], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {}, - "checkConstraints": {} - } - }, - "views": {}, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - }, - "internal": { - "indexes": {} - } -} diff --git a/apps/web-roo-code/src/drizzle/meta/_journal.json b/apps/web-roo-code/src/drizzle/meta/_journal.json deleted file mode 100644 index b9620b7000..0000000000 --- a/apps/web-roo-code/src/drizzle/meta/_journal.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "version": "7", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "6", - "when": 1742599919625, - "tag": "0000_elite_raza", - "breakpoints": true - }, - { - "idx": 1, - "version": "6", - "when": 1743089501047, - "tag": "0001_lush_reavers", - "breakpoints": true - } - ] -} diff --git a/apps/web-roo-code/src/lib/hooks/index.ts b/apps/web-roo-code/src/lib/hooks/index.ts new file mode 100644 index 0000000000..c0ac6dcf23 --- /dev/null +++ b/apps/web-roo-code/src/lib/hooks/index.ts @@ -0,0 +1,2 @@ +export * from "./use-logo-src" +export * from "./use-open-router-models" diff --git a/apps/web-roo-code/src/lib/hooks/use-open-router-models.ts b/apps/web-roo-code/src/lib/hooks/use-open-router-models.ts index fcc9ca7455..1901d58a03 100644 --- a/apps/web-roo-code/src/lib/hooks/use-open-router-models.ts +++ b/apps/web-roo-code/src/lib/hooks/use-open-router-models.ts @@ -1,5 +1,6 @@ import { z } from "zod" import { useQuery } from "@tanstack/react-query" + import { ModelInfo } from "@roo-code/types" const parsePrice = (price?: string) => (price ? parseFloat(price) * 1_000_000 : undefined) diff --git a/apps/web-roo-code/src/lib/server/get-language-scores.ts b/apps/web-roo-code/src/lib/server/get-language-scores.ts deleted file mode 100644 index 5dddd28b03..0000000000 --- a/apps/web-roo-code/src/lib/server/get-language-scores.ts +++ /dev/null @@ -1,29 +0,0 @@ -"use server" - -import { sql } from "drizzle-orm" -import { db, tasks } from "@/db" - -export type Language = "go" | "java" | "javascript" | "python" | "rust" - -export const getLanguageScores = async () => { - const records = await db - .select({ - runId: tasks.runId, - language: sql`language`, - score: sql`cast(sum(case when ${tasks.passed} = 1 then 1 else 0 end) as float) / count(*)`, - }) - .from(tasks) - .groupBy(tasks.runId, tasks.language) - - const results: Record> = {} - - for (const { runId, language, score } of records) { - if (!results[runId]) { - results[runId] = { go: 0, java: 0, javascript: 0, python: 0, rust: 0 } - } - - results[runId][language] = score - } - - return results -} diff --git a/apps/web-roo-code/src/lib/server/index.ts b/apps/web-roo-code/src/lib/server/index.ts deleted file mode 100644 index fa220449b0..0000000000 --- a/apps/web-roo-code/src/lib/server/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./get-language-scores" diff --git a/packages/build/package.json b/packages/build/package.json index b6897732db..635ff5a8a5 100644 --- a/packages/build/package.json +++ b/packages/build/package.json @@ -13,12 +13,12 @@ "clean": "rimraf dist .turbo" }, "dependencies": { - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "^22.15.20", + "@types/node": "20.x", "vitest": "^3.1.3" } } diff --git a/packages/cloud/package.json b/packages/cloud/package.json index 375838dc95..0b7d1b1351 100644 --- a/packages/cloud/package.json +++ b/packages/cloud/package.json @@ -14,12 +14,12 @@ "@roo-code/telemetry": "workspace:^", "@roo-code/types": "workspace:^", "axios": "^1.7.4", - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "^22.15.20", + "@types/node": "20.x", "@types/vscode": "^1.84.0", "vitest": "^3.1.3" } diff --git a/packages/evals/package.json b/packages/evals/package.json index 88195b134b..e2828be93d 100644 --- a/packages/evals/package.json +++ b/packages/evals/package.json @@ -12,12 +12,12 @@ "cli": "dotenvx run -f .env.development .env.local -- tsx src/cli/index.ts", "drizzle-kit": "dotenvx run -f .env.development -- tsx node_modules/drizzle-kit/bin.cjs", "drizzle-kit:test": "dotenvx run -f .env.test -- tsx node_modules/drizzle-kit/bin.cjs", + "drizzle-kit:production": "dotenvx run -f .env.production -- tsx node_modules/drizzle-kit/bin.cjs", "db:generate": "pnpm drizzle-kit generate", "db:migrate": "pnpm drizzle-kit migrate", "db:push": "pnpm drizzle-kit push", - "db:check": "pnpm drizzle-kit check", "db:test:push": "pnpm drizzle-kit:test push", - "db:test:check": "pnpm drizzle-kit:test check", + "db:production:push": "pnpm drizzle-kit:production push", "db:start": "docker compose up -d db", "db:stop": "docker compose down db", "redis:start": "docker compose up -d redis", @@ -27,7 +27,6 @@ "dependencies": { "@roo-code/ipc": "workspace:^", "@roo-code/types": "workspace:^", - "better-sqlite3": "^11.10.0", "cmd-ts": "^0.13.0", "drizzle-orm": "^0.44.1", "execa": "^9.6.0", @@ -38,12 +37,12 @@ "postgres": "^3.4.7", "ps-tree": "^1.2.0", "redis": "^5.5.5", - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "^22.15.20", + "@types/node": "20.x", "@types/node-ipc": "^9.2.3", "@types/ps-tree": "^1.1.6", "drizzle-kit": "^0.31.1", diff --git a/packages/evals/src/db/db.ts b/packages/evals/src/db/db.ts index 2db84b21b4..9f2c046b57 100644 --- a/packages/evals/src/db/db.ts +++ b/packages/evals/src/db/db.ts @@ -4,7 +4,6 @@ import postgres from "postgres" import * as schema from "./schema.js" const pgClient = postgres(process.env.DATABASE_URL!, { prepare: false }) - const client = drizzle({ client: pgClient, schema }) let testDb: typeof client | undefined = undefined @@ -17,10 +16,30 @@ if (process.env.NODE_ENV === "test") { testDb = client } +let _productionPgClient: ReturnType | undefined = undefined +let _productionClient: typeof client | undefined = undefined + +const getProductionClient = () => { + if (!process.env.PRODUCTION_DATABASE_URL) { + throw new Error("PRODUCTION_DATABASE_URL is not set") + } + + if (!_productionClient) { + _productionPgClient = postgres(process.env.PRODUCTION_DATABASE_URL, { prepare: false }) + _productionClient = drizzle({ client: _productionPgClient, schema }) + } + + return _productionClient +} + const disconnect = async () => { await pgClient.end() + + if (_productionPgClient) { + await _productionPgClient.end() + } } type DatabaseOrTransaction = typeof client | Parameters[0]>[0] -export { client, testDb, disconnect, type DatabaseOrTransaction } +export { client, testDb, getProductionClient, disconnect, type DatabaseOrTransaction } diff --git a/packages/evals/src/db/index.ts b/packages/evals/src/db/index.ts index 02f08bd154..03d39253bc 100644 --- a/packages/evals/src/db/index.ts +++ b/packages/evals/src/db/index.ts @@ -4,3 +4,6 @@ export * from "./queries/runs.js" export * from "./queries/tasks.js" export * from "./queries/taskMetrics.js" export * from "./queries/toolErrors.js" +export * from "./queries/copyRun.js" + +export * from "./db.js" diff --git a/packages/evals/src/db/queries/__tests__/copyRun.spec.ts b/packages/evals/src/db/queries/__tests__/copyRun.spec.ts new file mode 100644 index 0000000000..c693e471db --- /dev/null +++ b/packages/evals/src/db/queries/__tests__/copyRun.spec.ts @@ -0,0 +1,287 @@ +// npx vitest run src/db/queries/__tests__/copyRun.spec.ts + +import { eq } from "drizzle-orm" + +import { copyRun } from "../copyRun.js" +import { createRun } from "../runs.js" +import { createTask } from "../tasks.js" +import { createTaskMetrics } from "../taskMetrics.js" +import { createToolError } from "../toolErrors.js" +import { RecordNotFoundError } from "../errors.js" +import { schema } from "../../schema.js" +import { client as db } from "../../db.js" + +describe("copyRun", () => { + let sourceRunId: number + let sourceTaskIds: number[] = [] + let sourceTaskMetricsIds: number[] = [] + let sourceToolErrorIds: number[] = [] + + beforeEach(async () => { + const run = await createRun({ + model: "gpt-4.1-mini", + socketPath: "/tmp/roo.sock", + description: "Test run for copying", + concurrency: 4, + }) + + sourceRunId = run.id + + const runTaskMetrics = await createTaskMetrics({ + duration: 120_000, + tokensIn: 200_000, + tokensOut: 5_000, + tokensContext: 205_000, + cacheWrites: 10, + cacheReads: 5, + cost: 0.15, + toolUsage: { + read_file: { attempts: 10, failures: 1 }, + apply_diff: { attempts: 8, failures: 2 }, + }, + }) + + sourceTaskMetricsIds.push(runTaskMetrics.id) + + await db + .update(schema.runs) + .set({ taskMetricsId: runTaskMetrics.id, passed: 2, failed: 1 }) + .where(eq(schema.runs.id, sourceRunId)) + + const task1TaskMetrics = await createTaskMetrics({ + duration: 45_000, + tokensIn: 100_000, + tokensOut: 2_000, + tokensContext: 102_000, + cacheWrites: 0, + cacheReads: 0, + cost: 0.05, + toolUsage: { + read_file: { attempts: 3, failures: 0 }, + apply_diff: { attempts: 3, failures: 1 }, + }, + }) + + sourceTaskMetricsIds.push(task1TaskMetrics.id) + + const task1 = await createTask({ + runId: sourceRunId, + taskMetricsId: task1TaskMetrics.id, + language: "go", + exercise: "go/say", + passed: true, + startedAt: new Date("2023-01-01T10:00:00Z"), + finishedAt: new Date("2023-01-01T10:45:00Z"), + }) + + sourceTaskIds.push(task1.id) + + const task2TaskMetrics = await createTaskMetrics({ + duration: 30_000, + tokensIn: 75_000, + tokensOut: 1_000, + tokensContext: 76_000, + cacheWrites: 0, + cacheReads: 0, + cost: 0.04, + toolUsage: { + read_file: { attempts: 3, failures: 0 }, + apply_diff: { attempts: 2, failures: 0 }, + }, + }) + + sourceTaskMetricsIds.push(task2TaskMetrics.id) + + const task2 = await createTask({ + runId: sourceRunId, + taskMetricsId: task2TaskMetrics.id, + language: "python", + exercise: "python/hello-world", + passed: false, + startedAt: new Date("2023-01-01T11:00:00Z"), + finishedAt: new Date("2023-01-01T11:30:00Z"), + }) + + sourceTaskIds.push(task2.id) + + const task3 = await createTask({ + runId: sourceRunId, + taskMetricsId: null, + language: "rust", + exercise: "rust/hello-world", + passed: true, + startedAt: new Date("2023-01-01T12:00:00Z"), + finishedAt: new Date("2023-01-01T12:15:00Z"), + }) + + sourceTaskIds.push(task3.id) + + const toolError1 = await createToolError({ + runId: sourceRunId, + taskId: task1.id, + toolName: "apply_diff", + error: "Syntax error in diff", + }) + + sourceToolErrorIds.push(toolError1.id) + + const toolError2 = await createToolError({ + runId: sourceRunId, + taskId: task2.id, + toolName: "execute_command", + error: "Command failed with exit code 1", + }) + + sourceToolErrorIds.push(toolError2.id) + + const toolError3 = await createToolError({ + runId: sourceRunId, + taskId: null, + toolName: "browser_action", + error: "Browser connection timeout", + }) + + sourceToolErrorIds.push(toolError3.id) + }) + + afterEach(async () => { + if (sourceToolErrorIds.length > 0) { + await db.delete(schema.toolErrors).where(eq(schema.toolErrors.runId, sourceRunId)) + } + + if (sourceTaskIds.length > 0) { + await db.delete(schema.tasks).where(eq(schema.tasks.runId, sourceRunId)) + } + + await db.delete(schema.runs).where(eq(schema.runs.id, sourceRunId)) + + if (sourceTaskMetricsIds.length > 0) { + for (const id of sourceTaskMetricsIds) { + await db.delete(schema.taskMetrics).where(eq(schema.taskMetrics.id, id)) + } + } + + sourceTaskIds = [] + sourceTaskMetricsIds = [] + sourceToolErrorIds = [] + }) + + it("should copy a complete run with all related data", async () => { + const newRunId = await copyRun({ sourceDb: db, targetDb: db, runId: sourceRunId }) + + expect(newRunId).toBeDefined() + expect(newRunId).not.toBe(sourceRunId) + + const copiedRun = await db.query.runs.findFirst({ + where: eq(schema.runs.id, newRunId), + with: { taskMetrics: true }, + }) + + expect(copiedRun).toBeDefined() + expect(copiedRun!.model).toBe("gpt-4.1-mini") + expect(copiedRun!.description).toBe("Test run for copying") + expect(copiedRun!.concurrency).toBe(4) + expect(copiedRun!.passed).toBe(2) + expect(copiedRun!.failed).toBe(1) + expect(copiedRun!.taskMetrics).toBeDefined() + + expect(copiedRun!.taskMetrics!.duration).toBe(120_000) + expect(copiedRun!.taskMetrics!.tokensIn).toBe(200_000) + expect(copiedRun!.taskMetrics!.toolUsage).toEqual({ + read_file: { attempts: 10, failures: 1 }, + apply_diff: { attempts: 8, failures: 2 }, + }) + + const copiedTasks = await db.query.tasks.findMany({ + where: eq(schema.tasks.runId, newRunId), + with: { taskMetrics: true }, + orderBy: (tasks, { asc }) => [asc(tasks.language)], + }) + + expect(copiedTasks).toHaveLength(3) + + const goTask = copiedTasks.find((t) => t.language === "go")! + expect(goTask.exercise).toBe("go/say") + expect(goTask.passed).toBe(true) + expect(goTask.taskMetrics).toBeDefined() + expect(goTask.taskMetrics!.duration).toBe(45_000) + expect(goTask.taskMetrics!.toolUsage).toEqual({ + read_file: { attempts: 3, failures: 0 }, + apply_diff: { attempts: 3, failures: 1 }, + }) + + const pythonTask = copiedTasks.find((t) => t.language === "python")! + expect(pythonTask.exercise).toBe("python/hello-world") + expect(pythonTask.passed).toBe(false) + expect(pythonTask.taskMetrics).toBeDefined() + expect(pythonTask.taskMetrics!.duration).toBe(30_000) + + const rustTask = copiedTasks.find((t) => t.language === "rust")! + expect(rustTask.exercise).toBe("rust/hello-world") + expect(rustTask.passed).toBe(true) + expect(rustTask.taskMetrics).toBeNull() + + const copiedToolErrors = await db.query.toolErrors.findMany({ + where: eq(schema.toolErrors.runId, newRunId), + }) + + expect(copiedToolErrors).toHaveLength(3) + + const taskToolErrors = copiedToolErrors.filter((te) => te.taskId !== null) + const runToolErrors = copiedToolErrors.filter((te) => te.taskId === null) + + expect(taskToolErrors).toHaveLength(2) + expect(runToolErrors).toHaveLength(1) + + const browserError = runToolErrors.find((te) => te.toolName === "browser_action")! + expect(browserError.error).toBe("Browser connection timeout") + + await db.delete(schema.toolErrors).where(eq(schema.toolErrors.runId, newRunId)) + await db.delete(schema.tasks).where(eq(schema.tasks.runId, newRunId)) + + const copiedRunForCleanup = await db.query.runs.findFirst({ + where: eq(schema.runs.id, newRunId), + columns: { taskMetricsId: true }, + }) + + await db.delete(schema.runs).where(eq(schema.runs.id, newRunId)) + + const copiedTasksForCleanup = await db.query.tasks.findMany({ + where: eq(schema.tasks.runId, newRunId), + columns: { taskMetricsId: true }, + }) + + const taskMetricsToDelete = copiedTasksForCleanup + .map((t) => t.taskMetricsId) + .filter((id): id is number => id !== null) + + if (copiedRunForCleanup?.taskMetricsId) { + taskMetricsToDelete.push(copiedRunForCleanup.taskMetricsId) + } + + if (taskMetricsToDelete.length > 0) { + for (const id of taskMetricsToDelete) { + await db.delete(schema.taskMetrics).where(eq(schema.taskMetrics.id, id)) + } + } + }) + + it("should throw RecordNotFoundError for non-existent run", async () => { + await expect(copyRun({ sourceDb: db, targetDb: db, runId: 999999 })).rejects.toThrow(RecordNotFoundError) + }) + + it("should copy run without task metrics", async () => { + const minimalRun = await createRun({ model: "gpt-3.5-turbo", socketPath: "/tmp/minimal.sock" }) + + const newRunId = await copyRun({ sourceDb: db, targetDb: db, runId: minimalRun.id }) + + const copiedRun = await db.query.runs.findFirst({ where: eq(schema.runs.id, newRunId) }) + + expect(copiedRun).toBeDefined() + expect(copiedRun!.model).toBe("gpt-3.5-turbo") + expect(copiedRun!.taskMetricsId).toBeNull() + + await db.delete(schema.runs).where(eq(schema.runs.id, minimalRun.id)) + await db.delete(schema.runs).where(eq(schema.runs.id, newRunId)) + }) +}) diff --git a/packages/evals/src/db/queries/copyRun.ts b/packages/evals/src/db/queries/copyRun.ts new file mode 100644 index 0000000000..6b14dd6a80 --- /dev/null +++ b/packages/evals/src/db/queries/copyRun.ts @@ -0,0 +1,183 @@ +import { eq } from "drizzle-orm" +import type { NodePgDatabase } from "drizzle-orm/node-postgres" + +import type { InsertRun, InsertTask, InsertTaskMetrics, InsertToolError } from "../schema.js" +import { schema } from "../schema.js" + +import { RecordNotFoundError, RecordNotCreatedError } from "./errors.js" + +export const copyRun = async ({ + sourceDb, + targetDb, + runId, +}: { + sourceDb: NodePgDatabase + targetDb: NodePgDatabase + runId: number +}) => { + const sourceRun = await sourceDb.query.runs.findFirst({ + where: eq(schema.runs.id, runId), + with: { taskMetrics: true }, + }) + + if (!sourceRun) { + throw new RecordNotFoundError(`Run with ID ${runId} not found`) + } + + let newRunTaskMetricsId: number | null = null + + if (sourceRun.taskMetrics) { + const runTaskMetricsData: InsertTaskMetrics = { + tokensIn: sourceRun.taskMetrics.tokensIn, + tokensOut: sourceRun.taskMetrics.tokensOut, + tokensContext: sourceRun.taskMetrics.tokensContext, + cacheWrites: sourceRun.taskMetrics.cacheWrites, + cacheReads: sourceRun.taskMetrics.cacheReads, + cost: sourceRun.taskMetrics.cost, + duration: sourceRun.taskMetrics.duration, + toolUsage: sourceRun.taskMetrics.toolUsage, + } + + const newRunTaskMetrics = await targetDb + .insert(schema.taskMetrics) + .values({ + ...runTaskMetricsData, + createdAt: new Date(), + }) + .returning() + + const createdRunTaskMetrics = newRunTaskMetrics[0] + + if (!createdRunTaskMetrics) { + throw new RecordNotCreatedError("Failed to create run taskMetrics") + } + + newRunTaskMetricsId = createdRunTaskMetrics.id + } + + const runData: InsertRun = { + taskMetricsId: newRunTaskMetricsId, + model: sourceRun.model, + description: sourceRun.description, + settings: sourceRun.settings, + pid: sourceRun.pid, + socketPath: sourceRun.socketPath, + concurrency: sourceRun.concurrency, + passed: sourceRun.passed, + failed: sourceRun.failed, + } + + const newRuns = await targetDb + .insert(schema.runs) + .values({ ...runData, createdAt: new Date() }) + .returning() + + const newRun = newRuns[0] + + if (!newRun) { + throw new RecordNotCreatedError("Failed to create run") + } + + const newRunId = newRun.id + + const sourceTasks = await sourceDb.query.tasks.findMany({ + where: eq(schema.tasks.runId, runId), + with: { taskMetrics: true }, + }) + + const taskIdMapping = new Map() + + for (const sourceTask of sourceTasks) { + let newTaskMetricsId: number | null = null + + if (sourceTask.taskMetrics) { + const taskMetricsData: InsertTaskMetrics = { + tokensIn: sourceTask.taskMetrics.tokensIn, + tokensOut: sourceTask.taskMetrics.tokensOut, + tokensContext: sourceTask.taskMetrics.tokensContext, + cacheWrites: sourceTask.taskMetrics.cacheWrites, + cacheReads: sourceTask.taskMetrics.cacheReads, + cost: sourceTask.taskMetrics.cost, + duration: sourceTask.taskMetrics.duration, + toolUsage: sourceTask.taskMetrics.toolUsage, + } + + const newTaskMetrics = await targetDb + .insert(schema.taskMetrics) + .values({ ...taskMetricsData, createdAt: new Date() }) + .returning() + + const createdTaskMetrics = newTaskMetrics[0] + + if (!createdTaskMetrics) { + throw new RecordNotCreatedError("Failed to create task taskMetrics") + } + + newTaskMetricsId = createdTaskMetrics.id + } + + const taskData: InsertTask = { + runId: newRunId, + taskMetricsId: newTaskMetricsId, + language: sourceTask.language, + exercise: sourceTask.exercise, + passed: sourceTask.passed, + startedAt: sourceTask.startedAt, + finishedAt: sourceTask.finishedAt, + } + + const newTasks = await targetDb + .insert(schema.tasks) + .values({ ...taskData, createdAt: new Date() }) + .returning() + + const newTask = newTasks[0] + + if (!newTask) { + throw new RecordNotCreatedError("Failed to create task") + } + + taskIdMapping.set(sourceTask.id, newTask.id) + } + + for (const [oldTaskId, newTaskId] of taskIdMapping) { + const sourceTaskToolErrors = await sourceDb.query.toolErrors.findMany({ + where: eq(schema.toolErrors.taskId, oldTaskId), + }) + + for (const sourceToolError of sourceTaskToolErrors) { + const toolErrorData: InsertToolError = { + runId: newRunId, + taskId: newTaskId, + toolName: sourceToolError.toolName, + error: sourceToolError.error, + } + + await targetDb.insert(schema.toolErrors).values({ + ...toolErrorData, + createdAt: new Date(), + }) + } + } + + const sourceRunToolErrors = await sourceDb.query.toolErrors.findMany({ + where: eq(schema.toolErrors.runId, runId), + }) + + for (const sourceToolError of sourceRunToolErrors) { + if (sourceToolError.taskId && taskIdMapping.has(sourceToolError.taskId)) { + continue + } + + const toolErrorData: InsertToolError = { + runId: newRunId, + taskId: sourceToolError.taskId ? taskIdMapping.get(sourceToolError.taskId) || null : null, + toolName: sourceToolError.toolName, + error: sourceToolError.error, + } + + await targetDb.insert(schema.toolErrors).values({ ...toolErrorData, createdAt: new Date() }) + } + + return newRunId +} diff --git a/packages/evals/src/db/queries/tasks.ts b/packages/evals/src/db/queries/tasks.ts index 27d3cb54be..4f9fee0f9a 100644 --- a/packages/evals/src/db/queries/tasks.ts +++ b/packages/evals/src/db/queries/tasks.ts @@ -1,4 +1,4 @@ -import { and, asc, eq } from "drizzle-orm" +import { and, asc, eq, sql } from "drizzle-orm" import type { ExerciseLanguage } from "../../exercises/index.js" @@ -63,3 +63,26 @@ export const getTasks = async (runId: number) => with: { taskMetrics: true }, orderBy: asc(tasks.id), }) + +export const getLanguageScores = async () => { + const records = await db + .select({ + runId: tasks.runId, + language: tasks.language, + score: sql`cast(sum(case when ${tasks.passed} = true then 1 else 0 end) as float) / count(*)`, + }) + .from(tasks) + .groupBy(tasks.runId, tasks.language) + + const results: Record> = {} + + for (const { runId, language, score } of records) { + if (!results[runId]) { + results[runId] = { go: 0, java: 0, javascript: 0, python: 0, rust: 0 } + } + + results[runId][language] = score + } + + return results +} diff --git a/packages/ipc/package.json b/packages/ipc/package.json index 6c8b9dba33..218d74fbae 100644 --- a/packages/ipc/package.json +++ b/packages/ipc/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "^22.15.20", + "@types/node": "20.x", "@types/node-ipc": "^9.2.3", "vitest": "^3.1.3" } diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index f9e228bc89..ea73eca9e9 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -13,12 +13,12 @@ "dependencies": { "@roo-code/types": "workspace:^", "posthog-node": "^4.7.0", - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "^22.15.20", + "@types/node": "20.x", "@types/vscode": "^1.84.0", "vitest": "^3.1.3" } diff --git a/packages/types/package.json b/packages/types/package.json index d35b9501df..277d806fe7 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -23,12 +23,12 @@ "clean": "rimraf dist npm/dist .turbo" }, "dependencies": { - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@roo-code/config-eslint": "workspace:^", "@roo-code/config-typescript": "workspace:^", - "@types/node": "^22.15.20", + "@types/node": "20.x", "tsup": "^8.3.5", "vitest": "^3.1.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed849dcb6d..2f46b6cd25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,8 +69,8 @@ importers: specifier: ^10.0.10 version: 10.0.10 '@types/node': - specifier: ^22.14.1 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 '@types/vscode': specifier: ^1.95.0 version: 1.100.0 @@ -102,8 +102,8 @@ importers: apps/web-evals: dependencies: '@hookform/resolvers': - specifier: ^4.1.3 - version: 4.1.3(react-hook-form@7.57.0(react@18.3.1)) + specifier: ^5.1.1 + version: 5.1.1(react-hook-form@7.57.0(react@18.3.1)) '@radix-ui/react-alert-dialog': specifier: ^1.1.7 version: 1.1.13(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -201,8 +201,8 @@ importers: specifier: ^1.1.2 version: 1.1.2(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -231,15 +231,15 @@ importers: apps/web-roo-code: dependencies: - '@libsql/client': - specifier: ^0.15.7 - version: 0.15.8 '@radix-ui/react-dialog': specifier: ^1.1.14 version: 1.1.14(@types/react-dom@18.3.7(@types/react@18.3.23))(@types/react@18.3.23)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-slot': specifier: ^1.2.3 version: 1.2.3(@types/react@18.3.23)(react@18.3.1) + '@roo-code/evals': + specifier: workspace:^ + version: link:../../packages/evals '@roo-code/types': specifier: workspace:^ version: link:../../packages/types @@ -252,12 +252,6 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 - drizzle-orm: - specifier: ^0.44.0 - version: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7) - drizzle-zod: - specifier: ^0.8.0 - version: 0.8.2(drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7))(zod@3.25.49) embla-carousel-auto-scroll: specifier: ^8.6.0 version: 8.6.0(embla-carousel@8.6.0) @@ -301,8 +295,8 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.17) zod: - specifier: ^3.25.41 - version: 3.25.49 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -314,7 +308,7 @@ importers: specifier: ^0.5.16 version: 0.5.16(tailwindcss@3.4.17) '@types/node': - specifier: ^20.17.54 + specifier: 20.x version: 20.17.57 '@types/react': specifier: ^18.3.23 @@ -325,9 +319,6 @@ importers: autoprefixer: specifier: ^10.4.21 version: 10.4.21(postcss@8.5.4) - drizzle-kit: - specifier: ^0.31.0 - version: 0.31.1 postcss: specifier: ^8.5.4 version: 8.5.4 @@ -338,8 +329,8 @@ importers: packages/build: dependencies: zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -348,11 +339,11 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: ^22.15.20 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) packages/cloud: dependencies: @@ -366,8 +357,8 @@ importers: specifier: ^1.7.4 version: 1.9.0 zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -376,14 +367,14 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: ^22.15.20 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 '@types/vscode': specifier: ^1.84.0 version: 1.100.0 vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) packages/config-eslint: devDependencies: @@ -428,9 +419,6 @@ importers: '@roo-code/types': specifier: workspace:^ version: link:../types - better-sqlite3: - specifier: ^11.10.0 - version: 11.10.0 cmd-ts: specifier: ^0.13.0 version: 0.13.0 @@ -462,8 +450,8 @@ importers: specifier: ^5.5.5 version: 5.5.5 zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -472,8 +460,8 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: ^22.15.20 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 '@types/node-ipc': specifier: ^9.2.3 version: 9.2.3 @@ -488,7 +476,7 @@ importers: version: 4.19.4 vitest: specifier: ^3.2.0 - version: 3.2.0(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.0(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) packages/ipc: dependencies: @@ -506,14 +494,14 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: ^22.15.20 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 '@types/node-ipc': specifier: ^9.2.3 version: 9.2.3 vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) packages/telemetry: dependencies: @@ -524,8 +512,8 @@ importers: specifier: ^4.7.0 version: 4.17.2 zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -534,20 +522,20 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: ^22.15.20 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 '@types/vscode': specifier: ^1.84.0 version: 1.100.0 vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) packages/types: dependencies: zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@roo-code/config-eslint': specifier: workspace:^ @@ -556,14 +544,14 @@ importers: specifier: workspace:^ version: link:../config-typescript '@types/node': - specifier: ^22.15.20 - version: 22.15.20 + specifier: 20.x + version: 20.17.57 tsup: specifier: ^8.3.5 version: 8.5.0(jiti@2.4.2)(postcss@8.5.4)(tsx@4.19.4)(typescript@5.8.3)(yaml@2.8.0) vitest: specifier: ^3.1.3 - version: 3.1.3(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 3.1.3(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) src: dependencies: @@ -587,7 +575,7 @@ importers: version: 1.3.0(@modelcontextprotocol/sdk@1.12.0) '@mistralai/mistralai': specifier: ^1.3.6 - version: 1.6.1(zod@3.24.4) + version: 1.6.1(zod@3.25.61) '@modelcontextprotocol/sdk': specifier: ^1.9.0 version: 1.12.0 @@ -683,7 +671,7 @@ importers: version: 12.0.0 openai: specifier: ^4.78.1 - version: 4.103.0(ws@8.18.2)(zod@3.24.4) + version: 4.103.0(ws@8.18.2)(zod@3.25.61) os-name: specifier: ^6.0.0 version: 6.1.0 @@ -766,8 +754,8 @@ importers: specifier: ^2.8.0 version: 2.8.0 zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@jest/globals': specifier: ^29.7.0 @@ -879,7 +867,7 @@ importers: version: 3.1.3(@types/debug@4.1.12)(@types/node@20.17.50)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) zod-to-ts: specifier: ^1.2.0 - version: 1.2.0(typescript@5.8.3)(zod@3.24.4) + version: 1.2.0(typescript@5.8.3)(zod@3.25.61) webview-ui: dependencies: @@ -930,7 +918,7 @@ importers: version: link:../packages/types '@tailwindcss/vite': specifier: ^4.0.0 - version: 4.1.6(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.1.6(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@tanstack/react-query': specifier: ^5.68.0 version: 5.76.1(react@18.3.1) @@ -1055,8 +1043,8 @@ importers: specifier: ^0.2.2 version: 0.2.2(@types/react@18.3.23)(react@18.3.1) zod: - specifier: ^3.24.2 - version: 3.24.4 + specifier: ^3.25.61 + version: 3.25.61 devDependencies: '@jest/globals': specifier: ^29.7.0 @@ -1080,8 +1068,8 @@ importers: specifier: ^29.0.0 version: 29.5.14 '@types/node': - specifier: ^18.0.0 - version: 18.19.100 + specifier: 20.x + version: 20.17.57 '@types/react': specifier: ^18.3.23 version: 18.3.23 @@ -1099,13 +1087,13 @@ importers: version: 1.57.5 '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.4.1(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + version: 4.4.1(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) identity-obj-proxy: specifier: ^3.0.0 version: 3.0.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0) + version: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -1114,13 +1102,13 @@ importers: version: 1.0.5 ts-jest: specifier: ^29.2.5 - version: 29.3.3(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.5)(jest@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0))(typescript@5.8.3) + version: 29.3.3(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.5)(jest@29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: 6.3.5 - version: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + version: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) packages: @@ -2134,10 +2122,10 @@ packages: peerDependencies: '@modelcontextprotocol/sdk': ^1.11.0 - '@hookform/resolvers@4.1.3': - resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==} + '@hookform/resolvers@5.1.1': + resolution: {integrity: sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg==} peerDependencies: - react-hook-form: ^7.0.0 + react-hook-form: ^7.55.0 '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -2379,16 +2367,16 @@ packages: '@libsql/client@0.15.8': resolution: {integrity: sha512-TskygwF+ToZeWhPPT0WennyGrP3tmkKraaKopT2YwUjqD6DWDRm6SG5iy0VqnaO+HC9FNBCDX0oQPODU3gqqPQ==} - '@libsql/core@0.15.8': - resolution: {integrity: sha512-oX2fQqDbZkaBUvFMGvJq1Jh+mVzJrgNbEwK6Wzvp91z3uMe9iaIIXgO8yxB72RpUf7BqzjiKHjEiRXytfTdbUw==} + '@libsql/core@0.15.9': + resolution: {integrity: sha512-4OVdeAmuaCUq5hYT8NNn0nxlO9AcA/eTjXfUZ+QK8MT3Dz7Z76m73x7KxjU6I64WyXX98dauVH2b9XM+d84npw==} - '@libsql/darwin-arm64@0.5.12': - resolution: {integrity: sha512-RDA87qaCWPE+uJWY91A0Is8KU9x43xDWMH8VNlj330CLFT9rC6jDypqadg0mzu1FEL2leG6BRdX6EcfM6NM3pw==} + '@libsql/darwin-arm64@0.5.13': + resolution: {integrity: sha512-ASz/EAMLDLx3oq9PVvZ4zBXXHbz2TxtxUwX2xpTRFR4V4uSHAN07+jpLu3aK5HUBLuv58z7+GjaL5w/cyjR28Q==} cpu: [arm64] os: [darwin] - '@libsql/darwin-x64@0.5.12': - resolution: {integrity: sha512-6Ufip8uxQkLOFCsGd07miDt1w+Rx5VIJdDI6mSRBlVaEXWuWx1R8D7gfeCS0k73vDd+oh39pYF/R8nVFkwiOcg==} + '@libsql/darwin-x64@0.5.13': + resolution: {integrity: sha512-kzglniv1difkq8opusSXM7u9H0WoEPeKxw0ixIfcGfvlCVMJ+t9UNtXmyNHW68ljdllje6a4C6c94iPmIYafYA==} cpu: [x64] os: [darwin] @@ -2402,38 +2390,38 @@ packages: '@libsql/isomorphic-ws@0.1.5': resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} - '@libsql/linux-arm-gnueabihf@0.5.12': - resolution: {integrity: sha512-I+4K++7byiOjYJNRGcrCBlIXjP6MwUta2GxPGZMoH2kAv6AintO4dvritu6vDe9LyRPXTjRJl30k+ThXR0RWxQ==} + '@libsql/linux-arm-gnueabihf@0.5.13': + resolution: {integrity: sha512-UEW+VZN2r0mFkfztKOS7cqfS8IemuekbjUXbXCwULHtusww2QNCXvM5KU9eJCNE419SZCb0qaEWYytcfka8qeA==} cpu: [arm] os: [linux] - '@libsql/linux-arm-musleabihf@0.5.12': - resolution: {integrity: sha512-87C3A5ozNEdOnI5VZq9lHpPJ3Ncl3p+qB5roDluVKflx9kKH1hEc8MpwkvU3qeIWppvgHowXlO9CfS572V10OA==} + '@libsql/linux-arm-musleabihf@0.5.13': + resolution: {integrity: sha512-NMDgLqryYBv4Sr3WoO/m++XDjR5KLlw9r/JK4Ym6A1XBv2bxQQNhH0Lxx3bjLW8qqhBD4+0xfms4d2cOlexPyA==} cpu: [arm] os: [linux] - '@libsql/linux-arm64-gnu@0.5.12': - resolution: {integrity: sha512-0jpcuD7nHGD4XVTbId44SaY/JcqURKpxkXUcW4FsQ1qmkG5PsUy5l2Ob29P8HwGRBhDBomFWA4PvwJGrP/2pMA==} + '@libsql/linux-arm64-gnu@0.5.13': + resolution: {integrity: sha512-/wCxVdrwl1ee6D6LEjwl+w4SxuLm5UL9Kb1LD5n0bBGs0q+49ChdPPh7tp175iRgkcrTgl23emymvt1yj3KxVQ==} cpu: [arm64] os: [linux] - '@libsql/linux-arm64-musl@0.5.12': - resolution: {integrity: sha512-ic5bHp9OTCNgmvqojqkxWfuPm4Y8CKfpUe/AqmXrstzqlE9EKg1qD9KZIjso2g4pX15KPWJGPSd29OXxHkzsog==} + '@libsql/linux-arm64-musl@0.5.13': + resolution: {integrity: sha512-xnVAbZIanUgX57XqeI5sNaDnVilp0Di5syCLSEo+bRyBobe/1IAeehNZpyVbCy91U2N6rH1C/mZU7jicVI9x+A==} cpu: [arm64] os: [linux] - '@libsql/linux-x64-gnu@0.5.12': - resolution: {integrity: sha512-9zDtahCw2q0WJ54c/0vq142JtzI16OB8/U0bVCrpxF9DmLFyKBrAtEvoYdvKtFmvcvNn7YA5LEytr2g2q+xl1g==} + '@libsql/linux-x64-gnu@0.5.13': + resolution: {integrity: sha512-/mfMRxcQAI9f8t7tU3QZyh25lXgXKzgin9B9TOSnchD73PWtsVhlyfA6qOCfjQl5kr4sHscdXD5Yb3KIoUgrpQ==} cpu: [x64] os: [linux] - '@libsql/linux-x64-musl@0.5.12': - resolution: {integrity: sha512-+fisSpE+2yK1N88shPtB7bEB8d+fF3CQmy1KnbJ4Oned8cw5uBfU46A1ICG+49RFaKxmoIQimHVAxfGV9NFQ3w==} + '@libsql/linux-x64-musl@0.5.13': + resolution: {integrity: sha512-rdefPTpQCVwUjIQYbDLMv3qpd5MdrT0IeD0UZPGqhT9AWU8nJSQoj2lfyIDAWEz7PPOVCY4jHuEn7FS2sw9kRA==} cpu: [x64] os: [linux] - '@libsql/win32-x64-msvc@0.5.12': - resolution: {integrity: sha512-upNJCcgMgpAFXlL//rRVwlPgMT8uG1LoilHgCEpAp+GEjgBjoDgGW6iOkktuJC8paZh5kt9dCPh3r3jF3HWQjg==} + '@libsql/win32-x64-msvc@0.5.13': + resolution: {integrity: sha512-aNcmDrD1Ws+dNZIv9ECbxBQumqB9MlSVEykwfXJpqv/593nABb8Ttg5nAGUPtnADyaGDTrGvPPP81d/KsKho4Q==} cpu: [x64] os: [win32] @@ -4255,8 +4243,8 @@ packages: '@types/node@20.17.57': resolution: {integrity: sha512-f3T4y6VU4fVQDKVqJV4Uppy8c1p/sVvS3peyqxyWnzkqXFJLRU7Y1Bl7rMS1Qe9z0v4M6McY0Fp9yBsgHJUsWQ==} - '@types/node@22.15.20': - resolution: {integrity: sha512-A6BohGFRGHAscJsTslDCA9JG7qSJr/DWUvrvY8yi9IgnGtMxCyat7vvQ//MFa0DnLsyuS3wYTpLdw4Hf+Q5JXw==} + '@types/node@20.19.0': + resolution: {integrity: sha512-hfrc+1tud1xcdVTABC2JiomZJEklMcXYNTVtZLAeqTVWD+qL5jkHKT+1lOtqDdGxt+mB53DTtiz673vfjU8D1Q==} '@types/node@22.15.29': resolution: {integrity: sha512-LNdjOkUDlU1RZb8e1kOIUpN1qQUlzGkEtbVNo53vbrwDg5om6oduhm4SiUaPW5ASTXhAiP0jInWG8Qx9fVlOeQ==} @@ -5774,12 +5762,6 @@ packages: sqlite3: optional: true - drizzle-zod@0.8.2: - resolution: {integrity: sha512-9Do/16OjFFNrQDZgvMtxtDDwKWbFOxUAIwNPKX98SfxrP8H18vhN1BvNXbhelLcdgCE7GEaXDJqBjMExSkhpkA==} - peerDependencies: - drizzle-orm: '>=0.36.0' - zod: ^3.25.1 - duck@0.1.12: resolution: {integrity: sha512-wkctla1O6VfP89gQ+J/yDesM0S7B7XLXjKGzXxMDVFg7uEn706niAtyYovKbyq1oT9YwDcly721/iUWoc8MVRg==} @@ -7369,8 +7351,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libsql@0.5.12: - resolution: {integrity: sha512-TikiQZ1j4TwFEqVdJdTM9ZTti28is/ytGEvn0S2MocOj69UKQetWACe/qd8KAD5VeNnQSVd6Nlm2AJx0DFW9Ag==} + libsql@0.5.13: + resolution: {integrity: sha512-5Bwoa/CqzgkTwySgqHA5TsaUDRrdLIbdM4egdPcaAnqO3aC+qAgS6BwdzuZwARA5digXwiskogZ8H7Yy4XfdOg==} + cpu: [x64, arm64, wasm32, arm] os: [darwin, linux, win32] lie@3.3.0: @@ -10469,17 +10452,8 @@ packages: zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - zod@3.24.4: - resolution: {integrity: sha512-OdqJE9UDRPwWsrHjLN2F8bPxvwJBK22EHLWtanu0LSYr5YqzsaaW3RMgmjwr8Rypg5k+meEJdSPXJZXE/yqOMg==} - - zod@3.25.49: - resolution: {integrity: sha512-JMMPMy9ZBk3XFEdbM3iL1brx4NUSejd6xr3ELrrGEfGb355gjhiAWtG3K5o+AViV/3ZfkIrCzXsZn6SbLwTR8Q==} - - zod@3.25.51: - resolution: {integrity: sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==} - - zod@3.25.57: - resolution: {integrity: sha512-6tgzLuwVST5oLUxXTmBqoinKMd3JeesgbgseXeFasKKj8Q1FCZrHnbqJOyiEvr4cVAlbug+CgIsmJ8cl/pU5FA==} + zod@3.25.61: + resolution: {integrity: sha512-fzfJgUw78LTNnHujj9re1Ov/JJQkRZZGDMcYqSx7Hp4rPOkKywaFHq0S6GoHeXs0wGNE/sIOutkXgnwzrVOGCQ==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -11804,15 +11778,15 @@ snapshots: '@modelcontextprotocol/sdk': 1.12.0 google-auth-library: 9.15.1 ws: 8.18.2 - zod: 3.25.51 - zod-to-json-schema: 3.24.5(zod@3.25.51) + zod: 3.25.61 + zod-to-json-schema: 3.24.5(zod@3.25.61) transitivePeerDependencies: - bufferutil - encoding - supports-color - utf-8-validate - '@hookform/resolvers@4.1.3(react-hook-form@7.57.0(react@18.3.1))': + '@hookform/resolvers@5.1.1(react-hook-form@7.57.0(react@18.3.1))': dependencies: '@standard-schema/utils': 0.3.0 react-hook-form: 7.57.0(react@18.3.1) @@ -11946,7 +11920,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -11959,14 +11933,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.29)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -11991,7 +11965,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -12009,7 +11983,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 22.15.29 + '@types/node': 20.17.57 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -12031,7 +12005,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 22.15.29 + '@types/node': 20.17.57 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -12101,7 +12075,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.29 + '@types/node': 20.17.57 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -12132,23 +12106,25 @@ snapshots: '@libsql/client@0.15.8': dependencies: - '@libsql/core': 0.15.8 + '@libsql/core': 0.15.9 '@libsql/hrana-client': 0.7.0 js-base64: 3.7.7 - libsql: 0.5.12 + libsql: 0.5.13 promise-limit: 2.7.0 transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true - '@libsql/core@0.15.8': + '@libsql/core@0.15.9': dependencies: js-base64: 3.7.7 + optional: true - '@libsql/darwin-arm64@0.5.12': + '@libsql/darwin-arm64@0.5.13': optional: true - '@libsql/darwin-x64@0.5.12': + '@libsql/darwin-x64@0.5.13': optional: true '@libsql/hrana-client@0.7.0': @@ -12160,8 +12136,10 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true - '@libsql/isomorphic-fetch@0.3.1': {} + '@libsql/isomorphic-fetch@0.3.1': + optional: true '@libsql/isomorphic-ws@0.1.5': dependencies: @@ -12170,26 +12148,27 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + optional: true - '@libsql/linux-arm-gnueabihf@0.5.12': + '@libsql/linux-arm-gnueabihf@0.5.13': optional: true - '@libsql/linux-arm-musleabihf@0.5.12': + '@libsql/linux-arm-musleabihf@0.5.13': optional: true - '@libsql/linux-arm64-gnu@0.5.12': + '@libsql/linux-arm64-gnu@0.5.13': optional: true - '@libsql/linux-arm64-musl@0.5.12': + '@libsql/linux-arm64-musl@0.5.13': optional: true - '@libsql/linux-x64-gnu@0.5.12': + '@libsql/linux-x64-gnu@0.5.13': optional: true - '@libsql/linux-x64-musl@0.5.12': + '@libsql/linux-x64-musl@0.5.13': optional: true - '@libsql/win32-x64-msvc@0.5.12': + '@libsql/win32-x64-msvc@0.5.13': optional: true '@manypkg/find-root@1.1.0': @@ -12235,10 +12214,10 @@ snapshots: dependencies: exenv-es6: 1.1.1 - '@mistralai/mistralai@1.6.1(zod@3.24.4)': + '@mistralai/mistralai@1.6.1(zod@3.25.61)': dependencies: - zod: 3.24.4 - zod-to-json-schema: 3.24.5(zod@3.24.4) + zod: 3.25.61 + zod-to-json-schema: 3.24.5(zod@3.25.61) '@mixmark-io/domino@2.2.0': {} @@ -12253,8 +12232,8 @@ snapshots: express-rate-limit: 7.5.0(express@5.1.0) pkce-challenge: 5.0.0 raw-body: 3.0.0 - zod: 3.25.49 - zod-to-json-schema: 3.24.5(zod@3.25.49) + zod: 3.25.61 + zod-to-json-schema: 3.24.5(zod@3.25.61) transitivePeerDependencies: - supports-color @@ -12281,7 +12260,8 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true - '@neon-rs/load@0.0.4': {} + '@neon-rs/load@0.0.4': + optional: true '@next/env@15.2.5': {} @@ -13830,12 +13810,12 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17 - '@tailwindcss/vite@4.1.6(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@tailwindcss/vite@4.1.6(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@tailwindcss/node': 4.1.6 '@tailwindcss/oxide': 4.1.6 tailwindcss: 4.1.6 - vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) '@tanstack/query-core@5.76.0': {} @@ -14064,11 +14044,11 @@ snapshots: '@types/glob@8.1.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 22.15.29 + '@types/node': 20.17.57 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 '@types/hast@3.0.4': dependencies: @@ -14093,7 +14073,7 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 @@ -14125,12 +14105,12 @@ snapshots: '@types/node-fetch@2.6.12': dependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 form-data: 4.0.2 '@types/node-ipc@9.2.3': dependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 '@types/node@12.20.55': {} @@ -14146,9 +14126,10 @@ snapshots: dependencies: undici-types: 6.19.8 - '@types/node@22.15.20': + '@types/node@20.19.0': dependencies: undici-types: 6.21.0 + optional: true '@types/node@22.15.29': dependencies: @@ -14203,7 +14184,8 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.15.29 + '@types/node': 20.19.0 + optional: true '@types/yargs-parser@21.0.3': {} @@ -14213,7 +14195,7 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 optional: true '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.27.0(jiti@2.4.2))(typescript@5.8.3)': @@ -14303,14 +14285,14 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitejs/plugin-react@4.4.1(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@babel/core': 7.27.1 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.27.1) '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.27.1) '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -14345,21 +14327,21 @@ snapshots: optionalDependencies: vite: 6.3.5(@types/node@20.17.50)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.1.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - '@vitest/mocker@3.2.0(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.0(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.0 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) '@vitest/mocker@3.2.1(vite@6.3.5(@types/node@22.15.29)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: @@ -14861,6 +14843,7 @@ snapshots: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 + optional: true bignumber.js@9.3.0: {} @@ -14869,12 +14852,14 @@ snapshots: bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 + optional: true bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true bluebird@3.4.7: {} @@ -15098,7 +15083,8 @@ snapshots: dependencies: readdirp: 4.1.2 - chownr@1.1.4: {} + chownr@1.1.4: + optional: true chownr@3.0.0: {} @@ -15294,13 +15280,13 @@ snapshots: yaml: 1.10.2 optional: true - create-jest@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -15309,13 +15295,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): + create-jest@29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -15561,7 +15547,8 @@ snapshots: d3: 7.9.0 lodash-es: 4.17.21 - data-uri-to-buffer@4.0.1: {} + data-uri-to-buffer@4.0.1: + optional: true data-uri-to-buffer@6.0.2: {} @@ -15618,6 +15605,7 @@ snapshots: decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 + optional: true dedent@1.6.0(babel-plugin-macros@3.1.0): optionalDependencies: @@ -15625,7 +15613,8 @@ snapshots: deep-eql@5.0.2: {} - deep-extend@0.6.0: {} + deep-extend@0.6.0: + optional: true deep-is@0.1.4: {} @@ -15674,7 +15663,8 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@2.0.2: {} + detect-libc@2.0.2: + optional: true detect-libc@2.0.4: {} @@ -15763,11 +15753,6 @@ snapshots: gel: 2.1.0 postgres: 3.4.7 - drizzle-zod@0.8.2(drizzle-orm@0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7))(zod@3.25.49): - dependencies: - drizzle-orm: 0.44.1(@libsql/client@0.15.8)(better-sqlite3@11.10.0)(gel@2.1.0)(postgres@3.4.7) - zod: 3.25.49 - duck@0.1.12: dependencies: underscore: 1.13.7 @@ -16336,7 +16321,8 @@ snapshots: exit@0.1.2: {} - expand-template@2.0.3: {} + expand-template@2.0.3: + optional: true expect-type@1.2.1: {} @@ -16474,6 +16460,7 @@ snapshots: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + optional: true fflate@0.4.8: {} @@ -16485,7 +16472,8 @@ snapshots: dependencies: flat-cache: 4.0.1 - file-uri-to-path@1.0.0: {} + file-uri-to-path@1.0.0: + optional: true filelist@1.0.4: dependencies: @@ -16563,6 +16551,7 @@ snapshots: formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 + optional: true forwarded@0.2.0: {} @@ -16582,7 +16571,8 @@ snapshots: from@0.1.7: {} - fs-constants@1.0.0: {} + fs-constants@1.0.0: + optional: true fs-extra@7.0.1: dependencies: @@ -16722,7 +16712,8 @@ snapshots: transitivePeerDependencies: - supports-color - github-from-package@0.0.0: {} + github-from-package@0.0.0: + optional: true glob-parent@5.1.2: dependencies: @@ -17035,7 +17026,8 @@ snapshots: inherits@2.0.4: {} - ini@1.3.8: {} + ini@1.3.8: + optional: true inline-style-parser@0.1.1: {} @@ -17356,7 +17348,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 chalk: 4.1.2 co: 4.6.0 dedent: 1.6.0(babel-plugin-macros@3.1.0) @@ -17376,16 +17368,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0): + jest-cli@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -17395,16 +17387,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): + jest-cli@29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) + create-jest: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) + jest-config: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -17414,36 +17406,6 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0): - dependencies: - '@babel/core': 7.27.1 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.27.1) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - optionalDependencies: - '@types/node': 18.19.100 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - jest-config@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.27.1 @@ -17474,7 +17436,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.15.29)(babel-plugin-macros@3.1.0): + jest-config@29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0): dependencies: '@babel/core': 7.27.1 '@jest/test-sequencer': 29.7.0 @@ -17499,7 +17461,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -17529,7 +17491,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 22.15.29 + '@types/node': 20.17.57 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -17543,7 +17505,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -17553,7 +17515,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 22.15.29 + '@types/node': 20.17.57 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17592,7 +17554,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -17627,7 +17589,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -17655,7 +17617,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.2 @@ -17703,7 +17665,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -17722,7 +17684,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.15.29 + '@types/node': 20.17.57 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -17731,29 +17693,29 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 22.15.29 + '@types/node': 20.17.57 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0): + jest@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0) + jest-cli: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0): + jest@29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0): dependencies: '@jest/core': 29.7.0(babel-plugin-macros@3.1.0) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.50)(babel-plugin-macros@3.1.0) + jest-cli: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -17766,7 +17728,8 @@ snapshots: joycon@3.1.1: {} - js-base64@3.7.7: {} + js-base64@3.7.7: + optional: true js-cookie@2.2.1: {} @@ -17932,8 +17895,8 @@ snapshots: smol-toml: 1.3.4 strip-json-comments: 5.0.2 typescript: 5.8.3 - zod: 3.25.57 - zod-validation-error: 3.4.1(zod@3.25.57) + zod: 3.25.61 + zod-validation-error: 3.4.1(zod@3.25.61) knuth-shuffle-seeded@1.0.6: dependencies: @@ -17960,20 +17923,21 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libsql@0.5.12: + libsql@0.5.13: dependencies: '@neon-rs/load': 0.0.4 detect-libc: 2.0.2 optionalDependencies: - '@libsql/darwin-arm64': 0.5.12 - '@libsql/darwin-x64': 0.5.12 - '@libsql/linux-arm-gnueabihf': 0.5.12 - '@libsql/linux-arm-musleabihf': 0.5.12 - '@libsql/linux-arm64-gnu': 0.5.12 - '@libsql/linux-arm64-musl': 0.5.12 - '@libsql/linux-x64-gnu': 0.5.12 - '@libsql/linux-x64-musl': 0.5.12 - '@libsql/win32-x64-msvc': 0.5.12 + '@libsql/darwin-arm64': 0.5.13 + '@libsql/darwin-x64': 0.5.13 + '@libsql/linux-arm-gnueabihf': 0.5.13 + '@libsql/linux-arm-musleabihf': 0.5.13 + '@libsql/linux-arm64-gnu': 0.5.13 + '@libsql/linux-arm64-musl': 0.5.13 + '@libsql/linux-x64-gnu': 0.5.13 + '@libsql/linux-x64-musl': 0.5.13 + '@libsql/win32-x64-msvc': 0.5.13 + optional: true lie@3.3.0: dependencies: @@ -18695,7 +18659,8 @@ snapshots: mimic-function@5.0.1: {} - mimic-response@3.1.0: {} + mimic-response@3.1.0: + optional: true min-indent@1.0.1: {} @@ -18725,7 +18690,8 @@ snapshots: mitt@3.0.1: {} - mkdirp-classic@0.5.3: {} + mkdirp-classic@0.5.3: + optional: true mkdirp@1.0.4: {} @@ -18802,7 +18768,8 @@ snapshots: nanoid@3.3.11: {} - napi-build-utils@2.0.0: {} + napi-build-utils@2.0.0: + optional: true natural-compare@1.4.0: {} @@ -18849,6 +18816,7 @@ snapshots: node-abi@3.75.0: dependencies: semver: 7.7.2 + optional: true node-addon-api@4.3.0: optional: true @@ -18870,6 +18838,7 @@ snapshots: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + optional: true node-int64@0.4.0: {} @@ -19004,7 +18973,7 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 - openai@4.103.0(ws@8.18.2)(zod@3.24.4): + openai@4.103.0(ws@8.18.2)(zod@3.25.61): dependencies: '@types/node': 18.19.100 '@types/node-fetch': 2.6.12 @@ -19015,7 +18984,7 @@ snapshots: node-fetch: 2.7.0 optionalDependencies: ws: 8.18.2 - zod: 3.24.4 + zod: 3.25.61 transitivePeerDependencies: - encoding @@ -19402,6 +19371,7 @@ snapshots: simple-get: 4.0.1 tar-fs: 2.1.2 tunnel-agent: 0.6.0 + optional: true prelude-ls@1.2.1: {} @@ -19431,7 +19401,8 @@ snapshots: progress@2.0.3: {} - promise-limit@2.7.0: {} + promise-limit@2.7.0: + optional: true prompts@2.4.2: dependencies: @@ -19546,6 +19517,7 @@ snapshots: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + optional: true react-dom@18.3.1(react@18.3.1): dependencies: @@ -19735,6 +19707,7 @@ snapshots: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + optional: true readdirp@3.6.0: dependencies: @@ -20167,13 +20140,15 @@ snapshots: signal-exit@4.1.0: {} - simple-concat@1.0.1: {} + simple-concat@1.0.1: + optional: true simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 + optional: true simple-git@3.27.0: dependencies: @@ -20391,6 +20366,7 @@ snapshots: string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 + optional: true stringify-entities@4.0.4: dependencies: @@ -20421,7 +20397,8 @@ snapshots: dependencies: min-indent: 1.0.1 - strip-json-comments@2.0.1: {} + strip-json-comments@2.0.1: + optional: true strip-json-comments@3.1.1: {} @@ -20551,6 +20528,7 @@ snapshots: mkdirp-classic: 0.5.3 pump: 3.0.2 tar-stream: 2.2.0 + optional: true tar-fs@3.0.9: dependencies: @@ -20569,6 +20547,7 @@ snapshots: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 + optional: true tar-stream@3.1.7: dependencies: @@ -20722,12 +20701,12 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.27.1) esbuild: 0.25.4 - ts-jest@29.3.3(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.5)(jest@29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0))(typescript@5.8.3): + ts-jest@29.3.3(@babel/core@7.27.1)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.1))(esbuild@0.25.5)(jest@29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.100)(babel-plugin-macros@3.1.0) + jest: 29.7.0(@types/node@20.17.57)(babel-plugin-macros@3.1.0) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -20787,6 +20766,7 @@ snapshots: tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 + optional: true tunnel@0.0.6: {} @@ -21156,13 +21136,13 @@ snapshots: - tsx - yaml - vite-node@3.1.3(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.1.3(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -21177,13 +21157,13 @@ snapshots: - tsx - yaml - vite-node@3.2.0(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.0(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1(supports-color@8.1.1) es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -21219,22 +21199,6 @@ snapshots: - tsx - yaml - vite@6.3.5(@types/node@18.19.100)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): - dependencies: - esbuild: 0.25.5 - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - postcss: 8.5.4 - rollup: 4.40.2 - tinyglobby: 0.2.13 - optionalDependencies: - '@types/node': 18.19.100 - fsevents: 2.3.3 - jiti: 2.4.2 - lightningcss: 1.30.1 - tsx: 4.19.4 - yaml: 2.8.0 - vite@6.3.5(@types/node@20.17.50)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 @@ -21251,7 +21215,7 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) @@ -21260,7 +21224,7 @@ snapshots: rollup: 4.40.2 tinyglobby: 0.2.13 optionalDependencies: - '@types/node': 22.15.20 + '@types/node': 20.17.57 fsevents: 2.3.3 jiti: 2.4.2 lightningcss: 1.30.1 @@ -21324,10 +21288,10 @@ snapshots: - tsx - yaml - vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.1.3(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@vitest/expect': 3.1.3 - '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.1.3 '@vitest/runner': 3.1.3 '@vitest/snapshot': 3.1.3 @@ -21344,12 +21308,12 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.1.3(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.1.3(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.20 + '@types/node': 20.17.57 jsdom: 20.0.3 transitivePeerDependencies: - jiti @@ -21365,11 +21329,11 @@ snapshots: - tsx - yaml - vitest@3.2.0(@types/debug@4.1.12)(@types/node@22.15.20)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.0(@types/debug@4.1.12)(@types/node@20.17.57)(jiti@2.4.2)(jsdom@20.0.3)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.0 - '@vitest/mocker': 3.2.0(vite@6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.0(vite@6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.0 '@vitest/runner': 3.2.0 '@vitest/snapshot': 3.2.0 @@ -21387,12 +21351,12 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 6.3.5(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.0(@types/node@22.15.20)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.0(@types/node@20.17.57)(jiti@2.4.2)(lightningcss@1.30.1)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 22.15.20 + '@types/node': 20.17.57 jsdom: 20.0.3 transitivePeerDependencies: - jiti @@ -21489,7 +21453,8 @@ snapshots: web-namespaces@1.1.4: {} - web-streams-polyfill@3.3.3: {} + web-streams-polyfill@3.3.3: + optional: true web-streams-polyfill@4.0.0-beta.3: {} @@ -21712,35 +21677,21 @@ snapshots: yoctocolors@2.1.1: {} - zod-to-json-schema@3.24.5(zod@3.24.4): - dependencies: - zod: 3.24.4 - - zod-to-json-schema@3.24.5(zod@3.25.49): + zod-to-json-schema@3.24.5(zod@3.25.61): dependencies: - zod: 3.25.49 + zod: 3.25.61 - zod-to-json-schema@3.24.5(zod@3.25.51): - dependencies: - zod: 3.25.51 - - zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.24.4): + zod-to-ts@1.2.0(typescript@5.8.3)(zod@3.25.61): dependencies: typescript: 5.8.3 - zod: 3.24.4 + zod: 3.25.61 - zod-validation-error@3.4.1(zod@3.25.57): + zod-validation-error@3.4.1(zod@3.25.61): dependencies: - zod: 3.25.57 + zod: 3.25.61 zod@3.23.8: {} - zod@3.24.4: {} - - zod@3.25.49: {} - - zod@3.25.51: {} - - zod@3.25.57: {} + zod@3.25.61: {} zwitch@2.0.4: {} diff --git a/src/package.json b/src/package.json index b1f83c5bb3..7658d59f2e 100644 --- a/src/package.json +++ b/src/package.json @@ -419,7 +419,7 @@ "web-tree-sitter": "^0.22.6", "workerpool": "^9.2.0", "yaml": "^2.8.0", - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@jest/globals": "^29.7.0", diff --git a/webview-ui/package.json b/webview-ui/package.json index 58d1f24e5b..50af196ed3 100644 --- a/webview-ui/package.json +++ b/webview-ui/package.json @@ -72,7 +72,7 @@ "use-sound": "^5.0.0", "vscode-material-icons": "^0.1.1", "vscrui": "^0.2.2", - "zod": "^3.24.2" + "zod": "^3.25.61" }, "devDependencies": { "@jest/globals": "^29.7.0", @@ -82,7 +82,7 @@ "@testing-library/react": "^16.2.0", "@testing-library/user-event": "^14.6.1", "@types/jest": "^29.0.0", - "@types/node": "^18.0.0", + "@types/node": "20.x", "@types/react": "^18.3.23", "@types/react-dom": "^18.3.5", "@types/shell-quote": "^1.7.5",