@sriinnu/runic 1.2.0 → 2.11.1
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 +267 -0
- package/LICENSE +373 -21
- package/README.md +98 -84
- 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/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 -115
- package/Sources/Runic/Controllers/StatusItemController+Actions.swift +0 -666
- package/Sources/Runic/Controllers/StatusItemController+Animation.swift +0 -518
- package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +0 -810
- package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +0 -87
- package/Sources/Runic/Controllers/StatusItemController+Menu.swift +0 -1407
- package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +0 -337
- package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +0 -395
- package/Sources/Runic/Controllers/StatusItemController.swift +0 -360
- package/Sources/Runic/Core/BudgetNotificationManager.swift +0 -80
- 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 -1216
- package/Sources/Runic/Core/Rendering/IconView.swift +0 -120
- 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/Stores/AuggieTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CohereTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/CustomProviderStore.swift +0 -158
- package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/GroqTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/KimiTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/MistralTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +0 -30
- package/Sources/Runic/Core/Stores/QwenTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/SettingsStore.swift +0 -1711
- package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +0 -20
- 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 -3605
- package/Sources/Runic/Core/Stores/XAITokenStore.swift +0 -119
- package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +0 -118
- package/Sources/Runic/Core/UsageExporter.swift +0 -193
- 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 -48
- 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/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 -357
- package/Sources/Runic/SessionQuotaNotifications.swift +0 -58
- package/Sources/Runic/UsagePaceText.swift +0 -52
- package/Sources/Runic/UsageProgressBar.swift +0 -224
- package/Sources/Runic/Utilities/DisplayLink.swift +0 -96
- package/Sources/Runic/Utilities/LoadingPattern.swift +0 -60
- package/Sources/Runic/Utilities/PerformanceConstants.swift +0 -85
- package/Sources/Runic/Views/Menu/AlertsMenuView.swift +0 -256
- 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 -312
- package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +0 -228
- package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +0 -228
- package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +0 -155
- package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +0 -64
- package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +0 -268
- package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +0 -104
- package/Sources/Runic/Views/Menu/MenuCardView.swift +0 -1900
- package/Sources/Runic/Views/Menu/MenuContent.swift +0 -150
- package/Sources/Runic/Views/Menu/MenuDescriptor.swift +0 -369
- package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +0 -42
- package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +0 -235
- package/Sources/Runic/Views/Menu/OverviewMenuView.swift +0 -278
- package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +0 -209
- package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +0 -220
- package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +0 -88
- package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +0 -201
- package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +0 -398
- package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +0 -232
- package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +0 -364
- package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +0 -190
- package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +0 -132
- package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +0 -618
- package/Sources/Runic/Views/Preferences/LiquidComponents.swift +0 -305
- 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 -422
- package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +0 -641
- 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 -322
- package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +0 -469
- package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +0 -231
- package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +0 -50
- package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +0 -567
- package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +0 -288
- package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +0 -3435
- package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +0 -25
- package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +0 -59
- package/Sources/Runic/Views/Preferences/PreferencesView.swift +0 -206
- package/Sources/Runic/Views/Rating/QualityRatingView.swift +0 -238
- package/Sources/Runic/Views/Team/TeamDashboardView.swift +0 -371
- package/Sources/Runic/Views/Team/TeamInviteSheet.swift +0 -175
- package/Sources/Runic/Views/Team/TeamManagementView.swift +0 -761
- package/Sources/Runic/Views/Team/TeamMemberRow.swift +0 -181
- package/Sources/RunicCLI/CLIEntry.swift +0 -942
- package/Sources/RunicCLI/CLIRenderer.swift +0 -87
- package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +0 -588
- package/Sources/RunicCLI/Commands/ModelsCommand.swift +0 -362
- package/Sources/RunicCLI/Commands/ProjectsCommand.swift +0 -439
- package/Sources/RunicCLI/Commands/ResetCommand.swift +0 -429
- package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +0 -168
- 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 -269
- package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +0 -633
- package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +0 -500
- 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 -371
- 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 -409
- package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +0 -178
- package/Sources/RunicCore/ProjectBudgetStore.swift +0 -99
- package/Sources/RunicCore/ProviderCostSnapshot.swift +0 -29
- package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +0 -66
- 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 -168
- 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 -207
- package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +0 -654
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +0 -28
- 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 -243
- package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +0 -125
- package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +0 -24
- package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +0 -181
- 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 -114
- package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +0 -100
- package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +0 -291
- package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +0 -386
- package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +0 -65
- 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 -65
- 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 -65
- package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +0 -836
- 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 -92
- 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 -203
- 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 -84
- package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +0 -30
- package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +0 -315
- 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 -72
- package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +0 -41
- package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +0 -718
- package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +0 -385
- package/Sources/RunicCore/Sync/SyncConflictResolver.swift +0 -310
- package/Sources/RunicCore/Sync/SyncProtocol.swift +0 -288
- package/Sources/RunicCore/Sync/SyncRecord.swift +0 -405
- package/Sources/RunicCore/Sync/SyncUsageExample.swift +0 -294
- package/Sources/RunicCore/Sync/TeamSyncRecords.swift +0 -775
- package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +0 -333
- package/Sources/RunicCore/Team/TeamModels.swift +0 -583
- package/Sources/RunicCore/Team/TeamShowbackExporter.swift +0 -495
- package/Sources/RunicCore/Team/TeamStore.swift +0 -792
- 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 -427
- package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +0 -494
- package/Sources/RunicCore/UsageLedger/LedgerCache.swift +0 -158
- package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +0 -550
- package/Sources/RunicCore/UsageLedger/UsageLedger.swift +0 -29
- package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +0 -660
- package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +0 -209
- package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +0 -417
- package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +0 -245
- 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 -43
- package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +0 -22
- package/Tests/RunicTests/CLIArgumentParsingTests.swift +0 -70
- package/Tests/RunicTests/CLICostTests.swift +0 -65
- package/Tests/RunicTests/CLIProviderSelectionTests.swift +0 -22
- package/Tests/RunicTests/CLISnapshotTests.swift +0 -72
- package/Tests/RunicTests/CLIWebFallbackTests.swift +0 -58
- package/Tests/RunicTests/ClaudeOAuthTests.swift +0 -164
- package/Tests/RunicTests/ClaudeResilienceTests.swift +0 -30
- package/Tests/RunicTests/ClaudeUsageTests.swift +0 -370
- package/Tests/RunicTests/CodexOAuthTests.swift +0 -122
- package/Tests/RunicTests/CodexUsageLogSourceTests.swift +0 -82
- package/Tests/RunicTests/CopilotTokenResolverTests.swift +0 -75
- package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +0 -75
- package/Tests/RunicTests/CostUsageDecodingTests.swift +0 -394
- package/Tests/RunicTests/CostUsagePricingTests.swift +0 -50
- package/Tests/RunicTests/CostUsageScannerTests.swift +0 -700
- package/Tests/RunicTests/CursorStatusProbeTests.swift +0 -323
- package/Tests/RunicTests/FactoryStatusProbeTests.swift +0 -69
- package/Tests/RunicTests/GeminiAPITestHelpers.swift +0 -94
- package/Tests/RunicTests/GeminiLoginAlertTests.swift +0 -28
- package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +0 -283
- package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +0 -279
- package/Tests/RunicTests/GeminiStatusProbeTests.swift +0 -233
- package/Tests/RunicTests/GeminiTestEnvironment.swift +0 -87
- package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +0 -73
- package/Tests/RunicTests/InstallOriginTests.swift +0 -18
- package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +0 -9
- package/Tests/RunicTests/LiveAccountTests.swift +0 -24
- package/Tests/RunicTests/LoadingPatternTests.swift +0 -35
- package/Tests/RunicTests/MenuCardModelTests.swift +0 -545
- package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +0 -8
- package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +0 -8
- package/Tests/RunicTests/MiniMaxParsingTests.swift +0 -68
- package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +0 -8
- package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +0 -112
- package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +0 -17
- package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +0 -75
- package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +0 -27
- package/Tests/RunicTests/OpenAIDashboardParserTests.swift +0 -134
- package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +0 -53
- package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +0 -92
- package/Tests/RunicTests/PathBuilderTests.swift +0 -237
- package/Tests/RunicTests/ProviderFetchPipelineTests.swift +0 -160
- package/Tests/RunicTests/ProviderIconResourcesTests.swift +0 -38
- package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +0 -16
- package/Tests/RunicTests/ProviderRegistryTests.swift +0 -29
- package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +0 -202
- package/Tests/RunicTests/ProviderToggleStoreTests.swift +0 -51
- package/Tests/RunicTests/RunicTests.swift +0 -120
- package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +0 -36
- package/Tests/RunicTests/SettingsStoreTests.swift +0 -161
- package/Tests/RunicTests/StatusItemAnimationTests.swift +0 -49
- package/Tests/RunicTests/StatusMenuTests.swift +0 -434
- package/Tests/RunicTests/StatusProbeTests.swift +0 -377
- package/Tests/RunicTests/SubprocessRunnerTests.swift +0 -20
- package/Tests/RunicTests/SubscriptionDetectionTests.swift +0 -65
- package/Tests/RunicTests/TTYCommandRunnerTests.swift +0 -148
- package/Tests/RunicTests/TTYIntegrationTests.swift +0 -41
- package/Tests/RunicTests/TeamShowbackExporterTests.swift +0 -159
- package/Tests/RunicTests/TextParsingTests.swift +0 -12
- package/Tests/RunicTests/UsageFormatterTests.swift +0 -112
- package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +0 -172
- package/Tests/RunicTests/UsageLedgerForecastTests.swift +0 -213
- package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +0 -83
- package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +0 -170
- package/Tests/RunicTests/UsagePaceTests.swift +0 -77
- package/Tests/RunicTests/UsagePaceTextTests.swift +0 -109
- package/Tests/RunicTests/UsagePolicyEngineTests.swift +0 -91
- package/Tests/RunicTests/WidgetSnapshotTests.swift +0 -45
- package/Tests/RunicTests/ZaiProviderTests.swift +0 -61
- package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +0 -6
- package/TestsLinux/PlatformGatingTests.swift +0 -46
- package/appcast.xml +0 -144
- 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/version.env +0 -2
package/docs/widgets.md
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "WidgetKit snapshot pipeline + visibility troubleshooting for Runic widgets."
|
|
3
|
-
read_when:
|
|
4
|
-
- Modifying WidgetKit extension behavior or snapshot format
|
|
5
|
-
- Debugging widget update timing
|
|
6
|
-
- Widget gallery shows no Runic widgets
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Widgets
|
|
10
|
-
|
|
11
|
-
## Snapshot pipeline
|
|
12
|
-
- `WidgetSnapshotStore` writes compact JSON snapshots to the app-group container.
|
|
13
|
-
- Widgets read the snapshot and render usage/credits/history states.
|
|
14
|
-
|
|
15
|
-
## Extension
|
|
16
|
-
- `Sources/RunicWidget` contains timeline + views.
|
|
17
|
-
- Keep data shape in sync with `WidgetSnapshot` in the main app.
|
|
18
|
-
|
|
19
|
-
## Visibility troubleshooting (macOS 14+)
|
|
20
|
-
When widgets do not appear in the gallery at all, the issue is almost always
|
|
21
|
-
registration, signing, or daemon caching (not SwiftUI code).
|
|
22
|
-
|
|
23
|
-
### 1) Verify the extension bundle exists where macOS expects it
|
|
24
|
-
```
|
|
25
|
-
APP="/Applications/Runic.app"
|
|
26
|
-
WAPPEX="$APP/Contents/PlugIns/RunicWidget.appex"
|
|
27
|
-
|
|
28
|
-
ls -la "$WAPPEX" "$WAPPEX/Contents" "$WAPPEX/Contents/MacOS"
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
### 2) PlugInKit registration (pkd)
|
|
32
|
-
```
|
|
33
|
-
pluginkit -m -p com.apple.widgetkit-extension -v | grep -i runic || true
|
|
34
|
-
pluginkit -m -p com.apple.widgetkit-extension -i com.sriinnu.athena.runic.widget -vv
|
|
35
|
-
```
|
|
36
|
-
Notes:
|
|
37
|
-
- `+` = elected to use, `-` = ignored (PlugInKit elections).
|
|
38
|
-
- If missing or ignored, force-add and re-elect:
|
|
39
|
-
```
|
|
40
|
-
pluginkit -a "$WAPPEX"
|
|
41
|
-
pluginkit -e use -p com.apple.widgetkit-extension -i com.sriinnu.athena.runic.widget
|
|
42
|
-
```
|
|
43
|
-
- Check for duplicates (old installs or version precedence):
|
|
44
|
-
```
|
|
45
|
-
pluginkit -m -D -p com.apple.widgetkit-extension -i com.sriinnu.athena.runic.widget -vv
|
|
46
|
-
```
|
|
47
|
-
If multiple paths appear, delete older installs and bump `CFBundleVersion`.
|
|
48
|
-
|
|
49
|
-
### 3) Code signing + Gatekeeper assessment
|
|
50
|
-
Widgets are loaded by system daemons. Any signing failure can hide the widget.
|
|
51
|
-
```
|
|
52
|
-
codesign --verify --deep --strict --verbose=4 /Applications/Runic.app
|
|
53
|
-
codesign --verify --strict --verbose=4 "$WAPPEX"
|
|
54
|
-
codesign --verify --strict --verbose=4 "$WAPPEX/Contents/MacOS/RunicWidget"
|
|
55
|
-
spctl --assess --type execute --verbose=4 /Applications/Runic.app
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 4) Restart the right daemons (NotificationCenter alone is not enough)
|
|
59
|
-
```
|
|
60
|
-
killall -9 pkd || true
|
|
61
|
-
sudo killall -9 chronod || true
|
|
62
|
-
killall Dock NotificationCenter || true
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 5) Watch logs while opening the widget gallery
|
|
66
|
-
```
|
|
67
|
-
log stream --style compact --predicate '(process == "pkd" OR process == "chronod" OR subsystem CONTAINS "PlugInKit" OR subsystem CONTAINS "WidgetKit")'
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### 6) Packaging sanity checks
|
|
71
|
-
- Widget bundle id should be `com.sriinnu.athena.runic.widget`.
|
|
72
|
-
- `NSExtensionPointIdentifier` must be `com.apple.widgetkit-extension`.
|
|
73
|
-
- Bundle folder name should match: `RunicWidget.appex`.
|
|
74
|
-
|
|
75
|
-
Optional: re-seed LaunchServices (rarely helps, but low risk):
|
|
76
|
-
```
|
|
77
|
-
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -seed
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Common post-visibility issue: stale data
|
|
81
|
-
If the widget appears but always shows preview data:
|
|
82
|
-
- App writes snapshot to fallback path while widget reads app-group container.
|
|
83
|
-
- Validate that both app and widget resolve the same app-group container.
|
|
84
|
-
|
|
85
|
-
See also: `docs/ui.md`, `docs/packaging.md`.
|
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
# Error Handling Improvements
|
|
2
|
-
|
|
3
|
-
This document describes the comprehensive error handling improvements made to the Runic application.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
We've implemented a structured error messaging system across both Swift (macOS) and TypeScript (React Native) codebases that provides:
|
|
8
|
-
|
|
9
|
-
1. **Structured error messages** with actionable guidance
|
|
10
|
-
2. **Error codes** for support and debugging
|
|
11
|
-
3. **Automatic retry** with exponential backoff
|
|
12
|
-
4. **User-friendly error displays** in the UI
|
|
13
|
-
|
|
14
|
-
## Error Code System
|
|
15
|
-
|
|
16
|
-
### Categories
|
|
17
|
-
|
|
18
|
-
Error codes follow a hierarchical structure: `CATEGORY_NNN`
|
|
19
|
-
|
|
20
|
-
| Category | Range | Description |
|
|
21
|
-
|----------|-------|-------------|
|
|
22
|
-
| NET | 001-099 | Network errors (connection, timeout, DNS) |
|
|
23
|
-
| AUTH | 001-099 | Authentication errors (invalid token, expired, OAuth) |
|
|
24
|
-
| API | 001-099 | API errors (4xx/5xx responses) |
|
|
25
|
-
| RATE | 001-099 | Rate limiting and quota errors |
|
|
26
|
-
| PARSE | 001-099 | Data parsing errors |
|
|
27
|
-
| CLI | 001-099 | CLI tool errors |
|
|
28
|
-
| STORE | 001-099 | Storage errors |
|
|
29
|
-
| SYNC | 001-099 | Sync operation errors |
|
|
30
|
-
| CONFIG | 001-099 | Configuration errors |
|
|
31
|
-
|
|
32
|
-
### Common Error Codes
|
|
33
|
-
|
|
34
|
-
- `NET_001`: Network connection failed
|
|
35
|
-
- `NET_003`: Request timeout
|
|
36
|
-
- `AUTH_001`: Authentication failed
|
|
37
|
-
- `AUTH_003`: API token expired
|
|
38
|
-
- `API_001`: Generic API error
|
|
39
|
-
- `API_003`: Server error (5xx)
|
|
40
|
-
- `RATE_001`: Rate limit exceeded
|
|
41
|
-
- `PARSE_001`: JSON parsing failed
|
|
42
|
-
|
|
43
|
-
## Error Message Structure
|
|
44
|
-
|
|
45
|
-
Every error message includes:
|
|
46
|
-
|
|
47
|
-
```swift
|
|
48
|
-
struct RunicErrorMessage {
|
|
49
|
-
let title: String // "Unable to sync with Claude API"
|
|
50
|
-
let reason: String // "Network connection lost"
|
|
51
|
-
let steps: [String] // ["Check internet", "Verify endpoint", ...]
|
|
52
|
-
let code: RunicErrorCode // NET_001
|
|
53
|
-
let retryable: Bool // true
|
|
54
|
-
let providerName: String? // "Claude"
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Usage Examples
|
|
59
|
-
|
|
60
|
-
### Swift (macOS)
|
|
61
|
-
|
|
62
|
-
#### Creating Error Messages
|
|
63
|
-
|
|
64
|
-
```swift
|
|
65
|
-
// Network error
|
|
66
|
-
let error = ErrorMessageBuilder.networkError(
|
|
67
|
-
provider: "Claude",
|
|
68
|
-
reason: "Connection timeout after 30 seconds"
|
|
69
|
-
)
|
|
70
|
-
|
|
71
|
-
// Authentication error
|
|
72
|
-
let error = ErrorMessageBuilder.authenticationError(
|
|
73
|
-
provider: "Codex",
|
|
74
|
-
reason: "API token has expired",
|
|
75
|
-
expired: true
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
// Rate limit error
|
|
79
|
-
let error = ErrorMessageBuilder.rateLimitError(
|
|
80
|
-
provider: "OpenAI",
|
|
81
|
-
retryAfter: Date().addingTimeInterval(3600)
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
// API error with status code
|
|
85
|
-
let error = ErrorMessageBuilder.apiError(
|
|
86
|
-
provider: "MiniMax",
|
|
87
|
-
statusCode: 503,
|
|
88
|
-
details: "Service temporarily unavailable"
|
|
89
|
-
)
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
#### Using Error Messages in Enums
|
|
93
|
-
|
|
94
|
-
```swift
|
|
95
|
-
public enum ClaudeUsageError: LocalizedError {
|
|
96
|
-
case networkError(RunicErrorMessage)
|
|
97
|
-
case parseFailed(RunicErrorMessage)
|
|
98
|
-
|
|
99
|
-
public var errorDescription: String? {
|
|
100
|
-
switch self {
|
|
101
|
-
case .networkError(let msg), .parseFailed(let msg):
|
|
102
|
-
return msg.compactDescription
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
public var errorMessage: RunicErrorMessage {
|
|
107
|
-
switch self {
|
|
108
|
-
case .networkError(let msg), .parseFailed(let msg):
|
|
109
|
-
return msg
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
#### Retry with Exponential Backoff
|
|
116
|
-
|
|
117
|
-
```swift
|
|
118
|
-
import RunicCore
|
|
119
|
-
|
|
120
|
-
// Use default retry strategy (3 attempts, 1s-8s)
|
|
121
|
-
let data = try await RetryStrategy.default.execute(
|
|
122
|
-
operation: {
|
|
123
|
-
try await fetchProviderData()
|
|
124
|
-
},
|
|
125
|
-
onRetry: { attempt, delay in
|
|
126
|
-
print("Retry attempt \(attempt) after \(delay)s")
|
|
127
|
-
}
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
// Use aggressive retry strategy (5 attempts, 2s-16s)
|
|
131
|
-
let data = try await RetryStrategy.aggressive.execute {
|
|
132
|
-
try await fetchProviderData()
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// Custom retry strategy
|
|
136
|
-
let strategy = RetryStrategy(
|
|
137
|
-
maxAttempts: 4,
|
|
138
|
-
baseDelay: 2.0,
|
|
139
|
-
maxDelay: 10.0,
|
|
140
|
-
useJitter: true
|
|
141
|
-
)
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
#### Displaying Errors in UI
|
|
145
|
-
|
|
146
|
-
```swift
|
|
147
|
-
import SwiftUI
|
|
148
|
-
|
|
149
|
-
// Full error display with retry
|
|
150
|
-
ErrorDisplayView(
|
|
151
|
-
error: errorMessage,
|
|
152
|
-
onRetry: {
|
|
153
|
-
Task { await refreshData() }
|
|
154
|
-
},
|
|
155
|
-
onDismiss: {
|
|
156
|
-
clearError()
|
|
157
|
-
}
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
// Compact error display
|
|
161
|
-
CompactErrorView(
|
|
162
|
-
error: errorMessage,
|
|
163
|
-
onRetry: {
|
|
164
|
-
Task { await refreshData() }
|
|
165
|
-
}
|
|
166
|
-
)
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### TypeScript (React Native)
|
|
170
|
-
|
|
171
|
-
#### Creating Error Messages
|
|
172
|
-
|
|
173
|
-
```typescript
|
|
174
|
-
import { ErrorMessageBuilder } from '@/utils';
|
|
175
|
-
|
|
176
|
-
// Network error
|
|
177
|
-
const error = ErrorMessageBuilder.networkError({
|
|
178
|
-
provider: 'Claude',
|
|
179
|
-
reason: 'Connection timeout',
|
|
180
|
-
timeout: true,
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
// Authentication error
|
|
184
|
-
const error = ErrorMessageBuilder.authenticationError({
|
|
185
|
-
provider: 'Codex',
|
|
186
|
-
reason: 'Invalid API token',
|
|
187
|
-
expired: false,
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
// Rate limit error
|
|
191
|
-
const error = ErrorMessageBuilder.rateLimitError({
|
|
192
|
-
provider: 'OpenAI',
|
|
193
|
-
retryAfter: new Date(Date.now() + 3600000),
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
// API error
|
|
197
|
-
const error = ErrorMessageBuilder.apiError({
|
|
198
|
-
provider: 'MiniMax',
|
|
199
|
-
statusCode: 503,
|
|
200
|
-
details: 'Service unavailable',
|
|
201
|
-
});
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
#### Using Retry with Async Operations
|
|
205
|
-
|
|
206
|
-
```typescript
|
|
207
|
-
import { retryWithBackoff, RetryStrategy } from '@/utils';
|
|
208
|
-
|
|
209
|
-
// Basic retry with default strategy
|
|
210
|
-
const data = await retryWithBackoff(
|
|
211
|
-
async () => await fetchProviderData(provider),
|
|
212
|
-
{
|
|
213
|
-
onRetry: (attempt, delay) => {
|
|
214
|
-
console.log(`Retry ${attempt} after ${delay}ms`);
|
|
215
|
-
},
|
|
216
|
-
}
|
|
217
|
-
);
|
|
218
|
-
|
|
219
|
-
// Aggressive retry strategy
|
|
220
|
-
const data = await retryWithBackoff(
|
|
221
|
-
async () => await fetchProviderData(provider),
|
|
222
|
-
RetryStrategy.aggressive()
|
|
223
|
-
);
|
|
224
|
-
|
|
225
|
-
// Custom retry logic
|
|
226
|
-
const data = await retryWithBackoff(
|
|
227
|
-
async () => await fetchProviderData(provider),
|
|
228
|
-
{
|
|
229
|
-
maxAttempts: 5,
|
|
230
|
-
baseDelay: 2000,
|
|
231
|
-
maxDelay: 16000,
|
|
232
|
-
shouldRetry: (error) => {
|
|
233
|
-
// Custom retry logic
|
|
234
|
-
return error instanceof ApiError && error.isRetryable;
|
|
235
|
-
},
|
|
236
|
-
}
|
|
237
|
-
);
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
#### Displaying Errors in React Native
|
|
241
|
-
|
|
242
|
-
```tsx
|
|
243
|
-
import { ErrorDisplay, CompactErrorDisplay } from '@/components';
|
|
244
|
-
|
|
245
|
-
// Full error display
|
|
246
|
-
<ErrorDisplay
|
|
247
|
-
error={errorMessage}
|
|
248
|
-
onRetry={handleRetry}
|
|
249
|
-
onDismiss={handleDismiss}
|
|
250
|
-
defaultExpanded={false}
|
|
251
|
-
/>
|
|
252
|
-
|
|
253
|
-
// Compact inline error
|
|
254
|
-
<CompactErrorDisplay
|
|
255
|
-
error={errorMessage}
|
|
256
|
-
onRetry={handleRetry}
|
|
257
|
-
/>
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
## Before and After Examples
|
|
261
|
-
|
|
262
|
-
### Example 1: Network Error
|
|
263
|
-
|
|
264
|
-
**Before:**
|
|
265
|
-
```swift
|
|
266
|
-
throw URLError(.timedOut)
|
|
267
|
-
// UI shows: "The request timed out."
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**After:**
|
|
271
|
-
```swift
|
|
272
|
-
throw ClaudeUsageError.networkError(
|
|
273
|
-
ErrorMessageBuilder.networkError(
|
|
274
|
-
provider: "Claude",
|
|
275
|
-
reason: "Request timed out after 30 seconds",
|
|
276
|
-
timeout: true
|
|
277
|
-
)
|
|
278
|
-
)
|
|
279
|
-
|
|
280
|
-
// UI shows:
|
|
281
|
-
// Title: "Unable to sync with Claude API"
|
|
282
|
-
// Reason: "Request timed out after 30 seconds"
|
|
283
|
-
// Next Steps:
|
|
284
|
-
// 1. Check your internet connection
|
|
285
|
-
// 2. Verify the API endpoint is accessible
|
|
286
|
-
// 3. Try again in a few moments
|
|
287
|
-
// 4. Check if your firewall is blocking the connection
|
|
288
|
-
// Error Code: NET_003
|
|
289
|
-
// [Retry Button]
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
### Example 2: Authentication Error
|
|
293
|
-
|
|
294
|
-
**Before:**
|
|
295
|
-
```typescript
|
|
296
|
-
throw new Error('Invalid API token or unauthorized');
|
|
297
|
-
// UI shows: "Invalid API token or unauthorized"
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
**After:**
|
|
301
|
-
```typescript
|
|
302
|
-
throw new ApiError(
|
|
303
|
-
'Authentication failed',
|
|
304
|
-
401,
|
|
305
|
-
'openai',
|
|
306
|
-
ErrorMessageBuilder.authenticationError({
|
|
307
|
-
provider: 'OpenAI',
|
|
308
|
-
reason: 'API token has expired',
|
|
309
|
-
expired: true,
|
|
310
|
-
})
|
|
311
|
-
);
|
|
312
|
-
|
|
313
|
-
// UI shows:
|
|
314
|
-
// Title: "Authentication failed for OpenAI"
|
|
315
|
-
// Reason: "API token has expired"
|
|
316
|
-
// Next Steps:
|
|
317
|
-
// 1. Refresh your authentication token
|
|
318
|
-
// 2. Verify your API credentials are correct
|
|
319
|
-
// 3. Check if your API key is active
|
|
320
|
-
// 4. Contact OpenAI support if the issue persists
|
|
321
|
-
// Error Code: AUTH_003
|
|
322
|
-
```
|
|
323
|
-
|
|
324
|
-
### Example 3: Rate Limit Error
|
|
325
|
-
|
|
326
|
-
**Before:**
|
|
327
|
-
```swift
|
|
328
|
-
// UI shows: "Rate limit exceeded"
|
|
329
|
-
```
|
|
330
|
-
|
|
331
|
-
**After:**
|
|
332
|
-
```swift
|
|
333
|
-
throw UsageError.rateLimitError(
|
|
334
|
-
ErrorMessageBuilder.rateLimitError(
|
|
335
|
-
provider: "Anthropic",
|
|
336
|
-
retryAfter: Date().addingTimeInterval(1800)
|
|
337
|
-
)
|
|
338
|
-
)
|
|
339
|
-
|
|
340
|
-
// UI shows:
|
|
341
|
-
// Title: "Rate limit exceeded"
|
|
342
|
-
// Reason: "Anthropic API rate limit exceeded"
|
|
343
|
-
// Next Steps:
|
|
344
|
-
// 1. Rate limit resets at 3:30 PM
|
|
345
|
-
// 2. Reduce your request frequency
|
|
346
|
-
// 3. Check your Anthropic plan limits
|
|
347
|
-
// 4. Consider upgrading your plan for higher limits
|
|
348
|
-
// Error Code: RATE_001
|
|
349
|
-
// [Retry Button]
|
|
350
|
-
```
|
|
351
|
-
|
|
352
|
-
## Integration Checklist
|
|
353
|
-
|
|
354
|
-
### For New Provider Implementations
|
|
355
|
-
|
|
356
|
-
- [ ] Define provider-specific error enum with `RunicErrorMessage`
|
|
357
|
-
- [ ] Use `ErrorMessageBuilder` for all error cases
|
|
358
|
-
- [ ] Implement retry logic for transient errors
|
|
359
|
-
- [ ] Add error display in provider UI
|
|
360
|
-
- [ ] Test all error scenarios
|
|
361
|
-
|
|
362
|
-
### For Existing Code Updates
|
|
363
|
-
|
|
364
|
-
- [ ] Replace generic errors with structured error messages
|
|
365
|
-
- [ ] Add error codes to all error paths
|
|
366
|
-
- [ ] Implement retry for network/API calls
|
|
367
|
-
- [ ] Update UI to show detailed error information
|
|
368
|
-
- [ ] Add unit tests for error handling
|
|
369
|
-
|
|
370
|
-
## Files Modified/Created
|
|
371
|
-
|
|
372
|
-
### Swift (macOS)
|
|
373
|
-
|
|
374
|
-
**Created:**
|
|
375
|
-
- `Sources/RunicCore/Errors/RunicErrorCode.swift` - Error code definitions
|
|
376
|
-
- `Sources/RunicCore/Errors/RunicErrorMessage.swift` - Error message structures
|
|
377
|
-
- `Sources/RunicCore/Utilities/RetryStrategy.swift` - Retry with exponential backoff
|
|
378
|
-
- `Sources/Runic/Views/Menu/ErrorDisplayView.swift` - Error UI components
|
|
379
|
-
|
|
380
|
-
**Modified:**
|
|
381
|
-
- `Sources/RunicCore/UsageFetcher.swift` - Updated error handling
|
|
382
|
-
- `Sources/RunicCore/Providers/Claude/ClaudeUsageFetcher.swift` - Improved errors
|
|
383
|
-
- `Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift` - Improved errors
|
|
384
|
-
- `Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift` - Improved errors
|
|
385
|
-
|
|
386
|
-
### TypeScript (React Native)
|
|
387
|
-
|
|
388
|
-
**Created:**
|
|
389
|
-
- `runic-cross-platform/src/utils/ErrorCodes.ts` - Error code enum
|
|
390
|
-
- `runic-cross-platform/src/utils/ErrorMessages.ts` - Error message builders
|
|
391
|
-
- `runic-cross-platform/src/utils/retry.ts` - Retry utilities
|
|
392
|
-
- `runic-cross-platform/src/components/ErrorDisplay.tsx` - Error UI components
|
|
393
|
-
|
|
394
|
-
**Modified:**
|
|
395
|
-
- `runic-cross-platform/src/services/ApiClient.ts` - Enhanced error handling
|
|
396
|
-
- `runic-cross-platform/src/services/SyncService.ts` - Added retry logic
|
|
397
|
-
- `runic-cross-platform/src/utils/index.ts` - Export new utilities
|
|
398
|
-
- `runic-cross-platform/src/components/index.ts` - Export new components
|
|
399
|
-
|
|
400
|
-
## Summary Statistics
|
|
401
|
-
|
|
402
|
-
### Error Messages Improved
|
|
403
|
-
|
|
404
|
-
- **Total error types updated**: 15+
|
|
405
|
-
- **Providers with improved errors**: 5 (Claude, Codex, MiniMax, Groq, Copilot)
|
|
406
|
-
- **Error codes defined**: 30+
|
|
407
|
-
- **New UI components**: 4 (2 Swift, 2 TypeScript)
|
|
408
|
-
|
|
409
|
-
### Before vs After
|
|
410
|
-
|
|
411
|
-
| Aspect | Before | After |
|
|
412
|
-
|--------|--------|-------|
|
|
413
|
-
| Error specificity | Generic "failed" messages | Specific reason with context |
|
|
414
|
-
| Actionability | No guidance | 3-5 specific steps |
|
|
415
|
-
| Debugging | No error codes | Unique error codes |
|
|
416
|
-
| Retry capability | Manual only | Automatic with backoff |
|
|
417
|
-
| User experience | Confusing | Clear and helpful |
|
|
418
|
-
|
|
419
|
-
## Testing Recommendations
|
|
420
|
-
|
|
421
|
-
1. **Network errors**: Disconnect internet and test sync
|
|
422
|
-
2. **Authentication errors**: Use invalid API tokens
|
|
423
|
-
3. **Rate limits**: Trigger rate limits and verify retry logic
|
|
424
|
-
4. **Parsing errors**: Send malformed API responses
|
|
425
|
-
5. **Retry logic**: Verify exponential backoff timing
|
|
426
|
-
6. **UI display**: Check error display on different screen sizes
|
|
427
|
-
|
|
428
|
-
## Future Improvements
|
|
429
|
-
|
|
430
|
-
- [ ] Add telemetry for error tracking
|
|
431
|
-
- [ ] Implement error recovery suggestions based on error patterns
|
|
432
|
-
- [ ] Add localization support for error messages
|
|
433
|
-
- [ ] Create error analytics dashboard
|
|
434
|
-
- [ ] Add automated error reporting to support
|