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