@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/refactor/macros.md
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "Provider macro refactor ideas and follow-ups."
|
|
3
|
-
read_when:
|
|
4
|
-
- Reviewing provider macro ergonomics
|
|
5
|
-
- Planning provider/descriptor refactors
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Macro refactor ideas
|
|
9
|
-
|
|
10
|
-
1. Macro ergonomics + errors
|
|
11
|
-
- Emit compile-time errors when a macro is attached to the wrong target or missing `descriptor`/`init`.
|
|
12
|
-
- Add a member macro to generate `static let descriptor` from `makeDescriptor()` to remove boilerplate.
|
|
13
|
-
|
|
14
|
-
2. Descriptor/data shape
|
|
15
|
-
- Split ProviderDescriptor into Descriptor + FetchPlan + Branding + CLI files for cleaner deps.
|
|
16
|
-
- Move source label into fetch results (strategy-specific).
|
|
17
|
-
|
|
18
|
-
3. Fetching pipeline
|
|
19
|
-
- Return all attempted strategies + errors for debug UI and CLI `--verbose`.
|
|
20
|
-
|
|
21
|
-
4. Registry order & stability
|
|
22
|
-
- Use ProviderDescriptorRegistry registration order for `all`; no sorting by rawValue.
|
|
23
|
-
- Use metadata flags (e.g. `isPrimaryProvider`) instead of hard-coded Codex/Claude.
|
|
24
|
-
|
|
25
|
-
5. Account/identity
|
|
26
|
-
- Replace Codex UI special casing with a descriptor flag (e.g. `usesAccountFallback`).
|
|
27
|
-
- Enforce provider-keyed identity in snapshots to avoid cross-provider display.
|
|
28
|
-
|
|
29
|
-
6. Settings + tokens
|
|
30
|
-
- Move Zai/Copilot token lookup into strategy-local resolvers (Keychain/env).
|
|
31
|
-
- Add optional per-provider settings fields in ProviderSettingsSnapshot.
|
|
32
|
-
|
|
33
|
-
7. Docs + tests
|
|
34
|
-
- Add a minimal provider example in docs/provider.md.
|
|
35
|
-
- Add registry completeness + deterministic-order test.
|
package/docs/refresh-loop.md
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "Refresh cadence, background updates, and error handling."
|
|
3
|
-
read_when:
|
|
4
|
-
- Changing refresh cadence, background tasks, or refresh triggers
|
|
5
|
-
- Investigating refresh timing or stale data behavior
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Refresh loop
|
|
9
|
-
|
|
10
|
-
## Cadence
|
|
11
|
-
- `RefreshFrequency`: Manual, 1m, 2m, 5m (default), 15m.
|
|
12
|
-
- Stored in `UserDefaults` via `SettingsStore`.
|
|
13
|
-
|
|
14
|
-
## Behavior
|
|
15
|
-
- Background refresh runs off-main and updates `UsageStore` (usage + credits + optional web scrape).
|
|
16
|
-
- Manual “Refresh now” always available in the menu.
|
|
17
|
-
- Stale/error states dim the icon and surface status in-menu.
|
|
18
|
-
|
|
19
|
-
## Optional future
|
|
20
|
-
- Auto-seed a log if none exists via `codex exec --skip-git-repo-check --json "ping"` (currently not executed).
|
|
21
|
-
|
|
22
|
-
See also: `docs/status.md`, `docs/ui.md`.
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "Homebrew Cask release steps for Runic (Sparkle-disabled builds)."
|
|
3
|
-
read_when:
|
|
4
|
-
- Publishing a Runic release via Homebrew
|
|
5
|
-
- Updating the Homebrew tap cask definition
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Runic Homebrew Release Playbook
|
|
9
|
-
|
|
10
|
-
Homebrew is for the UI app via Cask. When installed via Homebrew, Runic disables Sparkle and shows a "update via brew" hint in About.
|
|
11
|
-
|
|
12
|
-
## Prereqs
|
|
13
|
-
- Homebrew installed.
|
|
14
|
-
- Access to the tap repo: `../homebrew-tap`.
|
|
15
|
-
|
|
16
|
-
## 1) Release Runic normally
|
|
17
|
-
Follow `docs/RELEASING.md` to publish `Runic-<version>.zip` to GitHub Releases.
|
|
18
|
-
|
|
19
|
-
## 2) Update the Homebrew tap cask
|
|
20
|
-
In `../homebrew-tap`, add/update the cask at `Casks/runic.rb`:
|
|
21
|
-
- `url` points at the GitHub release asset: `.../releases/download/v<version>/Runic-<version>.zip`
|
|
22
|
-
- Update `sha256` to match that zip.
|
|
23
|
-
- Keep `depends_on arch: :arm64` and `depends_on macos: ">= :sonoma"` (Runic is macOS 14+).
|
|
24
|
-
|
|
25
|
-
## 3) Verify install
|
|
26
|
-
```sh
|
|
27
|
-
brew uninstall --cask runic || true
|
|
28
|
-
brew untap steipete/tap || true
|
|
29
|
-
brew tap steipete/tap
|
|
30
|
-
brew install --cask steipete/tap/runic
|
|
31
|
-
open -a Runic
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## 4) Push tap changes
|
|
35
|
-
Commit + push in the tap repo.
|
package/docs/releasing.md
DELETED
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
summary: "Runic release checklist: package, sign, notarize, appcast, and asset validation."
|
|
3
|
-
read_when:
|
|
4
|
-
- Starting a Runic release
|
|
5
|
-
- Updating signing/notarization or appcast steps
|
|
6
|
-
- Validating release assets or Sparkle feed
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# Release process (Runic)
|
|
10
|
-
|
|
11
|
-
SwiftPM-only; package/sign/notarize manually (no Xcode project). Sparkle feed is served from GitHub Releases. Checklist below merges Trimmy’s release flow with Runic specifics.
|
|
12
|
-
|
|
13
|
-
**Reference first:** follow this Runic-specific guide as the source of truth for release steps.
|
|
14
|
-
|
|
15
|
-
## Expectations
|
|
16
|
-
- When someone says “release Runic”, do the entire end-to-end flow: bump versions/CHANGELOG, build, sign and notarize, upload the zip to the GitHub release, generate/update the appcast with the new signature, publish the tag/release, and verify the enclosure URL responds with 200/OK and installs via Sparkle (no 404s or stale feeds).
|
|
17
|
-
|
|
18
|
-
### Release automation notes (Scripts/release.sh)
|
|
19
|
-
- Always forces a fresh build/notarization (no cached artifacts) before publishing.
|
|
20
|
-
- Fails fast if: git tree is dirty, the top changelog section is still “Unreleased” or mismatched, the target version already exists in the appcast, or the build number is not greater than the latest appcast entry.
|
|
21
|
-
- Sparkle key probe runs up front; appcast entry + signature verified automatically after generation.
|
|
22
|
-
- Release notes are extracted directly from the current changelog section and passed to the GitHub release (no manual notes flag needed).
|
|
23
|
-
- Sparkle appcast notes are generated as HTML from the same changelog section and embedded into the appcast entry.
|
|
24
|
-
- Uses in-repo helpers (`Scripts/release-lib.sh`) so release checks no longer depend on external/private script paths.
|
|
25
|
-
- Requires tools/env on PATH: `swiftformat`, `swiftlint`, `swift`, `sign_update`, `generate_appcast`, `gh`, `python3`, `zip`, `curl`, plus `APP_STORE_CONNECT_*` and `SPARKLE_PRIVATE_KEY_FILE`.
|
|
26
|
-
|
|
27
|
-
## Prereqs
|
|
28
|
-
- Xcode 26+ installed at `/Applications/Xcode.app` (for ictool/iconutil and SDKs).
|
|
29
|
-
- Developer ID Application cert installed (e.g. `Developer ID Application: YOUR_NAME (TEAMID)`).
|
|
30
|
-
- ASC API creds in env: `APP_STORE_CONNECT_API_KEY_P8`, `APP_STORE_CONNECT_KEY_ID`, `APP_STORE_CONNECT_ISSUER_ID`.
|
|
31
|
-
- Sparkle keys: public key already in Info.plist; private key path set via `SPARKLE_PRIVATE_KEY_FILE` when generating appcast.
|
|
32
|
-
- Ensure shell has release env vars loaded (usually `source ~/.profile`) before running `Scripts/release.sh`.
|
|
33
|
-
|
|
34
|
-
## Icon (glass .icon → .icns)
|
|
35
|
-
```
|
|
36
|
-
./Scripts/build_icon.sh Icon.icon Runic
|
|
37
|
-
```
|
|
38
|
-
Uses Xcode’s `ictool` + transparent padding + iconset → Icon.icns.
|
|
39
|
-
|
|
40
|
-
## Build, sign, notarize (universal: arm64 + x86_64)
|
|
41
|
-
```
|
|
42
|
-
./Scripts/sign-and-notarize.sh
|
|
43
|
-
```
|
|
44
|
-
What it does:
|
|
45
|
-
- `swift build -c release --arch arm64` and `swift build -c release --arch x86_64`
|
|
46
|
-
- Packages `Runic.app` with Info.plist and Icon.icns
|
|
47
|
-
- Embeds Sparkle.framework, Updater, Autoupdate, XPCs
|
|
48
|
-
- Codesigns **everything** with runtime + timestamp (deep) and adds rpath
|
|
49
|
-
- Zips to `Runic-<version>.zip`
|
|
50
|
-
- Submits to notarytool, waits, staples, validates
|
|
51
|
-
|
|
52
|
-
Gotchas fixed:
|
|
53
|
-
- Sparkle needs signing for framework, Autoupdate, Updater, XPCs (Downloader/Installer) or notarization fails.
|
|
54
|
-
- Use `--timestamp` and `--deep` when signing the app to avoid invalid signature errors.
|
|
55
|
-
- Avoid `unzip` — it can add AppleDouble `._*` files that break the sealed signature and trigger “app is damaged”. Use Finder or `ditto -x -k Runic-<ver>.zip /Applications`. If Gatekeeper complains, delete the app bundle, re-extract with `ditto`, then `spctl -a -t exec` to verify.
|
|
56
|
-
- Manual sanity check before uploading: `find Runic.app -name '._*'` should return nothing; then `spctl --assess --type execute --verbose Runic.app` and `codesign --verify --deep --strict --verbose Runic.app` should both pass on the packaged bundle.
|
|
57
|
-
|
|
58
|
-
## Appcast (Sparkle)
|
|
59
|
-
After notarization:
|
|
60
|
-
```
|
|
61
|
-
SPARKLE_PRIVATE_KEY_FILE=/path/to/ed25519-priv.key \
|
|
62
|
-
./Scripts/make_appcast.sh Runic-0.1.0.zip \
|
|
63
|
-
https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml
|
|
64
|
-
Generates HTML release notes from `CHANGELOG.md` (via `Scripts/changelog-to-html.sh`) and embeds them into the appcast entry.
|
|
65
|
-
```
|
|
66
|
-
Uploads not handled automatically—commit/publish appcast + zip to the feed location (GitHub Releases/raw URL).
|
|
67
|
-
|
|
68
|
-
## Tag & release
|
|
69
|
-
```
|
|
70
|
-
git tag v<version>
|
|
71
|
-
./Scripts/make_appcast.sh ...
|
|
72
|
-
# upload zip + appcast to Releases
|
|
73
|
-
# then create GitHub release (gh release create v<version> ...)
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Homebrew (Cask)
|
|
77
|
-
Runic ships a Homebrew **Cask** in `../homebrew-tap`. When installed via Homebrew, Runic disables Sparkle and the app
|
|
78
|
-
must be updated via `brew`.
|
|
79
|
-
|
|
80
|
-
After publishing the GitHub release, update the tap cask (see `docs/releasing-homebrew.md`).
|
|
81
|
-
|
|
82
|
-
## Checklist (quick)
|
|
83
|
-
- [ ] Read this file end-to-end before starting.
|
|
84
|
-
- [ ] Update versions (scripts/Info.plist, CHANGELOG, About text) — changelog top section must be finalized; release script pulls notes from it automatically.
|
|
85
|
-
- [ ] `swiftformat`, `swiftlint`, `swift test` (zero warnings/errors)
|
|
86
|
-
- [ ] `./Scripts/build_icon.sh` if icon changed
|
|
87
|
-
- [ ] `./Scripts/sign-and-notarize.sh`
|
|
88
|
-
- [ ] Generate Sparkle appcast with private key
|
|
89
|
-
- Sparkle ed25519 private key path: `/Users/sriinnu/Library/CloudStorage/Dropbox/Backup/Sparkle/sparkle-private-key-KEEP-SECURE.txt` (primary) and `/Users/sriinnu/Library/CloudStorage/Dropbox/Backup/Sparkle-VibeTunnel/sparkle-private-key-KEEP-SECURE.txt` (older backup)
|
|
90
|
-
- Upload the dSYM archive alongside the app zip on the GitHub release; the release script now automates this and will fail if it’s missing.
|
|
91
|
-
- After publishing the release, run `Scripts/check-release-assets.sh <tag>` to confirm both the app zip and dSYM zip are present on GitHub.
|
|
92
|
-
- Generate the appcast + HTML release notes: `./Scripts/make_appcast.sh Runic-<ver>.zip https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml`
|
|
93
|
-
- Verify the enclosure signature + size: `SPARKLE_PRIVATE_KEY_FILE=... ./Scripts/verify_appcast.sh <ver>`
|
|
94
|
-
- [ ] Upload zip + appcast to feed; publish tag + GitHub release so Sparkle URL is live (avoid 404)
|
|
95
|
-
- [ ] Homebrew tap: update `../homebrew-tap/Casks/runic.rb` (url + sha256), then verify:
|
|
96
|
-
- `brew uninstall --cask runic || true`
|
|
97
|
-
- `brew untap sriinnu/tap || true; brew tap sriinnu/tap`
|
|
98
|
-
- `brew install --cask sriinnu/tap/runic && open -a Runic`
|
|
99
|
-
- [ ] Version continuity: confirm the new version is the immediate next patch/minor (no gaps) and CHANGELOG has no skipped numbers (e.g., after 0.2.0 use 0.2.1, not 0.2.2)
|
|
100
|
-
- [ ] Changelog sanity: single top-level title, no duplicate version sections, versions strictly descending with no repeats
|
|
101
|
-
- [ ] Release pages: title format `Runic <version>`, notes as Markdown list (no stray blank lines)
|
|
102
|
-
- [ ] Changelog/release notes are user-facing: avoid internal-only bullets (build numbers, script bumps) and keep entries concise
|
|
103
|
-
- [ ] Download uploaded `Runic-<ver>.zip`, unzip via `ditto`, run, and verify signature (`spctl -a -t exec -vv Runic.app` + `stapler validate`)
|
|
104
|
-
- [ ] Confirm `appcast.xml` points to the new zip/version and renders the HTML release notes (not escaped tags)
|
|
105
|
-
- [ ] Verify on GitHub Releases: assets present (zip, appcast), release notes match changelog, version/tag correct
|
|
106
|
-
- [ ] Open the appcast URL in browser to confirm the new entry is visible and enclosure URL is reachable
|
|
107
|
-
- [ ] Manually visit the enclosure URL (curl -I) to ensure 200/OK (no 404) after publishing assets/release
|
|
108
|
-
- [ ] Ensure `sparkle:edSignature` is present for the enclosure in appcast (generated by `generate_appcast` with the ed25519 key)
|
|
109
|
-
- [ ] When creating the GitHub release, paste the CHANGELOG entry as Markdown list (one `-` per line, blank line between sections); visually confirm bullets render correctly after publishing
|
|
110
|
-
- [ ] Keep a previous signed build in `/Applications/Runic.app` to test Sparkle delta/full update to the new release
|
|
111
|
-
- [ ] Manual Gatekeeper sanity: after packaging, `find Runic.app -name '._*'` is empty, `spctl --assess --type execute --verbose Runic.app` and `codesign --verify --deep --strict --verbose Runic.app` succeed
|
|
112
|
-
- [ ] For Sparkle verification: if replacing `/Applications/Runic.app`, quit first, replace, relaunch, and test update
|
|
113
|
-
- **Definition of “done” for a release:** all of the above are complete, the appcast/enclosure link resolves, Homebrew cask
|
|
114
|
-
installs, and a previous public build can update to the new one via Sparkle. Anything short of that is not a finished release.
|
|
115
|
-
|
|
116
|
-
## Troubleshooting
|
|
117
|
-
- **White plate icon**: regenerate icns via `build_icon.sh` (ictool) to ensure transparent padding.
|
|
118
|
-
- **Notarization invalid**: verify deep+timestamp signing, especially Sparkle’s Autoupdate/Updater and XPCs; rerun package + sign-and-notarize.
|
|
119
|
-
- **App won’t launch**: ensure Sparkle.framework is embedded under `Contents/Frameworks` and rpath added; codesign deep.
|
|
120
|
-
- **App “damaged” dialog after unzip**: re-extract with `ditto -x -k`, removing any `._*` files, then re-verify with `spctl`.
|
|
121
|
-
- **Update download fails (404)**: ensure the release asset referenced in appcast exists and is published in the corresponding GitHub release; verify with `curl -I <enclosure-url>`.
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# Concrete TODO (Execution List)
|
|
2
|
-
|
|
3
|
-
Branch: `feat/research-uiux-core-next`
|
|
4
|
-
Last updated: 2026-02-22
|
|
5
|
-
|
|
6
|
-
## Sprint Goal
|
|
7
|
-
|
|
8
|
-
Ship operator-grade insights in small, verifiable slices without destabilizing current menu behavior.
|
|
9
|
-
|
|
10
|
-
## P0 (Now)
|
|
11
|
-
|
|
12
|
-
- [x] Create research-backed roadmap document
|
|
13
|
-
File: `docs/research/feature_uiux_roadmap_2026-02-22.md`
|
|
14
|
-
- [x] Add probabilistic month-end forecast confidence bands (`p50/p80/p95`) to core forecast model
|
|
15
|
-
- [x] Render confidence bands in menu Insights line when available
|
|
16
|
-
- [x] Add/extend tests for confidence-band generation and menu formatting
|
|
17
|
-
|
|
18
|
-
## P1 (Next)
|
|
19
|
-
|
|
20
|
-
- [x] Anomaly explainability v2
|
|
21
|
-
- [x] Add explanation object for why severity was chosen
|
|
22
|
-
- [x] Surface primary and secondary contributing factors in menu copy
|
|
23
|
-
- [x] Policy engine foundation (warn / soft-limit / hard-stop)
|
|
24
|
-
- [x] Core model in `RunicCore`
|
|
25
|
-
- [x] Deterministic decision tests
|
|
26
|
-
|
|
27
|
-
## P2 (After P1)
|
|
28
|
-
|
|
29
|
-
- [x] OTel GenAI ingestion adapter (feature-flagged)
|
|
30
|
-
- [x] Team showback/chargeback summary exports
|
|
31
|
-
- [x] Cross-platform parity matrix and release gate checklist
|
|
32
|
-
|
|
33
|
-
## Immediate Work Plan (This Branch)
|
|
34
|
-
|
|
35
|
-
1. Extend `UsageLedgerSpendForecast` with optional confidence outputs.
|
|
36
|
-
2. Compute quantiles from observed daily cost distribution in `UsageLedgerAggregator`.
|
|
37
|
-
3. Preserve these fields in `UsageStore` projection-resolution path.
|
|
38
|
-
4. Update menu forecast rendering to show `p50/p80/p95` when available.
|
|
39
|
-
5. Validate with targeted tests and full rebuild script.
|
|
40
|
-
|
|
41
|
-
## Definition Of Done (Current Slice)
|
|
42
|
-
|
|
43
|
-
- Forecast model compiles with backward-compatible optional fields.
|
|
44
|
-
- Existing forecast tests pass.
|
|
45
|
-
- New quantile test passes.
|
|
46
|
-
- Menu model test confirms confidence string appears.
|
|
47
|
-
- `./Scripts/compile_and_run.sh` completes successfully.
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
# Core Feature Research Log
|
|
2
|
-
|
|
3
|
-
Date: 2026-02-21
|
|
4
|
-
Branch: feat/core
|
|
5
|
-
|
|
6
|
-
## Goal
|
|
7
|
-
|
|
8
|
-
Collect concrete, source-backed feature ideas for Runic core roadmap from:
|
|
9
|
-
- GitHub projects (production patterns)
|
|
10
|
-
- arXiv papers (state-of-the-art approaches)
|
|
11
|
-
|
|
12
|
-
This file is updated incrementally during research to avoid context loss.
|
|
13
|
-
|
|
14
|
-
## Status
|
|
15
|
-
|
|
16
|
-
- [x] Research file created
|
|
17
|
-
- [x] Gather current GitHub evidence
|
|
18
|
-
- [x] Gather current arXiv evidence
|
|
19
|
-
- [x] Synthesize feature candidates with implementation notes
|
|
20
|
-
- [x] Prioritize roadmap (Now / Next / Later)
|
|
21
|
-
|
|
22
|
-
## External Evidence Snapshot
|
|
23
|
-
|
|
24
|
-
### arXiv evidence (routing, caching, cost/quality)
|
|
25
|
-
|
|
26
|
-
1. FrugalGPT (2023)
|
|
27
|
-
- Link: https://arxiv.org/abs/2305.05176
|
|
28
|
-
- Signal: Cascaded LLM usage can cut cost heavily while maintaining quality (paper reports very large cost savings in their setup).
|
|
29
|
-
- Relevance to Runic: Runic can add cost-quality simulation and routing recommendations over existing provider usage logs.
|
|
30
|
-
|
|
31
|
-
2. RouteLLM (2024)
|
|
32
|
-
- Link: https://arxiv.org/abs/2406.18665
|
|
33
|
-
- Signal: Learned routers can route between strong/weak models with significant cost reduction while preserving much of strong-model quality.
|
|
34
|
-
- Relevance to Runic: Add "Routing Advisor" that proposes per-project provider/model policies from real usage history.
|
|
35
|
-
|
|
36
|
-
3. LLMRouterBench (2026)
|
|
37
|
-
- Link: https://arxiv.org/abs/2601.07206
|
|
38
|
-
- Signal: Large benchmark shows routing is useful, but many methods are brittle and simple baselines are often hard to beat.
|
|
39
|
-
- Relevance to Runic: Favor robust baseline policies first (fallback + threshold + guardrails) before heavier ML routing.
|
|
40
|
-
|
|
41
|
-
4. vCache (2025)
|
|
42
|
-
- Link: https://arxiv.org/abs/2502.03771
|
|
43
|
-
- Signal: Semantic caching with error-bound control can reduce redundant LLM calls.
|
|
44
|
-
- Relevance to Runic: Add cacheability analytics and "likely cache hit" opportunity scoring per project/workflow.
|
|
45
|
-
|
|
46
|
-
5. Generative Caching (2025)
|
|
47
|
-
- Link: https://arxiv.org/abs/2503.17603
|
|
48
|
-
- Signal: Cache systems that generate compact responses for similar prompts improve cost/latency.
|
|
49
|
-
- Relevance to Runic: Track prompt similarity buckets and estimate avoidable spend from repeated prompt patterns.
|
|
50
|
-
|
|
51
|
-
### GitHub and docs evidence (production implementation patterns)
|
|
52
|
-
|
|
53
|
-
1. LiteLLM
|
|
54
|
-
- Repo: https://github.com/BerriAI/litellm
|
|
55
|
-
- Reliability docs: https://docs.litellm.ai/docs/proxy/reliability
|
|
56
|
-
- Signal: Production-grade patterns include retries, fallbacks, cooldowns, and routing controls.
|
|
57
|
-
- Relevance: Runic should expose policy diagnostics and recommend fallback policy quality from observed failures.
|
|
58
|
-
|
|
59
|
-
2. Helicone AI Gateway
|
|
60
|
-
- Repo: https://github.com/Helicone/ai-gateway
|
|
61
|
-
- Signal: Unified gateway pattern with routing, load balancing, caching, tracing, and limits.
|
|
62
|
-
- Relevance: Runic can add "Gateway Readiness Score" for teams deciding when to adopt a gateway.
|
|
63
|
-
|
|
64
|
-
3. Langfuse
|
|
65
|
-
- Repo: https://github.com/langfuse/langfuse
|
|
66
|
-
- Signal: Prompt management, tracing, evals, datasets, and collaborative AI ops workflows.
|
|
67
|
-
- Relevance: Runic should support prompt/version correlation and eval score overlays in usage charts.
|
|
68
|
-
|
|
69
|
-
4. Promptfoo
|
|
70
|
-
- Repo: https://github.com/promptfoo/promptfoo
|
|
71
|
-
- Signal: Eval + red-team workflows integrated into CI.
|
|
72
|
-
- Relevance: Runic can ingest eval outputs and show quality regressions next to spend spikes.
|
|
73
|
-
|
|
74
|
-
5. OpenAI Evals
|
|
75
|
-
- Repo: https://github.com/openai/evals
|
|
76
|
-
- Docs link from repo: https://platform.openai.com/docs/guides/evals
|
|
77
|
-
- Signal: Evals are a core mechanism to measure model/version quality impact.
|
|
78
|
-
- Relevance: Runic can include first-class "Eval Health" alongside budget health.
|
|
79
|
-
|
|
80
|
-
6. OpenTelemetry GenAI semantic conventions
|
|
81
|
-
- Metrics: https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/
|
|
82
|
-
- Spans: https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-spans/
|
|
83
|
-
- Signal: Standard fields for provider/model/operation/timing are now defined for GenAI telemetry.
|
|
84
|
-
- Relevance: Runic should export normalized telemetry so dashboards/tools interoperate cleanly.
|
|
85
|
-
|
|
86
|
-
7. MCP specification (tools/prompts)
|
|
87
|
-
- Tools: https://modelcontextprotocol.io/specification/2025-06-18/server/tools
|
|
88
|
-
- Prompts: https://modelcontextprotocol.io/specification/2025-06-18/server/prompts
|
|
89
|
-
- Signal: Standardized tool invocation and prompt serving surface for agentic systems.
|
|
90
|
-
- Relevance: Runic can add MCP-specific analytics (tool error rate, latency, prompt-template performance).
|
|
91
|
-
|
|
92
|
-
## Feature Candidates (for Runic core)
|
|
93
|
-
|
|
94
|
-
### A) Routing Advisor + Cost-Quality Simulator
|
|
95
|
-
|
|
96
|
-
What:
|
|
97
|
-
- Simulate alternative model/provider routing policies against historical usage ledger data.
|
|
98
|
-
- Show projected delta for cost, latency proxy, and quality proxy.
|
|
99
|
-
|
|
100
|
-
Why now:
|
|
101
|
-
- Directly aligned to FrugalGPT + RouteLLM evidence.
|
|
102
|
-
- Low dependency because Runic already has usage ledger + provider cost paths.
|
|
103
|
-
|
|
104
|
-
Implementation sketch:
|
|
105
|
-
- Extend `Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift` with simulation inputs/outputs.
|
|
106
|
-
- Add policy models in `Sources/RunicCore/Performance/PerformanceModels.swift`.
|
|
107
|
-
- Add menu card in `Sources/Runic/Views/Menu/` (new `RoutingAdvisorMenuView.swift`).
|
|
108
|
-
|
|
109
|
-
### B) Reliability Policy Score (Fallback/Retry/Cooldown quality)
|
|
110
|
-
|
|
111
|
-
What:
|
|
112
|
-
- Per provider/project score for policy robustness:
|
|
113
|
-
- failure-rate trends
|
|
114
|
-
- fallback coverage
|
|
115
|
-
- timeout/retry efficiency
|
|
116
|
-
- observed "hard fail with no fallback" incidents
|
|
117
|
-
|
|
118
|
-
Why now:
|
|
119
|
-
- Practical baseline recommended by LLMRouterBench-style findings.
|
|
120
|
-
- Matches LiteLLM/Helicone operational patterns.
|
|
121
|
-
|
|
122
|
-
Implementation sketch:
|
|
123
|
-
- Persist policy signals in `Sources/RunicCore/Performance/PerformanceStorageImpl.swift`.
|
|
124
|
-
- Add scoring service in `Sources/RunicCore/Performance/`.
|
|
125
|
-
- Render in `Sources/Runic/Views/Menu/AlertsMenuView.swift` and a dedicated card.
|
|
126
|
-
|
|
127
|
-
### C) Eval-Linked Spend Analytics
|
|
128
|
-
|
|
129
|
-
What:
|
|
130
|
-
- Ingest eval outputs (Promptfoo/OpenAI Evals style) and align with cost/usage windows.
|
|
131
|
-
- Show "quality down + spend up" and "quality stable + cost down" events.
|
|
132
|
-
|
|
133
|
-
Why now:
|
|
134
|
-
- Moves Runic from pure accounting to decision support.
|
|
135
|
-
|
|
136
|
-
Implementation sketch:
|
|
137
|
-
- New ingest model (JSON/YAML adapter) in `Sources/RunicCore/`.
|
|
138
|
-
- Cross-join with provider/day/project aggregates in usage ledger pipeline.
|
|
139
|
-
- Add view in `Sources/Runic/Views/Performance/PerformanceDashboardView.swift`.
|
|
140
|
-
|
|
141
|
-
### D) Semantic Cache Opportunity Analyzer
|
|
142
|
-
|
|
143
|
-
What:
|
|
144
|
-
- Detect repeated or near-duplicate prompt patterns and estimate avoidable token cost.
|
|
145
|
-
- Flag cache-friendly workflows per project.
|
|
146
|
-
|
|
147
|
-
Why now:
|
|
148
|
-
- Backed by vCache/generative-caching direction and gateway practices.
|
|
149
|
-
|
|
150
|
-
Implementation sketch:
|
|
151
|
-
- Add prompt fingerprint stats in usage ledger models.
|
|
152
|
-
- Keep first version lightweight: hash + normalized prompt-template fingerprint, not full semantic embeddings.
|
|
153
|
-
- UI card in menu + performance dashboard.
|
|
154
|
-
|
|
155
|
-
### E) OpenTelemetry GenAI Export
|
|
156
|
-
|
|
157
|
-
What:
|
|
158
|
-
- Export Runic telemetry in OTel GenAI-compatible fields.
|
|
159
|
-
- Include provider, request model, response model, operation, and latency buckets.
|
|
160
|
-
|
|
161
|
-
Why now:
|
|
162
|
-
- Standardization unlocks external dashboards and enterprise integrations.
|
|
163
|
-
|
|
164
|
-
Implementation sketch:
|
|
165
|
-
- Add mapper in `Sources/RunicCore/Logging/` or `Sources/RunicCore/Performance/`.
|
|
166
|
-
- Optional sink to JSON/OTLP compatible format.
|
|
167
|
-
|
|
168
|
-
### F) MCP Tool and Prompt Analytics
|
|
169
|
-
|
|
170
|
-
What:
|
|
171
|
-
- Track MCP tool-call rates, latency, error classes, and prompt-template success trends.
|
|
172
|
-
- Show per-project MCP "tool reliability heatmap."
|
|
173
|
-
|
|
174
|
-
Why now:
|
|
175
|
-
- Agentic workflows are increasingly MCP-centric.
|
|
176
|
-
|
|
177
|
-
Implementation sketch:
|
|
178
|
-
- Add MCP event model in `RunicCore`.
|
|
179
|
-
- New menu views under `Sources/Runic/Views/Menu/`.
|
|
180
|
-
|
|
181
|
-
## Data Product Improvements (directly for your current concern)
|
|
182
|
-
|
|
183
|
-
Your concern:
|
|
184
|
-
- "Insights do not show actual project names reliably."
|
|
185
|
-
|
|
186
|
-
Likely core issue:
|
|
187
|
-
- Project identity is fragmented across providers/log formats (`projectID` present but often not normalized).
|
|
188
|
-
|
|
189
|
-
Concrete fixes:
|
|
190
|
-
1. Add project identity normalization pipeline:
|
|
191
|
-
- Canonical key = provider + normalized project slug + optional workspace path hash.
|
|
192
|
-
- Keep alias table for renamed projects.
|
|
193
|
-
|
|
194
|
-
2. Improve extraction heuristics:
|
|
195
|
-
- Parse project name from known fields and fallback to path/repo hints.
|
|
196
|
-
- Add confidence score per inferred project name.
|
|
197
|
-
|
|
198
|
-
3. Preserve provenance:
|
|
199
|
-
- Store source field map that produced each project name, to debug mismatches quickly.
|
|
200
|
-
|
|
201
|
-
4. UI safety:
|
|
202
|
-
- Show "Unknown project" only when confidence is low, with hover details and quick relabel action.
|
|
203
|
-
|
|
204
|
-
Suggested file touchpoints:
|
|
205
|
-
- `Sources/RunicCore/UsageLedger/UsageLedgerModels.swift`
|
|
206
|
-
- `Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift`
|
|
207
|
-
- `Sources/Runic/Core/Stores/UsageStore.swift`
|
|
208
|
-
- `Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift`
|
|
209
|
-
|
|
210
|
-
## Prioritized Roadmap
|
|
211
|
-
|
|
212
|
-
### Now (1-2 weeks)
|
|
213
|
-
|
|
214
|
-
1. Project identity normalization and project-name confidence
|
|
215
|
-
2. Reliability Policy Score (fallback/retry/cooldown diagnostics)
|
|
216
|
-
3. Routing Advisor v1 (baseline simulation only, no ML training)
|
|
217
|
-
|
|
218
|
-
Acceptance criteria:
|
|
219
|
-
- Insights show stable project names across refresh cycles.
|
|
220
|
-
- At least one actionable routing recommendation per active project.
|
|
221
|
-
- Policy score visible for each enabled provider.
|
|
222
|
-
|
|
223
|
-
### Next (2-4 weeks)
|
|
224
|
-
|
|
225
|
-
1. Eval-Linked Spend Analytics (Promptfoo/OpenAI Evals import)
|
|
226
|
-
2. Semantic Cache Opportunity Analyzer (fingerprint-based)
|
|
227
|
-
3. OTel GenAI export (file or endpoint sink)
|
|
228
|
-
|
|
229
|
-
Acceptance criteria:
|
|
230
|
-
- Can correlate eval deltas with cost deltas per project and time window.
|
|
231
|
-
- Can quantify estimated avoidable spend from repeated prompt patterns.
|
|
232
|
-
- External tools can ingest standardized Runic telemetry fields.
|
|
233
|
-
|
|
234
|
-
### Later (4+ weeks)
|
|
235
|
-
|
|
236
|
-
1. MCP tool/prompt analytics and heatmaps
|
|
237
|
-
2. Advanced routing policies (bandit/learned router plugins)
|
|
238
|
-
3. Team-level governance pack (policy presets, compliance reports)
|
|
239
|
-
|
|
240
|
-
Acceptance criteria:
|
|
241
|
-
- MCP-heavy teams can see tool reliability and prompt effectiveness trends.
|
|
242
|
-
- Multi-provider routing decisions can be tuned with measurable outcomes.
|
|
243
|
-
|
|
244
|
-
## Notes on methodology
|
|
245
|
-
|
|
246
|
-
- Preference was given to primary sources (paper pages, official repos/docs).
|
|
247
|
-
- Claims are interpreted conservatively; recommendations emphasize robust baselines first.
|
|
248
|
-
- Research intent here is product-directional, not a claim of guaranteed gain in every workload.
|