@sriinnu/runic 1.0.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.
Files changed (348) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +1 -1
  3. package/README.md +47 -29
  4. package/RuniciOS/Core/RunicTypographyiOS.swift +24 -0
  5. package/RuniciOS/Views/ProviderDetailView.swift +9 -9
  6. package/RuniciOS/Views/ProviderListView.swift +10 -10
  7. package/RuniciOS/Widgets/LargeWidget.swift +14 -14
  8. package/RuniciOS/Widgets/LiveActivity.swift +19 -19
  9. package/RuniciOS/Widgets/LockScreenWidget.swift +15 -15
  10. package/RuniciOS/Widgets/MediumWidget.swift +10 -10
  11. package/RuniciOS/Widgets/RunicWidget.swift +5 -5
  12. package/RuniciOS/Widgets/SmallWidget.swift +9 -9
  13. package/Scripts/package_app.sh +2 -2
  14. package/Sources/Runic/About.swift +3 -3
  15. package/Sources/Runic/AppNotifications.swift +5 -3
  16. package/Sources/Runic/Controllers/StatusItemController+Actions.swift +17 -4
  17. package/Sources/Runic/Controllers/StatusItemController+Animation.swift +5 -4
  18. package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +30 -16
  19. package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +6 -3
  20. package/Sources/Runic/Controllers/StatusItemController+Menu.swift +47 -14
  21. package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +6 -4
  22. package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +40 -12
  23. package/Sources/Runic/Controllers/StatusItemController.swift +43 -43
  24. package/Sources/Runic/Core/BudgetNotificationManager.swift +2 -1
  25. package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +2 -2
  26. package/Sources/Runic/Core/Login/CodexLoginRunner.swift +1 -1
  27. package/Sources/Runic/Core/Login/CursorLoginRunner.swift +4 -4
  28. package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +3 -6
  29. package/Sources/Runic/Core/Rendering/IconRenderer.swift +91 -85
  30. package/Sources/Runic/Core/Rendering/IconView.swift +3 -1
  31. package/Sources/Runic/Core/RunicColors.swift +6 -6
  32. package/Sources/Runic/Core/RunicSpacing.swift +7 -7
  33. package/Sources/Runic/Core/RunicTypography.swift +206 -0
  34. package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +10 -36
  35. package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +10 -36
  36. package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +10 -36
  37. package/Sources/Runic/Core/Stores/CohereTokenStore.swift +10 -36
  38. package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +10 -36
  39. package/Sources/Runic/Core/Stores/CustomProviderStore.swift +10 -10
  40. package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +10 -36
  41. package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +10 -36
  42. package/Sources/Runic/Core/Stores/GroqTokenStore.swift +10 -36
  43. package/Sources/Runic/Core/Stores/KimiTokenStore.swift +10 -36
  44. package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +10 -36
  45. package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +10 -36
  46. package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +10 -36
  47. package/Sources/Runic/Core/Stores/MistralTokenStore.swift +10 -36
  48. package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +10 -36
  49. package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +10 -36
  50. package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +1 -1
  51. package/Sources/Runic/Core/Stores/QwenTokenStore.swift +10 -36
  52. package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +10 -36
  53. package/Sources/Runic/Core/Stores/SettingsStore.swift +99 -52
  54. package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +10 -36
  55. package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +19 -6
  56. package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +1 -1
  57. package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +1 -1
  58. package/Sources/Runic/Core/Stores/UsageStore.swift +234 -167
  59. package/Sources/Runic/Core/Stores/XAITokenStore.swift +10 -36
  60. package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +10 -36
  61. package/Sources/Runic/Core/UsageExporter.swift +8 -4
  62. package/Sources/Runic/ProviderRegistry.swift +1 -1
  63. package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +1 -1
  64. package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +1 -1
  65. package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +1 -1
  66. package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +1 -1
  67. package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +1 -1
  68. package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +1 -1
  69. package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +1 -1
  70. package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +1 -1
  71. package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +1 -1
  72. package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +1 -1
  73. package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +1 -1
  74. package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +1 -1
  75. package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +1 -1
  76. package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +1 -1
  77. package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +1 -1
  78. package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +1 -1
  79. package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +1 -1
  80. package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +1 -1
  81. package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +1 -1
  82. package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +5 -2
  83. package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +1 -1
  84. package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +1 -1
  85. package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +1 -1
  86. package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +1 -1
  87. package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +1 -1
  88. package/Sources/Runic/Resources/Fonts/Caveat-Bold.ttf +0 -0
  89. package/Sources/Runic/Resources/Fonts/Caveat-Regular.ttf +0 -0
  90. package/Sources/Runic/Resources/Fonts/FiraCode-Bold.ttf +0 -0
  91. package/Sources/Runic/Resources/Fonts/FiraCode-Light.ttf +0 -0
  92. package/Sources/Runic/Resources/Fonts/FiraCode-Medium.ttf +0 -0
  93. package/Sources/Runic/Resources/Fonts/FiraCode-Regular.ttf +0 -0
  94. package/Sources/Runic/Resources/Fonts/FiraCode-SemiBold.ttf +0 -0
  95. package/Sources/Runic/Resources/Fonts/IBMPlexMono-Bold.ttf +0 -0
  96. package/Sources/Runic/Resources/Fonts/IBMPlexMono-Medium.ttf +0 -0
  97. package/Sources/Runic/Resources/Fonts/IBMPlexMono-Regular.ttf +0 -0
  98. package/Sources/Runic/Resources/Fonts/IBMPlexMono-SemiBold.ttf +0 -0
  99. package/Sources/Runic/Resources/Fonts/Inconsolata-Bold.ttf +0 -0
  100. package/Sources/Runic/Resources/Fonts/Inconsolata-Medium.ttf +0 -0
  101. package/Sources/Runic/Resources/Fonts/Inconsolata-Regular.ttf +0 -0
  102. package/Sources/Runic/Resources/Fonts/Inconsolata-SemiBold.ttf +0 -0
  103. package/Sources/Runic/Resources/Fonts/JetBrainsMono-Bold.ttf +0 -0
  104. package/Sources/Runic/Resources/Fonts/JetBrainsMono-Medium.ttf +0 -0
  105. package/Sources/Runic/Resources/Fonts/JetBrainsMono-Regular.ttf +0 -0
  106. package/Sources/Runic/Resources/Fonts/JetBrainsMono-SemiBold.ttf +0 -0
  107. package/Sources/Runic/Resources/Fonts/SpaceMono-Bold.ttf +0 -0
  108. package/Sources/Runic/Resources/Fonts/SpaceMono-Regular.ttf +0 -0
  109. package/Sources/Runic/Resources/provider-context-windows.json +20 -0
  110. package/Sources/Runic/RunicApp.swift +46 -36
  111. package/Sources/Runic/SessionQuotaNotifications.swift +2 -2
  112. package/Sources/Runic/UsagePaceText.swift +1 -1
  113. package/Sources/Runic/UsageProgressBar.swift +13 -9
  114. package/Sources/Runic/Utilities/LoadingPattern.swift +4 -2
  115. package/Sources/Runic/Utilities/PerformanceConstants.swift +28 -28
  116. package/Sources/Runic/Views/Menu/AlertsMenuView.swift +19 -21
  117. package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +19 -19
  118. package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +7 -7
  119. package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +5 -5
  120. package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +29 -30
  121. package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +20 -17
  122. package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +14 -14
  123. package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +15 -20
  124. package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +3 -4
  125. package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +5 -25
  126. package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +1 -1
  127. package/Sources/Runic/Views/Menu/MenuCardView.swift +120 -131
  128. package/Sources/Runic/Views/Menu/MenuContent.swift +11 -8
  129. package/Sources/Runic/Views/Menu/MenuDescriptor.swift +4 -2
  130. package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +1 -8
  131. package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +20 -14
  132. package/Sources/Runic/Views/Menu/OverviewMenuView.swift +198 -58
  133. package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +16 -11
  134. package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +27 -27
  135. package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +4 -6
  136. package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +24 -11
  137. package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +5 -5
  138. package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +7 -8
  139. package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +28 -76
  140. package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +8 -7
  141. package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +7 -7
  142. package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +50 -47
  143. package/Sources/Runic/Views/Preferences/LiquidComponents.swift +15 -14
  144. package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +7 -7
  145. package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +27 -27
  146. package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +38 -42
  147. package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +39 -43
  148. package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +21 -21
  149. package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +7 -7
  150. package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +49 -50
  151. package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +10 -10
  152. package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +40 -21
  153. package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +7 -7
  154. package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +108 -33
  155. package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +26 -23
  156. package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +271 -226
  157. package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +6 -2
  158. package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +7 -5
  159. package/Sources/Runic/Views/Preferences/PreferencesView.swift +38 -31
  160. package/Sources/Runic/Views/Rating/QualityRatingView.swift +11 -11
  161. package/Sources/Runic/Views/Team/TeamDashboardView.swift +29 -24
  162. package/Sources/Runic/Views/Team/TeamInviteSheet.swift +16 -16
  163. package/Sources/Runic/Views/Team/TeamManagementView.swift +50 -49
  164. package/Sources/Runic/Views/Team/TeamMemberRow.swift +8 -8
  165. package/Sources/RunicCLI/CLIEntry.swift +83 -42
  166. package/Sources/RunicCLI/CLIRenderer.swift +1 -1
  167. package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +60 -60
  168. package/Sources/RunicCLI/Commands/ModelsCommand.swift +45 -44
  169. package/Sources/RunicCLI/Commands/ProjectsCommand.swift +83 -69
  170. package/Sources/RunicCLI/Commands/ResetCommand.swift +50 -49
  171. package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +31 -32
  172. package/Sources/RunicClaudeWebProbe/main.swift +1 -1
  173. package/Sources/RunicCore/AlertRuleStore.swift +20 -20
  174. package/Sources/RunicCore/BrowserCookieImportOrder.swift +3 -3
  175. package/Sources/RunicCore/CostUsageModels.swift +1 -1
  176. package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +29 -30
  177. package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +80 -71
  178. package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +53 -109
  179. package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +3 -3
  180. package/Sources/RunicCore/Integrations/GitHubIntegration.swift +3 -3
  181. package/Sources/RunicCore/Logging/OSLogLogHandler.swift +6 -6
  182. package/Sources/RunicCore/Models/EnhancedUsageModels.swift +47 -48
  183. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +1 -1
  184. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +1 -1
  185. package/Sources/RunicCore/Performance/PerformanceModels.swift +4 -4
  186. package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +81 -64
  187. package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +2 -2
  188. package/Sources/RunicCore/ProjectBudgetStore.swift +15 -12
  189. package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +4 -2
  190. package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +2 -2
  191. package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +2 -2
  192. package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +3 -3
  193. package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +8 -8
  194. package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +5 -3
  195. package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +6 -6
  196. package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +3 -7
  197. package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +2 -2
  198. package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +2 -2
  199. package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +3 -3
  200. package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +4 -2
  201. package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +4 -4
  202. package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +3 -1
  203. package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +1 -1
  204. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthCredentials.swift +1 -0
  205. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +12 -1
  206. package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +4 -2
  207. package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +3 -1
  208. package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +5 -3
  209. package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +2 -2
  210. package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +3 -3
  211. package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +7 -4
  212. package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +4 -4
  213. package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +5 -3
  214. package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +9 -10
  215. package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +4 -2
  216. package/Sources/RunicCore/Providers/Cursor/CursorStatusProbe.swift +1 -0
  217. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +2 -2
  218. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +2 -2
  219. package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +4 -4
  220. package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +4 -2
  221. package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +3 -2
  222. package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +2 -2
  223. package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +2 -2
  224. package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +4 -2
  225. package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +6 -2
  226. package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +2 -2
  227. package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +2 -2
  228. package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +2 -2
  229. package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +2 -2
  230. package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +10 -5
  231. package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +8 -11
  232. package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +10 -10
  233. package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +2 -2
  234. package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +2 -2
  235. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +2 -2
  236. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +25 -16
  237. package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +2 -2
  238. package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +2 -2
  239. package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +2 -2
  240. package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +2 -2
  241. package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +5 -3
  242. package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +27 -16
  243. package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +2 -2
  244. package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +2 -2
  245. package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +2 -2
  246. package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +2 -2
  247. package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +5 -5
  248. package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +1 -1
  249. package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +3 -3
  250. package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +2 -2
  251. package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +2 -2
  252. package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +4 -2
  253. package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +51 -30
  254. package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +76 -77
  255. package/Sources/RunicCore/Sync/SyncConflictResolver.swift +55 -58
  256. package/Sources/RunicCore/Sync/SyncProtocol.swift +21 -22
  257. package/Sources/RunicCore/Sync/SyncRecord.swift +46 -49
  258. package/Sources/RunicCore/Sync/SyncUsageExample.swift +44 -50
  259. package/Sources/RunicCore/Sync/TeamSyncRecords.swift +94 -101
  260. package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +51 -46
  261. package/Sources/RunicCore/Team/TeamModels.swift +111 -110
  262. package/Sources/RunicCore/Team/TeamStore.swift +126 -109
  263. package/Sources/RunicCore/UsageFetcher.swift +2 -2
  264. package/Sources/RunicCore/UsageFormatter.swift +25 -25
  265. package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +141 -29
  266. package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +59 -5
  267. package/Sources/RunicCore/UsageLedger/LedgerCache.swift +161 -0
  268. package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +1 -1
  269. package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +40 -25
  270. package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +1 -1
  271. package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +55 -16
  272. package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +6 -6
  273. package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +1 -1
  274. package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +2 -2
  275. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +5 -5
  276. package/Tests/RunicTests/AppDelegateTests.swift +8 -3
  277. package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +2 -3
  278. package/Tests/RunicTests/CLIArgumentParsingTests.swift +3 -4
  279. package/Tests/RunicTests/CLICostTests.swift +6 -7
  280. package/Tests/RunicTests/CLIProviderSelectionTests.swift +2 -3
  281. package/Tests/RunicTests/CLISnapshotTests.swift +3 -4
  282. package/Tests/RunicTests/CLIWebFallbackTests.swift +3 -4
  283. package/Tests/RunicTests/ClaudeOAuthTests.swift +11 -12
  284. package/Tests/RunicTests/ClaudeResilienceTests.swift +3 -4
  285. package/Tests/RunicTests/ClaudeUsageTests.swift +20 -21
  286. package/Tests/RunicTests/CodexOAuthTests.swift +7 -8
  287. package/Tests/RunicTests/CodexUsageLogSourceTests.swift +1 -3
  288. package/Tests/RunicTests/CopilotTokenResolverTests.swift +5 -6
  289. package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +4 -5
  290. package/Tests/RunicTests/CostUsageDecodingTests.swift +15 -17
  291. package/Tests/RunicTests/CostUsagePricingTests.swift +5 -7
  292. package/Tests/RunicTests/CostUsageScannerTests.swift +10 -12
  293. package/Tests/RunicTests/CursorStatusProbeTests.swift +15 -16
  294. package/Tests/RunicTests/FactoryStatusProbeTests.swift +3 -5
  295. package/Tests/RunicTests/GeminiLoginAlertTests.swift +3 -4
  296. package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +11 -11
  297. package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +8 -8
  298. package/Tests/RunicTests/GeminiStatusProbeTests.swift +20 -21
  299. package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +2 -3
  300. package/Tests/RunicTests/InstallOriginTests.swift +1 -2
  301. package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +2 -2
  302. package/Tests/RunicTests/LiveAccountTests.swift +3 -3
  303. package/Tests/RunicTests/LoadingPatternTests.swift +3 -4
  304. package/Tests/RunicTests/MenuCardModelTests.swift +33 -34
  305. package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +4 -1
  306. package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +4 -1
  307. package/Tests/RunicTests/MiniMaxParsingTests.swift +4 -5
  308. package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +4 -1
  309. package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +4 -6
  310. package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +1 -2
  311. package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +5 -6
  312. package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +2 -3
  313. package/Tests/RunicTests/OpenAIDashboardParserTests.swift +12 -13
  314. package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +17 -6
  315. package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +52 -13
  316. package/Tests/RunicTests/PathBuilderTests.swift +14 -15
  317. package/Tests/RunicTests/ProviderFetchPipelineTests.swift +3 -4
  318. package/Tests/RunicTests/ProviderIconResourcesTests.swift +1 -2
  319. package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +1 -2
  320. package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +53 -19
  321. package/Tests/RunicTests/ProviderToggleStoreTests.swift +10 -11
  322. package/Tests/RunicTests/RunicTests.swift +6 -7
  323. package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +5 -6
  324. package/Tests/RunicTests/SettingsStoreTests.swift +149 -45
  325. package/Tests/RunicTests/StatusItemAnimationTests.swift +8 -3
  326. package/Tests/RunicTests/StatusMenuTests.swift +63 -22
  327. package/Tests/RunicTests/StatusProbeTests.swift +28 -29
  328. package/Tests/RunicTests/SubprocessRunnerTests.swift +1 -3
  329. package/Tests/RunicTests/SubscriptionDetectionTests.swift +8 -9
  330. package/Tests/RunicTests/TTYCommandRunnerTests.swift +8 -9
  331. package/Tests/RunicTests/TeamShowbackExporterTests.swift +2 -4
  332. package/Tests/RunicTests/TextParsingTests.swift +1 -2
  333. package/Tests/RunicTests/UsageFormatterTests.swift +15 -16
  334. package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +12 -14
  335. package/Tests/RunicTests/UsageLedgerForecastTests.swift +4 -6
  336. package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +7 -9
  337. package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +6 -8
  338. package/Tests/RunicTests/UsagePaceTests.swift +5 -6
  339. package/Tests/RunicTests/UsagePaceTextTests.swift +8 -9
  340. package/Tests/RunicTests/UsagePolicyEngineTests.swift +3 -5
  341. package/Tests/RunicTests/WidgetSnapshotTests.swift +1 -3
  342. package/Tests/RunicTests/ZaiProviderTests.swift +3 -5
  343. package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +4 -1
  344. package/appcast.xml +36 -37
  345. package/package.json +1 -1
  346. package/runic.png +0 -0
  347. package/runic.svg +15 -0
  348. 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 reliabilityScoreDropsWhenErrorsExist() {
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: 1_000,
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 routingRecommendationFindsSavingsBetweenModels() {
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: 30_000,
56
- outputTokens: 20_000,
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: 40_000,
69
- outputTokens: 20_000,
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 projectSummariesPreferNonEmptyProjectName() {
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 projectSummariesGroupByInferredNameWhenProjectIDIsMissing() {
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 { $0 })
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 projectSummariesInferProjectNameFromPathLikeIdentifier() {
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 projectDisplayNameFallsBackToReadableIdentifier() {
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 projectDisplayNameKeepsOpaqueIdentifiersHidden() {
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 weeklyPace_computesDeltaAndEta() {
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 weeklyPace_marksLastsToResetWhenUsageIsLow() {
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 weeklyPace_hidesWhenResetMissingOrOutsideWindow() {
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 weeklyPace_hidesWhenUsageExistsButNoElapsed() {
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 weeklyPaceText_includesEtaWhenRunningOutBeforeReset() {
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 weeklyPaceText_showsResetSafeWhenPaceIsSlow() {
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 weeklyPaceText_hidesWhenResetIsMissing() {
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 weeklyPaceText_hidesWhenResetIsInPastOrTooFar() {
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 weeklyPaceText_hidesWhenNoElapsedButUsageExists() {
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 weeklyPaceText_hidesWhenTooEarlyInWindow() {
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 weeklyPaceText_hidesWhenUsageIsDepleted() {
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 returnsNoneWhenNoRulesMatch() {
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 selectsStrongestActionAcrossMatchedRules() {
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 projectedOverrunConditionRespectsThreshold() {
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 widgetSnapshotRoundTrip() throws {
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 apiTokenReadsFromEnvironment() {
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 apiTokenStripsQuotes() {
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 mapsUsageSnapshotWindows() {
21
+ func `maps usage snapshot windows`() {
24
22
  let reset = Date(timeIntervalSince1970: 123)
25
23
  let tokenLimit = ZaiLimitEntry(
26
24
  type: .tokensLimit,
@@ -1,6 +1,9 @@
1
1
  @testable import Runic
2
2
 
3
3
  struct NoopZaiTokenStore: ZaiTokenStoring {
4
- func loadToken() throws -> String? { nil }
4
+ func loadToken() throws -> String? {
5
+ nil
6
+ }
7
+
5
8
  func storeToken(_: String?) throws {}
6
9
  }
package/appcast.xml CHANGED
@@ -3,63 +3,62 @@
3
3
  <channel>
4
4
  <title>Runic</title>
5
5
  <item>
6
- <title>0.16.0</title>
7
- <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>
8
8
  <link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
9
- <sparkle:version>46</sparkle:version>
10
- <sparkle:shortVersionString>0.16.0</sparkle:shortVersionString>
9
+ <sparkle:version>51</sparkle:version>
10
+ <sparkle:shortVersionString>2.0.0</sparkle:shortVersionString>
11
11
  <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
12
- <description><![CDATA[<h2>Runic 0.16.0</h2>
12
+ <description><![CDATA[<h2>Runic 2.0.0</h2>
13
13
  <ul>
14
- <li>Menu bar: optional “percent mode” (provider brand icons + percentage labels) via Advanced toggle.</li>
15
- <li>CLI: add <code>runic cost</code> to print local cost usage (text/JSON) for Codex + Claude.</li>
16
- <li>Cost: align local cost scanner with ccusage; stabilize parsing/decoding and handle large JSONL lines.</li>
17
- <li>Claude: skip pricing for unknown models (tokens still tracked) to avoid hard-coded legacy prices.</li>
18
- <li>Performance: reduce menu bar CPU usage by caching morph icons, skipping redundant status-item updates, and caching provider enablement/order during animations.</li>
19
- <li>Menu: improve provider switcher hover contrast in light mode.</li>
20
- <li>Icons: refresh Droid + Claude brand assets to better match menu sizing.</li>
21
- <li>CI: avoid interactive login-shell probes to reduce noisy “CLI missing” errors.</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>
22
23
  </ul>
23
24
  <p><a href="https://github.com/sriinnu/Runic/blob/main/CHANGELOG.md">View full changelog</a></p>
24
25
  ]]></description>
25
- <enclosure url="https://github.com/sriinnu/Runic/releases/download/v0.16.0/Runic-0.16.0.zip" length="7607740" type="application/octet-stream" sparkle:edSignature="D/d9z4+8/gqpeoXBKkmEkzpPrzs9pp1DQeCETkndA2kyi1wKTAjPyw6Hj6V1Pe3T5ge66E0N5De88ilUp6WmBw=="/>
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=="/>
26
27
  </item>
27
28
  <item>
28
- <title>0.15.3</title>
29
- <pubDate>Sun, 28 Dec 2025 20:18:41 +0100</pubDate>
29
+ <title>1.2.0</title>
30
+ <pubDate>Tue, 25 Mar 2026 21:00:00 +0100</pubDate>
30
31
  <link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
31
- <sparkle:version>45</sparkle:version>
32
- <sparkle:shortVersionString>0.15.3</sparkle:shortVersionString>
32
+ <sparkle:version>50</sparkle:version>
33
+ <sparkle:shortVersionString>1.2.0</sparkle:shortVersionString>
33
34
  <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
34
- <description><![CDATA[<h2>Runic 0.15.3</h2>
35
+ <description><![CDATA[<h2>Runic 1.2.0</h2>
35
36
  <ul>
36
- <li>Codex: default to OAuth usage API (ChatGPT backend) with CLI-only override in Debug.</li>
37
- <li>Codex: map OAuth credits balance directly, avoiding web fallback for credits.</li>
38
- <li>Preferences: add optional “Access OpenAI via web” toggle and show blended source labels when web extras are active.</li>
39
- <li>Copilot: replace blocking auth wait dialog with a non-modal sheet to avoid stuck login.</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>
40
42
  </ul>
41
- <ul>
42
- <li>CI: stabilize Claude CLI version detection test.</li>
43
- </ul>
44
- <p><a href="https://github.com/sriinnu/Runic/blob/main/CHANGELOG.md">View full changelog</a></p>
45
43
  ]]></description>
46
- <enclosure url="https://github.com/sriinnu/Runic/releases/download/v0.15.3/Runic-0.15.3.zip" length="7549248" type="application/octet-stream" sparkle:edSignature="3xoy09WoQnTuskCqIPRHriFPmmTJCVZ4BIgufRNLqfNhszmE1MSf2pWQVYzgt0SBVDrY+12/0dCie9TG0RqTBg=="/>
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=="/>
47
45
  </item>
48
46
  <item>
49
- <title>0.15.2</title>
50
- <pubDate>Sun, 28 Dec 2025 18:51:01 +0100</pubDate>
47
+ <title>1.1.0</title>
48
+ <pubDate>Sun, 23 Mar 2026 00:00:00 +0100</pubDate>
51
49
  <link>https://raw.githubusercontent.com/sriinnu/Runic/main/appcast.xml</link>
52
- <sparkle:version>44</sparkle:version>
53
- <sparkle:shortVersionString>0.15.2</sparkle:shortVersionString>
50
+ <sparkle:version>49</sparkle:version>
51
+ <sparkle:shortVersionString>1.1.0</sparkle:shortVersionString>
54
52
  <sparkle:minimumSystemVersion>14.0</sparkle:minimumSystemVersion>
55
- <description><![CDATA[<h2>Runic 0.15.2</h2>
53
+ <description><![CDATA[<h2>Runic 1.1.0</h2>
56
54
  <ul>
57
- <li>Copilot: fix device-flow waiting modal to close reliably after auth (and avoid stuck waits).</li>
58
- <li>Packaging: include the KeyboardShortcuts resource bundle to prevent Settings → Keyboard shortcut crashes in packaged builds.</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>
59
59
  </ul>
60
- <p><a href="https://github.com/sriinnu/Runic/blob/main/CHANGELOG.md">View full changelog</a></p>
61
60
  ]]></description>
62
- <enclosure url="https://github.com/sriinnu/Runic/releases/download/v0.15.2/Runic-0.15.2.zip" length="7413967" type="application/octet-stream" sparkle:edSignature="vv7kPaGk0vzAj1AJ5EEbRE0kXtE4iIscrkhxsjU8X+BDT5HQkwJTully+OivJFCksjuUyaZIV74tfi1kWlSWDQ=="/>
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=="/>
63
62
  </item>
64
63
  <item>
65
64
  <title>0.14.0</title>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sriinnu/runic",
3
- "version": "1.0.0",
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=0.16.1
2
- BUILD_NUMBER=47
1
+ MARKETING_VERSION=2.0.0
2
+ BUILD_NUMBER=51