@sriinnu/runic 1.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 (584) hide show
  1. package/.swiftformat +50 -0
  2. package/.swiftlint.yml +160 -0
  3. package/CHANGELOG.md +307 -0
  4. package/CONTRIBUTING.md +456 -0
  5. package/Icon.icns +0 -0
  6. package/Icon.icon/Assets/runic.png +0 -0
  7. package/Icon.icon/icon.json +36 -0
  8. package/LICENSE +21 -0
  9. package/Package.resolved +51 -0
  10. package/Package.swift +136 -0
  11. package/Packages/Helix/LICENSE +21 -0
  12. package/Packages/Helix/Package.swift +29 -0
  13. package/Packages/Helix/README.md +976 -0
  14. package/Packages/Helix/Sources/Helix/Binding.swift +111 -0
  15. package/Packages/Helix/Sources/Helix/CommandParser.swift +160 -0
  16. package/Packages/Helix/Sources/Helix/CommandSignature.swift +117 -0
  17. package/Packages/Helix/Sources/Helix/ExpressibleFromArgument.swift +72 -0
  18. package/Packages/Helix/Sources/Helix/HelpGenerator.swift +175 -0
  19. package/Packages/Helix/Sources/Helix/NameSpecification.swift +98 -0
  20. package/Packages/Helix/Sources/Helix/ParsableCommand.swift +204 -0
  21. package/Packages/Helix/Sources/Helix/Platform/DarwinPlatformContext.swift +44 -0
  22. package/Packages/Helix/Sources/Helix/Platform/LinuxPlatformContext.swift +34 -0
  23. package/Packages/Helix/Sources/Helix/Platform/PlatformContext+Default.swift +91 -0
  24. package/Packages/Helix/Sources/Helix/Platform/PlatformContext.swift +94 -0
  25. package/Packages/Helix/Sources/Helix/Platform/PlatformPath.swift +167 -0
  26. package/Packages/Helix/Sources/Helix/Platform/Stdio.swift +99 -0
  27. package/Packages/Helix/Sources/Helix/Platform/WebPlatformContext.swift +146 -0
  28. package/Packages/Helix/Sources/Helix/Platform/WindowsPlatformContext.swift +97 -0
  29. package/Packages/Helix/Sources/Helix/Program.swift +204 -0
  30. package/Packages/Helix/Sources/Helix/PropertyWrappers.swift +367 -0
  31. package/Packages/Silo/LICENSE +21 -0
  32. package/Packages/Silo/Package.swift +34 -0
  33. package/Packages/Silo/README.md +466 -0
  34. package/Packages/Silo/Sources/Silo/BinaryCookiesReader.swift +169 -0
  35. package/Packages/Silo/Sources/Silo/BrowserCookieAnalytics.swift +365 -0
  36. package/Packages/Silo/Sources/Silo/BrowserCookieBackends.swift +594 -0
  37. package/Packages/Silo/Sources/Silo/BrowserCookieClient.swift +326 -0
  38. package/Packages/Silo/Sources/Silo/BrowserCookieExport.swift +154 -0
  39. package/Packages/Silo/Sources/Silo/BrowserCookieImport.swift +119 -0
  40. package/Packages/Silo/Sources/Silo/BrowserCookieMockStore.swift +121 -0
  41. package/Packages/Silo/Sources/Silo/BrowserCookieModels.swift +391 -0
  42. package/Packages/Silo/Sources/Silo/ChromiumCookieReader.swift +240 -0
  43. package/Packages/Silo/Sources/Silo/CryptoSupport.swift +86 -0
  44. package/Packages/Silo/Sources/Silo/FirefoxCookieReader.swift +172 -0
  45. package/Packages/Silo/Sources/Silo/LinuxChromiumCookieReader.swift +172 -0
  46. package/Packages/Silo/Sources/Silo/LinuxSecretService.swift +105 -0
  47. package/Packages/Silo/Sources/Silo/MacOSChromiumCookieReader.swift +191 -0
  48. package/Packages/Silo/Sources/Silo/SQLiteSnapshot.swift +41 -0
  49. package/Packages/Silo/Sources/Silo/WindowsChromiumCookieReader.swift +110 -0
  50. package/README.md +109 -0
  51. package/RuniciOS/App/RuniciOSApp.swift +105 -0
  52. package/RuniciOS/Core/iOSUsageStore.swift +192 -0
  53. package/RuniciOS/Views/ProviderDetailView.swift +312 -0
  54. package/RuniciOS/Views/ProviderListView.swift +228 -0
  55. package/RuniciOS/Widgets/LargeWidget.swift +367 -0
  56. package/RuniciOS/Widgets/LiveActivity.swift +342 -0
  57. package/RuniciOS/Widgets/LockScreenWidget.swift +273 -0
  58. package/RuniciOS/Widgets/MediumWidget.swift +370 -0
  59. package/RuniciOS/Widgets/RunicWidget.swift +274 -0
  60. package/RuniciOS/Widgets/SmallWidget.swift +281 -0
  61. package/RuniciOS/Widgets/WidgetModels.swift +285 -0
  62. package/RuniciOS/Widgets/WidgetTimeline.swift +270 -0
  63. package/Scripts/CREATION-SUMMARY.md +367 -0
  64. package/Scripts/DIRECTORY-STRUCTURE.md +358 -0
  65. package/Scripts/GETTING-STARTED-CHECKLIST.md +364 -0
  66. package/Scripts/INDEX.md +365 -0
  67. package/Scripts/QUICK-REFERENCE.md +164 -0
  68. package/Scripts/README-SCRIPTS.md +926 -0
  69. package/Scripts/build-android.sh +526 -0
  70. package/Scripts/build-ios.sh +529 -0
  71. package/Scripts/build-macos.sh +603 -0
  72. package/Scripts/build-windows.sh +504 -0
  73. package/Scripts/build_icon.sh +49 -0
  74. package/Scripts/changelog-to-html.sh +89 -0
  75. package/Scripts/check-release-assets.sh +10 -0
  76. package/Scripts/ci-config.yml +474 -0
  77. package/Scripts/compile_and_run.sh +219 -0
  78. package/Scripts/compile_and_run_adhoc.sh +4 -0
  79. package/Scripts/docs-list.mjs +119 -0
  80. package/Scripts/make_appcast.sh +58 -0
  81. package/Scripts/package_app.sh +409 -0
  82. package/Scripts/release-lib.sh +214 -0
  83. package/Scripts/release.sh +76 -0
  84. package/Scripts/setup-all.sh +387 -0
  85. package/Scripts/setup-ios.sh +404 -0
  86. package/Scripts/setup-react-native.sh +523 -0
  87. package/Scripts/sign-and-notarize.sh +122 -0
  88. package/Scripts/test_live_update.sh +38 -0
  89. package/Scripts/validate_changelog.sh +23 -0
  90. package/Scripts/verify_appcast.sh +92 -0
  91. package/Sources/Runic/About.swift +93 -0
  92. package/Sources/Runic/AppNotifications.swift +115 -0
  93. package/Sources/Runic/Controllers/StatusItemController+Actions.swift +657 -0
  94. package/Sources/Runic/Controllers/StatusItemController+Animation.swift +518 -0
  95. package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +810 -0
  96. package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +87 -0
  97. package/Sources/Runic/Controllers/StatusItemController+Menu.swift +1379 -0
  98. package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +337 -0
  99. package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +395 -0
  100. package/Sources/Runic/Controllers/StatusItemController.swift +360 -0
  101. package/Sources/Runic/Core/BudgetNotificationManager.swift +80 -0
  102. package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +103 -0
  103. package/Sources/Runic/Core/Login/CodexLoginRunner.swift +154 -0
  104. package/Sources/Runic/Core/Login/CursorLoginRunner.swift +206 -0
  105. package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +95 -0
  106. package/Sources/Runic/Core/Rendering/IconRenderer.swift +1216 -0
  107. package/Sources/Runic/Core/Rendering/IconView.swift +120 -0
  108. package/Sources/Runic/Core/Rendering/ProviderBrandIcon.swift +71 -0
  109. package/Sources/Runic/Core/RunicAnimation.swift +53 -0
  110. package/Sources/Runic/Core/RunicColors.swift +73 -0
  111. package/Sources/Runic/Core/RunicCornerRadius.swift +15 -0
  112. package/Sources/Runic/Core/RunicSpacing.swift +68 -0
  113. package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +143 -0
  114. package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +143 -0
  115. package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +143 -0
  116. package/Sources/Runic/Core/Stores/CohereTokenStore.swift +143 -0
  117. package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +143 -0
  118. package/Sources/Runic/Core/Stores/CustomProviderStore.swift +158 -0
  119. package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +143 -0
  120. package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +143 -0
  121. package/Sources/Runic/Core/Stores/GroqTokenStore.swift +143 -0
  122. package/Sources/Runic/Core/Stores/KimiTokenStore.swift +143 -0
  123. package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +143 -0
  124. package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +143 -0
  125. package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +143 -0
  126. package/Sources/Runic/Core/Stores/MistralTokenStore.swift +143 -0
  127. package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +143 -0
  128. package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +143 -0
  129. package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +30 -0
  130. package/Sources/Runic/Core/Stores/QwenTokenStore.swift +143 -0
  131. package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +143 -0
  132. package/Sources/Runic/Core/Stores/SettingsStore.swift +1702 -0
  133. package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +143 -0
  134. package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +20 -0
  135. package/Sources/Runic/Core/Stores/UsageStore+Status.swift +189 -0
  136. package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +33 -0
  137. package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +67 -0
  138. package/Sources/Runic/Core/Stores/UsageStore.swift +3564 -0
  139. package/Sources/Runic/Core/Stores/XAITokenStore.swift +143 -0
  140. package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +143 -0
  141. package/Sources/Runic/Core/UsageExporter.swift +193 -0
  142. package/Sources/Runic/Date+RelativeDescription.swift +21 -0
  143. package/Sources/Runic/HiddenWindowView.swift +32 -0
  144. package/Sources/Runic/InstallOrigin.swift +9 -0
  145. package/Sources/Runic/KeyboardShortcuts+Names.swift +6 -0
  146. package/Sources/Runic/MouseLocationReader.swift +65 -0
  147. package/Sources/Runic/Notifications+Runic.swift +6 -0
  148. package/Sources/Runic/OpenAICreditsPurchaseWindowController.swift +503 -0
  149. package/Sources/Runic/ProviderRegistry.swift +100 -0
  150. package/Sources/Runic/ProviderSwitcherButtons.swift +267 -0
  151. package/Sources/Runic/Providers/Antigravity/AntigravityLoginFlow.swift +11 -0
  152. package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +14 -0
  153. package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +24 -0
  154. package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +52 -0
  155. package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +42 -0
  156. package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +24 -0
  157. package/Sources/Runic/Providers/Claude/ClaudeLoginFlow.swift +26 -0
  158. package/Sources/Runic/Providers/Claude/ClaudeProviderImplementation.swift +14 -0
  159. package/Sources/Runic/Providers/Codex/CodexLoginFlow.swift +18 -0
  160. package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +15 -0
  161. package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +24 -0
  162. package/Sources/Runic/Providers/Copilot/CopilotLoginFlow.swift +193 -0
  163. package/Sources/Runic/Providers/Copilot/CopilotProviderImplementation.swift +110 -0
  164. package/Sources/Runic/Providers/Cursor/CursorLoginFlow.swift +28 -0
  165. package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +15 -0
  166. package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +24 -0
  167. package/Sources/Runic/Providers/Factory/FactoryLoginFlow.swift +12 -0
  168. package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +15 -0
  169. package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +24 -0
  170. package/Sources/Runic/Providers/Gemini/GeminiLoginFlow.swift +20 -0
  171. package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +15 -0
  172. package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +24 -0
  173. package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +24 -0
  174. package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +32 -0
  175. package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +24 -0
  176. package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +24 -0
  177. package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +24 -0
  178. package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +24 -0
  179. package/Sources/Runic/Providers/Shared/ProviderCatalog.swift +15 -0
  180. package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +48 -0
  181. package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +66 -0
  182. package/Sources/Runic/Providers/Shared/ProviderLoginFlow.swift +12 -0
  183. package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +99 -0
  184. package/Sources/Runic/Providers/Shared/SystemSettingsLinks.swift +18 -0
  185. package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +24 -0
  186. package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +24 -0
  187. package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +24 -0
  188. package/Sources/Runic/Resources/ProviderIcon-antigravity.svg +2 -0
  189. package/Sources/Runic/Resources/ProviderIcon-auggie.svg +3 -0
  190. package/Sources/Runic/Resources/ProviderIcon-azure.svg +5 -0
  191. package/Sources/Runic/Resources/ProviderIcon-bedrock.svg +7 -0
  192. package/Sources/Runic/Resources/ProviderIcon-cerebras.svg +3 -0
  193. package/Sources/Runic/Resources/ProviderIcon-claude.svg +1 -0
  194. package/Sources/Runic/Resources/ProviderIcon-codex.svg +1 -0
  195. package/Sources/Runic/Resources/ProviderIcon-cohere.svg +3 -0
  196. package/Sources/Runic/Resources/ProviderIcon-copilot.svg +1 -0
  197. package/Sources/Runic/Resources/ProviderIcon-cursor.svg +3 -0
  198. package/Sources/Runic/Resources/ProviderIcon-deepseek.svg +4 -0
  199. package/Sources/Runic/Resources/ProviderIcon-factory.svg +3 -0
  200. package/Sources/Runic/Resources/ProviderIcon-fireworks.svg +3 -0
  201. package/Sources/Runic/Resources/ProviderIcon-gemini.svg +1 -0
  202. package/Sources/Runic/Resources/ProviderIcon-groq.svg +1 -0
  203. package/Sources/Runic/Resources/ProviderIcon-kimi.svg +4 -0
  204. package/Sources/Runic/Resources/ProviderIcon-minimax.svg +1 -0
  205. package/Sources/Runic/Resources/ProviderIcon-mistral.svg +5 -0
  206. package/Sources/Runic/Resources/ProviderIcon-openrouter.svg +7 -0
  207. package/Sources/Runic/Resources/ProviderIcon-perplexity.svg +4 -0
  208. package/Sources/Runic/Resources/ProviderIcon-qwen.svg +9 -0
  209. package/Sources/Runic/Resources/ProviderIcon-sambanova.svg +4 -0
  210. package/Sources/Runic/Resources/ProviderIcon-together.svg +5 -0
  211. package/Sources/Runic/Resources/ProviderIcon-vertexai.svg +17 -0
  212. package/Sources/Runic/Resources/ProviderIcon-xai.svg +3 -0
  213. package/Sources/Runic/Resources/ProviderIcon-zai.svg +5 -0
  214. package/Sources/Runic/Resources/RunicMenubarIcon.svg +7 -0
  215. package/Sources/Runic/RunicApp.swift +357 -0
  216. package/Sources/Runic/SessionQuotaNotifications.swift +58 -0
  217. package/Sources/Runic/UsagePaceText.swift +52 -0
  218. package/Sources/Runic/UsageProgressBar.swift +224 -0
  219. package/Sources/Runic/Utilities/DisplayLink.swift +96 -0
  220. package/Sources/Runic/Utilities/LoadingPattern.swift +60 -0
  221. package/Sources/Runic/Utilities/PerformanceConstants.swift +85 -0
  222. package/Sources/Runic/Views/Menu/AlertsMenuView.swift +256 -0
  223. package/Sources/Runic/Views/Menu/ChartPanelStyle.swift +22 -0
  224. package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +275 -0
  225. package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +377 -0
  226. package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +312 -0
  227. package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +312 -0
  228. package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +228 -0
  229. package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +228 -0
  230. package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +162 -0
  231. package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +64 -0
  232. package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +268 -0
  233. package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +104 -0
  234. package/Sources/Runic/Views/Menu/MenuCardView.swift +1900 -0
  235. package/Sources/Runic/Views/Menu/MenuContent.swift +150 -0
  236. package/Sources/Runic/Views/Menu/MenuDescriptor.swift +369 -0
  237. package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +42 -0
  238. package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +235 -0
  239. package/Sources/Runic/Views/Menu/OverviewMenuView.swift +141 -0
  240. package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +209 -0
  241. package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +220 -0
  242. package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +88 -0
  243. package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +201 -0
  244. package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +398 -0
  245. package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +232 -0
  246. package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +417 -0
  247. package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +190 -0
  248. package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +132 -0
  249. package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +618 -0
  250. package/Sources/Runic/Views/Preferences/LiquidComponents.swift +305 -0
  251. package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +271 -0
  252. package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +268 -0
  253. package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +422 -0
  254. package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +641 -0
  255. package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +344 -0
  256. package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +230 -0
  257. package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +322 -0
  258. package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +469 -0
  259. package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +231 -0
  260. package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +50 -0
  261. package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +497 -0
  262. package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +288 -0
  263. package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +3435 -0
  264. package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +25 -0
  265. package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +59 -0
  266. package/Sources/Runic/Views/Preferences/PreferencesView.swift +206 -0
  267. package/Sources/Runic/Views/Rating/QualityRatingView.swift +238 -0
  268. package/Sources/Runic/Views/Team/TeamDashboardView.swift +371 -0
  269. package/Sources/Runic/Views/Team/TeamInviteSheet.swift +175 -0
  270. package/Sources/Runic/Views/Team/TeamManagementView.swift +761 -0
  271. package/Sources/Runic/Views/Team/TeamMemberRow.swift +181 -0
  272. package/Sources/RunicCLI/CLIEntry.swift +942 -0
  273. package/Sources/RunicCLI/CLIRenderer.swift +87 -0
  274. package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +588 -0
  275. package/Sources/RunicCLI/Commands/ModelsCommand.swift +362 -0
  276. package/Sources/RunicCLI/Commands/ProjectsCommand.swift +439 -0
  277. package/Sources/RunicCLI/Commands/ResetCommand.swift +429 -0
  278. package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +168 -0
  279. package/Sources/RunicClaudeWatchdog/main.swift +122 -0
  280. package/Sources/RunicClaudeWebProbe/main.swift +62 -0
  281. package/Sources/RunicCore/AlertRuleStore.swift +187 -0
  282. package/Sources/RunicCore/BrowserCookieImportOrder.swift +25 -0
  283. package/Sources/RunicCore/CopilotUsageModels.swift +84 -0
  284. package/Sources/RunicCore/CostUsageFetcher.swift +119 -0
  285. package/Sources/RunicCore/CostUsageModels.swift +479 -0
  286. package/Sources/RunicCore/CreditsModels.swift +50 -0
  287. package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +269 -0
  288. package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +622 -0
  289. package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +500 -0
  290. package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +679 -0
  291. package/Sources/RunicCore/Host/Process/SubprocessRunner.swift +135 -0
  292. package/Sources/RunicCore/Integrations/GitHubIntegration.swift +173 -0
  293. package/Sources/RunicCore/Logging/JSONStderrLogHandler.swift +79 -0
  294. package/Sources/RunicCore/Logging/OSLogLogHandler.swift +86 -0
  295. package/Sources/RunicCore/Logging/RunicLog.swift +123 -0
  296. package/Sources/RunicCore/Models/EnhancedUsageModels.swift +371 -0
  297. package/Sources/RunicCore/OpenAIDashboardModels.swift +210 -0
  298. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +676 -0
  299. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +492 -0
  300. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardNavigationDelegate.swift +51 -0
  301. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardParser.swift +483 -0
  302. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardScrapeScript.swift +558 -0
  303. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebViewCache.swift +204 -0
  304. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebsiteDataStore.swift +78 -0
  305. package/Sources/RunicCore/PathEnvironment.swift +482 -0
  306. package/Sources/RunicCore/Performance/PerformanceModels.swift +371 -0
  307. package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +409 -0
  308. package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +178 -0
  309. package/Sources/RunicCore/ProjectBudgetStore.swift +99 -0
  310. package/Sources/RunicCore/ProviderCostSnapshot.swift +29 -0
  311. package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +66 -0
  312. package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +685 -0
  313. package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +83 -0
  314. package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +142 -0
  315. package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +141 -0
  316. package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +186 -0
  317. package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +126 -0
  318. package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +168 -0
  319. package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +84 -0
  320. package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +75 -0
  321. package/Sources/RunicCore/Providers/Claude/ClaudeCLISession.swift +332 -0
  322. package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthCredentials.swift +180 -0
  323. package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +137 -0
  324. package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +207 -0
  325. package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +654 -0
  326. package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +28 -0
  327. package/Sources/RunicCore/Providers/Claude/ClaudeUsageFetcher.swift +480 -0
  328. package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +780 -0
  329. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthCredentials.swift +146 -0
  330. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +269 -0
  331. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexTokenRefresher.swift +100 -0
  332. package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +243 -0
  333. package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +125 -0
  334. package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +24 -0
  335. package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +181 -0
  336. package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +83 -0
  337. package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +85 -0
  338. package/Sources/RunicCore/Providers/Copilot/CopilotDeviceFlow.swift +123 -0
  339. package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +114 -0
  340. package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +100 -0
  341. package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +291 -0
  342. package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +386 -0
  343. package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +65 -0
  344. package/Sources/RunicCore/Providers/Cursor/CursorStatusProbe.swift +594 -0
  345. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +85 -0
  346. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +108 -0
  347. package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +398 -0
  348. package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +65 -0
  349. package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +1275 -0
  350. package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +84 -0
  351. package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +75 -0
  352. package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +65 -0
  353. package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +835 -0
  354. package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +83 -0
  355. package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +71 -0
  356. package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +83 -0
  357. package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +77 -0
  358. package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +92 -0
  359. package/Sources/RunicCore/Providers/MiniMax/MiniMaxSettingsReader.swift +54 -0
  360. package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +171 -0
  361. package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +911 -0
  362. package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +84 -0
  363. package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +75 -0
  364. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +87 -0
  365. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +207 -0
  366. package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +84 -0
  367. package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +75 -0
  368. package/Sources/RunicCore/Providers/ProviderBranding.swift +25 -0
  369. package/Sources/RunicCore/Providers/ProviderCLIConfig.swift +17 -0
  370. package/Sources/RunicCore/Providers/ProviderDescriptor.swift +129 -0
  371. package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +263 -0
  372. package/Sources/RunicCore/Providers/ProviderSettingsSnapshot.swift +98 -0
  373. package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +501 -0
  374. package/Sources/RunicCore/Providers/ProviderVersionDetector.swift +68 -0
  375. package/Sources/RunicCore/Providers/Providers.swift +184 -0
  376. package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +84 -0
  377. package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +30 -0
  378. package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +317 -0
  379. package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +84 -0
  380. package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +75 -0
  381. package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +83 -0
  382. package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +75 -0
  383. package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +123 -0
  384. package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +48 -0
  385. package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +144 -0
  386. package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +83 -0
  387. package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +75 -0
  388. package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +72 -0
  389. package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +41 -0
  390. package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +724 -0
  391. package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +385 -0
  392. package/Sources/RunicCore/Sync/SyncConflictResolver.swift +310 -0
  393. package/Sources/RunicCore/Sync/SyncProtocol.swift +288 -0
  394. package/Sources/RunicCore/Sync/SyncRecord.swift +405 -0
  395. package/Sources/RunicCore/Sync/SyncUsageExample.swift +294 -0
  396. package/Sources/RunicCore/Sync/TeamSyncRecords.swift +775 -0
  397. package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +333 -0
  398. package/Sources/RunicCore/Team/TeamModels.swift +583 -0
  399. package/Sources/RunicCore/Team/TeamShowbackExporter.swift +495 -0
  400. package/Sources/RunicCore/Team/TeamStore.swift +792 -0
  401. package/Sources/RunicCore/TextParsing.swift +55 -0
  402. package/Sources/RunicCore/UsageFetcher.swift +694 -0
  403. package/Sources/RunicCore/UsageFormatter.swift +410 -0
  404. package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +329 -0
  405. package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +448 -0
  406. package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +550 -0
  407. package/Sources/RunicCore/UsageLedger/UsageLedger.swift +29 -0
  408. package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +660 -0
  409. package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +209 -0
  410. package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +417 -0
  411. package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +245 -0
  412. package/Sources/RunicCore/UsagePace.swift +81 -0
  413. package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +73 -0
  414. package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +74 -0
  415. package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +208 -0
  416. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Claude.swift +455 -0
  417. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Timestamp.swift +132 -0
  418. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +589 -0
  419. package/Sources/RunicCore/WidgetSnapshot.swift +183 -0
  420. package/Sources/RunicMacroSupport/ProviderRegistrationMacros.swift +14 -0
  421. package/Sources/RunicMacros/ProviderRegistrationMacros.swift +216 -0
  422. package/Sources/RunicWidget/RunicWidgetBundle.swift +79 -0
  423. package/Sources/RunicWidget/RunicWidgetProvider.swift +283 -0
  424. package/Sources/RunicWidget/RunicWidgetViews.swift +680 -0
  425. package/Tests/RunicTests/AntigravityStatusProbeTests.swift +50 -0
  426. package/Tests/RunicTests/AppDelegateTests.swift +43 -0
  427. package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +22 -0
  428. package/Tests/RunicTests/CLIArgumentParsingTests.swift +70 -0
  429. package/Tests/RunicTests/CLICostTests.swift +65 -0
  430. package/Tests/RunicTests/CLIProviderSelectionTests.swift +22 -0
  431. package/Tests/RunicTests/CLISnapshotTests.swift +72 -0
  432. package/Tests/RunicTests/CLIWebFallbackTests.swift +58 -0
  433. package/Tests/RunicTests/ClaudeOAuthTests.swift +164 -0
  434. package/Tests/RunicTests/ClaudeResilienceTests.swift +30 -0
  435. package/Tests/RunicTests/ClaudeUsageTests.swift +370 -0
  436. package/Tests/RunicTests/CodexOAuthTests.swift +122 -0
  437. package/Tests/RunicTests/CodexUsageLogSourceTests.swift +82 -0
  438. package/Tests/RunicTests/CopilotTokenResolverTests.swift +75 -0
  439. package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +75 -0
  440. package/Tests/RunicTests/CostUsageDecodingTests.swift +394 -0
  441. package/Tests/RunicTests/CostUsagePricingTests.swift +50 -0
  442. package/Tests/RunicTests/CostUsageScannerTests.swift +700 -0
  443. package/Tests/RunicTests/CursorStatusProbeTests.swift +323 -0
  444. package/Tests/RunicTests/FactoryStatusProbeTests.swift +69 -0
  445. package/Tests/RunicTests/GeminiAPITestHelpers.swift +94 -0
  446. package/Tests/RunicTests/GeminiLoginAlertTests.swift +28 -0
  447. package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +283 -0
  448. package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +279 -0
  449. package/Tests/RunicTests/GeminiStatusProbeTests.swift +233 -0
  450. package/Tests/RunicTests/GeminiTestEnvironment.swift +87 -0
  451. package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +73 -0
  452. package/Tests/RunicTests/InstallOriginTests.swift +18 -0
  453. package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +9 -0
  454. package/Tests/RunicTests/LiveAccountTests.swift +24 -0
  455. package/Tests/RunicTests/LoadingPatternTests.swift +35 -0
  456. package/Tests/RunicTests/MenuCardModelTests.swift +545 -0
  457. package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +8 -0
  458. package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +8 -0
  459. package/Tests/RunicTests/MiniMaxParsingTests.swift +68 -0
  460. package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +8 -0
  461. package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +112 -0
  462. package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +17 -0
  463. package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +75 -0
  464. package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +27 -0
  465. package/Tests/RunicTests/OpenAIDashboardParserTests.swift +134 -0
  466. package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +53 -0
  467. package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +92 -0
  468. package/Tests/RunicTests/PathBuilderTests.swift +237 -0
  469. package/Tests/RunicTests/ProviderFetchPipelineTests.swift +160 -0
  470. package/Tests/RunicTests/ProviderIconResourcesTests.swift +38 -0
  471. package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +16 -0
  472. package/Tests/RunicTests/ProviderRegistryTests.swift +29 -0
  473. package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +202 -0
  474. package/Tests/RunicTests/ProviderToggleStoreTests.swift +51 -0
  475. package/Tests/RunicTests/RunicTests.swift +120 -0
  476. package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +36 -0
  477. package/Tests/RunicTests/SettingsStoreTests.swift +161 -0
  478. package/Tests/RunicTests/StatusItemAnimationTests.swift +49 -0
  479. package/Tests/RunicTests/StatusMenuTests.swift +434 -0
  480. package/Tests/RunicTests/StatusProbeTests.swift +377 -0
  481. package/Tests/RunicTests/SubprocessRunnerTests.swift +20 -0
  482. package/Tests/RunicTests/SubscriptionDetectionTests.swift +65 -0
  483. package/Tests/RunicTests/TTYCommandRunnerTests.swift +148 -0
  484. package/Tests/RunicTests/TTYIntegrationTests.swift +41 -0
  485. package/Tests/RunicTests/TeamShowbackExporterTests.swift +159 -0
  486. package/Tests/RunicTests/TextParsingTests.swift +12 -0
  487. package/Tests/RunicTests/UsageFormatterTests.swift +112 -0
  488. package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +172 -0
  489. package/Tests/RunicTests/UsageLedgerForecastTests.swift +213 -0
  490. package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +83 -0
  491. package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +170 -0
  492. package/Tests/RunicTests/UsagePaceTests.swift +77 -0
  493. package/Tests/RunicTests/UsagePaceTextTests.swift +109 -0
  494. package/Tests/RunicTests/UsagePolicyEngineTests.swift +91 -0
  495. package/Tests/RunicTests/WidgetSnapshotTests.swift +45 -0
  496. package/Tests/RunicTests/ZaiProviderTests.swift +61 -0
  497. package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +6 -0
  498. package/TestsLinux/PlatformGatingTests.swift +46 -0
  499. package/appcast.xml +105 -0
  500. package/assets/logo-concept-stack.svg +24 -0
  501. package/assets/logo-minimal-bars.svg +15 -0
  502. package/assets/logo.svg +20 -0
  503. package/assets/logo2.svg +43 -0
  504. package/bin/docs-list +5 -0
  505. package/bin/install-runic-cli.sh +32 -0
  506. package/build-and-run.sh +369 -0
  507. package/docs/.nojekyll +1 -0
  508. package/docs/CNAME +1 -0
  509. package/docs/antigravity.md +75 -0
  510. package/docs/architecture.md +32 -0
  511. package/docs/claude.md +93 -0
  512. package/docs/cli-commands/integration_guide.md +371 -0
  513. package/docs/cli-commands/quick_reference.md +362 -0
  514. package/docs/cli-commands/readme.md +361 -0
  515. package/docs/cli.md +156 -0
  516. package/docs/cloudkit_sync_guide.md +495 -0
  517. package/docs/codebase_review.md +288 -0
  518. package/docs/codex-oauth.md +635 -0
  519. package/docs/codex.md +104 -0
  520. package/docs/codexbar.png +0 -0
  521. package/docs/copilot.md +44 -0
  522. package/docs/cursor.md +46 -0
  523. package/docs/design/designcomparisonchart.md +510 -0
  524. package/docs/design/implementationguide.md +792 -0
  525. package/docs/design/menubaricondesignconcepts.md +796 -0
  526. package/docs/design/mockups/hybridiconconcept.svg +62 -0
  527. package/docs/design/mockups/infinityiconconcept.svg +41 -0
  528. package/docs/design/mockups/infinityiconstates.svg +129 -0
  529. package/docs/design/mockups/wavelogorefined.svg +48 -0
  530. package/docs/design/quick_summary.md +426 -0
  531. package/docs/design/readme.md +478 -0
  532. package/docs/design/sizespecifications.md +575 -0
  533. package/docs/design-system.md +836 -0
  534. package/docs/factory.md +103 -0
  535. package/docs/gemini.md +73 -0
  536. package/docs/icon.md +37 -0
  537. package/docs/icon.png +0 -0
  538. package/docs/index.html +175 -0
  539. package/docs/keychain_fix.md +274 -0
  540. package/docs/minimax.md +71 -0
  541. package/docs/packaging.md +25 -0
  542. package/docs/progress-bar-improvements.md +240 -0
  543. package/docs/progress-bar-quick-reference.md +283 -0
  544. package/docs/progress-bar-technical-details.md +432 -0
  545. package/docs/progress-bar-visual-test.swift +375 -0
  546. package/docs/provider.md +202 -0
  547. package/docs/providers.md +86 -0
  548. package/docs/refactor/macros.md +35 -0
  549. package/docs/refresh-loop.md +22 -0
  550. package/docs/releasing-homebrew.md +35 -0
  551. package/docs/releasing.md +121 -0
  552. package/docs/research/concrete_todo_2026-02-22.md +47 -0
  553. package/docs/research/core-feature-research.md +248 -0
  554. package/docs/research/feature_uiux_roadmap_2026-02-22.md +202 -0
  555. package/docs/research/parity_matrix.md +49 -0
  556. package/docs/research/provider_expansion_candidates_2026-02-22.md +80 -0
  557. package/docs/research/provider_model_token_project_matrix_2026-02-23.md +46 -0
  558. package/docs/research/release_gate_checklist.md +57 -0
  559. package/docs/site.css +505 -0
  560. package/docs/sparkle.md +28 -0
  561. package/docs/status.md +28 -0
  562. package/docs/sync/implementation.md +393 -0
  563. package/docs/sync/readme.md +317 -0
  564. package/docs/sync_files_summary.md +391 -0
  565. package/docs/sync_quick_reference.md +225 -0
  566. package/docs/todo.md +11 -0
  567. package/docs/ui.md +29 -0
  568. package/docs/web-integration.md +9 -0
  569. package/docs/widgets.md +85 -0
  570. package/docs/workflows/error-handling-improvements.md +434 -0
  571. package/docs/workflows/folder_structure.md +299 -0
  572. package/docs/workflows/loading_states.md +446 -0
  573. package/docs/workflows/loading_states_examples.md +565 -0
  574. package/docs/workflows/loading_states_flow.md +430 -0
  575. package/docs/workflows/performance_optimizations.md +457 -0
  576. package/docs/workflows/phase1-cli-testing-report.md +313 -0
  577. package/docs/workflows/quick_reference.md +228 -0
  578. package/docs/workflows/readme.md +59 -0
  579. package/docs/workflows/recent_improvements.md +275 -0
  580. package/docs/workflows/sync_enablement_summary.md +400 -0
  581. package/docs/zai.md +43 -0
  582. package/package.json +36 -0
  583. package/runic.png +0 -0
  584. package/version.env +2 -0
