@sriinnu/runic 1.2.0 → 2.0.0
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 +11 -0
- package/README.md +8 -1
- package/RuniciOS/Core/RunicTypographyiOS.swift +24 -0
- package/RuniciOS/Views/ProviderDetailView.swift +9 -9
- package/RuniciOS/Views/ProviderListView.swift +10 -10
- package/RuniciOS/Widgets/LargeWidget.swift +14 -14
- package/RuniciOS/Widgets/LiveActivity.swift +19 -19
- package/RuniciOS/Widgets/LockScreenWidget.swift +15 -15
- package/RuniciOS/Widgets/MediumWidget.swift +10 -10
- package/RuniciOS/Widgets/RunicWidget.swift +5 -5
- package/RuniciOS/Widgets/SmallWidget.swift +9 -9
- package/Sources/Runic/About.swift +3 -3
- package/Sources/Runic/AppNotifications.swift +5 -3
- package/Sources/Runic/Controllers/StatusItemController+Actions.swift +7 -3
- package/Sources/Runic/Controllers/StatusItemController+Animation.swift +5 -4
- package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +30 -16
- package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +6 -3
- package/Sources/Runic/Controllers/StatusItemController+Menu.swift +18 -13
- package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +6 -4
- package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +40 -12
- package/Sources/Runic/Controllers/StatusItemController.swift +43 -43
- package/Sources/Runic/Core/BudgetNotificationManager.swift +2 -1
- package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +2 -2
- package/Sources/Runic/Core/Login/CodexLoginRunner.swift +1 -1
- package/Sources/Runic/Core/Login/CursorLoginRunner.swift +4 -4
- package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +1 -1
- package/Sources/Runic/Core/Rendering/IconRenderer.swift +91 -85
- package/Sources/Runic/Core/Rendering/IconView.swift +3 -1
- package/Sources/Runic/Core/RunicColors.swift +6 -6
- package/Sources/Runic/Core/RunicSpacing.swift +7 -7
- package/Sources/Runic/Core/RunicTypography.swift +206 -0
- package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/CohereTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/CustomProviderStore.swift +10 -10
- package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/GroqTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/KimiTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +1 -3
- package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +1 -3
- package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/MistralTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +1 -1
- package/Sources/Runic/Core/Stores/QwenTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/SettingsStore.swift +89 -51
- package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +19 -6
- package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +1 -1
- package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +1 -1
- package/Sources/Runic/Core/Stores/UsageStore.swift +187 -161
- package/Sources/Runic/Core/Stores/XAITokenStore.swift +1 -3
- package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +1 -2
- package/Sources/Runic/Core/UsageExporter.swift +8 -4
- package/Sources/Runic/ProviderRegistry.swift +1 -1
- package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +5 -2
- package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +1 -1
- package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +1 -1
- package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +1 -1
- package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +1 -1
- 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/RunicApp.swift +46 -36
- package/Sources/Runic/SessionQuotaNotifications.swift +2 -2
- package/Sources/Runic/UsagePaceText.swift +1 -1
- package/Sources/Runic/UsageProgressBar.swift +13 -9
- package/Sources/Runic/Utilities/LoadingPattern.swift +4 -2
- package/Sources/Runic/Utilities/PerformanceConstants.swift +28 -28
- package/Sources/Runic/Views/Menu/AlertsMenuView.swift +19 -21
- package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +19 -19
- package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +7 -7
- package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +5 -5
- package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +29 -30
- package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +20 -17
- package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +14 -14
- package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +12 -10
- package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +3 -4
- package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +5 -25
- package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +1 -1
- package/Sources/Runic/Views/Menu/MenuCardView.swift +120 -131
- package/Sources/Runic/Views/Menu/MenuContent.swift +11 -8
- package/Sources/Runic/Views/Menu/MenuDescriptor.swift +4 -2
- package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +1 -8
- package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +20 -14
- package/Sources/Runic/Views/Menu/OverviewMenuView.swift +18 -15
- package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +16 -11
- package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +27 -27
- package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +4 -6
- package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +24 -11
- package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +5 -5
- package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +7 -8
- package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +22 -17
- package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +8 -7
- package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +7 -7
- package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +50 -47
- package/Sources/Runic/Views/Preferences/LiquidComponents.swift +15 -14
- package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +7 -7
- package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +27 -27
- package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +38 -42
- package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +39 -43
- package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +21 -21
- package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +7 -7
- package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +49 -50
- package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +10 -10
- package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +40 -21
- package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +7 -7
- package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +44 -39
- package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +26 -23
- package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +271 -226
- package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +6 -2
- package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +7 -5
- package/Sources/Runic/Views/Preferences/PreferencesView.swift +38 -31
- package/Sources/Runic/Views/Rating/QualityRatingView.swift +11 -11
- package/Sources/Runic/Views/Team/TeamDashboardView.swift +29 -24
- package/Sources/Runic/Views/Team/TeamInviteSheet.swift +16 -16
- package/Sources/Runic/Views/Team/TeamManagementView.swift +50 -49
- package/Sources/Runic/Views/Team/TeamMemberRow.swift +8 -8
- package/Sources/RunicCLI/CLIEntry.swift +83 -42
- package/Sources/RunicCLI/CLIRenderer.swift +1 -1
- package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +60 -60
- package/Sources/RunicCLI/Commands/ModelsCommand.swift +45 -44
- package/Sources/RunicCLI/Commands/ProjectsCommand.swift +83 -69
- package/Sources/RunicCLI/Commands/ResetCommand.swift +50 -49
- package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +31 -32
- package/Sources/RunicClaudeWebProbe/main.swift +1 -1
- package/Sources/RunicCore/AlertRuleStore.swift +20 -20
- package/Sources/RunicCore/BrowserCookieImportOrder.swift +3 -3
- package/Sources/RunicCore/CostUsageModels.swift +1 -1
- package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +29 -30
- package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +73 -75
- package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +53 -109
- package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +3 -3
- package/Sources/RunicCore/Integrations/GitHubIntegration.swift +3 -3
- package/Sources/RunicCore/Models/EnhancedUsageModels.swift +47 -48
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +1 -1
- package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +1 -1
- package/Sources/RunicCore/Performance/PerformanceModels.swift +4 -4
- package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +81 -64
- package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +2 -2
- package/Sources/RunicCore/ProjectBudgetStore.swift +15 -12
- package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +2 -2
- package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +3 -3
- package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +8 -8
- package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +3 -3
- package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +6 -6
- package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +3 -7
- package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +3 -3
- package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +4 -4
- package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +3 -1
- package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +1 -1
- package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +1 -1
- package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +3 -1
- package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +5 -3
- package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +3 -3
- package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +7 -4
- package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +4 -4
- package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +5 -3
- package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +9 -10
- package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +4 -4
- package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +2 -2
- package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +5 -2
- package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +10 -5
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +7 -7
- package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +10 -10
- package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +23 -10
- package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +2 -2
- package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +2 -2
- package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +5 -3
- package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +26 -13
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +5 -5
- package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +1 -1
- package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +3 -3
- package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +2 -2
- package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +2 -2
- package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +4 -2
- package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +48 -21
- package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +76 -77
- package/Sources/RunicCore/Sync/SyncConflictResolver.swift +55 -58
- package/Sources/RunicCore/Sync/SyncProtocol.swift +21 -22
- package/Sources/RunicCore/Sync/SyncRecord.swift +46 -49
- package/Sources/RunicCore/Sync/SyncUsageExample.swift +44 -50
- package/Sources/RunicCore/Sync/TeamSyncRecords.swift +94 -101
- package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +51 -46
- package/Sources/RunicCore/Team/TeamModels.swift +111 -110
- package/Sources/RunicCore/Team/TeamStore.swift +126 -109
- package/Sources/RunicCore/UsageFetcher.swift +2 -2
- package/Sources/RunicCore/UsageFormatter.swift +25 -25
- package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +27 -13
- package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +11 -3
- package/Sources/RunicCore/UsageLedger/LedgerCache.swift +5 -2
- package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +1 -1
- package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +40 -25
- package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +1 -1
- package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +55 -16
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +6 -6
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +1 -1
- package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +2 -2
- package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +5 -5
- package/Tests/RunicTests/AppDelegateTests.swift +8 -3
- package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +2 -3
- package/Tests/RunicTests/CLIArgumentParsingTests.swift +3 -4
- package/Tests/RunicTests/CLICostTests.swift +6 -7
- package/Tests/RunicTests/CLIProviderSelectionTests.swift +2 -3
- package/Tests/RunicTests/CLISnapshotTests.swift +3 -4
- package/Tests/RunicTests/CLIWebFallbackTests.swift +3 -4
- package/Tests/RunicTests/ClaudeOAuthTests.swift +11 -12
- package/Tests/RunicTests/ClaudeResilienceTests.swift +3 -4
- package/Tests/RunicTests/ClaudeUsageTests.swift +20 -21
- package/Tests/RunicTests/CodexOAuthTests.swift +7 -8
- package/Tests/RunicTests/CodexUsageLogSourceTests.swift +1 -3
- package/Tests/RunicTests/CopilotTokenResolverTests.swift +5 -6
- package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +4 -5
- package/Tests/RunicTests/CostUsageDecodingTests.swift +15 -17
- package/Tests/RunicTests/CostUsagePricingTests.swift +5 -7
- package/Tests/RunicTests/CostUsageScannerTests.swift +10 -12
- package/Tests/RunicTests/CursorStatusProbeTests.swift +15 -16
- package/Tests/RunicTests/FactoryStatusProbeTests.swift +3 -5
- package/Tests/RunicTests/GeminiLoginAlertTests.swift +3 -4
- package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +11 -11
- package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +8 -8
- package/Tests/RunicTests/GeminiStatusProbeTests.swift +20 -21
- package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +2 -3
- package/Tests/RunicTests/InstallOriginTests.swift +1 -2
- package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +2 -2
- package/Tests/RunicTests/LiveAccountTests.swift +3 -3
- package/Tests/RunicTests/LoadingPatternTests.swift +3 -4
- package/Tests/RunicTests/MenuCardModelTests.swift +33 -34
- package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +4 -1
- package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +4 -1
- package/Tests/RunicTests/MiniMaxParsingTests.swift +4 -5
- package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +4 -1
- package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +4 -6
- package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +1 -2
- package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +5 -6
- package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +2 -3
- package/Tests/RunicTests/OpenAIDashboardParserTests.swift +12 -13
- package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +17 -6
- package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +52 -13
- package/Tests/RunicTests/PathBuilderTests.swift +14 -15
- package/Tests/RunicTests/ProviderFetchPipelineTests.swift +3 -4
- package/Tests/RunicTests/ProviderIconResourcesTests.swift +1 -2
- package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +1 -2
- package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +53 -19
- package/Tests/RunicTests/ProviderToggleStoreTests.swift +10 -11
- package/Tests/RunicTests/RunicTests.swift +6 -7
- package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +5 -6
- package/Tests/RunicTests/SettingsStoreTests.swift +149 -45
- package/Tests/RunicTests/StatusItemAnimationTests.swift +8 -3
- package/Tests/RunicTests/StatusMenuTests.swift +63 -22
- package/Tests/RunicTests/StatusProbeTests.swift +28 -29
- package/Tests/RunicTests/SubprocessRunnerTests.swift +1 -3
- package/Tests/RunicTests/SubscriptionDetectionTests.swift +8 -9
- package/Tests/RunicTests/TTYCommandRunnerTests.swift +8 -9
- package/Tests/RunicTests/TeamShowbackExporterTests.swift +2 -4
- package/Tests/RunicTests/TextParsingTests.swift +1 -2
- package/Tests/RunicTests/UsageFormatterTests.swift +15 -16
- package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +12 -14
- package/Tests/RunicTests/UsageLedgerForecastTests.swift +4 -6
- package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +7 -9
- package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +6 -8
- package/Tests/RunicTests/UsagePaceTests.swift +5 -6
- package/Tests/RunicTests/UsagePaceTextTests.swift +8 -9
- package/Tests/RunicTests/UsagePolicyEngineTests.swift +3 -5
- package/Tests/RunicTests/WidgetSnapshotTests.swift +1 -3
- package/Tests/RunicTests/ZaiProviderTests.swift +3 -5
- package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +4 -1
- package/appcast.xml +36 -76
- package/package.json +1 -1
- package/runic.png +0 -0
- package/runic.svg +15 -0
- package/version.env +2 -2
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import Testing
|
|
3
|
-
|
|
4
3
|
@testable import RunicCore
|
|
5
4
|
|
|
6
|
-
@Suite
|
|
7
5
|
struct UsageLedgerInsightsAdvisorTests {
|
|
8
6
|
@Test
|
|
9
|
-
func
|
|
7
|
+
func `reliability score drops when errors exist`() {
|
|
10
8
|
let now = Date()
|
|
11
9
|
let daily = UsageLedgerDailySummary(
|
|
12
10
|
provider: .codex,
|
|
@@ -14,7 +12,7 @@ struct UsageLedgerInsightsAdvisorTests {
|
|
|
14
12
|
dayStart: now,
|
|
15
13
|
dayKey: "2026-02-21",
|
|
16
14
|
totals: UsageLedgerTotals(
|
|
17
|
-
inputTokens:
|
|
15
|
+
inputTokens: 1000,
|
|
18
16
|
outputTokens: 500,
|
|
19
17
|
cacheCreationTokens: 100,
|
|
20
18
|
cacheReadTokens: 200,
|
|
@@ -44,7 +42,7 @@ struct UsageLedgerInsightsAdvisorTests {
|
|
|
44
42
|
}
|
|
45
43
|
|
|
46
44
|
@Test
|
|
47
|
-
func
|
|
45
|
+
func `routing recommendation finds savings between models`() {
|
|
48
46
|
let expensive = UsageLedgerModelSummary(
|
|
49
47
|
provider: .codex,
|
|
50
48
|
projectID: "proj-a",
|
|
@@ -52,8 +50,8 @@ struct UsageLedgerInsightsAdvisorTests {
|
|
|
52
50
|
model: "gpt-5",
|
|
53
51
|
entryCount: 20,
|
|
54
52
|
totals: UsageLedgerTotals(
|
|
55
|
-
inputTokens:
|
|
56
|
-
outputTokens:
|
|
53
|
+
inputTokens: 30000,
|
|
54
|
+
outputTokens: 20000,
|
|
57
55
|
cacheCreationTokens: 0,
|
|
58
56
|
cacheReadTokens: 0,
|
|
59
57
|
costUSD: 12.0))
|
|
@@ -65,8 +63,8 @@ struct UsageLedgerInsightsAdvisorTests {
|
|
|
65
63
|
model: "gpt-5-mini",
|
|
66
64
|
entryCount: 30,
|
|
67
65
|
totals: UsageLedgerTotals(
|
|
68
|
-
inputTokens:
|
|
69
|
-
outputTokens:
|
|
66
|
+
inputTokens: 40000,
|
|
67
|
+
outputTokens: 20000,
|
|
70
68
|
cacheCreationTokens: 0,
|
|
71
69
|
cacheReadTokens: 0,
|
|
72
70
|
costUSD: 3.0))
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import Testing
|
|
3
|
-
|
|
4
3
|
@testable import RunicCore
|
|
5
4
|
|
|
6
|
-
@Suite
|
|
7
5
|
struct UsageLedgerProjectNameTests {
|
|
8
6
|
@Test
|
|
9
|
-
func
|
|
7
|
+
func `project summaries prefer non empty project name`() {
|
|
10
8
|
let now = Date()
|
|
11
9
|
let entries = [
|
|
12
10
|
UsageLedgerEntry(
|
|
@@ -53,7 +51,7 @@ struct UsageLedgerProjectNameTests {
|
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
@Test
|
|
56
|
-
func
|
|
54
|
+
func `project summaries group by inferred name when project ID is missing`() {
|
|
57
55
|
let now = Date()
|
|
58
56
|
let entries = [
|
|
59
57
|
UsageLedgerEntry(
|
|
@@ -92,13 +90,13 @@ struct UsageLedgerProjectNameTests {
|
|
|
92
90
|
|
|
93
91
|
let summaries = UsageLedgerAggregator.projectSummaries(entries: entries)
|
|
94
92
|
#expect(summaries.count == 2)
|
|
95
|
-
let names = Set(summaries.map(\.projectName).compactMap
|
|
93
|
+
let names = Set(summaries.map(\.projectName).compactMap(\.self))
|
|
96
94
|
#expect(names.contains("Alpha Workspace"))
|
|
97
95
|
#expect(names.contains("Beta Workspace"))
|
|
98
96
|
}
|
|
99
97
|
|
|
100
98
|
@Test
|
|
101
|
-
func
|
|
99
|
+
func `project summaries infer project name from path like identifier`() {
|
|
102
100
|
let now = Date()
|
|
103
101
|
let entries = [
|
|
104
102
|
UsageLedgerEntry(
|
|
@@ -127,7 +125,7 @@ struct UsageLedgerProjectNameTests {
|
|
|
127
125
|
}
|
|
128
126
|
|
|
129
127
|
@Test
|
|
130
|
-
func
|
|
128
|
+
func `project display name falls back to readable identifier`() {
|
|
131
129
|
let summary = UsageLedgerProjectSummary(
|
|
132
130
|
provider: .codex,
|
|
133
131
|
projectID: "runic-core",
|
|
@@ -148,7 +146,7 @@ struct UsageLedgerProjectNameTests {
|
|
|
148
146
|
}
|
|
149
147
|
|
|
150
148
|
@Test
|
|
151
|
-
func
|
|
149
|
+
func `project display name keeps opaque identifiers hidden`() {
|
|
152
150
|
let summary = UsageLedgerProjectSummary(
|
|
153
151
|
provider: .codex,
|
|
154
152
|
projectID: "8f189f6bb4e9fa93a9a4bf5cf97a0b4d",
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import RunicCore
|
|
2
1
|
import Foundation
|
|
2
|
+
import RunicCore
|
|
3
3
|
import Testing
|
|
4
4
|
|
|
5
|
-
@Suite
|
|
6
5
|
struct UsagePaceTests {
|
|
7
6
|
@Test
|
|
8
|
-
func
|
|
7
|
+
func `weekly pace computes delta and eta`() {
|
|
9
8
|
let now = Date(timeIntervalSince1970: 0)
|
|
10
9
|
let window = RateWindow(
|
|
11
10
|
usedPercent: 50,
|
|
@@ -26,7 +25,7 @@ struct UsagePaceTests {
|
|
|
26
25
|
}
|
|
27
26
|
|
|
28
27
|
@Test
|
|
29
|
-
func
|
|
28
|
+
func `weekly pace marks lasts to reset when usage is low`() {
|
|
30
29
|
let now = Date(timeIntervalSince1970: 0)
|
|
31
30
|
let window = RateWindow(
|
|
32
31
|
usedPercent: 5,
|
|
@@ -44,7 +43,7 @@ struct UsagePaceTests {
|
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
@Test
|
|
47
|
-
func
|
|
46
|
+
func `weekly pace hides when reset missing or outside window`() {
|
|
48
47
|
let now = Date(timeIntervalSince1970: 0)
|
|
49
48
|
let missing = RateWindow(
|
|
50
49
|
usedPercent: 10,
|
|
@@ -62,7 +61,7 @@ struct UsagePaceTests {
|
|
|
62
61
|
}
|
|
63
62
|
|
|
64
63
|
@Test
|
|
65
|
-
func
|
|
64
|
+
func `weekly pace hides when usage exists but no elapsed`() {
|
|
66
65
|
let now = Date(timeIntervalSince1970: 0)
|
|
67
66
|
let window = RateWindow(
|
|
68
67
|
usedPercent: 12,
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import RunicCore
|
|
2
1
|
import Foundation
|
|
2
|
+
import RunicCore
|
|
3
3
|
import Testing
|
|
4
4
|
@testable import Runic
|
|
5
5
|
|
|
6
|
-
@Suite
|
|
7
6
|
struct UsagePaceTextTests {
|
|
8
7
|
@Test
|
|
9
|
-
func
|
|
8
|
+
func `weekly pace text includes eta when running out before reset`() {
|
|
10
9
|
let now = Date(timeIntervalSince1970: 0)
|
|
11
10
|
let window = RateWindow(
|
|
12
11
|
usedPercent: 50,
|
|
@@ -20,7 +19,7 @@ struct UsagePaceTextTests {
|
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
@Test
|
|
23
|
-
func
|
|
22
|
+
func `weekly pace text shows reset safe when pace is slow`() {
|
|
24
23
|
let now = Date(timeIntervalSince1970: 0)
|
|
25
24
|
let window = RateWindow(
|
|
26
25
|
usedPercent: 10,
|
|
@@ -34,7 +33,7 @@ struct UsagePaceTextTests {
|
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
@Test
|
|
37
|
-
func
|
|
36
|
+
func `weekly pace text hides when reset is missing`() {
|
|
38
37
|
let now = Date(timeIntervalSince1970: 0)
|
|
39
38
|
let window = RateWindow(
|
|
40
39
|
usedPercent: 10,
|
|
@@ -48,7 +47,7 @@ struct UsagePaceTextTests {
|
|
|
48
47
|
}
|
|
49
48
|
|
|
50
49
|
@Test
|
|
51
|
-
func
|
|
50
|
+
func `weekly pace text hides when reset is in past or too far`() {
|
|
52
51
|
let now = Date(timeIntervalSince1970: 0)
|
|
53
52
|
let pastWindow = RateWindow(
|
|
54
53
|
usedPercent: 10,
|
|
@@ -66,7 +65,7 @@ struct UsagePaceTextTests {
|
|
|
66
65
|
}
|
|
67
66
|
|
|
68
67
|
@Test
|
|
69
|
-
func
|
|
68
|
+
func `weekly pace text hides when no elapsed but usage exists`() {
|
|
70
69
|
let now = Date(timeIntervalSince1970: 0)
|
|
71
70
|
let window = RateWindow(
|
|
72
71
|
usedPercent: 5,
|
|
@@ -80,7 +79,7 @@ struct UsagePaceTextTests {
|
|
|
80
79
|
}
|
|
81
80
|
|
|
82
81
|
@Test
|
|
83
|
-
func
|
|
82
|
+
func `weekly pace text hides when too early in window`() {
|
|
84
83
|
let now = Date(timeIntervalSince1970: 0)
|
|
85
84
|
let window = RateWindow(
|
|
86
85
|
usedPercent: 40,
|
|
@@ -94,7 +93,7 @@ struct UsagePaceTextTests {
|
|
|
94
93
|
}
|
|
95
94
|
|
|
96
95
|
@Test
|
|
97
|
-
func
|
|
96
|
+
func `weekly pace text hides when usage is depleted`() {
|
|
98
97
|
let now = Date(timeIntervalSince1970: 0)
|
|
99
98
|
let window = RateWindow(
|
|
100
99
|
usedPercent: 100,
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import Testing
|
|
2
|
-
|
|
3
2
|
@testable import RunicCore
|
|
4
3
|
|
|
5
|
-
@Suite
|
|
6
4
|
struct UsagePolicyEngineTests {
|
|
7
5
|
@Test
|
|
8
|
-
func
|
|
6
|
+
func `returns none when no rules match`() {
|
|
9
7
|
let context = UsagePolicyContext(
|
|
10
8
|
provider: .codex,
|
|
11
9
|
observedSpendUSD: 45,
|
|
@@ -33,7 +31,7 @@ struct UsagePolicyEngineTests {
|
|
|
33
31
|
}
|
|
34
32
|
|
|
35
33
|
@Test
|
|
36
|
-
func
|
|
34
|
+
func `selects strongest action across matched rules`() {
|
|
37
35
|
let context = UsagePolicyContext(
|
|
38
36
|
provider: .codex,
|
|
39
37
|
observedSpendUSD: 120,
|
|
@@ -69,7 +67,7 @@ struct UsagePolicyEngineTests {
|
|
|
69
67
|
}
|
|
70
68
|
|
|
71
69
|
@Test
|
|
72
|
-
func
|
|
70
|
+
func `projected overrun condition respects threshold`() {
|
|
73
71
|
let context = UsagePolicyContext(
|
|
74
72
|
provider: .codex,
|
|
75
73
|
observedSpendUSD: 80,
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import Foundation
|
|
2
2
|
import Testing
|
|
3
|
-
|
|
4
3
|
@testable import RunicCore
|
|
5
4
|
|
|
6
|
-
@Suite
|
|
7
5
|
struct WidgetSnapshotTests {
|
|
8
6
|
@Test
|
|
9
|
-
func
|
|
7
|
+
func `widget snapshot round trip`() throws {
|
|
10
8
|
let entry = WidgetSnapshot.ProviderEntry(
|
|
11
9
|
provider: .codex,
|
|
12
10
|
updatedAt: Date(),
|
|
@@ -2,25 +2,23 @@ import Foundation
|
|
|
2
2
|
import Testing
|
|
3
3
|
@testable import RunicCore
|
|
4
4
|
|
|
5
|
-
@Suite
|
|
6
5
|
struct ZaiSettingsReaderTests {
|
|
7
6
|
@Test
|
|
8
|
-
func
|
|
7
|
+
func `api token reads from environment`() {
|
|
9
8
|
let token = ZaiSettingsReader.apiToken(environment: ["Z_AI_API_KEY": "abc123"])
|
|
10
9
|
#expect(token == "abc123")
|
|
11
10
|
}
|
|
12
11
|
|
|
13
12
|
@Test
|
|
14
|
-
func
|
|
13
|
+
func `api token strips quotes`() {
|
|
15
14
|
let token = ZaiSettingsReader.apiToken(environment: ["Z_AI_API_KEY": "\"token-xyz\""])
|
|
16
15
|
#expect(token == "token-xyz")
|
|
17
16
|
}
|
|
18
17
|
}
|
|
19
18
|
|
|
20
|
-
@Suite
|
|
21
19
|
struct ZaiUsageSnapshotTests {
|
|
22
20
|
@Test
|
|
23
|
-
func
|
|
21
|
+
func `maps usage snapshot windows`() {
|
|
24
22
|
let reset = Date(timeIntervalSince1970: 123)
|
|
25
23
|
let tokenLimit = ZaiLimitEntry(
|
|
26
24
|
type: .tokensLimit,
|
package/appcast.xml
CHANGED
|
@@ -3,102 +3,62 @@
|
|
|
3
3
|
<channel>
|
|
4
4
|
<title>Runic</title>
|
|
5
5
|
<item>
|
|
6
|
-
<title>
|
|
7
|
-
<pubDate>
|
|
8
|
-
<link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
|
|
9
|
-
<sparkle:version>49</sparkle:version>
|
|
10
|
-
<sparkle:shortVersionString>1.1.0</sparkle:shortVersionString>
|
|
11
|
-
<sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
|
|
12
|
-
<description><![CDATA[<h2>Runic 1.1.0</h2>
|
|
13
|
-
<ul>
|
|
14
|
-
<li>Overview dashboard with activity ring, context windows, reset countdowns</li>
|
|
15
|
-
<li>Context windows from config file (no recompile needed)</li>
|
|
16
|
-
<li>Parallel provider refresh (concurrent instead of sequential)</li>
|
|
17
|
-
<li>Keychain ACL fix (no more password prompts on relaunch)</li>
|
|
18
|
-
</ul>
|
|
19
|
-
]]></description>
|
|
20
|
-
<enclosure url="https://github.com/sriinnu/Runic/releases/download/v1.1.0/Runic-1.1.0.zip" length="30807384" type="application/octet-stream" sparkle:edSignature="hXMeE/CLrSDV+kbFythUA6w84WQ7u0YpvXK6uI58QHfBAn2FpH98xWERNfyL55gxBULdMASXzpv1UxmjtRFjCg=="/>
|
|
21
|
-
</item>
|
|
22
|
-
<item>
|
|
23
|
-
<title>1.0.0</title>
|
|
24
|
-
<pubDate>Sat, 22 Mar 2026 18:00:00 +0100</pubDate>
|
|
25
|
-
<link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
|
|
26
|
-
<sparkle:version>48</sparkle:version>
|
|
27
|
-
<sparkle:shortVersionString>1.0.0</sparkle:shortVersionString>
|
|
28
|
-
<sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
|
|
29
|
-
<description><![CDATA[<h2>Runic 1.0.0</h2>
|
|
30
|
-
<ul>
|
|
31
|
-
<li>26 AI providers including Vertex AI and Qwen/DashScope</li>
|
|
32
|
-
<li>Inline line charts (1h/6h/1d/7d/30d), hourly/weekly bar charts</li>
|
|
33
|
-
<li>Provider tab bar with brand icons and Overview tab</li>
|
|
34
|
-
<li>Hero stat, glassmorphism cards with sparklines</li>
|
|
35
|
-
<li>Subscription utilization and usage window comparison charts</li>
|
|
36
|
-
<li>Export usage as CSV or JSON</li>
|
|
37
|
-
<li>Budget breach notifications</li>
|
|
38
|
-
<li>Dark/Light/System theme</li>
|
|
39
|
-
<li>Liquid UI animations</li>
|
|
40
|
-
</ul>
|
|
41
|
-
]]></description>
|
|
42
|
-
<enclosure url="https://github.com/sriinnu/Runic/releases/download/v1.0.0/Runic-1.0.0.zip" length="30772430" type="application/octet-stream" sparkle:edSignature="a065lJa+Gwv2mH8DcniAxFW4tHB2JD4ZnT39+tXWs0k4p+Zq61WKi699aowEf8HakfgnSU7OQ3YdL5X0XYn7CQ=="/>
|
|
43
|
-
</item>
|
|
44
|
-
<item>
|
|
45
|
-
<title>0.16.0</title>
|
|
46
|
-
<pubDate>Mon, 29 Dec 2025 19:03:57 +0100</pubDate>
|
|
6
|
+
<title>2.0.0</title>
|
|
7
|
+
<pubDate>Fri, 27 Mar 2026 18:53:39 +0100</pubDate>
|
|
47
8
|
<link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
|
|
48
|
-
<sparkle:version>
|
|
49
|
-
<sparkle:shortVersionString>0.
|
|
9
|
+
<sparkle:version>51</sparkle:version>
|
|
10
|
+
<sparkle:shortVersionString>2.0.0</sparkle:shortVersionString>
|
|
50
11
|
<sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
|
|
51
|
-
<description><![CDATA[<h2>Runic 0.
|
|
12
|
+
<description><![CDATA[<h2>Runic 2.0.0</h2>
|
|
52
13
|
<ul>
|
|
53
|
-
<li>
|
|
54
|
-
<li>
|
|
55
|
-
<li>
|
|
56
|
-
<li>
|
|
57
|
-
<li>
|
|
58
|
-
<li>
|
|
59
|
-
<li>
|
|
60
|
-
<li>
|
|
14
|
+
<li>Typography: custom font system with 7 bundled families (Fira Code, JetBrains Mono, IBM Plex Mono, Space Mono, Inconsolata, Caveat, SF Pro/Mono)</li>
|
|
15
|
+
<li>Typography: live font switching from Settings > General — no restart needed</li>
|
|
16
|
+
<li>Typography: RunicTypography design tokens with dynamic RunicFont scale across 600+ font call sites</li>
|
|
17
|
+
<li>Typography: drop-in font extensibility — add TTF/OTF to Resources/Fonts, rebuild, auto-discovered</li>
|
|
18
|
+
<li>Typography: font preview in picker — each choice rendered in its own typeface</li>
|
|
19
|
+
<li>Typography: NSMenuItem post-processor applies selected font to all plain menu items</li>
|
|
20
|
+
<li>Typography: xLarge dynamic type for slightly larger text across the app</li>
|
|
21
|
+
<li>Menu: wider card base width (310→340pt) for monospaced font comfort</li>
|
|
22
|
+
<li>iOS: RunicFont enum for consistent monospaced typography across widgets and views</li>
|
|
61
23
|
</ul>
|
|
62
24
|
<p><a href="https://github.com/sriinnu/Runic/blob/main/CHANGELOG.md">View full changelog</a></p>
|
|
63
25
|
]]></description>
|
|
64
|
-
<enclosure url="https://github.com/sriinnu/Runic/releases/download/
|
|
26
|
+
<enclosure url="https://github.com/sriinnu/Runic/releases/download/v2.0.0/Runic-2.0.0.zip" length="35394004" type="application/octet-stream" sparkle:edSignature="VIBJ2AnXWmsFN2J6sm/FooxOkhx4L9W8Ew9dF3yR1QnNVl2Bhvo2GKprn8102F6M1/EZMzvLHNd8xfrsiJuyBQ=="/>
|
|
65
27
|
</item>
|
|
66
28
|
<item>
|
|
67
|
-
<title>
|
|
68
|
-
<pubDate>
|
|
29
|
+
<title>1.2.0</title>
|
|
30
|
+
<pubDate>Tue, 25 Mar 2026 21:00:00 +0100</pubDate>
|
|
69
31
|
<link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
|
|
70
|
-
<sparkle:version>
|
|
71
|
-
<sparkle:shortVersionString>
|
|
32
|
+
<sparkle:version>50</sparkle:version>
|
|
33
|
+
<sparkle:shortVersionString>1.2.0</sparkle:shortVersionString>
|
|
72
34
|
<sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
|
|
73
|
-
<description><![CDATA[<h2>Runic
|
|
35
|
+
<description><![CDATA[<h2>Runic 1.2.0</h2>
|
|
74
36
|
<ul>
|
|
75
|
-
<li>
|
|
76
|
-
<li>
|
|
77
|
-
<li>
|
|
78
|
-
<li>
|
|
37
|
+
<li>14 security fixes (HTTPS enforcement, log redaction, file permissions, keychain hardening)</li>
|
|
38
|
+
<li>Ledger cache for instant display on menu open</li>
|
|
39
|
+
<li>Clean project names (AI/Runic instead of full directory paths)</li>
|
|
40
|
+
<li>Parallel provider refresh</li>
|
|
41
|
+
<li>Overview dashboard with context windows</li>
|
|
79
42
|
</ul>
|
|
80
|
-
<ul>
|
|
81
|
-
<li>CI: stabilize Claude CLI version detection test.</li>
|
|
82
|
-
</ul>
|
|
83
|
-
<p><a href="https://github.com/sriinnu/Runic/blob/main/CHANGELOG.md">View full changelog</a></p>
|
|
84
43
|
]]></description>
|
|
85
|
-
<enclosure url="https://github.com/sriinnu/Runic/releases/download/
|
|
44
|
+
<enclosure url="https://github.com/sriinnu/Runic/releases/download/v1.2.0/Runic-1.2.0.zip" length="31042134" type="application/octet-stream" sparkle:edSignature="L8UpDLPKB4QSgpCddUUe5u4aQQjqpW2r2lUbYnKmK+pBtIFMg74m3mMgEP5v1fTYjMGzPVRj7W9AFovNUAY7Dg=="/>
|
|
86
45
|
</item>
|
|
87
46
|
<item>
|
|
88
|
-
<title>
|
|
89
|
-
<pubDate>Sun,
|
|
47
|
+
<title>1.1.0</title>
|
|
48
|
+
<pubDate>Sun, 23 Mar 2026 00:00:00 +0100</pubDate>
|
|
90
49
|
<link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
|
|
91
|
-
<sparkle:version>
|
|
92
|
-
<sparkle:shortVersionString>
|
|
50
|
+
<sparkle:version>49</sparkle:version>
|
|
51
|
+
<sparkle:shortVersionString>1.1.0</sparkle:shortVersionString>
|
|
93
52
|
<sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
|
|
94
|
-
<description><![CDATA[<h2>Runic
|
|
53
|
+
<description><![CDATA[<h2>Runic 1.1.0</h2>
|
|
95
54
|
<ul>
|
|
96
|
-
<li>
|
|
97
|
-
<li>
|
|
55
|
+
<li>Overview dashboard with activity ring, context windows, reset countdowns</li>
|
|
56
|
+
<li>Context windows from config file (no recompile needed)</li>
|
|
57
|
+
<li>Parallel provider refresh (concurrent instead of sequential)</li>
|
|
58
|
+
<li>Keychain ACL fix (no more password prompts on relaunch)</li>
|
|
98
59
|
</ul>
|
|
99
|
-
<p><a href="https://github.com/sriinnu/Runic/blob/main/CHANGELOG.md">View full changelog</a></p>
|
|
100
60
|
]]></description>
|
|
101
|
-
<enclosure url="https://github.com/sriinnu/Runic/releases/download/
|
|
61
|
+
<enclosure url="https://github.com/sriinnu/Runic/releases/download/v1.1.0/Runic-1.1.0.zip" length="30807384" type="application/octet-stream" sparkle:edSignature="hXMeE/CLrSDV+kbFythUA6w84WQ7u0YpvXK6uI58QHfBAn2FpH98xWERNfyL55gxBULdMASXzpv1UxmjtRFjCg=="/>
|
|
102
62
|
</item>
|
|
103
63
|
<item>
|
|
104
64
|
<title>0.14.0</title>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sriinnu/runic",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "AI usage monitoring for your Mac menubar. Track usage, costs, and quotas across 26 AI providers.",
|
|
5
5
|
"author": "Srinivas Pendela <sriinnu@users.noreply.github.com>",
|
|
6
6
|
"license": "MIT",
|
package/runic.png
CHANGED
|
Binary file
|
package/runic.svg
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 400" fill="none">
|
|
2
|
+
<!-- Infinity symbol with usage bars — Runic logo -->
|
|
3
|
+
<!-- Main infinity (teal) -->
|
|
4
|
+
<path d="M256 160c-40-56-80-88-120-88-66 0-120 54-120 120s54 120 120 120c40 0 80-32 120-88 40 56 80 88 120 88 66 0 120-54 120-120s-54-120-120-120c-40 0-80 32-120 88z" fill="#2BA8A0"/>
|
|
5
|
+
<path d="M256 160c-40-56-80-88-120-88-66 0-120 54-120 120s54 120 120 120c40 0 80-32 120-88" fill="#35B8A8"/>
|
|
6
|
+
<!-- Inner cutouts for the infinity holes -->
|
|
7
|
+
<ellipse cx="148" cy="192" rx="44" ry="48" fill="white" fill-opacity="0"/>
|
|
8
|
+
<ellipse cx="364" cy="192" rx="44" ry="48" fill="white" fill-opacity="0"/>
|
|
9
|
+
<!-- Usage bars at center -->
|
|
10
|
+
<rect x="240" y="156" width="10" height="50" rx="4" fill="#1A7A72"/>
|
|
11
|
+
<rect x="254" y="146" width="10" height="70" rx="4" fill="#1A7A72"/>
|
|
12
|
+
<rect x="268" y="162" width="10" height="40" rx="4" fill="#1A7A72"/>
|
|
13
|
+
<!-- Light reflection infinity (subtle, below) -->
|
|
14
|
+
<path d="M256 320c-24-34-48-52-72-52-40 0-72 32-72 72s32 72 72 72c24 0 48-18 72-52 24 34 48 52 72 52 40 0 72-32 72-72s-32-72-72-72c-24 0-48 18-72 52z" fill="#2BA8A0" fill-opacity="0.15"/>
|
|
15
|
+
</svg>
|
package/version.env
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
MARKETING_VERSION=
|
|
2
|
-
BUILD_NUMBER=
|
|
1
|
+
MARKETING_VERSION=2.0.0
|
|
2
|
+
BUILD_NUMBER=51
|