@sriinnu/runic 2.0.0 → 2.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +261 -0
- package/LICENSE +373 -21
- package/README.md +96 -89
- package/THIRD-PARTY-NOTICES.md +651 -0
- package/package.json +14 -4
- package/.swiftformat +0 -50
- package/.swiftlint.yml +0 -160
- package/CONTRIBUTING.md +0 -456
- package/Icon.icns +0 -0
- package/Icon.icon/Assets/runic.png +0 -0
- package/Icon.icon/icon.json +0 -36
- package/Package.resolved +0 -51
- package/Package.swift +0 -136
- package/Packages/Helix/LICENSE +0 -21
- package/Packages/Helix/Package.swift +0 -29
- package/Packages/Helix/README.md +0 -976
- package/Packages/Helix/Sources/Helix/Binding.swift +0 -111
- package/Packages/Helix/Sources/Helix/CommandParser.swift +0 -160
- package/Packages/Helix/Sources/Helix/CommandSignature.swift +0 -117
- package/Packages/Helix/Sources/Helix/ExpressibleFromArgument.swift +0 -72
- package/Packages/Helix/Sources/Helix/HelpGenerator.swift +0 -175
- package/Packages/Helix/Sources/Helix/NameSpecification.swift +0 -98
- package/Packages/Helix/Sources/Helix/ParsableCommand.swift +0 -204
- package/Packages/Helix/Sources/Helix/Platform/DarwinPlatformContext.swift +0 -44
- package/Packages/Helix/Sources/Helix/Platform/LinuxPlatformContext.swift +0 -34
- package/Packages/Helix/Sources/Helix/Platform/PlatformContext+Default.swift +0 -91
- package/Packages/Helix/Sources/Helix/Platform/PlatformContext.swift +0 -94
- package/Packages/Helix/Sources/Helix/Platform/PlatformPath.swift +0 -167
- package/Packages/Helix/Sources/Helix/Platform/Stdio.swift +0 -99
- package/Packages/Helix/Sources/Helix/Platform/WebPlatformContext.swift +0 -146
- package/Packages/Helix/Sources/Helix/Platform/WindowsPlatformContext.swift +0 -97
- package/Packages/Helix/Sources/Helix/Program.swift +0 -204
- package/Packages/Helix/Sources/Helix/PropertyWrappers.swift +0 -367
- package/Packages/Silo/LICENSE +0 -21
- package/Packages/Silo/Package.swift +0 -34
- package/Packages/Silo/README.md +0 -466
- package/Packages/Silo/Sources/Silo/BinaryCookiesReader.swift +0 -169
- package/Packages/Silo/Sources/Silo/BrowserCookieAnalytics.swift +0 -365
- package/Packages/Silo/Sources/Silo/BrowserCookieBackends.swift +0 -594
- package/Packages/Silo/Sources/Silo/BrowserCookieClient.swift +0 -326
- package/Packages/Silo/Sources/Silo/BrowserCookieExport.swift +0 -154
- package/Packages/Silo/Sources/Silo/BrowserCookieImport.swift +0 -119
- package/Packages/Silo/Sources/Silo/BrowserCookieMockStore.swift +0 -121
- package/Packages/Silo/Sources/Silo/BrowserCookieModels.swift +0 -391
- package/Packages/Silo/Sources/Silo/ChromiumCookieReader.swift +0 -240
- package/Packages/Silo/Sources/Silo/CryptoSupport.swift +0 -86
- package/Packages/Silo/Sources/Silo/FirefoxCookieReader.swift +0 -172
- package/Packages/Silo/Sources/Silo/LinuxChromiumCookieReader.swift +0 -172
- package/Packages/Silo/Sources/Silo/LinuxSecretService.swift +0 -105
- package/Packages/Silo/Sources/Silo/MacOSChromiumCookieReader.swift +0 -191
- package/Packages/Silo/Sources/Silo/SQLiteSnapshot.swift +0 -41
- package/Packages/Silo/Sources/Silo/WindowsChromiumCookieReader.swift +0 -110
- package/RuniciOS/App/RuniciOSApp.swift +0 -105
- package/RuniciOS/Core/RunicTypographyiOS.swift +0 -24
- package/RuniciOS/Core/iOSUsageStore.swift +0 -192
- package/RuniciOS/Views/ProviderDetailView.swift +0 -312
- package/RuniciOS/Views/ProviderListView.swift +0 -228
- package/RuniciOS/Widgets/LargeWidget.swift +0 -367
- package/RuniciOS/Widgets/LiveActivity.swift +0 -342
- package/RuniciOS/Widgets/LockScreenWidget.swift +0 -273
- package/RuniciOS/Widgets/MediumWidget.swift +0 -370
- package/RuniciOS/Widgets/RunicWidget.swift +0 -274
- package/RuniciOS/Widgets/SmallWidget.swift +0 -281
- package/RuniciOS/Widgets/WidgetModels.swift +0 -285
- package/RuniciOS/Widgets/WidgetTimeline.swift +0 -270
- package/Scripts/CREATION-SUMMARY.md +0 -367
- package/Scripts/DIRECTORY-STRUCTURE.md +0 -358
- package/Scripts/GETTING-STARTED-CHECKLIST.md +0 -364
- package/Scripts/INDEX.md +0 -365
- package/Scripts/QUICK-REFERENCE.md +0 -164
- package/Scripts/README-SCRIPTS.md +0 -926
- package/Scripts/build-android.sh +0 -526
- package/Scripts/build-ios.sh +0 -529
- package/Scripts/build-macos.sh +0 -603
- package/Scripts/build-windows.sh +0 -504
- package/Scripts/build_icon.sh +0 -49
- package/Scripts/changelog-to-html.sh +0 -89
- package/Scripts/check-release-assets.sh +0 -10
- package/Scripts/ci-config.yml +0 -474
- package/Scripts/compile_and_run.sh +0 -219
- package/Scripts/compile_and_run_adhoc.sh +0 -4
- package/Scripts/docs-list.mjs +0 -119
- package/Scripts/make_appcast.sh +0 -58
- package/Scripts/package_app.sh +0 -409
- package/Scripts/release-lib.sh +0 -214
- package/Scripts/release.sh +0 -76
- package/Scripts/setup-all.sh +0 -387
- package/Scripts/setup-ios.sh +0 -404
- package/Scripts/setup-react-native.sh +0 -523
- package/Scripts/sign-and-notarize.sh +0 -122
- package/Scripts/test_live_update.sh +0 -38
- package/Scripts/validate_changelog.sh +0 -23
- package/Scripts/verify_appcast.sh +0 -92
- package/Sources/Runic/About.swift +0 -93
- package/Sources/Runic/AppNotifications.swift +0 -117
- package/Sources/Runic/Controllers/StatusItemController+Actions.swift +0 -670
- package/Sources/Runic/Controllers/StatusItemController+Animation.swift +0 -519
- package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +0 -824
- package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +0 -90
- package/Sources/Runic/Controllers/StatusItemController+Menu.swift +0 -1412
- package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +0 -339
- package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +0 -423
- package/Sources/Runic/Controllers/StatusItemController.swift +0 -360
- package/Sources/Runic/Core/BudgetNotificationManager.swift +0 -81
- package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +0 -103
- package/Sources/Runic/Core/Login/CodexLoginRunner.swift +0 -154
- package/Sources/Runic/Core/Login/CursorLoginRunner.swift +0 -206
- package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +0 -92
- package/Sources/Runic/Core/Rendering/IconRenderer.swift +0 -1222
- package/Sources/Runic/Core/Rendering/IconView.swift +0 -122
- package/Sources/Runic/Core/Rendering/ProviderBrandIcon.swift +0 -71
- package/Sources/Runic/Core/RunicAnimation.swift +0 -53
- package/Sources/Runic/Core/RunicColors.swift +0 -73
- package/Sources/Runic/Core/RunicCornerRadius.swift +0 -15
- package/Sources/Runic/Core/RunicSpacing.swift +0 -68
- package/Sources/Runic/Core/RunicTypography.swift +0 -206
- package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CohereTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/CustomProviderStore.swift +0 -158
- package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/GroqTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/KimiTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/MistralTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +0 -30
- package/Sources/Runic/Core/Stores/QwenTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/SettingsStore.swift +0 -1749
- package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +0 -33
- package/Sources/Runic/Core/Stores/UsageStore+Status.swift +0 -189
- package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +0 -33
- package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +0 -67
- package/Sources/Runic/Core/Stores/UsageStore.swift +0 -3631
- package/Sources/Runic/Core/Stores/XAITokenStore.swift +0 -117
- package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +0 -117
- package/Sources/Runic/Core/UsageExporter.swift +0 -197
- package/Sources/Runic/Date+RelativeDescription.swift +0 -21
- package/Sources/Runic/HiddenWindowView.swift +0 -32
- package/Sources/Runic/InstallOrigin.swift +0 -9
- package/Sources/Runic/KeyboardShortcuts+Names.swift +0 -6
- package/Sources/Runic/MouseLocationReader.swift +0 -65
- package/Sources/Runic/Notifications+Runic.swift +0 -6
- package/Sources/Runic/OpenAICreditsPurchaseWindowController.swift +0 -503
- package/Sources/Runic/ProviderRegistry.swift +0 -100
- package/Sources/Runic/ProviderSwitcherButtons.swift +0 -267
- package/Sources/Runic/Providers/Antigravity/AntigravityLoginFlow.swift +0 -11
- package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +0 -14
- package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +0 -52
- package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +0 -42
- package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Claude/ClaudeLoginFlow.swift +0 -26
- package/Sources/Runic/Providers/Claude/ClaudeProviderImplementation.swift +0 -14
- package/Sources/Runic/Providers/Codex/CodexLoginFlow.swift +0 -18
- package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Copilot/CopilotLoginFlow.swift +0 -193
- package/Sources/Runic/Providers/Copilot/CopilotProviderImplementation.swift +0 -110
- package/Sources/Runic/Providers/Cursor/CursorLoginFlow.swift +0 -28
- package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Factory/FactoryLoginFlow.swift +0 -12
- package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Gemini/GeminiLoginFlow.swift +0 -20
- package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +0 -15
- package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +0 -32
- package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Shared/ProviderCatalog.swift +0 -15
- package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +0 -51
- package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +0 -66
- package/Sources/Runic/Providers/Shared/ProviderLoginFlow.swift +0 -12
- package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +0 -99
- package/Sources/Runic/Providers/Shared/SystemSettingsLinks.swift +0 -18
- package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +0 -24
- package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +0 -24
- package/Sources/Runic/Resources/Fonts/Caveat-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Caveat-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Light.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/FiraCode-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/IBMPlexMono-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/Inconsolata-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-Medium.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-Regular.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/JetBrainsMono-SemiBold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/SpaceMono-Bold.ttf +0 -0
- package/Sources/Runic/Resources/Fonts/SpaceMono-Regular.ttf +0 -0
- package/Sources/Runic/Resources/ProviderIcon-antigravity.svg +0 -2
- package/Sources/Runic/Resources/ProviderIcon-auggie.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-azure.svg +0 -5
- package/Sources/Runic/Resources/ProviderIcon-bedrock.svg +0 -7
- package/Sources/Runic/Resources/ProviderIcon-cerebras.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-claude.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-codex.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-cohere.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-copilot.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-cursor.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-deepseek.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-factory.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-fireworks.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-gemini.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-groq.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-kimi.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-minimax.svg +0 -1
- package/Sources/Runic/Resources/ProviderIcon-mistral.svg +0 -5
- package/Sources/Runic/Resources/ProviderIcon-openrouter.svg +0 -7
- package/Sources/Runic/Resources/ProviderIcon-perplexity.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-qwen.svg +0 -9
- package/Sources/Runic/Resources/ProviderIcon-sambanova.svg +0 -4
- package/Sources/Runic/Resources/ProviderIcon-together.svg +0 -5
- package/Sources/Runic/Resources/ProviderIcon-vertexai.svg +0 -17
- package/Sources/Runic/Resources/ProviderIcon-xai.svg +0 -3
- package/Sources/Runic/Resources/ProviderIcon-zai.svg +0 -5
- package/Sources/Runic/Resources/RunicMenubarIcon.svg +0 -7
- package/Sources/Runic/Resources/provider-context-windows.json +0 -20
- package/Sources/Runic/RunicApp.swift +0 -367
- package/Sources/Runic/SessionQuotaNotifications.swift +0 -58
- package/Sources/Runic/UsagePaceText.swift +0 -52
- package/Sources/Runic/UsageProgressBar.swift +0 -228
- package/Sources/Runic/Utilities/DisplayLink.swift +0 -96
- package/Sources/Runic/Utilities/LoadingPattern.swift +0 -62
- package/Sources/Runic/Utilities/PerformanceConstants.swift +0 -85
- package/Sources/Runic/Views/Menu/AlertsMenuView.swift +0 -254
- package/Sources/Runic/Views/Menu/ChartPanelStyle.swift +0 -22
- package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +0 -275
- package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +0 -377
- package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +0 -312
- package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +0 -311
- package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +0 -231
- package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +0 -228
- package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +0 -157
- package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +0 -63
- package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +0 -248
- package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +0 -104
- package/Sources/Runic/Views/Menu/MenuCardView.swift +0 -1889
- package/Sources/Runic/Views/Menu/MenuContent.swift +0 -153
- package/Sources/Runic/Views/Menu/MenuDescriptor.swift +0 -371
- package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +0 -35
- package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +0 -241
- package/Sources/Runic/Views/Menu/OverviewMenuView.swift +0 -281
- package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +0 -214
- package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +0 -220
- package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +0 -86
- package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +0 -214
- package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +0 -398
- package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +0 -231
- package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +0 -369
- package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +0 -191
- package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +0 -132
- package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +0 -621
- package/Sources/Runic/Views/Preferences/LiquidComponents.swift +0 -306
- package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +0 -271
- package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +0 -268
- package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +0 -418
- package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +0 -637
- package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +0 -344
- package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +0 -230
- package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +0 -321
- package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +0 -469
- package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +0 -250
- package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +0 -50
- package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +0 -572
- package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +0 -291
- package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +0 -3480
- package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +0 -29
- package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +0 -61
- package/Sources/Runic/Views/Preferences/PreferencesView.swift +0 -213
- package/Sources/Runic/Views/Rating/QualityRatingView.swift +0 -238
- package/Sources/Runic/Views/Team/TeamDashboardView.swift +0 -376
- package/Sources/Runic/Views/Team/TeamInviteSheet.swift +0 -175
- package/Sources/Runic/Views/Team/TeamManagementView.swift +0 -762
- package/Sources/Runic/Views/Team/TeamMemberRow.swift +0 -181
- package/Sources/RunicCLI/CLIEntry.swift +0 -983
- package/Sources/RunicCLI/CLIRenderer.swift +0 -87
- package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +0 -588
- package/Sources/RunicCLI/Commands/ModelsCommand.swift +0 -363
- package/Sources/RunicCLI/Commands/ProjectsCommand.swift +0 -453
- package/Sources/RunicCLI/Commands/ResetCommand.swift +0 -430
- package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +0 -167
- package/Sources/RunicClaudeWatchdog/main.swift +0 -122
- package/Sources/RunicClaudeWebProbe/main.swift +0 -62
- package/Sources/RunicCore/AlertRuleStore.swift +0 -187
- package/Sources/RunicCore/BrowserCookieImportOrder.swift +0 -25
- package/Sources/RunicCore/CopilotUsageModels.swift +0 -84
- package/Sources/RunicCore/CostUsageFetcher.swift +0 -119
- package/Sources/RunicCore/CostUsageModels.swift +0 -479
- package/Sources/RunicCore/CreditsModels.swift +0 -50
- package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +0 -268
- package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +0 -631
- package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +0 -444
- package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +0 -679
- package/Sources/RunicCore/Host/Process/SubprocessRunner.swift +0 -135
- package/Sources/RunicCore/Integrations/GitHubIntegration.swift +0 -173
- package/Sources/RunicCore/Logging/JSONStderrLogHandler.swift +0 -79
- package/Sources/RunicCore/Logging/OSLogLogHandler.swift +0 -86
- package/Sources/RunicCore/Logging/RunicLog.swift +0 -123
- package/Sources/RunicCore/Models/EnhancedUsageModels.swift +0 -370
- package/Sources/RunicCore/OpenAIDashboardModels.swift +0 -210
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +0 -676
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +0 -492
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardNavigationDelegate.swift +0 -51
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardParser.swift +0 -483
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardScrapeScript.swift +0 -558
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebViewCache.swift +0 -204
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebsiteDataStore.swift +0 -78
- package/Sources/RunicCore/PathEnvironment.swift +0 -482
- package/Sources/RunicCore/Performance/PerformanceModels.swift +0 -371
- package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +0 -426
- package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +0 -178
- package/Sources/RunicCore/ProjectBudgetStore.swift +0 -102
- package/Sources/RunicCore/ProviderCostSnapshot.swift +0 -29
- package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +0 -68
- package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +0 -685
- package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +0 -142
- package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +0 -141
- package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +0 -188
- package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +0 -126
- package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +0 -164
- package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Claude/ClaudeCLISession.swift +0 -332
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthCredentials.swift +0 -180
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +0 -137
- package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +0 -209
- package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +0 -654
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +0 -30
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageFetcher.swift +0 -480
- package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +0 -780
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthCredentials.swift +0 -147
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +0 -280
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexTokenRefresher.swift +0 -100
- package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +0 -245
- package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +0 -125
- package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +0 -26
- package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +0 -183
- package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +0 -85
- package/Sources/RunicCore/Providers/Copilot/CopilotDeviceFlow.swift +0 -123
- package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +0 -117
- package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +0 -100
- package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +0 -293
- package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +0 -385
- package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +0 -67
- package/Sources/RunicCore/Providers/Cursor/CursorStatusProbe.swift +0 -595
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +0 -85
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +0 -108
- package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +0 -398
- package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +0 -67
- package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +0 -1276
- package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +0 -67
- package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +0 -839
- package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +0 -71
- package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +0 -77
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +0 -97
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxSettingsReader.swift +0 -54
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +0 -168
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +0 -911
- package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +0 -87
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +0 -216
- package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/ProviderBranding.swift +0 -25
- package/Sources/RunicCore/Providers/ProviderCLIConfig.swift +0 -17
- package/Sources/RunicCore/Providers/ProviderDescriptor.swift +0 -129
- package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +0 -263
- package/Sources/RunicCore/Providers/ProviderSettingsSnapshot.swift +0 -98
- package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +0 -501
- package/Sources/RunicCore/Providers/ProviderVersionDetector.swift +0 -68
- package/Sources/RunicCore/Providers/Providers.swift +0 -184
- package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +0 -86
- package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +0 -30
- package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +0 -328
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +0 -84
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +0 -123
- package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +0 -48
- package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +0 -144
- package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +0 -83
- package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +0 -75
- package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +0 -74
- package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +0 -41
- package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +0 -745
- package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +0 -384
- package/Sources/RunicCore/Sync/SyncConflictResolver.swift +0 -307
- package/Sources/RunicCore/Sync/SyncProtocol.swift +0 -287
- package/Sources/RunicCore/Sync/SyncRecord.swift +0 -402
- package/Sources/RunicCore/Sync/SyncUsageExample.swift +0 -288
- package/Sources/RunicCore/Sync/TeamSyncRecords.swift +0 -768
- package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +0 -338
- package/Sources/RunicCore/Team/TeamModels.swift +0 -584
- package/Sources/RunicCore/Team/TeamShowbackExporter.swift +0 -495
- package/Sources/RunicCore/Team/TeamStore.swift +0 -809
- package/Sources/RunicCore/TextParsing.swift +0 -55
- package/Sources/RunicCore/UsageFetcher.swift +0 -694
- package/Sources/RunicCore/UsageFormatter.swift +0 -410
- package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +0 -441
- package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +0 -502
- package/Sources/RunicCore/UsageLedger/LedgerCache.swift +0 -161
- package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +0 -550
- package/Sources/RunicCore/UsageLedger/UsageLedger.swift +0 -29
- package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +0 -675
- package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +0 -209
- package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +0 -417
- package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +0 -284
- package/Sources/RunicCore/UsagePace.swift +0 -81
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +0 -73
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +0 -74
- package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +0 -208
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Claude.swift +0 -455
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Timestamp.swift +0 -132
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +0 -589
- package/Sources/RunicCore/WidgetSnapshot.swift +0 -183
- package/Sources/RunicMacroSupport/ProviderRegistrationMacros.swift +0 -14
- package/Sources/RunicMacros/ProviderRegistrationMacros.swift +0 -216
- package/Sources/RunicWidget/RunicWidgetBundle.swift +0 -79
- package/Sources/RunicWidget/RunicWidgetProvider.swift +0 -283
- package/Sources/RunicWidget/RunicWidgetViews.swift +0 -680
- package/Tests/RunicTests/AntigravityStatusProbeTests.swift +0 -50
- package/Tests/RunicTests/AppDelegateTests.swift +0 -48
- package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +0 -21
- package/Tests/RunicTests/CLIArgumentParsingTests.swift +0 -69
- package/Tests/RunicTests/CLICostTests.swift +0 -64
- package/Tests/RunicTests/CLIProviderSelectionTests.swift +0 -21
- package/Tests/RunicTests/CLISnapshotTests.swift +0 -71
- package/Tests/RunicTests/CLIWebFallbackTests.swift +0 -57
- package/Tests/RunicTests/ClaudeOAuthTests.swift +0 -163
- package/Tests/RunicTests/ClaudeResilienceTests.swift +0 -29
- package/Tests/RunicTests/ClaudeUsageTests.swift +0 -369
- package/Tests/RunicTests/CodexOAuthTests.swift +0 -121
- package/Tests/RunicTests/CodexUsageLogSourceTests.swift +0 -80
- package/Tests/RunicTests/CopilotTokenResolverTests.swift +0 -74
- package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +0 -74
- package/Tests/RunicTests/CostUsageDecodingTests.swift +0 -392
- package/Tests/RunicTests/CostUsagePricingTests.swift +0 -48
- package/Tests/RunicTests/CostUsageScannerTests.swift +0 -698
- package/Tests/RunicTests/CursorStatusProbeTests.swift +0 -322
- package/Tests/RunicTests/FactoryStatusProbeTests.swift +0 -67
- package/Tests/RunicTests/GeminiAPITestHelpers.swift +0 -94
- package/Tests/RunicTests/GeminiLoginAlertTests.swift +0 -27
- package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +0 -283
- package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +0 -279
- package/Tests/RunicTests/GeminiStatusProbeTests.swift +0 -232
- package/Tests/RunicTests/GeminiTestEnvironment.swift +0 -87
- package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +0 -72
- package/Tests/RunicTests/InstallOriginTests.swift +0 -17
- package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +0 -9
- package/Tests/RunicTests/LiveAccountTests.swift +0 -24
- package/Tests/RunicTests/LoadingPatternTests.swift +0 -34
- package/Tests/RunicTests/MenuCardModelTests.swift +0 -544
- package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +0 -11
- package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +0 -11
- package/Tests/RunicTests/MiniMaxParsingTests.swift +0 -67
- package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +0 -11
- package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +0 -110
- package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +0 -16
- package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +0 -74
- package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +0 -26
- package/Tests/RunicTests/OpenAIDashboardParserTests.swift +0 -133
- package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +0 -64
- package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +0 -131
- package/Tests/RunicTests/PathBuilderTests.swift +0 -236
- package/Tests/RunicTests/ProviderFetchPipelineTests.swift +0 -159
- package/Tests/RunicTests/ProviderIconResourcesTests.swift +0 -37
- package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +0 -15
- package/Tests/RunicTests/ProviderRegistryTests.swift +0 -29
- package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +0 -236
- package/Tests/RunicTests/ProviderToggleStoreTests.swift +0 -50
- package/Tests/RunicTests/RunicTests.swift +0 -119
- package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +0 -35
- package/Tests/RunicTests/SettingsStoreTests.swift +0 -265
- package/Tests/RunicTests/StatusItemAnimationTests.swift +0 -54
- package/Tests/RunicTests/StatusMenuTests.swift +0 -475
- package/Tests/RunicTests/StatusProbeTests.swift +0 -376
- package/Tests/RunicTests/SubprocessRunnerTests.swift +0 -18
- package/Tests/RunicTests/SubscriptionDetectionTests.swift +0 -64
- package/Tests/RunicTests/TTYCommandRunnerTests.swift +0 -147
- package/Tests/RunicTests/TTYIntegrationTests.swift +0 -41
- package/Tests/RunicTests/TeamShowbackExporterTests.swift +0 -157
- package/Tests/RunicTests/TextParsingTests.swift +0 -11
- package/Tests/RunicTests/UsageFormatterTests.swift +0 -111
- package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +0 -170
- package/Tests/RunicTests/UsageLedgerForecastTests.swift +0 -211
- package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +0 -81
- package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +0 -168
- package/Tests/RunicTests/UsagePaceTests.swift +0 -76
- package/Tests/RunicTests/UsagePaceTextTests.swift +0 -108
- package/Tests/RunicTests/UsagePolicyEngineTests.swift +0 -89
- package/Tests/RunicTests/WidgetSnapshotTests.swift +0 -43
- package/Tests/RunicTests/ZaiProviderTests.swift +0 -59
- package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +0 -9
- package/TestsLinux/PlatformGatingTests.swift +0 -46
- package/appcast.xml +0 -104
- package/assets/logo-concept-stack.svg +0 -24
- package/assets/logo-minimal-bars.svg +0 -15
- package/assets/logo.svg +0 -20
- package/assets/logo2.svg +0 -43
- package/bin/docs-list +0 -5
- package/build-and-run.sh +0 -369
- package/docs/.nojekyll +0 -1
- package/docs/CNAME +0 -1
- package/docs/antigravity.md +0 -75
- package/docs/architecture.md +0 -32
- package/docs/claude.md +0 -93
- package/docs/cli-commands/integration_guide.md +0 -371
- package/docs/cli-commands/quick_reference.md +0 -362
- package/docs/cli-commands/readme.md +0 -361
- package/docs/cli.md +0 -156
- package/docs/cloudkit_sync_guide.md +0 -495
- package/docs/codebase_review.md +0 -288
- package/docs/codex-oauth.md +0 -635
- package/docs/codex.md +0 -104
- package/docs/codexbar.png +0 -0
- package/docs/copilot.md +0 -44
- package/docs/cursor.md +0 -46
- package/docs/design/designcomparisonchart.md +0 -510
- package/docs/design/implementationguide.md +0 -792
- package/docs/design/menubaricondesignconcepts.md +0 -796
- package/docs/design/mockups/hybridiconconcept.svg +0 -62
- package/docs/design/mockups/infinityiconconcept.svg +0 -41
- package/docs/design/mockups/infinityiconstates.svg +0 -129
- package/docs/design/mockups/wavelogorefined.svg +0 -48
- package/docs/design/quick_summary.md +0 -426
- package/docs/design/readme.md +0 -478
- package/docs/design/sizespecifications.md +0 -575
- package/docs/design-system.md +0 -836
- package/docs/factory.md +0 -103
- package/docs/gemini.md +0 -73
- package/docs/icon.md +0 -37
- package/docs/icon.png +0 -0
- package/docs/index.html +0 -175
- package/docs/keychain_fix.md +0 -274
- package/docs/minimax.md +0 -71
- package/docs/packaging.md +0 -25
- package/docs/progress-bar-improvements.md +0 -240
- package/docs/progress-bar-quick-reference.md +0 -283
- package/docs/progress-bar-technical-details.md +0 -432
- package/docs/progress-bar-visual-test.swift +0 -375
- package/docs/provider.md +0 -202
- package/docs/providers.md +0 -86
- package/docs/refactor/macros.md +0 -35
- package/docs/refresh-loop.md +0 -22
- package/docs/releasing-homebrew.md +0 -35
- package/docs/releasing.md +0 -121
- package/docs/research/concrete_todo_2026-02-22.md +0 -47
- package/docs/research/core-feature-research.md +0 -248
- package/docs/research/feature_uiux_roadmap_2026-02-22.md +0 -202
- package/docs/research/parity_matrix.md +0 -49
- package/docs/research/provider_expansion_candidates_2026-02-22.md +0 -80
- package/docs/research/provider_model_token_project_matrix_2026-02-23.md +0 -46
- package/docs/research/release_gate_checklist.md +0 -57
- package/docs/site.css +0 -505
- package/docs/sparkle.md +0 -28
- package/docs/status.md +0 -28
- package/docs/sync/implementation.md +0 -393
- package/docs/sync/readme.md +0 -317
- package/docs/sync_files_summary.md +0 -391
- package/docs/sync_quick_reference.md +0 -225
- package/docs/todo.md +0 -11
- package/docs/ui.md +0 -29
- package/docs/web-integration.md +0 -9
- package/docs/widgets.md +0 -85
- package/docs/workflows/error-handling-improvements.md +0 -434
- package/docs/workflows/folder_structure.md +0 -299
- package/docs/workflows/loading_states.md +0 -446
- package/docs/workflows/loading_states_examples.md +0 -565
- package/docs/workflows/loading_states_flow.md +0 -430
- package/docs/workflows/performance_optimizations.md +0 -457
- package/docs/workflows/phase1-cli-testing-report.md +0 -313
- package/docs/workflows/quick_reference.md +0 -228
- package/docs/workflows/readme.md +0 -59
- package/docs/workflows/recent_improvements.md +0 -275
- package/docs/workflows/sync_enablement_summary.md +0 -400
- package/docs/zai.md +0 -43
- package/runic.png +0 -0
- package/runic.svg +0 -15
- package/version.env +0 -2
|
@@ -1,796 +0,0 @@
|
|
|
1
|
-
# Runic Menubar Icon Design Concepts
|
|
2
|
-
|
|
3
|
-
**Date:** February 1, 2026
|
|
4
|
-
**Status:** Design Proposal
|
|
5
|
-
**Author:** Design Review
|
|
6
|
-
|
|
7
|
-
## Executive Summary
|
|
8
|
-
|
|
9
|
-
This document compares three design concepts for the Runic menubar icon:
|
|
10
|
-
- **Option A:** Infinity Symbol + Provider Icon (monitoring eyes concept)
|
|
11
|
-
- **Option B:** Wave Logo (current design)
|
|
12
|
-
- **Option C:** Hybrid - Infinity + Usage Indicators
|
|
13
|
-
|
|
14
|
-
Each concept is evaluated for symbolism, usability, technical feasibility, and visual clarity at macOS menubar scale.
|
|
15
|
-
|
|
16
|
-
---
|
|
17
|
-
|
|
18
|
-
## Current State Analysis
|
|
19
|
-
|
|
20
|
-
### Current Wave Logo (RunicMenubarIcon.svg)
|
|
21
|
-
|
|
22
|
-
**Specifications:**
|
|
23
|
-
- Viewport: 46×78 to 210×178 (164×100 effective)
|
|
24
|
-
- Current render size: 38×22pt (76×44px @2x)
|
|
25
|
-
- Elements:
|
|
26
|
-
- Wave/knot path (stroke: #14B8A6, 18px thick)
|
|
27
|
-
- Center circle accent (32×32px, fill: #2DD4BF)
|
|
28
|
-
- Three usage bars (8px wide, varying heights, fill: #0F766E)
|
|
29
|
-
|
|
30
|
-
**Strengths:**
|
|
31
|
-
- Shows live usage data through bar heights
|
|
32
|
-
- Distinctive wave/infinity-like shape
|
|
33
|
-
- Good color gradation (teal palette)
|
|
34
|
-
- Already implemented and rendered efficiently
|
|
35
|
-
|
|
36
|
-
**Weaknesses:**
|
|
37
|
-
- Complex at small size (22pt height = 44px @2x)
|
|
38
|
-
- Wave pattern can blur on non-Retina displays
|
|
39
|
-
- Limited symbolic meaning (abstract wave shape)
|
|
40
|
-
- No clear provider identification
|
|
41
|
-
- Bars too small to read precise values
|
|
42
|
-
|
|
43
|
-
---
|
|
44
|
-
|
|
45
|
-
## Design Concepts
|
|
46
|
-
|
|
47
|
-
### Option A: Infinity Symbol + Provider Icon
|
|
48
|
-
|
|
49
|
-
**Core Concept:**
|
|
50
|
-
The infinity symbol (∞) represents "eyes watching" your AI usage. The space between the loops displays the active provider's icon, creating a visual metaphor of Runic monitoring your AI provider.
|
|
51
|
-
|
|
52
|
-
#### Visual Design
|
|
53
|
-
|
|
54
|
-
**Infinity Symbol Specifications:**
|
|
55
|
-
- **Overall size:** 38×22pt (width × height)
|
|
56
|
-
- **Infinity stroke:** 4pt thick line
|
|
57
|
-
- **Loop radius:** 7pt per loop
|
|
58
|
-
- **Center gap:** 10pt wide × 12pt tall (for provider icon)
|
|
59
|
-
- **Provider icon:** 8×8pt (16×16px @2x)
|
|
60
|
-
|
|
61
|
-
**Layout:**
|
|
62
|
-
```
|
|
63
|
-
┌────────────────────────────────────┐
|
|
64
|
-
│ │
|
|
65
|
-
│ ╭──╮ ╭──╮ │
|
|
66
|
-
│ │ │ 👁 │ │ │
|
|
67
|
-
│ ╰──╯ ╰──╯ │
|
|
68
|
-
│ │
|
|
69
|
-
└────────────────────────────────────┘
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
#### States & Variations
|
|
73
|
-
|
|
74
|
-
1. **Default State:**
|
|
75
|
-
- Monochrome template rendering (adapts to light/dark mode)
|
|
76
|
-
- Provider icon in center (full opacity)
|
|
77
|
-
- Infinity loops at 100% opacity
|
|
78
|
-
|
|
79
|
-
2. **Usage Pressure Coloring:**
|
|
80
|
-
- Safe (0-50% used): Teal (#14B8A6)
|
|
81
|
-
- Warning (50-80% used): Orange (#FFB84D)
|
|
82
|
-
- Critical (80-100% used): Red (#FF4F70)
|
|
83
|
-
- Apply color to infinity loops, keep provider icon white/black
|
|
84
|
-
|
|
85
|
-
3. **Stale Data:**
|
|
86
|
-
- Reduce opacity to 55%
|
|
87
|
-
- Slight desaturation
|
|
88
|
-
|
|
89
|
-
4. **Multiple Providers Active:**
|
|
90
|
-
- Show "combined" icon (perhaps stacked dots or merged symbol)
|
|
91
|
-
- Alternative: cycle between provider icons every 3 seconds
|
|
92
|
-
|
|
93
|
-
#### Pros
|
|
94
|
-
|
|
95
|
-
**Symbolic Strength:**
|
|
96
|
-
- Clear metaphor: "eyes watching" = monitoring
|
|
97
|
-
- Infinity = continuous tracking
|
|
98
|
-
- Immediately communicates app purpose
|
|
99
|
-
|
|
100
|
-
**Visual Clarity:**
|
|
101
|
-
- Simple, bold shape recognizable at 18-26pt
|
|
102
|
-
- Provider icon clearly visible in center
|
|
103
|
-
- Less visual noise than current wave design
|
|
104
|
-
|
|
105
|
-
**Scalability:**
|
|
106
|
-
- Works well from 18pt to 32pt
|
|
107
|
-
- Clean lines render sharply on all displays
|
|
108
|
-
- Template rendering ensures perfect dark/light mode adaptation
|
|
109
|
-
|
|
110
|
-
**Brand Identity:**
|
|
111
|
-
- Memorable, unique icon
|
|
112
|
-
- "Eyes on your AI" tagline potential
|
|
113
|
-
- Strong conceptual foundation
|
|
114
|
-
|
|
115
|
-
#### Cons
|
|
116
|
-
|
|
117
|
-
**Limited Data Visualization:**
|
|
118
|
-
- Doesn't show live usage bars
|
|
119
|
-
- No immediate visual feedback on quota consumption
|
|
120
|
-
- User must click to see detailed metrics
|
|
121
|
-
|
|
122
|
-
**Provider Icon Constraints:**
|
|
123
|
-
- Center area limited to 8-10pt icons
|
|
124
|
-
- Some provider logos may not scale well
|
|
125
|
-
- Requires maintaining clear provider icons
|
|
126
|
-
|
|
127
|
-
**Less Informative:**
|
|
128
|
-
- Loses at-a-glance usage information
|
|
129
|
-
- More symbolic, less functional
|
|
130
|
-
- User must memorize color meaning
|
|
131
|
-
|
|
132
|
-
#### Implementation Complexity
|
|
133
|
-
|
|
134
|
-
**Medium Complexity:**
|
|
135
|
-
|
|
136
|
-
1. **SVG Creation:**
|
|
137
|
-
- Simple infinity curve path (Bézier curves)
|
|
138
|
-
- Template rendering for color adaptation
|
|
139
|
-
- Provider icon overlay (multiply blend mode)
|
|
140
|
-
|
|
141
|
-
2. **Dynamic Rendering:**
|
|
142
|
-
```swift
|
|
143
|
-
static func drawInfinityWithProvider(
|
|
144
|
-
providerIcon: NSImage,
|
|
145
|
-
pressure: Double,
|
|
146
|
-
appearance: IconAppearance
|
|
147
|
-
) -> NSImage {
|
|
148
|
-
// Draw infinity path
|
|
149
|
-
// Apply pressure coloring
|
|
150
|
-
// Composite provider icon in center
|
|
151
|
-
// Return template or vibrant image
|
|
152
|
-
}
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
3. **Performance:**
|
|
156
|
-
- Cache infinity base shapes
|
|
157
|
-
- Cache per-provider compositions
|
|
158
|
-
- ~50-100 cached variations (providers × pressure levels)
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
### Option B: Wave Logo (Current Design)
|
|
163
|
-
|
|
164
|
-
**Keep the current design with potential refinements.**
|
|
165
|
-
|
|
166
|
-
#### Proposed Refinements
|
|
167
|
-
|
|
168
|
-
1. **Size Optimization:**
|
|
169
|
-
- Increase to 40×24pt (from 38×22pt) for better bar visibility
|
|
170
|
-
- Maintain 2× scale for Retina clarity
|
|
171
|
-
|
|
172
|
-
2. **Simplified Color Palette:**
|
|
173
|
-
- Reduce to 2-color scheme for template mode
|
|
174
|
-
- Make bars more prominent (wider: 10px instead of 8px)
|
|
175
|
-
|
|
176
|
-
3. **Usage Bar Enhancements:**
|
|
177
|
-
- Animate bars on hover (subtle pulse)
|
|
178
|
-
- Add tooltips showing exact percentages
|
|
179
|
-
- Color-code bars by pressure level
|
|
180
|
-
|
|
181
|
-
#### Pros
|
|
182
|
-
|
|
183
|
-
**Data-Rich:**
|
|
184
|
-
- Shows live usage at a glance
|
|
185
|
-
- Three bars = session/weekly/credits data
|
|
186
|
-
- Instant visual feedback
|
|
187
|
-
|
|
188
|
-
**Already Implemented:**
|
|
189
|
-
- No redesign required
|
|
190
|
-
- Proven performance
|
|
191
|
-
- Existing cache system optimized
|
|
192
|
-
|
|
193
|
-
**Informative:**
|
|
194
|
-
- Power users can monitor usage without clicking
|
|
195
|
-
- Visual trends over time
|
|
196
|
-
- Multiple data dimensions
|
|
197
|
-
|
|
198
|
-
#### Cons
|
|
199
|
-
|
|
200
|
-
**Visual Complexity:**
|
|
201
|
-
- Bars hard to read at 22pt height
|
|
202
|
-
- Wave pattern adds visual noise
|
|
203
|
-
- Not immediately recognizable
|
|
204
|
-
|
|
205
|
-
**Weak Symbolism:**
|
|
206
|
-
- Abstract wave shape
|
|
207
|
-
- No clear connection to "monitoring" or "AI"
|
|
208
|
-
- Generic technology aesthetic
|
|
209
|
-
|
|
210
|
-
**Scaling Issues:**
|
|
211
|
-
- Bars become illegible below 20pt
|
|
212
|
-
- Wave detail lost on low-DPI displays
|
|
213
|
-
- Template rendering flattens detail
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
### Option C: Hybrid - Infinity + Usage Indicators
|
|
218
|
-
|
|
219
|
-
**Best of both worlds: symbolic infinity with functional usage display.**
|
|
220
|
-
|
|
221
|
-
#### Visual Design
|
|
222
|
-
|
|
223
|
-
**Concept:**
|
|
224
|
-
- Infinity symbol outline (3pt stroke)
|
|
225
|
-
- Single consolidated usage bar overlaid in the center gap
|
|
226
|
-
- Provider badge in corner (6×6pt)
|
|
227
|
-
|
|
228
|
-
**Layout:**
|
|
229
|
-
```
|
|
230
|
-
┌────────────────────────────────────┐
|
|
231
|
-
│ │
|
|
232
|
-
│ ╭──╮ ███ ╭──╮ [C] │
|
|
233
|
-
│ │ │ ███ │ │ │
|
|
234
|
-
│ ╰──╯ ███ ╰──╯ │
|
|
235
|
-
│ │
|
|
236
|
-
└────────────────────────────────────┘
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
**Specifications:**
|
|
240
|
-
- Infinity loops: 3pt stroke, 6pt radius each
|
|
241
|
-
- Center bar: 10pt wide × 12pt tall, fill indicates usage %
|
|
242
|
-
- Provider badge: 6×6pt circle in top-right corner
|
|
243
|
-
|
|
244
|
-
#### States & Variations
|
|
245
|
-
|
|
246
|
-
1. **Usage Bar Fill:**
|
|
247
|
-
- Empty state: 10% fill (show container outline)
|
|
248
|
-
- Progressive fill from bottom to top
|
|
249
|
-
- Color transitions: teal → orange → red
|
|
250
|
-
|
|
251
|
-
2. **Provider Badge:**
|
|
252
|
-
- Small provider icon or colored dot
|
|
253
|
-
- Indicates active provider
|
|
254
|
-
- Subtle glow when actively syncing
|
|
255
|
-
|
|
256
|
-
3. **Infinity Outline:**
|
|
257
|
-
- Always visible (base color)
|
|
258
|
-
- Optional: pulse animation during sync
|
|
259
|
-
|
|
260
|
-
#### Pros
|
|
261
|
-
|
|
262
|
-
**Balanced Design:**
|
|
263
|
-
- Maintains symbolic "eyes watching" concept
|
|
264
|
-
- Shows usage data in center bar
|
|
265
|
-
- Provider identification via badge
|
|
266
|
-
|
|
267
|
-
**Functional:**
|
|
268
|
-
- At-a-glance usage percentage
|
|
269
|
-
- Simpler than three bars (one consolidated metric)
|
|
270
|
-
- Clear visual hierarchy
|
|
271
|
-
|
|
272
|
-
**Scalable:**
|
|
273
|
-
- Works from 20-28pt
|
|
274
|
-
- Both elements remain visible at small sizes
|
|
275
|
-
- Better than current wave complexity
|
|
276
|
-
|
|
277
|
-
#### Cons
|
|
278
|
-
|
|
279
|
-
**Compromised Simplicity:**
|
|
280
|
-
- More complex than pure infinity symbol
|
|
281
|
-
- Bar may compete with infinity shape
|
|
282
|
-
- Provider badge might be too small
|
|
283
|
-
|
|
284
|
-
**Reduced Data:**
|
|
285
|
-
- Only one bar (vs. three in current design)
|
|
286
|
-
- Loses session/weekly/credits breakdown
|
|
287
|
-
- Must consolidate metrics (show most critical)
|
|
288
|
-
|
|
289
|
-
**Implementation Effort:**
|
|
290
|
-
- New design and testing required
|
|
291
|
-
- Hybrid rendering logic
|
|
292
|
-
- More cache permutations
|
|
293
|
-
|
|
294
|
-
---
|
|
295
|
-
|
|
296
|
-
## Size Recommendations & Technical Specifications
|
|
297
|
-
|
|
298
|
-
### macOS Menubar Icon Guidelines
|
|
299
|
-
|
|
300
|
-
**Standard Sizes:**
|
|
301
|
-
- **Recommended:** 22pt square (44×44px @2x)
|
|
302
|
-
- **Apple HIG:** 18-22pt for simple icons, up to 28pt for detailed
|
|
303
|
-
- **Runic current:** 38×22pt (rectangular, not square)
|
|
304
|
-
|
|
305
|
-
**Rendering Requirements:**
|
|
306
|
-
- Must provide @2x (Retina) and @1x (legacy) bitmaps
|
|
307
|
-
- Template rendering: use alpha channel, system colors
|
|
308
|
-
- Safe area: 2pt padding from edges
|
|
309
|
-
- Pixel grid alignment at @2x scale
|
|
310
|
-
|
|
311
|
-
### Recommended Sizes by Concept
|
|
312
|
-
|
|
313
|
-
#### Option A: Infinity Symbol
|
|
314
|
-
- **Optimal height:** 20-24pt
|
|
315
|
-
- **Width:** 36-42pt (to fit provider icon)
|
|
316
|
-
- **Rationale:** Simple geometric shape scales well, needs width for two loops
|
|
317
|
-
|
|
318
|
-
**Proposed:** 40×24pt
|
|
319
|
-
- Infinity loops: 8pt radius each, 4pt stroke
|
|
320
|
-
- Center gap: 12pt wide (fits 8pt provider icon comfortably)
|
|
321
|
-
- Provider icon: 8×8pt (16×16px @2x) with 2pt padding
|
|
322
|
-
|
|
323
|
-
#### Option B: Wave Logo (Current)
|
|
324
|
-
- **Current:** 38×22pt (adequate but cramped)
|
|
325
|
-
- **Recommended:** 40×24pt or 42×26pt
|
|
326
|
-
- **Rationale:** More vertical space for bars, clearer wave detail
|
|
327
|
-
|
|
328
|
-
**Proposed:** 42×26pt
|
|
329
|
-
- Wave path: 20pt stroke
|
|
330
|
-
- Center circle: 36×36pt
|
|
331
|
-
- Usage bars: 10pt wide × 20-28pt tall (varies)
|
|
332
|
-
|
|
333
|
-
#### Option C: Hybrid
|
|
334
|
-
- **Optimal:** 40×24pt
|
|
335
|
-
- **Rationale:** Balances infinity outline and center bar
|
|
336
|
-
|
|
337
|
-
**Proposed:** 40×24pt
|
|
338
|
-
- Infinity: 3pt stroke, 7pt radius loops
|
|
339
|
-
- Center bar: 10×14pt
|
|
340
|
-
- Provider badge: 6×6pt in corner
|
|
341
|
-
|
|
342
|
-
### Retina Display Considerations
|
|
343
|
-
|
|
344
|
-
**2× Scale (@2x):**
|
|
345
|
-
- All dimensions double in pixels
|
|
346
|
-
- 24pt height = 48px bitmap height
|
|
347
|
-
- Ensures sharp rendering on MacBook Pro/Air displays
|
|
348
|
-
|
|
349
|
-
**Anti-aliasing:**
|
|
350
|
-
- Use sub-pixel rendering for smooth curves
|
|
351
|
-
- Align vertical/horizontal edges to pixel grid
|
|
352
|
-
- Avoid fractional pixel positions at @2x scale
|
|
353
|
-
|
|
354
|
-
**Color Depth:**
|
|
355
|
-
- 32-bit RGBA (8 bits per channel)
|
|
356
|
-
- Alpha channel for template rendering
|
|
357
|
-
- sRGB color space
|
|
358
|
-
|
|
359
|
-
---
|
|
360
|
-
|
|
361
|
-
## Color Schemes & Template Rendering
|
|
362
|
-
|
|
363
|
-
### Template Mode (Recommended)
|
|
364
|
-
|
|
365
|
-
**What is Template Rendering?**
|
|
366
|
-
- macOS automatically adapts icon to menubar theme
|
|
367
|
-
- Light mode: dark icon on light background
|
|
368
|
-
- Dark mode: light icon on dark background
|
|
369
|
-
- System handles all color adaptation
|
|
370
|
-
|
|
371
|
-
**Implementation:**
|
|
372
|
-
```swift
|
|
373
|
-
image.isTemplate = true
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
**Benefits:**
|
|
377
|
-
- Perfect theme integration
|
|
378
|
-
- No manual light/dark variants
|
|
379
|
-
- System-level accessibility support
|
|
380
|
-
- Consistent with other menubar apps
|
|
381
|
-
|
|
382
|
-
**Limitations:**
|
|
383
|
-
- Single color (no multi-color icons)
|
|
384
|
-
- Alpha channel defines shape only
|
|
385
|
-
- Cannot show colored provider icons in template mode
|
|
386
|
-
|
|
387
|
-
### Vibrant Mode (Optional)
|
|
388
|
-
|
|
389
|
-
**Full Color Rendering:**
|
|
390
|
-
- Custom color palette preserved
|
|
391
|
-
- Pressure coloring (teal → orange → red)
|
|
392
|
-
- Colored provider icons
|
|
393
|
-
|
|
394
|
-
**Use Cases:**
|
|
395
|
-
- User preference toggle in settings
|
|
396
|
-
- High-priority alerts (critical usage)
|
|
397
|
-
- Branding emphasis over integration
|
|
398
|
-
|
|
399
|
-
**Implementation:**
|
|
400
|
-
```swift
|
|
401
|
-
image.isTemplate = false
|
|
402
|
-
// Apply custom colors during rendering
|
|
403
|
-
```
|
|
404
|
-
|
|
405
|
-
### Recommended Approach
|
|
406
|
-
|
|
407
|
-
**Default: Template Mode**
|
|
408
|
-
- Clean, professional appearance
|
|
409
|
-
- Perfect system integration
|
|
410
|
-
- Accessibility compliant
|
|
411
|
-
|
|
412
|
-
**Optional: Vibrant Mode**
|
|
413
|
-
- User-configurable in preferences
|
|
414
|
-
- Fallback for alerts (flash red when critical)
|
|
415
|
-
- Provider-specific colors if desired
|
|
416
|
-
|
|
417
|
-
---
|
|
418
|
-
|
|
419
|
-
## Usage Indicator Integration
|
|
420
|
-
|
|
421
|
-
### Option A: Infinity Symbol - How to Show Usage?
|
|
422
|
-
|
|
423
|
-
Since the infinity symbol doesn't inherently display data, here are options:
|
|
424
|
-
|
|
425
|
-
#### 1. **Color Pressure Mapping**
|
|
426
|
-
- **0-50% used:** Teal infinity loops (#14B8A6)
|
|
427
|
-
- **50-80% used:** Orange loops (#FFB84D)
|
|
428
|
-
- **80-100% used:** Red loops (#FF4F70)
|
|
429
|
-
- **Pros:** Subtle, doesn't clutter icon
|
|
430
|
-
- **Cons:** Requires user to learn color meaning
|
|
431
|
-
|
|
432
|
-
#### 2. **Accent Dot**
|
|
433
|
-
- Small dot (4×4pt) on infinity curve
|
|
434
|
-
- Position along curve indicates usage percentage
|
|
435
|
-
- Color indicates pressure level
|
|
436
|
-
- **Pros:** Visual metaphor (progress indicator)
|
|
437
|
-
- **Cons:** Tiny, may be hard to notice
|
|
438
|
-
|
|
439
|
-
#### 3. **No Direct Indicator**
|
|
440
|
-
- Icon remains symbolic only
|
|
441
|
-
- User clicks to see detailed usage
|
|
442
|
-
- Menubar tooltip shows percentage on hover
|
|
443
|
-
- **Pros:** Cleanest design
|
|
444
|
-
- **Cons:** Less functional than current wave
|
|
445
|
-
|
|
446
|
-
**Recommendation:** Use **Color Pressure Mapping** for Option A. It's subtle, doesn't add visual complexity, and provides at-a-glance status.
|
|
447
|
-
|
|
448
|
-
### Option B: Wave Logo - Current Approach
|
|
449
|
-
|
|
450
|
-
- Three vertical bars show session/weekly/credits usage
|
|
451
|
-
- Bar height = percentage used or remaining
|
|
452
|
-
- Bars are color-coded or use same teal palette
|
|
453
|
-
|
|
454
|
-
**Keep as-is or enhance:**
|
|
455
|
-
- Make bars 2pt wider (10pt instead of 8pt)
|
|
456
|
-
- Add subtle glow when nearing limits
|
|
457
|
-
- Animate on hover (optional)
|
|
458
|
-
|
|
459
|
-
### Option C: Hybrid - Center Bar
|
|
460
|
-
|
|
461
|
-
- Single bar in infinity center gap
|
|
462
|
-
- Shows most critical metric (lowest remaining percentage)
|
|
463
|
-
- Fill level = usage percentage
|
|
464
|
-
- Color = pressure level
|
|
465
|
-
|
|
466
|
-
**Advantages:**
|
|
467
|
-
- Simpler than three bars
|
|
468
|
-
- Consolidated "worst-case" metric
|
|
469
|
-
- More visible than Option A color coding
|
|
470
|
-
|
|
471
|
-
---
|
|
472
|
-
|
|
473
|
-
## Provider Icon Considerations
|
|
474
|
-
|
|
475
|
-
### Option A: Center Icon (8-10pt)
|
|
476
|
-
|
|
477
|
-
**Requirements:**
|
|
478
|
-
- **Size:** 8×8pt minimum (16×16px @2x)
|
|
479
|
-
- **Clarity:** Must be recognizable at small scale
|
|
480
|
-
- **Contrast:** Must work on both light and dark backgrounds
|
|
481
|
-
|
|
482
|
-
**Design Guidelines for Provider Icons:**
|
|
483
|
-
|
|
484
|
-
1. **Simple Geometry:**
|
|
485
|
-
- Avoid fine details
|
|
486
|
-
- Use bold shapes
|
|
487
|
-
- Prefer geometric symbols over text
|
|
488
|
-
|
|
489
|
-
2. **High Contrast:**
|
|
490
|
-
- Solid fills or thick strokes (2pt+)
|
|
491
|
-
- Avoid gradients or textures
|
|
492
|
-
- White outline for dark backgrounds (optional)
|
|
493
|
-
|
|
494
|
-
3. **Example Provider Icons:**
|
|
495
|
-
- **Claude:** Two vertical slits (current design: 2×6pt)
|
|
496
|
-
- **Codex:** Two square eyes (3×3pt)
|
|
497
|
-
- **Gemini:** Diamond shape (8pt diagonal)
|
|
498
|
-
- **Cursor:** Arrow/pointer (6pt)
|
|
499
|
-
- **Copilot:** Circular eyes with bridge
|
|
500
|
-
|
|
501
|
-
**Existing Icons:** Already well-designed at small scale (see IconRenderer.swift, lines 300-473)
|
|
502
|
-
|
|
503
|
-
### Option C: Corner Badge (6×6pt)
|
|
504
|
-
|
|
505
|
-
**Smaller but less critical:**
|
|
506
|
-
- Simple colored dot or 1-letter abbreviation
|
|
507
|
-
- Background circle with contrasting icon
|
|
508
|
-
- Examples:
|
|
509
|
-
- **Claude:** Orange dot with "C"
|
|
510
|
-
- **Codex:** Purple dot with "<>"
|
|
511
|
-
- **Gemini:** Blue dot with star
|
|
512
|
-
|
|
513
|
-
**Trade-off:** Less recognizable but saves center space for usage bar
|
|
514
|
-
|
|
515
|
-
---
|
|
516
|
-
|
|
517
|
-
## Implementation Recommendations
|
|
518
|
-
|
|
519
|
-
### Option A: Infinity Symbol + Provider Icon
|
|
520
|
-
|
|
521
|
-
#### SVG Structure
|
|
522
|
-
```xml
|
|
523
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 48">
|
|
524
|
-
<!-- Infinity loops -->
|
|
525
|
-
<path d="M20,24 C20,15 30,15 35,24 C40,33 50,33 50,24
|
|
526
|
-
C50,15 40,15 35,24 C30,33 20,33 20,24"
|
|
527
|
-
stroke="#14B8A6" stroke-width="8"
|
|
528
|
-
fill="none" stroke-linecap="round"/>
|
|
529
|
-
|
|
530
|
-
<!-- Provider icon placeholder (replace with actual icon) -->
|
|
531
|
-
<circle cx="40" cy="24" r="4" fill="#FFFFFF"/>
|
|
532
|
-
</svg>
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
#### Swift Rendering Code
|
|
536
|
-
```swift
|
|
537
|
-
static func drawInfinityIcon(
|
|
538
|
-
provider: UsageProvider,
|
|
539
|
-
pressure: Double,
|
|
540
|
-
appearance: IconAppearance
|
|
541
|
-
) -> NSImage {
|
|
542
|
-
let color = vibrantAccentColor(pressure: pressure, stale: false)
|
|
543
|
-
let baseColor = appearance == .template ? NSColor.labelColor : color
|
|
544
|
-
|
|
545
|
-
return renderImage(isTemplate: appearance == .template) {
|
|
546
|
-
// Draw infinity path
|
|
547
|
-
drawInfinityPath(color: baseColor)
|
|
548
|
-
|
|
549
|
-
// Composite provider icon in center
|
|
550
|
-
if let providerIcon = loadProviderIcon(provider) {
|
|
551
|
-
drawProviderIcon(providerIcon, center: centerPoint)
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
private static func drawInfinityPath(color: NSColor) {
|
|
557
|
-
let path = NSBezierPath()
|
|
558
|
-
// Left loop
|
|
559
|
-
path.appendArc(
|
|
560
|
-
withCenter: NSPoint(x: 15, y: 12),
|
|
561
|
-
radius: 7,
|
|
562
|
-
startAngle: 0,
|
|
563
|
-
endAngle: 360
|
|
564
|
-
)
|
|
565
|
-
// Right loop
|
|
566
|
-
path.appendArc(
|
|
567
|
-
withCenter: NSPoint(x: 25, y: 12),
|
|
568
|
-
radius: 7,
|
|
569
|
-
startAngle: 0,
|
|
570
|
-
endAngle: 360
|
|
571
|
-
)
|
|
572
|
-
// Connect loops to form infinity
|
|
573
|
-
// (simplified - actual Bézier curves needed for smooth infinity shape)
|
|
574
|
-
|
|
575
|
-
path.lineWidth = 4
|
|
576
|
-
color.setStroke()
|
|
577
|
-
path.stroke()
|
|
578
|
-
}
|
|
579
|
-
```
|
|
580
|
-
|
|
581
|
-
#### Caching Strategy
|
|
582
|
-
- Cache base infinity shapes (one per pressure color)
|
|
583
|
-
- Cache provider icon compositions
|
|
584
|
-
- Key: `InfinityCacheKey(provider, pressure, appearance)`
|
|
585
|
-
- Estimated cache size: ~50 variations (10 providers × 5 pressure levels)
|
|
586
|
-
|
|
587
|
-
### Option B: Wave Logo Enhancements
|
|
588
|
-
|
|
589
|
-
#### Minimal Changes
|
|
590
|
-
```swift
|
|
591
|
-
// Increase bar width from 8 to 10
|
|
592
|
-
static let barWidth = 10.0
|
|
593
|
-
|
|
594
|
-
// Increase overall height from 22 to 24
|
|
595
|
-
static let outputSize = NSSize(width: 40, height: 24)
|
|
596
|
-
```
|
|
597
|
-
|
|
598
|
-
#### Optional Animations
|
|
599
|
-
```swift
|
|
600
|
-
// Add subtle pulse to bars when nearing limit
|
|
601
|
-
if pressure > 0.8 {
|
|
602
|
-
let pulse = sin(CACurrentMediaTime() * 2) * 0.15 + 0.85
|
|
603
|
-
barColor = barColor.withAlphaComponent(pulse)
|
|
604
|
-
}
|
|
605
|
-
```
|
|
606
|
-
|
|
607
|
-
### Option C: Hybrid Implementation
|
|
608
|
-
|
|
609
|
-
#### Combined Rendering
|
|
610
|
-
```swift
|
|
611
|
-
static func drawHybridIcon(
|
|
612
|
-
provider: UsageProvider,
|
|
613
|
-
primaryUsage: Double,
|
|
614
|
-
appearance: IconAppearance
|
|
615
|
-
) -> NSImage {
|
|
616
|
-
return renderImage(isTemplate: appearance == .template) {
|
|
617
|
-
// 1. Draw infinity outline
|
|
618
|
-
drawInfinityOutline(color: baseColor.withAlphaComponent(0.3))
|
|
619
|
-
|
|
620
|
-
// 2. Draw center usage bar
|
|
621
|
-
drawCenterBar(fillPercent: primaryUsage / 100, color: pressureColor)
|
|
622
|
-
|
|
623
|
-
// 3. Draw provider badge
|
|
624
|
-
drawProviderBadge(provider: provider, position: .topRight)
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
```
|
|
628
|
-
|
|
629
|
-
---
|
|
630
|
-
|
|
631
|
-
## Comparison Matrix
|
|
632
|
-
|
|
633
|
-
| Criterion | Option A: Infinity | Option B: Wave | Option C: Hybrid |
|
|
634
|
-
|-----------|-------------------|----------------|------------------|
|
|
635
|
-
| **Symbolism** | ★★★★★ Eyes watching | ★★☆☆☆ Abstract | ★★★★☆ Balanced |
|
|
636
|
-
| **Data Visibility** | ★★☆☆☆ Color only | ★★★★★ 3 bars | ★★★☆☆ 1 bar |
|
|
637
|
-
| **Clarity (18-22pt)** | ★★★★★ Simple shape | ★★★☆☆ Complex | ★★★★☆ Moderate |
|
|
638
|
-
| **Provider ID** | ★★★★★ Center icon | ★☆☆☆☆ None | ★★★☆☆ Badge |
|
|
639
|
-
| **Implementation** | ★★★☆☆ Medium | ★★★★★ Done | ★★☆☆☆ Complex |
|
|
640
|
-
| **Brand Identity** | ★★★★★ Memorable | ★★★☆☆ Generic | ★★★★☆ Good |
|
|
641
|
-
| **User Learning** | ★★★☆☆ Color meaning | ★★★★☆ Intuitive | ★★★★☆ Balanced |
|
|
642
|
-
| **Scalability** | ★★★★★ 18-32pt | ★★★☆☆ 22-28pt | ★★★★☆ 20-26pt |
|
|
643
|
-
|
|
644
|
-
**Rating Scale:** ★★★★★ Excellent | ★★★★☆ Good | ★★★☆☆ Acceptable | ★★☆☆☆ Poor | ★☆☆☆☆ Inadequate
|
|
645
|
-
|
|
646
|
-
---
|
|
647
|
-
|
|
648
|
-
## Recommendations
|
|
649
|
-
|
|
650
|
-
### Primary Recommendation: **Option A - Infinity Symbol + Provider Icon**
|
|
651
|
-
|
|
652
|
-
**Rationale:**
|
|
653
|
-
1. **Strong Conceptual Foundation:** The "eyes watching" metaphor immediately communicates Runic's purpose
|
|
654
|
-
2. **Memorable Brand Identity:** Unique, recognizable icon that stands out in the menubar
|
|
655
|
-
3. **Scalable Design:** Works well from 18pt to 32pt, crucial for different Mac displays
|
|
656
|
-
4. **Provider Clarity:** Center icon clearly shows which provider is active
|
|
657
|
-
5. **Modern Aesthetics:** Clean, minimalist design aligns with macOS Big Sur+ design language
|
|
658
|
-
|
|
659
|
-
**Trade-off Acknowledgment:**
|
|
660
|
-
- Loses immediate usage data visibility
|
|
661
|
-
- Users must click to see detailed metrics
|
|
662
|
-
- **Mitigation:** Use color pressure mapping (teal → orange → red) and rich tooltip on hover
|
|
663
|
-
|
|
664
|
-
**Recommended Specifications:**
|
|
665
|
-
- Size: 40×24pt (80×48px @2x)
|
|
666
|
-
- Infinity stroke: 4pt
|
|
667
|
-
- Loop radius: 7pt each
|
|
668
|
-
- Provider icon: 8×8pt in center
|
|
669
|
-
- Color mapping: pressure-based for at-a-glance status
|
|
670
|
-
|
|
671
|
-
### Secondary Recommendation: **Option C - Hybrid** (if data visibility is critical)
|
|
672
|
-
|
|
673
|
-
**When to Choose:**
|
|
674
|
-
- User feedback demands at-a-glance usage data
|
|
675
|
-
- Power users prioritize metrics over symbolism
|
|
676
|
-
- A/B testing shows higher engagement with visible bars
|
|
677
|
-
|
|
678
|
-
**Recommended Specifications:**
|
|
679
|
-
- Size: 40×24pt
|
|
680
|
-
- Infinity outline: 3pt stroke
|
|
681
|
-
- Center bar: 10×14pt
|
|
682
|
-
- Provider badge: 6×6pt in corner
|
|
683
|
-
|
|
684
|
-
### Not Recommended: **Option B - Current Wave Logo**
|
|
685
|
-
|
|
686
|
-
**Reasoning:**
|
|
687
|
-
- Weak symbolic connection to monitoring/AI
|
|
688
|
-
- Visual complexity reduces clarity at small sizes
|
|
689
|
-
- Generic technology aesthetic
|
|
690
|
-
- Already implemented, so no forward progress
|
|
691
|
-
|
|
692
|
-
**Exception:** If development timeline is critical and redesign is not feasible, enhance current design with:
|
|
693
|
-
- Increased size to 42×26pt
|
|
694
|
-
- Wider bars (10pt instead of 8pt)
|
|
695
|
-
- Simplified color scheme
|
|
696
|
-
|
|
697
|
-
---
|
|
698
|
-
|
|
699
|
-
## Implementation Plan
|
|
700
|
-
|
|
701
|
-
### Phase 1: Prototyping (Week 1)
|
|
702
|
-
1. Create SVG mockups for all three options
|
|
703
|
-
2. Implement basic rendering in IconRenderer
|
|
704
|
-
3. Test at 18pt, 22pt, 26pt sizes
|
|
705
|
-
4. Gather internal feedback
|
|
706
|
-
|
|
707
|
-
### Phase 2: Refinement (Week 2)
|
|
708
|
-
5. Refine chosen design based on feedback
|
|
709
|
-
6. Implement caching system
|
|
710
|
-
7. Add animation states (sync pulse, error flash)
|
|
711
|
-
8. Test on multiple Mac displays (Retina, non-Retina)
|
|
712
|
-
|
|
713
|
-
### Phase 3: Integration (Week 3)
|
|
714
|
-
9. Replace current wave logo in Resources/
|
|
715
|
-
10. Update IconRenderer.swift rendering logic
|
|
716
|
-
11. Add user preference toggle (template vs. vibrant mode)
|
|
717
|
-
12. Update documentation and changelog
|
|
718
|
-
|
|
719
|
-
### Phase 4: User Testing (Week 4)
|
|
720
|
-
13. Beta release with new icon
|
|
721
|
-
14. Collect user feedback
|
|
722
|
-
15. A/B testing if possible (show different icons to user segments)
|
|
723
|
-
16. Iterate based on data
|
|
724
|
-
|
|
725
|
-
---
|
|
726
|
-
|
|
727
|
-
## Future Enhancements
|
|
728
|
-
|
|
729
|
-
### Dynamic Animations
|
|
730
|
-
- **Sync Pulse:** Subtle pulse during active data fetch
|
|
731
|
-
- **Alert Flash:** Red flash when usage exceeds threshold
|
|
732
|
-
- **Provider Switch:** Smooth morph animation when switching providers
|
|
733
|
-
|
|
734
|
-
### Accessibility
|
|
735
|
-
- **VoiceOver Support:** Descriptive labels for icon states
|
|
736
|
-
- **High Contrast Mode:** Thicker strokes, higher contrast colors
|
|
737
|
-
- **Reduced Motion:** Disable animations if system preference set
|
|
738
|
-
|
|
739
|
-
### Customization
|
|
740
|
-
- **User-Selectable Icons:** Option A, B, or C in preferences
|
|
741
|
-
- **Color Themes:** Custom color schemes beyond default teal
|
|
742
|
-
- **Size Options:** Small (20pt), Medium (24pt), Large (28pt)
|
|
743
|
-
|
|
744
|
-
---
|
|
745
|
-
|
|
746
|
-
## Appendices
|
|
747
|
-
|
|
748
|
-
### Appendix A: SVG Mockup Files
|
|
749
|
-
- `InfinityIconConcept.svg` - Option A full design
|
|
750
|
-
- `InfinityIconStates.svg` - Option A with all states
|
|
751
|
-
- `WaveLogoRefined.svg` - Option B with enhancements
|
|
752
|
-
- `HybridIconConcept.svg` - Option C design
|
|
753
|
-
|
|
754
|
-
### Appendix B: Technical References
|
|
755
|
-
- Apple Human Interface Guidelines - Menubar Extras
|
|
756
|
-
- macOS Template Image Best Practices
|
|
757
|
-
- IconRenderer.swift (current implementation)
|
|
758
|
-
- NSImage Template Rendering Documentation
|
|
759
|
-
|
|
760
|
-
### Appendix C: Color Specifications
|
|
761
|
-
|
|
762
|
-
**Teal Palette (Current):**
|
|
763
|
-
- Primary: #14B8A6 (teal-500)
|
|
764
|
-
- Light: #2DD4BF (teal-400)
|
|
765
|
-
- Dark: #0F766E (teal-700)
|
|
766
|
-
|
|
767
|
-
**Pressure Palette (Recommended):**
|
|
768
|
-
- Safe: #14B8A6 (teal-500) - 0-50% usage
|
|
769
|
-
- Warning: #FFB84D (orange-400) - 50-80% usage
|
|
770
|
-
- Critical: #FF4F70 (red-500) - 80-100% usage
|
|
771
|
-
- Stale: 55% opacity on any color
|
|
772
|
-
|
|
773
|
-
**Template Colors:**
|
|
774
|
-
- Light mode: NSColor.labelColor (black ~85% opacity)
|
|
775
|
-
- Dark mode: NSColor.labelColor (white ~85% opacity)
|
|
776
|
-
- System-managed, no manual specification needed
|
|
777
|
-
|
|
778
|
-
---
|
|
779
|
-
|
|
780
|
-
## Conclusion
|
|
781
|
-
|
|
782
|
-
The **Infinity Symbol + Provider Icon** design offers the strongest conceptual foundation, best scalability, and most memorable brand identity for Runic. While it sacrifices immediate data visibility compared to the current wave logo, this trade-off is acceptable given:
|
|
783
|
-
|
|
784
|
-
1. Users can hover for tooltip or click for full details
|
|
785
|
-
2. Color pressure mapping provides at-a-glance status
|
|
786
|
-
3. Provider icon adds valuable context missing in current design
|
|
787
|
-
4. Simpler shape ensures clarity across all display sizes
|
|
788
|
-
|
|
789
|
-
**Next Steps:**
|
|
790
|
-
1. Create SVG mockups (see attached files)
|
|
791
|
-
2. Stakeholder review and decision
|
|
792
|
-
3. Implement chosen design in IconRenderer.swift
|
|
793
|
-
4. Beta test with users
|
|
794
|
-
5. Iterate based on feedback
|
|
795
|
-
|
|
796
|
-
**Timeline:** 3-4 weeks from concept approval to production deployment.
|