From a1f8bc55c4feb3dfad31d8846bf8b1bc71e7ed54 Mon Sep 17 00:00:00 2001 From: Steven Enamakel <31011319+senamakel@users.noreply.github.com> Date: Thu, 9 Apr 2026 20:41:26 -0700 Subject: [PATCH] Improve upsell flow and retire legacy overlay app (#473) * fix(autocomplete): disable autocomplete feature by default - Updated the default configuration for the Autocomplete feature to be disabled instead of enabled in both the frontend and backend configurations. This change aims to improve user experience by preventing unintended activations of the autocomplete functionality upon application startup. * feat(overlay): enhance overlay window functionality and responsiveness - Updated the OverlayApp component to dynamically adjust its size and position based on the overlay status (idle/active), improving user interaction. - Introduced new constants for overlay dimensions and margins, enhancing visual consistency. - Implemented hover effects to adjust opacity, providing better visual feedback. - Refactored window resizing and positioning logic to ensure the overlay remains user-friendly and visually appealing across different scenarios. - Updated macOS window level to NSScreenSaverWindowLevel for improved behavior in fullscreen and multi-space environments. * feat(dependencies): add objc2-core-graphics and related packages - Introduced `objc2-core-graphics` as a new dependency in the Cargo.toml for macOS support. - Updated Cargo.lock to include `objc2-metal`, `block2`, and `libc` as dependencies for enhanced functionality. - Refactored overlay window configuration to utilize `CGShieldingWindowLevel`, improving window behavior in macOS environments. * refactor(billing): remove storage limits and update plan budgets - Removed `storageLimitBytes` from the `PlanMeta` interface and all plan definitions, simplifying the billing structure. - Updated the `Free` plan to have zero budgets for monthly and weekly usage, aligning with the new billing strategy. - Adjusted the `BillingPanel` and related components to conditionally display budget information based on the updated plan values. - Enhanced the `InferenceBudget` and `PayAsYouGoCard` components to reflect changes in budget handling and improve user messaging. - Updated tests to ensure consistency with the new billing logic and removed references to storage limits. * feat(upsell): enhance GlobalUpsellBanner and PayAsYouGoCard components - Added the GlobalUpsellBanner component to the App, improving user visibility of upgrade options. - Refactored PayAsYouGoCard to better handle credit balance calculations, separating promo and top-up credits for clarity. - Updated the UpsellBanner styles for a more consistent visual presentation. - Introduced normalization functions in creditsApi to ensure robust handling of credit balance data. - Added tests for creditsApi to validate the normalization logic and prevent UI crashes with missing data. * feat(upsell): reintroduce GlobalUpsellBanner in App and enhance UpsellBanner styling - Added the GlobalUpsellBanner back into the App component to improve user visibility of upgrade options. - Updated the UpsellBanner component to include a new `rounded` prop for customizable styling. - Removed dismissible functionality from the GlobalUpsellBanner, streamlining the user experience. - Enhanced visual presentation by adjusting CSS styles for better consistency. * refactor(overlay): remove obsolete overlay files and configurations - Deleted unused files including .gitignore, index.html, package.json, postcss.config.js, README.md, tailwind.config.js, tsconfig.json, vite.config.ts, and yarn.lock from the overlay directory. - Removed all source files related to the overlay functionality, including App.tsx, main.tsx, parentCoreRpc.ts, styles.css, and various components. - Cleaned up the src-tauri directory by removing configuration files, icons, and capabilities related to the overlay, streamlining the project structure. - This commit enhances maintainability by eliminating legacy code and unused resources. * refactor(rewards): move DISCORD_INVITE_URL to a separate utility file - Refactored the Rewards component to import the DISCORD_INVITE_URL from a new links utility file, improving code organization and maintainability. - Created a new links.ts file to centralize URL constants, enhancing clarity and reusability across the application. * style(app): apply formatter hook fixes * chore(dependencies): remove @heroicons/react from yarn.lock - Deleted the entry for @heroicons/react@^2.2.0 from yarn.lock, streamlining dependency management and reducing potential conflicts. --- app/src-tauri/Cargo.lock | 15 + app/src-tauri/Cargo.toml | 1 + app/src-tauri/src/lib.rs | 8 +- app/src/App.tsx | 2 +- .../settings/panels/AutocompletePanel.tsx | 2 +- .../settings/panels/BillingPanel.tsx | 36 +- .../panels/__tests__/billingHelpers.test.ts | 7 +- .../panels/billing/InferenceBudget.tsx | 76 +- .../panels/billing/PayAsYouGoCard.tsx | 43 +- .../panels/billing/SubscriptionPlans.tsx | 28 +- .../settings/panels/billingHelpers.ts | 21 +- .../components/upsell/GlobalUpsellBanner.tsx | 31 +- app/src/components/upsell/UpsellBanner.tsx | 14 +- app/src/components/upsell/UsageLimitModal.tsx | 10 +- app/src/hooks/useUsageState.test.ts | 98 + app/src/hooks/useUsageState.ts | 4 +- app/src/overlay/OverlayApp.tsx | 98 +- app/src/pages/Conversations.tsx | 8 +- app/src/pages/Rewards.tsx | 3 +- .../services/api/__tests__/billingApi.test.ts | 24 +- app/src/services/api/creditsApi.ts | 22 +- app/src/utils/links.ts | 1 + overlay/.gitignore | 24 - overlay/.vscode/extensions.json | 3 - overlay/README.md | 7 - overlay/index.html | 12 - overlay/package.json | 29 - overlay/postcss.config.js | 6 - overlay/src-tauri/.gitignore | 7 - overlay/src-tauri/Cargo.lock | 9699 ----------------- overlay/src-tauri/Cargo.toml | 29 - overlay/src-tauri/Info.plist | 8 - overlay/src-tauri/build.rs | 3 - overlay/src-tauri/capabilities/default.json | 23 - overlay/src-tauri/icons/128x128.png | Bin 3512 -> 0 bytes overlay/src-tauri/icons/128x128@2x.png | Bin 7012 -> 0 bytes overlay/src-tauri/icons/32x32.png | Bin 974 -> 0 bytes overlay/src-tauri/icons/Square107x107Logo.png | Bin 2863 -> 0 bytes overlay/src-tauri/icons/Square142x142Logo.png | Bin 3858 -> 0 bytes overlay/src-tauri/icons/Square150x150Logo.png | Bin 3966 -> 0 bytes overlay/src-tauri/icons/Square284x284Logo.png | Bin 7737 -> 0 bytes overlay/src-tauri/icons/Square30x30Logo.png | Bin 903 -> 0 bytes overlay/src-tauri/icons/Square310x310Logo.png | Bin 8591 -> 0 bytes overlay/src-tauri/icons/Square44x44Logo.png | Bin 1299 -> 0 bytes overlay/src-tauri/icons/Square71x71Logo.png | Bin 2011 -> 0 bytes overlay/src-tauri/icons/Square89x89Logo.png | Bin 2468 -> 0 bytes overlay/src-tauri/icons/StoreLogo.png | Bin 1523 -> 0 bytes overlay/src-tauri/icons/icon.icns | Bin 98451 -> 0 bytes overlay/src-tauri/icons/icon.ico | Bin 86642 -> 0 bytes overlay/src-tauri/icons/icon.png | Bin 14183 -> 0 bytes overlay/src-tauri/src/lib.rs | 171 - overlay/src-tauri/src/log_bridge.rs | 146 - overlay/src-tauri/src/main.rs | 6 - overlay/src-tauri/tauri.conf.json | 49 - overlay/src/App.tsx | 882 -- overlay/src/components/LogViewer.tsx | 95 - overlay/src/components/ModuleFilter.tsx | 37 - overlay/src/components/StatusBar.tsx | 47 - overlay/src/components/TitleBar.tsx | 64 - overlay/src/hooks/useLogs.ts | 69 - overlay/src/main.tsx | 10 - overlay/src/parentCoreRpc.ts | 95 - overlay/src/styles.css | 33 - overlay/src/types.ts | 49 - overlay/tailwind.config.js | 24 - overlay/tsconfig.json | 20 - overlay/vite.config.ts | 25 - overlay/yarn.lock | 1284 --- src/openhuman/config/schema/autocomplete.rs | 2 +- 69 files changed, 379 insertions(+), 13131 deletions(-) create mode 100644 app/src/hooks/useUsageState.test.ts create mode 100644 app/src/utils/links.ts delete mode 100644 overlay/.gitignore delete mode 100644 overlay/.vscode/extensions.json delete mode 100644 overlay/README.md delete mode 100644 overlay/index.html delete mode 100644 overlay/package.json delete mode 100644 overlay/postcss.config.js delete mode 100644 overlay/src-tauri/.gitignore delete mode 100644 overlay/src-tauri/Cargo.lock delete mode 100644 overlay/src-tauri/Cargo.toml delete mode 100644 overlay/src-tauri/Info.plist delete mode 100644 overlay/src-tauri/build.rs delete mode 100644 overlay/src-tauri/capabilities/default.json delete mode 100644 overlay/src-tauri/icons/128x128.png delete mode 100644 overlay/src-tauri/icons/128x128@2x.png delete mode 100644 overlay/src-tauri/icons/32x32.png delete mode 100644 overlay/src-tauri/icons/Square107x107Logo.png delete mode 100644 overlay/src-tauri/icons/Square142x142Logo.png delete mode 100644 overlay/src-tauri/icons/Square150x150Logo.png delete mode 100644 overlay/src-tauri/icons/Square284x284Logo.png delete mode 100644 overlay/src-tauri/icons/Square30x30Logo.png delete mode 100644 overlay/src-tauri/icons/Square310x310Logo.png delete mode 100644 overlay/src-tauri/icons/Square44x44Logo.png delete mode 100644 overlay/src-tauri/icons/Square71x71Logo.png delete mode 100644 overlay/src-tauri/icons/Square89x89Logo.png delete mode 100644 overlay/src-tauri/icons/StoreLogo.png delete mode 100644 overlay/src-tauri/icons/icon.icns delete mode 100644 overlay/src-tauri/icons/icon.ico delete mode 100644 overlay/src-tauri/icons/icon.png delete mode 100644 overlay/src-tauri/src/lib.rs delete mode 100644 overlay/src-tauri/src/log_bridge.rs delete mode 100644 overlay/src-tauri/src/main.rs delete mode 100644 overlay/src-tauri/tauri.conf.json delete mode 100644 overlay/src/App.tsx delete mode 100644 overlay/src/components/LogViewer.tsx delete mode 100644 overlay/src/components/ModuleFilter.tsx delete mode 100644 overlay/src/components/StatusBar.tsx delete mode 100644 overlay/src/components/TitleBar.tsx delete mode 100644 overlay/src/hooks/useLogs.ts delete mode 100644 overlay/src/main.tsx delete mode 100644 overlay/src/parentCoreRpc.ts delete mode 100644 overlay/src/styles.css delete mode 100644 overlay/src/types.ts delete mode 100644 overlay/tailwind.config.js delete mode 100644 overlay/tsconfig.json delete mode 100644 overlay/vite.config.ts delete mode 100644 overlay/yarn.lock diff --git a/app/src-tauri/Cargo.lock b/app/src-tauri/Cargo.lock index bf8c1098d..dcd33fa37 100644 --- a/app/src-tauri/Cargo.lock +++ b/app/src-tauri/Cargo.lock @@ -9,6 +9,7 @@ dependencies = [ "env_logger", "log", "objc2-app-kit", + "objc2-core-graphics", "reqwest 0.12.28", "semver", "serde", @@ -2495,10 +2496,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ "bitflags 2.11.0", + "block2", "dispatch2", + "libc", "objc2", "objc2-core-foundation", "objc2-io-surface", + "objc2-metal", ] [[package]] @@ -2574,6 +2578,17 @@ dependencies = [ "objc2-core-foundation", ] +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.11.0", + "objc2", + "objc2-foundation", +] + [[package]] name = "objc2-quartz-core" version = "0.3.2" diff --git a/app/src-tauri/Cargo.toml b/app/src-tauri/Cargo.toml index cf7343133..f1cef9ea2 100644 --- a/app/src-tauri/Cargo.toml +++ b/app/src-tauri/Cargo.toml @@ -42,6 +42,7 @@ env_logger = "0.11" [target.'cfg(target_os = "macos")'.dependencies] objc2-app-kit = "0.3.2" +objc2-core-graphics = "0.3.2" [features] # This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! diff --git a/app/src-tauri/src/lib.rs b/app/src-tauri/src/lib.rs index 2c8aac3de..40555a605 100644 --- a/app/src-tauri/src/lib.rs +++ b/app/src-tauri/src/lib.rs @@ -17,7 +17,9 @@ use tauri_plugin_global_shortcut::{GlobalShortcutExt, ShortcutState}; use tauri_plugin_deep_link::DeepLinkExt; #[cfg(target_os = "macos")] -use objc2_app_kit::{NSStatusWindowLevel, NSWindow, NSWindowCollectionBehavior}; +use objc2_app_kit::{NSWindow, NSWindowCollectionBehavior}; +#[cfg(target_os = "macos")] +use objc2_core_graphics::CGShieldingWindowLevel; /// Tracks the currently registered dictation hotkey string so we can unregister it later. struct DictationHotkeyState(Mutex>); @@ -103,9 +105,9 @@ fn configure_overlay_window_macos(window: &WebviewWindow) { behavior.insert(NSWindowCollectionBehavior::FullScreenAuxiliary); behavior.insert(NSWindowCollectionBehavior::CanJoinAllSpaces); window.setCollectionBehavior(behavior); - window.setLevel(NSStatusWindowLevel); + window.setLevel((CGShieldingWindowLevel() + 1) as isize); log::info!( - "[overlay] macOS overlay configured for all spaces/fullscreen auxiliary at status level" + "[overlay] macOS overlay configured for all spaces/fullscreen auxiliary at shielding+1 level" ); }, Err(err) => { diff --git a/app/src/App.tsx b/app/src/App.tsx index 988e431b4..6e39f7c2f 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -37,6 +37,7 @@ function App() {
+
@@ -45,7 +46,6 @@ function App() { - diff --git a/app/src/components/settings/panels/AutocompletePanel.tsx b/app/src/components/settings/panels/AutocompletePanel.tsx index 618a71850..43a42a807 100644 --- a/app/src/components/settings/panels/AutocompletePanel.tsx +++ b/app/src/components/settings/panels/AutocompletePanel.tsx @@ -22,7 +22,7 @@ import AppFilterSection from './autocomplete/AppFilterSection'; import CompletionStyleSection from './autocomplete/CompletionStyleSection'; const DEFAULT_CONFIG: AutocompleteConfig = { - enabled: true, + enabled: false, debounce_ms: 120, max_chars: 384, style_preset: 'balanced', diff --git a/app/src/components/settings/panels/BillingPanel.tsx b/app/src/components/settings/panels/BillingPanel.tsx index ac0c1f903..ec8a98f55 100644 --- a/app/src/components/settings/panels/BillingPanel.tsx +++ b/app/src/components/settings/panels/BillingPanel.tsx @@ -18,7 +18,7 @@ import AutoRechargeSection from './billing/AutoRechargeSection'; import InferenceBudget from './billing/InferenceBudget'; import PayAsYouGoCard from './billing/PayAsYouGoCard'; import SubscriptionPlans from './billing/SubscriptionPlans'; -import { buildPlanId, formatStorageLimit, formatUsdAmount, getPlanMeta } from './billingHelpers'; +import { buildPlanId, formatUsdAmount, getPlanMeta } from './billingHelpers'; const log = createDebug('openhuman:billing-panel'); @@ -399,28 +399,32 @@ const BillingPanel = () => {

)}

- Your subscription includes premium usage each cycle. Pay-as-you-go credits cover - overage after the included budget is consumed. + {currentTier === 'FREE' + ? 'Free accounts do not include recurring monthly credits. New accounts may receive a one-time signup credit, and any additional usage is covered by pay-as-you-go credits.' + : 'Your subscription includes premium usage each cycle. Pay-as-you-go credits cover overage after the included budget is consumed.'}

{currentPlan && (
- - Included monthly value: {formatUsdAmount(currentPlan.monthlyBudgetUsd)} - - - 7-day cycle budget: {formatUsdAmount(currentPlan.weeklyBudgetUsd)} - - - 10-hour cap: {formatUsdAmount(currentPlan.fiveHourCapUsd)} - + {currentPlan.monthlyBudgetUsd > 0 && ( + + Included monthly value: {formatUsdAmount(currentPlan.monthlyBudgetUsd)} + + )} + {currentPlan.weeklyBudgetUsd > 0 && ( + + 7-day cycle budget: {formatUsdAmount(currentPlan.weeklyBudgetUsd)} + + )} + {currentPlan.fiveHourCapUsd > 0 && ( + + 10-hour cap: {formatUsdAmount(currentPlan.fiveHourCapUsd)} + + )} {currentPlanMeta && ( <> Premium-usage discount: {currentPlanMeta.discountPercent}% - - Storage: {formatStorageLimit(currentPlanMeta.storageLimitBytes)} - )}
@@ -440,7 +444,7 @@ const BillingPanel = () => {
- Or subscribe for included usage + discounts + Or subscribe for recurring included usage + discounts
diff --git a/app/src/components/settings/panels/__tests__/billingHelpers.test.ts b/app/src/components/settings/panels/__tests__/billingHelpers.test.ts index d52db4dd5..243efae2a 100644 --- a/app/src/components/settings/panels/__tests__/billingHelpers.test.ts +++ b/app/src/components/settings/panels/__tests__/billingHelpers.test.ts @@ -27,7 +27,9 @@ describe('PLANS', () => { expect(free.monthlyPrice).toBe(0); expect(free.annualPrice).toBe(0); expect(free.discountPercent).toBe(0); - expect(free.weeklyBudgetUsd).toBe(0.5); + expect(free.monthlyBudgetUsd).toBe(0); + expect(free.weeklyBudgetUsd).toBe(0); + expect(free.fiveHourCapUsd).toBe(0); }); it('should have BASIC plan aligned with backend config', () => { @@ -141,7 +143,6 @@ describe('displayPrice', () => { weeklyBudgetUsd: 25, fiveHourCapUsd: 7.5, discountPercent: 30, - storageLimitBytes: 50 * 1024 * 1024 * 1024, features: [], }; expect(displayPrice(custom, 'monthly')).toBe('$50'); @@ -187,7 +188,6 @@ describe('annualSavings', () => { weeklyBudgetUsd: 5, fiveHourCapUsd: 1.5, discountPercent: 20, - storageLimitBytes: 1024, features: [], }; expect(annualSavings(noSavings, 'annual')).toBeNull(); @@ -203,7 +203,6 @@ describe('annualSavings', () => { weeklyBudgetUsd: 50, fiveHourCapUsd: 15, discountPercent: 40, - storageLimitBytes: 1024, features: [], }; expect(annualSavings(bigDiscount, 'annual')).toBe(50); diff --git a/app/src/components/settings/panels/billing/InferenceBudget.tsx b/app/src/components/settings/panels/billing/InferenceBudget.tsx index 6a8434030..0074e01e7 100644 --- a/app/src/components/settings/panels/billing/InferenceBudget.tsx +++ b/app/src/components/settings/panels/billing/InferenceBudget.tsx @@ -12,42 +12,56 @@ const InferenceBudget = ({ teamUsage, isLoadingCredits }: InferenceBudgetProps) {isLoadingCredits && Loading…} {teamUsage && !isLoadingCredits && ( - ${teamUsage.remainingUsd.toFixed(2)} / ${teamUsage.cycleBudgetUsd.toFixed(2)} remaining + {teamUsage.cycleBudgetUsd > 0 + ? `$${teamUsage.remainingUsd.toFixed(2)} / $${teamUsage.cycleBudgetUsd.toFixed(2)} remaining` + : 'No recurring plan budget'} )}
{teamUsage ? ( - <> -
-
-
-
- - 5-hour cap: ${teamUsage.cycleLimit5hr.toFixed(2)} / $ - {teamUsage.fiveHourCapUsd.toFixed(2)} - - - Cycle ends {new Date(teamUsage.cycleEndsAt).toLocaleDateString('en-US')} - -
- {teamUsage.remainingUsd <= 0 && ( -

- Included subscription usage is exhausted. Top up credits to continue using AI features - without waiting for the next cycle. + teamUsage.cycleBudgetUsd > 0 ? ( + <> +

+
+
+
+ + 5-hour cap: ${teamUsage.cycleLimit5hr.toFixed(2)} / $ + {teamUsage.fiveHourCapUsd.toFixed(2)} + + + Cycle ends {new Date(teamUsage.cycleEndsAt).toLocaleDateString('en-US')} + +
+ {teamUsage.remainingUsd <= 0 && ( +

+ Included subscription usage is exhausted. Top up credits to continue using AI features + without waiting for the next cycle. +

+ )} + + ) : ( +
+

+ Your current plan does not include a recurring weekly inference budget. Usage is paid + from available credits instead.

- )} - +
+ ) ) : isLoadingCredits ? (
) : ( diff --git a/app/src/components/settings/panels/billing/PayAsYouGoCard.tsx b/app/src/components/settings/panels/billing/PayAsYouGoCard.tsx index 34688d1f5..7e23eac69 100644 --- a/app/src/components/settings/panels/billing/PayAsYouGoCard.tsx +++ b/app/src/components/settings/panels/billing/PayAsYouGoCard.tsx @@ -20,6 +20,11 @@ const PayAsYouGoCard = ({ onTopUp, onBalanceRefresh, }: PayAsYouGoCardProps) => { + const promoCredits = creditBalance?.balanceUsd ?? 0; + const topUpCredits = creditBalance?.topUpBalanceUsd ?? 0; + const topUpBaseline = creditBalance?.topUpBaselineUsd ?? null; + const availableCredits = promoCredits + topUpCredits; + // Coupon state (local — no need to share with other sections) const [couponCode, setCouponCode] = useState(''); const [couponLoading, setCouponLoading] = useState(false); @@ -63,41 +68,37 @@ const PayAsYouGoCard = ({ {/* Balance display */} {creditBalance ? (
-
- General credits - - ${creditBalance.balanceUsd.toFixed(2)} +
+ Available credits + + ${availableCredits.toFixed(2)}
+
+ Signup + promo credits + ${promoCredits.toFixed(2)} +
Top-up credits - ${creditBalance.topUpBalanceUsd.toFixed(2)} - {creditBalance.topUpBaselineUsd != null && creditBalance.topUpBaselineUsd > 0 && ( - - {' '} - / ${creditBalance.topUpBaselineUsd.toFixed(2)} - + ${topUpCredits.toFixed(2)} + {topUpBaseline != null && topUpBaseline > 0 && ( + / ${topUpBaseline.toFixed(2)} )}
- {creditBalance.topUpBaselineUsd != null && creditBalance.topUpBaselineUsd > 0 && ( + {topUpBaseline != null && topUpBaseline > 0 && (
)} @@ -113,8 +114,8 @@ const PayAsYouGoCard = ({ )}

- No subscription needed — buy credits as you need them. If you have a subscription, your - included budget is consumed first. + No subscription needed. Free users spend from any signup or promo credit first, then from + top-ups. Paid plans still consume included budget before pay-as-you-go credits.

{/* Top-up buttons */} diff --git a/app/src/components/settings/panels/billing/SubscriptionPlans.tsx b/app/src/components/settings/panels/billing/SubscriptionPlans.tsx index eb87f44af..c913c242e 100644 --- a/app/src/components/settings/panels/billing/SubscriptionPlans.tsx +++ b/app/src/components/settings/panels/billing/SubscriptionPlans.tsx @@ -3,7 +3,6 @@ import { annualSavings, isUpgrade as checkIsUpgrade, displayPrice, - formatStorageLimit, formatUsdAmount, PLANS, } from '../billingHelpers'; @@ -104,21 +103,24 @@ const SubscriptionPlans = ({ )}
- - Included monthly value: {formatUsdAmount(plan.monthlyBudgetUsd)} - - - 7-day cycle: {formatUsdAmount(plan.weeklyBudgetUsd)} - - - 10-hour cap: {formatUsdAmount(plan.fiveHourCapUsd)} - + {plan.monthlyBudgetUsd > 0 && ( + + Included monthly value: {formatUsdAmount(plan.monthlyBudgetUsd)} + + )} + {plan.weeklyBudgetUsd > 0 && ( + + 7-day cycle: {formatUsdAmount(plan.weeklyBudgetUsd)} + + )} + {plan.fiveHourCapUsd > 0 && ( + + 10-hour cap: {formatUsdAmount(plan.fiveHourCapUsd)} + + )} Discount: {plan.discountPercent}% - - Storage: {formatStorageLimit(plan.storageLimitBytes)} -
diff --git a/app/src/components/settings/panels/billingHelpers.ts b/app/src/components/settings/panels/billingHelpers.ts index 55cf41179..7262d8db5 100644 --- a/app/src/components/settings/panels/billingHelpers.ts +++ b/app/src/components/settings/panels/billingHelpers.ts @@ -15,7 +15,6 @@ export interface PlanMeta { /** USD cap per 10-hour rolling inference window; amount scales with `tier` (FREE / BASIC / PRO). */ fiveHourCapUsd: number; discountPercent: number; - storageLimitBytes: number; features: PlanFeature[]; } @@ -25,14 +24,14 @@ export const PLANS: PlanMeta[] = [ name: 'Free', monthlyPrice: 0, annualPrice: 0, - monthlyBudgetUsd: 1, - weeklyBudgetUsd: 0.5, - fiveHourCapUsd: 0.15, + monthlyBudgetUsd: 0, + weeklyBudgetUsd: 0, + fiveHourCapUsd: 0, discountPercent: 0, - storageLimitBytes: 100 * 1024 * 1024, features: [ { text: 'Base access to integrations and inference', included: true }, - { text: 'Pay-as-you-go top-ups when included usage runs out', included: true }, + { text: 'One-time signup credits when available', included: true }, + { text: 'Pay-as-you-go top-ups when credits run out', included: true }, { text: 'No subscription discount on premium usage', included: true }, ], }, @@ -45,7 +44,6 @@ export const PLANS: PlanMeta[] = [ weeklyBudgetUsd: 10, fiveHourCapUsd: 3, discountPercent: 20, - storageLimitBytes: 10 * 1024 * 1024 * 1024, features: [ { text: 'Higher included premium usage every billing cycle', included: true }, { @@ -64,7 +62,6 @@ export const PLANS: PlanMeta[] = [ weeklyBudgetUsd: 100, fiveHourCapUsd: 30, discountPercent: 40, - storageLimitBytes: 200 * 1024 * 1024 * 1024, features: [ { text: 'Largest included premium usage allocation', included: true }, { text: '40% premium-usage discount across integrations and inference', included: true }, @@ -113,11 +110,3 @@ export function formatUsdAmount(amount: number): string { if (Number.isInteger(amount)) return `$${amount}`; return `$${amount.toFixed(2).replace(/0+$/, '').replace(/\.$/, '')}`; } - -export function formatStorageLimit(bytes: number): string { - const gb = 1024 * 1024 * 1024; - const mb = 1024 * 1024; - - if (bytes >= gb) return `${Math.round(bytes / gb)} GB`; - return `${Math.round(bytes / mb)} MB`; -} diff --git a/app/src/components/upsell/GlobalUpsellBanner.tsx b/app/src/components/upsell/GlobalUpsellBanner.tsx index 2c0723b1c..05941946d 100644 --- a/app/src/components/upsell/GlobalUpsellBanner.tsx +++ b/app/src/components/upsell/GlobalUpsellBanner.tsx @@ -1,60 +1,41 @@ -import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useUsageState } from '../../hooks/useUsageState'; import UpsellBanner from './UpsellBanner'; -import { dismissBanner, shouldShowBanner } from './upsellDismissState'; - -const COOLDOWN_WARNING_MS = 24 * 60 * 60 * 1000; -const COOLDOWN_UPGRADE_MS = 7 * 24 * 60 * 60 * 1000; export default function GlobalUpsellBanner() { const navigate = useNavigate(); const { teamUsage, isLoading, isAtLimit, isNearLimit, isFreeTier, usagePct10h, usagePct7d } = useUsageState(); - const [dismissed, setDismissed] = useState>({}); - if (isLoading || !teamUsage) return null; if (isAtLimit) { - const bannerId = 'global-upgrade'; - if (!shouldShowBanner(bannerId, COOLDOWN_UPGRADE_MS) || dismissed[bannerId]) return null; return ( -
+
navigate('/settings/billing')} - dismissible - onDismiss={() => { - dismissBanner(bannerId); - setDismissed(prev => ({ ...prev, [bannerId]: true })); - }} />
); } if (isNearLimit && isFreeTier) { - const bannerId = 'global-warning'; - if (!shouldShowBanner(bannerId, COOLDOWN_WARNING_MS) || dismissed[bannerId]) return null; const pct = Math.round(Math.max(usagePct10h, usagePct7d) * 100); return ( -
+
navigate('/settings/billing')} - dismissible - onDismiss={() => { - dismissBanner(bannerId); - setDismissed(prev => ({ ...prev, [bannerId]: true })); - }} />
); diff --git a/app/src/components/upsell/UpsellBanner.tsx b/app/src/components/upsell/UpsellBanner.tsx index e8b23e56a..d40b4c990 100644 --- a/app/src/components/upsell/UpsellBanner.tsx +++ b/app/src/components/upsell/UpsellBanner.tsx @@ -5,6 +5,7 @@ interface UpsellBannerProps { ctaLabel?: string; onCtaClick?: () => void; dismissible?: boolean; + rounded?: boolean; onDismiss?: () => void; } @@ -24,11 +25,11 @@ const VARIANT_STYLES = { cta: 'bg-amber-500 hover:bg-amber-400 text-white', }, upgrade: { - container: 'bg-coral-50 border-coral-200', - icon: 'text-coral-400', - title: 'text-coral-700', - text: 'text-coral-600', - cta: 'bg-coral-500 hover:bg-coral-400 text-white', + container: 'bg-amber-50 border-amber-200', + icon: 'text-amber-400', + title: 'text-amber-700', + text: 'text-amber-600', + cta: 'bg-amber-500 hover:bg-amber-400 text-white', }, }; @@ -40,12 +41,13 @@ export default function UpsellBanner({ onCtaClick, dismissible, onDismiss, + rounded = true, }: UpsellBannerProps) { const styles = VARIANT_STYLES[variant]; return (
+ className={`p-3 ${rounded ? 'rounded-xl' : ''} border flex items-center justify-between gap-3 ${styles.container}`}>
${nextPlan.fiveHourCapUsd.toFixed(2)} per 10-hour window -
  • - ${nextPlan.weeklyBudgetUsd}/week included inference -
  • + {nextPlan.weeklyBudgetUsd > 0 && ( +
  • + ${nextPlan.weeklyBudgetUsd}/week included inference +
  • + )}
    )} diff --git a/app/src/hooks/useUsageState.test.ts b/app/src/hooks/useUsageState.test.ts new file mode 100644 index 000000000..e4fd4e0b2 --- /dev/null +++ b/app/src/hooks/useUsageState.test.ts @@ -0,0 +1,98 @@ +import { renderHook, waitFor } from '@testing-library/react'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; + +const mockGetCurrentPlan = vi.fn(); +const mockGetTeamUsage = vi.fn(); + +vi.mock('../services/api/billingApi', () => ({ + billingApi: { getCurrentPlan: () => mockGetCurrentPlan() }, +})); + +vi.mock('../services/api/creditsApi', () => ({ + creditsApi: { getTeamUsage: () => mockGetTeamUsage() }, +})); + +describe('useUsageState', () => { + beforeEach(() => { + vi.resetModules(); + mockGetCurrentPlan.mockReset(); + mockGetTeamUsage.mockReset(); + }); + + it('does not treat free users with zero recurring budget as exhausted', async () => { + const { useUsageState } = await import('./useUsageState'); + + mockGetCurrentPlan.mockResolvedValue({ + plan: 'FREE', + hasActiveSubscription: false, + planExpiry: null, + subscription: null, + monthlyBudgetUsd: 0, + weeklyBudgetUsd: 0, + fiveHourCapUsd: 0, + }); + mockGetTeamUsage.mockResolvedValue({ + remainingUsd: 0, + cycleBudgetUsd: 0, + cycleLimit5hr: 0, + cycleLimit7day: 0, + fiveHourCapUsd: 0, + fiveHourResetsAt: null, + cycleStartDate: '2026-04-09T00:00:00.000Z', + cycleEndsAt: '2026-04-16T00:00:00.000Z', + bypassCycleLimit: false, + }); + + const { result } = renderHook(() => useUsageState()); + + await waitFor(() => { + expect(result.current.isLoading).toBe(false); + }); + + expect(result.current.isFreeTier).toBe(true); + expect(result.current.isBudgetExhausted).toBe(false); + expect(result.current.isRateLimited).toBe(false); + expect(result.current.isAtLimit).toBe(false); + expect(result.current.usagePct7d).toBe(0); + }); + + it('treats paid users with no remaining recurring budget as exhausted', async () => { + const { useUsageState } = await import('./useUsageState'); + + mockGetCurrentPlan.mockResolvedValue({ + plan: 'BASIC', + hasActiveSubscription: true, + planExpiry: '2026-05-01T00:00:00.000Z', + subscription: { + id: 'sub_123', + status: 'active', + currentPeriodEnd: '2026-05-01T00:00:00.000Z', + quantity: 1, + }, + monthlyBudgetUsd: 20, + weeklyBudgetUsd: 10, + fiveHourCapUsd: 3, + }); + mockGetTeamUsage.mockResolvedValue({ + remainingUsd: 0, + cycleBudgetUsd: 10, + cycleLimit5hr: 1, + cycleLimit7day: 10, + fiveHourCapUsd: 3, + fiveHourResetsAt: null, + cycleStartDate: '2026-04-09T00:00:00.000Z', + cycleEndsAt: '2026-04-16T00:00:00.000Z', + bypassCycleLimit: false, + }); + + const { result } = renderHook(() => useUsageState()); + + await waitFor(() => { + expect(result.current.isLoading).toBe(false); + }); + + expect(result.current.isBudgetExhausted).toBe(true); + expect(result.current.isAtLimit).toBe(true); + expect(result.current.usagePct7d).toBe(1); + }); +}); diff --git a/app/src/hooks/useUsageState.ts b/app/src/hooks/useUsageState.ts index 0eb4ef43d..ebb72577e 100644 --- a/app/src/hooks/useUsageState.ts +++ b/app/src/hooks/useUsageState.ts @@ -82,7 +82,9 @@ export function useUsageState(): UsageState { ? Math.min(1, (teamUsage.cycleBudgetUsd - teamUsage.remainingUsd) / teamUsage.cycleBudgetUsd) : 0; - const isBudgetExhausted = teamUsage ? teamUsage.remainingUsd <= 0 : false; + const isBudgetExhausted = teamUsage + ? teamUsage.cycleBudgetUsd > 0 && teamUsage.remainingUsd <= 0 + : false; const isRateLimited = teamUsage !== null && diff --git a/app/src/overlay/OverlayApp.tsx b/app/src/overlay/OverlayApp.tsx index 2d466d369..ee3b54e36 100644 --- a/app/src/overlay/OverlayApp.tsx +++ b/app/src/overlay/OverlayApp.tsx @@ -1,10 +1,20 @@ -import { getCurrentWindow, LogicalSize } from '@tauri-apps/api/window'; +import { + currentMonitor, + getCurrentWindow, + LogicalPosition, + LogicalSize, +} from '@tauri-apps/api/window'; import { useEffect, useMemo, useRef, useState } from 'react'; import RotatingTetrahedronCanvas from '../components/RotatingTetrahedronCanvas'; -const OVERLAY_WIDTH = 248; -const OVERLAY_HEIGHT = 228; +const OVERLAY_IDLE_WIDTH = 50; +const OVERLAY_IDLE_HEIGHT = 50; +const OVERLAY_ACTIVE_WIDTH = 224; +const OVERLAY_ACTIVE_HEIGHT = 208; +const OVERLAY_IDLE_MARGIN = 10; +const OVERLAY_ACTIVE_MARGIN = 20; +const OVERLAY_IDLE_OPACITY = 0.6; const SCENARIO_THREE_TEXT = '"Noted. Need milk."'; type OverlayStatus = 'idle' | 'active'; @@ -68,20 +78,7 @@ function OverlayBubbleChip({ bubble }: { bubble: OverlayBubble }) { export default function OverlayApp() { const [scenario, setScenario] = useState(1); - - useEffect(() => { - const appWindow = getCurrentWindow(); - const size = new LogicalSize(OVERLAY_WIDTH, OVERLAY_HEIGHT); - void appWindow.setSize(size).catch(error => { - console.warn('[overlay] failed to resize overlay window', error); - }); - void appWindow.setMinSize(size).catch(error => { - console.warn('[overlay] failed to set overlay min size', error); - }); - void appWindow.setMaxSize(size).catch(error => { - console.warn('[overlay] failed to set overlay max size', error); - }); - }, []); + const [isHovered, setIsHovered] = useState(false); useEffect(() => { const timeoutId = window.setTimeout(() => { @@ -99,6 +96,51 @@ export default function OverlayApp() { const status: OverlayStatus = scenario === 1 ? 'idle' : 'active'; + useEffect(() => { + const appWindow = getCurrentWindow(); + const isActive = status === 'active'; + const width = isActive ? OVERLAY_ACTIVE_WIDTH : OVERLAY_IDLE_WIDTH; + const height = isActive ? OVERLAY_ACTIVE_HEIGHT : OVERLAY_IDLE_HEIGHT; + const margin = isActive ? OVERLAY_ACTIVE_MARGIN : OVERLAY_IDLE_MARGIN; + const size = new LogicalSize(width, height); + + const updateWindowFrame = async () => { + try { + await appWindow.setSize(size); + } catch (error) { + console.warn('[overlay] failed to resize overlay window', error); + } + + try { + await appWindow.setMinSize(size); + } catch (error) { + console.warn('[overlay] failed to set overlay min size', error); + } + + try { + await appWindow.setMaxSize(size); + } catch (error) { + console.warn('[overlay] failed to set overlay max size', error); + } + + try { + const monitor = await currentMonitor(); + if (!monitor) { + console.warn('[overlay] could not resolve current monitor for positioning'); + return; + } + + const x = monitor.workArea.position.x + monitor.workArea.size.width - width - margin; + const y = monitor.workArea.position.y + monitor.workArea.size.height - height - margin; + await appWindow.setPosition(new LogicalPosition(x, y)); + } catch (error) { + console.warn('[overlay] failed to pin overlay bottom-right after resize', error); + } + }; + + void updateWindowFrame(); + }, [status]); + const bubbles = useMemo(() => { if (scenario === 1) { return []; @@ -124,11 +166,17 @@ export default function OverlayApp() { return 'border-slate-950 bg-slate-800'; }, [status]); const tetrahedronInverted = status === 'active'; + const orbSizeClassName = status === 'active' ? 'h-[52px] w-[52px]' : 'h-[40px] w-[40px]'; + const orbCanvasClassName = status === 'active' ? 'h-[92%] w-[92%]' : 'h-[88%] w-[88%]'; + const orbStyle = + status === 'idle' ? { opacity: isHovered ? 1 : OVERLAY_IDLE_OPACITY } : undefined; return (
    -
    -
    +
    +
    {bubbles.map(bubble => (
    @@ -143,9 +191,17 @@ export default function OverlayApp() { onClick={() => { setScenario(2); }} - className={`group relative flex h-[56px] w-[56px] cursor-pointer items-center justify-center overflow-hidden rounded-full border transition-all duration-200 ${orbClassName}`} + onMouseEnter={() => { + setIsHovered(true); + }} + onMouseLeave={() => { + setIsHovered(false); + }} + className={`group relative flex cursor-pointer items-center justify-center overflow-hidden rounded-full border transition-all duration-200 ${orbClassName} ${orbSizeClassName}`} + style={orbStyle} title="Click to start the demo."> -
    +
    diff --git a/app/src/pages/Conversations.tsx b/app/src/pages/Conversations.tsx index ad1b926c9..50d5771d3 100644 --- a/app/src/pages/Conversations.tsx +++ b/app/src/pages/Conversations.tsx @@ -1218,7 +1218,7 @@ const Conversations = () => {
    )} {teamUsage && - (teamUsage.remainingUsd <= 0 || + ((teamUsage.cycleBudgetUsd > 0 && teamUsage.remainingUsd <= 0) || (!teamUsage.bypassCycleLimit && teamUsage.fiveHourCapUsd > 0 && teamUsage.cycleLimit5hr >= teamUsage.fiveHourCapUsd)) && ( @@ -1237,12 +1237,12 @@ const Conversations = () => { />

    - {teamUsage.remainingUsd <= 0 - ? 'Weekly inference budget exhausted. Top up to continue.' + {teamUsage.cycleBudgetUsd > 0 && teamUsage.remainingUsd <= 0 + ? 'Included weekly inference budget exhausted. Top up to continue.' : `10-hour rate limit reached.${teamUsage.fiveHourResetsAt ? ` Resets ${formatResetTime(teamUsage.fiveHourResetsAt)}.` : ''}`}

    - {teamUsage.remainingUsd <= 0 && ( + {teamUsage.cycleBudgetUsd > 0 && teamUsage.remainingUsd <= 0 && ( -
    - -
    -
    -

    - Voice capture -

    -

    - {waitingForCoreConfig - ? "Checking core…" - : sttAvailable - ? debugSnapshot.voice?.whisper_in_process - ? "STT ready (in-process)" - : "STT ready" - : "STT unavailable — configure voice in the main app"} -

    -
    - -
    - -
    - - -
    -

    - {status} -

    -

    {message}

    - - {transcript ? ( -
    - {transcript} -
    - ) : null} - - {(status === "ready" || status === "error") && !transcript ? ( - - ) : null} -
    -
    - -
    -
    - -
    - - {!debugExpanded ? ( -

    - Screen: {debugSnapshot.screen?.session.active ? "session on" : "idle"} · - Autocomplete: {autocompletePhase} - {debugSnapshot.autocomplete?.last_error ? " · error" : ""} -

    - ) : null} - - {debugSnapshot.error ? ( -
    - {debugSnapshot.error} -
    - ) : null} - - {debugExpanded ? ( -
    -
    -
    - Voice / STT -
    -
    -

    STT: {sttAvailable ? "available" : "unavailable"}

    -

    Model: {debugSnapshot.voice?.stt_model_id ?? "—"}

    -

    - Whisper: {debugSnapshot.voice?.whisper_binary ?? "not found"} -

    -
    -
    - -
    -
    - Screen Intelligence -
    -
    -

    Active screen: {activeScreenApp}

    -

    Window: {activeScreenWindow}

    -

    - Screenshots: {debugSnapshot.screen?.session.capture_count ?? 0} total,{" "} - {debugSnapshot.screen?.session.frames_in_memory ?? 0} in memory -

    -

    - Session: {debugSnapshot.screen?.session.active ? "active" : "idle"} | Vision:{" "} - {debugSnapshot.screen?.session.vision_enabled ? "on" : "off"} /{" "} - {debugSnapshot.screen?.session.vision_state ?? "idle"} -

    -

    - Queue: {debugSnapshot.screen?.session.vision_queue_depth ?? 0} | Blocked:{" "} - {debugSnapshot.screen?.is_context_blocked ? "yes" : "no"} -

    -

    - Last capture:{" "} - {formatTimestamp(debugSnapshot.screen?.session.last_capture_at_ms ?? null)} -

    -
    -
    - -
    -
    - Autocomplete -
    -
    -

    - Status: {autocompleteRunning ? "active" : "idle"} | Phase: {autocompletePhase} -

    -

    App: {debugSnapshot.autocomplete?.app_name ?? activeScreenApp}

    -

    - Processing:{" "} - {autocompletePhase === "refreshing" || autocompletePhase === "processing" - ? "yes" - : "no"} -

    -

    - Suggestions:{" "} - {autocompleteSuggestion ? "1 ready" : "none"} -

    -
    - {autocompleteSuggestion || "No autocomplete suggestion available."} -
    - {debugSnapshot.autocomplete?.last_error ? ( -

    - Error: {debugSnapshot.autocomplete.last_error} -

    - ) : null} -
    -
    -
    - ) : null} -
    -
    -
    -
    - ); -} diff --git a/overlay/src/components/LogViewer.tsx b/overlay/src/components/LogViewer.tsx deleted file mode 100644 index ff255ff78..000000000 --- a/overlay/src/components/LogViewer.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { useEffect, useMemo, useRef } from "react"; -import type { LogEntry } from "../types"; -import { LEVEL_COLORS } from "../types"; - -interface LogViewerProps { - entries: LogEntry[]; - activeModule: string; - levelFilter: string; -} - -/** Format ISO timestamp to HH:MM:SS.mmm */ -function formatTime(ts: string): string { - try { - const d = new Date(ts); - const h = String(d.getHours()).padStart(2, "0"); - const m = String(d.getMinutes()).padStart(2, "0"); - const s = String(d.getSeconds()).padStart(2, "0"); - const ms = String(d.getMilliseconds()).padStart(3, "0"); - return `${h}:${m}:${s}.${ms}`; - } catch { - return ts.slice(11, 23); - } -} - -const LEVEL_ORDER: Record = { - TRACE: 0, - DEBUG: 1, - INFO: 2, - WARN: 3, - ERROR: 4, - FATAL: 5, -}; - -/** - * Virtualized-ish log viewer. Auto-scrolls to bottom as new entries arrive. - * Filters by module and minimum log level. - */ -export function LogViewer({ entries, activeModule, levelFilter }: LogViewerProps) { - const bottomRef = useRef(null); - const containerRef = useRef(null); - const isAtBottom = useRef(true); - - const filtered = useMemo(() => { - const minLevel = LEVEL_ORDER[levelFilter] ?? 0; - return entries.filter((e) => { - if (activeModule !== "all" && e.module !== activeModule) return false; - const entryLevel = LEVEL_ORDER[e.level] ?? 0; - return entryLevel >= minLevel; - }); - }, [entries, activeModule, levelFilter]); - - // Track scroll position to decide auto-scroll - const handleScroll = () => { - const el = containerRef.current; - if (!el) return; - const threshold = 40; - isAtBottom.current = el.scrollHeight - el.scrollTop - el.clientHeight < threshold; - }; - - // Auto-scroll when new entries arrive (only if already at bottom) - useEffect(() => { - if (isAtBottom.current) { - bottomRef.current?.scrollIntoView({ behavior: "instant" }); - } - }, [filtered.length]); - - return ( -
    - {filtered.length === 0 && ( -
    - No logs yet... -
    - )} - - {filtered.map((entry, i) => ( -
    - {formatTime(entry.ts)} - - {entry.level} - - - {entry.module} - - {entry.message} -
    - ))} - -
    -
    - ); -} diff --git a/overlay/src/components/ModuleFilter.tsx b/overlay/src/components/ModuleFilter.tsx deleted file mode 100644 index 1458ca013..000000000 --- a/overlay/src/components/ModuleFilter.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { MODULE_LABELS } from "../types"; - -interface ModuleFilterProps { - modules: Set; - activeModule: string; - onSelect: (module: string) => void; -} - -/** - * Horizontal tab bar for filtering logs by module. - * Shows "All" plus every module that has emitted at least one log. - */ -export function ModuleFilter({ modules, activeModule, onSelect }: ModuleFilterProps) { - const tabs = ["all", ...Array.from(modules).sort()]; - - return ( -
    - {tabs.map((mod) => { - const isActive = mod === activeModule; - const label = MODULE_LABELS[mod] ?? mod; - return ( - - ); - })} -
    - ); -} diff --git a/overlay/src/components/StatusBar.tsx b/overlay/src/components/StatusBar.tsx deleted file mode 100644 index e8cdacd24..000000000 --- a/overlay/src/components/StatusBar.tsx +++ /dev/null @@ -1,47 +0,0 @@ -interface StatusBarProps { - filteredInfo: string; - levelFilter: string; - onLevelChange: (level: string) => void; - onClear: () => void; -} - -const LEVELS = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR"]; - -/** - * Bottom status bar showing entry count, level filter, and clear button. - */ -export function StatusBar({ - filteredInfo, - levelFilter, - onLevelChange, - onClear, -}: StatusBarProps) { - return ( -
    -
    - - {filteredInfo} - - - -
    - - -
    - ); -} diff --git a/overlay/src/components/TitleBar.tsx b/overlay/src/components/TitleBar.tsx deleted file mode 100644 index 20a2f9261..000000000 --- a/overlay/src/components/TitleBar.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { getCurrentWindow } from "@tauri-apps/api/window"; -import { invoke } from "@tauri-apps/api/core"; - -interface TitleBarProps { - clickThrough: boolean; - onClickThroughToggle: () => void; -} - -/** - * Custom title bar for the frameless overlay window. - * Supports dragging, window controls, and click-through toggle. - */ -export function TitleBar({ clickThrough, onClickThroughToggle }: TitleBarProps) { - const appWindow = getCurrentWindow(); - - const handleClickThrough = async () => { - const next = !clickThrough; - try { - await invoke("set_click_through", { enabled: next }); - onClickThroughToggle(); - } catch (e) { - console.error("Failed to set click-through:", e); - } - }; - - return ( -
    - - OpenHuman - - -
    - {/* Click-through toggle */} - - - {/* Minimize */} -
    -
    - ); -} diff --git a/overlay/src/hooks/useLogs.ts b/overlay/src/hooks/useLogs.ts deleted file mode 100644 index 57d5042cd..000000000 --- a/overlay/src/hooks/useLogs.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { useCallback, useEffect, useRef, useState } from "react"; -import { invoke } from "@tauri-apps/api/core"; -import { listen } from "@tauri-apps/api/event"; -import type { LogEntry } from "../types"; - -const MAX_ENTRIES = 5000; - -/** - * Subscribes to `core:log` Tauri events and manages the log buffer. - * On mount, fetches buffered history so we don't miss startup logs. - */ -export function useLogs() { - const [entries, setEntries] = useState([]); - const [modules, setModules] = useState>(new Set()); - const entriesRef = useRef([]); - - // Track seen modules for the filter UI - const modulesRef = useRef>(new Set()); - - const addEntries = useCallback((newEntries: LogEntry[]) => { - const current = entriesRef.current; - const updated = [...current, ...newEntries]; - // Trim to max - if (updated.length > MAX_ENTRIES) { - updated.splice(0, updated.length - MAX_ENTRIES); - } - entriesRef.current = updated; - setEntries(updated); - - // Track modules - let modulesChanged = false; - for (const e of newEntries) { - if (!modulesRef.current.has(e.module)) { - modulesRef.current.add(e.module); - modulesChanged = true; - } - } - if (modulesChanged) { - setModules(new Set(modulesRef.current)); - } - }, []); - - useEffect(() => { - // Fetch buffered history from Rust - invoke("get_log_history") - .then((history) => { - if (history.length > 0) { - addEntries(history); - } - }) - .catch(console.error); - - // Subscribe to live log events - const unlisten = listen("core:log", (event) => { - addEntries([event.payload]); - }); - - return () => { - unlisten.then((fn) => fn()); - }; - }, [addEntries]); - - const clear = useCallback(() => { - entriesRef.current = []; - setEntries([]); - }, []); - - return { entries, modules, clear }; -} diff --git a/overlay/src/main.tsx b/overlay/src/main.tsx deleted file mode 100644 index 39fb1c958..000000000 --- a/overlay/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from "react"; -import ReactDOM from "react-dom/client"; -import { App } from "./App"; -import "./styles.css"; - -ReactDOM.createRoot(document.getElementById("root")!).render( - - - -); diff --git a/overlay/src/parentCoreRpc.ts b/overlay/src/parentCoreRpc.ts deleted file mode 100644 index b60ca87b1..000000000 --- a/overlay/src/parentCoreRpc.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * HTTP JSON-RPC to the desktop core sidecar (same process as the main app). - * Mirrors the naming normalization in app/src/services/coreRpcClient.ts (subset). - */ - -let nextJsonRpcId = 1; - -export function normalizeLegacyMethod(method: string): string { - if (method.startsWith("openhuman.accessibility_")) { - return method.replace("openhuman.accessibility_", "openhuman.screen_intelligence_"); - } - return method; -} - -/** RpcOutcome with non-empty logs serializes as `{ result, logs }` in the core. */ -function unwrapCliCompatibleJson(raw: unknown): T { - if ( - raw !== null && - typeof raw === "object" && - "result" in raw && - "logs" in raw && - Array.isArray((raw as { logs: unknown }).logs) - ) { - return (raw as { result: T }).result; - } - return raw as T; -} - -interface JsonRpcError { - code: number; - message: string; - data?: unknown; -} - -interface JsonRpcResponse { - jsonrpc?: string; - id?: number | string | null; - result?: T; - error?: JsonRpcError; -} - -/** Default timeout for parent core RPC requests (ms). */ -const DEFAULT_RPC_TIMEOUT_MS = 10_000; - -export async function callParentCoreRpc( - rpcUrl: string, - method: string, - params: Record = {}, - timeoutMs: number = DEFAULT_RPC_TIMEOUT_MS, -): Promise { - const normalizedMethod = normalizeLegacyMethod(method); - const payload = { - jsonrpc: "2.0" as const, - id: nextJsonRpcId++, - method: normalizedMethod, - params, - }; - - const controller = new AbortController(); - const timer = setTimeout(() => controller.abort(), timeoutMs); - - let response: Response; - try { - response = await fetch(rpcUrl, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(payload), - signal: controller.signal, - }); - } catch (err) { - clearTimeout(timer); - if (err instanceof DOMException && err.name === "AbortError") { - throw new Error(`Core RPC request timed out after ${timeoutMs}ms (method: ${normalizedMethod})`); - } - throw err; - } finally { - clearTimeout(timer); - } - - if (!response.ok) { - const text = await response.text(); - throw new Error(`Core RPC HTTP ${response.status}: ${text || response.statusText}`); - } - - const json = (await response.json()) as JsonRpcResponse; - - if (json.error) { - throw new Error(json.error.message || "Core RPC returned an error"); - } - if (!Object.prototype.hasOwnProperty.call(json, "result")) { - throw new Error("Core RPC response missing result"); - } - - return unwrapCliCompatibleJson(json.result); -} diff --git a/overlay/src/styles.css b/overlay/src/styles.css deleted file mode 100644 index 40e6c9fdd..000000000 --- a/overlay/src/styles.css +++ /dev/null @@ -1,33 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@300;400;500&display=swap'); - -@tailwind base; -@tailwind components; -@tailwind utilities; - -html, body, #root { - margin: 0; - padding: 0; - height: 100%; - background: transparent; - overflow: hidden; - user-select: none; -} - -body { - font-family: "Inter", system-ui, sans-serif; -} - -/* Scrollbar styling for log viewer */ -.log-scroll::-webkit-scrollbar { - width: 6px; -} -.log-scroll::-webkit-scrollbar-track { - background: transparent; -} -.log-scroll::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.15); - border-radius: 3px; -} -.log-scroll::-webkit-scrollbar-thumb:hover { - background: rgba(255, 255, 255, 0.25); -} diff --git a/overlay/src/types.ts b/overlay/src/types.ts deleted file mode 100644 index e2a38f985..000000000 --- a/overlay/src/types.ts +++ /dev/null @@ -1,49 +0,0 @@ -/** A single log entry from the Rust core, received via `core:log` event. */ -export interface LogEntry { - ts: string; - level: string; - module: string; - target: string; - message: string; -} - -/** Known module names for filtering. - * As new apps/domains emit logs, they auto-appear in the filter bar. - * This map provides friendly labels for known modules. */ -export const MODULE_LABELS: Record = { - all: "All", - // ── Core domains ── - skills: "Skills", - rpc: "RPC", - core: "Core", - core_server: "Server", - config: "Config", - cron: "Cron", - memory: "Memory", - channels: "Channels", - overlay: "Overlay", - about_app: "About", - subconscious: "Subconscious", - // ── Apps / subsystems ── - screen_recorder: "Screen Rec", - autocomplete: "Autocomplete", - agent: "Agent", - search: "Search", - // ── Infra ── - axum: "HTTP", - tower_http: "HTTP", - socketioxide: "Socket.IO", - hyper: "Hyper", - reqwest: "Reqwest", - rusqlite: "SQLite", -}; - -/** Level colors for the log viewer. */ -export const LEVEL_COLORS: Record = { - TRACE: "text-gray-500", - DEBUG: "text-blue-400", - INFO: "text-green-400", - WARN: "text-amber-400", - ERROR: "text-red-400", - FATAL: "text-red-600", -}; diff --git a/overlay/tailwind.config.js b/overlay/tailwind.config.js deleted file mode 100644 index 5e7e958b2..000000000 --- a/overlay/tailwind.config.js +++ /dev/null @@ -1,24 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: ["./index.html", "./src/**/*.{ts,tsx}"], - theme: { - extend: { - fontFamily: { - mono: ["JetBrains Mono", "Menlo", "Monaco", "monospace"], - sans: ["Inter", "system-ui", "sans-serif"], - }, - colors: { - canvas: { - 50: "#FAFAF9", - 100: "#F5F5F4", - 200: "#E5E5E3", - }, - primary: { - 500: "#4A83DD", - 600: "#3D6DC4", - }, - }, - }, - }, - plugins: [], -}; diff --git a/overlay/tsconfig.json b/overlay/tsconfig.json deleted file mode 100644 index a4c834a6c..000000000 --- a/overlay/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/overlay/vite.config.ts b/overlay/vite.config.ts deleted file mode 100644 index 256062bf3..000000000 --- a/overlay/vite.config.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { defineConfig } from "vite"; -import react from "@vitejs/plugin-react"; - -// @ts-expect-error process is a nodejs global -const host = process.env.TAURI_DEV_HOST; - -export default defineConfig(async () => ({ - plugins: [react()], - clearScreen: false, - server: { - port: 1430, - strictPort: true, - host: host || false, - hmr: host - ? { - protocol: "ws", - host, - port: 1431, - } - : undefined, - watch: { - ignored: ["**/src-tauri/**"], - }, - }, -})); diff --git a/overlay/yarn.lock b/overlay/yarn.lock deleted file mode 100644 index 4519cb21f..000000000 --- a/overlay/yarn.lock +++ /dev/null @@ -1,1284 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" - integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== - dependencies: - "@babel/helper-validator-identifier" "^7.28.5" - js-tokens "^4.0.0" - picocolors "^1.1.1" - -"@babel/compat-data@^7.28.6": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" - integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== - -"@babel/core@^7.28.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" - integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== - dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-compilation-targets" "^7.28.6" - "@babel/helper-module-transforms" "^7.28.6" - "@babel/helpers" "^7.28.6" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/traverse" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/remapping" "^2.3.5" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/generator@^7.29.0": - version "7.29.1" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" - integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== - dependencies: - "@babel/parser" "^7.29.0" - "@babel/types" "^7.29.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/helper-compilation-targets@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" - integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== - dependencies: - "@babel/compat-data" "^7.28.6" - "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-module-imports@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" - integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== - dependencies: - "@babel/traverse" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/helper-module-transforms@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" - integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== - dependencies: - "@babel/helper-module-imports" "^7.28.6" - "@babel/helper-validator-identifier" "^7.28.5" - "@babel/traverse" "^7.28.6" - -"@babel/helper-plugin-utils@^7.27.1": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz#6f13ea251b68c8532e985fd532f28741a8af9ac8" - integrity sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug== - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.28.5": - version "7.28.5" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" - integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helpers@^7.28.6": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" - integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== - dependencies: - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": - version "7.29.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" - integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== - dependencies: - "@babel/types" "^7.29.0" - -"@babel/plugin-transform-react-jsx-self@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz#af678d8506acf52c577cac73ff7fe6615c85fc92" - integrity sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-transform-react-jsx-source@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz#dcfe2c24094bb757bf73960374e7c55e434f19f0" - integrity sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/template@^7.28.6": - version "7.28.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" - integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== - dependencies: - "@babel/code-frame" "^7.28.6" - "@babel/parser" "^7.28.6" - "@babel/types" "^7.28.6" - -"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" - integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== - dependencies: - "@babel/code-frame" "^7.29.0" - "@babel/generator" "^7.29.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.29.0" - "@babel/template" "^7.28.6" - "@babel/types" "^7.29.0" - debug "^4.3.1" - -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.28.2", "@babel/types@^7.28.6", "@babel/types@^7.29.0": - version "7.29.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" - integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== - dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.28.5" - -"@esbuild/aix-ppc64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c" - integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA== - -"@esbuild/android-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752" - integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg== - -"@esbuild/android-arm@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a" - integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg== - -"@esbuild/android-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16" - integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg== - -"@esbuild/darwin-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd" - integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg== - -"@esbuild/darwin-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e" - integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA== - -"@esbuild/freebsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe" - integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg== - -"@esbuild/freebsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3" - integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ== - -"@esbuild/linux-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977" - integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ== - -"@esbuild/linux-arm@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9" - integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw== - -"@esbuild/linux-ia32@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0" - integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA== - -"@esbuild/linux-loong64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0" - integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng== - -"@esbuild/linux-mips64el@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd" - integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw== - -"@esbuild/linux-ppc64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869" - integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA== - -"@esbuild/linux-riscv64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6" - integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w== - -"@esbuild/linux-s390x@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663" - integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg== - -"@esbuild/linux-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306" - integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw== - -"@esbuild/netbsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4" - integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg== - -"@esbuild/netbsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076" - integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ== - -"@esbuild/openbsd-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd" - integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A== - -"@esbuild/openbsd-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679" - integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw== - -"@esbuild/openharmony-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d" - integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg== - -"@esbuild/sunos-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6" - integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w== - -"@esbuild/win32-arm64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323" - integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg== - -"@esbuild/win32-ia32@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267" - integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ== - -"@esbuild/win32-x64@0.25.12": - version "0.25.12" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5" - integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA== - -"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" - integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== - dependencies: - "@jridgewell/sourcemap-codec" "^1.5.0" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/remapping@^2.3.5": - version "2.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" - integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": - version "0.3.31" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" - integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rolldown/pluginutils@1.0.0-beta.27": - version "1.0.0-beta.27" - resolved "https://registry.yarnpkg.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz#47d2bf4cef6d470b22f5831b420f8964e0bf755f" - integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== - -"@rollup/rollup-android-arm-eabi@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz#043f145716234529052ef9e1ce1d847ffbe9e674" - integrity sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA== - -"@rollup/rollup-android-arm64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz#023e1bd146e7519087dfd9e8b29e4cf9f8ecd35c" - integrity sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA== - -"@rollup/rollup-darwin-arm64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz#55ccb5487c02419954c57a7a80602885d616e1ee" - integrity sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw== - -"@rollup/rollup-darwin-x64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz#254b65404b14488c83225e88b8819376ad71a784" - integrity sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew== - -"@rollup/rollup-freebsd-arm64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz#6377ff38c052c76fcaffb7b2728d3172fe676fe6" - integrity sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w== - -"@rollup/rollup-freebsd-x64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz#ba3902309d088eaf7139b916f09b7140b28b406d" - integrity sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g== - -"@rollup/rollup-linux-arm-gnueabihf@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz#e011b9a14638267e53b446286e838dbdaf53f167" - integrity sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g== - -"@rollup/rollup-linux-arm-musleabihf@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz#0bce9ce9a009490abd28fd922dd97ed521311afe" - integrity sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg== - -"@rollup/rollup-linux-arm64-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz#6f6cfbbf324fbb4ceff213abdf7f322fd45d25ff" - integrity sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ== - -"@rollup/rollup-linux-arm64-musl@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz#f7cb3eecaea9c151ef77342af05f38ae924bf795" - integrity sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA== - -"@rollup/rollup-linux-loong64-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz#499bfac6bb669fd88bb664357bf6be996a28b92f" - integrity sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ== - -"@rollup/rollup-linux-loong64-musl@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz#127dfac08764764396bbe04453c545d38a3ab518" - integrity sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw== - -"@rollup/rollup-linux-ppc64-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz#6a72f4d95852aac18326c5bf708393e8f3a41b70" - integrity sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw== - -"@rollup/rollup-linux-ppc64-musl@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz#ba8674666b00d6f9066cb9a5771a8430c34d2de6" - integrity sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg== - -"@rollup/rollup-linux-riscv64-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz#17cc38b2a71e302547cad29bcf78d0db2618c922" - integrity sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg== - -"@rollup/rollup-linux-riscv64-musl@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz#e36a41e2d8bd247331bd5cfc13b8c951d33454a2" - integrity sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg== - -"@rollup/rollup-linux-s390x-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz#1687265f1f4bdea0726c761a58c2db9933609d68" - integrity sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ== - -"@rollup/rollup-linux-x64-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz#56a6a0d9076f2a05a976031493b24a20ddcc0e77" - integrity sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg== - -"@rollup/rollup-linux-x64-musl@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz#bc240ebb5b9fd8d41ca8a80cb458452e8c187e0f" - integrity sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w== - -"@rollup/rollup-openbsd-x64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz#6f80d48a006c4b2ffa7724e95a3e33f6975872af" - integrity sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw== - -"@rollup/rollup-openharmony-arm64@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz#8f6db6f70d0a48abd833b263cd6dd3e7199c4c0e" - integrity sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA== - -"@rollup/rollup-win32-arm64-msvc@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz#b68989bfa815d0b3d4e302ecd90bda744438b177" - integrity sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g== - -"@rollup/rollup-win32-ia32-msvc@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz#c098e45338c50f22f1b288476354f025b746285b" - integrity sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg== - -"@rollup/rollup-win32-x64-gnu@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz#2c9e15be155b79d05999953b1737b2903842e903" - integrity sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg== - -"@rollup/rollup-win32-x64-msvc@4.60.1": - version "4.60.1" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz#23b860113e9f87eea015d1fa3a4240a52b42fcd4" - integrity sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ== - -"@tauri-apps/api@^2", "@tauri-apps/api@^2.8.0": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/api/-/api-2.10.1.tgz#57c1bae6114ec33d977eb2b50dfefc25fa84fc93" - integrity sha512-hKL/jWf293UDSUN09rR69hrToyIXBb8CjGaWC7gfinvnQrBVvnLr08FeFi38gxtugAVyVcTa5/FD/Xnkb1siBw== - -"@tauri-apps/cli-darwin-arm64@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.10.1.tgz#7abb013926613555559cce1583ab6521e07b997c" - integrity sha512-Z2OjCXiZ+fbYZy7PmP3WRnOpM9+Fy+oonKDEmUE6MwN4IGaYqgceTjwHucc/kEEYZos5GICve35f7ZiizgqEnQ== - -"@tauri-apps/cli-darwin-x64@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.10.1.tgz#cd1abd24782d488d0ee26f15015016b83a5b4bde" - integrity sha512-V/irQVvjPMGOTQqNj55PnQPVuH4VJP8vZCN7ajnj+ZS8Kom1tEM2hR3qbbIRoS3dBKs5mbG8yg1WC+97dq17Pw== - -"@tauri-apps/cli-linux-arm-gnueabihf@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.10.1.tgz#9afdc71d24d44941d76fdc353f4401e82e9ccac5" - integrity sha512-Hyzwsb4VnCWKGfTw+wSt15Z2pLw2f0JdFBfq2vHBOBhvg7oi6uhKiF87hmbXOBXUZaGkyRDkCHsdzJcIfoJC2w== - -"@tauri-apps/cli-linux-arm64-gnu@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.10.1.tgz#3a0a1e31eda8f01b69db09179094e0dc7ff5bb60" - integrity sha512-OyOYs2t5GkBIvyWjA1+h4CZxTcdz1OZPCWAPz5DYEfB0cnWHERTnQ/SLayQzncrT0kwRoSfSz9KxenkyJoTelA== - -"@tauri-apps/cli-linux-arm64-musl@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.10.1.tgz#6fc7e74e4a6053dd64b81dfdaf9dbabb6df31971" - integrity sha512-MIj78PDDGjkg3NqGptDOGgfXks7SYJwhiMh8SBoZS+vfdz7yP5jN18bNaLnDhsVIPARcAhE1TlsZe/8Yxo2zqg== - -"@tauri-apps/cli-linux-riscv64-gnu@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.10.1.tgz#9a5d3bb8efb17ef65146d0f319c6cf212e2a724a" - integrity sha512-X0lvOVUg8PCVaoEtEAnpxmnkwlE1gcMDTqfhbefICKDnOTJ5Est3qL0SrWxizDackIOKBcvtpejrSiVpuJI1kw== - -"@tauri-apps/cli-linux-x64-gnu@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.10.1.tgz#cf54e3754d2a54894323840aef1f9789888e0d57" - integrity sha512-2/12bEzsJS9fAKybxgicCDFxYD1WEI9kO+tlDwX5znWG2GwMBaiWcmhGlZ8fi+DMe9CXlcVarMTYc0L3REIRxw== - -"@tauri-apps/cli-linux-x64-musl@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.10.1.tgz#dc4bd17e812b448b3ccec0684f336f19fb47b069" - integrity sha512-Y8J0ZzswPz50UcGOFuXGEMrxbjwKSPgXftx5qnkuMs2rmwQB5ssvLb6tn54wDSYxe7S6vlLob9vt0VKuNOaCIQ== - -"@tauri-apps/cli-win32-arm64-msvc@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.10.1.tgz#2f398fb17f4665fefe5b8cb21566cde7062236f5" - integrity sha512-iSt5B86jHYAPJa/IlYw++SXtFPGnWtFJriHn7X0NFBVunF6zu9+/zOn8OgqIWSl8RgzhLGXQEEtGBdR4wzpVgg== - -"@tauri-apps/cli-win32-ia32-msvc@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.10.1.tgz#ffcbc2fa6a1d71f0b38672ea3468c07581f5cfaf" - integrity sha512-gXyxgEzsFegmnWywYU5pEBURkcFN/Oo45EAwvZrHMh+zUSEAvO5E8TXsgPADYm31d1u7OQU3O3HsYfVBf2moHw== - -"@tauri-apps/cli-win32-x64-msvc@2.10.1": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.10.1.tgz#75a3842ecab5e13b15ad2eead4c1b9cc3916e78d" - integrity sha512-6Cn7YpPFwzChy0ERz6djKEmUehWrYlM+xTaNzGPgZocw3BD7OfwfWHKVWxXzdjEW2KfKkHddfdxK1XXTYqBRLg== - -"@tauri-apps/cli@^2": - version "2.10.1" - resolved "https://registry.yarnpkg.com/@tauri-apps/cli/-/cli-2.10.1.tgz#d9b0290f03d569e10eb349a0bb72f448880bf9d7" - integrity sha512-jQNGF/5quwORdZSSLtTluyKQ+o6SMa/AUICfhf4egCGFdMHqWssApVgYSbg+jmrZoc8e1DscNvjTnXtlHLS11g== - optionalDependencies: - "@tauri-apps/cli-darwin-arm64" "2.10.1" - "@tauri-apps/cli-darwin-x64" "2.10.1" - "@tauri-apps/cli-linux-arm-gnueabihf" "2.10.1" - "@tauri-apps/cli-linux-arm64-gnu" "2.10.1" - "@tauri-apps/cli-linux-arm64-musl" "2.10.1" - "@tauri-apps/cli-linux-riscv64-gnu" "2.10.1" - "@tauri-apps/cli-linux-x64-gnu" "2.10.1" - "@tauri-apps/cli-linux-x64-musl" "2.10.1" - "@tauri-apps/cli-win32-arm64-msvc" "2.10.1" - "@tauri-apps/cli-win32-ia32-msvc" "2.10.1" - "@tauri-apps/cli-win32-x64-msvc" "2.10.1" - -"@tauri-apps/plugin-opener@^2": - version "2.5.3" - resolved "https://registry.yarnpkg.com/@tauri-apps/plugin-opener/-/plugin-opener-2.5.3.tgz#09f8fe143567839cc491f4f8fde21caa0f1a8b89" - integrity sha512-CCcUltXMOfUEArbf3db3kCE7Ggy1ExBEBl51Ko2ODJ6GDYHRp1nSNlQm5uNCFY5k7/ufaK5Ib3Du/Zir19IYQQ== - dependencies: - "@tauri-apps/api" "^2.8.0" - -"@types/babel__core@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" - integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== - dependencies: - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.27.0" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9" - integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" - integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74" - integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q== - dependencies: - "@babel/types" "^7.28.2" - -"@types/estree@1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== - -"@types/react-dom@^19.1.0": - version "19.2.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-19.2.3.tgz#c1e305d15a52a3e508d54dca770d202cb63abf2c" - integrity sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ== - -"@types/react@^19.1.0": - version "19.2.14" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.2.14.tgz#39604929b5e3957e3a6fa0001dafb17c7af70bad" - integrity sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w== - dependencies: - csstype "^3.2.2" - -"@vitejs/plugin-react@^4.4.1": - version "4.7.0" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz#647af4e7bb75ad3add578e762ad984b90f4a24b9" - integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== - dependencies: - "@babel/core" "^7.28.0" - "@babel/plugin-transform-react-jsx-self" "^7.27.1" - "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-beta.27" - "@types/babel__core" "^7.20.5" - react-refresh "^0.17.0" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -autoprefixer@^10.4.20: - version "10.4.27" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.27.tgz#51ea301a5c3c5f8642f8e564759c4f573be486f2" - integrity sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA== - dependencies: - browserslist "^4.28.1" - caniuse-lite "^1.0.30001774" - fraction.js "^5.3.4" - picocolors "^1.1.1" - postcss-value-parser "^4.2.0" - -baseline-browser-mapping@^2.10.12: - version "2.10.14" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.14.tgz#d25463733a8f80bb59ab9f797c902dc88832d47c" - integrity sha512-fOVLPAsFTsQfuCkvahZkzq6nf8KvGWanlYoTh0SVA0A/PIUxQGU2AOZAoD95n2gFLVDW/jP6sbGLny95nmEuHA== - -binary-extensions@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" - integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== - -braces@^3.0.3, braces@~3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" - integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== - dependencies: - fill-range "^7.1.1" - -browserslist@^4.24.0, browserslist@^4.28.1: - version "4.28.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.2.tgz#f50b65362ef48974ca9f50b3680566d786b811d2" - integrity sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg== - dependencies: - baseline-browser-mapping "^2.10.12" - caniuse-lite "^1.0.30001782" - electron-to-chromium "^1.5.328" - node-releases "^2.0.36" - update-browserslist-db "^1.2.3" - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001774, caniuse-lite@^1.0.30001782: - version "1.0.30001785" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001785.tgz#31f8e3ec1059430d2a7b04fff44c27672c4482df" - integrity sha512-blhOL/WNR+Km1RI/LCVAvA73xplXA7ZbjzI4YkMK9pa6T/P3F2GxjNpEkyw5repTw9IvkyrjyHpwjnhZ5FOvYQ== - -chokidar@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" - integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.2.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" - integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== - -debug@^4.1.0, debug@^4.3.1: - version "4.4.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" - integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== - dependencies: - ms "^2.1.3" - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -electron-to-chromium@^1.5.328: - version "1.5.331" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.331.tgz#3e4e845042d517c68b3c00be5fc33204f13b2058" - integrity sha512-IbxXrsTlD3hRodkLnbxAPP4OuJYdWCeM3IOdT+CpcMoIwIoDfCmRpEtSPfwBXxVkg9xmBeY7Lz2Eo2TDn/HC3Q== - -esbuild@^0.25.0: - version "0.25.12" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5" - integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg== - optionalDependencies: - "@esbuild/aix-ppc64" "0.25.12" - "@esbuild/android-arm" "0.25.12" - "@esbuild/android-arm64" "0.25.12" - "@esbuild/android-x64" "0.25.12" - "@esbuild/darwin-arm64" "0.25.12" - "@esbuild/darwin-x64" "0.25.12" - "@esbuild/freebsd-arm64" "0.25.12" - "@esbuild/freebsd-x64" "0.25.12" - "@esbuild/linux-arm" "0.25.12" - "@esbuild/linux-arm64" "0.25.12" - "@esbuild/linux-ia32" "0.25.12" - "@esbuild/linux-loong64" "0.25.12" - "@esbuild/linux-mips64el" "0.25.12" - "@esbuild/linux-ppc64" "0.25.12" - "@esbuild/linux-riscv64" "0.25.12" - "@esbuild/linux-s390x" "0.25.12" - "@esbuild/linux-x64" "0.25.12" - "@esbuild/netbsd-arm64" "0.25.12" - "@esbuild/netbsd-x64" "0.25.12" - "@esbuild/openbsd-arm64" "0.25.12" - "@esbuild/openbsd-x64" "0.25.12" - "@esbuild/openharmony-arm64" "0.25.12" - "@esbuild/sunos-x64" "0.25.12" - "@esbuild/win32-arm64" "0.25.12" - "@esbuild/win32-ia32" "0.25.12" - "@esbuild/win32-x64" "0.25.12" - -escalade@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" - integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== - -fast-glob@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" - integrity sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.8" - -fastq@^1.6.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.1.tgz#ca750a10dc925bc8b18839fd203e3ef4b3ced675" - integrity sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw== - dependencies: - reusify "^1.0.4" - -fdir@^6.4.4, fdir@^6.5.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" - integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== - -fill-range@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" - integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== - dependencies: - to-regex-range "^5.0.1" - -fraction.js@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a" - integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== - -fsevents@~2.3.2, fsevents@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-core-module@^2.16.1: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== - dependencies: - hasown "^2.0.2" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -jiti@^1.21.7: - version "1.21.7" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.7.tgz#9dd81043424a3d28458b193d965f0d18a2300ba9" - integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -json5@^2.2.3: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -lilconfig@^3.1.1, lilconfig@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" - integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" - integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== - dependencies: - braces "^3.0.3" - picomatch "^2.3.1" - -ms@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== - -node-releases@^2.0.36: - version "2.0.37" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.37.tgz#9bd4f10b77ba39c2b9402d4e8399c482a797f671" - integrity sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -picocolors@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" - integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" - integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== - -picomatch@^4.0.2, picomatch@^4.0.3: - version "4.0.4" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" - integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22" - integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.1.0.tgz#003b63c6edde948766e40f3daf7e997ae43a5ce6" - integrity sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw== - dependencies: - camelcase-css "^2.0.1" - -"postcss-load-config@^4.0.2 || ^5.0 || ^6.0": - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" - integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== - dependencies: - lilconfig "^3.1.1" - -postcss-nested@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.2.0.tgz#4c2d22ab5f20b9cb61e2c5c5915950784d068131" - integrity sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ== - dependencies: - postcss-selector-parser "^6.1.1" - -postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.4.47, postcss@^8.5.3: - version "8.5.8" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.8.tgz#6230ecc8fb02e7a0f6982e53990937857e13f399" - integrity sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg== - dependencies: - nanoid "^3.3.11" - picocolors "^1.1.1" - source-map-js "^1.2.1" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -react-dom@^19.1.0: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.2.4.tgz#6fac6bd96f7db477d966c7ec17c1a2b1ad8e6591" - integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ== - dependencies: - scheduler "^0.27.0" - -react-refresh@^0.17.0: - version "0.17.0" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.17.0.tgz#b7e579c3657f23d04eccbe4ad2e58a8ed51e7e53" - integrity sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ== - -react@^19.1.0: - version "19.2.4" - resolved "https://registry.yarnpkg.com/react/-/react-19.2.4.tgz#438e57baa19b77cb23aab516cf635cd0579ee09a" - integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ== - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -resolve@^1.1.7, resolve@^1.22.8: - version "1.22.11" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" - integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== - dependencies: - is-core-module "^2.16.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" - integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== - -rollup@^4.34.9: - version "4.60.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.1.tgz#b4aa2bcb3a5e1437b5fad40d43fe42d4bde7a42d" - integrity sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w== - dependencies: - "@types/estree" "1.0.8" - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.60.1" - "@rollup/rollup-android-arm64" "4.60.1" - "@rollup/rollup-darwin-arm64" "4.60.1" - "@rollup/rollup-darwin-x64" "4.60.1" - "@rollup/rollup-freebsd-arm64" "4.60.1" - "@rollup/rollup-freebsd-x64" "4.60.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.60.1" - "@rollup/rollup-linux-arm-musleabihf" "4.60.1" - "@rollup/rollup-linux-arm64-gnu" "4.60.1" - "@rollup/rollup-linux-arm64-musl" "4.60.1" - "@rollup/rollup-linux-loong64-gnu" "4.60.1" - "@rollup/rollup-linux-loong64-musl" "4.60.1" - "@rollup/rollup-linux-ppc64-gnu" "4.60.1" - "@rollup/rollup-linux-ppc64-musl" "4.60.1" - "@rollup/rollup-linux-riscv64-gnu" "4.60.1" - "@rollup/rollup-linux-riscv64-musl" "4.60.1" - "@rollup/rollup-linux-s390x-gnu" "4.60.1" - "@rollup/rollup-linux-x64-gnu" "4.60.1" - "@rollup/rollup-linux-x64-musl" "4.60.1" - "@rollup/rollup-openbsd-x64" "4.60.1" - "@rollup/rollup-openharmony-arm64" "4.60.1" - "@rollup/rollup-win32-arm64-msvc" "4.60.1" - "@rollup/rollup-win32-ia32-msvc" "4.60.1" - "@rollup/rollup-win32-x64-gnu" "4.60.1" - "@rollup/rollup-win32-x64-msvc" "4.60.1" - fsevents "~2.3.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -scheduler@^0.27.0: - version "0.27.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.27.0.tgz#0c4ef82d67d1e5c1e359e8fc76d3a87f045fe5bd" - integrity sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q== - -semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -source-map-js@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" - integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== - -sucrase@^3.35.0: - version "3.35.1" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.1.tgz#4619ea50393fe8bd0ae5071c26abd9b2e346bfe1" - integrity sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - tinyglobby "^0.2.11" - ts-interface-checker "^0.1.9" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tailwindcss@^3.4.17: - version "3.4.19" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.19.tgz#af2a0a4ae302d52ebe078b6775e799e132500ee2" - integrity sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.6.0" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.2" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.21.7" - lilconfig "^3.1.3" - micromatch "^4.0.8" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.1.1" - postcss "^8.4.47" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.2 || ^5.0 || ^6.0" - postcss-nested "^6.2.0" - postcss-selector-parser "^6.1.2" - resolve "^1.22.8" - sucrase "^3.35.0" - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -tinyglobby@^0.2.11, tinyglobby@^0.2.13: - version "0.2.15" - resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" - integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== - dependencies: - fdir "^6.5.0" - picomatch "^4.0.3" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -typescript@~5.6.2: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== - -update-browserslist-db@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" - integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== - dependencies: - escalade "^3.2.0" - picocolors "^1.1.1" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -vite@^6.0.3: - version "6.4.1" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.4.1.tgz#afbe14518cdd6887e240a4b0221ab6d0ce733f96" - integrity sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g== - dependencies: - esbuild "^0.25.0" - fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" - rollup "^4.34.9" - tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/src/openhuman/config/schema/autocomplete.rs b/src/openhuman/config/schema/autocomplete.rs index d9b1a03ff..99e62f487 100644 --- a/src/openhuman/config/schema/autocomplete.rs +++ b/src/openhuman/config/schema/autocomplete.rs @@ -24,7 +24,7 @@ pub struct AutocompleteConfig { } fn default_enabled() -> bool { - true + false } fn default_debounce_ms() -> u64 {