From 198779dfc78f8cbb02c20b2f09b345f7eb69fad9 Mon Sep 17 00:00:00 2001 From: "S.Krishnan" Date: Sat, 29 Aug 2026 23:25:28 +0530 Subject: [PATCH] chore: remove dead UI, unused deps, and duplicate code Over-engineering cleanup pass (ponytail audit): - delete 23 unused React components (previous session UI replaced by Timeline/ActivityTab) and 6 unused shadcn primitives - delete 1.6MB prototype Codevil (standalone).html - strip ~1011 lines of dead CSS for the deleted components - drop unused deps: shiki, react-resizable-panels, lucide-react (dialog close X inlined as SVG), @tanstack/react-router-devtools - port the 16 unique event-mapper tests into shared projections.test.mjs and delete the duplicated web-side test file - drop unused ConfigSchema/ConfigDefaultsSchema (CLI hand-validates) and the runtime-unused DEFERRED_PROVIDER_IDS export (behavior stays tested) - consolidate ws-token onto capability-token (removes a hand-rolled HMAC/base64url implementation) pnpm verify: 903 tests, 0 failures. No behavior change intended. --- Codevil (standalone).html | 182 -- packages/shared/src/config.ts | 18 - packages/shared/src/index.ts | 15 +- packages/shared/src/providers.ts | 16 +- packages/shared/test/config.test.mjs | 27 - packages/shared/test/projections.test.mjs | 279 +++ packages/shared/test/providers.test.mjs | 21 +- packages/web/package.json | 4 - .../src/components/activity/activity-feed.tsx | 111 - .../src/components/activity/phase-divider.tsx | 18 - .../components/activity/thinking-block.tsx | 39 - .../web/src/components/activity/tool-card.tsx | 47 - .../web/src/components/chat/plan-message.tsx | 85 - .../web/src/components/layout/split-pane.tsx | 21 - .../src/components/session/StatusStrip.tsx | 138 -- .../src/components/session/changes-tab.tsx | 48 - .../components/session/conversation-panel.tsx | 76 - .../components/session/current-agent-card.tsx | 35 - .../src/components/session/detail-panel.tsx | 190 -- .../components/session/inspector-header.tsx | 30 - .../src/components/session/inspector-pane.tsx | 136 -- .../src/components/session/phase-tracker.tsx | 65 - .../src/components/session/task-header.tsx | 18 - .../web/src/components/session/task-meta.tsx | 25 - .../web/src/components/session/turns-list.tsx | 94 - packages/web/src/components/ui/badge.tsx | 48 - .../web/src/components/ui/collapsible.tsx | 31 - packages/web/src/components/ui/dialog.tsx | 10 +- .../web/src/components/ui/dropdown-menu.tsx | 257 --- packages/web/src/components/ui/resizable.tsx | 51 - .../web/src/components/ui/scroll-area.tsx | 58 - packages/web/src/components/ui/separator.tsx | 26 - .../src/lib/__tests__/event-mapper.test.ts | 529 ----- packages/web/src/session-components.css | 1051 +--------- packages/worker/src/ws-token.ts | 115 +- .../worker/test/ws-authorization.test.mjs | 4 +- pnpm-lock.yaml | 1798 +---------------- 37 files changed, 430 insertions(+), 5286 deletions(-) delete mode 100644 Codevil (standalone).html delete mode 100644 packages/shared/test/config.test.mjs delete mode 100644 packages/web/src/components/activity/activity-feed.tsx delete mode 100644 packages/web/src/components/activity/phase-divider.tsx delete mode 100644 packages/web/src/components/activity/thinking-block.tsx delete mode 100644 packages/web/src/components/activity/tool-card.tsx delete mode 100644 packages/web/src/components/chat/plan-message.tsx delete mode 100644 packages/web/src/components/layout/split-pane.tsx delete mode 100644 packages/web/src/components/session/StatusStrip.tsx delete mode 100644 packages/web/src/components/session/changes-tab.tsx delete mode 100644 packages/web/src/components/session/conversation-panel.tsx delete mode 100644 packages/web/src/components/session/current-agent-card.tsx delete mode 100644 packages/web/src/components/session/detail-panel.tsx delete mode 100644 packages/web/src/components/session/inspector-header.tsx delete mode 100644 packages/web/src/components/session/inspector-pane.tsx delete mode 100644 packages/web/src/components/session/phase-tracker.tsx delete mode 100644 packages/web/src/components/session/task-header.tsx delete mode 100644 packages/web/src/components/session/task-meta.tsx delete mode 100644 packages/web/src/components/session/turns-list.tsx delete mode 100644 packages/web/src/components/ui/badge.tsx delete mode 100644 packages/web/src/components/ui/collapsible.tsx delete mode 100644 packages/web/src/components/ui/dropdown-menu.tsx delete mode 100644 packages/web/src/components/ui/resizable.tsx delete mode 100644 packages/web/src/components/ui/scroll-area.tsx delete mode 100644 packages/web/src/components/ui/separator.tsx delete mode 100644 packages/web/src/lib/__tests__/event-mapper.test.ts diff --git a/Codevil (standalone).html b/Codevil (standalone).html deleted file mode 100644 index eeb4f99..0000000 --- a/Codevil (standalone).html +++ /dev/null @@ -1,182 +0,0 @@ - - - - - Codevil - - - - -
- - - - - - - -
-
Unpacking...
- - - - - - - - - - \ No newline at end of file diff --git a/packages/shared/src/config.ts b/packages/shared/src/config.ts index 8e9f351..76a4c31 100644 --- a/packages/shared/src/config.ts +++ b/packages/shared/src/config.ts @@ -1,5 +1,3 @@ -import { z } from "zod"; - export interface Config { endpoint: string; api_key: string; @@ -13,22 +11,6 @@ export interface ConfigDefaults { max_time: string; } -export const ConfigDefaultsSchema = z.object({ - plan_model: z.string().trim().min(1), - exec_model: z.string().trim().min(1), - provider: z.string().trim().min(1), - max_time: z.string().trim().min(1), -}); - -export const ConfigSchema = z.object({ - endpoint: z.string().url(), - api_key: z.string().trim().min(1), - defaults: ConfigDefaultsSchema, -}); - -export type ConfigDefaultsParsed = z.infer; -export type ConfigParsed = z.infer; - export const DEFAULT_CONFIG: ConfigDefaults = { plan_model: "deepseek-v4-flash", exec_model: "deepseek-v4-flash", diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index fcac05a..6a5b43d 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -48,7 +48,6 @@ export { export type { LLMProviderId, - DeferredProviderId, LLMProviderCapability, LLMProviderDefinition, ProviderApi, @@ -59,7 +58,6 @@ export type { } from "./providers.js"; export { - DEFERRED_PROVIDER_IDS, LLM_PROVIDER_CAPABILITIES, LLM_PROVIDERS, LLM_PROVIDER_IDS, @@ -316,17 +314,8 @@ export { can, } from "./auth.js"; -export type { - Config, - ConfigDefaults, - ConfigParsed, - ConfigDefaultsParsed, -} from "./config.js"; -export { - DEFAULT_CONFIG, - ConfigSchema, - ConfigDefaultsSchema, -} from "./config.js"; +export type { Config, ConfigDefaults } from "./config.js"; +export { DEFAULT_CONFIG } from "./config.js"; export type { RoomState, diff --git a/packages/shared/src/providers.ts b/packages/shared/src/providers.ts index d2a5215..098b44b 100644 --- a/packages/shared/src/providers.ts +++ b/packages/shared/src/providers.ts @@ -56,18 +56,10 @@ export type ProviderPublicConfigKey = "CLOUDFLARE_ACCOUNT_ID" | "CLOUDFLARE_GATE */ export type ProviderPublicConfig = Partial>; -/** Pi providers deliberately deferred until their non-API-key credential flow is implemented. */ -export const DEFERRED_PROVIDER_IDS = [ - "azure-openai-responses", - "google-vertex", - "amazon-bedrock", - "openai-codex", - "github-copilot", - "anthropic-oauth", - "custom", -] as const; - -export type DeferredProviderId = (typeof DEFERRED_PROVIDER_IDS)[number]; +// Pi providers deliberately deferred until their non-API-key credential flow is +// implemented (asserted against KnownProviderSchema in providers.test.mjs): +// azure-openai-responses, google-vertex, amazon-bedrock, openai-codex, +// github-copilot, anthropic-oauth, custom. type ProviderCapabilityShape = { readonly id: string; diff --git a/packages/shared/test/config.test.mjs b/packages/shared/test/config.test.mjs deleted file mode 100644 index ce43542..0000000 --- a/packages/shared/test/config.test.mjs +++ /dev/null @@ -1,27 +0,0 @@ -import assert from "node:assert/strict"; -import test from "node:test"; - -import { - ConfigSchema, - DEFAULT_CONFIG, -} from "../dist/config.js"; - -test("ConfigSchema validates a complete config file shape", () => { - const parsed = ConfigSchema.parse({ - endpoint: "https://worker.example.com", - api_key: "cv_test_key", - defaults: DEFAULT_CONFIG, - }); - assert.equal(parsed.defaults.provider, "opencode-go"); - assert.equal(parsed.defaults.plan_model, "deepseek-v4-flash"); - assert.equal(parsed.defaults.exec_model, "deepseek-v4-flash"); -}); - -test("ConfigSchema rejects invalid endpoints", () => { - const result = ConfigSchema.safeParse({ - endpoint: "not-a-url", - api_key: "cv_test_key", - defaults: DEFAULT_CONFIG, - }); - assert.equal(result.success, false); -}); diff --git a/packages/shared/test/projections.test.mjs b/packages/shared/test/projections.test.mjs index 40761b8..6af14be 100644 --- a/packages/shared/test/projections.test.mjs +++ b/packages/shared/test/projections.test.mjs @@ -185,6 +185,88 @@ test("mapEventToChat: maps verification_failed to a verification_failed message" assert.equal(messages[0].meta?.last_error, "test failed"); }); +test("mapEventToChat: maps agent request queue events to room status messages", () => { + const ctx = makeCtx(); + const requested = mapEventToChat({ + type: "agent_request", + run_id: "run_123", + actor: { id: "usr_123", name: "Alice" }, + text: "fix the bug", + created_at: "2026-06-03T00:00:00.000Z", + }, ctx); + const queued = mapEventToChat({ + type: "agent_request_queued", + run_id: "run_124", + position: 2, + }, ctx); + const started = mapEventToChat({ + type: "agent_run_started", + run_id: "run_123", + actor: { id: "usr_123", name: "Alice" }, + text: "fix the bug", + }, ctx); + + assert.equal(requested[0].role, "user"); + assert.equal(requested[0].actor, "Alice"); + assert.equal(requested[0].meta?.actor_id, "usr_123"); + assert.equal(requested[0].content, "@codevil fix the bug"); + assert.equal(queued[0].content, "Queued agent request #2."); + assert.deepEqual(started, []); +}); + +test("mapEventToChat: keeps run completion out of chat and maps failures", () => { + const ctx = makeCtx(); + const completed = mapEventToChat({ + type: "agent_run_completed", + run_id: "run_123", + pr_url: "https://github.com/user/repo/pull/1", + }, ctx); + const failed = mapEventToChat({ + type: "agent_run_failed", + run_id: "run_123", + message: "tests failed", + }, ctx); + + assert.deepEqual(completed, []); + assert.equal(failed[0].variant, "error"); + assert.equal(failed[0].content, "tests failed"); +}); + +test("mapEventToChat: maps the final agent response to one assistant message", () => { + const messages = mapEventToChat({ + type: "agent_response", + run_id: "run_123", + text: "Rate limits are configured in src/rate-limit.ts.", + }, makeCtx()); + + assert.equal(messages.length, 1); + assert.equal(messages[0].role, "assistant"); + assert.equal(messages[0].variant, "text"); + assert.equal(messages[0].content, "Rate limits are configured in src/rate-limit.ts."); + assert.equal(messages[0].meta?.run_id, "run_123"); +}); + +test("mapEventToChat: does not put low-signal read-only tools in the durable timeline", () => { + const event = { + type: "agent_event", + event: { type: "tool_execution_end", toolName: "find", args: { path: ".", pattern: "README.md" }, isError: false }, + }; + assert.equal(mapEventToChat(event, makeCtx()).length, 0); +}); + +test("mapEventToChat: keeps agent message_update events out of the durable timeline", () => { + const event = { + type: "agent_event", + event: { type: "message_update", content: "Let me look at" }, + }; + assert.equal(mapEventToChat(event, makeCtx()).length, 0); +}); + +test("mapEventToChat: keeps clone_progress line noise out of the durable timeline", () => { + const event = { type: "clone_progress", line: "Receiving objects: 50%" }; + assert.equal(mapEventToChat(event, makeCtx()).length, 0); +}); + // --------------------------------------------------------------------------- // applyToChatActivity // --------------------------------------------------------------------------- @@ -207,6 +289,152 @@ test("applyToChatActivity: coalesces streamed message updates into one thinking assert.equal(second.activityLog[0].thinking?.text, "Analyzing the repo."); }); +test("applyToChatActivity: coalesces Pi assistant text deltas into one thinking entry", () => { + const ctx = makeCtx(); + const first = applyToChatActivity( + { messages: [], activityLog: [] }, + { + type: "agent_event", + event: { + type: "message_update", + assistantMessageEvent: { type: "text_delta", delta: "Reading " }, + }, + }, + ctx, + ); + const second = applyToChatActivity( + first, + { + type: "agent_event", + event: { + type: "message_update", + assistantMessageEvent: { type: "text_delta", delta: "files." }, + }, + }, + ctx, + ); + + assert.equal(second.activityLog.length, 1); + assert.equal(second.activityLog[0].thinking?.text, "Reading files."); +}); + +test("applyToChatActivity: keeps markdown heading deltas out of durable conversation messages", () => { + const projected = applyToChatActivity( + { messages: [], activityLog: [] }, + { + type: "agent_event", + event: { + type: "message_update", + assistantMessageEvent: { + type: "text_delta", + delta: "**Inspecting package.json**\n\nI need to check the scripts.", + }, + }, + }, + makeCtx(), + ); + + assert.equal(projected.messages.length, 0); + assert.equal(projected.activityLog.length, 1); + assert.equal(projected.activityLog[0].kind, "thinking"); +}); + +test("applyToChatActivity: keeps agent_end final assistant text in activity only", () => { + const projected = applyToChatActivity( + { messages: [], activityLog: [] }, + { + type: "agent_event", + event: { + type: "agent_end", + messages: [ + { role: "assistant", content: "I updated the checkout page and verified the tests." }, + ], + }, + }, + makeCtx(), + ); + + assert.equal(projected.messages.length, 0); + assert.equal(projected.activityLog.at(-1)?.event?.label, "Agent finished"); +}); + +test("applyToChatActivity: does not promote agent_end text when a plan message exists", () => { + const projected = applyToChatActivity( + { + messages: [ + { + id: "plan_1", + role: "assistant", + variant: "plan", + content: "## Plan\n\n1. Update checkout.", + timestamp: 1, + }, + ], + activityLog: [], + }, + { + type: "agent_event", + event: { + type: "agent_end", + messages: [ + { role: "assistant", content: "## Plan\n\n1. Update checkout." }, + ], + }, + }, + makeCtx(), + ); + + assert.equal(projected.messages.length, 1); +}); + +test("applyToChatActivity: updates Pi tool events using toolCallId", () => { + const ctx = makeCtx(); + const started = applyToChatActivity( + { messages: [], activityLog: [] }, + { + type: "agent_event", + event: { + type: "tool_execution_start", + toolCallId: "call_1", + toolName: "read", + args: { path: "src/index.ts" }, + }, + }, + ctx, + ); + const ended = applyToChatActivity( + started, + { + type: "agent_event", + event: { + type: "tool_execution_end", + toolCallId: "call_1", + toolName: "read", + result: "file contents", + isError: false, + }, + }, + ctx, + ); + + assert.equal(ended.activityLog.length, 1); + assert.equal(ended.activityLog[0].status, "success"); + assert.equal(ended.activityLog[0].tool?.name, "read"); + assert.equal(ended.activityLog[0].tool?.result, "file contents"); +}); + +test("applyToChatActivity: renders generic Pi lifecycle events in the activity pane", () => { + const projected = applyToChatActivity( + { messages: [], activityLog: [] }, + { type: "agent_event", event: { type: "agent_start" } }, + makeCtx(), + ); + + assert.equal(projected.activityLog.length, 1); + assert.equal(projected.activityLog[0].kind, "event"); + assert.equal(projected.activityLog[0].event?.label, "Agent started"); +}); + test("applyToChatActivity: updates a running tool entry when the matching tool ends", () => { const ctx = makeCtx(); const started = applyToChatActivity( @@ -262,6 +490,57 @@ test("mapEventToActivity: maps phase event to a phase_divider entry", () => { assert.ok(entries[0].phase?.label.includes("Agent turn")); }); +test("mapEventToActivity: maps agent_event message_update to a thinking entry", () => { + const event = { + type: "agent_event", + event: { type: "message_update", content: "Analyzing the code..." }, + }; + const entries = mapEventToActivity(event, makeCtx()); + assert.equal(entries.length, 1); + assert.equal(entries[0].kind, "thinking"); + assert.equal(entries[0].thinking?.text, "Analyzing the code..."); +}); + +test("mapEventToActivity: maps agent run start to activity instead of conversation", () => { + const event = { + type: "agent_run_started", + run_id: "run_123", + actor: { id: "usr_123", name: "Alice" }, + text: "fix the test", + }; + + assert.deepEqual(mapEventToChat(event, makeCtx()), []); + assert.equal(mapEventToActivity(event, makeCtx())[0].event?.label, "Agent run started"); + assert.equal(mapEventToActivity(event, makeCtx())[0].event?.detail, "fix the test"); +}); + +test("mapEventToActivity: maps room lifecycle events to activity entries for the right pane", () => { + const events = [ + { type: "session_created", session_id: "ses_abc" }, + { type: "status", message: "Provisioning sandbox..." }, + { type: "room_ready", repo: "github.com/acme/app" }, + ]; + + const labels = events.flatMap((event) => + mapEventToActivity(event, makeCtx()).map((entry) => entry.event?.label), + ); + + assert.deepEqual(labels, [ + "Session created", + "Provisioning sandbox", + "Session ready", + ]); +}); + +test("mapEventToActivity: keeps clone progress line noise out of activity", () => { + const entries = mapEventToActivity({ + type: "clone_progress", + line: "Receiving objects: 50%", + }, makeCtx()); + + assert.deepEqual(entries, []); +}); + // --------------------------------------------------------------------------- // inferPhase // --------------------------------------------------------------------------- diff --git a/packages/shared/test/providers.test.mjs b/packages/shared/test/providers.test.mjs index a893d7b..c77cfbc 100644 --- a/packages/shared/test/providers.test.mjs +++ b/packages/shared/test/providers.test.mjs @@ -37,29 +37,26 @@ const INCLUDED_PROVIDER_IDS = [ "cloudflare-ai-gateway", ]; -const DEFERRED_PROVIDER_IDS = [ - "azure-openai-responses", - "google-vertex", - "amazon-bedrock", - "openai-codex", - "github-copilot", - "anthropic-oauth", - "custom", -]; - test("capability registry contains exactly the supported API-key Pi providers", () => { assert.deepEqual( shared.LLM_PROVIDER_CAPABILITIES.map((provider) => provider.id), INCLUDED_PROVIDER_IDS, ); - assert.deepEqual(shared.DEFERRED_PROVIDER_IDS, DEFERRED_PROVIDER_IDS); }); test("KnownProviderSchema accepts included providers but rejects deferred provider ids", () => { assert.equal(shared.KnownProviderSchema.parse("opencode"), "opencode"); assert.equal(shared.KnownProviderSchema.parse("opencode-go"), "opencode-go"); - for (const providerId of DEFERRED_PROVIDER_IDS) { + for (const providerId of [ + "azure-openai-responses", + "google-vertex", + "amazon-bedrock", + "openai-codex", + "github-copilot", + "anthropic-oauth", + "custom", + ]) { assert.equal(shared.KnownProviderSchema.safeParse(providerId).success, false, providerId); } }); diff --git a/packages/web/package.json b/packages/web/package.json index c4e480f..6d5e1f6 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -17,21 +17,17 @@ "@tanstack/react-router": "^1", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "lucide-react": "^1.11.0", "radix-ui": "^1.4.3", "react": "^19", "react-dom": "^19", "react-markdown": "^10", - "react-resizable-panels": "^4.10.0", "remark-gfm": "^4", - "shiki": "^3", "tailwind-merge": "^3.5.0", "zustand": "^5" }, "devDependencies": { "@tailwindcss/typography": "^0.5", "@tailwindcss/vite": "^4", - "@tanstack/react-router-devtools": "^1", "@tanstack/router-plugin": "^1", "@types/react": "^19", "@types/react-dom": "^19", diff --git a/packages/web/src/components/activity/activity-feed.tsx b/packages/web/src/components/activity/activity-feed.tsx deleted file mode 100644 index e7898db..0000000 --- a/packages/web/src/components/activity/activity-feed.tsx +++ /dev/null @@ -1,111 +0,0 @@ -import { useRef, useEffect, useState, useCallback } from "react"; -import { Button } from "@/components/ui/button"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import { ToolCard } from "./tool-card"; -import { ThinkingBlock } from "./thinking-block"; -import { PhaseDivider } from "./phase-divider"; -import type { ActivityEntry } from "@/types"; -import { ChevronRight } from "lucide-react"; - -interface ActivityFeedProps { - entries: ActivityEntry[]; -} - -export function ActivityFeed({ entries }: ActivityFeedProps) { - const bottomRef = useRef(null); - const containerRef = useRef(null); - const [autoScroll, setAutoScroll] = useState(true); - - const scrollToBottom = useCallback(() => { - bottomRef.current?.scrollIntoView({ behavior: "smooth" }); - }, []); - - useEffect(() => { - if (autoScroll) scrollToBottom(); - }, [entries, autoScroll, scrollToBottom]); - - function handleScroll(e: React.UIEvent) { - const el = e.currentTarget; - const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 80; - setAutoScroll(atBottom); - } - - if (entries.length === 0) { - return ( -
-
-
-
Inspector
-

Agent details

-
-
-
- Waiting for agent events. -
-
- ); - } - - return ( -
-
-
-
Inspector
-

Agent details

-
- {entries.length} -
-
- {entries.map((entry) => { - switch (entry.kind) { - case "tool_call": - return ; - case "thinking": - return ; - case "phase_divider": - return ; - case "event": - return ; - } - })} -
-
- - {!autoScroll && ( -
- -
- )} -
- ); -} - -function EventRow({ entry }: { entry: ActivityEntry }) { - const [open, setOpen] = useState(false); - if (!entry.event) return null; - - return ( - - - - -
- {entry.event.detail ? ( -
{entry.event.detail}
- ) : ( -
{new Date(entry.timestamp).toLocaleTimeString()}
- )} -
-
-
- ); -} diff --git a/packages/web/src/components/activity/phase-divider.tsx b/packages/web/src/components/activity/phase-divider.tsx deleted file mode 100644 index c00824b..0000000 --- a/packages/web/src/components/activity/phase-divider.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { Separator } from "@/components/ui/separator"; -import type { ActivityEntry } from "@/types"; - -interface PhaseDividerProps { - entry: ActivityEntry; -} - -export function PhaseDivider({ entry }: PhaseDividerProps) { - if (!entry.phase) return null; - - return ( -
- - {entry.phase.label} - -
- ); -} diff --git a/packages/web/src/components/activity/thinking-block.tsx b/packages/web/src/components/activity/thinking-block.tsx deleted file mode 100644 index 5d8fee3..0000000 --- a/packages/web/src/components/activity/thinking-block.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import { useState } from "react"; -import type { ActivityEntry } from "@/types"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import Markdown from "react-markdown"; -import remarkGfm from "remark-gfm"; - -interface ThinkingBlockProps { - entry: ActivityEntry; -} - -export function ThinkingBlock({ entry }: ThinkingBlockProps) { - const [open, setOpen] = useState(entry.status === "running"); - if (!entry.thinking) return null; - - return ( - - - - Agent turn - {entry.thinking.text.split("\n").find(Boolean) ?? "Assistant output"} - - -
- {entry.thinking.text} -
-
-
- ); -} - -function StatusDot({ status }: { status: string }) { - if (status === "running") { - return ; - } - if (status === "success") { - return ; - } - return ; -} diff --git a/packages/web/src/components/activity/tool-card.tsx b/packages/web/src/components/activity/tool-card.tsx deleted file mode 100644 index 0e115eb..0000000 --- a/packages/web/src/components/activity/tool-card.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { useState } from "react"; -import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"; -import type { ActivityEntry } from "@/types"; -import { ChevronRight } from "lucide-react"; - -interface ToolCardProps { - entry: ActivityEntry; -} - -export function ToolCard({ entry }: ToolCardProps) { - const [open, setOpen] = useState(entry.status === "running"); - if (!entry.tool) return null; - - return ( - - - - -
- {entry.tool.args && ( -
{entry.tool.args}
- )} - {entry.tool.result && ( -
{entry.tool.result}
- )} - {entry.tool.error && ( -
{entry.tool.error}
- )} -
-
-
- ); -} - -function StatusDot({ status }: { status: string }) { - if (status === "running") { - return ; - } - if (status === "success") { - return ; - } - return ; -} diff --git a/packages/web/src/components/chat/plan-message.tsx b/packages/web/src/components/chat/plan-message.tsx deleted file mode 100644 index f73cb85..0000000 --- a/packages/web/src/components/chat/plan-message.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import { useState } from "react"; -import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; -import { Badge } from "@/components/ui/badge"; -import type { ChatMessage } from "@/types"; -import { normalizePlanMarkdown } from "@/lib/plan-markdown"; -import Markdown from "react-markdown"; -import remarkGfm from "remark-gfm"; - -interface PlanMessageProps { - message: ChatMessage; - approved: boolean; - onApprove: () => void; - onAbort: () => void; - onRefine: (feedback: string) => void; -} - -export function PlanMessage({ message, approved, onApprove, onAbort, onRefine }: PlanMessageProps) { - const [feedback, setFeedback] = useState(""); - const hasPlan = message.content.trim().length > 0; - const markdown = normalizePlanMarkdown(message.content); - - function handleRefine(e: React.FormEvent) { - e.preventDefault(); - if (feedback.trim()) { - onRefine(feedback.trim()); - setFeedback(""); - } - } - - return ( -
-
-
-
Plan ready
-

Review before execution

-
- {approved && Approved} -
- - {message.meta?.cost && ( -

- Cost: ${message.meta.cost.total_cost_usd.toFixed(2)} ({message.meta.cost.input_tokens} in / {message.meta.cost.output_tokens} out) - {message.meta.refinement_round ? ` | Round ${message.meta.refinement_round}` : ""} -

- )} - -
- {hasPlan ? ( -
- {markdown} -
- ) : ( -
- Plan content was empty. The session returned an approval checkpoint without a readable plan. -
- )} -
- - {approved ? ( -
- Execution has started from this approved plan. -
- ) : ( -
-
- - -
-
- setFeedback(e.target.value)} - className="flex-1" - /> - -
-
- )} -
- ); -} diff --git a/packages/web/src/components/layout/split-pane.tsx b/packages/web/src/components/layout/split-pane.tsx deleted file mode 100644 index d317e40..0000000 --- a/packages/web/src/components/layout/split-pane.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ResizableHandle, ResizablePanel, ResizablePanelGroup } from "@/components/ui/resizable"; -import type { ReactNode } from "react"; - -interface SplitPaneProps { - left: ReactNode; - right: ReactNode; -} - -export function SplitPane({ left, right }: SplitPaneProps) { - return ( - - - {left} - - - - {right} - - - ); -} diff --git a/packages/web/src/components/session/StatusStrip.tsx b/packages/web/src/components/session/StatusStrip.tsx deleted file mode 100644 index b663cac..0000000 --- a/packages/web/src/components/session/StatusStrip.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { useSessionStore } from "@/stores/session-store"; -import type { ActivityEntry } from "@/types"; - -const PHASES = [ - { id: "initializing", label: "Provision" }, - { id: "planning", label: "Plan" }, - { id: "awaiting_approval", label: "Review" }, - { id: "executing", label: "Execute" }, - { id: "completed", label: "Done" }, -]; - -function getPhaseIndex(phase: string | null): number { - switch (phase) { - case "initializing": return 0; - case "planning": return 1; - case "awaiting_approval": return 2; - case "executing": return 3; - case "completed": return 4; - case "failed": return 4; - default: return -1; - } -} - -function getToolBadgeClass(toolName: string): string { - const n = toolName.toLowerCase(); - if (n.includes("read") || n.includes("view_file") || n.includes("view")) return "read"; - if (n.includes("write") || n.includes("edit") || n.includes("replace")) return "write"; - if (n.includes("bash") || n.includes("command") || n.includes("run")) return "bash"; - if (n.includes("grep") || n.includes("search")) return "grep"; - if (n.includes("list") || n.includes("ls")) return "ls"; - return ""; -} - -function getToolLabel(toolName: string): string { - const n = toolName.toLowerCase(); - if (n.includes("read") || n.includes("view_file") || n.includes("view")) return "READ"; - if (n.includes("write") || n.includes("edit") || n.includes("replace")) return "WRITE"; - if (n.includes("bash") || n.includes("command") || n.includes("run")) return "BASH"; - if (n.includes("grep") || n.includes("search")) return "GREP"; - if (n.includes("list") || n.includes("ls")) return "LS"; - return toolName.slice(0, 6).toUpperCase(); -} - -function findCurrentEntry(activityLog: ActivityEntry[]): ActivityEntry | null { - // prefer running - const running = [...activityLog].reverse().find((e) => e.status === "running"); - if (running) return running; - // fallback: latest thinking or tool_call - return ( - [...activityLog] - .reverse() - .find((e) => e.kind === "thinking" || e.kind === "tool_call") ?? null - ); -} - -export function StatusStrip() { - const { activityLog, sessionPhase } = useSessionStore(); - - const current = findCurrentEntry(activityLog); - const dotClass = - sessionPhase === "planning" || sessionPhase === "executing" - ? "running" - : sessionPhase === "failed" - ? "error" - : sessionPhase === "completed" - ? "ok" - : ""; - - const reasoning = - current?.kind === "thinking" - ? current.thinking?.text?.trim() - : null; - - const hasTool = current?.kind === "tool_call" && current.tool; - - const currentPhaseIdx = getPhaseIndex(sessionPhase); - const toolCalls = activityLog.filter((e) => e.kind === "tool_call").length; - - return ( -
- {/* Reasoning row */} - {reasoning || hasTool ? ( -
-
- {reasoning ? ( -
{reasoning}
- ) : ( -
Agent is working…
- )} -
- ) : ( -
-
-
- {sessionPhase === "completed" - ? "Session complete" - : sessionPhase === "failed" - ? "Session failed" - : "Waiting for agent activity…"} -
-
- )} - - {/* Tool call row */} - {hasTool && current?.tool && ( -
- - {getToolLabel(current.tool.name)} - - - {current.tool.summary || current.tool.name} - -
- )} - - {/* Footer: phase progress */} -
- - {sessionPhase ?? "connecting"} - - -
- ); -} diff --git a/packages/web/src/components/session/changes-tab.tsx b/packages/web/src/components/session/changes-tab.tsx deleted file mode 100644 index 1b604f9..0000000 --- a/packages/web/src/components/session/changes-tab.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { useMemo, useState } from "react"; -import { useSessionStore } from "@/stores/session-store"; -import { collectFilesTouched } from "@/lib/session-files"; - -export function ChangesTab() { - const { activityLog } = useSessionStore(); - const files = useMemo(() => collectFilesTouched(activityLog), [activityLog]); - const [selectedPath, setSelectedPath] = useState(null); - const selected = files.find((file) => file.path === selectedPath) ?? files[0] ?? null; - - return ( -
-
- {files.length === 0 ? ( -
No files touched yet
- ) : ( - files.map((file) => ( - - )) - )} -
- -
- {selected ? ( -
-
No patch available yet
-
- Diff data is not emitted by this session yet. File touches are inferred from tool calls. -
-
- ) : ( -
-
No files touched yet
-
Files will appear here as the agent reads or writes them.
-
- )} -
-
- ); -} diff --git a/packages/web/src/components/session/conversation-panel.tsx b/packages/web/src/components/session/conversation-panel.tsx deleted file mode 100644 index acf711e..0000000 --- a/packages/web/src/components/session/conversation-panel.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { useSessionStore } from "@/stores/session-store"; -import { useState } from "react"; -import type { ChatMessage } from "@/types"; - -export function ConversationPanel() { - const { messages, sessionPhase, refine } = useSessionStore(); - const [input, setInput] = useState(""); - - const chatMessages = messages.filter((m) => m.variant !== "plan"); - - return ( -
-
- Conversation - {chatMessages.length} messages -
- -
- {chatMessages.map((msg) => ( -
-
- {messageSender(msg)} - · - {new Date(msg.timestamp).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })} -
-
- {messageContent(msg)} -
-
- ))} -
- -
- setInput(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter' && input.trim()) { - refine(input); - setInput(""); - } - }} - disabled={sessionPhase !== "awaiting_approval" && sessionPhase !== "planning"} - /> -
-
-
- ); -} - -function messageClass(message: ChatMessage): string { - if (message.role === "user") return "msg-you"; - if (message.variant === "error" || message.variant === "verification_failed") return "msg-error"; - if (message.variant === "complete") return "msg-complete"; - return "msg-agent"; -} - -function messageSender(message: ChatMessage): string { - if (message.role === "user") return "You"; - if (message.variant === "error") return "Error"; - if (message.variant === "verification_failed") return "Verification"; - if (message.variant === "complete") return "Session"; - return "Agent"; -} - -function messageContent(message: ChatMessage): string { - if (message.variant === "verification_failed" && message.meta?.last_error) { - return `${message.content}\n${message.meta.last_error}`; - } - if (message.variant === "complete" && message.meta?.pr_url) { - return `${message.content} ${message.meta.pr_url}`; - } - return message.content; -} diff --git a/packages/web/src/components/session/current-agent-card.tsx b/packages/web/src/components/session/current-agent-card.tsx deleted file mode 100644 index 5629cca..0000000 --- a/packages/web/src/components/session/current-agent-card.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { useSessionStore } from "@/stores/session-store"; -import { deriveCurrentAgent } from "@/lib/current-agent"; - -interface CurrentAgentCardProps { - onOpenActivity: (activityId: string) => void; -} - -export function CurrentAgentCard({ onOpenActivity }: CurrentAgentCardProps) { - const { messages, activityLog, sessionPhase, planApproved } = useSessionStore(); - const current = deriveCurrentAgent({ messages, activityLog, sessionPhase, planApproved }); - - return ( -
-
-
-
Current agent
-

{current.title}

-
- {current.badge && {current.badge}} -
- - {current.description && ( -
{current.description}
- )} - -
- {current.activityId && ( - - )} -
-
- ); -} diff --git a/packages/web/src/components/session/detail-panel.tsx b/packages/web/src/components/session/detail-panel.tsx deleted file mode 100644 index 7bb3b50..0000000 --- a/packages/web/src/components/session/detail-panel.tsx +++ /dev/null @@ -1,190 +0,0 @@ -import React from "react"; -import { useSessionStore } from "@/stores/session-store"; - -interface DetailPanelProps { - selectedCallId: string | null; -} - -export function DetailPanel({ selectedCallId }: DetailPanelProps) { - const { activityLog } = useSessionStore(); - - if (!selectedCallId) { - return ( -
-
-
-
Select activity to inspect
-
-
- ); - } - - const entry = activityLog.find(e => e.id === selectedCallId); - - if (!entry) return null; - - const getToolIcon = (name: string) => { - if (name.includes('read') || name.includes('view_file')) return { cls: 'read', char: 'R' }; - if (name.includes('write') || name.includes('replace')) return { cls: 'write', char: 'W' }; - if (name.includes('list') || name.includes('ls')) return { cls: 'ls', char: 'L' }; - if (name.includes('grep') || name.includes('search')) return { cls: 'grep', char: 'G' }; - if (name.includes('bash') || name.includes('command')) return { cls: 'bash', char: '$' }; - return { cls: 'agent', char: '✦' }; - }; - - if (entry.kind === "thinking") { - return ( -
-
-
-
activity › {entry.id.slice(-6)}
-
-
-
-

Agent Thinking

-
Internal reasoning
-
-
-
- -
-
- Reasoning - why this action -
-
- - {entry.thinking?.text || "..."} - {entry.status === "running" && } -
-
-
-
- ); - } - - if (entry.kind === "tool_call" && entry.tool) { - const icon = getToolIcon(entry.tool.name); - - // Parse arguments safely - let argsObj: any = {}; - try { - if (entry.tool.args) argsObj = JSON.parse(entry.tool.args); - } catch(e) {} - - const isRead = icon.cls === 'read'; - const output = entry.tool.error || entry.tool.result || "Waiting for output..."; - - return ( -
-
-
-
activity › {entry.id.slice(-6)}
-
-
{icon.char}
-
-

{entry.tool.summary || entry.tool.name}

-
{entry.tool.name} · {entry.status}
-
-
-
- - {entry.status} -
-
-
-
- -
-
- Input - arguments -
-
- {Object.entries(argsObj).map(([key, value]) => ( - -
{key}
-
{String(value)}
-
- ))} - {Object.keys(argsObj).length === 0 &&
No arguments provided
} -
-
- -
-
- Output - {entry.tool.result ? 'result' : entry.tool.error ? 'error' : 'running...'} -
-
- {isRead && entry.tool.result ? ( -
- {entry.tool.result.split("\n").map((line, index) => ( -
- {index + 1} - {line || " "} -
- ))} -
- ) : ( -
- {output} -
- )} -
-
- -
-
- ); - } - - if (entry.kind === "event" && entry.event) { - return ( -
-
-
-
activity › {entry.id.slice(-6)}
-
-
E
-
-

{entry.event.label}

-
event · {entry.status}
-
-
-
- {entry.event.detail && ( -
-
- Detail - event -
-
{entry.event.detail}
-
- )} -
-
- ); - } - - if (entry.kind === "phase_divider" && entry.phase) { - return ( -
-
-
-
activity › phase
-
-
P
-
-

{entry.phase.label}

-
agent phase
-
-
-
-
-
- ); - } - - return null; -} diff --git a/packages/web/src/components/session/inspector-header.tsx b/packages/web/src/components/session/inspector-header.tsx deleted file mode 100644 index b8e0c91..0000000 --- a/packages/web/src/components/session/inspector-header.tsx +++ /dev/null @@ -1,30 +0,0 @@ -interface InspectorHeaderProps { - filter: string; - onFilterChange: (filter: string) => void; -} - -export function InspectorHeader({ filter, onFilterChange }: InspectorHeaderProps) { - const filters = ["all", "ls", "read", "grep", "agent"]; - - return ( -
-
-
Inspector · Split
-

Tool trace

-
-
-
- {filters.map(f => ( - - ))} -
-
-
- ); -} diff --git a/packages/web/src/components/session/inspector-pane.tsx b/packages/web/src/components/session/inspector-pane.tsx deleted file mode 100644 index 3db79b0..0000000 --- a/packages/web/src/components/session/inspector-pane.tsx +++ /dev/null @@ -1,136 +0,0 @@ -import { InspectorHeader } from "./inspector-header"; -import { TurnsList } from "./turns-list"; -import { DetailPanel } from "./detail-panel"; -import { useSessionStore } from "@/stores/session-store"; -import type { ActivityEntry } from "@/types"; -import { useMemo, useState } from "react"; - -const DEFAULT_DRAWER_HEIGHT = 36; -const MIN_DRAWER_HEIGHT = 24; -const MAX_DRAWER_HEIGHT = 70; - -export function InspectorPane() { - const [filter, setFilter] = useState("all"); - const [selectedCallId, setSelectedCallId] = useState(null); - const [drawerHeight, setDrawerHeight] = useState(DEFAULT_DRAWER_HEIGHT); - const { activityLog } = useSessionStore(); - - const currentActivity = useMemo(() => findCurrentActivity(activityLog), [activityLog]); - - function handleSelectCall(id: string) { - setSelectedCallId(id); - } - - function handleDragStart(event: React.PointerEvent) { - const container = event.currentTarget.closest(".insp-workspace"); - if (!(container instanceof HTMLElement)) return; - - const startY = event.clientY; - const startHeight = drawerHeight; - const containerHeight = container.getBoundingClientRect().height; - - event.currentTarget.setPointerCapture(event.pointerId); - - function handlePointerMove(moveEvent: PointerEvent) { - const delta = startY - moveEvent.clientY; - const nextHeight = startHeight + (delta / containerHeight) * 100; - setDrawerHeight(Math.min(MAX_DRAWER_HEIGHT, Math.max(MIN_DRAWER_HEIGHT, nextHeight))); - } - - function handlePointerUp() { - window.removeEventListener("pointermove", handlePointerMove); - window.removeEventListener("pointerup", handlePointerUp); - } - - window.addEventListener("pointermove", handlePointerMove); - window.addEventListener("pointerup", handlePointerUp); - } - - return ( -
- -
- - - {selectedCallId && ( -
-
- -
- -
- )} -
-
- ); -} - -function CurrentActivityStrip({ - entry, - onSelect, -}: { - entry: ActivityEntry | null; - onSelect: (id: string) => void; -}) { - if (!entry) { - return ( -
-
-
-
Waiting for agent activity
-
Tool calls and reasoning will appear here as the session runs.
-
-
- ); - } - - const isTool = entry.kind === "tool_call" && entry.tool; - const isError = entry.status === "error"; - const reasoning = entry.kind === "thinking" - ? entry.thinking?.text?.trim() - : entry.tool?.error || entry.tool?.result || entry.event?.detail || ""; - const title = isTool - ? entry.tool?.summary || entry.tool?.name || "Running tool call" - : entry.thinking?.text?.trim() || entry.event?.label || entry.phase?.label || "Agent is working"; - const meta = isTool - ? `${entry.tool?.name ?? "tool"} · ${entry.status}` - : `${entry.kind.replace("_", " ")} · ${entry.status}`; - - return ( - - ); -} - -function findCurrentActivity(activityLog: ActivityEntry[]): ActivityEntry | null { - const running = [...activityLog].reverse().find((entry) => entry.status === "running"); - if (running) return running; - - const error = [...activityLog].reverse().find((entry) => entry.status === "error"); - if (error) return error; - - return [...activityLog].reverse().find((entry) => entry.kind === "tool_call" || entry.kind === "thinking") ?? null; -} diff --git a/packages/web/src/components/session/phase-tracker.tsx b/packages/web/src/components/session/phase-tracker.tsx deleted file mode 100644 index 3dbabd1..0000000 --- a/packages/web/src/components/session/phase-tracker.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useSessionStore } from "@/stores/session-store"; -import { Check } from "lucide-react"; - -export function PhaseTracker() { - const { sessionPhase } = useSessionStore(); - - const getStatus = (target: string, currentIndex: number) => { - // Map backend states to our local tracker indices - let activeIndex = -1; - switch (sessionPhase) { - case "initializing": activeIndex = 0; break; // Provision - case "planning": activeIndex = 2; break; // Plan - case "awaiting_approval": activeIndex = 2; break; // Plan done, waiting - case "executing": activeIndex = 3; break; // Execute - case "completed": activeIndex = 5; break; // All done - case "verifying": activeIndex = 4; break; // Review - case "failed": activeIndex = -1; break; // Failed state - } - - if (sessionPhase === "awaiting_approval" && currentIndex === 2) { - // Wait, if awaiting approval, plan phase is done, execution is pending. - return "done"; - } - - if (currentIndex < activeIndex) return "done"; - if (currentIndex === activeIndex) return "active"; - return "pending"; - }; - - const phases = [ - { id: 'provision', label: 'Provision', time: '0:08', index: 0 }, - { id: 'setup', label: 'Setup', time: '1:12', index: 1 }, - { id: 'plan', label: 'Plan', time: '2:34', index: 2 }, - { id: 'execute', label: 'Execute', time: '—', index: 3 }, - { id: 'review', label: 'Review', time: '—', index: 4 } - ]; - - return ( -
- {phases.map((phase, idx) => { - const status = getStatus(phase.id, phase.index); - let phaseClass = "phase"; - if (status === "done") phaseClass += " phase-done"; - if (status === "active") phaseClass += " phase-active pulse"; - if (status === "pending") phaseClass += " phase-pending"; - - return ( -
-
-
- {status === "done" && } - {status === "active" &&
} -
- {idx < phases.length - 1 &&
} -
-
- {phase.label} - {phase.time} -
-
- ); - })} -
- ); -} diff --git a/packages/web/src/components/session/task-header.tsx b/packages/web/src/components/session/task-header.tsx deleted file mode 100644 index fbfa15a..0000000 --- a/packages/web/src/components/session/task-header.tsx +++ /dev/null @@ -1,18 +0,0 @@ -import { useSessionStore } from "@/stores/session-store"; -import { loadStoredSession } from "@/lib/session-summary"; - -export function TaskHeader() { - const { messages, sessionId } = useSessionStore(); - const firstUserMessage = messages.find(m => m.role === "user" && m.variant === "text"); - const storedSession = loadStoredSession(sessionId); - const title = firstUserMessage?.content || storedSession?.title || "Session"; - - return ( -
-
Session
-
-

{title}

-
-
- ); -} diff --git a/packages/web/src/components/session/task-meta.tsx b/packages/web/src/components/session/task-meta.tsx deleted file mode 100644 index 81aa20c..0000000 --- a/packages/web/src/components/session/task-meta.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { loadStoredModelPrefs } from "@/lib/session-summary"; - -export function TaskMeta() { - const prefs = loadStoredModelPrefs(); - const provider = prefs.provider ?? "unknown"; - const planModel = prefs.planModel ?? "unknown"; - const execModel = prefs.execModel ?? "unknown"; - - return ( -
-
- Provider - {provider} -
-
- Plan - {planModel} -
-
- Exec - {execModel} -
-
- ); -} diff --git a/packages/web/src/components/session/turns-list.tsx b/packages/web/src/components/session/turns-list.tsx deleted file mode 100644 index 87b3ffc..0000000 --- a/packages/web/src/components/session/turns-list.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import { useSessionStore } from "@/stores/session-store"; - -interface TurnsListProps { - filter: string; - selectedCallId: string | null; - onSelectCall: (id: string) => void; -} - -export function TurnsList({ filter, selectedCallId, onSelectCall }: TurnsListProps) { - const { activityLog, sessionPhase } = useSessionStore(); - - const isRunning = sessionPhase === "planning" || sessionPhase === "executing"; - - const getToolIcon = (name: string) => { - if (name.includes('read') || name.includes('view_file')) return { cls: 'read', char: 'R' }; - if (name.includes('write') || name.includes('replace')) return { cls: 'write', char: 'W' }; - if (name.includes('list') || name.includes('ls')) return { cls: 'ls', char: 'L' }; - if (name.includes('grep') || name.includes('search')) return { cls: 'grep', char: 'G' }; - if (name.includes('bash') || name.includes('command')) return { cls: 'bash', char: '$' }; - return { cls: 'agent', char: '✦' }; - }; - - const filteredLog = activityLog.filter(entry => { - if (filter === "all") return entry.kind === "tool_call" || entry.kind === "thinking"; - if (filter === "agent") return entry.kind === "thinking"; - - if (entry.kind === "tool_call" && entry.tool) { - const toolType = getToolIcon(entry.tool.name).cls; - return toolType === filter; - } - return false; - }); - - return ( -
-
-
-
-
Execution Trace
-
{activityLog.length} events
-
- -
- {filteredLog.map(entry => { - if (entry.kind === "thinking") { - const isSelected = selectedCallId === entry.id; - return ( - - ); - } - - if (entry.kind === "tool_call" && entry.tool) { - const icon = getToolIcon(entry.tool.name); - const isSelected = selectedCallId === entry.id; - const isCallRunning = entry.status === "running"; - - return ( - - ); - } - - return null; - })} - - {filteredLog.length === 0 && ( -
- No matching traces -
- )} -
-
-
- ); -} diff --git a/packages/web/src/components/ui/badge.tsx b/packages/web/src/components/ui/badge.tsx deleted file mode 100644 index 6eb2a05..0000000 --- a/packages/web/src/components/ui/badge.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import * as React from "react" -import { cva, type VariantProps } from "class-variance-authority" -import { Slot } from "radix-ui" - -import { cn } from "@/lib/utils" - -const badgeVariants = cva( - "inline-flex w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-full border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3", - { - variants: { - variant: { - default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90", - secondary: - "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", - destructive: - "bg-destructive text-white focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40 [a&]:hover:bg-destructive/90", - outline: - "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", - ghost: "[a&]:hover:bg-accent [a&]:hover:text-accent-foreground", - link: "text-primary underline-offset-4 [a&]:hover:underline", - }, - }, - defaultVariants: { - variant: "default", - }, - } -) - -function Badge({ - className, - variant = "default", - asChild = false, - ...props -}: React.ComponentProps<"span"> & - VariantProps & { asChild?: boolean }) { - const Comp = asChild ? Slot.Root : "span" - - return ( - - ) -} - -export { Badge, badgeVariants } diff --git a/packages/web/src/components/ui/collapsible.tsx b/packages/web/src/components/ui/collapsible.tsx deleted file mode 100644 index 63fc8ef..0000000 --- a/packages/web/src/components/ui/collapsible.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { Collapsible as CollapsiblePrimitive } from "radix-ui" - -function Collapsible({ - ...props -}: React.ComponentProps) { - return -} - -function CollapsibleTrigger({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function CollapsibleContent({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -export { Collapsible, CollapsibleTrigger, CollapsibleContent } diff --git a/packages/web/src/components/ui/dialog.tsx b/packages/web/src/components/ui/dialog.tsx index e5f0a96..1cda8ee 100644 --- a/packages/web/src/components/ui/dialog.tsx +++ b/packages/web/src/components/ui/dialog.tsx @@ -1,7 +1,15 @@ import * as React from "react" -import { XIcon } from "lucide-react" import { Dialog as DialogPrimitive } from "radix-ui" +function XIcon() { + return ( + + + + + ) +} + import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" diff --git a/packages/web/src/components/ui/dropdown-menu.tsx b/packages/web/src/components/ui/dropdown-menu.tsx deleted file mode 100644 index ae1fcf6..0000000 --- a/packages/web/src/components/ui/dropdown-menu.tsx +++ /dev/null @@ -1,257 +0,0 @@ -"use client" - -import * as React from "react" -import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react" -import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui" - -import { cn } from "@/lib/utils" - -function DropdownMenu({ - ...props -}: React.ComponentProps) { - return -} - -function DropdownMenuPortal({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuTrigger({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuContent({ - className, - sideOffset = 4, - ...props -}: React.ComponentProps) { - return ( - - - - ) -} - -function DropdownMenuGroup({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuItem({ - className, - inset, - variant = "default", - ...props -}: React.ComponentProps & { - inset?: boolean - variant?: "default" | "destructive" -}) { - return ( - - ) -} - -function DropdownMenuCheckboxItem({ - className, - children, - checked, - ...props -}: React.ComponentProps) { - return ( - - - - - - - {children} - - ) -} - -function DropdownMenuRadioGroup({ - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuRadioItem({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - - - - - - - {children} - - ) -} - -function DropdownMenuLabel({ - className, - inset, - ...props -}: React.ComponentProps & { - inset?: boolean -}) { - return ( - - ) -} - -function DropdownMenuSeparator({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -function DropdownMenuShortcut({ - className, - ...props -}: React.ComponentProps<"span">) { - return ( - - ) -} - -function DropdownMenuSub({ - ...props -}: React.ComponentProps) { - return -} - -function DropdownMenuSubTrigger({ - className, - inset, - children, - ...props -}: React.ComponentProps & { - inset?: boolean -}) { - return ( - - {children} - - - ) -} - -function DropdownMenuSubContent({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -export { - DropdownMenu, - DropdownMenuPortal, - DropdownMenuTrigger, - DropdownMenuContent, - DropdownMenuGroup, - DropdownMenuLabel, - DropdownMenuItem, - DropdownMenuCheckboxItem, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, - DropdownMenuSeparator, - DropdownMenuShortcut, - DropdownMenuSub, - DropdownMenuSubTrigger, - DropdownMenuSubContent, -} diff --git a/packages/web/src/components/ui/resizable.tsx b/packages/web/src/components/ui/resizable.tsx deleted file mode 100644 index 30443aa..0000000 --- a/packages/web/src/components/ui/resizable.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { GripVerticalIcon } from "lucide-react" -import * as ResizablePrimitive from "react-resizable-panels" - -import { cn } from "@/lib/utils" - -function ResizablePanelGroup({ - className, - ...props -}: ResizablePrimitive.GroupProps) { - return ( - - ) -} - -function ResizablePanel({ ...props }: ResizablePrimitive.PanelProps) { - return -} - -function ResizableHandle({ - withHandle, - className, - ...props -}: ResizablePrimitive.SeparatorProps & { - withHandle?: boolean -}) { - return ( - div]:rotate-90", - className - )} - {...props} - > - {withHandle && ( -
- -
- )} -
- ) -} - -export { ResizableHandle, ResizablePanel, ResizablePanelGroup } diff --git a/packages/web/src/components/ui/scroll-area.tsx b/packages/web/src/components/ui/scroll-area.tsx deleted file mode 100644 index 73c4eb1..0000000 --- a/packages/web/src/components/ui/scroll-area.tsx +++ /dev/null @@ -1,58 +0,0 @@ -"use client" - -import * as React from "react" -import { ScrollArea as ScrollAreaPrimitive } from "radix-ui" - -import { cn } from "@/lib/utils" - -function ScrollArea({ - className, - children, - ...props -}: React.ComponentProps) { - return ( - - - {children} - - - - - ) -} - -function ScrollBar({ - className, - orientation = "vertical", - ...props -}: React.ComponentProps) { - return ( - - - - ) -} - -export { ScrollArea, ScrollBar } diff --git a/packages/web/src/components/ui/separator.tsx b/packages/web/src/components/ui/separator.tsx deleted file mode 100644 index db91e97..0000000 --- a/packages/web/src/components/ui/separator.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import * as React from "react" -import { Separator as SeparatorPrimitive } from "radix-ui" - -import { cn } from "@/lib/utils" - -function Separator({ - className, - orientation = "horizontal", - decorative = true, - ...props -}: React.ComponentProps) { - return ( - - ) -} - -export { Separator } diff --git a/packages/web/src/lib/__tests__/event-mapper.test.ts b/packages/web/src/lib/__tests__/event-mapper.test.ts deleted file mode 100644 index 3b7b2dd..0000000 --- a/packages/web/src/lib/__tests__/event-mapper.test.ts +++ /dev/null @@ -1,529 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { applyToChatActivity, mapEventToChat, mapEventToActivity } from "@codevil/shared"; -import type { ProjectionContext } from "@codevil/shared"; -import type { DOToCLIEvent } from "@codevil/shared"; - -function makeCtx(now = 1_000_000): ProjectionContext { - let counter = 0; - return { uid: () => `msg_${++counter}`, now }; -} - -describe("mapEventToChat", () => { - it("maps session_created to a system message", () => { - const event: DOToCLIEvent = { type: "session_created", session_id: "ses_abc" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].role).toBe("system"); - expect(messages[0].variant).toBe("status"); - expect(messages[0].content).toContain("ses_abc"); - }); - - it("maps status to a system message", () => { - const event: DOToCLIEvent = { type: "status", message: "Provisioning sandbox..." }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].role).toBe("system"); - expect(messages[0].variant).toBe("status"); - expect(messages[0].content).toBe("Provisioning sandbox..."); - }); - - it("carries the actor from an attributed status event", () => { - const event: DOToCLIEvent = { - type: "status", - message: "Plan approved. Starting execution.", - actor: "Alice", - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages[0].actor).toBe("Alice"); - }); - - it("leaves actor undefined for an unattributed status event", () => { - const event: DOToCLIEvent = { type: "status", message: "Cloning repo." }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages[0].actor).toBeUndefined(); - }); - - it("maps room_ready to a room-ready status message", () => { - const event: DOToCLIEvent = { type: "room_ready", repo: "github.com/acme/app" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].variant).toBe("status"); - expect(messages[0].content).toBe("Session ready for github.com/acme/app"); - }); - - it("keeps participant join and leave noise out of conversation", () => { - const ctx = makeCtx(); - const joined = mapEventToChat({ - type: "participant_joined", - participant: { id: "usr_123", name: "Alice" }, - }, ctx); - const left = mapEventToChat({ - type: "participant_left", - participant: { id: "usr_123", name: "Alice" }, - }, ctx); - - expect(joined).toEqual([]); - expect(left).toEqual([]); - }); - - it("maps human messages to user chat messages with actor attribution", () => { - const messages = mapEventToChat({ - type: "human_message", - id: "msg_123", - actor: { id: "usr_123", name: "Alice" }, - text: "hello room", - created_at: "2026-06-03T00:00:00.000Z", - }, makeCtx()); - - expect(messages).toHaveLength(1); - expect(messages[0].role).toBe("user"); - expect(messages[0].variant).toBe("text"); - expect(messages[0].content).toBe("hello room"); - expect(messages[0].actor).toBe("Alice"); - expect(messages[0].meta?.actor_id).toBe("usr_123"); - }); - - it("carries the actor from an attributed error event", () => { - const event: DOToCLIEvent = { - type: "error", - message: "Alice already approved this plan.", - actor: "Alice", - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages[0].actor).toBe("Alice"); - }); - - it("does not render awaiting approval status separately from the plan card", () => { - const event: DOToCLIEvent = { type: "status", message: "Waiting for user approval." }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(0); - }); - - it("keeps phase events out of conversation", () => { - const event: DOToCLIEvent = { type: "phase", phase: "planning", model: "claude-sonnet-4-6" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toEqual([]); - }); - - it("maps plan_ready to a plan message", () => { - const event: DOToCLIEvent = { - type: "plan_ready", - plan: "## Plan\n\n1. Do X", - cost: { input_tokens: 1000, output_tokens: 500, total_cost_usd: 0.01 }, - refinement_round: 0, - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].variant).toBe("plan"); - expect(messages[0].content).toBe("## Plan\n\n1. Do X"); - expect(messages[0].meta?.cost?.total_cost_usd).toBe(0.01); - expect(messages[0].meta?.refinement_round).toBe(0); - }); - - it("maps approval_requested to a plan message scoped to the run", () => { - const event: DOToCLIEvent = { - type: "approval_requested", - run_id: "run_123", - plan: "## Plan\n\n1. Do X", - cost: { input_tokens: 1000, output_tokens: 500, total_cost_usd: 0.01 }, - refinement_round: 0, - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].variant).toBe("plan"); - expect(messages[0].content).toBe("## Plan\n\n1. Do X"); - expect(messages[0].meta?.run_id).toBe("run_123"); - }); - - it("maps agent request queue events to room status messages", () => { - const ctx = makeCtx(); - const requested = mapEventToChat({ - type: "agent_request", - run_id: "run_123", - actor: { id: "usr_123", name: "Alice" }, - text: "fix the bug", - created_at: "2026-06-03T00:00:00.000Z", - }, ctx); - const queued = mapEventToChat({ - type: "agent_request_queued", - run_id: "run_124", - position: 2, - }, ctx); - const started = mapEventToChat({ - type: "agent_run_started", - run_id: "run_123", - actor: { id: "usr_123", name: "Alice" }, - text: "fix the bug", - }, ctx); - - expect(requested[0].role).toBe("user"); - expect(requested[0].actor).toBe("Alice"); - expect(requested[0].meta?.actor_id).toBe("usr_123"); - expect(requested[0].content).toBe("@codevil fix the bug"); - expect(queued[0].content).toBe("Queued agent request #2."); - expect(started).toEqual([]); - }); - - it("keeps run completion out of chat and maps failures", () => { - const ctx = makeCtx(); - const completed = mapEventToChat({ - type: "agent_run_completed", - run_id: "run_123", - pr_url: "https://github.com/user/repo/pull/1", - }, ctx); - const failed = mapEventToChat({ - type: "agent_run_failed", - run_id: "run_123", - message: "tests failed", - }, ctx); - - expect(completed).toEqual([]); - expect(failed[0].variant).toBe("error"); - expect(failed[0].content).toBe("tests failed"); - }); - - it("maps the final agent response to one assistant message", () => { - const messages = mapEventToChat({ - type: "agent_response", - run_id: "run_123", - text: "Rate limits are configured in src/rate-limit.ts.", - }, makeCtx()); - - expect(messages).toHaveLength(1); - expect(messages[0].role).toBe("assistant"); - expect(messages[0].variant).toBe("text"); - expect(messages[0].content).toBe("Rate limits are configured in src/rate-limit.ts."); - expect(messages[0].meta?.run_id).toBe("run_123"); - }); - - it("maps complete to a complete message with pr_url", () => { - const event: DOToCLIEvent = { type: "complete", pr_url: "https://github.com/user/repo/pull/1" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].variant).toBe("complete"); - expect(messages[0].meta?.pr_url).toBe("https://github.com/user/repo/pull/1"); - }); - - it("maps error to an error message", () => { - const event: DOToCLIEvent = { type: "error", message: "Something broke" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].variant).toBe("error"); - expect(messages[0].content).toBe("Something broke"); - }); - - it("keeps completed agent tools out of conversation", () => { - const event: DOToCLIEvent = { - type: "agent_event", - event: { type: "tool_execution_end", tool: "bash", args: { command: "npm test" }, success: true }, - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toEqual([]); - }); - - it("does not put low-signal read-only tools in the durable timeline", () => { - const event: DOToCLIEvent = { - type: "agent_event", - event: { type: "tool_execution_end", toolName: "find", args: { path: ".", pattern: "README.md" }, isError: false }, - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(0); - }); - - it("keeps agent message_update events out of the durable timeline", () => { - const event: DOToCLIEvent = { - type: "agent_event", - event: { type: "message_update", content: "Let me look at" }, - }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(0); - }); - - it("keeps clone_progress line noise out of the durable timeline", () => { - const event: DOToCLIEvent = { type: "clone_progress", line: "Receiving objects: 50%" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(0); - }); - - it("maps verification_failed to a verification_failed message", () => { - const event: DOToCLIEvent = { type: "verification_failed", attempts: 3, last_error: "test failed" }; - const messages = mapEventToChat(event, makeCtx()); - expect(messages).toHaveLength(1); - expect(messages[0].variant).toBe("verification_failed"); - expect(messages[0].meta?.attempts).toBe(3); - expect(messages[0].meta?.last_error).toBe("test failed"); - }); -}); - -describe("applyToChatActivity", () => { - it("coalesces streamed message updates into one thinking entry", () => { - const ctx = makeCtx(); - const first = applyToChatActivity( - { messages: [], activityLog: [] }, - { type: "agent_event", event: { type: "message_update", content: "Analyzing " } }, - ctx, - ); - const second = applyToChatActivity( - first, - { type: "agent_event", event: { type: "message_update", content: "the repo." } }, - ctx, - ); - - expect(second.messages).toHaveLength(0); - expect(second.activityLog).toHaveLength(1); - expect(second.activityLog[0].kind).toBe("thinking"); - expect(second.activityLog[0].thinking?.text).toBe("Analyzing the repo."); - }); - - it("coalesces Pi assistant text deltas into one thinking entry", () => { - const ctx = makeCtx(); - const first = applyToChatActivity( - { messages: [], activityLog: [] }, - { - type: "agent_event", - event: { - type: "message_update", - assistantMessageEvent: { type: "text_delta", delta: "Reading " }, - }, - }, - ctx, - ); - const second = applyToChatActivity( - first, - { - type: "agent_event", - event: { - type: "message_update", - assistantMessageEvent: { type: "text_delta", delta: "files." }, - }, - }, - ctx, - ); - - expect(second.activityLog).toHaveLength(1); - expect(second.activityLog[0].thinking?.text).toBe("Reading files."); - }); - - it("keeps markdown heading deltas out of durable conversation messages", () => { - const projected = applyToChatActivity( - { messages: [], activityLog: [] }, - { - type: "agent_event", - event: { - type: "message_update", - assistantMessageEvent: { - type: "text_delta", - delta: "**Inspecting package.json**\n\nI need to check the scripts.", - }, - }, - }, - makeCtx(), - ); - - expect(projected.messages).toHaveLength(0); - expect(projected.activityLog).toHaveLength(1); - expect(projected.activityLog[0].kind).toBe("thinking"); - }); - - it("keeps agent_end final assistant text in activity only", () => { - const projected = applyToChatActivity( - { messages: [], activityLog: [] }, - { - type: "agent_event", - event: { - type: "agent_end", - messages: [ - { role: "assistant", content: "I updated the checkout page and verified the tests." }, - ], - }, - }, - makeCtx(), - ); - - expect(projected.messages).toHaveLength(0); - expect(projected.activityLog.at(-1)?.event?.label).toBe("Agent finished"); - }); - - it("does not promote agent_end text when a plan message exists", () => { - const projected = applyToChatActivity( - { - messages: [ - { - id: "plan_1", - role: "assistant", - variant: "plan", - content: "## Plan\n\n1. Update checkout.", - timestamp: 1, - }, - ], - activityLog: [], - }, - { - type: "agent_event", - event: { - type: "agent_end", - messages: [ - { role: "assistant", content: "## Plan\n\n1. Update checkout." }, - ], - }, - }, - makeCtx(), - ); - - expect(projected.messages).toHaveLength(1); - }); - - it("updates a running tool entry when the matching tool ends", () => { - const ctx = makeCtx(); - const started = applyToChatActivity( - { messages: [], activityLog: [] }, - { type: "agent_event", event: { type: "tool_execution_start", tool: "bash", args: { command: "pnpm test" } } }, - ctx, - ); - const ended = applyToChatActivity( - started, - { type: "agent_event", event: { type: "tool_execution_end", tool: "bash", args: { command: "pnpm test" }, result: "PASS", success: true } }, - ctx, - ); - - expect(ended.messages).toHaveLength(0); - expect(ended.activityLog).toHaveLength(1); - expect(ended.activityLog[0].status).toBe("success"); - expect(ended.activityLog[0].tool?.result).toBe("PASS"); - }); - - it("updates Pi tool events using toolCallId", () => { - const ctx = makeCtx(); - const started = applyToChatActivity( - { messages: [], activityLog: [] }, - { - type: "agent_event", - event: { - type: "tool_execution_start", - toolCallId: "call_1", - toolName: "read", - args: { path: "src/index.ts" }, - }, - }, - ctx, - ); - const ended = applyToChatActivity( - started, - { - type: "agent_event", - event: { - type: "tool_execution_end", - toolCallId: "call_1", - toolName: "read", - result: "file contents", - isError: false, - }, - }, - ctx, - ); - - expect(ended.activityLog).toHaveLength(1); - expect(ended.activityLog[0].status).toBe("success"); - expect(ended.activityLog[0].tool?.name).toBe("read"); - expect(ended.activityLog[0].tool?.result).toBe("file contents"); - }); - - it("renders generic Pi lifecycle events in the activity pane", () => { - const projected = applyToChatActivity( - { messages: [], activityLog: [] }, - { type: "agent_event", event: { type: "agent_start" } }, - makeCtx(), - ); - - expect(projected.activityLog).toHaveLength(1); - expect(projected.activityLog[0].kind).toBe("event"); - expect(projected.activityLog[0].event?.label).toBe("Agent started"); - }); -}); - -describe("mapEventToActivity", () => { - it("maps agent_event tool_execution_start to a running tool_call entry", () => { - const event: DOToCLIEvent = { - type: "agent_event", - event: { type: "tool_execution_start", tool: "bash", args: { command: "npm test" } }, - }; - const entries = mapEventToActivity(event, makeCtx()); - expect(entries).toHaveLength(1); - expect(entries[0].kind).toBe("tool_call"); - expect(entries[0].status).toBe("running"); - expect(entries[0].tool?.name).toBe("bash"); - expect(entries[0].tool?.summary).toBe("Run npm test"); - }); - - it("maps agent_event tool_execution_end to a completed tool_call entry", () => { - const event: DOToCLIEvent = { - type: "agent_event", - event: { type: "tool_execution_end", tool: "bash", args: { command: "npm test" }, result: "PASS", success: true }, - }; - const entries = mapEventToActivity(event, makeCtx()); - expect(entries).toHaveLength(1); - expect(entries[0].kind).toBe("tool_call"); - expect(entries[0].status).toBe("success"); - expect(entries[0].tool?.name).toBe("bash"); - expect(entries[0].tool?.result).toBe("PASS"); - }); - - it("maps agent_event message_update to a thinking entry", () => { - const event: DOToCLIEvent = { - type: "agent_event", - event: { type: "message_update", content: "Analyzing the code..." }, - }; - const entries = mapEventToActivity(event, makeCtx()); - expect(entries).toHaveLength(1); - expect(entries[0].kind).toBe("thinking"); - expect(entries[0].thinking?.text).toBe("Analyzing the code..."); - }); - - it("maps phase event to a phase_divider entry", () => { - const event: DOToCLIEvent = { type: "phase", phase: "executing", model: "claude-opus-4-6" }; - const entries = mapEventToActivity(event, makeCtx()); - expect(entries).toHaveLength(1); - expect(entries[0].kind).toBe("phase_divider"); - expect(entries[0].phase?.label).toContain("Agent turn"); - }); - - it("maps agent run start to activity instead of conversation", () => { - const event: DOToCLIEvent = { - type: "agent_run_started", - run_id: "run_123", - actor: { id: "usr_123", name: "Alice" }, - text: "fix the test", - }; - - expect(mapEventToChat(event, makeCtx())).toEqual([]); - expect(mapEventToActivity(event, makeCtx())[0].event?.label).toBe("Agent run started"); - expect(mapEventToActivity(event, makeCtx())[0].event?.detail).toBe("fix the test"); - }); - - it("maps room lifecycle events to activity entries for the right pane", () => { - const events: DOToCLIEvent[] = [ - { type: "session_created", session_id: "ses_abc" }, - { type: "status", message: "Provisioning sandbox..." }, - { type: "room_ready", repo: "github.com/acme/app" }, - ]; - - const labels = events.flatMap((event) => - mapEventToActivity(event, makeCtx()).map((entry) => entry.event?.label), - ); - - expect(labels).toEqual([ - "Session created", - "Provisioning sandbox", - "Session ready", - ]); - }); - - it("keeps clone progress line noise out of activity", () => { - const entries = mapEventToActivity({ - type: "clone_progress", - line: "Receiving objects: 50%", - }, makeCtx()); - - expect(entries).toEqual([]); - }); -}); diff --git a/packages/web/src/session-components.css b/packages/web/src/session-components.css index 163866e..3ec0b1d 100644 --- a/packages/web/src/session-components.css +++ b/packages/web/src/session-components.css @@ -29,13 +29,6 @@ display: flex; flex-direction: column; } -.session-body { - flex: 1; - display: flex; - flex-direction: column; - min-height: 0; - overflow: hidden; -} /* ─── Live preview ───────────────────────────────────────────────────────── */ .live-preview { @@ -210,13 +203,6 @@ } /* ─── Left pane ───────────────────────────────────────────────────────────── */ -.leftpane { - border-right: 1px solid var(--line); - background: var(--surface); - overflow-y: auto; - min-height: 0; -} -.leftpane-inner { padding: 22px 22px 28px; display: flex; flex-direction: column; gap: 22px; } .section-header { } .section-eyebrow { @@ -227,50 +213,10 @@ } .section-title-row { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-top: 4px; } .section-title { font-size: 18px; font-weight: 600; margin: 0; line-height: 1.3; letter-spacing: -0.01em; } - -.task-meta { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 1px; - background: var(--line); - border: 1px solid var(--line); - border-radius: var(--r-md); - overflow: hidden; -} -.task-meta > div { - background: var(--surface); - padding: 8px 10px; - display: flex; flex-direction: column; gap: 2px; -} .kv-label { font-family: var(--mono); font-size: 10px; color: var(--fg-4); text-transform: uppercase; letter-spacing: 0.06em; } .kv-val { font-size: 12px; color: var(--fg-2); } /* phase tracker */ -.phases { display: flex; flex-direction: column; gap: 0; } -.phase { display: grid; grid-template-columns: 18px 1fr; gap: 10px; min-height: 32px; } -.phase-rail { display: flex; flex-direction: column; align-items: center; } -.phase-bullet { - width: 14px; height: 14px; - border-radius: 99px; - background: var(--surface-3); - border: 2px solid var(--line); - display: flex; align-items: center; justify-content: center; - color: var(--fg-3); - flex-shrink: 0; - z-index: 1; -} -.phase-done .phase-bullet { background: var(--ok); border-color: var(--ok); color: white; } -.phase-active .phase-bullet { background: var(--accent); border-color: var(--accent); color: white; } -.phase-bullet-inner { width: 6px; height: 6px; background: white; border-radius: 99px; } -.phase-line { flex: 1; width: 1px; background: var(--line); margin: 1px 0; min-height: 14px; } -.phase-done .phase-line { background: var(--ok); } -.phase-body { - padding-bottom: 12px; - display: flex; align-items: baseline; justify-content: space-between; gap: 10px; -} -.phase-label { font-size: 13px; font-weight: 500; color: var(--fg); } -.phase-pending .phase-label { color: var(--fg-4); font-weight: 400; } -.phase-meta { font-size: 11px; color: var(--fg-4); } /* plan card */ .plan-card { @@ -319,23 +265,11 @@ border-radius: var(--r-sm); } .plan-body :where(pre code) { padding: 0; background: transparent; } -.ic { font-family: var(--mono); font-size: 11.5px; padding: 1px 5px; background: var(--surface-3); border-radius: 3px; color: var(--fg); } -.ic-blue { background: oklch(0.62 0.13 235 / 0.15); color: oklch(0.45 0.13 235); } -.arrow { color: var(--fg-4); padding: 0 2px; } .plan-kv { display: flex; flex-direction: column; gap: 4px; } .plan-kv-row { display: grid; grid-template-columns: 90px 1fr; gap: 8px; font-size: 12px; } .plan-kv-k { font-family: var(--mono); font-size: 10.5px; color: var(--fg-4); padding-top: 2px; } .plan-kv-v { color: var(--fg-2); line-height: 1.5; } - -.plan-target-file { font-size: 11.5px; color: var(--fg-3); margin-bottom: 6px; } -.plan-diff { - font-size: 11px; - background: var(--bg); - border: 1px solid var(--line); - border-radius: var(--r-sm); - overflow: hidden; -} .plan-diff .diff-add, .plan-diff .diff-del { padding: 4px 8px; margin: 0; display: block; white-space: pre-wrap; word-break: break-all; } .plan-actions { @@ -378,305 +312,25 @@ .plan-refine:focus { border-color: var(--accent); background: var(--surface); } /* chat */ -.subhead { - display: flex; justify-content: space-between; align-items: center; - padding-bottom: 8px; - border-bottom: 1px solid var(--line-2); - margin-bottom: 10px; -} -.subhead-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--fg-3); } -.subhead-meta { font-size: 10.5px; color: var(--fg-4); } - -.chat-list { display: flex; flex-direction: column; gap: 14px; } -.msg { display: flex; flex-direction: column; gap: 4px; } -.msg-meta { font-size: 10px; color: var(--fg-4); display: flex; gap: 4px; } -.msg-from { color: var(--fg-3); font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; } -.msg-bubble { - font-size: 12.5px; - padding: 8px 12px; - border-radius: var(--r-md); - background: var(--surface-2); - color: var(--fg); - line-height: 1.5; - border: 1px solid var(--line-2); -} -.msg-you .msg-bubble { background: var(--accent-soft); border-color: transparent; color: var(--fg); } -.msg-error .msg-bubble { - background: oklch(0.62 0.18 25 / 0.10); - border-color: oklch(0.62 0.18 25 / 0.24); - color: var(--err); - white-space: pre-wrap; -} -.msg-complete .msg-bubble { - background: oklch(0.66 0.14 150 / 0.12); - border-color: oklch(0.66 0.14 150 / 0.24); - color: var(--fg); -} -.msg-cta { margin-top: 6px; } -.msg-bubble-typing { display: inline-flex; gap: 3px; padding: 10px 12px; } -.typing-dot { width: 5px; height: 5px; background: var(--fg-4); border-radius: 99px; animation: typing 1.2s infinite; } -.typing-dot:nth-child(2) { animation-delay: 0.15s; } -.typing-dot:nth-child(3) { animation-delay: 0.3s; } @keyframes typing { 0%, 80% { opacity: 0.3; transform: translateY(0); } 40% { opacity: 1; transform: translateY(-2px); } } /* files */ -.files-list { display: flex; flex-direction: column; } -.file-row { - display: grid; - grid-template-columns: 18px 1fr auto; - gap: 10px; - padding: 5px 0; - align-items: center; - font-size: 11.5px; -} -.file-row:not(:last-child) { border-bottom: 1px dashed var(--line-2); } -.file-path { color: var(--fg-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.file-kind { - width: 18px; - height: 18px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: var(--r-sm); - font-family: var(--mono); - font-size: 10px; - font-weight: 600; -} .file-kind.read { background: oklch(0.62 0.13 235 / 0.14); color: var(--info); } .file-kind.write { background: oklch(0.66 0.14 150 / 0.14); color: var(--ok); } -.file-stat { font-size: 10.5px; color: var(--fg-4); } -.stat-add { color: var(--ok); margin-right: 4px; } -.stat-del { color: var(--err); } -.stat-none { color: var(--fg-4); } /* cost */ -.cost-bar { height: 6px; border-radius: 99px; background: var(--surface-3); overflow: hidden; display: flex; } -.cost-bar-in { background: oklch(0.62 0.13 235); } -.cost-bar-out { background: oklch(0.66 0.16 145); } -.cost-legend { - display: flex; justify-content: space-between; gap: 12px; - margin-top: 8px; font-size: 11px; color: var(--fg-3); -} -.cost-legend > span { display: inline-flex; align-items: center; gap: 6px; } .lg-dot { width: 8px; height: 8px; border-radius: 99px; display: inline-block; } .lg-in { background: oklch(0.62 0.13 235); } .lg-out { background: oklch(0.66 0.16 145); } /* ─── Right pane shared ───────────────────────────────────────────────────── */ -.rp { - display: flex; - flex-direction: column; - background: var(--bg); - min-height: 0; - overflow: hidden; -} -.rp-head { - display: flex; align-items: center; justify-content: space-between; - padding: 14px 18px 12px; - border-bottom: 1px solid var(--line); - background: var(--surface); - flex-shrink: 0; -} -.rp-eyebrow { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--fg-4); } -.rp-title { font-size: 15px; font-weight: 600; margin: 2px 0 0; letter-spacing: -0.01em; } -.rp-head-right { display: flex; gap: 8px; align-items: center; } - -.seg { - display: inline-flex; - background: var(--surface-3); - border-radius: var(--r-md); - padding: 2px; -} -.seg-btn { - height: 24px; - padding: 0 10px; - border: 0; background: transparent; - font-size: 11.5px; - color: var(--fg-3); - border-radius: 4px; - font-family: var(--mono); -} -.seg-btn-on { background: var(--surface); color: var(--fg); box-shadow: 0 1px 2px rgba(0,0,0,0.06); } .dark .seg-btn-on { box-shadow: 0 1px 2px rgba(0,0,0,0.4); } /* ─── Variant A — Swimlane ────────────────────────────────────────────────── */ -.rp-swim { } -.swim-ruler { - position: relative; - height: 22px; - border-bottom: 1px solid var(--line-2); - background: var(--surface-2); - font-size: 10px; - color: var(--fg-4); - flex-shrink: 0; -} -.swim-tick { - position: absolute; - top: 4px; - transform: translateX(-50%); - padding: 0 4px; -} -.swim-tick::before { - content: ""; position: absolute; - left: 50%; bottom: -6px; - width: 1px; height: 6px; - background: var(--line); -} -.swim-canvas { - flex: 1; overflow: auto; - padding: 6px 0; - min-height: 0; - max-height: 320px; -} -.swim-lane { - padding: 8px 18px; - border-bottom: 1px solid var(--line-2); -} -.swim-lane-active { background: var(--accent-soft); } -.swim-lane-head { - display: flex; align-items: center; gap: 10px; - font-size: 12px; - margin-bottom: 6px; -} -.swim-lane-num { color: var(--fg-4); font-size: 10.5px; } -.swim-lane-label { font-weight: 600; color: var(--fg); } -.swim-lane-summary { color: var(--fg-3); font-size: 11.5px; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.swim-lane-dur { color: var(--fg-4); font-size: 10.5px; } -.swim-lane-track { - position: relative; - height: 30px; - background: - repeating-linear-gradient(90deg, var(--line-2) 0 1px, transparent 1px 25%); - border-radius: var(--r-sm); -} -.swim-turn-band { - position: absolute; - top: 4px; bottom: 4px; - background: var(--surface-2); - border: 1px solid var(--line); - border-radius: 4px; - display: flex; -} -.swim-call { - position: absolute; - top: 0; bottom: 0; - display: inline-flex; align-items: center; gap: 5px; - padding: 0 6px; - border: 0; - background: var(--surface); - border-right: 1px solid var(--line); - font-size: 11px; - color: var(--fg-2); - overflow: hidden; - white-space: nowrap; - transition: background 0.12s; -} -.swim-call:last-child { border-right: 0; } -.swim-call:hover { background: var(--surface-3); } -.swim-call-sel { background: var(--accent-soft); color: var(--fg); } -.swim-call-active { background: var(--accent-soft); } -.swim-call-active::after { - content: ""; - position: absolute; left: 0; right: 0; bottom: 0; height: 2px; - background: var(--accent); - animation: progress 1.6s ease-in-out infinite; -} @keyframes progress { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } } -.swim-call-label { overflow: hidden; text-overflow: ellipsis; } - -.swim-detail { - border-top: 1px solid var(--line); - background: var(--surface); - flex: 1; - min-height: 0; - overflow: auto; -} /* ─── Variant B — Graph ───────────────────────────────────────────────────── */ -.rp-graph { } -.graph-canvas { - flex: 1; - min-height: 0; - overflow: auto; - padding: 18px 18px 18px 38px; - position: relative; - max-height: 360px; -} -.graph-spine { - position: absolute; - left: 28px; top: 24px; bottom: 24px; - width: 2px; - background: linear-gradient(to bottom, var(--line), var(--accent), var(--line)); - border-radius: 99px; -} -.gturn { display: grid; grid-template-columns: 22px 1fr; gap: 14px; margin-bottom: 12px; position: relative; } -.gturn-anchor { display: flex; align-items: flex-start; padding-top: 10px; margin-left: -8px; } -.gturn-bullet { - width: 16px; height: 16px; - border-radius: 99px; - background: var(--surface); - border: 2px solid var(--line); - display: flex; align-items: center; justify-content: center; - color: var(--accent); -} -.gturn-active .gturn-bullet { border-color: var(--accent); background: var(--accent); } -.gturn-bullet-inner { width: 5px; height: 5px; background: var(--surface); border-radius: 99px; } -.gturn-active .gturn-bullet-inner { background: var(--bg); } - -.gturn-card { - background: var(--surface); - border: 1px solid var(--line); - border-radius: var(--r-md); - overflow: hidden; -} -.gturn-active.gturn { } -.gturn-active .gturn-card { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); } - -.gturn-head { - display: flex; align-items: center; gap: 10px; - padding: 10px 14px; -} -.gturn-id { color: var(--fg-4); font-size: 10.5px; } -.gturn-label { font-weight: 600; font-size: 13px; flex: 1; } -.gturn-meta { font-size: 10.5px; color: var(--fg-4); } -.gturn-thought { - padding: 0 14px 10px; - font-size: 12px; - color: var(--fg-2); - font-style: italic; - line-height: 1.5; - border-bottom: 1px dashed var(--line-2); -} - -.gturn-branches { - padding: 8px; - display: flex; flex-direction: column; gap: 4px; -} -.gnode { - display: grid; - grid-template-columns: 14px 18px 1fr auto; - align-items: center; - gap: 8px; - padding: 6px 8px 6px 0; - border: 0; - background: transparent; - text-align: left; - border-radius: var(--r-sm); - position: relative; -} -.gnode-stem { - width: 14px; height: 1px; - background: var(--line); - margin-left: 2px; -} -.gnode:hover { background: var(--surface-2); } -.gnode-sel { background: var(--accent-soft); } -.gnode-active { background: var(--accent-soft); } -.gnode-body { display: flex; flex-direction: column; gap: 1px; min-width: 0; } -.gnode-tool { font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--fg-4); } -.gnode-title { font-size: 12px; color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.gnode-dur { font-size: 10.5px; color: var(--fg-4); } /* ─── Variant C — Inspector ───────────────────────────────────────────────── */ .rp-insp .insp-workspace { @@ -687,58 +341,6 @@ position: relative; overflow: hidden; } -.insp-list { - background: var(--surface); - border-bottom: 1px solid var(--line); - overflow-y: auto; - min-height: 0; - flex: 1 1 60%; -} -.insp-turn { - border-bottom: 1px solid var(--line-2); -} -.insp-turn-head { - display: flex; align-items: center; gap: 8px; - padding: 10px 14px 6px; - font-size: 12.5px; - font-weight: 600; -} -.insp-turn-bullet { width: 7px; height: 7px; border-radius: 99px; background: var(--ok); flex-shrink: 0; color: var(--accent); } -.insp-turn-active .insp-turn-bullet { background: var(--accent); } -.insp-turn-label { flex: 1; } -.insp-turn-meta { color: var(--fg-4); font-size: 10.5px; font-weight: 400; } -.insp-calls { - padding: 0 0 8px; - display: flex; - flex-direction: column; -} -.insp-call { - display: grid; - grid-template-columns: 18px auto 1fr auto; - align-items: center; - gap: 8px; - padding: 5px 14px 5px 28px; - border: 0; - background: transparent; - text-align: left; - font-size: 12px; - color: var(--fg-2); - border-left: 2px solid transparent; - position: relative; -} -.insp-call:hover { background: var(--surface-2); } -.insp-call-sel { background: var(--accent-soft); border-left-color: var(--accent); color: var(--fg); } -.insp-call-active { } -.insp-call-tool { font-size: 10px; text-transform: uppercase; color: var(--fg-4); letter-spacing: 0.06em; } -.insp-call-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.insp-call-dur { font-size: 10.5px; color: var(--fg-4); } - -.insp-detail { - background: var(--surface-2); - overflow-y: auto; - min-height: 0; - flex: 1; -} .current-activity { flex-shrink: 0; @@ -815,72 +417,7 @@ button.current-activity:hover { background: var(--surface-3); } text-overflow: ellipsis; } -.insp-drawer { - flex-shrink: 0; - min-height: 180px; - max-height: 70%; - display: flex; - flex-direction: column; - background: var(--surface-2); - border-top: 1px solid var(--line); - box-shadow: 0 -10px 30px rgba(0, 0, 0, 0.06); -} -.insp-drawer-handle { - height: 13px; - flex-shrink: 0; - display: flex; - align-items: center; - justify-content: center; - background: var(--surface); - border-bottom: 1px solid var(--line-2); - cursor: row-resize; - touch-action: none; -} -.insp-drawer-handle span { - width: 38px; - height: 4px; - border-radius: 99px; - background: var(--line); -} -.insp-drawer-handle:hover span { background: var(--fg-4); } -.insp-drawer .detail { - padding-top: 12px; -} - /* ─── Detail panel ────────────────────────────────────────────────────────── */ -.detail { padding: 16px 20px 24px; display: flex; flex-direction: column; gap: 16px; } -.detail-head { display: flex; flex-direction: column; gap: 8px; } -.detail-crumbs { font-size: 10.5px; color: var(--fg-4); display: flex; gap: 5px; } -.detail-titlerow { display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center; } -.detail-title { font-size: 15px; font-weight: 600; } -.detail-sub { font-size: 11px; color: var(--fg-3); margin-top: 2px; word-break: break-all; } -.detail-stats { display: flex; gap: 6px; flex-shrink: 0; } -.tool-icon-lg { width: 28px; height: 28px; font-size: 13px; border-radius: 6px; } - -.detail-section { - background: var(--surface); - border: 1px solid var(--line); - border-radius: var(--r-md); - overflow: hidden; -} -.detail-section-head { - display: flex; justify-content: space-between; align-items: center; - padding: 8px 12px; - background: var(--surface-2); - border-bottom: 1px solid var(--line-2); -} -.detail-section-label { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--fg-2); font-weight: 600; } -.detail-section-eyebrow { font-size: 10px; color: var(--fg-4); } -.detail-section-body { padding: 12px; font-size: 12.5px; } - -.reasoning { - font-style: italic; - color: var(--fg-2); - line-height: 1.55; - position: relative; - padding-left: 12px; -} -.reasoning-quote { color: var(--accent); font-size: 22px; font-weight: 600; line-height: 0; vertical-align: -8px; padding-right: 4px; font-style: normal; } .kv-grid { display: grid; @@ -892,45 +429,8 @@ button.current-activity:hover { background: var(--surface-3); } .kv-val-c { color: var(--fg); word-break: break-all; } /* ls table */ -.ls-table { font-size: 11.5px; } -.ls-row { - display: grid; - grid-template-columns: 1fr 60px 70px; - gap: 12px; - padding: 4px 8px; - align-items: center; -} -.ls-row:not(.ls-head):hover { background: var(--surface-2); } -.ls-head { color: var(--fg-4); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; padding-bottom: 6px; border-bottom: 1px solid var(--line-2); margin-bottom: 4px; } -.ls-name { display: inline-flex; align-items: center; gap: 6px; color: var(--fg); } -.ls-icon { width: 12px; color: var(--fg-4); display: inline-flex; justify-content: center; font-size: 9px; } -.ls-icon-dir { color: var(--accent); } -.ls-type { color: var(--fg-3); font-size: 10.5px; } -.ls-size { color: var(--fg-4); font-size: 10.5px; text-align: right; } /* read */ -.read-block { border: 1px solid var(--line); border-radius: var(--r-sm); overflow: hidden; } -.read-head { - display: flex; justify-content: space-between; - padding: 6px 10px; - background: var(--surface-2); - border-bottom: 1px solid var(--line-2); - font-size: 11px; - color: var(--fg-3); -} -.read-lang { color: var(--fg-4); text-transform: uppercase; font-size: 10px; } -.read-code { margin: 0; padding: 0; border: 0; border-radius: 0; max-height: 320px; overflow: auto; } -.code-line { display: grid; grid-template-columns: 36px 1fr; } -.code-ln { - background: var(--surface-2); - color: var(--fg-4); - text-align: right; - padding: 0 8px; - font-size: 10.5px; - user-select: none; - border-right: 1px solid var(--line-2); -} -.code-text { padding: 0 10px; white-space: pre; } /* grep */ .grep-list { display: flex; flex-direction: column; gap: 4px; } @@ -947,65 +447,12 @@ button.current-activity:hover { background: var(--surface-3); } .grep-ln { color: var(--fg-4); } .grep-snip { color: var(--fg); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } -.thought-box { - font-style: italic; - color: var(--fg-2); - line-height: 1.5; - font-size: 12.5px; - padding: 4px 0; -} - -.detail-empty { - height: 100%; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 10px; - padding: 40px; - color: var(--fg-4); -} -.detail-empty-glyph { font-size: 32px; color: var(--fg-4); } -.detail-empty-text { font-size: 12px; } - /* ─── Density: compact ────────────────────────────────────────────────────── */ -[data-density="compact"] .leftpane-inner { padding: 16px 16px 20px; gap: 16px; } -[data-density="compact"] .detail { padding: 12px 16px; gap: 12px; } -[data-density="compact"] .swim-lane { padding: 6px 14px; } -[data-density="compact"] .gturn { margin-bottom: 8px; } -[data-density="compact"] .insp-call { padding: 3px 14px 3px 28px; } -[data-density="compact"] .file-row { padding: 3px 0; } -[data-density="compact"] .msg-bubble { padding: 6px 10px; font-size: 12px; } [data-density="compact"] .plan-row { padding: 8px 14px; } .muted { color: var(--fg-4); font-size: 11.5px; } /* ─── Status Strip ────────────────────────────────────────────────────────── */ -.status-strip { - flex-shrink: 0; - position: sticky; - top: 0; - z-index: 20; - background: var(--surface-2); - border-bottom: 1px solid var(--line); - padding: 10px 18px 10px; - display: flex; - flex-direction: column; - gap: 6px; -} -.status-strip-row { - display: flex; - align-items: flex-start; - gap: 10px; -} -.status-strip-dot { - width: 8px; - height: 8px; - border-radius: 99px; - background: var(--fg-4); - flex-shrink: 0; - margin-top: 4px; -} .status-strip-dot.running { background: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); @@ -1015,40 +462,6 @@ button.current-activity:hover { background: var(--surface-3); } background: var(--err); box-shadow: 0 0 0 3px oklch(0.62 0.18 25 / 0.18); } -.status-strip-reasoning { - font-size: 12px; - font-style: italic; - color: var(--fg-2); - line-height: 1.5; - flex: 1; - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; - white-space: pre-wrap; -} -.status-strip-tool-row { - display: flex; - align-items: center; - gap: 7px; - font-size: 11.5px; - color: var(--fg-3); - min-width: 0; -} -.status-strip-tool-badge { - height: 18px; - padding: 0 6px; - border-radius: 3px; - font-family: var(--mono); - font-size: 10px; - font-weight: 600; - letter-spacing: 0.04em; - display: inline-flex; - align-items: center; - flex-shrink: 0; - background: var(--surface-3); - color: var(--fg-3); -} .status-strip-tool-badge.read { background: oklch(0.62 0.13 235 / 0.14); color: oklch(0.45 0.13 235); } .status-strip-tool-badge.write { background: oklch(0.62 0.16 145 / 0.14); color: oklch(0.4 0.16 145); } .status-strip-tool-badge.bash { background: oklch(0.18 0.01 260 / 0.85); color: white; } @@ -1058,49 +471,8 @@ button.current-activity:hover { background: var(--surface-3); } .dark .status-strip-tool-badge.write { color: oklch(0.78 0.16 145); } .dark .status-strip-tool-badge.bash { background: oklch(0.28 0.01 260); color: white; } .dark .status-strip-tool-badge.grep { color: oklch(0.78 0.18 305); } -.status-strip-tool-summary { - color: var(--fg-2); - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - flex: 1; -} -.status-strip-footer { - display: flex; - align-items: center; - gap: 10px; - margin-left: 18px; -} -.status-strip-phase-label { - font-family: var(--mono); - font-size: 10px; - text-transform: uppercase; - letter-spacing: 0.06em; - color: var(--fg-4); -} -.status-strip-phase-dots { - display: flex; - gap: 4px; - align-items: center; -} -.status-strip-phase-dot { - width: 5px; - height: 5px; - border-radius: 99px; - background: var(--line); -} .status-strip-phase-dot.done { background: var(--ok); } .status-strip-phase-dot.active { background: var(--accent); } -.status-strip-step-count { - font-size: 10.5px; - color: var(--fg-4); - font-family: var(--mono); -} -.status-strip-idle { - font-size: 12px; - color: var(--fg-4); - font-style: italic; -} /* ─── Timeline ────────────────────────────────────────────────────────────── */ .timeline { @@ -1539,121 +911,29 @@ button.current-activity:hover { background: var(--surface-3); } } - -.conversation-label { - position: sticky; - top: 0; - z-index: 5; - height: 30px; - display: flex; - align-items: center; - padding: 0 16px; - border-bottom: 1px solid var(--line-2); - background: var(--surface); - font-size: 10px; - text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--fg-4); -} - -.current-agent-card { - flex-shrink: 0; - padding: 14px 16px; - border-bottom: 1px solid var(--line); - background: var(--surface-2); - display: flex; - flex-direction: column; - gap: 10px; -} - -.current-agent-card.current-agent-attention { - background: oklch(0.72 0.14 75 / 0.08); -} - -.current-agent-card.current-agent-running { - background: var(--accent-soft); -} - -.current-agent-head { - display: flex; - justify-content: space-between; - gap: 12px; - align-items: flex-start; -} - -.current-agent-copy { - min-width: 0; -} - -.current-agent-eyebrow { - font-family: var(--mono); - font-size: 10px; - text-transform: uppercase; - letter-spacing: 0.08em; - color: var(--fg-4); -} - -.current-agent-title { - margin: 3px 0 0; - font-size: 14px; - line-height: 1.3; - font-weight: 650; - color: var(--fg); - overflow-wrap: anywhere; -} - -.current-agent-badge { - flex-shrink: 0; - max-width: 130px; - height: 22px; - padding: 0 8px; - border-radius: var(--r-sm); - background: var(--surface); - border: 1px solid var(--line); - color: var(--fg-3); - font-family: var(--mono); - font-size: 10px; - display: inline-flex; - align-items: center; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.current-agent-description { - color: var(--fg-2); - font-size: 12.5px; - line-height: 1.45; - white-space: pre-wrap; - overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 4; - -webkit-box-orient: vertical; -} - -.current-agent-actions { - display: flex; - flex-wrap: wrap; - gap: 6px; -} - -.current-agent-actions:empty { - display: none; -} - -.current-agent-actions button { - height: 28px; - padding: 0 10px; - border-radius: var(--r-md); - border: 1px solid var(--line); + +.conversation-label { + position: sticky; + top: 0; + z-index: 5; + height: 30px; + display: flex; + align-items: center; + padding: 0 16px; + border-bottom: 1px solid var(--line-2); background: var(--surface); - color: var(--fg-2); - font-size: 12px; + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.08em; + color: var(--fg-4); } -.current-agent-actions button:hover { - background: var(--surface-3); - color: var(--fg); +.current-agent-card.current-agent-attention { + background: oklch(0.72 0.14 75 / 0.08); +} + +.current-agent-card.current-agent-running { + background: var(--accent-soft); } .current-agent-actions .current-agent-primary { @@ -1774,64 +1054,12 @@ button.current-activity:hover { background: var(--surface-3); } min-height: 0; } -.changes-tab { - flex: 1; - min-height: 0; - display: flex; - flex-direction: column; -} - -.changes-file-strip { - flex-shrink: 0; - min-height: 44px; - display: flex; - align-items: center; - gap: 8px; - padding: 8px 14px; - overflow-x: auto; - border-bottom: 1px solid var(--line); - background: var(--surface); -} - -.changes-file-empty { - color: var(--fg-4); - font-size: 12px; -} - -.changes-file-chip { - min-width: 0; - max-width: 280px; - height: 28px; - display: inline-flex; - align-items: center; - gap: 7px; - padding: 0 10px 0 7px; - border: 1px solid var(--line); - border-radius: var(--r-md); - background: var(--surface-2); - color: var(--fg-2); - font-size: 12px; - flex: 0 0 auto; -} - .changes-file-chip.active { background: var(--accent-soft); color: var(--fg); border-color: oklch(0.58 0.18 var(--accent-h) / 0.30); } -.changes-file-mode { - width: 18px; - height: 18px; - border-radius: var(--r-sm); - display: inline-flex; - align-items: center; - justify-content: center; - font-family: var(--mono); - font-size: 10px; - font-weight: 650; -} - .changes-file-mode.read { background: oklch(0.62 0.13 235 / 0.14); color: var(--info); @@ -1842,49 +1070,6 @@ button.current-activity:hover { background: var(--surface-3); } color: var(--ok); } -.changes-file-path { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.changes-diff-viewer { - flex: 1; - min-height: 0; - display: flex; - align-items: center; - justify-content: center; - padding: 18px; - background: - linear-gradient(var(--line-2) 1px, transparent 1px), - linear-gradient(90deg, var(--line-2) 1px, transparent 1px), - var(--bg); - background-size: 28px 28px; -} - -.changes-empty-diff { - max-width: 360px; - text-align: center; - padding: 18px 22px; - border: 1px solid var(--line); - border-radius: var(--r-md); - background: var(--surface); -} - -.changes-empty-title { - color: var(--fg); - font-size: 14px; - font-weight: 650; -} - -.changes-empty-copy { - margin-top: 5px; - color: var(--fg-3); - font-size: 12px; - line-height: 1.45; -} - .activity-tab { flex: 1; min-height: 0; @@ -1893,74 +1078,11 @@ button.current-activity:hover { background: var(--surface-3); } background: var(--surface); } -.activity-list { - min-height: 0; - overflow-y: auto; - border-right: 1px solid var(--line); - background: var(--surface); - padding: 8px; -} - -.activity-row { - width: 100%; - min-width: 0; - display: grid; - grid-template-columns: 78px minmax(0, 1fr) auto; - align-items: start; - gap: 8px; - min-height: 48px; - padding: 7px 8px; - border: 0; - border-radius: var(--r-md); - background: transparent; - color: var(--fg-2); - text-align: left; -} - -.activity-row:hover { - background: var(--surface-2); - color: var(--fg); -} - .activity-row.active { background: var(--accent-soft); color: var(--fg); } -.activity-row-kind, -.activity-row-status { - font-family: var(--mono); - font-size: 10px; - text-transform: uppercase; - letter-spacing: 0.04em; - color: var(--fg-4); -} - -.activity-row-title { - display: block; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 12px; - color: var(--fg); -} -.activity-row-copy { - min-width: 0; -} -.activity-row-preview { - display: -webkit-box; - margin-top: 2px; - overflow: hidden; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - color: var(--fg-4); - font-family: var(--mono); - font-size: 10px; - line-height: 1.35; - overflow-wrap: anywhere; -} - .activity-row-status.running { color: var(--info); } @@ -2041,11 +1163,6 @@ button.current-activity:hover { background: var(--surface-3); } grid-template-columns: 1fr; grid-template-rows: minmax(160px, 0.5fr) minmax(220px, 1fr); } - - .activity-list { - border-right: 0; - border-bottom: 1px solid var(--line); - } } /* ─── Standalone-aligned workbench polish ─────────────────────────────────── */ @@ -2152,22 +1269,6 @@ button.current-activity:hover { background: var(--surface-3); } padding: 6px 12px; } -.current-agent-card { - position: relative; - padding: 13px 16px; - background: linear-gradient(180deg, var(--surface), var(--surface-2)); - gap: 9px; -} - -.current-agent-card::before { - content: ""; - position: absolute; - inset: 0 auto 0 0; - width: 3px; - background: var(--fg-4); - opacity: 0.35; -} - .current-agent-card.current-agent-running::before { background: var(--info); opacity: 1; @@ -2178,15 +1279,6 @@ button.current-activity:hover { background: var(--surface-3); } opacity: 1; } -.current-agent-title { - font-size: 14px; - letter-spacing: 0; -} - -.current-agent-description { - max-width: 78ch; -} - @@ -2201,17 +1293,6 @@ button.current-activity:hover { background: var(--surface-3); } background: var(--surface-2); } -.activity-list { - padding: 10px 8px; -} - -.activity-row { - grid-template-columns: 74px minmax(0, 1fr) auto; - min-height: 50px; - padding: 8px; - border-left: 2px solid transparent; -} - .activity-row.active { border-left-color: var(--accent); } @@ -2242,24 +1323,6 @@ button.current-activity:hover { background: var(--surface-3); } /* Brand mark: a deliberate monogram that does NOT read as a status dot. Solid foreground square with a corner-notch — distinctive at 22px. */ -.brand-mark { - position: relative; - width: 22px; - height: 22px; - border-radius: 5px; - background: var(--fg); - box-shadow: none; -} -.brand-mark::after { - content: ""; - position: absolute; - right: 4px; - bottom: 4px; - width: 6px; - height: 6px; - border-radius: 2px; - background: var(--accent); -} /* ─── Brand logo (shared) ─────────────────────────────────────────────────── */ .cv-logo { @@ -3310,12 +2373,6 @@ button.current-activity:hover { background: var(--surface-3); } border-right: 0; border-bottom: 1px solid var(--line); } - - .room-status-strip, - .room-status-left, - .room-status-right { - flex-wrap: wrap; - } } /* ─── Room UI correction pass ─────────────────────────────────────────────── */ @@ -3406,10 +2463,6 @@ button.current-activity:hover { background: var(--surface-3); } font-size: 13px; } -.insp-detail { - display: none; -} - /* ─── Standalone typography alignment ─────────────────────────────────────── */ .session-shell { font-family: var(--sans); @@ -3682,17 +2735,6 @@ button.current-activity:hover { background: var(--surface-3); } /* ─── Chat input polish ───────────────────────────────────────────────────── */ - - - - - - - -@media (max-width: 560px) { - .chat-input-hint { display: none; } -} - /* ─── Agent working / typing indicator ────────────────────────────────────── */ .timeline-working { display: flex; @@ -4269,59 +3311,6 @@ mark.annotation-highlight { } /* ─── Question Card ──────────────────────────────────────────────────────── */ -.question-panel { - display: flex; - flex-direction: column; - gap: 10px; - padding: 14px; - border: 1px solid var(--line); - border-radius: var(--r-lg); - background: var(--surface-2); -} - -.question-panel-header { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 12px; -} - -.question-panel-eyebrow { - margin: 0 0 2px; - font-size: 10px; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.07em; - color: var(--accent); -} - -.question-panel-title { - margin: 0; - font-size: 13px; - font-weight: 600; - color: var(--fg); -} - -.question-panel-count { - flex-shrink: 0; - display: flex; - align-items: center; - justify-content: center; - width: 22px; - height: 22px; - border-radius: 50%; - background: var(--accent-soft); - font-size: 11.5px; - font-weight: 700; - color: var(--accent); -} - - -.question-panel-list { - display: flex; - flex-direction: column; - gap: 10px; -} diff --git a/packages/worker/src/ws-token.ts b/packages/worker/src/ws-token.ts index 7d1b64f..6661cd8 100644 --- a/packages/worker/src/ws-token.ts +++ b/packages/worker/src/ws-token.ts @@ -1,19 +1,19 @@ import { AuthRoleSchema } from "@codevil/shared"; import { isRecord } from "@codevil/shared"; +import { createCapabilityToken, verifyCapabilityToken } from "./capability-token.js"; import type { SocketAuthContext } from "./ws-authorization.js"; -const TOKEN_VERSION = "v1"; +const SOCKET_AUTH_AUDIENCE = "socket_auth"; /** Short TTL — token is only used during the WebSocket upgrade handshake. */ -export const SOCKET_AUTH_TOKEN_TTL_MS = 5 * 60 * 1000; +export const SOCKET_AUTH_TOKEN_TTL_SECONDS = 5 * 60; -interface SocketAuthTokenPayload { +interface SocketAuthClaims { uid: string; email: string; name: string; role: SocketAuthContext["role"]; sid: string; - exp: number; } export function sessionIdFromWebSocketPath(pathname: string): string | null { @@ -21,70 +21,25 @@ export function sessionIdFromWebSocketPath(pathname: string): string | null { return match?.[1] ?? null; } -function base64UrlEncode(bytes: Uint8Array): string { - let binary = ""; - for (const byte of bytes) binary += String.fromCharCode(byte); - return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/g, ""); -} - -function base64UrlEncodeString(value: string): string { - return base64UrlEncode(new TextEncoder().encode(value)); -} - -function base64UrlDecode(value: string): Uint8Array | null { - try { - const padded = value.replace(/-/g, "+").replace(/_/g, "/") + "===".slice((value.length + 3) % 4); - const binary = atob(padded); - const bytes = new Uint8Array(binary.length); - for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i); - return bytes; - } catch { - return null; - } -} - -async function signPayload(payload: string, secret: string): Promise { - const key = await crypto.subtle.importKey( - "raw", - new TextEncoder().encode(secret), - { name: "HMAC", hash: "SHA-256" }, - false, - ["sign"], - ); - const signature = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(payload)); - return base64UrlEncode(new Uint8Array(signature)); -} - -async function verifySignature(payload: string, signature: string, secret: string): Promise { - const key = await crypto.subtle.importKey( - "raw", - new TextEncoder().encode(secret), - { name: "HMAC", hash: "SHA-256" }, - false, - ["verify"], - ); - const sigBytes = base64UrlDecode(signature); - if (!sigBytes) return false; - return crypto.subtle.verify("HMAC", key, sigBytes, new TextEncoder().encode(payload)); -} - export async function createSocketAuthToken( auth: SocketAuthContext, sessionId: string, secret: string, now = Date.now(), ): Promise { - const payload: SocketAuthTokenPayload = { + const claims: SocketAuthClaims = { uid: auth.userId, email: auth.email, name: auth.name, role: auth.role, sid: sessionId, - exp: now + SOCKET_AUTH_TOKEN_TTL_MS, }; - const encodedPayload = base64UrlEncodeString(JSON.stringify(payload)); - const signature = await signPayload(encodedPayload, secret); - return `${TOKEN_VERSION}.${encodedPayload}.${signature}`; + return createCapabilityToken(secret, { + audience: SOCKET_AUTH_AUDIENCE, + claims, + nowSeconds: Math.floor(now / 1000), + ttlSeconds: SOCKET_AUTH_TOKEN_TTL_SECONDS, + }); } export async function verifySocketAuthToken( @@ -93,40 +48,26 @@ export async function verifySocketAuthToken( secret: string, now = Date.now(), ): Promise { - if (!token) return null; - - const parts = token.split("."); - if (parts.length !== 3 || parts[0] !== TOKEN_VERSION) return null; - - const encodedPayload = parts[1]; - const signature = parts[2]; - if (!encodedPayload || !signature) return null; - - if (!(await verifySignature(encodedPayload, signature, secret))) return null; - - const payloadBytes = base64UrlDecode(encodedPayload); - if (!payloadBytes) return null; - - let parsed: unknown; - try { - parsed = JSON.parse(new TextDecoder().decode(payloadBytes)); - } catch { - return null; - } - if (!isRecord(parsed)) return null; - - if (parsed.sid !== sessionId) return null; - if (typeof parsed.exp !== "number" || parsed.exp < now) return null; - - const role = AuthRoleSchema.safeParse(parsed.role); + const envelope = await verifyCapabilityToken>(token, secret, { + audience: SOCKET_AUTH_AUDIENCE, + nowSeconds: Math.floor(now / 1000), + maxLifetimeSeconds: SOCKET_AUTH_TOKEN_TTL_SECONDS, + }); + if (!envelope) return null; + + const claims = envelope.claims; + if (!isRecord(claims)) return null; + if (claims.sid !== sessionId) return null; + if (typeof claims.uid !== "string" || claims.uid.length === 0) return null; + if (typeof claims.email !== "string" || claims.email.length === 0) return null; + + const role = AuthRoleSchema.safeParse(claims.role); if (!role.success) return null; - if (typeof parsed.uid !== "string" || parsed.uid.length === 0) return null; - if (typeof parsed.email !== "string" || parsed.email.length === 0) return null; return { - userId: parsed.uid, - email: parsed.email, - name: typeof parsed.name === "string" && parsed.name.length > 0 ? parsed.name : parsed.email, + userId: claims.uid, + email: claims.email, + name: typeof claims.name === "string" && claims.name.length > 0 ? claims.name : claims.email, role: role.data, }; } diff --git a/packages/worker/test/ws-authorization.test.mjs b/packages/worker/test/ws-authorization.test.mjs index 4195fb2..7f8e53b 100644 --- a/packages/worker/test/ws-authorization.test.mjs +++ b/packages/worker/test/ws-authorization.test.mjs @@ -9,7 +9,7 @@ import { import { createSocketAuthToken, sessionIdFromWebSocketPath, - SOCKET_AUTH_TOKEN_TTL_MS, + SOCKET_AUTH_TOKEN_TTL_SECONDS, verifySocketAuthToken, } from "../dist/ws-token.js"; @@ -50,7 +50,7 @@ test("verifySocketAuthToken rejects forged, expired, and session-mismatched toke assert.equal(await verifySocketAuthToken(token, "ses_2", SECRET, now), null); assert.equal(await verifySocketAuthToken(token, "ses_1", "wrong-secret", now), null); assert.equal( - await verifySocketAuthToken(token, "ses_1", SECRET, now + SOCKET_AUTH_TOKEN_TTL_MS + 1), + await verifySocketAuthToken(token, "ses_1", SECRET, now + SOCKET_AUTH_TOKEN_TTL_SECONDS * 1000 + 1), null, ); assert.equal(await verifySocketAuthToken("not-a-token", "ses_1", SECRET, now), null); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a4aaf42..b78059e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,10 +85,10 @@ importers: dependencies: '@astrojs/react': specifier: ^4 - version: 4.4.2(@types/node@24.12.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yaml@2.8.3) + version: 4.4.2(@types/node@24.12.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yaml@2.9.0) astro: specifier: ^5 - version: 5.18.2(@types/node@24.12.2)(aws4fetch@1.0.20)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.2)(typescript@5.9.3)(yaml@2.8.3) + version: 5.18.2(@types/node@24.12.2)(aws4fetch@1.0.20)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.2)(typescript@5.9.3)(yaml@2.9.0) react: specifier: ^19 version: 19.2.5 @@ -98,7 +98,7 @@ importers: devDependencies: '@tailwindcss/vite': specifier: ^4 - version: 4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + version: 4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) '@types/react': specifier: ^19 version: 19.2.14 @@ -110,7 +110,7 @@ importers: version: 4.2.4 vitest: specifier: ^3 - version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) packages/web: dependencies: @@ -129,9 +129,6 @@ importers: clsx: specifier: ^2.1.1 version: 2.1.1 - lucide-react: - specifier: ^1.11.0 - version: 1.11.0(react@19.2.5) radix-ui: specifier: ^1.4.3 version: 1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) @@ -144,15 +141,9 @@ importers: react-markdown: specifier: ^10 version: 10.1.0(@types/react@19.2.14)(react@19.2.5) - react-resizable-panels: - specifier: ^4.10.0 - version: 4.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) remark-gfm: specifier: ^4 version: 4.0.1 - shiki: - specifier: ^3 - version: 3.23.0 tailwind-merge: specifier: ^3.5.0 version: 3.5.0 @@ -165,13 +156,10 @@ importers: version: 0.5.19(tailwindcss@4.2.4) '@tailwindcss/vite': specifier: ^4 - version: 4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) - '@tanstack/react-router-devtools': - specifier: ^1 - version: 1.166.13(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + version: 4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) '@tanstack/router-plugin': specifier: ^1 - version: 1.167.27(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + version: 1.167.27(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) '@types/react': specifier: ^19 version: 19.2.14 @@ -180,7 +168,7 @@ importers: version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': specifier: ^4 - version: 4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + version: 4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) tailwindcss: specifier: ^4 version: 4.2.4 @@ -189,10 +177,10 @@ importers: version: 5.9.3 vite: specifier: ^6 - version: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + version: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) vitest: specifier: ^3 - version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) packages/worker: dependencies: @@ -204,7 +192,7 @@ importers: version: link:../shared better-auth: specifier: ^1.6.14 - version: 1.6.14(@cloudflare/workers-types@4.20260702.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + version: 1.6.14(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) zod: specifier: ^4.3.6 version: 4.3.6 @@ -256,10 +244,6 @@ packages: resolution: {integrity: sha512-UFBgfeldP06qu6khs/yY+q1cDAaArM2/7AEIqQ9Cuvf7B1hNLq0xDrZkct+QoIGyjq56y8IaE2I3CTvG99mlhQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0} - '@aws-crypto/crc32@5.2.0': - resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} - engines: {node: '>=16.0.0'} - '@aws-crypto/sha256-browser@5.2.0': resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} @@ -273,154 +257,66 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-bedrock-runtime@3.1033.0': - resolution: {integrity: sha512-CDI4njdtLEd3voxApQMI32IJN/HhpM3FtAh0quJ+aIWNmyDbW3cp2SwQ56Pnsrq1OV40Apw/O4yD822K4aK9HA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/client-bedrock-runtime@3.1048.0': resolution: {integrity: sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.974.2': - resolution: {integrity: sha512-oav5AOAz+1XkwUfp6SrEm42UPDpUP5D4jNYXkDwFR1VfWqYX62+jpytdfzURmJ9McSoJIQwi0OJlC4oCi6t0VQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.974.26': resolution: {integrity: sha512-wRj7Pthvjk3anees97pUWlxlTa0DUjeGrEQU5fKDZVdWZV0ekaprbof0df2uaE9g8u67t035v2j+ne2AW2UMkA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.28': - resolution: {integrity: sha512-87GdRJ2OR0qR4VkMjXN/SZi66DZsunW2qQCbtw9rKw3Y7JurFi6tQWYKOSLY/gOADrU6OxGqFmdw3hKzZqDZOQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.52': resolution: {integrity: sha512-sxuaHZGHqOgKB8OdL3doXa1NJjqmO60FPfyTnYVKGjX9taRsIEGS9pd+2yALmo06hijZ8L94uSK0kfXZsRmVyA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.30': - resolution: {integrity: sha512-6quozmW2PKwBJTUQLb+lk1q8w5Pm45qaqhx4Tld9EIqYYQOVGj+MT0a8NRVS7QgWJj7rzGlB7rQu3KYBFHemJw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.54': resolution: {integrity: sha512-e6yz52nq3SpR1oPLcvfsDM7H7k2gIYk/NSn/rwsFqzGXEwr3g0mRMlPbLaKCPCGNZJMU/gZg6/64B3eSam+gBw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.32': - resolution: {integrity: sha512-Nkr+UKtczZlocUjc6g96WzQadZSIZO/HVXPki4qbfaVOZYSbfLQKWKfADtJ0kGYsCvSYOZrO66tSc9dkboUt/w==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.59': resolution: {integrity: sha512-9Um/UpruN76AdpiLnvwChVkJJwJ9Vx9ykk/2AeLxxSCM/YYRD8Kkq2towUk9fZQLV7dd9ATlsi87U7hKs0z/iQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.32': - resolution: {integrity: sha512-UxgwT1HmZz1QPXuBy5ZUPJNFXOSlhwdQL61eGhWRthF0xRrT02BCOVJ1p5Ejg5AXfnESTWoKPJ7v/sCkNUtB9g==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.58': resolution: {integrity: sha512-H3q96qF8/DJsPsXMVtMRqSWOc85K5O4zos32untdw+vE5vw0f3a6qJo1YqbND4BsEIKd4iZmzzVUq9kV4LjbHg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.33': - resolution: {integrity: sha512-6pGQnEdSeRvBViTQh/FwaRKB38a3Th+W2mVxuvqAd2Z1Ayo3e6eJ5QqJoZwEMwR6xoxkl3wz3qAfiB1xRhMC+w==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.61': resolution: {integrity: sha512-2U2KHMRCt1dlZoLU3KZR5g5EL4b0h2HHw96SkaUBK7qvEXPZj5rGRO/3ZTeJmh37dIYQuCnA2273rZOQvmsiHw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.28': - resolution: {integrity: sha512-CRAlD8u6oNBhjnX/3ekVGocarD+lFmEn/qeDzytgIdmwrmwMJGFPqS9lGwEfhOTihZKrQ0xSp3z6paX+iXJJhA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.52': resolution: {integrity: sha512-Aff9Ebs42lz+Ep1wkS+Nlwh5S0eahakpyskPsuKGjiBJ6ExOjNtxbfKJTKovQtQNgJ7oG1BH6esJwGrbs7qgSA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.32': - resolution: {integrity: sha512-whhmQghRYOt9mJxFyVMhX7eB8n0oA25OCvqoR7dzFAZjmioCkf7WVB22Bc6llM5cFpBXFX7s4Jv+xVq32VPGWg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.58': resolution: {integrity: sha512-syloC58mXOacUqM2toPNfwd7X3jT+tWj0F/cN7qdW1FQyI0q41J0tPf6DIZ56BF0x82iS9j3ALP45MoBz79YuQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.32': - resolution: {integrity: sha512-Z0Y0LDaqyQDznlmr9gv6n4+eWKKWNgmi9j5L6RENr6wyOCguhO8FRPmqDbVLSw0DPdMqICKnA3PurJiS8bD6Cw==} - engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.58': resolution: {integrity: sha512-pTBImKzcGK+pcMKjL0fAJbnYzzYd1c0UDc7BSIOGNQhF9Nuk66vWlIXfYTYyzNSs+w8Q/vfbbNDDU8zdrouwLg==} engines: {node: '>=20.0.0'} - '@aws-sdk/eventstream-handler-node@3.972.14': - resolution: {integrity: sha512-m4X56gxG76/CKfxNVbOFuYwnAZcHgS6HOH8lgp15HoGHIAVTcZfZrXvcYzJFOMLEJgVn+JHBu6EiNV+xSNXXFg==} - engines: {node: '>=20.0.0'} - '@aws-sdk/eventstream-handler-node@3.972.25': resolution: {integrity: sha512-df7HN1ozwMrB9+59re9PM7tSLxLAcheMWc5u/KyfCPCAWtN/vP7y7RTUZOy48uT1K9MESisVeOPPzF3O1AW01A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-eventstream@3.972.10': - resolution: {integrity: sha512-QUqLs7Af1II9X4fCRAu+EGHG3KHyOp4RkuLhRKoA3NuFlh6TL8i+zXBl8w2LUxqm44B/Kom45hgSlwA1SpTsXQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-eventstream@3.972.21': resolution: {integrity: sha512-HvLgDnxBLaHi9E5K++6Vuk+1+qqn7Pmn8zrlzd+NXH3jBzwujnuzZtAR9WHPkbUGPO92FkoQWj/M1IsdxTlBmQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.10': - resolution: {integrity: sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-logger@3.972.10': - resolution: {integrity: sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-recursion-detection@3.972.11': - resolution: {integrity: sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-sdk-s3@3.972.31': - resolution: {integrity: sha512-5hS08Fp0Rm+59uGCmkWhZmveXiA7OUV7Wa+IARejdzf9JTZ1qAVeIOE9JoBpsLPvUgEjmsGNHBuFbtGmYyqiqQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-user-agent@3.972.32': - resolution: {integrity: sha512-HQ0x9DDKqLZOGhDiL2eicYXXkYT5dogE4mw0lAfHCpJ6t7MM0PNIsJl2TZzWKU9SpBzOMXHRa7K6ZLKUJu1y0w==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-websocket@3.972.16': - resolution: {integrity: sha512-86+S9oCyRVGzoMRpQhxkArp7kD2K75GPmaNevd9B6EyNhWoNvnCZZ3WbgN4j7ZT+jvtvBCGZvI2XHsWZJ+BRIg==} - engines: {node: '>= 14.0.0'} - '@aws-sdk/middleware-websocket@3.972.34': resolution: {integrity: sha512-8dxKLu5bC74SLwwoYV8RIiCD48jMbMt1Ccl3m+xtQJKet6QsZ4xzJlK6UDg7QNEzm/ZCUknJfGsBHmhkgOfuIQ==} engines: {node: '>= 14.0.0'} - '@aws-sdk/nested-clients@3.997.0': - resolution: {integrity: sha512-4bI5GHjUiY5R8N6PtchpG6tW2Dl8I2IcZNg3JwqwxHRXjfvQlPoo4VMknG4qkd5W0t3Y20rQ6C7pSR561YG5JQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.997.26': resolution: {integrity: sha512-Lwe3F6K7bs+jEubp1LbrvzeMBYb5fMazJ1IxV9TtKWPF8CSh67Fmwyq9fLz3NL/k55Dfpuph5Dimw76JFgr+SA==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.12': - resolution: {integrity: sha512-QQI43Mxd53nBij0pm8HXC+t4IOC6gnhhZfzxE0OATQyO6QfPV4e+aTIRRuAJKA6Nig/cR8eLwPryqYTX9ZrjAQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.996.19': - resolution: {integrity: sha512-7Sy8+GhfwUi06NQNLplxuJuXMKJURDsNQfK8yTW6E9wN2J1B+8S5dWZG7vg3InvPPhaXqkcYTr8pzeE+dLjMbQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.996.38': resolution: {integrity: sha512-C379Sk+MiFZCfWZphKlMyLHKxV22OjoGM5KJjj5IJNJcOCWL4IGIpnEGzv1FQiRwhYXfq55SJMfxlqPE08JJ9g==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1033.0': - resolution: {integrity: sha512-/TsXhqjyRAFb0xVgmbFAha3cJfZdWjnyn6ohJ3AB4E3peLgxNcmKfYr45hruHymyJAydiHoXC3N1a8qgl41cog==} - engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1048.0': resolution: {integrity: sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA==} engines: {node: '>=20.0.0'} @@ -437,38 +333,10 @@ packages: resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.972.3': - resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.996.7': - resolution: {integrity: sha512-ty4LQxN1QC+YhUP28NfEgZDEGXkyqOQy+BDriBozqHsrYO4JMgiPhfizqOGF7P+euBTZ5Ez6SKlLAMCLo8tzmw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-format-url@3.972.10': - resolution: {integrity: sha512-DEKiHNJVtNxdyTeQspzY+15Po/kHm6sF0Cs4HV9Q2+lplB63+DrvdeiSoOSdWEWAoO2RcY1veoXVDz2tWxWCgQ==} - engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.5': resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.10': - resolution: {integrity: sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==} - - '@aws-sdk/util-user-agent-node@3.973.18': - resolution: {integrity: sha512-Nh4YvAL0Mzv5jBvzXLFL0tLf7WPrRMnYZQ5jlFuyS0xiVJQsObMUKAkbYjmt/e04wpQqUaa+Is7k+mBr89A9yA==} - engines: {node: '>=20.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true - - '@aws-sdk/xml-builder@3.972.18': - resolution: {integrity: sha512-BMDNVG1ETXRhl1tnisQiYBef3RShJ1kfZA7x7afivTFMLirfHNTb6U71K569HNXhSXbQZsweHvSDZ6euBw8hPA==} - engines: {node: '>=20.0.0'} - '@aws-sdk/xml-builder@3.972.33': resolution: {integrity: sha512-ezbwz9WpuLctm6o7P2t2naDhVVPI5jFGrVefVybhcKGjU57VIyT46pQVO0RI2RYkUdhdj2Z9uSIlAzGZE9NW9A==} engines: {node: '>=20.0.0'} @@ -672,9 +540,6 @@ packages: '@better-fetch/fetch@1.1.21': resolution: {integrity: sha512-/ImESw0sskqlVR94jB+5+Pxjf+xBwDZF/N5+y2/q4EqD7IARUTSpPfIo8uf39SYpCxyOCtbyYpUrZ3F/k0zT4A==} - '@borewit/text-codec@0.2.2': - resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} - '@capsizecss/unpack@4.0.0': resolution: {integrity: sha512-VERIM64vtTP1C4mxQ5thVT9fK0apjPFobqybMtA1UdUujWka24ERHbRHFGmpbbhp73MhV+KSsHQH9C6uOTdEQA==} engines: {node: '>=18'} @@ -1094,15 +959,6 @@ packages: '@floating-ui/utils@0.2.11': resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} - '@google/genai@1.50.1': - resolution: {integrity: sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==} - engines: {node: '>=20.0.0'} - peerDependencies: - '@modelcontextprotocol/sdk': ^1.25.2 - peerDependenciesMeta: - '@modelcontextprotocol/sdk': - optional: true - '@google/genai@1.52.0': resolution: {integrity: sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q==} engines: {node: '>=20.0.0'} @@ -1352,9 +1208,6 @@ packages: resolution: {integrity: sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA==} engines: {node: '>= 10'} - '@mistralai/mistralai@2.2.1': - resolution: {integrity: sha512-uKU8CZmL2RzYKmplsU01hii4p3pe4HqJefpWNRWXm1Tcm0Sm4xXfwSLIy4k7ZCPlbETCGcp69E7hZs+WOJ5itQ==} - '@mistralai/mistralai@2.2.6': resolution: {integrity: sha512-W8pX7zHxjJvMIpw8JMxeJEleapXX0Q9NPszdNzqkM3MIEoIGPObdodujj+WHteXEvGfaP/AMwlNyRfEzSY6dQQ==} peerDependencies: @@ -2288,105 +2141,26 @@ packages: '@silvia-odwyer/photon-node@0.3.4': resolution: {integrity: sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA==} - '@sinclair/typebox@0.34.49': - resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} - '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} - '@smithy/config-resolver@4.4.17': - resolution: {integrity: sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.23.16': - resolution: {integrity: sha512-JStomOrINQA1VqNEopLsgcdgwd42au7mykKqVr30XFw89wLt9sDxJDi4djVPRwQmmzyTGy/uOvTc2ultMpFi1w==} - engines: {node: '>=18.0.0'} - '@smithy/core@3.29.0': resolution: {integrity: sha512-sEvpvkBVoMxjoek35XyJFn2ZD3EJ1RpiZrT47WaZodxzAIWS44zkdvbqGE/ZlugtjiQp62cffYZ9ldyRkjAGnA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.14': - resolution: {integrity: sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==} - engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.4.5': resolution: {integrity: sha512-LnjUTNG0GgQlKIq7IioeOrPaEmC5xOd1WtAz24TLSiYQnWX2uHr53GrFuQhkrJBktPYCMga/NbUOW7hFbSA2Cg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.14': - resolution: {integrity: sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.2.14': - resolution: {integrity: sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-config-resolver@4.3.14': - resolution: {integrity: sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-node@4.2.14': - resolution: {integrity: sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-universal@4.2.14': - resolution: {integrity: sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==} - engines: {node: '>=18.0.0'} - - '@smithy/fetch-http-handler@5.3.17': - resolution: {integrity: sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==} - engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.6.2': resolution: {integrity: sha512-q96PSDOAGw+X+nuELd7Cjebps0SYr+YlPbviEX9sLVw+VM4M7VV8hn1nL1mGS6urDu33eQ5A7WhlphaDO6kUyQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.14': - resolution: {integrity: sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.14': - resolution: {integrity: sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==} - engines: {node: '>=18.0.0'} - '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.2': - resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.2.14': - resolution: {integrity: sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.4.31': - resolution: {integrity: sha512-KJPdCIN2kOE2aGmqZd7eUTr4WQwOGgtLWgUkswGJggs7rBcQYQjcZMEDa3C0DwbOiXS9L8/wDoQHkfxBYLfiLw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.5.4': - resolution: {integrity: sha512-/z7nIFK+ZRW3Ie/l3NEVGdy34LvmEOzBrtBAvgWZ/4PrKX0xP3kWm8pkfcwUk523SqxZhdbQP9JSXgjF77Uhpw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.2.19': - resolution: {integrity: sha512-Q6y+W9h3iYVMCKWDoVge+OC1LKFqbEKaq8SIWG2X2bWJRpd/6dDLyICcNLT6PbjH3Rr6bmg/SeDB25XFOFfeEw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.2.14': - resolution: {integrity: sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.3.14': - resolution: {integrity: sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==} - engines: {node: '>=18.0.0'} - - '@smithy/node-http-handler@4.6.0': - resolution: {integrity: sha512-P734cAoTFtuGfWa/R3jgBnGlURt2w9bYEBwQNMKf58sRM9RShirB2mKwLsVP+jlG/wxpCu8abv8NxdUts8tdLA==} - engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.7.3': resolution: {integrity: sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA==} engines: {node: '>=18.0.0'} @@ -2395,42 +2169,10 @@ packages: resolution: {integrity: sha512-s0yAIRj6TVfHgl+QzVyqal1KMGZ9B5512IrxKc6+dOpw8fUmFL3CvuAhjv0J+aNjUPfVZ2IhqPEDvkB5Ncx9oA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.14': - resolution: {integrity: sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==} - engines: {node: '>=18.0.0'} - - '@smithy/protocol-http@5.3.14': - resolution: {integrity: sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-builder@4.2.14': - resolution: {integrity: sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==} - engines: {node: '>=18.0.0'} - - '@smithy/querystring-parser@4.2.14': - resolution: {integrity: sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==} - engines: {node: '>=18.0.0'} - - '@smithy/service-error-classification@4.3.0': - resolution: {integrity: sha512-9jKsBYQRPR0xBLgc2415RsA5PIcP2sis4oBdN9s0D13cg1B1284mNTjx9Yc+BEERXzuPm5ObktI96OxsKh8E9A==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.4.9': - resolution: {integrity: sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.3.14': - resolution: {integrity: sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==} - engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.6.1': resolution: {integrity: sha512-SqvuP75p/DmgWWI7jv4kf/UW+V4LFmlUn19s604SgAcRuJRB1vDnWwzZMYCLUcmKxko9wDn6iLgGEIpTNgZbIQ==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.12': - resolution: {integrity: sha512-daO7SJn4eM6ArbmrEs+/BTbH7af8AEbSL3OMQdcRvvn8tuUcR5rU2n6DgxIV53aXMS42uwK8NgKKCh5XgqYOPQ==} - engines: {node: '>=18.0.0'} - '@smithy/types@4.14.1': resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} engines: {node: '>=18.0.0'} @@ -2439,78 +2181,14 @@ packages: resolution: {integrity: sha512-x3L0XSACF6UYzKpa9biqiRMgvH5+wnFFew9Tm/grFYqgaupPwx/+ojDPpPJM8dZON3S9tjz5U+PQYsCBd1Mw5Q==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.14': - resolution: {integrity: sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-base64@4.3.2': - resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-browser@4.2.2': - resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-body-length-node@4.2.3': - resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} - engines: {node: '>=18.0.0'} - '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.2': - resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} - engines: {node: '>=18.0.0'} - - '@smithy/util-config-provider@4.2.2': - resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-browser@4.3.48': - resolution: {integrity: sha512-hxVRVPYaRDWa6YQdse1aWX1qrksmLsvNyGBKdc32q4jFzSjxYVNWfstknAfR228TnzS4tzgswXRuYIbhXBuXFQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.2.53': - resolution: {integrity: sha512-ybgCk+9JdBq8pYC8Y6U5fjyS8e4sboyAShetxPNL0rRBtaVl56GSFAxsolVBIea1tXR4LPIzL8i6xqmcf0+DCQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.4.2': - resolution: {integrity: sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.2.2': - resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.2.14': - resolution: {integrity: sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.3.3': - resolution: {integrity: sha512-idjUvd4M9Jj6rXkhqw4H4reHoweuK4ZxYWyOrEp4N2rOF5VtaOlQGLDQJva/8WanNXk9ScQtsAb7o5UHGvFm4A==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.5.24': - resolution: {integrity: sha512-na5vv2mBSDzXewLEEoWGI7LQQkfpmFEomBsmOpzLFjqGctm0iMwXY5lAwesY9pIaErkccW0qzEOUcYP+WKneXg==} - engines: {node: '>=18.0.0'} - - '@smithy/util-uri-escape@4.2.2': - resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} - engines: {node: '>=18.0.0'} - '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.2': - resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} - engines: {node: '>=18.0.0'} - - '@smithy/uuid@1.1.2': - resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} - engines: {node: '>=18.0.0'} - '@speed-highlight/core@1.2.15': resolution: {integrity: sha512-BMq1K3DsElxDWawkX6eLg9+CKJrTVGCBAWVuHXVUV2u0s2711qiChLSId6ikYPfxhdYocLNt3wWwSvDiTvFabw==} @@ -2620,18 +2298,6 @@ packages: resolution: {integrity: sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==} engines: {node: '>=20.19'} - '@tanstack/react-router-devtools@1.166.13': - resolution: {integrity: sha512-6yKRFFJrEEOiGp5RAAuGCYsl81M4XAhJmLcu9PKj+HZle4A3dsP60lwHoqQYWHMK9nKKFkdXR+D8qxzxqtQbEA==} - engines: {node: '>=20.19'} - peerDependencies: - '@tanstack/react-router': ^1.168.15 - '@tanstack/router-core': ^1.168.11 - react: '>=18.0.0 || >=19.0.0' - react-dom: '>=18.0.0 || >=19.0.0' - peerDependenciesMeta: - '@tanstack/router-core': - optional: true - '@tanstack/react-router@1.168.24': resolution: {integrity: sha512-CQWd9ywDZU6icG65SrjJMzWcNg/ehBKFxfxYssKSuELk0eM9SzJxJ3JBI760kdLXIsXewOX9PHpJDknxC/R5Ag==} engines: {node: '>=20.19'} @@ -2650,16 +2316,6 @@ packages: engines: {node: '>=20.19'} hasBin: true - '@tanstack/router-devtools-core@1.167.3': - resolution: {integrity: sha512-fJ1VMhyQgnoashTrP763c2HRc9kofgF61L7Jb3F6eTHAmCKtGVx8BRtiFt37sr3U0P0jmaaiiSPGP6nT5JtVNg==} - engines: {node: '>=20.19'} - peerDependencies: - '@tanstack/router-core': ^1.168.11 - csstype: ^3.0.10 - peerDependenciesMeta: - csstype: - optional: true - '@tanstack/router-generator@1.166.35': resolution: {integrity: sha512-d3tdUTf6QRjMW4V2P91mE8OR0haHgGktkLOs3zQmirEokQhu2qgoVfcSxLF6DfmMR6smvDjwdeMdy2sudImuFQ==} engines: {node: '>=20.19'} @@ -2698,16 +2354,6 @@ packages: engines: {node: '>=20.19'} hasBin: true - '@tokenizer/inflate@0.4.1': - resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} - engines: {node: '>=18'} - - '@tokenizer/token@0.3.0': - resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -2741,9 +2387,6 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mime-types@2.1.4': - resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} - '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} @@ -2773,9 +2416,6 @@ packages: '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} deprecated: Potential CWE-502 - Update to 1.3.1 or higher @@ -2835,10 +2475,6 @@ packages: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} @@ -2847,9 +2483,6 @@ packages: resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} engines: {node: '>=14'} - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2872,10 +2505,6 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - astro@5.18.2: resolution: {integrity: sha512-TnFwLnAXty5MXKPDGuKXqK4AMBXG+FH6RUdK7Oyc3gyfNoFIthT+4eRbzOK43bdRlLaZuxgciDSjgtggZ3OtGQ==} engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'} @@ -2909,10 +2538,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - basic-ftp@5.3.0: - resolution: {integrity: sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w==} - engines: {node: '>=10.0.0'} - better-auth@1.6.14: resolution: {integrity: sha512-c0/DvTQGDpgfj1knekCpQrg6PSWGDtfAtP7Ou6FkAhoE3RNnnIxLB5qKj6tRg53a1xsq93G6T68cNxrUZ7ZVmw==} peerDependencies: @@ -3016,9 +2641,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -3043,10 +2665,6 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - chalk@5.6.2: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} @@ -3086,25 +2704,10 @@ packages: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} - cli-highlight@2.1.11: - resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - clsx@2.1.1: resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} engines: {node: '>=6'} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -3166,10 +2769,6 @@ packages: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -3189,10 +2788,6 @@ packages: defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -3253,9 +2848,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - end-of-stream@1.4.5: - resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.21.0: resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} engines: {node: '>=10.13.0'} @@ -3292,20 +2884,6 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - estree-util-is-identifier-name@3.0.0: resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} @@ -3315,10 +2893,6 @@ packages: estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - eventemitter3@5.0.4: resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} @@ -3329,21 +2903,6 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - fast-xml-builder@1.1.5: - resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} - - fast-xml-parser@5.5.8: - resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} - hasBin: true - - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} @@ -3357,10 +2916,6 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} - file-type@21.3.4: - resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} - engines: {node: '>=20'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3397,10 +2952,6 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.5.0: resolution: {integrity: sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==} engines: {node: '>=18'} @@ -3413,14 +2964,6 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-uri@6.0.5: - resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} - engines: {node: '>= 14'} - github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} @@ -3432,11 +2975,6 @@ packages: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} - goober@2.1.18: - resolution: {integrity: sha512-2vFqsaDVIT9Gz7N6kAL++pLpp41l3PfDuusHcjnGLfR6+huZkl6ziX+zgVC3ZxpqWhzH6pyDdGrCeDhMIvwaxw==} - peerDependencies: - csstype: ^3.0.10 - google-auth-library@10.6.2: resolution: {integrity: sha512-e27Z6EThmVNNvtYASwQxose/G57rkRuaRbQyxM2bvYLLX/GqWZ5chWq2EBoUchJbCc57eC9ArzO5wMsEmWftCw==} engines: {node: '>=18'} @@ -3451,10 +2989,6 @@ packages: h3@1.15.11: resolution: {integrity: sha512-L3THSe2MPeBwgIZVSH5zLdBBU90TOxarvhK9d04IDY2AmVS8j2Jz2LIWtwsGOU3lu2I5jCN7FNvVfY2+XyF+mg==} - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -3495,10 +3029,6 @@ packages: resolution: {integrity: sha512-kdJoFVv2xmayw6cY09H7AbMJMt8Jn5jdlEdXsP7AGBdF2DIptVlKlOLKXP41yPip4/a3yQPv9gVcJYI8YY04dw==} engines: {node: '>=16.9.0'} - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} - engines: {node: ^20.17.0 || >=22.9.0} - hosted-git-info@9.0.3: resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} engines: {node: ^20.17.0 || >=22.9.0} @@ -3523,9 +3053,6 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@7.0.5: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} @@ -3536,10 +3063,6 @@ packages: inline-style-parser@0.2.7: resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} @@ -3652,9 +3175,6 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - koffi@2.16.1: - resolution: {integrity: sha512-0Ie6CfD026dNfWSosDw9dPxPzO9Rlyo0N8m5r05S8YjytIpuilzMFDMY4IDy/8xQsTwpuVinhncD+S8n3bcYZQ==} - kysely@0.28.17: resolution: {integrity: sha512-nbD8lB9EB3wNdMhOCdx5Li8DxnLbvKByylRLcJ1h+4SkrowVeECAyZlyiKMThF7xFdRz0jSQ2MoJr+wXux2y0Q==} engines: {node: '>=20.0.0'} @@ -3749,15 +3269,6 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - lucide-react@1.11.0: - resolution: {integrity: sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} @@ -3767,11 +3278,6 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} - marked@15.0.12: - resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} - engines: {node: '>= 18'} - hasBin: true - marked@18.0.5: resolution: {integrity: sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w==} engines: {node: '>= 20'} @@ -3915,14 +3421,6 @@ packages: micromark@4.0.2: resolution: {integrity: sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} - miniflare@4.20260611.0: resolution: {integrity: sha512-i+JwEo8vN96naz1WL3ntFgFyRluBDYL408zwhHKvR2jefJ464KsZ/gCmJAQ5k+oaWeb5Ug+s7yne5AyiAEswjg==} engines: {node: '>=22.0.0'} @@ -3943,9 +3441,6 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3959,10 +3454,6 @@ packages: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} - netmask@2.1.1: - resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} - engines: {node: '>= 0.4.0'} - nlcst-to-string@4.0.0: resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==} @@ -3991,19 +3482,12 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - ofetch@1.5.1: resolution: {integrity: sha512-2W4oUZlVaqAPAil6FUg/difl6YhqhUR7x2eZY4bQCko22UXg3hptq9KLQdqFClV+Wu85UX7hNtdGTngi/1BxcA==} ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - oniguruma-parser@0.12.2: resolution: {integrity: sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==} @@ -4038,14 +3522,6 @@ packages: resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} engines: {node: '>=14.16'} - pac-proxy-agent@7.2.0: - resolution: {integrity: sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - package-manager-detector@1.6.0: resolution: {integrity: sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==} @@ -4055,25 +3531,12 @@ packages: parse-latin@7.0.0: resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==} - parse5-htmlparser2-tree-adapter@6.0.1: - resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} - - parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - - parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} partial-json@0.1.7: resolution: {integrity: sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==} - path-expression-matcher@1.5.0: - resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} - engines: {node: '>=14.0.0'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4092,9 +3555,6 @@ packages: resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - piccolore@0.1.3: resolution: {integrity: sha512-o8bTeDWjE086iwKrROaDf31K0qC/BENdm15/uH9usSC/uZjJOKb2YGiVHfLY4GhwsERiPI1jmwI2XrA7ACOxVw==} @@ -4140,16 +3600,6 @@ packages: resolution: {integrity: sha512-3wY1AxV+VBNW8Yypfd1yQY9pXnqTAN+KwQxL8iYm3/BjKYMNg4i0owhEe26PWDOMaIrzeeF98Lqd5NGz4omiIg==} engines: {node: '>=12.0.0'} - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - pump@3.0.4: - resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - radix-ui@1.4.3: resolution: {integrity: sha512-aWizCQiyeAenIdUbqEpXgRA1ya65P13NKn/W8rWkcN0OPkRDxdBVLWnIEDsS2RpwCK2nobI7oMUSmexzTDyAmA==} peerDependencies: @@ -4201,12 +3651,6 @@ packages: '@types/react': optional: true - react-resizable-panels@4.10.0: - resolution: {integrity: sha512-frjewRQt7TCv/vCH1pJfjZ7RxAhr5pKuqVQtVgzFq/vherxBFOWyC3xMbryx5Ti2wylViGUFc93Etg4rB3E0UA==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - react-style-singleton@2.2.3: resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} engines: {node: '>=10'} @@ -4266,10 +3710,6 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - retext-latin@4.0.0: resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==} @@ -4359,30 +3799,14 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smol-toml@1.6.1: resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} engines: {node: '>= 18'} - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} @@ -4414,13 +3838,6 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@2.2.3: - resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} - - strtok3@10.3.5: - resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} - engines: {node: '>=18'} - style-to-js@1.1.21: resolution: {integrity: sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==} @@ -4431,10 +3848,6 @@ packages: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - svgo@4.0.1: resolution: {integrity: sha512-XDpWUOPC6FEibaLzjfe0ucaV0YrOjYotGJO1WpF0Zd+n6ZGEQUsSugaoLq9QkEZtAfQIxT42UChcssDVPP3+/w==} engines: {node: '>=16'} @@ -4450,13 +3863,6 @@ packages: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} @@ -4490,10 +3896,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - token-types@6.1.2: - resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} - engines: {node: '>=14.16'} - trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -4524,9 +3926,6 @@ packages: typebox@1.1.38: resolution: {integrity: sha512-pZ0aQPmMmXoUvSbeuWf/Hzsc+avNw/Zd6VeE8CFgkVGWyuHPJvqeJJDeJqLve+K70LvjYIoleGcoJHPT17cWoA==} - typebox@1.2.16: - resolution: {integrity: sha512-p85YWtR1RznP2kt/sftmj1leGiObfHVJwkK2hkDdEKhbtQONeUeBtbYdK0x9tLPh+5AaEPD62APv189Cy+/C2g==} - typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -4535,10 +3934,6 @@ packages: ufo@1.6.4: resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - uint8array-extras@1.5.0: - resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} - engines: {node: '>=18'} - ultrahtml@1.6.0: resolution: {integrity: sha512-R9fBn90VTJrqqLDwyMph+HGne8eqY1iPfYhPzZrvKpIfwkWZbcYlfpsb8B9dTvBfpy1/hqAD7Wi8EKfP9e8zdw==} @@ -4692,10 +4087,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} - hasBin: true - vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -4829,17 +4220,10 @@ packages: '@cloudflare/workers-types': optional: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - wrap-ansi@9.0.2: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.0: resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} engines: {node: '>=10.0.0'} @@ -4867,38 +4251,18 @@ packages: xxhash-wasm@1.1.0: resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@2.8.3: - resolution: {integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.9.0: resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} engines: {node: '>= 14.6'} hasBin: true - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - yocto-queue@1.2.2: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} @@ -5003,15 +4367,15 @@ snapshots: dependencies: prismjs: 1.30.0 - '@astrojs/react@4.4.2(@types/node@24.12.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yaml@2.8.3)': + '@astrojs/react@4.4.2(@types/node@24.12.2)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(jiti@2.7.0)(lightningcss@1.32.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(yaml@2.9.0)': dependencies: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@vitejs/plugin-react': 4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + '@vitejs/plugin-react': 4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) react: 19.2.5 react-dom: 19.2.5(react@19.2.5) ultrahtml: 1.6.0 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -5038,12 +4402,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@aws-crypto/crc32@5.2.0': - dependencies: - '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.8 - tslib: 2.8.1 - '@aws-crypto/sha256-browser@5.2.0': dependencies: '@aws-crypto/sha256-js': 5.2.0 @@ -5070,58 +4428,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-bedrock-runtime@3.1033.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.2 - '@aws-sdk/credential-provider-node': 3.972.33 - '@aws-sdk/eventstream-handler-node': 3.972.14 - '@aws-sdk/middleware-eventstream': 3.972.10 - '@aws-sdk/middleware-host-header': 3.972.10 - '@aws-sdk/middleware-logger': 3.972.10 - '@aws-sdk/middleware-recursion-detection': 3.972.11 - '@aws-sdk/middleware-user-agent': 3.972.32 - '@aws-sdk/middleware-websocket': 3.972.16 - '@aws-sdk/region-config-resolver': 3.972.12 - '@aws-sdk/token-providers': 3.1033.0 - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.7 - '@aws-sdk/util-user-agent-browser': 3.972.10 - '@aws-sdk/util-user-agent-node': 3.973.18 - '@smithy/config-resolver': 4.4.17 - '@smithy/core': 3.23.16 - '@smithy/eventstream-serde-browser': 4.2.14 - '@smithy/eventstream-serde-config-resolver': 4.3.14 - '@smithy/eventstream-serde-node': 4.2.14 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/hash-node': 4.2.14 - '@smithy/invalid-dependency': 4.2.14 - '@smithy/middleware-content-length': 4.2.14 - '@smithy/middleware-endpoint': 4.4.31 - '@smithy/middleware-retry': 4.5.4 - '@smithy/middleware-serde': 4.2.19 - '@smithy/middleware-stack': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/node-http-handler': 4.6.0 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.48 - '@smithy/util-defaults-mode-node': 4.2.53 - '@smithy/util-endpoints': 3.4.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.3 - '@smithy/util-stream': 4.5.24 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-bedrock-runtime@3.1048.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 @@ -5139,22 +4445,6 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/core@3.974.2': - dependencies: - '@aws-sdk/types': 3.973.8 - '@aws-sdk/xml-builder': 3.972.18 - '@smithy/core': 3.23.16 - '@smithy/node-config-provider': 4.3.14 - '@smithy/property-provider': 4.2.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/signature-v4': 5.3.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - '@aws-sdk/core@3.974.26': dependencies: '@aws-sdk/types': 3.973.15 @@ -5166,14 +4456,6 @@ snapshots: bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.28': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/types': 3.973.8 - '@smithy/property-provider': 4.2.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.52': dependencies: '@aws-sdk/core': 3.974.26 @@ -5182,19 +4464,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.30': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/types': 3.973.8 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/node-http-handler': 4.6.0 - '@smithy/property-provider': 4.2.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - '@smithy/util-stream': 4.5.24 - tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.54': dependencies: '@aws-sdk/core': 3.974.26 @@ -5205,25 +4474,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.32': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/credential-provider-env': 3.972.28 - '@aws-sdk/credential-provider-http': 3.972.30 - '@aws-sdk/credential-provider-login': 3.972.32 - '@aws-sdk/credential-provider-process': 3.972.28 - '@aws-sdk/credential-provider-sso': 3.972.32 - '@aws-sdk/credential-provider-web-identity': 3.972.32 - '@aws-sdk/nested-clients': 3.997.0 - '@aws-sdk/types': 3.973.8 - '@smithy/credential-provider-imds': 4.2.14 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-ini@3.972.59': dependencies: '@aws-sdk/core': 3.974.26 @@ -5240,19 +4490,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-login@3.972.32': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/nested-clients': 3.997.0 - '@aws-sdk/types': 3.973.8 - '@smithy/property-provider': 4.2.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-login@3.972.58': dependencies: '@aws-sdk/core': 3.974.26 @@ -5262,23 +4499,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-node@3.972.33': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.28 - '@aws-sdk/credential-provider-http': 3.972.30 - '@aws-sdk/credential-provider-ini': 3.972.32 - '@aws-sdk/credential-provider-process': 3.972.28 - '@aws-sdk/credential-provider-sso': 3.972.32 - '@aws-sdk/credential-provider-web-identity': 3.972.32 - '@aws-sdk/types': 3.973.8 - '@smithy/credential-provider-imds': 4.2.14 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-node@3.972.61': dependencies: '@aws-sdk/credential-provider-env': 3.972.52 @@ -5293,15 +4513,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.28': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/types': 3.973.8 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.52': dependencies: '@aws-sdk/core': 3.974.26 @@ -5310,19 +4521,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.32': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/nested-clients': 3.997.0 - '@aws-sdk/token-providers': 3.1033.0 - '@aws-sdk/types': 3.973.8 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-sso@3.972.58': dependencies: '@aws-sdk/core': 3.974.26 @@ -5333,18 +4531,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-web-identity@3.972.32': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/nested-clients': 3.997.0 - '@aws-sdk/types': 3.973.8 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.58': dependencies: '@aws-sdk/core': 3.974.26 @@ -5354,13 +4540,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/eventstream-handler-node@3.972.14': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/eventstream-codec': 4.2.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/eventstream-handler-node@3.972.25': dependencies: '@aws-sdk/types': 3.973.15 @@ -5368,13 +4547,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/middleware-eventstream@3.972.10': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/middleware-eventstream@3.972.21': dependencies: '@aws-sdk/types': 3.973.15 @@ -5382,70 +4554,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.10': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.972.10': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-recursion-detection@3.972.11': - dependencies: - '@aws-sdk/types': 3.973.8 - '@aws/lambda-invoke-store': 0.2.4 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-sdk-s3@3.972.31': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-arn-parser': 3.972.3 - '@smithy/core': 3.23.16 - '@smithy/node-config-provider': 4.3.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/signature-v4': 5.3.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - '@smithy/util-config-provider': 4.2.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-stream': 4.5.24 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.972.32': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.7 - '@smithy/core': 3.23.16 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - '@smithy/util-retry': 4.3.3 - tslib: 2.8.1 - - '@aws-sdk/middleware-websocket@3.972.16': - dependencies: - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-format-url': 3.972.10 - '@smithy/eventstream-codec': 4.2.14 - '@smithy/eventstream-serde-browser': 4.2.14 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/protocol-http': 5.3.14 - '@smithy/signature-v4': 5.3.14 - '@smithy/types': 4.14.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - '@aws-sdk/middleware-websocket@3.972.34': dependencies: '@aws-sdk/core': 3.974.26 @@ -5456,50 +4564,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.997.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.974.2 - '@aws-sdk/middleware-host-header': 3.972.10 - '@aws-sdk/middleware-logger': 3.972.10 - '@aws-sdk/middleware-recursion-detection': 3.972.11 - '@aws-sdk/middleware-user-agent': 3.972.32 - '@aws-sdk/region-config-resolver': 3.972.12 - '@aws-sdk/signature-v4-multi-region': 3.996.19 - '@aws-sdk/types': 3.973.8 - '@aws-sdk/util-endpoints': 3.996.7 - '@aws-sdk/util-user-agent-browser': 3.972.10 - '@aws-sdk/util-user-agent-node': 3.973.18 - '@smithy/config-resolver': 4.4.17 - '@smithy/core': 3.23.16 - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/hash-node': 4.2.14 - '@smithy/invalid-dependency': 4.2.14 - '@smithy/middleware-content-length': 4.2.14 - '@smithy/middleware-endpoint': 4.4.31 - '@smithy/middleware-retry': 4.5.4 - '@smithy/middleware-serde': 4.2.19 - '@smithy/middleware-stack': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/node-http-handler': 4.6.0 - '@smithy/protocol-http': 5.3.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.48 - '@smithy/util-defaults-mode-node': 4.2.53 - '@smithy/util-endpoints': 3.4.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.3 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/nested-clients@3.997.26': dependencies: '@aws-sdk/core': 3.974.26 @@ -5511,23 +4575,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.972.12': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/config-resolver': 4.4.17 - '@smithy/node-config-provider': 4.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@aws-sdk/signature-v4-multi-region@3.996.19': - dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.31 - '@aws-sdk/types': 3.973.8 - '@smithy/protocol-http': 5.3.14 - '@smithy/signature-v4': 5.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.38': dependencies: '@aws-sdk/types': 3.973.15 @@ -5535,18 +4582,6 @@ snapshots: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1033.0': - dependencies: - '@aws-sdk/core': 3.974.2 - '@aws-sdk/nested-clients': 3.997.0 - '@aws-sdk/types': 3.973.8 - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/token-providers@3.1048.0': dependencies: '@aws-sdk/core': 3.974.26 @@ -5575,51 +4610,10 @@ snapshots: '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.972.3': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.996.7': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-endpoints': 3.4.2 - tslib: 2.8.1 - - '@aws-sdk/util-format-url@3.972.10': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/querystring-builder': 4.2.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.5': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.10': - dependencies: - '@aws-sdk/types': 3.973.8 - '@smithy/types': 4.14.1 - bowser: 2.14.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.973.18': - dependencies: - '@aws-sdk/middleware-user-agent': 3.972.32 - '@aws-sdk/types': 3.973.8 - '@smithy/node-config-provider': 4.3.14 - '@smithy/types': 4.14.1 - '@smithy/util-config-provider': 4.2.2 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.972.18': - dependencies: - '@smithy/types': 4.14.1 - fast-xml-parser: 5.5.8 - tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.33': dependencies: '@smithy/types': 4.15.1 @@ -5764,7 +4758,7 @@ snapshots: '@babel/helper-string-parser': 7.29.7 '@babel/helper-validator-identifier': 7.29.7 - '@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)': + '@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0)': dependencies: '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 @@ -5777,37 +4771,38 @@ snapshots: zod: 4.3.6 optionalDependencies: '@cloudflare/workers-types': 4.20260702.1 + '@opentelemetry/api': 1.9.0 - '@better-auth/drizzle-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/drizzle-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/kysely-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.28.17)': + '@better-auth/kysely-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.28.17)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 optionalDependencies: kysely: 0.28.17 - '@better-auth/memory-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/memory-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/mongo-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/mongo-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/prisma-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': + '@better-auth/prisma-adapter@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 - '@better-auth/telemetry@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)': + '@better-auth/telemetry@1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)': dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 @@ -5817,8 +4812,6 @@ snapshots: '@better-fetch/fetch@1.1.21': {} - '@borewit/text-codec@0.2.2': {} - '@capsizecss/unpack@4.0.0': dependencies: fontkitten: 1.0.3 @@ -6130,17 +5123,6 @@ snapshots: '@floating-ui/utils@0.2.11': {} - '@google/genai@1.50.1': - dependencies: - google-auth-library: 10.6.2 - p-retry: 4.6.2 - protobufjs: 7.5.5 - ws: 8.18.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - '@google/genai@1.52.0': dependencies: google-auth-library: 10.6.2 @@ -6316,15 +5298,6 @@ snapshots: '@mariozechner/clipboard-win32-x64-msvc': 0.3.9 optional: true - '@mistralai/mistralai@2.2.1': - dependencies: - ws: 8.18.0 - zod: 4.3.6 - zod-to-json-schema: 3.25.2(zod@4.3.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@mistralai/mistralai@2.2.6(@opentelemetry/api@1.9.0)': dependencies: '@opentelemetry/semantic-conventions': 1.41.1 @@ -7251,347 +6224,63 @@ snapshots: '@silvia-odwyer/photon-node@0.3.4': {} - '@sinclair/typebox@0.34.49': {} - '@sindresorhus/is@7.2.0': {} - '@smithy/config-resolver@4.4.17': - dependencies: - '@smithy/node-config-provider': 4.3.14 - '@smithy/types': 4.14.1 - '@smithy/util-config-provider': 4.2.2 - '@smithy/util-endpoints': 3.4.2 - '@smithy/util-middleware': 4.2.14 - tslib: 2.8.1 - - '@smithy/core@3.23.16': - dependencies: - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-stream': 4.5.24 - '@smithy/util-utf8': 4.2.2 - '@smithy/uuid': 1.1.2 - tslib: 2.8.1 - '@smithy/core@3.29.0': dependencies: '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.14': + '@smithy/credential-provider-imds@4.4.5': dependencies: - '@smithy/node-config-provider': 4.3.14 - '@smithy/property-provider': 4.2.14 - '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 + '@smithy/core': 3.29.0 + '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.4.5': + '@smithy/fetch-http-handler@5.6.2': dependencies: '@smithy/core': 3.29.0 '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.14': + '@smithy/is-array-buffer@2.2.0': dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.14.1 - '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.14': + '@smithy/node-http-handler@4.7.3': dependencies: - '@smithy/eventstream-serde-universal': 4.2.14 - '@smithy/types': 4.14.1 + '@smithy/core': 3.29.0 + '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.14': + '@smithy/node-http-handler@4.9.2': dependencies: - '@smithy/types': 4.14.1 + '@smithy/core': 3.29.0 + '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.14': + '@smithy/signature-v4@5.6.1': dependencies: - '@smithy/eventstream-serde-universal': 4.2.14 - '@smithy/types': 4.14.1 + '@smithy/core': 3.29.0 + '@smithy/types': 4.15.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.14': + '@smithy/types@4.14.1': dependencies: - '@smithy/eventstream-codec': 4.2.14 - '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.17': + '@smithy/types@4.15.1': dependencies: - '@smithy/protocol-http': 5.3.14 - '@smithy/querystring-builder': 4.2.14 - '@smithy/types': 4.14.1 - '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.6.2': + '@smithy/util-buffer-from@2.2.0': dependencies: - '@smithy/core': 3.29.0 - '@smithy/types': 4.15.1 + '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/hash-node@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/is-array-buffer@2.2.0': - dependencies: - tslib: 2.8.1 - - '@smithy/is-array-buffer@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.2.14': - dependencies: - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.4.31': - dependencies: - '@smithy/core': 3.23.16 - '@smithy/middleware-serde': 4.2.19 - '@smithy/node-config-provider': 4.3.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - '@smithy/url-parser': 4.2.14 - '@smithy/util-middleware': 4.2.14 - tslib: 2.8.1 - - '@smithy/middleware-retry@4.5.4': - dependencies: - '@smithy/core': 3.23.16 - '@smithy/node-config-provider': 4.3.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/service-error-classification': 4.3.0 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-retry': 4.3.3 - '@smithy/uuid': 1.1.2 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.2.19': - dependencies: - '@smithy/core': 3.23.16 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.14': - dependencies: - '@smithy/property-provider': 4.2.14 - '@smithy/shared-ini-file-loader': 4.4.9 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.6.0': - dependencies: - '@smithy/protocol-http': 5.3.14 - '@smithy/querystring-builder': 4.2.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.7.3': - dependencies: - '@smithy/core': 3.29.0 - '@smithy/types': 4.15.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.9.2': - dependencies: - '@smithy/core': 3.29.0 - '@smithy/types': 4.15.1 - tslib: 2.8.1 - - '@smithy/property-provider@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/protocol-http@5.3.14': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - '@smithy/util-uri-escape': 4.2.2 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.3.0': - dependencies: - '@smithy/types': 4.14.1 - - '@smithy/shared-ini-file-loader@4.4.9': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/signature-v4@5.3.14': - dependencies: - '@smithy/is-array-buffer': 4.2.2 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-middleware': 4.2.14 - '@smithy/util-uri-escape': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/signature-v4@5.6.1': - dependencies: - '@smithy/core': 3.29.0 - '@smithy/types': 4.15.1 - tslib: 2.8.1 - - '@smithy/smithy-client@4.12.12': - dependencies: - '@smithy/core': 3.23.16 - '@smithy/middleware-endpoint': 4.4.31 - '@smithy/middleware-stack': 4.2.14 - '@smithy/protocol-http': 5.3.14 - '@smithy/types': 4.14.1 - '@smithy/util-stream': 4.5.24 - tslib: 2.8.1 - - '@smithy/types@4.14.1': - dependencies: - tslib: 2.8.1 - - '@smithy/types@4.15.1': - dependencies: - tslib: 2.8.1 - - '@smithy/url-parser@4.2.14': - dependencies: - '@smithy/querystring-parser': 4.2.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/util-base64@4.3.2': - dependencies: - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/util-body-length-browser@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-body-length-node@4.2.3': - dependencies: - tslib: 2.8.1 - - '@smithy/util-buffer-from@2.2.0': - dependencies: - '@smithy/is-array-buffer': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-buffer-from@4.2.2': - dependencies: - '@smithy/is-array-buffer': 4.2.2 - tslib: 2.8.1 - - '@smithy/util-config-provider@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.3.48': - dependencies: - '@smithy/property-provider': 4.2.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.2.53': - dependencies: - '@smithy/config-resolver': 4.4.17 - '@smithy/credential-provider-imds': 4.2.14 - '@smithy/node-config-provider': 4.3.14 - '@smithy/property-provider': 4.2.14 - '@smithy/smithy-client': 4.12.12 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.4.2': - dependencies: - '@smithy/node-config-provider': 4.3.14 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-middleware@4.2.14': - dependencies: - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/util-retry@4.3.3': - dependencies: - '@smithy/service-error-classification': 4.3.0 - '@smithy/types': 4.14.1 - tslib: 2.8.1 - - '@smithy/util-stream@4.5.24': - dependencies: - '@smithy/fetch-http-handler': 5.3.17 - '@smithy/node-http-handler': 4.6.0 - '@smithy/types': 4.14.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/util-uri-escape@4.2.2': - dependencies: - tslib: 2.8.1 - - '@smithy/util-utf8@2.3.0': - dependencies: - '@smithy/util-buffer-from': 2.2.0 - tslib: 2.8.1 - - '@smithy/util-utf8@4.2.2': - dependencies: - '@smithy/util-buffer-from': 4.2.2 - tslib: 2.8.1 - - '@smithy/uuid@1.1.2': + '@smithy/util-utf8@2.3.0': dependencies: + '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 '@speed-highlight/core@1.2.15': {} @@ -7664,26 +6353,15 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.2.4 - '@tailwindcss/vite@4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3))': + '@tailwindcss/vite@4.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@tailwindcss/node': 4.2.4 '@tailwindcss/oxide': 4.2.4 tailwindcss: 4.2.4 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) '@tanstack/history@1.161.6': {} - '@tanstack/react-router-devtools@1.166.13(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@tanstack/router-core@1.168.16)(csstype@3.2.3)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@tanstack/react-router': 1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@tanstack/router-devtools-core': 1.167.3(@tanstack/router-core@1.168.16)(csstype@3.2.3) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - optionalDependencies: - '@tanstack/router-core': 1.168.16 - transitivePeerDependencies: - - csstype - '@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@tanstack/history': 1.161.6 @@ -7707,14 +6385,6 @@ snapshots: seroval: 1.5.2 seroval-plugins: 1.5.2(seroval@1.5.2) - '@tanstack/router-devtools-core@1.167.3(@tanstack/router-core@1.168.16)(csstype@3.2.3)': - dependencies: - '@tanstack/router-core': 1.168.16 - clsx: 2.1.1 - goober: 2.1.18(csstype@3.2.3) - optionalDependencies: - csstype: 3.2.3 - '@tanstack/router-generator@1.166.35': dependencies: '@babel/types': 7.29.0 @@ -7728,7 +6398,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.167.27(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3))': + '@tanstack/router-plugin@1.167.27(@tanstack/react-router@1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -7745,7 +6415,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.168.24(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -7767,17 +6437,6 @@ snapshots: '@tanstack/virtual-file-routes@1.161.7': {} - '@tokenizer/inflate@0.4.1': - dependencies: - debug: 4.4.3 - token-types: 6.1.2 - transitivePeerDependencies: - - supports-color - - '@tokenizer/token@0.3.0': {} - - '@tootallnate/quickjs-emscripten@0.23.0': {} - '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.29.2 @@ -7824,8 +6483,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/mime-types@2.1.4': {} - '@types/ms@2.1.0': {} '@types/nlcst@2.0.3': @@ -7854,14 +6511,9 @@ snapshots: dependencies: '@types/node': 24.12.2 - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 24.12.2 - optional: true - '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-react@4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3))': + '@vitejs/plugin-react@4.7.0(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0) @@ -7869,7 +6521,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - supports-color @@ -7881,13 +6533,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3))': + '@vitest/mocker@3.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -7927,16 +6579,10 @@ snapshots: ansi-regex@6.2.2: {} - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - ansi-styles@6.2.3: {} ansis@4.2.0: {} - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -7954,11 +6600,7 @@ snapshots: assertion-error@2.0.1: {} - ast-types@0.13.4: - dependencies: - tslib: 2.8.1 - - astro@5.18.2(@types/node@24.12.2)(aws4fetch@1.0.20)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.2)(typescript@5.9.3)(yaml@2.8.3): + astro@5.18.2(@types/node@24.12.2)(aws4fetch@1.0.20)(jiti@2.7.0)(lightningcss@1.32.0)(rollup@4.60.2)(typescript@5.9.3)(yaml@2.9.0): dependencies: '@astrojs/compiler': 2.13.1 '@astrojs/internal-helpers': 0.7.6 @@ -8015,8 +6657,8 @@ snapshots: unist-util-visit: 5.1.0 unstorage: 1.17.5(aws4fetch@1.0.20) vfile: 6.0.3 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) - vitefu: 1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vitefu: 1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) xxhash-wasm: 1.1.0 yargs-parser: 21.1.1 yocto-spinner: 0.2.3 @@ -8083,17 +6725,15 @@ snapshots: baseline-browser-mapping@2.10.22: {} - basic-ftp@5.3.0: {} - - better-auth@1.6.14(@cloudflare/workers-types@4.20260702.1)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)): + better-auth@1.6.14(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): dependencies: - '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) - '@better-auth/drizzle-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/kysely-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.28.17) - '@better-auth/memory-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/mongo-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/prisma-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) - '@better-auth/telemetry': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21) + '@better-auth/core': 1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0) + '@better-auth/drizzle-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/kysely-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(kysely@0.28.17) + '@better-auth/memory-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/mongo-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/prisma-adapter': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1) + '@better-auth/telemetry': 1.6.14(@better-auth/core@1.6.14(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260702.1)(@opentelemetry/api@1.9.0)(better-call@1.3.5(zod@4.3.6))(jose@6.2.3)(kysely@0.28.17)(nanostores@1.3.0))(@better-auth/utils@0.4.1)(@better-fetch/fetch@1.1.21) '@better-auth/utils': 0.4.1 '@better-fetch/fetch': 1.1.21 '@noble/ciphers': 2.2.0 @@ -8107,7 +6747,7 @@ snapshots: optionalDependencies: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - '@cloudflare/workers-types' - '@opentelemetry/api' @@ -8158,8 +6798,6 @@ snapshots: node-releases: 2.0.38 update-browserslist-db: 1.2.3(browserslist@4.28.2) - buffer-crc32@0.2.13: {} - buffer-equal-constant-time@1.0.1: {} cac@6.7.14: {} @@ -8180,11 +6818,6 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@5.6.2: {} character-entities-html4@2.1.0: {} @@ -8221,29 +6854,8 @@ snapshots: cli-boxes@3.0.0: {} - cli-highlight@2.1.11: - dependencies: - chalk: 4.1.2 - highlight.js: 10.7.3 - mz: 2.7.0 - parse5: 5.1.1 - parse5-htmlparser2-tree-adapter: 6.0.1 - yargs: 16.2.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - clsx@2.1.1: {} - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - comma-separated-tokens@2.0.3: {} commander@11.1.0: {} @@ -8298,8 +6910,6 @@ snapshots: data-uri-to-buffer@4.0.1: {} - data-uri-to-buffer@6.0.2: {} - debug@4.4.3: dependencies: ms: 2.1.3 @@ -8312,12 +6922,6 @@ snapshots: defu@6.1.7: {} - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - dequal@2.0.3: {} destr@2.0.5: {} @@ -8370,10 +6974,6 @@ snapshots: emoji-regex@8.0.0: {} - end-of-stream@1.4.5: - dependencies: - once: 1.4.0 - enhanced-resolve@5.21.0: dependencies: graceful-fs: 4.2.11 @@ -8449,18 +7049,6 @@ snapshots: escape-string-regexp@5.0.0: {} - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - esprima@4.0.1: {} - - estraverse@5.3.0: {} - estree-util-is-identifier-name@3.0.0: {} estree-walker@2.0.2: {} @@ -8469,38 +7057,12 @@ snapshots: dependencies: '@types/estree': 1.0.8 - esutils@2.0.3: {} - eventemitter3@5.0.4: {} expect-type@1.3.0: {} extend@3.0.2: {} - extract-zip@2.0.1: - dependencies: - debug: 4.4.3 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - - fast-xml-builder@1.1.5: - dependencies: - path-expression-matcher: 1.5.0 - - fast-xml-parser@5.5.8: - dependencies: - fast-xml-builder: 1.1.5 - path-expression-matcher: 1.5.0 - strnum: 2.2.3 - - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.4): optionalDependencies: picomatch: 4.0.4 @@ -8510,15 +7072,6 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - file-type@21.3.4: - dependencies: - '@tokenizer/inflate': 0.4.1 - strtok3: 10.3.5 - token-types: 6.1.2 - uint8array-extras: 1.5.0 - transitivePeerDependencies: - - supports-color - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -8558,26 +7111,12 @@ snapshots: gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - get-east-asian-width@1.5.0: {} get-east-asian-width@1.6.0: {} get-nonce@1.0.1: {} - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - - get-uri@6.0.5: - dependencies: - basic-ftp: 5.3.0 - data-uri-to-buffer: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - github-slugger@2.0.0: {} glob-parent@5.1.2: @@ -8590,10 +7129,6 @@ snapshots: minipass: 7.1.3 path-scurry: 2.0.2 - goober@2.1.18(csstype@3.2.3): - dependencies: - csstype: 3.2.3 - google-auth-library@10.6.2: dependencies: base64-js: 1.5.1 @@ -8621,8 +7156,6 @@ snapshots: ufo: 1.6.4 uncrypto: 0.1.3 - has-flag@4.0.0: {} - hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -8734,10 +7267,6 @@ snapshots: hono@4.13.1: {} - hosted-git-info@9.0.2: - dependencies: - lru-cache: 11.3.5 - hosted-git-info@9.0.3: dependencies: lru-cache: 11.3.5 @@ -8764,16 +7293,12 @@ snapshots: transitivePeerDependencies: - supports-color - ieee754@1.2.1: {} - ignore@7.0.5: {} import-meta-resolve@4.2.0: {} inline-style-parser@0.2.7: {} - ip-address@10.1.0: {} - iron-webcrypto@1.2.1: {} is-alphabetical@2.0.1: {} @@ -8859,9 +7384,6 @@ snapshots: kleur@4.1.5: {} - koffi@2.16.1: - optional: true - kysely@0.28.17: {} lightningcss-android-arm64@1.32.0: @@ -8925,12 +7447,6 @@ snapshots: dependencies: yallist: 3.1.1 - lru-cache@7.18.3: {} - - lucide-react@1.11.0(react@19.2.5): - dependencies: - react: 19.2.5 - magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -8943,8 +7459,6 @@ snapshots: markdown-table@3.0.4: {} - marked@15.0.12: {} - marked@18.0.5: {} mdast-util-definitions@6.0.0: @@ -9301,12 +7815,6 @@ snapshots: transitivePeerDependencies: - supports-color - mime-db@1.54.0: {} - - mime-types@3.0.2: - dependencies: - mime-db: 1.54.0 - miniflare@4.20260611.0: dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -9329,20 +7837,12 @@ snapshots: ms@2.1.3: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.11: {} nanostores@1.3.0: {} neotraverse@0.6.18: {} - netmask@2.1.1: {} - nlcst-to-string@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -9367,8 +7867,6 @@ snapshots: dependencies: boolbase: 1.0.0 - object-assign@4.1.1: {} - ofetch@1.5.1: dependencies: destr: 2.0.5 @@ -9377,10 +7875,6 @@ snapshots: ohash@2.0.11: {} - once@1.4.0: - dependencies: - wrappy: 1.0.2 - oniguruma-parser@0.12.2: {} oniguruma-to-es@4.3.6: @@ -9415,24 +7909,6 @@ snapshots: p-timeout@6.1.4: {} - pac-proxy-agent@7.2.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.4 - debug: 4.4.3 - get-uri: 6.0.5 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.1.1 - package-manager-detector@1.6.0: {} parse-entities@4.0.2: @@ -9454,22 +7930,12 @@ snapshots: unist-util-visit-children: 3.0.0 vfile: 6.0.3 - parse5-htmlparser2-tree-adapter@6.0.1: - dependencies: - parse5: 6.0.1 - - parse5@5.1.1: {} - - parse5@6.0.1: {} - parse5@7.3.0: dependencies: entities: 6.0.1 partial-json@0.1.7: {} - path-expression-matcher@1.5.0: {} - path-key@3.1.1: {} path-scurry@2.0.2: @@ -9483,8 +7949,6 @@ snapshots: pathval@2.0.1: {} - pend@1.2.0: {} - piccolore@0.1.3: {} picocolors@1.1.1: {} @@ -9536,26 +8000,6 @@ snapshots: '@types/node': 24.12.2 long: 5.3.2 - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.2.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - proxy-from-env@1.1.0: {} - - pump@3.0.4: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - radix-ui@1.4.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5): dependencies: '@radix-ui/primitive': 1.1.3 @@ -9665,11 +8109,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - react-resizable-panels@4.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): - dependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - react-style-singleton@2.2.3(@types/react@19.2.14)(react@19.2.5): dependencies: get-nonce: 1.0.1 @@ -9762,8 +8201,6 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - require-directory@2.1.1: {} - retext-latin@4.0.0: dependencies: '@types/nlcst': 2.0.3 @@ -9900,28 +8337,10 @@ snapshots: sisteransi@1.0.5: {} - smart-buffer@4.2.0: {} - smol-toml@1.6.1: {} - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - socks: 2.8.7 - transitivePeerDependencies: - - supports-color - - socks@2.8.7: - dependencies: - ip-address: 10.1.0 - smart-buffer: 4.2.0 - source-map-js@1.2.1: {} - source-map@0.6.1: - optional: true - space-separated-tokens@2.0.2: {} stackback@0.0.2: {} @@ -9957,12 +8376,6 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@2.2.3: {} - - strtok3@10.3.5: - dependencies: - '@tokenizer/token': 0.3.0 - style-to-js@1.1.21: dependencies: style-to-object: 1.0.14 @@ -9973,10 +8386,6 @@ snapshots: supports-color@10.2.2: {} - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - svgo@4.0.1: dependencies: commander: 11.1.0 @@ -9993,14 +8402,6 @@ snapshots: tapable@2.3.3: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - tiny-inflate@1.0.3: {} tinybench@2.9.0: {} @@ -10024,12 +8425,6 @@ snapshots: dependencies: is-number: 7.0.0 - token-types@6.1.2: - dependencies: - '@borewit/text-codec': 0.2.2 - '@tokenizer/token': 0.3.0 - ieee754: 1.2.1 - trim-lines@3.0.1: {} trough@2.2.0: {} @@ -10046,14 +8441,10 @@ snapshots: typebox@1.1.38: {} - typebox@1.2.16: {} - typescript@5.9.3: {} ufo@1.6.4: {} - uint8array-extras@1.5.0: {} - ultrahtml@1.6.0: {} uncrypto@0.1.3: {} @@ -10172,8 +8563,6 @@ snapshots: util-deprecate@1.0.2: {} - uuid@14.0.0: {} - vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -10189,13 +8578,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3): + vite-node@3.2.4(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) transitivePeerDependencies: - '@types/node' - jiti @@ -10210,7 +8599,7 @@ snapshots: - tsx - yaml - vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3): + vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.4) @@ -10223,17 +8612,17 @@ snapshots: fsevents: 2.3.3 jiti: 2.7.0 lightningcss: 1.32.0 - yaml: 2.8.3 + yaml: 2.9.0 - vitefu@1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)): + vitefu@1.1.3(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)): optionalDependencies: - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) - vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3): + vitest@3.2.4(@types/debug@4.1.13)(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3)) + '@vitest/mocker': 3.2.4(vite@6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -10251,8 +8640,8 @@ snapshots: tinyglobby: 0.2.16 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) - vite-node: 3.2.4(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.8.3) + vite: 6.4.2(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) + vite-node: 3.2.4(@types/node@24.12.2)(jiti@2.7.0)(lightningcss@1.32.0)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 @@ -10317,53 +8706,24 @@ snapshots: - bufferutil - utf-8-validate - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 strip-ansi: 7.2.0 - wrappy@1.0.2: {} - ws@8.18.0: {} ws@8.20.1: {} xxhash-wasm@1.1.0: {} - y18n@5.0.8: {} - yallist@3.1.1: {} - yaml@2.8.3: {} - yaml@2.9.0: {} - yargs-parser@20.2.9: {} - yargs-parser@21.1.1: {} - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - yocto-queue@1.2.2: {} yocto-spinner@0.2.3: @@ -10389,10 +8749,6 @@ snapshots: dependencies: zod: 3.25.76 - zod-to-json-schema@3.25.2(zod@4.3.6): - dependencies: - zod: 4.3.6 - zod-to-ts@1.2.0(typescript@5.9.3)(zod@3.25.76): dependencies: typescript: 5.9.3