@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,375 +0,0 @@
|
|
|
1
|
-
import SwiftUI
|
|
2
|
-
|
|
3
|
-
/// Visual test cases for the improved UsageProgressBar
|
|
4
|
-
/// Copy this into a SwiftUI preview or test view to see all variants
|
|
5
|
-
|
|
6
|
-
struct ProgressBarShowcase: View {
|
|
7
|
-
var body: some View {
|
|
8
|
-
VStack(alignment: .leading, spacing: 32) {
|
|
9
|
-
Text("UsageProgressBar Improvements")
|
|
10
|
-
.font(.title.bold())
|
|
11
|
-
|
|
12
|
-
// MARK: - Height Variants
|
|
13
|
-
VStack(alignment: .leading, spacing: 16) {
|
|
14
|
-
Text("Height Variants")
|
|
15
|
-
.font(.headline)
|
|
16
|
-
|
|
17
|
-
VStack(alignment: .leading, spacing: 8) {
|
|
18
|
-
Text("Compact (6pt) - Team member rows")
|
|
19
|
-
.font(.caption)
|
|
20
|
-
.foregroundStyle(.secondary)
|
|
21
|
-
UsageProgressBar(
|
|
22
|
-
percent: 75,
|
|
23
|
-
tint: .blue,
|
|
24
|
-
accessibilityLabel: "Compact example",
|
|
25
|
-
height: .compact)
|
|
26
|
-
|
|
27
|
-
Text("Regular (8pt) - Default menu cards")
|
|
28
|
-
.font(.caption)
|
|
29
|
-
.foregroundStyle(.secondary)
|
|
30
|
-
UsageProgressBar(
|
|
31
|
-
percent: 60,
|
|
32
|
-
tint: .green,
|
|
33
|
-
accessibilityLabel: "Regular example",
|
|
34
|
-
height: .regular)
|
|
35
|
-
|
|
36
|
-
Text("Large (10pt) - Dashboard hero sections")
|
|
37
|
-
.font(.caption)
|
|
38
|
-
.foregroundStyle(.secondary)
|
|
39
|
-
UsageProgressBar(
|
|
40
|
-
percent: 85,
|
|
41
|
-
tint: .orange,
|
|
42
|
-
accessibilityLabel: "Large example",
|
|
43
|
-
height: .large)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
Divider()
|
|
48
|
-
|
|
49
|
-
// MARK: - Percentage Variants
|
|
50
|
-
VStack(alignment: .leading, spacing: 16) {
|
|
51
|
-
Text("Different Percentages (Regular)")
|
|
52
|
-
.font(.headline)
|
|
53
|
-
|
|
54
|
-
VStack(alignment: .leading, spacing: 8) {
|
|
55
|
-
HStack {
|
|
56
|
-
Text("10%")
|
|
57
|
-
.font(.caption.monospacedDigit())
|
|
58
|
-
.frame(width: 50, alignment: .trailing)
|
|
59
|
-
UsageProgressBar(
|
|
60
|
-
percent: 10,
|
|
61
|
-
tint: .green,
|
|
62
|
-
accessibilityLabel: "10 percent")
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
HStack {
|
|
66
|
-
Text("25%")
|
|
67
|
-
.font(.caption.monospacedDigit())
|
|
68
|
-
.frame(width: 50, alignment: .trailing)
|
|
69
|
-
UsageProgressBar(
|
|
70
|
-
percent: 25,
|
|
71
|
-
tint: .green,
|
|
72
|
-
accessibilityLabel: "25 percent")
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
HStack {
|
|
76
|
-
Text("50%")
|
|
77
|
-
.font(.caption.monospacedDigit())
|
|
78
|
-
.frame(width: 50, alignment: .trailing)
|
|
79
|
-
UsageProgressBar(
|
|
80
|
-
percent: 50,
|
|
81
|
-
tint: .blue,
|
|
82
|
-
accessibilityLabel: "50 percent")
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
HStack {
|
|
86
|
-
Text("75%")
|
|
87
|
-
.font(.caption.monospacedDigit())
|
|
88
|
-
.frame(width: 50, alignment: .trailing)
|
|
89
|
-
UsageProgressBar(
|
|
90
|
-
percent: 75,
|
|
91
|
-
tint: .orange,
|
|
92
|
-
accessibilityLabel: "75 percent")
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
HStack {
|
|
96
|
-
Text("90%")
|
|
97
|
-
.font(.caption.monospacedDigit())
|
|
98
|
-
.frame(width: 50, alignment: .trailing)
|
|
99
|
-
UsageProgressBar(
|
|
100
|
-
percent: 90,
|
|
101
|
-
tint: .red,
|
|
102
|
-
accessibilityLabel: "90 percent")
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
HStack {
|
|
106
|
-
Text("100%")
|
|
107
|
-
.font(.caption.monospacedDigit())
|
|
108
|
-
.frame(width: 50, alignment: .trailing)
|
|
109
|
-
UsageProgressBar(
|
|
110
|
-
percent: 100,
|
|
111
|
-
tint: .red,
|
|
112
|
-
accessibilityLabel: "100 percent")
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
Divider()
|
|
118
|
-
|
|
119
|
-
// MARK: - Color Variants
|
|
120
|
-
VStack(alignment: .leading, spacing: 16) {
|
|
121
|
-
Text("Color Variants")
|
|
122
|
-
.font(.headline)
|
|
123
|
-
|
|
124
|
-
VStack(alignment: .leading, spacing: 8) {
|
|
125
|
-
HStack {
|
|
126
|
-
Text("Blue")
|
|
127
|
-
.font(.caption)
|
|
128
|
-
.frame(width: 80, alignment: .leading)
|
|
129
|
-
UsageProgressBar(
|
|
130
|
-
percent: 65,
|
|
131
|
-
tint: .blue,
|
|
132
|
-
accessibilityLabel: "Blue")
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
HStack {
|
|
136
|
-
Text("Green")
|
|
137
|
-
.font(.caption)
|
|
138
|
-
.frame(width: 80, alignment: .leading)
|
|
139
|
-
UsageProgressBar(
|
|
140
|
-
percent: 45,
|
|
141
|
-
tint: .green,
|
|
142
|
-
accessibilityLabel: "Green")
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
HStack {
|
|
146
|
-
Text("Orange")
|
|
147
|
-
.font(.caption)
|
|
148
|
-
.frame(width: 80, alignment: .leading)
|
|
149
|
-
UsageProgressBar(
|
|
150
|
-
percent: 75,
|
|
151
|
-
tint: .orange,
|
|
152
|
-
accessibilityLabel: "Orange")
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
HStack {
|
|
156
|
-
Text("Red")
|
|
157
|
-
.font(.caption)
|
|
158
|
-
.frame(width: 80, alignment: .leading)
|
|
159
|
-
UsageProgressBar(
|
|
160
|
-
percent: 90,
|
|
161
|
-
tint: .red,
|
|
162
|
-
accessibilityLabel: "Red")
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
HStack {
|
|
166
|
-
Text("Purple")
|
|
167
|
-
.font(.caption)
|
|
168
|
-
.frame(width: 80, alignment: .leading)
|
|
169
|
-
UsageProgressBar(
|
|
170
|
-
percent: 55,
|
|
171
|
-
tint: .purple,
|
|
172
|
-
accessibilityLabel: "Purple")
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
HStack {
|
|
176
|
-
Text("Custom")
|
|
177
|
-
.font(.caption)
|
|
178
|
-
.frame(width: 80, alignment: .leading)
|
|
179
|
-
UsageProgressBar(
|
|
180
|
-
percent: 70,
|
|
181
|
-
tint: Color(red: 0.3, green: 0.7, blue: 0.9),
|
|
182
|
-
accessibilityLabel: "Custom color")
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
Divider()
|
|
188
|
-
|
|
189
|
-
// MARK: - Animation Demo
|
|
190
|
-
VStack(alignment: .leading, spacing: 16) {
|
|
191
|
-
Text("Animation Test")
|
|
192
|
-
.font(.headline)
|
|
193
|
-
|
|
194
|
-
AnimatedProgressDemo()
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
Divider()
|
|
198
|
-
|
|
199
|
-
// MARK: - Real-World Examples
|
|
200
|
-
VStack(alignment: .leading, spacing: 16) {
|
|
201
|
-
Text("Real-World Examples")
|
|
202
|
-
.font(.headline)
|
|
203
|
-
|
|
204
|
-
// API Usage Card
|
|
205
|
-
VStack(alignment: .leading, spacing: 8) {
|
|
206
|
-
HStack {
|
|
207
|
-
Text("API Usage")
|
|
208
|
-
.font(.body.weight(.medium))
|
|
209
|
-
Spacer()
|
|
210
|
-
Text("1,234 / 2,000")
|
|
211
|
-
.font(.caption)
|
|
212
|
-
.foregroundStyle(.secondary)
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
UsageProgressBar(
|
|
216
|
-
percent: 61.7,
|
|
217
|
-
tint: .blue,
|
|
218
|
-
accessibilityLabel: "API usage")
|
|
219
|
-
|
|
220
|
-
HStack {
|
|
221
|
-
Text("61.7% used")
|
|
222
|
-
.font(.caption)
|
|
223
|
-
Spacer()
|
|
224
|
-
Text("Resets in 12 days")
|
|
225
|
-
.font(.caption)
|
|
226
|
-
.foregroundStyle(.secondary)
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
.padding()
|
|
230
|
-
.background(
|
|
231
|
-
RoundedRectangle(cornerRadius: 8, style: .continuous)
|
|
232
|
-
.fill(Color(nsColor: .controlBackgroundColor)))
|
|
233
|
-
|
|
234
|
-
// Budget Tracking
|
|
235
|
-
VStack(alignment: .leading, spacing: 8) {
|
|
236
|
-
HStack {
|
|
237
|
-
Text("Project Budget")
|
|
238
|
-
.font(.body.weight(.medium))
|
|
239
|
-
Spacer()
|
|
240
|
-
Text("$45 / $50")
|
|
241
|
-
.font(.caption)
|
|
242
|
-
.foregroundStyle(.secondary)
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
UsageProgressBar(
|
|
246
|
-
percent: 90,
|
|
247
|
-
tint: .orange,
|
|
248
|
-
accessibilityLabel: "Budget usage")
|
|
249
|
-
|
|
250
|
-
HStack {
|
|
251
|
-
Text("90% spent")
|
|
252
|
-
.font(.caption)
|
|
253
|
-
.foregroundStyle(.orange)
|
|
254
|
-
Spacer()
|
|
255
|
-
Text("Near limit")
|
|
256
|
-
.font(.caption)
|
|
257
|
-
.foregroundStyle(.orange)
|
|
258
|
-
.fontWeight(.medium)
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
.padding()
|
|
262
|
-
.background(
|
|
263
|
-
RoundedRectangle(cornerRadius: 8, style: .continuous)
|
|
264
|
-
.fill(Color(nsColor: .controlBackgroundColor)))
|
|
265
|
-
|
|
266
|
-
// Team Member Quota
|
|
267
|
-
HStack(spacing: 12) {
|
|
268
|
-
Circle()
|
|
269
|
-
.fill(.blue)
|
|
270
|
-
.frame(width: 36, height: 36)
|
|
271
|
-
.overlay {
|
|
272
|
-
Text("JD")
|
|
273
|
-
.font(.footnote.weight(.semibold))
|
|
274
|
-
.foregroundStyle(.white)
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
VStack(alignment: .leading, spacing: 4) {
|
|
278
|
-
Text("John Doe")
|
|
279
|
-
.font(.body.weight(.medium))
|
|
280
|
-
|
|
281
|
-
HStack(spacing: 4) {
|
|
282
|
-
Text("8,500 / 10,000")
|
|
283
|
-
.font(.caption2)
|
|
284
|
-
.foregroundStyle(.secondary)
|
|
285
|
-
|
|
286
|
-
UsageProgressBar(
|
|
287
|
-
percent: 85,
|
|
288
|
-
tint: .red,
|
|
289
|
-
accessibilityLabel: "John Doe quota",
|
|
290
|
-
height: .compact)
|
|
291
|
-
.frame(maxWidth: 100)
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
.padding()
|
|
296
|
-
.background(
|
|
297
|
-
RoundedRectangle(cornerRadius: 8, style: .continuous)
|
|
298
|
-
.fill(Color(nsColor: .controlBackgroundColor)))
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
.padding(32)
|
|
302
|
-
.frame(width: 500)
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/// Demonstrates the smooth spring animation
|
|
307
|
-
private struct AnimatedProgressDemo: View {
|
|
308
|
-
@State private var percent: Double = 0
|
|
309
|
-
|
|
310
|
-
var body: some View {
|
|
311
|
-
VStack(alignment: .leading, spacing: 8) {
|
|
312
|
-
Text("Spring animation (tap to randomize)")
|
|
313
|
-
.font(.caption)
|
|
314
|
-
.foregroundStyle(.secondary)
|
|
315
|
-
|
|
316
|
-
UsageProgressBar(
|
|
317
|
-
percent: self.percent,
|
|
318
|
-
tint: .purple,
|
|
319
|
-
accessibilityLabel: "Animation demo")
|
|
320
|
-
.onTapGesture {
|
|
321
|
-
self.percent = Double.random(in: 10...100)
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
HStack {
|
|
325
|
-
Button("0%") { self.percent = 0 }
|
|
326
|
-
.buttonStyle(.bordered)
|
|
327
|
-
.controlSize(.mini)
|
|
328
|
-
Button("25%") { self.percent = 25 }
|
|
329
|
-
.buttonStyle(.bordered)
|
|
330
|
-
.controlSize(.mini)
|
|
331
|
-
Button("50%") { self.percent = 50 }
|
|
332
|
-
.buttonStyle(.bordered)
|
|
333
|
-
.controlSize(.mini)
|
|
334
|
-
Button("75%") { self.percent = 75 }
|
|
335
|
-
.buttonStyle(.bordered)
|
|
336
|
-
.controlSize(.mini)
|
|
337
|
-
Button("100%") { self.percent = 100 }
|
|
338
|
-
.buttonStyle(.bordered)
|
|
339
|
-
.controlSize(.mini)
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
// MARK: - Preview
|
|
346
|
-
|
|
347
|
-
#Preview {
|
|
348
|
-
ProgressBarShowcase()
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// MARK: - Usage Instructions
|
|
352
|
-
|
|
353
|
-
/*
|
|
354
|
-
To test the improved progress bar:
|
|
355
|
-
|
|
356
|
-
1. Create a new SwiftUI view in Xcode
|
|
357
|
-
2. Copy this entire file content
|
|
358
|
-
3. Use the #Preview to see all variants
|
|
359
|
-
4. Test the animation by clicking buttons
|
|
360
|
-
5. Verify VoiceOver reads percentages correctly
|
|
361
|
-
|
|
362
|
-
Key improvements to observe:
|
|
363
|
-
- Glossy top highlight (white gradient)
|
|
364
|
-
- Subtle glow/shadow around filled portion
|
|
365
|
-
- 3-color gradient for depth
|
|
366
|
-
- Smooth spring animation (natural bounce)
|
|
367
|
-
- Track border for definition
|
|
368
|
-
- Three distinct size options
|
|
369
|
-
|
|
370
|
-
Compare with the old version:
|
|
371
|
-
- Smoother, more refined appearance
|
|
372
|
-
- Better visual hierarchy
|
|
373
|
-
- More professional and modern
|
|
374
|
-
- Maintains accessibility
|
|
375
|
-
*/
|
package/docs/provider.md
DELETED
|
@@ -1,202 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "Provider authoring guide: shared host APIs, provider boundaries, and how to add a new provider."
|
|
3
|
-
read_when:
|
|
4
|
-
- Adding a new provider (usage + status + identity)
|
|
5
|
-
- Refactoring provider architecture or shared host APIs
|
|
6
|
-
- Reviewing provider boundaries (no identity leakage)
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Provider authoring guide
|
|
10
|
-
|
|
11
|
-
Goal: adding a provider should feel like:
|
|
12
|
-
- add one folder
|
|
13
|
-
- define one descriptor + strategies
|
|
14
|
-
- add one implementation (UI hooks only)
|
|
15
|
-
- done (tests + docs)
|
|
16
|
-
|
|
17
|
-
This doc describes the **current provider architecture** (post-macro registry) and the exact steps to add a new provider.
|
|
18
|
-
|
|
19
|
-
## Terms
|
|
20
|
-
- **Provider**: a source of usage/quota/status data (Codex, Claude, Gemini, Antigravity, Cursor, …).
|
|
21
|
-
- **Descriptor**: the single source of truth for labels, URLs, defaults, and fetch strategies.
|
|
22
|
-
- **Fetch strategy**: one concrete way to obtain usage (CLI, web cookies, OAuth API, local probe, etc.).
|
|
23
|
-
- **Host APIs**: shared capabilities we provide to providers (Keychain, browser cookies, PTY, HTTP, WebView scrape, token-cost).
|
|
24
|
-
- **Identity fields**: email/org/plan/loginMethod. Must stay **siloed per provider**.
|
|
25
|
-
|
|
26
|
-
## Architecture overview (now)
|
|
27
|
-
- `Sources/RunicCore`: provider descriptors + fetch strategies + probes + parsing + shared utilities.
|
|
28
|
-
- `Sources/Runic`: UI/state + provider implementations (settings/login/menu hooks only).
|
|
29
|
-
- Provider IDs are compile-time: `UsageProvider` enum (used for persistence + widgets).
|
|
30
|
-
- Provider wiring is descriptor-driven:
|
|
31
|
-
- `ProviderDescriptor` owns labels, URLs, default enablement, and fetch pipeline.
|
|
32
|
-
- `ProviderFetchStrategy` objects implement concrete fetch paths.
|
|
33
|
-
- CLI + app both call the same descriptor/fetch pipeline.
|
|
34
|
-
|
|
35
|
-
Common building blocks already exist:
|
|
36
|
-
- PTY: `TTYCommandRunner`
|
|
37
|
-
- subprocess: `SubprocessRunner`
|
|
38
|
-
- cookie import: `BrowserCookieImporter` (Safari/Chrome/Firefox adapters)
|
|
39
|
-
- OpenAI dashboard web scrape: `OpenAIDashboardFetcher` (WKWebView + JS)
|
|
40
|
-
- cost usage: local log scanner (Codex + Claude)
|
|
41
|
-
|
|
42
|
-
The old “switch provider” wiring is gone. Everything should be driven by the descriptor and its strategies.
|
|
43
|
-
|
|
44
|
-
## Provider descriptor (source of truth)
|
|
45
|
-
|
|
46
|
-
Introduce a single descriptor per provider:
|
|
47
|
-
- `id` (stable `UsageProvider`)
|
|
48
|
-
- display/labels/URLs (menu title, dashboard URL, status URL)
|
|
49
|
-
- UI branding (icon name, primary color)
|
|
50
|
-
- capabilities (supportsCredits, supportsTokenCost, supportsStatusPolling, supportsLogin)
|
|
51
|
-
- fetch plan (allowed `--source` modes + ordered strategy pipeline)
|
|
52
|
-
- CLI metadata (cliName, aliases, version provider)
|
|
53
|
-
- account behavior (e.g., `usesAccountFallback` for Codex auth.json)
|
|
54
|
-
|
|
55
|
-
UI and settings should become descriptor-driven:
|
|
56
|
-
- no provider-specific branching for labels/links/toggle titles
|
|
57
|
-
- minimal provider-specific UI (only when a provider truly needs bespoke UX)
|
|
58
|
-
|
|
59
|
-
## Fetch strategies
|
|
60
|
-
|
|
61
|
-
A provider declares a pipeline of strategies, in priority order. Each strategy:
|
|
62
|
-
- advertises a `kind` (cli, web cookies, oauth, api token, local probe, web dashboard)
|
|
63
|
-
- declares availability (checks settings, cookies, env vars, installed CLI)
|
|
64
|
-
- fetches `UsageSnapshot` (and optional credits/dashboard)
|
|
65
|
-
- can be filtered by CLI `--source` or app settings
|
|
66
|
-
|
|
67
|
-
The pipeline resolves to the best available strategy, and falls back on failure when allowed.
|
|
68
|
-
Each run returns a `ProviderFetchOutcome` with **attempts + errors** for debug UI and CLI `--verbose`.
|
|
69
|
-
|
|
70
|
-
## Host APIs are explicit, small, testable
|
|
71
|
-
Expose a narrow set of protocols/structs that provider implementations can use:
|
|
72
|
-
- `KeychainAPI`: read-only, allowlisted service/account pairs
|
|
73
|
-
- `BrowserCookieAPI`: import cookies by domain list; returns cookie header + diagnostics
|
|
74
|
-
- `PTYAPI`: run CLI interactions with timeouts + “send on substring” + stop rules
|
|
75
|
-
- `HTTPAPI`: URLSession wrapper with domain allowlist + standard headers + tracing
|
|
76
|
-
- `WebViewScrapeAPI`: WKWebView lease + `evaluateJavaScript` + snapshot dumping
|
|
77
|
-
- `TokenCostAPI`: Cost Usage local-log integration (Codex/Claude today; extend later)
|
|
78
|
-
- `StatusAPI`: status polling helpers (Statuspage + Workspace incidents)
|
|
79
|
-
- `LoggerAPI`: scoped logger + redaction helpers
|
|
80
|
-
|
|
81
|
-
Rule: providers do not talk to `FileManager`, `Security`, or “browser internals” directly unless they *are* the host API implementation.
|
|
82
|
-
|
|
83
|
-
## Provider-specific code layout
|
|
84
|
-
- `Sources/RunicCore/Providers/<ProviderID>/`
|
|
85
|
-
- `<ProviderID>Descriptor.swift` (descriptor + strategy pipeline)
|
|
86
|
-
- `<ProviderID>Strategies.swift` (strategy implementations)
|
|
87
|
-
- `<ProviderID>Probe.swift` / `<ProviderID>Fetcher.swift`
|
|
88
|
-
- `<ProviderID>Models.swift`
|
|
89
|
-
- `<ProviderID>Parser.swift` (if text/HTML parsing)
|
|
90
|
-
- `Sources/Runic/Providers/<ProviderID>/`
|
|
91
|
-
- `<ProviderID>ProviderImplementation.swift` (settings/login UI hooks only)
|
|
92
|
-
|
|
93
|
-
## Minimal provider example (copy-paste)
|
|
94
|
-
|
|
95
|
-
```swift
|
|
96
|
-
import RunicMacroSupport
|
|
97
|
-
import Foundation
|
|
98
|
-
|
|
99
|
-
@ProviderDescriptorRegistration
|
|
100
|
-
@ProviderDescriptorDefinition
|
|
101
|
-
public enum ExampleProviderDescriptor {
|
|
102
|
-
static func makeDescriptor() -> ProviderDescriptor {
|
|
103
|
-
ProviderDescriptor(
|
|
104
|
-
id: .example,
|
|
105
|
-
metadata: ProviderMetadata(
|
|
106
|
-
id: .example,
|
|
107
|
-
displayName: "Example",
|
|
108
|
-
sessionLabel: "Session",
|
|
109
|
-
weeklyLabel: "Weekly",
|
|
110
|
-
opusLabel: nil,
|
|
111
|
-
supportsOpus: false,
|
|
112
|
-
supportsCredits: false,
|
|
113
|
-
creditsHint: "",
|
|
114
|
-
toggleTitle: "Show Example usage",
|
|
115
|
-
cliName: "example",
|
|
116
|
-
defaultEnabled: false,
|
|
117
|
-
isPrimaryProvider: false,
|
|
118
|
-
usesAccountFallback: false,
|
|
119
|
-
dashboardURL: nil,
|
|
120
|
-
statusPageURL: nil),
|
|
121
|
-
branding: ProviderBranding(
|
|
122
|
-
iconStyle: .codex,
|
|
123
|
-
iconResourceName: "ProviderIcon-example",
|
|
124
|
-
color: ProviderColor(red: 0.2, green: 0.6, blue: 0.8)),
|
|
125
|
-
tokenCost: ProviderTokenCostConfig(
|
|
126
|
-
supportsTokenCost: false,
|
|
127
|
-
noDataMessage: { "Example cost summary is not supported." }),
|
|
128
|
-
fetchPlan: ProviderFetchPlan(
|
|
129
|
-
sourceModes: [.auto, .cli],
|
|
130
|
-
pipeline: ProviderFetchPipeline(resolveStrategies: { _ in [ExampleFetchStrategy()] })),
|
|
131
|
-
cli: ProviderCLIConfig(
|
|
132
|
-
name: "example",
|
|
133
|
-
versionDetector: nil))
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
struct ExampleFetchStrategy: ProviderFetchStrategy {
|
|
138
|
-
let id: String = "example.cli"
|
|
139
|
-
let kind: ProviderFetchKind = .cli
|
|
140
|
-
|
|
141
|
-
func isAvailable(_: ProviderFetchContext) async -> Bool { true }
|
|
142
|
-
|
|
143
|
-
func fetch(_: ProviderFetchContext) async throws -> ProviderFetchResult {
|
|
144
|
-
let usage = UsageSnapshot(
|
|
145
|
-
primary: .init(usedPercent: 0, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
|
|
146
|
-
secondary: nil,
|
|
147
|
-
updatedAt: Date(),
|
|
148
|
-
identity: nil)
|
|
149
|
-
return self.makeResult(usage: usage, sourceLabel: "cli")
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
func shouldFallback(on _: Error, context _: ProviderFetchContext) -> Bool { false }
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
## Guardrails (non-negotiable)
|
|
157
|
-
- Identity silo: never display identity/plan fields from provider A inside provider B UI.
|
|
158
|
-
- Privacy: default to on-device parsing; browser cookies are opt-in and never persisted by us beyond WebKit stores.
|
|
159
|
-
- Reliability: providers must be timeout-bounded; no unbounded waits on network/PTY/UI.
|
|
160
|
-
- Degradation: prefer cached data over flapping; show clear errors when stale.
|
|
161
|
-
|
|
162
|
-
## Adding a new provider (current flow)
|
|
163
|
-
|
|
164
|
-
Checklist:
|
|
165
|
-
- Add `UsageProvider` case in `Sources/RunicCore/Providers/Providers.swift`.
|
|
166
|
-
- Create `Sources/RunicCore/Providers/<ProviderID>/`:
|
|
167
|
-
- `<ProviderID>Descriptor.swift`: define `ProviderDescriptor` + fetch pipeline.
|
|
168
|
-
- `<ProviderID>Strategies.swift`: implement one or more `ProviderFetchStrategy`.
|
|
169
|
-
- `<ProviderID>Probe.swift` / `<ProviderID>Fetcher.swift`: concrete fetcher logic.
|
|
170
|
-
- `<ProviderID>Models.swift`: snapshot structs.
|
|
171
|
-
- `<ProviderID>Parser.swift` (if needed).
|
|
172
|
-
- Attach `@ProviderDescriptorRegistration` + `@ProviderDescriptorDefinition` to the descriptor type.
|
|
173
|
-
Implement `static func makeDescriptor() -> ProviderDescriptor`.
|
|
174
|
-
- Attach `@ProviderImplementationRegistration` to the implementation type (macros auto-register).
|
|
175
|
-
- No manual list edits.
|
|
176
|
-
- Add `Sources/Runic/Providers/<ProviderID>/<ProviderID>ProviderImplementation.swift`:
|
|
177
|
-
- `ProviderImplementation` only for settings/login UI hooks.
|
|
178
|
-
- Add icons + color in descriptor:
|
|
179
|
-
- `iconName` must match `ProviderIcon-<id>` asset.
|
|
180
|
-
- Color used in menu cards + switcher.
|
|
181
|
-
- If CLI-specific behavior is needed:
|
|
182
|
-
- add `cliName`, `cliAliases`, `sourceModes`, `versionProvider` in descriptor.
|
|
183
|
-
- strategies decide which `--source` modes apply.
|
|
184
|
-
- Tests:
|
|
185
|
-
- `UsageSnapshot` mapping unit tests
|
|
186
|
-
- strategy availability + fallback tests
|
|
187
|
-
- CLI provider parsing (aliases + --source validation)
|
|
188
|
-
- Docs:
|
|
189
|
-
- add provider section in `docs/providers.md` with data source + auth notes
|
|
190
|
-
- update `docs/provider.md` if the pipeline model changes
|
|
191
|
-
|
|
192
|
-
## UI notes (Providers settings)
|
|
193
|
-
Current: checkboxes per provider.
|
|
194
|
-
|
|
195
|
-
Preferred direction: table/list rows (like a “sessions” table):
|
|
196
|
-
- Provider (name + short auth hint)
|
|
197
|
-
- Enabled toggle
|
|
198
|
-
- Status (ok/stale/error + last updated)
|
|
199
|
-
- Auth source (CLI / cookies / web / oauth) when applicable
|
|
200
|
-
- Actions (Login / Diagnose / Copy debug log)
|
|
201
|
-
|
|
202
|
-
This keeps the pane scannable once we have >5 providers.
|
package/docs/providers.md
DELETED
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "Provider data sources and parsing overview (Codex, Claude, Gemini, Antigravity, Cursor, Droid/Factory, MiniMax, z.ai, Copilot)."
|
|
3
|
-
read_when:
|
|
4
|
-
- Adding or modifying provider fetch/parsing
|
|
5
|
-
- Adjusting provider labels, toggles, or metadata
|
|
6
|
-
- Reviewing data sources for providers
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Providers
|
|
10
|
-
|
|
11
|
-
## Fetch strategies (current)
|
|
12
|
-
Legend: web (browser cookies/WebView), cli (RPC/PTy), oauth (API), api token, local probe, web dashboard.
|
|
13
|
-
Source labels (CLI/header): `openai-web`, `web`, `oauth`, `api`, `local`, plus provider-specific CLI labels (e.g. `codex-cli`, `claude`).
|
|
14
|
-
|
|
15
|
-
| Provider | Strategies (ordered for auto) |
|
|
16
|
-
| --- | --- |
|
|
17
|
-
| Codex | Web dashboard (`openai-web`) → CLI RPC/PTy (`codex-cli`); app uses CLI usage + optional dashboard scrape. |
|
|
18
|
-
| Claude | OAuth API (`oauth`) → Web API (`web`) → CLI PTY (`claude`). |
|
|
19
|
-
| Gemini | OAuth API via Gemini CLI credentials (`api`). |
|
|
20
|
-
| Antigravity | Local LSP/HTTP probe (`local`). |
|
|
21
|
-
| Cursor | Web API via cookies → stored WebKit session (`web`). |
|
|
22
|
-
| Droid/Factory | Web cookies → stored tokens → local storage → WorkOS cookies (`web`). |
|
|
23
|
-
| MiniMax | Web cookies + Chromium local storage token (`web`). |
|
|
24
|
-
| z.ai | API token (Keychain/env) → quota API (`api`). |
|
|
25
|
-
| Copilot | API token (device flow/env) → copilot_internal API (`api`). |
|
|
26
|
-
|
|
27
|
-
## Codex
|
|
28
|
-
- Web dashboard (when enabled): `https://chatgpt.com/codex/settings/usage` via WebView + browser cookies.
|
|
29
|
-
- CLI RPC default: `codex ... app-server` JSON-RPC (`account/read`, `account/rateLimits/read`).
|
|
30
|
-
- CLI PTY fallback: `/status` scrape.
|
|
31
|
-
- Local cost usage: scans `~/.codex/sessions/**/*.jsonl` (last 30 days).
|
|
32
|
-
- Status: Statuspage.io (OpenAI).
|
|
33
|
-
- Details: `docs/codex.md`.
|
|
34
|
-
|
|
35
|
-
## Claude
|
|
36
|
-
- OAuth API (preferred when CLI credentials exist).
|
|
37
|
-
- Web API (browser cookies) fallback when OAuth missing.
|
|
38
|
-
- CLI PTY fallback when OAuth + web are unavailable.
|
|
39
|
-
- Local cost usage: scans `~/.config/claude/projects/**/*.jsonl` (last 30 days).
|
|
40
|
-
- Status: Statuspage.io (Anthropic).
|
|
41
|
-
- Details: `docs/claude.md`.
|
|
42
|
-
|
|
43
|
-
## z.ai
|
|
44
|
-
- API token from Keychain or `Z_AI_API_KEY` env var.
|
|
45
|
-
- `GET https://api.z.ai/api/monitor/usage/quota/limit`.
|
|
46
|
-
- Status: none yet.
|
|
47
|
-
- Details: `docs/zai.md`.
|
|
48
|
-
|
|
49
|
-
## Gemini
|
|
50
|
-
- OAuth-backed quota API (`retrieveUserQuota`) using Gemini CLI credentials.
|
|
51
|
-
- Token refresh via Google OAuth if expired.
|
|
52
|
-
- Tier detection via `loadCodeAssist`.
|
|
53
|
-
- Status: Google Workspace incidents (Gemini product).
|
|
54
|
-
- Details: `docs/gemini.md`.
|
|
55
|
-
|
|
56
|
-
## Antigravity
|
|
57
|
-
- Local Antigravity language server (internal protocol, HTTPS on localhost).
|
|
58
|
-
- `GetUserStatus` primary; `GetCommandModelConfigs` fallback.
|
|
59
|
-
- Status: Google Workspace incidents (Gemini product).
|
|
60
|
-
- Details: `docs/antigravity.md`.
|
|
61
|
-
|
|
62
|
-
## Cursor
|
|
63
|
-
- Web API via browser cookies (`cursor.com` + `cursor.sh`).
|
|
64
|
-
- Fallback: stored WebKit session.
|
|
65
|
-
- Status: Statuspage.io (Cursor).
|
|
66
|
-
- Details: `docs/cursor.md`.
|
|
67
|
-
|
|
68
|
-
## Droid (Factory)
|
|
69
|
-
- Web API via Factory cookies, bearer tokens, and WorkOS refresh tokens.
|
|
70
|
-
- Multiple fallback strategies (cookies → stored tokens → local storage → WorkOS cookies).
|
|
71
|
-
- Status: `https://status.factory.ai`.
|
|
72
|
-
- Details: `docs/factory.md`.
|
|
73
|
-
|
|
74
|
-
## MiniMax
|
|
75
|
-
- Web-only. Uses browser cookies plus a Chromium local storage access token.
|
|
76
|
-
- Primary endpoint: `https://platform.minimax.io/user-center/payment/coding-plan` (HTML parse).
|
|
77
|
-
- Fallback endpoint: `https://platform.minimax.io/v1/api/openplatform/coding_plan/remains`.
|
|
78
|
-
- Status: none yet.
|
|
79
|
-
- Details: `docs/minimax.md`.
|
|
80
|
-
|
|
81
|
-
## Copilot
|
|
82
|
-
- GitHub device flow OAuth token + `api.github.com/copilot_internal/user`.
|
|
83
|
-
- Status: Statuspage.io (GitHub).
|
|
84
|
-
- Details: `docs/copilot.md`.
|
|
85
|
-
|
|
86
|
-
See also: `docs/provider.md` for architecture notes.
|