@@ -0,0 +1,796 @@
1
+ # Runic Menubar Icon Design Concepts
2
+
3
+ **Date:** February 1, 2026
4
+ **Status:** Design Proposal
5
+ **Author:** Design Review
6
+
7
+ ## Executive Summary
8
+
9
+ This document compares three design concepts for the Runic menubar icon:
10
+ - **Option A:** Infinity Symbol + Provider Icon (monitoring eyes concept)
11
+ - **Option B:** Wave Logo (current design)
12
+ - **Option C:** Hybrid - Infinity + Usage Indicators
13
+
14
+ Each concept is evaluated for symbolism, usability, technical feasibility, and visual clarity at macOS menubar scale.
15
+
16
+ ---
17
+
18
+ ## Current State Analysis
19
+
20
+ ### Current Wave Logo (RunicMenubarIcon.svg)
21
+
22
+ **Specifications:**
23
+ - Viewport: 46×78 to 210×178 (164×100 effective)
24
+ - Current render size: 38×22pt (76×44px @2x)
25
+ - Elements:
26
+ - Wave/knot path (stroke: #14B8A6, 18px thick)
27
+ - Center circle accent (32×32px, fill: #2DD4BF)
28
+ - Three usage bars (8px wide, varying heights, fill: #0F766E)
29
+
30
+ **Strengths:**
31
+ - Shows live usage data through bar heights
32
+ - Distinctive wave/infinity-like shape
33
+ - Good color gradation (teal palette)
34
+ - Already implemented and rendered efficiently
35
+
36
+ **Weaknesses:**
37
+ - Complex at small size (22pt height = 44px @2x)
38
+ - Wave pattern can blur on non-Retina displays
39
+ - Limited symbolic meaning (abstract wave shape)
40
+ - No clear provider identification
41
+ - Bars too small to read precise values
42
+
43
+ ---
44
+
45
+ ## Design Concepts
46
+
47
+ ### Option A: Infinity Symbol + Provider Icon
48
+
49
+ **Core Concept:**
50
+ The infinity symbol (∞) represents "eyes watching" your AI usage. The space between the loops displays the active provider's icon, creating a visual metaphor of Runic monitoring your AI provider.
51
+
52
+ #### Visual Design
53
+
54
+ **Infinity Symbol Specifications:**
55
+ - **Overall size:** 38×22pt (width × height)
56
+ - **Infinity stroke:** 4pt thick line
57
+ - **Loop radius:** 7pt per loop
58
+ - **Center gap:** 10pt wide × 12pt tall (for provider icon)
59
+ - **Provider icon:** 8×8pt (16×16px @2x)
60
+
61
+ **Layout:**
62
+ ```
63
+ ┌────────────────────────────────────┐
64
+ │ │
65
+ │ ╭──╮ ╭──╮ │
66
+ │ │ │ 👁 │ │ │
67
+ │ ╰──╯ ╰──╯ │
68
+ │ │
69
+ └────────────────────────────────────┘
70
+ ```
71
+
72
+ #### States & Variations
73
+
74
+ 1. **Default State:**
75
+ - Monochrome template rendering (adapts to light/dark mode)
76
+ - Provider icon in center (full opacity)
77
+ - Infinity loops at 100% opacity
78
+
79
+ 2. **Usage Pressure Coloring:**
80
+ - Safe (0-50% used): Teal (#14B8A6)
81
+ - Warning (50-80% used): Orange (#FFB84D)
82
+ - Critical (80-100% used): Red (#FF4F70)
83
+ - Apply color to infinity loops, keep provider icon white/black
84
+
85
+ 3. **Stale Data:**
86
+ - Reduce opacity to 55%
87
+ - Slight desaturation
88
+
89
+ 4. **Multiple Providers Active:**
90
+ - Show "combined" icon (perhaps stacked dots or merged symbol)
91
+ - Alternative: cycle between provider icons every 3 seconds
92
+
93
+ #### Pros
94
+
95
+ **Symbolic Strength:**
96
+ - Clear metaphor: "eyes watching" = monitoring
97
+ - Infinity = continuous tracking
98
+ - Immediately communicates app purpose
99
+
100
+ **Visual Clarity:**
101
+ - Simple, bold shape recognizable at 18-26pt
102
+ - Provider icon clearly visible in center
103
+ - Less visual noise than current wave design
104
+
105
+ **Scalability:**
106
+ - Works well from 18pt to 32pt
107
+ - Clean lines render sharply on all displays
108
+ - Template rendering ensures perfect dark/light mode adaptation
109
+
110
+ **Brand Identity:**
111
+ - Memorable, unique icon
112
+ - "Eyes on your AI" tagline potential
113
+ - Strong conceptual foundation
114
+
115
+ #### Cons
116
+
117
+ **Limited Data Visualization:**
118
+ - Doesn't show live usage bars
119
+ - No immediate visual feedback on quota consumption
120
+ - User must click to see detailed metrics
121
+
122
+ **Provider Icon Constraints:**
123
+ - Center area limited to 8-10pt icons
124
+ - Some provider logos may not scale well
125
+ - Requires maintaining clear provider icons
126
+
127
+ **Less Informative:**
128
+ - Loses at-a-glance usage information
129
+ - More symbolic, less functional
130
+ - User must memorize color meaning
131
+
132
+ #### Implementation Complexity
133
+
134
+ **Medium Complexity:**
135
+
136
+ 1. **SVG Creation:**
137
+ - Simple infinity curve path (Bézier curves)
138
+ - Template rendering for color adaptation
139
+ - Provider icon overlay (multiply blend mode)
140
+
141
+ 2. **Dynamic Rendering:**
142
+ ```swift
143
+ static func drawInfinityWithProvider(
144
+ providerIcon: NSImage,
145
+ pressure: Double,
146
+ appearance: IconAppearance
147
+ ) -> NSImage {
148
+ // Draw infinity path
149
+ // Apply pressure coloring
150
+ // Composite provider icon in center
151
+ // Return template or vibrant image
152
+ }
153
+ ```
154
+
155
+ 3. **Performance:**
156
+ - Cache infinity base shapes
157
+ - Cache per-provider compositions
158
+ - ~50-100 cached variations (providers × pressure levels)
159
+
160
+ ---
161
+
162
+ ### Option B: Wave Logo (Current Design)
163
+
164
+ **Keep the current design with potential refinements.**
165
+
166
+ #### Proposed Refinements
167
+
168
+ 1. **Size Optimization:**
169
+ - Increase to 40×24pt (from 38×22pt) for better bar visibility
170
+ - Maintain 2× scale for Retina clarity
171
+
172
+ 2. **Simplified Color Palette:**
173
+ - Reduce to 2-color scheme for template mode
174
+ - Make bars more prominent (wider: 10px instead of 8px)
175
+
176
+ 3. **Usage Bar Enhancements:**
177
+ - Animate bars on hover (subtle pulse)
178
+ - Add tooltips showing exact percentages
179
+ - Color-code bars by pressure level
180
+
181
+ #### Pros
182
+
183
+ **Data-Rich:**
184
+ - Shows live usage at a glance
185
+ - Three bars = session/weekly/credits data
186
+ - Instant visual feedback
187
+
188
+ **Already Implemented:**
189
+ - No redesign required
190
+ - Proven performance
191
+ - Existing cache system optimized
192
+
193
+ **Informative:**
194
+ - Power users can monitor usage without clicking
195
+ - Visual trends over time
196
+ - Multiple data dimensions
197
+
198
+ #### Cons
199
+
200
+ **Visual Complexity:**
201
+ - Bars hard to read at 22pt height
202
+ - Wave pattern adds visual noise
203
+ - Not immediately recognizable
204
+
205
+ **Weak Symbolism:**
206
+ - Abstract wave shape
207
+ - No clear connection to "monitoring" or "AI"
208
+ - Generic technology aesthetic
209
+
210
+ **Scaling Issues:**
211
+ - Bars become illegible below 20pt
212
+ - Wave detail lost on low-DPI displays
213
+ - Template rendering flattens detail
214
+
215
+ ---
216
+
217
+ ### Option C: Hybrid - Infinity + Usage Indicators
218
+
219
+ **Best of both worlds: symbolic infinity with functional usage display.**
220
+
221
+ #### Visual Design
222
+
223
+ **Concept:**
224
+ - Infinity symbol outline (3pt stroke)
225
+ - Single consolidated usage bar overlaid in the center gap
226
+ - Provider badge in corner (6×6pt)
227
+
228
+ **Layout:**
229
+ ```
230
+ ┌────────────────────────────────────┐
231
+ │ │
232
+ │ ╭──╮ ███ ╭──╮ [C] │
233
+ │ │ │ ███ │ │ │
234
+ │ ╰──╯ ███ ╰──╯ │
235
+ │ │
236
+ └────────────────────────────────────┘
237
+ ```
238
+
239
+ **Specifications:**
240
+ - Infinity loops: 3pt stroke, 6pt radius each
241
+ - Center bar: 10pt wide × 12pt tall, fill indicates usage %
242
+ - Provider badge: 6×6pt circle in top-right corner
243
+
244
+ #### States & Variations
245
+
246
+ 1. **Usage Bar Fill:**
247
+ - Empty state: 10% fill (show container outline)
248
+ - Progressive fill from bottom to top
249
+ - Color transitions: teal → orange → red
250
+
251
+ 2. **Provider Badge:**
252
+ - Small provider icon or colored dot
253
+ - Indicates active provider
254
+ - Subtle glow when actively syncing
255
+
256
+ 3. **Infinity Outline:**
257
+ - Always visible (base color)
258
+ - Optional: pulse animation during sync
259
+
260
+ #### Pros
261
+
262
+ **Balanced Design:**
263
+ - Maintains symbolic "eyes watching" concept
264
+ - Shows usage data in center bar
265
+ - Provider identification via badge
266
+
267
+ **Functional:**
268
+ - At-a-glance usage percentage
269
+ - Simpler than three bars (one consolidated metric)
270
+ - Clear visual hierarchy
271
+
272
+ **Scalable:**
273
+ - Works from 20-28pt
274
+ - Both elements remain visible at small sizes
275
+ - Better than current wave complexity
276
+
277
+ #### Cons
278
+
279
+ **Compromised Simplicity:**
280
+ - More complex than pure infinity symbol
281
+ - Bar may compete with infinity shape
282
+ - Provider badge might be too small
283
+
284
+ **Reduced Data:**
285
+ - Only one bar (vs. three in current design)
286
+ - Loses session/weekly/credits breakdown
287
+ - Must consolidate metrics (show most critical)
288
+
289
+ **Implementation Effort:**
290
+ - New design and testing required
291
+ - Hybrid rendering logic
292
+ - More cache permutations
293
+
294
+ ---
295
+
296
+ ## Size Recommendations & Technical Specifications
297
+
298
+ ### macOS Menubar Icon Guidelines
299
+
300
+ **Standard Sizes:**
301
+ - **Recommended:** 22pt square (44×44px @2x)
302
+ - **Apple HIG:** 18-22pt for simple icons, up to 28pt for detailed
303
+ - **Runic current:** 38×22pt (rectangular, not square)
304
+
305
+ **Rendering Requirements:**
306
+ - Must provide @2x (Retina) and @1x (legacy) bitmaps
307
+ - Template rendering: use alpha channel, system colors
308
+ - Safe area: 2pt padding from edges
309
+ - Pixel grid alignment at @2x scale
310
+
311
+ ### Recommended Sizes by Concept
312
+
313
+ #### Option A: Infinity Symbol
314
+ - **Optimal height:** 20-24pt
315
+ - **Width:** 36-42pt (to fit provider icon)
316
+ - **Rationale:** Simple geometric shape scales well, needs width for two loops
317
+
318
+ **Proposed:** 40×24pt
319
+ - Infinity loops: 8pt radius each, 4pt stroke
320
+ - Center gap: 12pt wide (fits 8pt provider icon comfortably)
321
+ - Provider icon: 8×8pt (16×16px @2x) with 2pt padding
322
+
323
+ #### Option B: Wave Logo (Current)
324
+ - **Current:** 38×22pt (adequate but cramped)
325
+ - **Recommended:** 40×24pt or 42×26pt
326
+ - **Rationale:** More vertical space for bars, clearer wave detail
327
+
328
+ **Proposed:** 42×26pt
329
+ - Wave path: 20pt stroke
330
+ - Center circle: 36×36pt
331
+ - Usage bars: 10pt wide × 20-28pt tall (varies)
332
+
333
+ #### Option C: Hybrid
334
+ - **Optimal:** 40×24pt
335
+ - **Rationale:** Balances infinity outline and center bar
336
+
337
+ **Proposed:** 40×24pt
338
+ - Infinity: 3pt stroke, 7pt radius loops
339
+ - Center bar: 10×14pt
340
+ - Provider badge: 6×6pt in corner
341
+
342
+ ### Retina Display Considerations
343
+
344
+ **2× Scale (@2x):**
345
+ - All dimensions double in pixels
346
+ - 24pt height = 48px bitmap height
347
+ - Ensures sharp rendering on MacBook Pro/Air displays
348
+
349
+ **Anti-aliasing:**
350
+ - Use sub-pixel rendering for smooth curves
351
+ - Align vertical/horizontal edges to pixel grid
352
+ - Avoid fractional pixel positions at @2x scale
353
+
354
+ **Color Depth:**
355
+ - 32-bit RGBA (8 bits per channel)
356
+ - Alpha channel for template rendering
357
+ - sRGB color space
358
+
359
+ ---
360
+
361
+ ## Color Schemes & Template Rendering
362
+
363
+ ### Template Mode (Recommended)
364
+
365
+ **What is Template Rendering?**
366
+ - macOS automatically adapts icon to menubar theme
367
+ - Light mode: dark icon on light background
368
+ - Dark mode: light icon on dark background
369
+ - System handles all color adaptation
370
+
371
+ **Implementation:**
372
+ ```swift
373
+ image.isTemplate = true
374
+ ```
375
+
376
+ **Benefits:**
377
+ - Perfect theme integration
378
+ - No manual light/dark variants
379
+ - System-level accessibility support
380
+ - Consistent with other menubar apps
381
+
382
+ **Limitations:**
383
+ - Single color (no multi-color icons)
384
+ - Alpha channel defines shape only
385
+ - Cannot show colored provider icons in template mode
386
+
387
+ ### Vibrant Mode (Optional)
388
+
389
+ **Full Color Rendering:**
390
+ - Custom color palette preserved
391
+ - Pressure coloring (teal → orange → red)
392
+ - Colored provider icons
393
+
394
+ **Use Cases:**
395
+ - User preference toggle in settings
396
+ - High-priority alerts (critical usage)
397
+ - Branding emphasis over integration
398
+
399
+ **Implementation:**
400
+ ```swift
401
+ image.isTemplate = false
402
+ // Apply custom colors during rendering
403
+ ```
404
+
405
+ ### Recommended Approach
406
+
407
+ **Default: Template Mode**
408
+ - Clean, professional appearance
409
+ - Perfect system integration
410
+ - Accessibility compliant
411
+
412
+ **Optional: Vibrant Mode**
413
+ - User-configurable in preferences
414
+ - Fallback for alerts (flash red when critical)
415
+ - Provider-specific colors if desired
416
+
417
+ ---
418
+
419
+ ## Usage Indicator Integration
420
+
421
+ ### Option A: Infinity Symbol - How to Show Usage?
422
+
423
+ Since the infinity symbol doesn't inherently display data, here are options:
424
+
425
+ #### 1. **Color Pressure Mapping**
426
+ - **0-50% used:** Teal infinity loops (#14B8A6)
427
+ - **50-80% used:** Orange loops (#FFB84D)
428
+ - **80-100% used:** Red loops (#FF4F70)
429
+ - **Pros:** Subtle, doesn't clutter icon
430
+ - **Cons:** Requires user to learn color meaning
431
+
432
+ #### 2. **Accent Dot**
433
+ - Small dot (4×4pt) on infinity curve
434
+ - Position along curve indicates usage percentage
435
+ - Color indicates pressure level
436
+ - **Pros:** Visual metaphor (progress indicator)
437
+ - **Cons:** Tiny, may be hard to notice
438
+
439
+ #### 3. **No Direct Indicator**
440
+ - Icon remains symbolic only
441
+ - User clicks to see detailed usage
442
+ - Menubar tooltip shows percentage on hover
443
+ - **Pros:** Cleanest design
444
+ - **Cons:** Less functional than current wave
445
+
446
+ **Recommendation:** Use **Color Pressure Mapping** for Option A. It's subtle, doesn't add visual complexity, and provides at-a-glance status.
447
+
448
+ ### Option B: Wave Logo - Current Approach
449
+
450
+ - Three vertical bars show session/weekly/credits usage
451
+ - Bar height = percentage used or remaining
452
+ - Bars are color-coded or use same teal palette
453
+
454
+ **Keep as-is or enhance:**
455
+ - Make bars 2pt wider (10pt instead of 8pt)
456
+ - Add subtle glow when nearing limits
457
+ - Animate on hover (optional)
458
+
459
+ ### Option C: Hybrid - Center Bar
460
+
461
+ - Single bar in infinity center gap
462
+ - Shows most critical metric (lowest remaining percentage)
463
+ - Fill level = usage percentage
464
+ - Color = pressure level
465
+
466
+ **Advantages:**
467
+ - Simpler than three bars
468
+ - Consolidated "worst-case" metric
469
+ - More visible than Option A color coding
470
+
471
+ ---
472
+
473
+ ## Provider Icon Considerations
474
+
475
+ ### Option A: Center Icon (8-10pt)
476
+
477
+ **Requirements:**
478
+ - **Size:** 8×8pt minimum (16×16px @2x)
479
+ - **Clarity:** Must be recognizable at small scale
480
+ - **Contrast:** Must work on both light and dark backgrounds
481
+
482
+ **Design Guidelines for Provider Icons:**
483
+
484
+ 1. **Simple Geometry:**
485
+ - Avoid fine details
486
+ - Use bold shapes
487
+ - Prefer geometric symbols over text
488
+
489
+ 2. **High Contrast:**
490
+ - Solid fills or thick strokes (2pt+)
491
+ - Avoid gradients or textures
492
+ - White outline for dark backgrounds (optional)
493
+
494
+ 3. **Example Provider Icons:**
495
+ - **Claude:** Two vertical slits (current design: 2×6pt)
496
+ - **Codex:** Two square eyes (3×3pt)
497
+ - **Gemini:** Diamond shape (8pt diagonal)
498
+ - **Cursor:** Arrow/pointer (6pt)
499
+ - **Copilot:** Circular eyes with bridge
500
+
501
+ **Existing Icons:** Already well-designed at small scale (see IconRenderer.swift, lines 300-473)
502
+
503
+ ### Option C: Corner Badge (6×6pt)
504
+
505
+ **Smaller but less critical:**
506
+ - Simple colored dot or 1-letter abbreviation
507
+ - Background circle with contrasting icon
508
+ - Examples:
509
+ - **Claude:** Orange dot with "C"
510
+ - **Codex:** Purple dot with "<>"
511
+ - **Gemini:** Blue dot with star
512
+
513
+ **Trade-off:** Less recognizable but saves center space for usage bar
514
+
515
+ ---
516
+
517
+ ## Implementation Recommendations
518
+
519
+ ### Option A: Infinity Symbol + Provider Icon
520
+
521
+ #### SVG Structure
522
+ ```xml
523
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 48">
524
+ <!-- Infinity loops -->
525
+ <path d="M20,24 C20,15 30,15 35,24 C40,33 50,33 50,24
526
+ C50,15 40,15 35,24 C30,33 20,33 20,24"
527
+ stroke="#14B8A6" stroke-width="8"
528
+ fill="none" stroke-linecap="round"/>
529
+
530
+ <!-- Provider icon placeholder (replace with actual icon) -->
531
+ <circle cx="40" cy="24" r="4" fill="#FFFFFF"/>
532
+ </svg>
533
+ ```
534
+
535
+ #### Swift Rendering Code
536
+ ```swift
537
+ static func drawInfinityIcon(
538
+ provider: UsageProvider,
539
+ pressure: Double,
540
+ appearance: IconAppearance
541
+ ) -> NSImage {
542
+ let color = vibrantAccentColor(pressure: pressure, stale: false)
543
+ let baseColor = appearance == .template ? NSColor.labelColor : color
544
+
545
+ return renderImage(isTemplate: appearance == .template) {
546
+ // Draw infinity path
547
+ drawInfinityPath(color: baseColor)
548
+
549
+ // Composite provider icon in center
550
+ if let providerIcon = loadProviderIcon(provider) {
551
+ drawProviderIcon(providerIcon, center: centerPoint)
552
+ }
553
+ }
554
+ }
555
+
556
+ private static func drawInfinityPath(color: NSColor) {
557
+ let path = NSBezierPath()
558
+ // Left loop
559
+ path.appendArc(
560
+ withCenter: NSPoint(x: 15, y: 12),
561
+ radius: 7,
562
+ startAngle: 0,
563
+ endAngle: 360
564
+ )
565
+ // Right loop
566
+ path.appendArc(
567
+ withCenter: NSPoint(x: 25, y: 12),
568
+ radius: 7,
569
+ startAngle: 0,
570
+ endAngle: 360
571
+ )
572
+ // Connect loops to form infinity
573
+ // (simplified - actual Bézier curves needed for smooth infinity shape)
574
+
575
+ path.lineWidth = 4
576
+ color.setStroke()
577
+ path.stroke()
578
+ }
579
+ ```
580
+
581
+ #### Caching Strategy
582
+ - Cache base infinity shapes (one per pressure color)
583
+ - Cache provider icon compositions
584
+ - Key: `InfinityCacheKey(provider, pressure, appearance)`
585
+ - Estimated cache size: ~50 variations (10 providers × 5 pressure levels)
586
+
587
+ ### Option B: Wave Logo Enhancements
588
+
589
+ #### Minimal Changes
590
+ ```swift
591
+ // Increase bar width from 8 to 10
592
+ static let barWidth = 10.0
593
+
594
+ // Increase overall height from 22 to 24
595
+ static let outputSize = NSSize(width: 40, height: 24)
596
+ ```
597
+
598
+ #### Optional Animations
599
+ ```swift
600
+ // Add subtle pulse to bars when nearing limit
601
+ if pressure > 0.8 {
602
+ let pulse = sin(CACurrentMediaTime() * 2) * 0.15 + 0.85
603
+ barColor = barColor.withAlphaComponent(pulse)
604
+ }
605
+ ```
606
+
607
+ ### Option C: Hybrid Implementation
608
+
609
+ #### Combined Rendering
610
+ ```swift
611
+ static func drawHybridIcon(
612
+ provider: UsageProvider,
613
+ primaryUsage: Double,
614
+ appearance: IconAppearance
615
+ ) -> NSImage {
616
+ return renderImage(isTemplate: appearance == .template) {
617
+ // 1. Draw infinity outline
618
+ drawInfinityOutline(color: baseColor.withAlphaComponent(0.3))
619
+
620
+ // 2. Draw center usage bar
621
+ drawCenterBar(fillPercent: primaryUsage / 100, color: pressureColor)
622
+
623
+ // 3. Draw provider badge
624
+ drawProviderBadge(provider: provider, position: .topRight)
625
+ }
626
+ }
627
+ ```
628
+
629
+ ---
630
+
631
+ ## Comparison Matrix
632
+
633
+ | Criterion | Option A: Infinity | Option B: Wave | Option C: Hybrid |
634
+ |-----------|-------------------|----------------|------------------|
635
+ | **Symbolism** | ★★★★★ Eyes watching | ★★☆☆☆ Abstract | ★★★★☆ Balanced |
636
+ | **Data Visibility** | ★★☆☆☆ Color only | ★★★★★ 3 bars | ★★★☆☆ 1 bar |
637
+ | **Clarity (18-22pt)** | ★★★★★ Simple shape | ★★★☆☆ Complex | ★★★★☆ Moderate |
638
+ | **Provider ID** | ★★★★★ Center icon | ★☆☆☆☆ None | ★★★☆☆ Badge |
639
+ | **Implementation** | ★★★☆☆ Medium | ★★★★★ Done | ★★☆☆☆ Complex |
640
+ | **Brand Identity** | ★★★★★ Memorable | ★★★☆☆ Generic | ★★★★☆ Good |
641
+ | **User Learning** | ★★★☆☆ Color meaning | ★★★★☆ Intuitive | ★★★★☆ Balanced |
642
+ | **Scalability** | ★★★★★ 18-32pt | ★★★☆☆ 22-28pt | ★★★★☆ 20-26pt |
643
+
644
+ **Rating Scale:** ★★★★★ Excellent | ★★★★☆ Good | ★★★☆☆ Acceptable | ★★☆☆☆ Poor | ★☆☆☆☆ Inadequate
645
+
646
+ ---
647
+
648
+ ## Recommendations
649
+
650
+ ### Primary Recommendation: **Option A - Infinity Symbol + Provider Icon**
651
+
652
+ **Rationale:**
653
+ 1. **Strong Conceptual Foundation:** The "eyes watching" metaphor immediately communicates Runic's purpose
654
+ 2. **Memorable Brand Identity:** Unique, recognizable icon that stands out in the menubar
655
+ 3. **Scalable Design:** Works well from 18pt to 32pt, crucial for different Mac displays
656
+ 4. **Provider Clarity:** Center icon clearly shows which provider is active
657
+ 5. **Modern Aesthetics:** Clean, minimalist design aligns with macOS Big Sur+ design language
658
+
659
+ **Trade-off Acknowledgment:**
660
+ - Loses immediate usage data visibility
661
+ - Users must click to see detailed metrics
662
+ - **Mitigation:** Use color pressure mapping (teal → orange → red) and rich tooltip on hover
663
+
664
+ **Recommended Specifications:**
665
+ - Size: 40×24pt (80×48px @2x)
666
+ - Infinity stroke: 4pt
667
+ - Loop radius: 7pt each
668
+ - Provider icon: 8×8pt in center
669
+ - Color mapping: pressure-based for at-a-glance status
670
+
671
+ ### Secondary Recommendation: **Option C - Hybrid** (if data visibility is critical)
672
+
673
+ **When to Choose:**
674
+ - User feedback demands at-a-glance usage data
675
+ - Power users prioritize metrics over symbolism
676
+ - A/B testing shows higher engagement with visible bars
677
+
678
+ **Recommended Specifications:**
679
+ - Size: 40×24pt
680
+ - Infinity outline: 3pt stroke
681
+ - Center bar: 10×14pt
682
+ - Provider badge: 6×6pt in corner
683
+
684
+ ### Not Recommended: **Option B - Current Wave Logo**
685
+
686
+ **Reasoning:**
687
+ - Weak symbolic connection to monitoring/AI
688
+ - Visual complexity reduces clarity at small sizes
689
+ - Generic technology aesthetic
690
+ - Already implemented, so no forward progress
691
+
692
+ **Exception:** If development timeline is critical and redesign is not feasible, enhance current design with:
693
+ - Increased size to 42×26pt
694
+ - Wider bars (10pt instead of 8pt)
695
+ - Simplified color scheme
696
+
697
+ ---
698
+
699
+ ## Implementation Plan
700
+
701
+ ### Phase 1: Prototyping (Week 1)
702
+ 1. Create SVG mockups for all three options
703
+ 2. Implement basic rendering in IconRenderer
704
+ 3. Test at 18pt, 22pt, 26pt sizes
705
+ 4. Gather internal feedback
706
+
707
+ ### Phase 2: Refinement (Week 2)
708
+ 5. Refine chosen design based on feedback
709
+ 6. Implement caching system
710
+ 7. Add animation states (sync pulse, error flash)
711
+ 8. Test on multiple Mac displays (Retina, non-Retina)
712
+
713
+ ### Phase 3: Integration (Week 3)
714
+ 9. Replace current wave logo in Resources/
715
+ 10. Update IconRenderer.swift rendering logic
716
+ 11. Add user preference toggle (template vs. vibrant mode)
717
+ 12. Update documentation and changelog
718
+
719
+ ### Phase 4: User Testing (Week 4)
720
+ 13. Beta release with new icon
721
+ 14. Collect user feedback
722
+ 15. A/B testing if possible (show different icons to user segments)
723
+ 16. Iterate based on data
724
+
725
+ ---
726
+
727
+ ## Future Enhancements
728
+
729
+ ### Dynamic Animations
730
+ - **Sync Pulse:** Subtle pulse during active data fetch
731
+ - **Alert Flash:** Red flash when usage exceeds threshold
732
+ - **Provider Switch:** Smooth morph animation when switching providers
733
+
734
+ ### Accessibility
735
+ - **VoiceOver Support:** Descriptive labels for icon states
736
+ - **High Contrast Mode:** Thicker strokes, higher contrast colors
737
+ - **Reduced Motion:** Disable animations if system preference set
738
+
739
+ ### Customization
740
+ - **User-Selectable Icons:** Option A, B, or C in preferences
741
+ - **Color Themes:** Custom color schemes beyond default teal
742
+ - **Size Options:** Small (20pt), Medium (24pt), Large (28pt)
743
+
744
+ ---
745
+
746
+ ## Appendices
747
+
748
+ ### Appendix A: SVG Mockup Files
749
+ - `InfinityIconConcept.svg` - Option A full design
750
+ - `InfinityIconStates.svg` - Option A with all states
751
+ - `WaveLogoRefined.svg` - Option B with enhancements
752
+ - `HybridIconConcept.svg` - Option C design
753
+
754
+ ### Appendix B: Technical References
755
+ - Apple Human Interface Guidelines - Menubar Extras
756
+ - macOS Template Image Best Practices
757
+ - IconRenderer.swift (current implementation)
758
+ - NSImage Template Rendering Documentation
759
+
760
+ ### Appendix C: Color Specifications
761
+
762
+ **Teal Palette (Current):**
763
+ - Primary: #14B8A6 (teal-500)
764
+ - Light: #2DD4BF (teal-400)
765
+ - Dark: #0F766E (teal-700)
766
+
767
+ **Pressure Palette (Recommended):**
768
+ - Safe: #14B8A6 (teal-500) - 0-50% usage
769
+ - Warning: #FFB84D (orange-400) - 50-80% usage
770
+ - Critical: #FF4F70 (red-500) - 80-100% usage
771
+ - Stale: 55% opacity on any color
772
+
773
+ **Template Colors:**
774
+ - Light mode: NSColor.labelColor (black ~85% opacity)
775
+ - Dark mode: NSColor.labelColor (white ~85% opacity)
776
+ - System-managed, no manual specification needed
777
+
778
+ ---
779
+
780
+ ## Conclusion
781
+
782
+ The **Infinity Symbol + Provider Icon** design offers the strongest conceptual foundation, best scalability, and most memorable brand identity for Runic. While it sacrifices immediate data visibility compared to the current wave logo, this trade-off is acceptable given:
783
+
784
+ 1. Users can hover for tooltip or click for full details
785
+ 2. Color pressure mapping provides at-a-glance status
786
+ 3. Provider icon adds valuable context missing in current design
787
+ 4. Simpler shape ensures clarity across all display sizes
788
+
789
+ **Next Steps:**
790
+ 1. Create SVG mockups (see attached files)
791
+ 2. Stakeholder review and decision
792
+ 3. Implement chosen design in IconRenderer.swift
793
+ 4. Beta test with users
794
+ 5. Iterate based on feedback
795
+
796
+ **Timeline:** 3-4 weeks from concept approval to production deployment.