From 0d19f6ebfff5c618100217732da39dafe96573f5 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 12:41:24 +0000 Subject: [PATCH 1/7] =?UTF-8?q?feat(web):=20port=20chat=20page=20UI=20from?= =?UTF-8?q?=20platform=20=E2=80=94=20transcript,=20hooks,=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the remaining chat page UI from vellum-assistant-platform to vellum-assistant so chat-page.tsx renders a real chat interface. Moved directories: - _transcript/ → domains/chat/transcript/ - _hooks/ → domains/chat/hooks/ - _components/ → domains/chat/components/ - _context/chat-context.tsx → domains/chat/chat-context.tsx - _utils/ → domains/chat/utils/ Moved shared components: - MarkdownMessage, BusyIndicator, ToolCallChip, ToolCallProgressCard, MessageHoverActions, surfaces/, ChatComposer, ConnectingToAssistant, SubagentProgressCard, SubagentStatusBadge Convention updates applied: - Removed all 'use client' directives (Vite SPA) - kebab-case filenames throughout - .js extensions in all imports (NodeNext resolution) - next/navigation → react-router - @sentry/nextjs → @sentry/react - Design library imports via @vellum/design-library Stubs created for missing dependencies with TODO comments. chat-page.tsx wired up with real state machines, hooks, and context. Typecheck: 0 non-test errors Lint: 0 errors (26 warnings — unused eslint-disable directives) Co-Authored-By: ashlee@vellum.ai --- apps/web/bun.lock | 209 ++- apps/web/package.json | 7 + apps/web/src/adapters/app-link.tsx | 12 + apps/web/src/adapters/app-routing.tsx | 34 + .../settings/ai/profileParamVisibility.ts | 3 + apps/web/src/app/ui-gallery/_gallery.tsx | 19 + apps/web/src/components/app-card.tsx | 12 + .../src/components/app-viewer-container.tsx | 2 + apps/web/src/components/avatar-renderer.tsx | 2 + apps/web/src/components/busy-indicator.tsx | 25 + .../src/components/chat-attachments/index.ts | 25 + .../chat-attachments/use-chat-attachments.ts | 12 + .../chat-composer/chat-composer.test.tsx | 520 ++++++ .../chat-composer/chat-composer.tsx | 731 +++++++++ .../components/chat-composer/emoji-catalog.ts | 428 +++++ .../chat-composer/emoji-picker-popup.tsx | 59 + .../chat-composer/markdown-formatting.test.ts | 247 +++ .../chat-composer/markdown-formatting.ts | 110 ++ .../chat-composer/slash-command-catalog.ts | 31 + .../chat-composer/slash-command-popup.tsx | 63 + .../chat-composer/streaming-waveform.tsx | 135 ++ .../use-composer-controller.test.ts | 369 +++++ .../chat-composer/use-composer-controller.ts | 286 ++++ .../chat-empty-state/chat-empty-state.tsx | 4 + apps/web/src/components/chat-skeleton.tsx | 2 + .../command-palette/command-palette.tsx | 20 + .../command-palette/use-command-palette.ts | 32 + .../compaction-circuit-open-banner.tsx | 2 + .../src/components/composer-settings-menu.tsx | 2 + .../connecting-to-assistant.tsx | 236 +++ .../components/context-window-indicator.tsx | 6 + .../components/conversation-starter-grid.tsx | 9 + apps/web/src/components/countdown-timer.tsx | 2 + .../components/credits-exhausted-banner.tsx | 2 + apps/web/src/components/discord-banner.tsx | 2 + .../src/components/discord-nudge-banner.tsx | 2 + .../src/components/disk-pressure-banner.tsx | 3 + .../components/document-viewer-container.tsx | 2 + .../src/components/emoji-exit-animation.tsx | 2 + .../src/components/github-nudge-banner.tsx | 2 + .../web/src/components/github-star-banner.tsx | 2 + apps/web/src/components/input.tsx | 3 + apps/web/src/components/inputs/dropdown.tsx | 9 + apps/web/src/components/inputs/input.tsx | 13 + apps/web/src/components/inputs/toggle.tsx | 2 + apps/web/src/components/ios-app-banner.tsx | 2 + apps/web/src/components/macos-app-banner.tsx | 2 + .../components/maintenance-mode-banner.tsx | 2 + .../src/components/markdown-message.test.tsx | 127 ++ apps/web/src/components/markdown-message.tsx | 296 ++++ .../components/message-hover-actions/index.ts | 1 + .../message-hover-actions.tsx | 150 ++ .../src/components/mic-permission-primer.tsx | 3 + .../src/components/missing-api-key-banner.tsx | 2 + apps/web/src/components/panel-item.tsx | 11 + apps/web/src/components/popover.tsx | 12 + .../components/provider-billing-banner.tsx | 2 + .../src/components/queued-messages-drawer.tsx | 2 + apps/web/src/components/select.tsx | 2 + apps/web/src/components/subagent-avatar.tsx | 2 + .../subagent-detail-panel.tsx | 2 + .../subagent-progress-card.tsx | 275 ++++ .../src/components/subagent-status-badge.tsx | 20 + apps/web/src/components/surfaces/app-card.tsx | 2 + .../surfaces/browser-view-surface.tsx | 51 + .../surfaces/call-summary-surface.tsx | 95 ++ .../surfaces/card-surface.gallery.tsx | 366 +++++ .../src/components/surfaces/card-surface.tsx | 253 +++ .../surfaces/confirmation-surface.tsx | 124 ++ .../surfaces/document-preview-surface.tsx | 94 ++ .../surfaces/dynamic-page-app-id.test.ts | 49 + .../surfaces/dynamic-page-app-id.ts | 12 + .../surfaces/dynamic-page-surface.test.tsx | 96 ++ .../surfaces/dynamic-page-surface.tsx | 439 +++++ .../surfaces/file-upload-surface.tsx | 376 +++++ .../src/components/surfaces/form-surface.tsx | 378 +++++ apps/web/src/components/surfaces/index.ts | 13 + .../src/components/surfaces/list-surface.tsx | 149 ++ .../src/components/surfaces/sf-symbol-map.ts | 325 ++++ .../components/surfaces/surface-container.tsx | 73 + .../components/surfaces/surface-router.tsx | 111 ++ .../src/components/surfaces/table-surface.tsx | 263 +++ .../surfaces/weather-forecast-display.tsx | 616 +++++++ apps/web/src/components/switch.tsx | 2 + apps/web/src/components/toast.ts | 12 + apps/web/src/components/toast.tsx | 2 + .../src/components/tool-call-chip/index.ts | 1 + .../tool-call-chip/tool-call-chip.gallery.tsx | 234 +++ .../tool-call-chip/tool-call-chip.tsx | 556 +++++++ .../components/tool-call-chip/utils.test.ts | 849 ++++++++++ .../src/components/tool-call-chip/utils.ts | 621 +++++++ .../tool-call-progress-card.gallery.tsx | 308 ++++ .../tool-call-progress-card.tsx | 671 ++++++++ .../web/src/components/voice-input-button.tsx | 11 + .../src/domains/avatar/subagent-avatar.tsx | 2 + apps/web/src/domains/chat/chat-context.tsx | 148 ++ apps/web/src/domains/chat/chat-page.tsx | 276 +++- .../chat/components/chat-body.test.tsx | 205 +++ .../src/domains/chat/components/chat-body.tsx | 246 +++ .../chat/components/chat-pill.test.tsx | 76 + .../src/domains/chat/components/chat-pill.tsx | 77 + .../chat/components/chat-route-content.tsx | 1454 +++++++++++++++++ .../chat/components/chat-scroll-area.test.tsx | 91 ++ .../chat/components/chat-scroll-area.tsx | 87 + .../chat/components/cleanup-screen.tsx | 89 + .../chat/components/composer-notices.tsx | 171 ++ .../components/confirmation-prompt-card.tsx | 193 +++ .../chat/components/contact-prompt-card.tsx | 118 ++ .../components/maintenance-recovery-card.tsx | 36 + .../chat/components/mobile-app-overlay.tsx | 2 + .../components/mobile-document-overlay.tsx | 2 + .../mobile-subagent-detail-overlay.tsx | 2 + .../components/platform-hosted-screen.tsx | 29 + .../components/question-prompt-card.test.tsx | 893 ++++++++++ .../chat/components/question-prompt-card.tsx | 484 ++++++ .../components/scroll-to-latest-button.tsx | 18 + .../chat/components/secret-prompt-card.tsx | 180 ++ .../components/self-hosted-screen.test.tsx | 28 + .../chat/components/self-hosted-screen.tsx | 34 + .../domains/chat/components/setup-screen.tsx | 42 + .../components/version-selection-screen.tsx | 81 + .../chat/hooks/send-message-utils.test.ts | 241 +++ .../domains/chat/hooks/send-message-utils.ts | 213 +++ .../hooks/stream-message-updaters.test.ts | 242 +++ .../chat/hooks/stream-message-updaters.ts | 545 ++++++ .../chat/hooks/use-active-app-pin-sync.ts | 21 + .../src/domains/chat/hooks/use-app-nudges.ts | 186 +++ .../chat/hooks/use-app-viewer-actions.ts | 460 ++++++ .../chat/hooks/use-assistant-lifecycle.ts | 409 +++++ .../use-attention-tracking-graduation.test.ts | 101 ++ .../chat/hooks/use-attention-tracking.ts | 277 ++++ .../use-command-palette-sections.test.ts | 83 + .../hooks/use-command-palette-sections.ts | 334 ++++ .../hooks/use-conversation-actions.test.ts | 152 ++ .../chat/hooks/use-conversation-actions.ts | 319 ++++ .../use-conversation-group-actions.test.ts | 37 + .../hooks/use-conversation-group-actions.ts | 137 ++ .../chat/hooks/use-conversation-history.ts | 680 ++++++++ .../chat/hooks/use-conversation-loader.ts | 542 ++++++ .../use-conversation-secondary-actions.ts | 207 +++ .../domains/chat/hooks/use-event-stream.ts | 574 +++++++ .../domains/chat/hooks/use-hint-rotation.ts | 22 + .../chat/hooks/use-interaction-actions.ts | 739 +++++++++ .../domains/chat/hooks/use-message-queue.ts | 127 ++ .../domains/chat/hooks/use-pull-refresh.ts | 162 ++ .../hooks/use-refresh-latest-messages.test.ts | 765 +++++++++ .../chat/hooks/use-refresh-latest-messages.ts | 208 +++ .../web/src/domains/chat/hooks/use-routing.ts | 44 + .../domains/chat/hooks/use-send-message.ts | 634 +++++++ .../chat/hooks/use-stream-event-handler.ts | 501 ++++++ .../chat/hooks/use-terminal-session.test.ts | 510 ++++++ .../chat/hooks/use-terminal-session.ts | 5 + .../chat/hooks/use-terminal-state.test.ts | 353 ++++ .../domains/chat/hooks/use-terminal-state.ts | 18 + .../src/domains/chat/hooks/use-voice-input.ts | 240 +++ .../domains/chat/refresh-feedback-pill.tsx | 93 ++ .../chat/transcript/latest-turn-row.test.tsx | 227 +++ .../chat/transcript/latest-turn-row.tsx | 186 +++ .../chat/transcript/pull-refresh-spinner.tsx | 147 ++ .../transcript/transcript-message-body.tsx | 451 +++++ .../chat/transcript/transcript-row.tsx | 291 ++++ .../chat/transcript/transcript.test.tsx | 190 +++ .../domains/chat/transcript/transcript.tsx | 274 ++++ .../transcript/use-pull-to-refresh.test.ts | 158 ++ .../chat/transcript/use-pull-to-refresh.ts | 339 ++++ .../transcript/use-transcript-scroll.test.ts | 461 ++++++ .../chat/transcript/use-transcript-scroll.ts | 408 +++++ .../transcript/use-viewport-min-height.ts | 52 + apps/web/src/domains/chat/types.ts | 81 + apps/web/src/domains/chat/utils/chat-utils.ts | 233 +++ .../stream-handlers/error-handlers.test.ts | 48 + .../utils/stream-handlers/error-handlers.ts | 60 + .../utils/stream-handlers/home-handlers.ts | 19 + .../chat/utils/stream-handlers/index.ts | 56 + .../interaction-handlers.test.ts | 63 + .../stream-handlers/interaction-handlers.ts | 108 ++ .../stream-handlers/message-handlers.test.ts | 188 +++ .../utils/stream-handlers/message-handlers.ts | 162 ++ .../stream-handlers/metadata-handlers.test.ts | 159 ++ .../stream-handlers/metadata-handlers.ts | 151 ++ .../stream-handlers/navigation-handlers.ts | 60 + .../stream-handlers/queue-handlers.test.ts | 116 ++ .../utils/stream-handlers/queue-handlers.ts | 79 + .../stream-handlers/subagent-handlers.ts | 55 + .../stream-handlers/surface-handlers.test.ts | 111 ++ .../utils/stream-handlers/surface-handlers.ts | 93 ++ .../utils/stream-handlers/test-helpers.ts | 49 + .../tool-call-handlers.test.ts | 66 + .../stream-handlers/tool-call-handlers.ts | 61 + .../chat/utils/stream-handlers/types.ts | 116 ++ apps/web/src/lib/api/errors.ts | 9 + apps/web/src/lib/assistants/api.ts | 28 + apps/web/src/lib/assistants/disk-pressure.ts | 13 + apps/web/src/lib/assistants/lifecycle.ts | 31 + .../assistants/useAssistantReachability.ts | 5 + .../lib/assistants/useDiskPressureMonitor.ts | 6 + apps/web/src/lib/avatar/bundled-components.ts | 3 + apps/web/src/lib/avatar/subagent-avatar.ts | 5 + apps/web/src/lib/avatar/types.ts | 2 + apps/web/src/lib/discord-nudge/prefs.ts | 12 + apps/web/src/lib/feature-flags/app.ts | 32 + apps/web/src/lib/github-nudge/prefs.ts | 11 + apps/web/src/lib/hooks/use-option-hotkeys.ts | 8 + apps/web/src/lib/ios-app-nudge/constants.ts | 3 + apps/web/src/lib/ios-app-nudge/platform.ts | 3 + apps/web/src/lib/ios-app-nudge/prefs.ts | 15 + apps/web/src/lib/mac-app-nudge/constants.ts | 3 + apps/web/src/lib/mac-app-nudge/platform.ts | 3 + apps/web/src/lib/mac-app-nudge/prefs.ts | 8 + apps/web/src/lib/native-auth.ts | 4 + apps/web/src/lib/notifications/native.ts | 14 + apps/web/src/lib/onboarding/gate.ts | 3 + apps/web/src/lib/settings/navigation.ts | 2 + apps/web/src/lib/sync/web-sync-router.ts | 23 + apps/web/src/lib/terminal/api.ts | 3 + .../src/lib/terminal/use-terminal-session.ts | 16 + .../src/lib/terminal/use-terminal-state.ts | 34 + apps/web/src/lib/toast.ts | 7 + apps/web/src/lib/trust-rules/api.ts | 3 + apps/web/src/lib/voice/dictation-api.ts | 18 + apps/web/src/lib/voice/use-audio-amplitude.ts | 2 + apps/web/src/lib/voice/use-push-to-talk.ts | 4 + .../src/lib/voice/voice-recording-state.ts | 5 + apps/web/src/test-utils.ts | 4 + apps/web/src/utils/pointer.ts | 5 + 225 files changed, 32669 insertions(+), 6 deletions(-) create mode 100644 apps/web/src/adapters/app-link.tsx create mode 100644 apps/web/src/adapters/app-routing.tsx create mode 100644 apps/web/src/app/assistant/settings/ai/profileParamVisibility.ts create mode 100644 apps/web/src/app/ui-gallery/_gallery.tsx create mode 100644 apps/web/src/components/app-card.tsx create mode 100644 apps/web/src/components/app-viewer-container.tsx create mode 100644 apps/web/src/components/avatar-renderer.tsx create mode 100644 apps/web/src/components/busy-indicator.tsx create mode 100644 apps/web/src/components/chat-attachments/index.ts create mode 100644 apps/web/src/components/chat-attachments/use-chat-attachments.ts create mode 100644 apps/web/src/components/chat-composer/chat-composer.test.tsx create mode 100644 apps/web/src/components/chat-composer/chat-composer.tsx create mode 100644 apps/web/src/components/chat-composer/emoji-catalog.ts create mode 100644 apps/web/src/components/chat-composer/emoji-picker-popup.tsx create mode 100644 apps/web/src/components/chat-composer/markdown-formatting.test.ts create mode 100644 apps/web/src/components/chat-composer/markdown-formatting.ts create mode 100644 apps/web/src/components/chat-composer/slash-command-catalog.ts create mode 100644 apps/web/src/components/chat-composer/slash-command-popup.tsx create mode 100644 apps/web/src/components/chat-composer/streaming-waveform.tsx create mode 100644 apps/web/src/components/chat-composer/use-composer-controller.test.ts create mode 100644 apps/web/src/components/chat-composer/use-composer-controller.ts create mode 100644 apps/web/src/components/chat-empty-state/chat-empty-state.tsx create mode 100644 apps/web/src/components/chat-skeleton.tsx create mode 100644 apps/web/src/components/command-palette/command-palette.tsx create mode 100644 apps/web/src/components/command-palette/use-command-palette.ts create mode 100644 apps/web/src/components/compaction-circuit-open-banner.tsx create mode 100644 apps/web/src/components/composer-settings-menu.tsx create mode 100644 apps/web/src/components/connecting-to-assistant/connecting-to-assistant.tsx create mode 100644 apps/web/src/components/context-window-indicator.tsx create mode 100644 apps/web/src/components/conversation-starter-grid.tsx create mode 100644 apps/web/src/components/countdown-timer.tsx create mode 100644 apps/web/src/components/credits-exhausted-banner.tsx create mode 100644 apps/web/src/components/discord-banner.tsx create mode 100644 apps/web/src/components/discord-nudge-banner.tsx create mode 100644 apps/web/src/components/disk-pressure-banner.tsx create mode 100644 apps/web/src/components/document-viewer-container.tsx create mode 100644 apps/web/src/components/emoji-exit-animation.tsx create mode 100644 apps/web/src/components/github-nudge-banner.tsx create mode 100644 apps/web/src/components/github-star-banner.tsx create mode 100644 apps/web/src/components/input.tsx create mode 100644 apps/web/src/components/inputs/dropdown.tsx create mode 100644 apps/web/src/components/inputs/input.tsx create mode 100644 apps/web/src/components/inputs/toggle.tsx create mode 100644 apps/web/src/components/ios-app-banner.tsx create mode 100644 apps/web/src/components/macos-app-banner.tsx create mode 100644 apps/web/src/components/maintenance-mode-banner.tsx create mode 100644 apps/web/src/components/markdown-message.test.tsx create mode 100644 apps/web/src/components/markdown-message.tsx create mode 100644 apps/web/src/components/message-hover-actions/index.ts create mode 100644 apps/web/src/components/message-hover-actions/message-hover-actions.tsx create mode 100644 apps/web/src/components/mic-permission-primer.tsx create mode 100644 apps/web/src/components/missing-api-key-banner.tsx create mode 100644 apps/web/src/components/panel-item.tsx create mode 100644 apps/web/src/components/popover.tsx create mode 100644 apps/web/src/components/provider-billing-banner.tsx create mode 100644 apps/web/src/components/queued-messages-drawer.tsx create mode 100644 apps/web/src/components/select.tsx create mode 100644 apps/web/src/components/subagent-avatar.tsx create mode 100644 apps/web/src/components/subagent-detail-panel/subagent-detail-panel.tsx create mode 100644 apps/web/src/components/subagent-progress-card/subagent-progress-card.tsx create mode 100644 apps/web/src/components/subagent-status-badge.tsx create mode 100644 apps/web/src/components/surfaces/app-card.tsx create mode 100644 apps/web/src/components/surfaces/browser-view-surface.tsx create mode 100644 apps/web/src/components/surfaces/call-summary-surface.tsx create mode 100644 apps/web/src/components/surfaces/card-surface.gallery.tsx create mode 100644 apps/web/src/components/surfaces/card-surface.tsx create mode 100644 apps/web/src/components/surfaces/confirmation-surface.tsx create mode 100644 apps/web/src/components/surfaces/document-preview-surface.tsx create mode 100644 apps/web/src/components/surfaces/dynamic-page-app-id.test.ts create mode 100644 apps/web/src/components/surfaces/dynamic-page-app-id.ts create mode 100644 apps/web/src/components/surfaces/dynamic-page-surface.test.tsx create mode 100644 apps/web/src/components/surfaces/dynamic-page-surface.tsx create mode 100644 apps/web/src/components/surfaces/file-upload-surface.tsx create mode 100644 apps/web/src/components/surfaces/form-surface.tsx create mode 100644 apps/web/src/components/surfaces/index.ts create mode 100644 apps/web/src/components/surfaces/list-surface.tsx create mode 100644 apps/web/src/components/surfaces/sf-symbol-map.ts create mode 100644 apps/web/src/components/surfaces/surface-container.tsx create mode 100644 apps/web/src/components/surfaces/surface-router.tsx create mode 100644 apps/web/src/components/surfaces/table-surface.tsx create mode 100644 apps/web/src/components/surfaces/weather-forecast-display.tsx create mode 100644 apps/web/src/components/switch.tsx create mode 100644 apps/web/src/components/toast.ts create mode 100644 apps/web/src/components/toast.tsx create mode 100644 apps/web/src/components/tool-call-chip/index.ts create mode 100644 apps/web/src/components/tool-call-chip/tool-call-chip.gallery.tsx create mode 100644 apps/web/src/components/tool-call-chip/tool-call-chip.tsx create mode 100644 apps/web/src/components/tool-call-chip/utils.test.ts create mode 100644 apps/web/src/components/tool-call-chip/utils.ts create mode 100644 apps/web/src/components/tool-call-progress-card/tool-call-progress-card.gallery.tsx create mode 100644 apps/web/src/components/tool-call-progress-card/tool-call-progress-card.tsx create mode 100644 apps/web/src/components/voice-input-button.tsx create mode 100644 apps/web/src/domains/avatar/subagent-avatar.tsx create mode 100644 apps/web/src/domains/chat/chat-context.tsx create mode 100644 apps/web/src/domains/chat/components/chat-body.test.tsx create mode 100644 apps/web/src/domains/chat/components/chat-body.tsx create mode 100644 apps/web/src/domains/chat/components/chat-pill.test.tsx create mode 100644 apps/web/src/domains/chat/components/chat-pill.tsx create mode 100644 apps/web/src/domains/chat/components/chat-route-content.tsx create mode 100644 apps/web/src/domains/chat/components/chat-scroll-area.test.tsx create mode 100644 apps/web/src/domains/chat/components/chat-scroll-area.tsx create mode 100644 apps/web/src/domains/chat/components/cleanup-screen.tsx create mode 100644 apps/web/src/domains/chat/components/composer-notices.tsx create mode 100644 apps/web/src/domains/chat/components/confirmation-prompt-card.tsx create mode 100644 apps/web/src/domains/chat/components/contact-prompt-card.tsx create mode 100644 apps/web/src/domains/chat/components/maintenance-recovery-card.tsx create mode 100644 apps/web/src/domains/chat/components/mobile-app-overlay.tsx create mode 100644 apps/web/src/domains/chat/components/mobile-document-overlay.tsx create mode 100644 apps/web/src/domains/chat/components/mobile-subagent-detail-overlay.tsx create mode 100644 apps/web/src/domains/chat/components/platform-hosted-screen.tsx create mode 100644 apps/web/src/domains/chat/components/question-prompt-card.test.tsx create mode 100644 apps/web/src/domains/chat/components/question-prompt-card.tsx create mode 100644 apps/web/src/domains/chat/components/scroll-to-latest-button.tsx create mode 100644 apps/web/src/domains/chat/components/secret-prompt-card.tsx create mode 100644 apps/web/src/domains/chat/components/self-hosted-screen.test.tsx create mode 100644 apps/web/src/domains/chat/components/self-hosted-screen.tsx create mode 100644 apps/web/src/domains/chat/components/setup-screen.tsx create mode 100644 apps/web/src/domains/chat/components/version-selection-screen.tsx create mode 100644 apps/web/src/domains/chat/hooks/send-message-utils.test.ts create mode 100644 apps/web/src/domains/chat/hooks/send-message-utils.ts create mode 100644 apps/web/src/domains/chat/hooks/stream-message-updaters.test.ts create mode 100644 apps/web/src/domains/chat/hooks/stream-message-updaters.ts create mode 100644 apps/web/src/domains/chat/hooks/use-active-app-pin-sync.ts create mode 100644 apps/web/src/domains/chat/hooks/use-app-nudges.ts create mode 100644 apps/web/src/domains/chat/hooks/use-app-viewer-actions.ts create mode 100644 apps/web/src/domains/chat/hooks/use-assistant-lifecycle.ts create mode 100644 apps/web/src/domains/chat/hooks/use-attention-tracking-graduation.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-attention-tracking.ts create mode 100644 apps/web/src/domains/chat/hooks/use-command-palette-sections.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-command-palette-sections.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-actions.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-actions.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-group-actions.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-group-actions.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-history.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-loader.ts create mode 100644 apps/web/src/domains/chat/hooks/use-conversation-secondary-actions.ts create mode 100644 apps/web/src/domains/chat/hooks/use-event-stream.ts create mode 100644 apps/web/src/domains/chat/hooks/use-hint-rotation.ts create mode 100644 apps/web/src/domains/chat/hooks/use-interaction-actions.ts create mode 100644 apps/web/src/domains/chat/hooks/use-message-queue.ts create mode 100644 apps/web/src/domains/chat/hooks/use-pull-refresh.ts create mode 100644 apps/web/src/domains/chat/hooks/use-refresh-latest-messages.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-refresh-latest-messages.ts create mode 100644 apps/web/src/domains/chat/hooks/use-routing.ts create mode 100644 apps/web/src/domains/chat/hooks/use-send-message.ts create mode 100644 apps/web/src/domains/chat/hooks/use-stream-event-handler.ts create mode 100644 apps/web/src/domains/chat/hooks/use-terminal-session.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-terminal-session.ts create mode 100644 apps/web/src/domains/chat/hooks/use-terminal-state.test.ts create mode 100644 apps/web/src/domains/chat/hooks/use-terminal-state.ts create mode 100644 apps/web/src/domains/chat/hooks/use-voice-input.ts create mode 100644 apps/web/src/domains/chat/refresh-feedback-pill.tsx create mode 100644 apps/web/src/domains/chat/transcript/latest-turn-row.test.tsx create mode 100644 apps/web/src/domains/chat/transcript/latest-turn-row.tsx create mode 100644 apps/web/src/domains/chat/transcript/pull-refresh-spinner.tsx create mode 100644 apps/web/src/domains/chat/transcript/transcript-message-body.tsx create mode 100644 apps/web/src/domains/chat/transcript/transcript-row.tsx create mode 100644 apps/web/src/domains/chat/transcript/transcript.test.tsx create mode 100644 apps/web/src/domains/chat/transcript/transcript.tsx create mode 100644 apps/web/src/domains/chat/transcript/use-pull-to-refresh.test.ts create mode 100644 apps/web/src/domains/chat/transcript/use-pull-to-refresh.ts create mode 100644 apps/web/src/domains/chat/transcript/use-transcript-scroll.test.ts create mode 100644 apps/web/src/domains/chat/transcript/use-transcript-scroll.ts create mode 100644 apps/web/src/domains/chat/transcript/use-viewport-min-height.ts create mode 100644 apps/web/src/domains/chat/types.ts create mode 100644 apps/web/src/domains/chat/utils/chat-utils.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/error-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/error-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/home-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/index.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/interaction-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/interaction-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/message-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/message-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/metadata-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/metadata-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/navigation-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/queue-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/queue-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/subagent-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/surface-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/surface-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/test-helpers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/tool-call-handlers.test.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/tool-call-handlers.ts create mode 100644 apps/web/src/domains/chat/utils/stream-handlers/types.ts create mode 100644 apps/web/src/lib/api/errors.ts create mode 100644 apps/web/src/lib/assistants/api.ts create mode 100644 apps/web/src/lib/assistants/disk-pressure.ts create mode 100644 apps/web/src/lib/assistants/lifecycle.ts create mode 100644 apps/web/src/lib/assistants/useAssistantReachability.ts create mode 100644 apps/web/src/lib/assistants/useDiskPressureMonitor.ts create mode 100644 apps/web/src/lib/avatar/bundled-components.ts create mode 100644 apps/web/src/lib/avatar/subagent-avatar.ts create mode 100644 apps/web/src/lib/avatar/types.ts create mode 100644 apps/web/src/lib/discord-nudge/prefs.ts create mode 100644 apps/web/src/lib/feature-flags/app.ts create mode 100644 apps/web/src/lib/github-nudge/prefs.ts create mode 100644 apps/web/src/lib/hooks/use-option-hotkeys.ts create mode 100644 apps/web/src/lib/ios-app-nudge/constants.ts create mode 100644 apps/web/src/lib/ios-app-nudge/platform.ts create mode 100644 apps/web/src/lib/ios-app-nudge/prefs.ts create mode 100644 apps/web/src/lib/mac-app-nudge/constants.ts create mode 100644 apps/web/src/lib/mac-app-nudge/platform.ts create mode 100644 apps/web/src/lib/mac-app-nudge/prefs.ts create mode 100644 apps/web/src/lib/native-auth.ts create mode 100644 apps/web/src/lib/notifications/native.ts create mode 100644 apps/web/src/lib/onboarding/gate.ts create mode 100644 apps/web/src/lib/settings/navigation.ts create mode 100644 apps/web/src/lib/sync/web-sync-router.ts create mode 100644 apps/web/src/lib/terminal/api.ts create mode 100644 apps/web/src/lib/terminal/use-terminal-session.ts create mode 100644 apps/web/src/lib/terminal/use-terminal-state.ts create mode 100644 apps/web/src/lib/toast.ts create mode 100644 apps/web/src/lib/trust-rules/api.ts create mode 100644 apps/web/src/lib/voice/dictation-api.ts create mode 100644 apps/web/src/lib/voice/use-audio-amplitude.ts create mode 100644 apps/web/src/lib/voice/use-push-to-talk.ts create mode 100644 apps/web/src/lib/voice/voice-recording-state.ts create mode 100644 apps/web/src/test-utils.ts create mode 100644 apps/web/src/utils/pointer.ts diff --git a/apps/web/bun.lock b/apps/web/bun.lock index 61f632e8409..145a6579d12 100644 --- a/apps/web/bun.lock +++ b/apps/web/bun.lock @@ -5,6 +5,7 @@ "": { "name": "@vellumai/web", "dependencies": { + "@capacitor/app": "8.1.0", "@capacitor/browser": "8.0.3", "@capacitor/core": "8.3.4", "@capacitor/filesystem": "8.1.2", @@ -13,7 +14,11 @@ "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-slot": "1.2.4", "@sentry/browser": "10.53.1", + "@sentry/react": "10.53.1", "@tanstack/react-query": "5.90.21", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/react": "16.3.2", + "@testing-library/user-event": "14.6.1", "@vellum/design-library": "file:../../packages/design-library", "class-variance-authority": "0.7.1", "clsx": "2.1.1", @@ -22,7 +27,9 @@ "motion": "12.39.0", "react": "19.2.6", "react-dom": "19.2.6", + "react-markdown": "10.1.0", "react-router": "7.15.0", + "remark-gfm": "4.0.1", "tailwind-merge": "3.6.0", }, "devDependencies": { @@ -79,6 +86,8 @@ "@babel/types": ["@babel/types@7.29.0", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A=="], + "@capacitor/app": ["@capacitor/app@8.1.0", "", { "peerDependencies": { "@capacitor/core": ">=8.0.0" } }, "sha512-MlmttTOWHDedr/G4SrhNRxsXMqY+R75S4MM4eIgzsgCzOYhb/MpCkA5Q3nuOCfL1oHm26xjUzqZ5aupbOwdfYg=="], + "@capacitor/browser": ["@capacitor/browser@8.0.3", "", { "peerDependencies": { "@capacitor/core": ">=8.0.0" } }, "sha512-WJWPHEPbweiFoHYmVlCbZf5yrqJ2Rchx2Xvbmd+3Lf+Zkpq3nXBThThY2CF69lYEg1NINGF9BcHThIOEU1gZlQ=="], "@capacitor/core": ["@capacitor/core@8.3.4", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-CqRQCkb6HXxcx/N7s+hHTN6ef2CmamFiRMITwm4qB840ph56mS42bzUgn6tKCP+RZjdDweiRHj9ytDDeN6jFag=="], @@ -413,6 +422,8 @@ "@sentry/core": ["@sentry/core@10.53.1", "", {}, "sha512-XG4ezlkyuAPjBC5+9kXC94rXXuqYTw9NRhfaDHssbTFaGnqBR8vQX2UUgZfY7ucbeelRDGfBu1sywoU+mB04uA=="], + "@sentry/react": ["@sentry/react@10.53.1", "", { "dependencies": { "@sentry/browser": "10.53.1", "@sentry/core": "10.53.1" }, "peerDependencies": { "react": "^16.14.0 || 17.x || 18.x || 19.x" } }, "sha512-lrwNq5T/zW84l60894TpKHPcvFuc1I/Hnohecc0TfYVpIcYYuw2orCHoU4v4wgkFaJUpegVetbgdOphViyLVjA=="], + "@storybook/addon-a11y": ["@storybook/addon-a11y@10.4.0", "", { "dependencies": { "@storybook/global": "^5.0.0", "axe-core": "^4.2.0" }, "peerDependencies": { "storybook": "^10.4.0" } }, "sha512-N1QRmh+PMe5O81KDf8oPDv/csdLAmDCRCYLByukqdUXpTNlcULHDFUJNXl00/rFpbt7PbOZqzRzs72JJt6nWPA=="], "@storybook/addon-docs": ["@storybook/addon-docs@10.4.0", "", { "dependencies": { "@mdx-js/react": "^3.0.0", "@storybook/csf-plugin": "10.4.0", "@storybook/icons": "^2.0.2", "@storybook/react-dom-shim": "10.4.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "storybook": "^10.4.0" }, "optionalPeers": ["@types/react"] }, "sha512-HJNvYGx/c3jjVwibnmbDgCZMYPI6xGUDjJSRi5CG0G9tpeoeijPo318f5N84RyYWK8LheHUrDN3Jv2UfVv8zwQ=="], @@ -469,6 +480,8 @@ "@testing-library/jest-dom": ["@testing-library/jest-dom@6.9.1", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "picocolors": "^1.1.1", "redent": "^3.0.0" } }, "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA=="], + "@testing-library/react": ["@testing-library/react@16.3.2", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "@testing-library/dom": "^10.0.0", "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g=="], + "@testing-library/user-event": ["@testing-library/user-event@14.6.1", "", { "peerDependencies": { "@testing-library/dom": ">=7.21.4" } }, "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.10.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], @@ -487,6 +500,8 @@ "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], + "@types/debug": ["@types/debug@4.1.13", "", { "dependencies": { "@types/ms": "*" } }, "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw=="], + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], "@types/doctrine": ["@types/doctrine@0.0.9", "", {}, "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA=="], @@ -495,10 +510,18 @@ "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], + "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="], + + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + "@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="], + "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="], + "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], + "@types/node": ["@types/node@25.9.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-AOQwYUNolgy3VosiRqXrACUXTN8nJUtPl7FJXMqZVyxiiCLhQuG3jXKvCS1ALr+Y2OmZhzzLVlYPEqJaiqkaJQ=="], "@types/react": ["@types/react@19.2.14", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w=="], @@ -507,6 +530,8 @@ "@types/resolve": ["@types/resolve@1.20.6", "", {}, "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ=="], + "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.58.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/type-utils": "8.58.1", "@typescript-eslint/utils": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.58.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-eSkwoemjo76bdXl2MYqtxg51HNwUSkWfODUOQ3PaTLZGh9uIWWFZIjyjaJnex7wXDu+TRx+ATsnSxdN9YWfRTQ=="], "@typescript-eslint/parser": ["@typescript-eslint/parser@8.58.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.58.1", "@typescript-eslint/types": "8.58.1", "@typescript-eslint/typescript-estree": "8.58.1", "@typescript-eslint/visitor-keys": "8.58.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-gGkiNMPqerb2cJSVcruigx9eHBlLG14fSdPdqMoOcBfh+vvn4iCq2C8MzUB89PrxOXk0y3GZ1yIWb9aOzL93bw=="], @@ -527,6 +552,8 @@ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.58.1", "", { "dependencies": { "@typescript-eslint/types": "8.58.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-y+vH7QE8ycjoa0bWciFg7OpFcipUuem1ujhrdLtq1gByKwfbC7bPeKsiny9e0urg93DqwGcHey+bGRKCnF1nZQ=="], + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.1", "", {}, "sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ=="], + "@vellum/design-library": ["@vellum/design-library@file:../../packages/design-library", { "dependencies": { "@radix-ui/react-checkbox": "1.3.3", "@radix-ui/react-context-menu": "2.2.16", "@radix-ui/react-dialog": "1.1.15", "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-radio-group": "1.3.8", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.4", "@radix-ui/react-tabs": "1.1.13", "class-variance-authority": "0.7.1", "clsx": "2.1.1", "lucide-react": "1.16.0", "sonner": "2.0.7", "tailwind-merge": "3.6.0" }, "devDependencies": { "@storybook/addon-a11y": "10.4.0", "@storybook/addon-docs": "10.4.0", "@storybook/react-vite": "10.4.0", "@tailwindcss/vite": "4.3.0", "@types/react": "19.2.14", "@types/react-dom": "19.2.3", "react": "19.2.6", "react-dom": "19.2.6", "storybook": "10.4.0", "typescript": "5.9.3", "vite": "8.0.11" }, "peerDependencies": { "react": ">=19.0.0", "react-dom": ">=19.0.0", "tailwindcss": ">=4.0.0" } }], "@vitejs/plugin-react": ["@vitejs/plugin-react@6.0.1", "", { "dependencies": { "@rolldown/pluginutils": "1.0.0-rc.7" }, "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", "vite": "^8.0.0" }, "optionalPeers": ["@rolldown/plugin-babel", "babel-plugin-react-compiler"] }, "sha512-l9X/E3cDb+xY3SWzlG1MOGt2usfEHGMNIaegaUGFsLkb3RCn/k8/TOXBcab+OndDI4TBtktT8/9BwwW8Vi9KUQ=="], @@ -565,6 +592,8 @@ "axe-core": ["axe-core@4.11.4", "", {}, "sha512-KunSNx+TVpkAw/6ULfhnx+HWRecjqZGTOyquAoWHYLRSdK1tB5Ihce1ZW+UY3fj33bYAFWPu7W/GRSmmrCGuxA=="], + "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="], + "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], "baseline-browser-mapping": ["baseline-browser-mapping@2.10.31", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-MujYO3eP72uvmSE0i4wltsodRfIpZATP3jvzRNRGGxgzId7aVocVJJV3nf01qnzzKFGxQVC9bpWxl5cjxTr/7Q=="], @@ -581,8 +610,18 @@ "caniuse-lite": ["caniuse-lite@1.0.30001793", "", {}, "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA=="], + "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], + "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], + "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="], + + "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="], + + "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="], + + "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="], + "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="], "chokidar": ["chokidar@5.0.0", "", { "dependencies": { "readdirp": "^5.0.0" } }, "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw=="], @@ -595,6 +634,8 @@ "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], + "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="], + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], "confbox": ["confbox@0.2.4", "", {}, "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ=="], @@ -613,6 +654,8 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="], + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], @@ -633,6 +676,8 @@ "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], + "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], @@ -669,12 +714,16 @@ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + "estree-util-is-identifier-name": ["estree-util-is-identifier-name@3.0.0", "", {}, "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg=="], + "estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], "exsolve": ["exsolve@1.0.8", "", {}, "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA=="], + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], @@ -713,6 +762,12 @@ "hasown": ["hasown@2.0.3", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg=="], + "hast-util-to-jsx-runtime": ["hast-util-to-jsx-runtime@2.3.6", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg=="], + + "hast-util-whitespace": ["hast-util-whitespace@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw=="], + + "html-url-attributes": ["html-url-attributes@3.0.1", "", {}, "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ=="], + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], @@ -723,18 +778,30 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="], + + "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="], + + "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="], + "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], + "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="], + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="], + "is-in-ssh": ["is-in-ssh@1.0.0", "", {}, "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw=="], "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], "isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], @@ -791,6 +858,8 @@ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="], + "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], "lru-cache": ["lru-cache@11.4.0", "", {}, "sha512-W+R+kFL4HgVxONq2bhXPi3bGpzGe/yEhVOp233qw9wCRtgncJ15P3bC+e4zZMu4Cq7d+WAJjXGW0uUkifhcatA=="], @@ -801,6 +870,94 @@ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], + + "mdast-util-find-and-replace": ["mdast-util-find-and-replace@3.0.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg=="], + + "mdast-util-from-markdown": ["mdast-util-from-markdown@2.0.3", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q=="], + + "mdast-util-gfm": ["mdast-util-gfm@3.1.0", "", { "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-gfm-autolink-literal": "^2.0.0", "mdast-util-gfm-footnote": "^2.0.0", "mdast-util-gfm-strikethrough": "^2.0.0", "mdast-util-gfm-table": "^2.0.0", "mdast-util-gfm-task-list-item": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ=="], + + "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@2.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", "devlop": "^1.0.0", "mdast-util-find-and-replace": "^3.0.0", "micromark-util-character": "^2.0.0" } }, "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ=="], + + "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@2.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0" } }, "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ=="], + + "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg=="], + + "mdast-util-gfm-table": ["mdast-util-gfm-table@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg=="], + + "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@2.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ=="], + + "mdast-util-mdx-expression": ["mdast-util-mdx-expression@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ=="], + + "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@3.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q=="], + + "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@2.0.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg=="], + + "mdast-util-phrasing": ["mdast-util-phrasing@4.1.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w=="], + + "mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="], + + "mdast-util-to-markdown": ["mdast-util-to-markdown@2.1.2", "", { "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA=="], + + "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], + + "micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="], + + "micromark-core-commonmark": ["micromark-core-commonmark@2.0.3", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg=="], + + "micromark-extension-gfm": ["micromark-extension-gfm@3.0.0", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^2.0.0", "micromark-extension-gfm-footnote": "^2.0.0", "micromark-extension-gfm-strikethrough": "^2.0.0", "micromark-extension-gfm-table": "^2.0.0", "micromark-extension-gfm-tagfilter": "^2.0.0", "micromark-extension-gfm-task-list-item": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w=="], + + "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@2.1.0", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw=="], + + "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw=="], + + "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw=="], + + "micromark-extension-gfm-table": ["micromark-extension-gfm-table@2.1.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg=="], + + "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@2.0.0", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg=="], + + "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw=="], + + "micromark-factory-destination": ["micromark-factory-destination@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA=="], + + "micromark-factory-label": ["micromark-factory-label@2.0.1", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg=="], + + "micromark-factory-space": ["micromark-factory-space@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg=="], + + "micromark-factory-title": ["micromark-factory-title@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw=="], + + "micromark-factory-whitespace": ["micromark-factory-whitespace@2.0.1", "", { "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ=="], + + "micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="], + + "micromark-util-chunked": ["micromark-util-chunked@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA=="], + + "micromark-util-classify-character": ["micromark-util-classify-character@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q=="], + + "micromark-util-combine-extensions": ["micromark-util-combine-extensions@2.0.1", "", { "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg=="], + + "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@2.0.2", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw=="], + + "micromark-util-decode-string": ["micromark-util-decode-string@2.0.1", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ=="], + + "micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="], + + "micromark-util-html-tag-name": ["micromark-util-html-tag-name@2.0.1", "", {}, "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA=="], + + "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@2.0.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q=="], + + "micromark-util-resolve-all": ["micromark-util-resolve-all@2.0.1", "", { "dependencies": { "micromark-util-types": "^2.0.0" } }, "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg=="], + + "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="], + + "micromark-util-subtokenize": ["micromark-util-subtokenize@2.1.0", "", { "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA=="], + + "micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="], + + "micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="], + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "^5.0.5" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="], @@ -841,6 +998,8 @@ "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -871,6 +1030,8 @@ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="], + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], "rc9": ["rc9@3.0.1", "", { "dependencies": { "defu": "^6.1.6", "destr": "^2.0.5" } }, "sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ=="], @@ -885,6 +1046,8 @@ "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "react-markdown": ["react-markdown@10.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "html-url-attributes": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "unified": "^11.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "peerDependencies": { "@types/react": ">=18", "react": ">=18" } }, "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ=="], + "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], @@ -901,6 +1064,14 @@ "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="], + "remark-gfm": ["remark-gfm@4.0.1", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-gfm": "^3.0.0", "micromark-extension-gfm": "^3.0.0", "remark-parse": "^11.0.0", "remark-stringify": "^11.0.0", "unified": "^11.0.0" } }, "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg=="], + + "remark-parse": ["remark-parse@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA=="], + + "remark-rehype": ["remark-rehype@11.1.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw=="], + + "remark-stringify": ["remark-stringify@11.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-to-markdown": "^2.0.0", "unified": "^11.0.0" } }, "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw=="], + "resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], @@ -929,13 +1100,21 @@ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], + "storybook": ["storybook@10.4.0", "", { "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.2", "@testing-library/jest-dom": "^6.9.1", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", "@vitest/spy": "3.2.4", "@webcontainer/env": "^1.1.1", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0 || ^0.26.0 || ^0.27.0", "open": "^10.2.0", "oxc-parser": "^0.127.0", "oxc-resolver": "^11.19.1", "recast": "^0.23.5", "semver": "^7.7.3", "use-sync-external-store": "^1.5.0", "ws": "^8.18.0" }, "peerDependencies": { "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "prettier": "^2 || ^3", "vite-plus": "^0.1.15" }, "optionalPeers": ["@types/react", "prettier", "vite-plus"], "bin": "./dist/bin/dispatcher.js" }, "sha512-zrtctbVa6xEXCXuE3vsiR0At31zLOtzj8QudN/GaBJLZl0Z2DfF1rDPtTxdAbAp11M2J/7JVHaTIQKXauQPbmg=="], "string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="], + "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="], - "strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], + "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + + "style-to-js": ["style-to-js@1.1.21", "", { "dependencies": { "style-to-object": "1.0.14" } }, "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ=="], + + "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -955,6 +1134,10 @@ "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], + + "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="], @@ -971,6 +1154,18 @@ "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], + "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + + "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], + + "unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="], + + "unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="], + + "unist-util-visit": ["unist-util-visit@5.1.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg=="], + + "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="], + "unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], @@ -985,6 +1180,10 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + "vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="], + + "vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="], + "vite": ["vite@8.0.11", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.4", "postcss": "^8.5.14", "rolldown": "1.0.0-rc.18", "tinyglobby": "^0.2.16" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.1.18", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-Jz1mxtUBR5xTT65VOdJZUUeoyLtqljmFkiUXhPTLZka3RDc9vpi/xXkyrnsdRcm2lIi3l3GPMnAidTsEGIj3Ow=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -1001,6 +1200,8 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], + "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], @@ -1045,9 +1246,13 @@ "@vellum/design-library/@tailwindcss/vite": ["@tailwindcss/vite@4.3.0", "", { "dependencies": { "@tailwindcss/node": "4.3.0", "@tailwindcss/oxide": "4.3.0", "tailwindcss": "4.3.0" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw=="], + "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], + "oxc-parser/@oxc-project/types": ["@oxc-project/types@0.127.0", "", {}, "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ=="], - "redent/strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], + + "react-docgen/strip-indent": ["strip-indent@4.1.1", "", {}, "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA=="], "rolldown/@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.18", "", {}, "sha512-CUY5Mnhe64xQBGZEEXQ5WyZwsc1JU3vAZLIxtrsBt3LO6UOb+C8GunVKqe9sT8NeWb4lqSaoJtp2xo6GxT1MNw=="], diff --git a/apps/web/package.json b/apps/web/package.json index a5763d774a2..4895e31278e 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,6 +13,7 @@ "openapi-ts": "openapi-ts" }, "dependencies": { + "@capacitor/app": "8.1.0", "@capacitor/browser": "8.0.3", "@capacitor/core": "8.3.4", "@capacitor/filesystem": "8.1.2", @@ -21,7 +22,11 @@ "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-slot": "1.2.4", "@sentry/browser": "10.53.1", + "@sentry/react": "10.53.1", "@tanstack/react-query": "5.90.21", + "@testing-library/jest-dom": "6.9.1", + "@testing-library/react": "16.3.2", + "@testing-library/user-event": "14.6.1", "@vellum/design-library": "file:../../packages/design-library", "class-variance-authority": "0.7.1", "clsx": "2.1.1", @@ -30,7 +35,9 @@ "motion": "12.39.0", "react": "19.2.6", "react-dom": "19.2.6", + "react-markdown": "10.1.0", "react-router": "7.15.0", + "remark-gfm": "4.0.1", "tailwind-merge": "3.6.0" }, "devDependencies": { diff --git a/apps/web/src/adapters/app-link.tsx b/apps/web/src/adapters/app-link.tsx new file mode 100644 index 00000000000..8d19066048a --- /dev/null +++ b/apps/web/src/adapters/app-link.tsx @@ -0,0 +1,12 @@ +// TODO: port from platform +import { Link } from "react-router"; +import { forwardRef, type AnchorHTMLAttributes, type ReactNode } from "react"; + +export const AppLink = forwardRef< + HTMLAnchorElement, + { href: string; children?: ReactNode } & Omit, "href"> +>(function AppLink({ href, children, ...rest }, ref) { + return {children}; +}); + +export type AppRoute = string; diff --git a/apps/web/src/adapters/app-routing.tsx b/apps/web/src/adapters/app-routing.tsx new file mode 100644 index 00000000000..cff6564720c --- /dev/null +++ b/apps/web/src/adapters/app-routing.tsx @@ -0,0 +1,34 @@ +// TODO: port from platform +import { useNavigate, useParams, useSearchParams } from "react-router"; + +export interface AppRoutingAdapter { + navigate: ReturnType; + params: ReturnType; + searchParams: ReturnType[0]; +} + +export function useAppRouting(): AppRoutingAdapter { + const navigate = useNavigate(); + const params = useParams(); + const [searchParams] = useSearchParams(); + return { navigate, params, searchParams }; +} + +export function useAppNavigate() { + const navigate = useNavigate(); + return { + push: (path: string) => navigate(path), + replace: (path: string) => navigate(path, { replace: true }), + }; +} + +export function useAppSearchParams() { + const [searchParams] = useSearchParams(); + return searchParams; +} + +export { useNavigate, useParams, useSearchParams }; +export function useRouter() { + const navigate = useNavigate(); + return { push: (path: string) => navigate(path), replace: (path: string) => navigate(path, { replace: true }) }; +} diff --git a/apps/web/src/app/assistant/settings/ai/profileParamVisibility.ts b/apps/web/src/app/assistant/settings/ai/profileParamVisibility.ts new file mode 100644 index 00000000000..1760ca31f20 --- /dev/null +++ b/apps/web/src/app/assistant/settings/ai/profileParamVisibility.ts @@ -0,0 +1,3 @@ +// TODO: port from platform +export function isProfileParamVisible() { return true; } +export function modelSupportsVision(_provider: string, _model?: string) { return false; } diff --git a/apps/web/src/app/ui-gallery/_gallery.tsx b/apps/web/src/app/ui-gallery/_gallery.tsx new file mode 100644 index 00000000000..de5868c52dd --- /dev/null +++ b/apps/web/src/app/ui-gallery/_gallery.tsx @@ -0,0 +1,19 @@ +// TODO: port from platform +import type { ComponentType, ReactNode } from "react"; + +export interface GalleryExampleEntry { + name?: string; + title?: string; + description?: string; + Component?: ComponentType; + render?: () => ReactNode; +} + +export interface GalleryEntry { + name: string; + category?: string; + description?: string; + examples?: GalleryExampleEntry[]; + render?: () => ReactNode; +} +export function Gallery(_props: { entries?: GalleryEntry[] }) { return null; } diff --git a/apps/web/src/components/app-card.tsx b/apps/web/src/components/app-card.tsx new file mode 100644 index 00000000000..bb4f0ebb0df --- /dev/null +++ b/apps/web/src/components/app-card.tsx @@ -0,0 +1,12 @@ +// TODO: port from platform +export function AppCard(_props: { + name?: string; + description?: string; + icon?: string; + loadHtml?: () => Promise; + isPinned?: boolean; + isOpenDisabled?: boolean; + isPreviewPending?: boolean; + onOpen?: () => void; + onPin?: () => void; +}) { return null; } diff --git a/apps/web/src/components/app-viewer-container.tsx b/apps/web/src/components/app-viewer-container.tsx new file mode 100644 index 00000000000..420497c8b8d --- /dev/null +++ b/apps/web/src/components/app-viewer-container.tsx @@ -0,0 +1,2 @@ +// TODO: port from platform +export function AppViewerContainer(_props: Record) { return null; } diff --git a/apps/web/src/components/avatar-renderer.tsx b/apps/web/src/components/avatar-renderer.tsx new file mode 100644 index 00000000000..1de7ba17669 --- /dev/null +++ b/apps/web/src/components/avatar-renderer.tsx @@ -0,0 +1,2 @@ +// TODO: port from platform +export function AvatarRenderer(_props: Record) { return null; } diff --git a/apps/web/src/components/busy-indicator.tsx b/apps/web/src/components/busy-indicator.tsx new file mode 100644 index 00000000000..00a5f1964a6 --- /dev/null +++ b/apps/web/src/components/busy-indicator.tsx @@ -0,0 +1,25 @@ + +/** + * Mirrors macOS VBusyIndicator. + * + * A filled circle that gently pulses in opacity (1→0.3) and scale (1→0.85) + * over 1s easeInOut. Respects prefers-reduced-motion via the + * `.busy-indicator` CSS class defined in appTheme.css. + * + * Size guide (matching macOS usage): + * - 8px — card-header status icon (ToolCallProgressCard CardStatusIcon) + * - 6px — per-step row icon (ToolCallChip StatusIcon, ThinkingRow) + */ +export function BusyIndicator({ size = 8 }: { size?: number }) { + return ( +