@sriinnu/runic 1.2.0 → 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (586) hide show
  1. package/CHANGELOG.md +267 -0
  2. package/LICENSE +373 -21
  3. package/README.md +98 -84
  4. package/THIRD-PARTY-NOTICES.md +651 -0
  5. package/package.json +14 -4
  6. package/.swiftformat +0 -50
  7. package/.swiftlint.yml +0 -160
  8. package/CONTRIBUTING.md +0 -456
  9. package/Icon.icns +0 -0
  10. package/Icon.icon/Assets/runic.png +0 -0
  11. package/Icon.icon/icon.json +0 -36
  12. package/Package.resolved +0 -51
  13. package/Package.swift +0 -136
  14. package/Packages/Helix/LICENSE +0 -21
  15. package/Packages/Helix/Package.swift +0 -29
  16. package/Packages/Helix/README.md +0 -976
  17. package/Packages/Helix/Sources/Helix/Binding.swift +0 -111
  18. package/Packages/Helix/Sources/Helix/CommandParser.swift +0 -160
  19. package/Packages/Helix/Sources/Helix/CommandSignature.swift +0 -117
  20. package/Packages/Helix/Sources/Helix/ExpressibleFromArgument.swift +0 -72
  21. package/Packages/Helix/Sources/Helix/HelpGenerator.swift +0 -175
  22. package/Packages/Helix/Sources/Helix/NameSpecification.swift +0 -98
  23. package/Packages/Helix/Sources/Helix/ParsableCommand.swift +0 -204
  24. package/Packages/Helix/Sources/Helix/Platform/DarwinPlatformContext.swift +0 -44
  25. package/Packages/Helix/Sources/Helix/Platform/LinuxPlatformContext.swift +0 -34
  26. package/Packages/Helix/Sources/Helix/Platform/PlatformContext+Default.swift +0 -91
  27. package/Packages/Helix/Sources/Helix/Platform/PlatformContext.swift +0 -94
  28. package/Packages/Helix/Sources/Helix/Platform/PlatformPath.swift +0 -167
  29. package/Packages/Helix/Sources/Helix/Platform/Stdio.swift +0 -99
  30. package/Packages/Helix/Sources/Helix/Platform/WebPlatformContext.swift +0 -146
  31. package/Packages/Helix/Sources/Helix/Platform/WindowsPlatformContext.swift +0 -97
  32. package/Packages/Helix/Sources/Helix/Program.swift +0 -204
  33. package/Packages/Helix/Sources/Helix/PropertyWrappers.swift +0 -367
  34. package/Packages/Silo/LICENSE +0 -21
  35. package/Packages/Silo/Package.swift +0 -34
  36. package/Packages/Silo/README.md +0 -466
  37. package/Packages/Silo/Sources/Silo/BinaryCookiesReader.swift +0 -169
  38. package/Packages/Silo/Sources/Silo/BrowserCookieAnalytics.swift +0 -365
  39. package/Packages/Silo/Sources/Silo/BrowserCookieBackends.swift +0 -594
  40. package/Packages/Silo/Sources/Silo/BrowserCookieClient.swift +0 -326
  41. package/Packages/Silo/Sources/Silo/BrowserCookieExport.swift +0 -154
  42. package/Packages/Silo/Sources/Silo/BrowserCookieImport.swift +0 -119
  43. package/Packages/Silo/Sources/Silo/BrowserCookieMockStore.swift +0 -121
  44. package/Packages/Silo/Sources/Silo/BrowserCookieModels.swift +0 -391
  45. package/Packages/Silo/Sources/Silo/ChromiumCookieReader.swift +0 -240
  46. package/Packages/Silo/Sources/Silo/CryptoSupport.swift +0 -86
  47. package/Packages/Silo/Sources/Silo/FirefoxCookieReader.swift +0 -172
  48. package/Packages/Silo/Sources/Silo/LinuxChromiumCookieReader.swift +0 -172
  49. package/Packages/Silo/Sources/Silo/LinuxSecretService.swift +0 -105
  50. package/Packages/Silo/Sources/Silo/MacOSChromiumCookieReader.swift +0 -191
  51. package/Packages/Silo/Sources/Silo/SQLiteSnapshot.swift +0 -41
  52. package/Packages/Silo/Sources/Silo/WindowsChromiumCookieReader.swift +0 -110
  53. package/RuniciOS/App/RuniciOSApp.swift +0 -105
  54. package/RuniciOS/Core/iOSUsageStore.swift +0 -192
  55. package/RuniciOS/Views/ProviderDetailView.swift +0 -312
  56. package/RuniciOS/Views/ProviderListView.swift +0 -228
  57. package/RuniciOS/Widgets/LargeWidget.swift +0 -367
  58. package/RuniciOS/Widgets/LiveActivity.swift +0 -342
  59. package/RuniciOS/Widgets/LockScreenWidget.swift +0 -273
  60. package/RuniciOS/Widgets/MediumWidget.swift +0 -370
  61. package/RuniciOS/Widgets/RunicWidget.swift +0 -274
  62. package/RuniciOS/Widgets/SmallWidget.swift +0 -281
  63. package/RuniciOS/Widgets/WidgetModels.swift +0 -285
  64. package/RuniciOS/Widgets/WidgetTimeline.swift +0 -270
  65. package/Scripts/CREATION-SUMMARY.md +0 -367
  66. package/Scripts/DIRECTORY-STRUCTURE.md +0 -358
  67. package/Scripts/GETTING-STARTED-CHECKLIST.md +0 -364
  68. package/Scripts/INDEX.md +0 -365
  69. package/Scripts/QUICK-REFERENCE.md +0 -164
  70. package/Scripts/README-SCRIPTS.md +0 -926
  71. package/Scripts/build-android.sh +0 -526
  72. package/Scripts/build-ios.sh +0 -529
  73. package/Scripts/build-macos.sh +0 -603
  74. package/Scripts/build-windows.sh +0 -504
  75. package/Scripts/build_icon.sh +0 -49
  76. package/Scripts/changelog-to-html.sh +0 -89
  77. package/Scripts/check-release-assets.sh +0 -10
  78. package/Scripts/ci-config.yml +0 -474
  79. package/Scripts/compile_and_run.sh +0 -219
  80. package/Scripts/compile_and_run_adhoc.sh +0 -4
  81. package/Scripts/docs-list.mjs +0 -119
  82. package/Scripts/make_appcast.sh +0 -58
  83. package/Scripts/package_app.sh +0 -409
  84. package/Scripts/release-lib.sh +0 -214
  85. package/Scripts/release.sh +0 -76
  86. package/Scripts/setup-all.sh +0 -387
  87. package/Scripts/setup-ios.sh +0 -404
  88. package/Scripts/setup-react-native.sh +0 -523
  89. package/Scripts/sign-and-notarize.sh +0 -122
  90. package/Scripts/test_live_update.sh +0 -38
  91. package/Scripts/validate_changelog.sh +0 -23
  92. package/Scripts/verify_appcast.sh +0 -92
  93. package/Sources/Runic/About.swift +0 -93
  94. package/Sources/Runic/AppNotifications.swift +0 -115
  95. package/Sources/Runic/Controllers/StatusItemController+Actions.swift +0 -666
  96. package/Sources/Runic/Controllers/StatusItemController+Animation.swift +0 -518
  97. package/Sources/Runic/Controllers/StatusItemController+ChartSubmenus.swift +0 -810
  98. package/Sources/Runic/Controllers/StatusItemController+CustomProviders.swift +0 -87
  99. package/Sources/Runic/Controllers/StatusItemController+Menu.swift +0 -1407
  100. package/Sources/Runic/Controllers/StatusItemController+MenuCards.swift +0 -337
  101. package/Sources/Runic/Controllers/StatusItemController+MenuHelpers.swift +0 -395
  102. package/Sources/Runic/Controllers/StatusItemController.swift +0 -360
  103. package/Sources/Runic/Core/BudgetNotificationManager.swift +0 -80
  104. package/Sources/Runic/Core/Login/ClaudeLoginRunner.swift +0 -103
  105. package/Sources/Runic/Core/Login/CodexLoginRunner.swift +0 -154
  106. package/Sources/Runic/Core/Login/CursorLoginRunner.swift +0 -206
  107. package/Sources/Runic/Core/Login/GeminiLoginRunner.swift +0 -92
  108. package/Sources/Runic/Core/Rendering/IconRenderer.swift +0 -1216
  109. package/Sources/Runic/Core/Rendering/IconView.swift +0 -120
  110. package/Sources/Runic/Core/Rendering/ProviderBrandIcon.swift +0 -71
  111. package/Sources/Runic/Core/RunicAnimation.swift +0 -53
  112. package/Sources/Runic/Core/RunicColors.swift +0 -73
  113. package/Sources/Runic/Core/RunicCornerRadius.swift +0 -15
  114. package/Sources/Runic/Core/RunicSpacing.swift +0 -68
  115. package/Sources/Runic/Core/Stores/AuggieTokenStore.swift +0 -119
  116. package/Sources/Runic/Core/Stores/AzureOpenAITokenStore.swift +0 -119
  117. package/Sources/Runic/Core/Stores/CerebrasTokenStore.swift +0 -119
  118. package/Sources/Runic/Core/Stores/CohereTokenStore.swift +0 -119
  119. package/Sources/Runic/Core/Stores/CopilotTokenStore.swift +0 -119
  120. package/Sources/Runic/Core/Stores/CustomProviderStore.swift +0 -158
  121. package/Sources/Runic/Core/Stores/DeepSeekTokenStore.swift +0 -119
  122. package/Sources/Runic/Core/Stores/FireworksTokenStore.swift +0 -119
  123. package/Sources/Runic/Core/Stores/GroqTokenStore.swift +0 -119
  124. package/Sources/Runic/Core/Stores/KimiTokenStore.swift +0 -119
  125. package/Sources/Runic/Core/Stores/MiniMaxCookieHeaderStore.swift +0 -119
  126. package/Sources/Runic/Core/Stores/MiniMaxGroupIDStore.swift +0 -119
  127. package/Sources/Runic/Core/Stores/MiniMaxTokenStore.swift +0 -119
  128. package/Sources/Runic/Core/Stores/MistralTokenStore.swift +0 -119
  129. package/Sources/Runic/Core/Stores/OpenRouterTokenStore.swift +0 -119
  130. package/Sources/Runic/Core/Stores/PerplexityTokenStore.swift +0 -119
  131. package/Sources/Runic/Core/Stores/ProviderToggleStore.swift +0 -30
  132. package/Sources/Runic/Core/Stores/QwenTokenStore.swift +0 -119
  133. package/Sources/Runic/Core/Stores/SambaNovaTokenStore.swift +0 -119
  134. package/Sources/Runic/Core/Stores/SettingsStore.swift +0 -1711
  135. package/Sources/Runic/Core/Stores/TogetherTokenStore.swift +0 -119
  136. package/Sources/Runic/Core/Stores/UsageStore+Accessors.swift +0 -20
  137. package/Sources/Runic/Core/Stores/UsageStore+Status.swift +0 -189
  138. package/Sources/Runic/Core/Stores/UsageStore+TokenCost.swift +0 -33
  139. package/Sources/Runic/Core/Stores/UsageStore+WidgetSnapshot.swift +0 -67
  140. package/Sources/Runic/Core/Stores/UsageStore.swift +0 -3605
  141. package/Sources/Runic/Core/Stores/XAITokenStore.swift +0 -119
  142. package/Sources/Runic/Core/Stores/ZaiTokenStore.swift +0 -118
  143. package/Sources/Runic/Core/UsageExporter.swift +0 -193
  144. package/Sources/Runic/Date+RelativeDescription.swift +0 -21
  145. package/Sources/Runic/HiddenWindowView.swift +0 -32
  146. package/Sources/Runic/InstallOrigin.swift +0 -9
  147. package/Sources/Runic/KeyboardShortcuts+Names.swift +0 -6
  148. package/Sources/Runic/MouseLocationReader.swift +0 -65
  149. package/Sources/Runic/Notifications+Runic.swift +0 -6
  150. package/Sources/Runic/OpenAICreditsPurchaseWindowController.swift +0 -503
  151. package/Sources/Runic/ProviderRegistry.swift +0 -100
  152. package/Sources/Runic/ProviderSwitcherButtons.swift +0 -267
  153. package/Sources/Runic/Providers/Antigravity/AntigravityLoginFlow.swift +0 -11
  154. package/Sources/Runic/Providers/Antigravity/AntigravityProviderImplementation.swift +0 -14
  155. package/Sources/Runic/Providers/Auggie/AuggieProviderImplementation.swift +0 -24
  156. package/Sources/Runic/Providers/Azure/AzureProviderImplementation.swift +0 -52
  157. package/Sources/Runic/Providers/Bedrock/BedrockProviderImplementation.swift +0 -42
  158. package/Sources/Runic/Providers/Cerebras/CerebrasProviderImplementation.swift +0 -24
  159. package/Sources/Runic/Providers/Claude/ClaudeLoginFlow.swift +0 -26
  160. package/Sources/Runic/Providers/Claude/ClaudeProviderImplementation.swift +0 -14
  161. package/Sources/Runic/Providers/Codex/CodexLoginFlow.swift +0 -18
  162. package/Sources/Runic/Providers/Codex/CodexProviderImplementation.swift +0 -15
  163. package/Sources/Runic/Providers/Cohere/CohereProviderImplementation.swift +0 -24
  164. package/Sources/Runic/Providers/Copilot/CopilotLoginFlow.swift +0 -193
  165. package/Sources/Runic/Providers/Copilot/CopilotProviderImplementation.swift +0 -110
  166. package/Sources/Runic/Providers/Cursor/CursorLoginFlow.swift +0 -28
  167. package/Sources/Runic/Providers/Cursor/CursorProviderImplementation.swift +0 -15
  168. package/Sources/Runic/Providers/DeepSeek/DeepSeekProviderImplementation.swift +0 -24
  169. package/Sources/Runic/Providers/Factory/FactoryLoginFlow.swift +0 -12
  170. package/Sources/Runic/Providers/Factory/FactoryProviderImplementation.swift +0 -15
  171. package/Sources/Runic/Providers/Fireworks/FireworksProviderImplementation.swift +0 -24
  172. package/Sources/Runic/Providers/Gemini/GeminiLoginFlow.swift +0 -20
  173. package/Sources/Runic/Providers/Gemini/GeminiProviderImplementation.swift +0 -15
  174. package/Sources/Runic/Providers/Groq/GroqProviderImplementation.swift +0 -24
  175. package/Sources/Runic/Providers/Kimi/KimiProviderImplementation.swift +0 -24
  176. package/Sources/Runic/Providers/MiniMax/MiniMaxProviderImplementation.swift +0 -32
  177. package/Sources/Runic/Providers/Mistral/MistralProviderImplementation.swift +0 -24
  178. package/Sources/Runic/Providers/OpenRouter/OpenRouterProviderImplementation.swift +0 -24
  179. package/Sources/Runic/Providers/Perplexity/PerplexityProviderImplementation.swift +0 -24
  180. package/Sources/Runic/Providers/SambaNova/SambaNovaProviderImplementation.swift +0 -24
  181. package/Sources/Runic/Providers/Shared/ProviderCatalog.swift +0 -15
  182. package/Sources/Runic/Providers/Shared/ProviderImplementation.swift +0 -48
  183. package/Sources/Runic/Providers/Shared/ProviderImplementationRegistry.swift +0 -66
  184. package/Sources/Runic/Providers/Shared/ProviderLoginFlow.swift +0 -12
  185. package/Sources/Runic/Providers/Shared/ProviderSettingsDescriptors.swift +0 -99
  186. package/Sources/Runic/Providers/Shared/SystemSettingsLinks.swift +0 -18
  187. package/Sources/Runic/Providers/Together/TogetherProviderImplementation.swift +0 -24
  188. package/Sources/Runic/Providers/XAI/XAIProviderImplementation.swift +0 -24
  189. package/Sources/Runic/Providers/Zai/ZaiProviderImplementation.swift +0 -24
  190. package/Sources/Runic/Resources/ProviderIcon-antigravity.svg +0 -2
  191. package/Sources/Runic/Resources/ProviderIcon-auggie.svg +0 -3
  192. package/Sources/Runic/Resources/ProviderIcon-azure.svg +0 -5
  193. package/Sources/Runic/Resources/ProviderIcon-bedrock.svg +0 -7
  194. package/Sources/Runic/Resources/ProviderIcon-cerebras.svg +0 -3
  195. package/Sources/Runic/Resources/ProviderIcon-claude.svg +0 -1
  196. package/Sources/Runic/Resources/ProviderIcon-codex.svg +0 -1
  197. package/Sources/Runic/Resources/ProviderIcon-cohere.svg +0 -3
  198. package/Sources/Runic/Resources/ProviderIcon-copilot.svg +0 -1
  199. package/Sources/Runic/Resources/ProviderIcon-cursor.svg +0 -3
  200. package/Sources/Runic/Resources/ProviderIcon-deepseek.svg +0 -4
  201. package/Sources/Runic/Resources/ProviderIcon-factory.svg +0 -3
  202. package/Sources/Runic/Resources/ProviderIcon-fireworks.svg +0 -3
  203. package/Sources/Runic/Resources/ProviderIcon-gemini.svg +0 -1
  204. package/Sources/Runic/Resources/ProviderIcon-groq.svg +0 -1
  205. package/Sources/Runic/Resources/ProviderIcon-kimi.svg +0 -4
  206. package/Sources/Runic/Resources/ProviderIcon-minimax.svg +0 -1
  207. package/Sources/Runic/Resources/ProviderIcon-mistral.svg +0 -5
  208. package/Sources/Runic/Resources/ProviderIcon-openrouter.svg +0 -7
  209. package/Sources/Runic/Resources/ProviderIcon-perplexity.svg +0 -4
  210. package/Sources/Runic/Resources/ProviderIcon-qwen.svg +0 -9
  211. package/Sources/Runic/Resources/ProviderIcon-sambanova.svg +0 -4
  212. package/Sources/Runic/Resources/ProviderIcon-together.svg +0 -5
  213. package/Sources/Runic/Resources/ProviderIcon-vertexai.svg +0 -17
  214. package/Sources/Runic/Resources/ProviderIcon-xai.svg +0 -3
  215. package/Sources/Runic/Resources/ProviderIcon-zai.svg +0 -5
  216. package/Sources/Runic/Resources/RunicMenubarIcon.svg +0 -7
  217. package/Sources/Runic/Resources/provider-context-windows.json +0 -20
  218. package/Sources/Runic/RunicApp.swift +0 -357
  219. package/Sources/Runic/SessionQuotaNotifications.swift +0 -58
  220. package/Sources/Runic/UsagePaceText.swift +0 -52
  221. package/Sources/Runic/UsageProgressBar.swift +0 -224
  222. package/Sources/Runic/Utilities/DisplayLink.swift +0 -96
  223. package/Sources/Runic/Utilities/LoadingPattern.swift +0 -60
  224. package/Sources/Runic/Utilities/PerformanceConstants.swift +0 -85
  225. package/Sources/Runic/Views/Menu/AlertsMenuView.swift +0 -256
  226. package/Sources/Runic/Views/Menu/ChartPanelStyle.swift +0 -22
  227. package/Sources/Runic/Views/Menu/CostComparativeChartMenuView.swift +0 -275
  228. package/Sources/Runic/Views/Menu/CostHistoryChartMenuView.swift +0 -377
  229. package/Sources/Runic/Views/Menu/CreditsHistoryChartMenuView.swift +0 -312
  230. package/Sources/Runic/Views/Menu/EfficiencyMetricsMenuView.swift +0 -312
  231. package/Sources/Runic/Views/Menu/HeroStatCardsMenuView.swift +0 -228
  232. package/Sources/Runic/Views/Menu/HourlyActivityChartMenuView.swift +0 -228
  233. package/Sources/Runic/Views/Menu/InlineUsageChartView.swift +0 -155
  234. package/Sources/Runic/Views/Menu/MenuCardEntranceModifier.swift +0 -64
  235. package/Sources/Runic/Views/Menu/MenuCardSidebarView.swift +0 -268
  236. package/Sources/Runic/Views/Menu/MenuCardSkeletonView.swift +0 -104
  237. package/Sources/Runic/Views/Menu/MenuCardView.swift +0 -1900
  238. package/Sources/Runic/Views/Menu/MenuContent.swift +0 -150
  239. package/Sources/Runic/Views/Menu/MenuDescriptor.swift +0 -369
  240. package/Sources/Runic/Views/Menu/MenuHighlightStyle.swift +0 -42
  241. package/Sources/Runic/Views/Menu/ModelBreakdownMenuView.swift +0 -235
  242. package/Sources/Runic/Views/Menu/OverviewMenuView.swift +0 -278
  243. package/Sources/Runic/Views/Menu/ProjectBreakdownMenuView.swift +0 -209
  244. package/Sources/Runic/Views/Menu/ProjectBudgetMenuView.swift +0 -220
  245. package/Sources/Runic/Views/Menu/ProviderTabBarView.swift +0 -88
  246. package/Sources/Runic/Views/Menu/SubscriptionUtilizationChartMenuView.swift +0 -201
  247. package/Sources/Runic/Views/Menu/UsageBreakdownChartMenuView.swift +0 -398
  248. package/Sources/Runic/Views/Menu/UsageHeatmapMenuView.swift +0 -232
  249. package/Sources/Runic/Views/Menu/UsageTimelineChartMenuView.swift +0 -364
  250. package/Sources/Runic/Views/Menu/UsageWindowComparisonChartMenuView.swift +0 -190
  251. package/Sources/Runic/Views/Menu/WeeklyActivityChartMenuView.swift +0 -132
  252. package/Sources/Runic/Views/Performance/PerformanceDashboardView.swift +0 -618
  253. package/Sources/Runic/Views/Preferences/LiquidComponents.swift +0 -305
  254. package/Sources/Runic/Views/Preferences/PreferencesAboutPane.swift +0 -271
  255. package/Sources/Runic/Views/Preferences/PreferencesAdvancedPane.swift +0 -268
  256. package/Sources/Runic/Views/Preferences/PreferencesAlertsPane.swift +0 -422
  257. package/Sources/Runic/Views/Preferences/PreferencesAnalyticsPane.swift +0 -641
  258. package/Sources/Runic/Views/Preferences/PreferencesBudgetsPane.swift +0 -344
  259. package/Sources/Runic/Views/Preferences/PreferencesComponents.swift +0 -230
  260. package/Sources/Runic/Views/Preferences/PreferencesCustomProvidersPane.swift +0 -322
  261. package/Sources/Runic/Views/Preferences/PreferencesDebugPane.swift +0 -469
  262. package/Sources/Runic/Views/Preferences/PreferencesGeneralPane.swift +0 -231
  263. package/Sources/Runic/Views/Preferences/PreferencesHelpPane.swift +0 -50
  264. package/Sources/Runic/Views/Preferences/PreferencesIntegrationsPane.swift +0 -567
  265. package/Sources/Runic/Views/Preferences/PreferencesPerformancePane.swift +0 -288
  266. package/Sources/Runic/Views/Preferences/PreferencesProvidersPane.swift +0 -3435
  267. package/Sources/Runic/Views/Preferences/PreferencesSelection.swift +0 -25
  268. package/Sources/Runic/Views/Preferences/PreferencesSyncPane.swift +0 -59
  269. package/Sources/Runic/Views/Preferences/PreferencesView.swift +0 -206
  270. package/Sources/Runic/Views/Rating/QualityRatingView.swift +0 -238
  271. package/Sources/Runic/Views/Team/TeamDashboardView.swift +0 -371
  272. package/Sources/Runic/Views/Team/TeamInviteSheet.swift +0 -175
  273. package/Sources/Runic/Views/Team/TeamManagementView.swift +0 -761
  274. package/Sources/Runic/Views/Team/TeamMemberRow.swift +0 -181
  275. package/Sources/RunicCLI/CLIEntry.swift +0 -942
  276. package/Sources/RunicCLI/CLIRenderer.swift +0 -87
  277. package/Sources/RunicCLI/Commands/EnhancedUsageCommand.swift +0 -588
  278. package/Sources/RunicCLI/Commands/ModelsCommand.swift +0 -362
  279. package/Sources/RunicCLI/Commands/ProjectsCommand.swift +0 -439
  280. package/Sources/RunicCLI/Commands/ResetCommand.swift +0 -429
  281. package/Sources/RunicCLI/Commands/UsageLedgerSourceFactory.swift +0 -168
  282. package/Sources/RunicClaudeWatchdog/main.swift +0 -122
  283. package/Sources/RunicClaudeWebProbe/main.swift +0 -62
  284. package/Sources/RunicCore/AlertRuleStore.swift +0 -187
  285. package/Sources/RunicCore/BrowserCookieImportOrder.swift +0 -25
  286. package/Sources/RunicCore/CopilotUsageModels.swift +0 -84
  287. package/Sources/RunicCore/CostUsageFetcher.swift +0 -119
  288. package/Sources/RunicCore/CostUsageModels.swift +0 -479
  289. package/Sources/RunicCore/CreditsModels.swift +0 -50
  290. package/Sources/RunicCore/CustomProviders/CustomProviderModels.swift +0 -269
  291. package/Sources/RunicCore/CustomProviders/GenericProviderFetcher.swift +0 -633
  292. package/Sources/RunicCore/CustomProviders/ProviderTemplates.swift +0 -500
  293. package/Sources/RunicCore/Host/PTY/TTYCommandRunner.swift +0 -679
  294. package/Sources/RunicCore/Host/Process/SubprocessRunner.swift +0 -135
  295. package/Sources/RunicCore/Integrations/GitHubIntegration.swift +0 -173
  296. package/Sources/RunicCore/Logging/JSONStderrLogHandler.swift +0 -79
  297. package/Sources/RunicCore/Logging/OSLogLogHandler.swift +0 -86
  298. package/Sources/RunicCore/Logging/RunicLog.swift +0 -123
  299. package/Sources/RunicCore/Models/EnhancedUsageModels.swift +0 -371
  300. package/Sources/RunicCore/OpenAIDashboardModels.swift +0 -210
  301. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardBrowserCookieImporter.swift +0 -676
  302. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardFetcher.swift +0 -492
  303. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardNavigationDelegate.swift +0 -51
  304. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardParser.swift +0 -483
  305. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardScrapeScript.swift +0 -558
  306. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebViewCache.swift +0 -204
  307. package/Sources/RunicCore/OpenAIWeb/OpenAIDashboardWebsiteDataStore.swift +0 -78
  308. package/Sources/RunicCore/PathEnvironment.swift +0 -482
  309. package/Sources/RunicCore/Performance/PerformanceModels.swift +0 -371
  310. package/Sources/RunicCore/Performance/PerformanceStorageImpl.swift +0 -409
  311. package/Sources/RunicCore/Policy/UsagePolicyEngine.swift +0 -178
  312. package/Sources/RunicCore/ProjectBudgetStore.swift +0 -99
  313. package/Sources/RunicCore/ProviderCostSnapshot.swift +0 -29
  314. package/Sources/RunicCore/Providers/Antigravity/AntigravityProviderDescriptor.swift +0 -66
  315. package/Sources/RunicCore/Providers/Antigravity/AntigravityStatusProbe.swift +0 -685
  316. package/Sources/RunicCore/Providers/Auggie/AuggieProviderDescriptor.swift +0 -83
  317. package/Sources/RunicCore/Providers/Auggie/AuggieUsageFetcher.swift +0 -142
  318. package/Sources/RunicCore/Providers/Azure/AzureProviderDescriptor.swift +0 -141
  319. package/Sources/RunicCore/Providers/Azure/AzureUsageFetcher.swift +0 -188
  320. package/Sources/RunicCore/Providers/Bedrock/BedrockProviderDescriptor.swift +0 -126
  321. package/Sources/RunicCore/Providers/Bedrock/BedrockUsageFetcher.swift +0 -168
  322. package/Sources/RunicCore/Providers/Cerebras/CerebrasProviderDescriptor.swift +0 -84
  323. package/Sources/RunicCore/Providers/Cerebras/CerebrasUsageFetcher.swift +0 -75
  324. package/Sources/RunicCore/Providers/Claude/ClaudeCLISession.swift +0 -332
  325. package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthCredentials.swift +0 -180
  326. package/Sources/RunicCore/Providers/Claude/ClaudeOAuth/ClaudeOAuthUsageFetcher.swift +0 -137
  327. package/Sources/RunicCore/Providers/Claude/ClaudeProviderDescriptor.swift +0 -207
  328. package/Sources/RunicCore/Providers/Claude/ClaudeStatusProbe.swift +0 -654
  329. package/Sources/RunicCore/Providers/Claude/ClaudeUsageDataSource.swift +0 -28
  330. package/Sources/RunicCore/Providers/Claude/ClaudeUsageFetcher.swift +0 -480
  331. package/Sources/RunicCore/Providers/Claude/ClaudeWeb/ClaudeWebAPIFetcher.swift +0 -780
  332. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthCredentials.swift +0 -147
  333. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexOAuthUsageFetcher.swift +0 -280
  334. package/Sources/RunicCore/Providers/Codex/CodexOAuth/CodexTokenRefresher.swift +0 -100
  335. package/Sources/RunicCore/Providers/Codex/CodexProviderDescriptor.swift +0 -243
  336. package/Sources/RunicCore/Providers/Codex/CodexStatusProbe.swift +0 -125
  337. package/Sources/RunicCore/Providers/Codex/CodexUsageDataSource.swift +0 -24
  338. package/Sources/RunicCore/Providers/Codex/CodexWebDashboardStrategy.swift +0 -181
  339. package/Sources/RunicCore/Providers/Cohere/CohereProviderDescriptor.swift +0 -83
  340. package/Sources/RunicCore/Providers/Cohere/CohereUsageFetcher.swift +0 -85
  341. package/Sources/RunicCore/Providers/Copilot/CopilotDeviceFlow.swift +0 -123
  342. package/Sources/RunicCore/Providers/Copilot/CopilotGitHubCLITokenReader.swift +0 -114
  343. package/Sources/RunicCore/Providers/Copilot/CopilotProviderDescriptor.swift +0 -100
  344. package/Sources/RunicCore/Providers/Copilot/CopilotUsageFetcher.swift +0 -291
  345. package/Sources/RunicCore/Providers/Copilot/CopilotVSCodeTokenReader.swift +0 -386
  346. package/Sources/RunicCore/Providers/Cursor/CursorProviderDescriptor.swift +0 -65
  347. package/Sources/RunicCore/Providers/Cursor/CursorStatusProbe.swift +0 -595
  348. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekProviderDescriptor.swift +0 -85
  349. package/Sources/RunicCore/Providers/DeepSeek/DeepSeekUsageFetcher.swift +0 -108
  350. package/Sources/RunicCore/Providers/Factory/FactoryLocalStorageImporter.swift +0 -398
  351. package/Sources/RunicCore/Providers/Factory/FactoryProviderDescriptor.swift +0 -65
  352. package/Sources/RunicCore/Providers/Factory/FactoryStatusProbe.swift +0 -1276
  353. package/Sources/RunicCore/Providers/Fireworks/FireworksProviderDescriptor.swift +0 -84
  354. package/Sources/RunicCore/Providers/Fireworks/FireworksUsageFetcher.swift +0 -75
  355. package/Sources/RunicCore/Providers/Gemini/GeminiProviderDescriptor.swift +0 -65
  356. package/Sources/RunicCore/Providers/Gemini/GeminiStatusProbe.swift +0 -836
  357. package/Sources/RunicCore/Providers/Groq/GroqProviderDescriptor.swift +0 -83
  358. package/Sources/RunicCore/Providers/Groq/GroqUsageFetcher.swift +0 -71
  359. package/Sources/RunicCore/Providers/Kimi/KimiProviderDescriptor.swift +0 -83
  360. package/Sources/RunicCore/Providers/Kimi/KimiUsageFetcher.swift +0 -77
  361. package/Sources/RunicCore/Providers/MiniMax/MiniMaxProviderDescriptor.swift +0 -92
  362. package/Sources/RunicCore/Providers/MiniMax/MiniMaxSettingsReader.swift +0 -54
  363. package/Sources/RunicCore/Providers/MiniMax/MiniMaxUsageFetcher.swift +0 -168
  364. package/Sources/RunicCore/Providers/MiniMax/MiniMaxWebUsageFetcher.swift +0 -911
  365. package/Sources/RunicCore/Providers/Mistral/MistralProviderDescriptor.swift +0 -84
  366. package/Sources/RunicCore/Providers/Mistral/MistralUsageFetcher.swift +0 -75
  367. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterProviderDescriptor.swift +0 -87
  368. package/Sources/RunicCore/Providers/OpenRouter/OpenRouterUsageFetcher.swift +0 -203
  369. package/Sources/RunicCore/Providers/Perplexity/PerplexityProviderDescriptor.swift +0 -84
  370. package/Sources/RunicCore/Providers/Perplexity/PerplexityUsageFetcher.swift +0 -75
  371. package/Sources/RunicCore/Providers/ProviderBranding.swift +0 -25
  372. package/Sources/RunicCore/Providers/ProviderCLIConfig.swift +0 -17
  373. package/Sources/RunicCore/Providers/ProviderDescriptor.swift +0 -129
  374. package/Sources/RunicCore/Providers/ProviderFetchPlan.swift +0 -263
  375. package/Sources/RunicCore/Providers/ProviderSettingsSnapshot.swift +0 -98
  376. package/Sources/RunicCore/Providers/ProviderTokenResolver.swift +0 -501
  377. package/Sources/RunicCore/Providers/ProviderVersionDetector.swift +0 -68
  378. package/Sources/RunicCore/Providers/Providers.swift +0 -184
  379. package/Sources/RunicCore/Providers/Qwen/QwenProviderDescriptor.swift +0 -84
  380. package/Sources/RunicCore/Providers/Qwen/QwenSettingsReader.swift +0 -30
  381. package/Sources/RunicCore/Providers/Qwen/QwenUsageStats.swift +0 -315
  382. package/Sources/RunicCore/Providers/SambaNova/SambaNovaProviderDescriptor.swift +0 -84
  383. package/Sources/RunicCore/Providers/SambaNova/SambaNovaUsageFetcher.swift +0 -75
  384. package/Sources/RunicCore/Providers/Together/TogetherProviderDescriptor.swift +0 -83
  385. package/Sources/RunicCore/Providers/Together/TogetherUsageFetcher.swift +0 -75
  386. package/Sources/RunicCore/Providers/VertexAI/VertexAIProviderDescriptor.swift +0 -123
  387. package/Sources/RunicCore/Providers/VertexAI/VertexAISettingsReader.swift +0 -48
  388. package/Sources/RunicCore/Providers/VertexAI/VertexAIUsageFetcher.swift +0 -144
  389. package/Sources/RunicCore/Providers/XAI/XAIProviderDescriptor.swift +0 -83
  390. package/Sources/RunicCore/Providers/XAI/XAIUsageFetcher.swift +0 -75
  391. package/Sources/RunicCore/Providers/Zai/ZaiProviderDescriptor.swift +0 -72
  392. package/Sources/RunicCore/Providers/Zai/ZaiSettingsReader.swift +0 -41
  393. package/Sources/RunicCore/Providers/Zai/ZaiUsageStats.swift +0 -718
  394. package/Sources/RunicCore/Sync/BackgroundSyncManager.swift +0 -385
  395. package/Sources/RunicCore/Sync/SyncConflictResolver.swift +0 -310
  396. package/Sources/RunicCore/Sync/SyncProtocol.swift +0 -288
  397. package/Sources/RunicCore/Sync/SyncRecord.swift +0 -405
  398. package/Sources/RunicCore/Sync/SyncUsageExample.swift +0 -294
  399. package/Sources/RunicCore/Sync/TeamSyncRecords.swift +0 -775
  400. package/Sources/RunicCore/Sync/iCloudSyncEngine.swift +0 -333
  401. package/Sources/RunicCore/Team/TeamModels.swift +0 -583
  402. package/Sources/RunicCore/Team/TeamShowbackExporter.swift +0 -495
  403. package/Sources/RunicCore/Team/TeamStore.swift +0 -792
  404. package/Sources/RunicCore/TextParsing.swift +0 -55
  405. package/Sources/RunicCore/UsageFetcher.swift +0 -694
  406. package/Sources/RunicCore/UsageFormatter.swift +0 -410
  407. package/Sources/RunicCore/UsageLedger/ClaudeUsageLogSource.swift +0 -427
  408. package/Sources/RunicCore/UsageLedger/CodexUsageLogSource.swift +0 -494
  409. package/Sources/RunicCore/UsageLedger/LedgerCache.swift +0 -158
  410. package/Sources/RunicCore/UsageLedger/OTelGenAILedgerAdapter.swift +0 -550
  411. package/Sources/RunicCore/UsageLedger/UsageLedger.swift +0 -29
  412. package/Sources/RunicCore/UsageLedger/UsageLedgerAggregator.swift +0 -660
  413. package/Sources/RunicCore/UsageLedger/UsageLedgerInsightsAdvisor.swift +0 -209
  414. package/Sources/RunicCore/UsageLedger/UsageLedgerModels.swift +0 -417
  415. package/Sources/RunicCore/UsageLedger/UsageLedgerProjectIdentity.swift +0 -245
  416. package/Sources/RunicCore/UsagePace.swift +0 -81
  417. package/Sources/RunicCore/Vendored/CostUsage/CostUsageCache.swift +0 -73
  418. package/Sources/RunicCore/Vendored/CostUsage/CostUsageJsonl.swift +0 -74
  419. package/Sources/RunicCore/Vendored/CostUsage/CostUsagePricing.swift +0 -208
  420. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Claude.swift +0 -455
  421. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner+Timestamp.swift +0 -132
  422. package/Sources/RunicCore/Vendored/CostUsage/CostUsageScanner.swift +0 -589
  423. package/Sources/RunicCore/WidgetSnapshot.swift +0 -183
  424. package/Sources/RunicMacroSupport/ProviderRegistrationMacros.swift +0 -14
  425. package/Sources/RunicMacros/ProviderRegistrationMacros.swift +0 -216
  426. package/Sources/RunicWidget/RunicWidgetBundle.swift +0 -79
  427. package/Sources/RunicWidget/RunicWidgetProvider.swift +0 -283
  428. package/Sources/RunicWidget/RunicWidgetViews.swift +0 -680
  429. package/Tests/RunicTests/AntigravityStatusProbeTests.swift +0 -50
  430. package/Tests/RunicTests/AppDelegateTests.swift +0 -43
  431. package/Tests/RunicTests/BrowserCookieOrderLabelTests.swift +0 -22
  432. package/Tests/RunicTests/CLIArgumentParsingTests.swift +0 -70
  433. package/Tests/RunicTests/CLICostTests.swift +0 -65
  434. package/Tests/RunicTests/CLIProviderSelectionTests.swift +0 -22
  435. package/Tests/RunicTests/CLISnapshotTests.swift +0 -72
  436. package/Tests/RunicTests/CLIWebFallbackTests.swift +0 -58
  437. package/Tests/RunicTests/ClaudeOAuthTests.swift +0 -164
  438. package/Tests/RunicTests/ClaudeResilienceTests.swift +0 -30
  439. package/Tests/RunicTests/ClaudeUsageTests.swift +0 -370
  440. package/Tests/RunicTests/CodexOAuthTests.swift +0 -122
  441. package/Tests/RunicTests/CodexUsageLogSourceTests.swift +0 -82
  442. package/Tests/RunicTests/CopilotTokenResolverTests.swift +0 -75
  443. package/Tests/RunicTests/CopilotVSCodeTokenReaderTests.swift +0 -75
  444. package/Tests/RunicTests/CostUsageDecodingTests.swift +0 -394
  445. package/Tests/RunicTests/CostUsagePricingTests.swift +0 -50
  446. package/Tests/RunicTests/CostUsageScannerTests.swift +0 -700
  447. package/Tests/RunicTests/CursorStatusProbeTests.swift +0 -323
  448. package/Tests/RunicTests/FactoryStatusProbeTests.swift +0 -69
  449. package/Tests/RunicTests/GeminiAPITestHelpers.swift +0 -94
  450. package/Tests/RunicTests/GeminiLoginAlertTests.swift +0 -28
  451. package/Tests/RunicTests/GeminiStatusProbeAPITests.swift +0 -283
  452. package/Tests/RunicTests/GeminiStatusProbePlanTests.swift +0 -279
  453. package/Tests/RunicTests/GeminiStatusProbeTests.swift +0 -233
  454. package/Tests/RunicTests/GeminiTestEnvironment.swift +0 -87
  455. package/Tests/RunicTests/GoogleWorkspaceStatusTests.swift +0 -73
  456. package/Tests/RunicTests/InstallOriginTests.swift +0 -18
  457. package/Tests/RunicTests/KeyboardShortcutsBundleTests.swift +0 -9
  458. package/Tests/RunicTests/LiveAccountTests.swift +0 -24
  459. package/Tests/RunicTests/LoadingPatternTests.swift +0 -35
  460. package/Tests/RunicTests/MenuCardModelTests.swift +0 -545
  461. package/Tests/RunicTests/MiniMaxCookieHeaderStoreTestSupport.swift +0 -8
  462. package/Tests/RunicTests/MiniMaxGroupIDStoreTestSupport.swift +0 -8
  463. package/Tests/RunicTests/MiniMaxParsingTests.swift +0 -68
  464. package/Tests/RunicTests/MiniMaxTokenStoreTestSupport.swift +0 -8
  465. package/Tests/RunicTests/OTelGenAILedgerAdapterTests.swift +0 -112
  466. package/Tests/RunicTests/OpenAIDashboardBrowserCookieImporterTests.swift +0 -17
  467. package/Tests/RunicTests/OpenAIDashboardFetcherCreditsWaitTests.swift +0 -75
  468. package/Tests/RunicTests/OpenAIDashboardOffscreenHostTests.swift +0 -27
  469. package/Tests/RunicTests/OpenAIDashboardParserTests.swift +0 -134
  470. package/Tests/RunicTests/OpenAIWebAccountSwitchTests.swift +0 -53
  471. package/Tests/RunicTests/OpenRouterTokenStoreTestSupport.swift +0 -92
  472. package/Tests/RunicTests/PathBuilderTests.swift +0 -237
  473. package/Tests/RunicTests/ProviderFetchPipelineTests.swift +0 -160
  474. package/Tests/RunicTests/ProviderIconResourcesTests.swift +0 -38
  475. package/Tests/RunicTests/ProviderMetadataStatusLinkTests.swift +0 -16
  476. package/Tests/RunicTests/ProviderRegistryTests.swift +0 -29
  477. package/Tests/RunicTests/ProviderSettingsDescriptorTests.swift +0 -202
  478. package/Tests/RunicTests/ProviderToggleStoreTests.swift +0 -51
  479. package/Tests/RunicTests/RunicTests.swift +0 -120
  480. package/Tests/RunicTests/SessionQuotaNotificationLogicTests.swift +0 -36
  481. package/Tests/RunicTests/SettingsStoreTests.swift +0 -161
  482. package/Tests/RunicTests/StatusItemAnimationTests.swift +0 -49
  483. package/Tests/RunicTests/StatusMenuTests.swift +0 -434
  484. package/Tests/RunicTests/StatusProbeTests.swift +0 -377
  485. package/Tests/RunicTests/SubprocessRunnerTests.swift +0 -20
  486. package/Tests/RunicTests/SubscriptionDetectionTests.swift +0 -65
  487. package/Tests/RunicTests/TTYCommandRunnerTests.swift +0 -148
  488. package/Tests/RunicTests/TTYIntegrationTests.swift +0 -41
  489. package/Tests/RunicTests/TeamShowbackExporterTests.swift +0 -159
  490. package/Tests/RunicTests/TextParsingTests.swift +0 -12
  491. package/Tests/RunicTests/UsageFormatterTests.swift +0 -112
  492. package/Tests/RunicTests/UsageLedgerAnomalyDetectionTests.swift +0 -172
  493. package/Tests/RunicTests/UsageLedgerForecastTests.swift +0 -213
  494. package/Tests/RunicTests/UsageLedgerInsightsAdvisorTests.swift +0 -83
  495. package/Tests/RunicTests/UsageLedgerProjectNameTests.swift +0 -170
  496. package/Tests/RunicTests/UsagePaceTests.swift +0 -77
  497. package/Tests/RunicTests/UsagePaceTextTests.swift +0 -109
  498. package/Tests/RunicTests/UsagePolicyEngineTests.swift +0 -91
  499. package/Tests/RunicTests/WidgetSnapshotTests.swift +0 -45
  500. package/Tests/RunicTests/ZaiProviderTests.swift +0 -61
  501. package/Tests/RunicTests/ZaiTokenStoreTestSupport.swift +0 -6
  502. package/TestsLinux/PlatformGatingTests.swift +0 -46
  503. package/appcast.xml +0 -144
  504. package/assets/logo-concept-stack.svg +0 -24
  505. package/assets/logo-minimal-bars.svg +0 -15
  506. package/assets/logo.svg +0 -20
  507. package/assets/logo2.svg +0 -43
  508. package/bin/docs-list +0 -5
  509. package/build-and-run.sh +0 -369
  510. package/docs/.nojekyll +0 -1
  511. package/docs/CNAME +0 -1
  512. package/docs/antigravity.md +0 -75
  513. package/docs/architecture.md +0 -32
  514. package/docs/claude.md +0 -93
  515. package/docs/cli-commands/integration_guide.md +0 -371
  516. package/docs/cli-commands/quick_reference.md +0 -362
  517. package/docs/cli-commands/readme.md +0 -361
  518. package/docs/cli.md +0 -156
  519. package/docs/cloudkit_sync_guide.md +0 -495
  520. package/docs/codebase_review.md +0 -288
  521. package/docs/codex-oauth.md +0 -635
  522. package/docs/codex.md +0 -104
  523. package/docs/codexbar.png +0 -0
  524. package/docs/copilot.md +0 -44
  525. package/docs/cursor.md +0 -46
  526. package/docs/design/designcomparisonchart.md +0 -510
  527. package/docs/design/implementationguide.md +0 -792
  528. package/docs/design/menubaricondesignconcepts.md +0 -796
  529. package/docs/design/mockups/hybridiconconcept.svg +0 -62
  530. package/docs/design/mockups/infinityiconconcept.svg +0 -41
  531. package/docs/design/mockups/infinityiconstates.svg +0 -129
  532. package/docs/design/mockups/wavelogorefined.svg +0 -48
  533. package/docs/design/quick_summary.md +0 -426
  534. package/docs/design/readme.md +0 -478
  535. package/docs/design/sizespecifications.md +0 -575
  536. package/docs/design-system.md +0 -836
  537. package/docs/factory.md +0 -103
  538. package/docs/gemini.md +0 -73
  539. package/docs/icon.md +0 -37
  540. package/docs/icon.png +0 -0
  541. package/docs/index.html +0 -175
  542. package/docs/keychain_fix.md +0 -274
  543. package/docs/minimax.md +0 -71
  544. package/docs/packaging.md +0 -25
  545. package/docs/progress-bar-improvements.md +0 -240
  546. package/docs/progress-bar-quick-reference.md +0 -283
  547. package/docs/progress-bar-technical-details.md +0 -432
  548. package/docs/progress-bar-visual-test.swift +0 -375
  549. package/docs/provider.md +0 -202
  550. package/docs/providers.md +0 -86
  551. package/docs/refactor/macros.md +0 -35
  552. package/docs/refresh-loop.md +0 -22
  553. package/docs/releasing-homebrew.md +0 -35
  554. package/docs/releasing.md +0 -121
  555. package/docs/research/concrete_todo_2026-02-22.md +0 -47
  556. package/docs/research/core-feature-research.md +0 -248
  557. package/docs/research/feature_uiux_roadmap_2026-02-22.md +0 -202
  558. package/docs/research/parity_matrix.md +0 -49
  559. package/docs/research/provider_expansion_candidates_2026-02-22.md +0 -80
  560. package/docs/research/provider_model_token_project_matrix_2026-02-23.md +0 -46
  561. package/docs/research/release_gate_checklist.md +0 -57
  562. package/docs/site.css +0 -505
  563. package/docs/sparkle.md +0 -28
  564. package/docs/status.md +0 -28
  565. package/docs/sync/implementation.md +0 -393
  566. package/docs/sync/readme.md +0 -317
  567. package/docs/sync_files_summary.md +0 -391
  568. package/docs/sync_quick_reference.md +0 -225
  569. package/docs/todo.md +0 -11
  570. package/docs/ui.md +0 -29
  571. package/docs/web-integration.md +0 -9
  572. package/docs/widgets.md +0 -85
  573. package/docs/workflows/error-handling-improvements.md +0 -434
  574. package/docs/workflows/folder_structure.md +0 -299
  575. package/docs/workflows/loading_states.md +0 -446
  576. package/docs/workflows/loading_states_examples.md +0 -565
  577. package/docs/workflows/loading_states_flow.md +0 -430
  578. package/docs/workflows/performance_optimizations.md +0 -457
  579. package/docs/workflows/phase1-cli-testing-report.md +0 -313
  580. package/docs/workflows/quick_reference.md +0 -228
  581. package/docs/workflows/readme.md +0 -59
  582. package/docs/workflows/recent_improvements.md +0 -275
  583. package/docs/workflows/sync_enablement_summary.md +0 -400
  584. package/docs/zai.md +0 -43
  585. package/runic.png +0 -0
  586. package/version.env +0 -2
@@ -1,545 +0,0 @@
1
- import RunicCore
2
- import Foundation
3
- import SwiftUI
4
- import Testing
5
- @testable import Runic
6
-
7
- private extension UsageMenuCardView.Model.Input {
8
- init(
9
- provider: UsageProvider,
10
- metadata: ProviderMetadata,
11
- snapshot: UsageSnapshot?,
12
- credits: CreditsSnapshot?,
13
- creditsError: String?,
14
- dashboard: OpenAIDashboardSnapshot?,
15
- dashboardError: String?,
16
- tokenSnapshot: CostUsageTokenSnapshot?,
17
- tokenError: String?,
18
- ledgerDaily: UsageLedgerDailySummary? = nil,
19
- ledgerActiveBlock: UsageLedgerBlockSummary? = nil,
20
- ledgerTopModel: UsageLedgerModelSummary? = nil,
21
- ledgerTopProject: UsageLedgerProjectSummary? = nil,
22
- ledgerSpendForecast: UsageLedgerSpendForecast? = nil,
23
- ledgerTopProjectSpendForecast: UsageLedgerSpendForecast? = nil,
24
- ledgerAnomaly: UsageLedgerAnomalySummary? = nil,
25
- ledgerReliability: UsageLedgerReliabilityScore? = nil,
26
- ledgerRouting: UsageLedgerRoutingRecommendation? = nil,
27
- ledgerError: String? = nil,
28
- ledgerUpdatedAt: Date? = nil,
29
- account: AccountInfo,
30
- isRefreshing: Bool,
31
- lastError: String?,
32
- usageBarsShowUsed: Bool,
33
- menuMode: MenuMode = .`operator`,
34
- tokenCostUsageEnabled: Bool,
35
- showOptionalCreditsAndExtraUsage: Bool,
36
- now: Date)
37
- {
38
- self.init(
39
- provider: provider,
40
- metadata: metadata,
41
- snapshot: snapshot,
42
- credits: credits,
43
- creditsError: creditsError,
44
- dashboard: dashboard,
45
- dashboardError: dashboardError,
46
- tokenSnapshot: tokenSnapshot,
47
- tokenError: tokenError,
48
- ledgerDaily: ledgerDaily,
49
- ledgerActiveBlock: ledgerActiveBlock,
50
- ledgerTopModel: ledgerTopModel,
51
- ledgerTopProject: ledgerTopProject,
52
- ledgerSpendForecast: ledgerSpendForecast,
53
- ledgerTopProjectSpendForecast: ledgerTopProjectSpendForecast,
54
- ledgerAnomaly: ledgerAnomaly,
55
- ledgerReliability: ledgerReliability,
56
- ledgerRouting: ledgerRouting,
57
- ledgerError: ledgerError,
58
- ledgerUpdatedAt: ledgerUpdatedAt,
59
- account: account,
60
- isRefreshing: isRefreshing,
61
- lastError: lastError,
62
- usageBarsShowUsed: usageBarsShowUsed,
63
- usageMetricDisplayMode: .barsAndPercent,
64
- menuMode: menuMode,
65
- tokenCostUsageEnabled: tokenCostUsageEnabled,
66
- showOptionalCreditsAndExtraUsage: showOptionalCreditsAndExtraUsage,
67
- now: now)
68
- }
69
- }
70
-
71
- @Suite
72
- struct MenuCardModelTests {
73
- @Test
74
- func buildsMetricsUsingRemainingPercent() {
75
- let now = Date()
76
- let identity = ProviderIdentitySnapshot(
77
- providerID: .codex,
78
- accountEmail: "codex@example.com",
79
- accountOrganization: nil,
80
- loginMethod: "Plus Plan")
81
- let snapshot = UsageSnapshot(
82
- primary: RateWindow(
83
- usedPercent: 22,
84
- windowMinutes: 300,
85
- resetsAt: now.addingTimeInterval(3000),
86
- resetDescription: nil),
87
- secondary: RateWindow(
88
- usedPercent: 40,
89
- windowMinutes: 10080,
90
- resetsAt: now.addingTimeInterval(6000),
91
- resetDescription: nil),
92
- updatedAt: now,
93
- identity: identity)
94
- let metadata = ProviderDefaults.metadata[.codex]!
95
- let updatedSnap = UsageSnapshot(
96
- primary: snapshot.primary,
97
- secondary: RateWindow(
98
- usedPercent: snapshot.secondary!.usedPercent,
99
- windowMinutes: snapshot.secondary!.windowMinutes,
100
- resetsAt: now.addingTimeInterval(3600),
101
- resetDescription: nil),
102
- tertiary: snapshot.tertiary,
103
- updatedAt: now,
104
- identity: identity)
105
-
106
- let model = UsageMenuCardView.Model.make(.init(
107
- provider: .codex,
108
- metadata: metadata,
109
- snapshot: updatedSnap,
110
- credits: CreditsSnapshot(remaining: 12, events: [], updatedAt: now),
111
- creditsError: nil,
112
- dashboard: nil,
113
- dashboardError: nil,
114
- tokenSnapshot: nil,
115
- tokenError: nil,
116
- account: AccountInfo(email: "codex@example.com", plan: "Plus Plan"),
117
- isRefreshing: false,
118
- lastError: nil,
119
- usageBarsShowUsed: false,
120
- tokenCostUsageEnabled: false,
121
- showOptionalCreditsAndExtraUsage: true,
122
- now: now))
123
-
124
- #expect(model.providerName == "Codex")
125
- #expect(model.metrics.count == 2)
126
- #expect(model.metrics.first?.percent == 78)
127
- #expect(model.planText == "Plus")
128
- #expect(model.subtitleText.hasPrefix("Updated"))
129
- #expect(model.progressColor != Color.clear)
130
- #expect(model.metrics[1].resetText?.isEmpty == false)
131
- }
132
-
133
- @Test
134
- func buildsMetricsUsingUsedPercentWhenEnabled() {
135
- let now = Date()
136
- let identity = ProviderIdentitySnapshot(
137
- providerID: .codex,
138
- accountEmail: "codex@example.com",
139
- accountOrganization: nil,
140
- loginMethod: "Plus Plan")
141
- let snapshot = UsageSnapshot(
142
- primary: RateWindow(
143
- usedPercent: 22,
144
- windowMinutes: 300,
145
- resetsAt: now.addingTimeInterval(3000),
146
- resetDescription: nil),
147
- secondary: RateWindow(
148
- usedPercent: 40,
149
- windowMinutes: 10080,
150
- resetsAt: now.addingTimeInterval(6000),
151
- resetDescription: nil),
152
- updatedAt: now,
153
- identity: identity)
154
- let metadata = ProviderDefaults.metadata[.codex]!
155
-
156
- let dashboard = OpenAIDashboardSnapshot(
157
- signedInEmail: "codex@example.com",
158
- codeReviewRemainingPercent: 73,
159
- creditEvents: [],
160
- dailyBreakdown: [],
161
- usageBreakdown: [],
162
- creditsPurchaseURL: nil,
163
- updatedAt: now)
164
-
165
- let model = UsageMenuCardView.Model.make(.init(
166
- provider: .codex,
167
- metadata: metadata,
168
- snapshot: snapshot,
169
- credits: nil,
170
- creditsError: nil,
171
- dashboard: dashboard,
172
- dashboardError: nil,
173
- tokenSnapshot: nil,
174
- tokenError: nil,
175
- account: AccountInfo(email: "codex@example.com", plan: "Plus Plan"),
176
- isRefreshing: false,
177
- lastError: nil,
178
- usageBarsShowUsed: true,
179
- tokenCostUsageEnabled: false,
180
- showOptionalCreditsAndExtraUsage: true,
181
- now: now))
182
-
183
- #expect(model.metrics.first?.title == "Session")
184
- #expect(model.metrics.first?.percent == 22)
185
- #expect(model.metrics.first?.percentLabel.contains("used") == true)
186
- #expect(model.metrics.contains { $0.title == "Code review" && $0.percent == 27 })
187
- }
188
-
189
- @Test
190
- func showsCodeReviewMetricWhenDashboardPresent() {
191
- let now = Date()
192
- let identity = ProviderIdentitySnapshot(
193
- providerID: .codex,
194
- accountEmail: "codex@example.com",
195
- accountOrganization: nil,
196
- loginMethod: nil)
197
- let snapshot = UsageSnapshot(
198
- primary: RateWindow(usedPercent: 0, windowMinutes: 300, resetsAt: nil, resetDescription: nil),
199
- secondary: nil,
200
- tertiary: nil,
201
- updatedAt: now,
202
- identity: identity)
203
- let metadata = ProviderDefaults.metadata[.codex]!
204
-
205
- let dashboard = OpenAIDashboardSnapshot(
206
- signedInEmail: "codex@example.com",
207
- codeReviewRemainingPercent: 73,
208
- creditEvents: [],
209
- dailyBreakdown: [],
210
- usageBreakdown: [],
211
- creditsPurchaseURL: nil,
212
- updatedAt: now)
213
- let model = UsageMenuCardView.Model.make(.init(
214
- provider: .codex,
215
- metadata: metadata,
216
- snapshot: snapshot,
217
- credits: nil,
218
- creditsError: nil,
219
- dashboard: dashboard,
220
- dashboardError: nil,
221
- tokenSnapshot: nil,
222
- tokenError: nil,
223
- account: AccountInfo(email: "codex@example.com", plan: nil),
224
- isRefreshing: false,
225
- lastError: nil,
226
- usageBarsShowUsed: false,
227
- tokenCostUsageEnabled: false,
228
- showOptionalCreditsAndExtraUsage: true,
229
- now: now))
230
-
231
- #expect(model.metrics.contains { $0.title == "Code review" && $0.percent == 73 })
232
- }
233
-
234
- @Test
235
- func claudeModelHidesWeeklyWhenUnavailable() {
236
- let now = Date()
237
- let identity = ProviderIdentitySnapshot(
238
- providerID: .claude,
239
- accountEmail: nil,
240
- accountOrganization: nil,
241
- loginMethod: "Max")
242
- let snapshot = UsageSnapshot(
243
- primary: RateWindow(
244
- usedPercent: 2,
245
- windowMinutes: nil,
246
- resetsAt: now.addingTimeInterval(3600),
247
- resetDescription: nil),
248
- secondary: nil,
249
- tertiary: nil,
250
- updatedAt: now,
251
- identity: identity)
252
- let metadata = ProviderDefaults.metadata[.claude]!
253
- let model = UsageMenuCardView.Model.make(.init(
254
- provider: .claude,
255
- metadata: metadata,
256
- snapshot: snapshot,
257
- credits: nil,
258
- creditsError: nil,
259
- dashboard: nil,
260
- dashboardError: nil,
261
- tokenSnapshot: nil,
262
- tokenError: nil,
263
- account: AccountInfo(email: "codex@example.com", plan: "plus"),
264
- isRefreshing: false,
265
- lastError: nil,
266
- usageBarsShowUsed: false,
267
- tokenCostUsageEnabled: false,
268
- showOptionalCreditsAndExtraUsage: true,
269
- now: now))
270
-
271
- #expect(model.metrics.count == 1)
272
- #expect(model.metrics.first?.title == "Session")
273
- #expect(model.planText == "Max")
274
- }
275
-
276
- @Test
277
- func showsErrorSubtitleWhenPresent() {
278
- let metadata = ProviderDefaults.metadata[.codex]!
279
- let model = UsageMenuCardView.Model.make(.init(
280
- provider: .codex,
281
- metadata: metadata,
282
- snapshot: nil,
283
- credits: nil,
284
- creditsError: nil,
285
- dashboard: nil,
286
- dashboardError: nil,
287
- tokenSnapshot: nil,
288
- tokenError: nil,
289
- account: AccountInfo(email: nil, plan: nil),
290
- isRefreshing: false,
291
- lastError: "Probe failed for Codex",
292
- usageBarsShowUsed: false,
293
- tokenCostUsageEnabled: false,
294
- showOptionalCreditsAndExtraUsage: true,
295
- now: Date()))
296
-
297
- #expect(model.subtitleStyle == .error)
298
- #expect(model.subtitleText.contains("Probe failed"))
299
- #expect(model.placeholder == nil)
300
- }
301
-
302
- @Test
303
- func costSectionIncludesLast30DaysTokens() {
304
- let now = Date()
305
- let metadata = ProviderDefaults.metadata[.codex]!
306
- let snapshot = UsageSnapshot(
307
- primary: RateWindow(usedPercent: 0, windowMinutes: 300, resetsAt: nil, resetDescription: nil),
308
- secondary: nil,
309
- tertiary: nil,
310
- updatedAt: now)
311
- let tokenSnapshot = CostUsageTokenSnapshot(
312
- sessionTokens: 123,
313
- sessionCostUSD: 1.23,
314
- last30DaysTokens: 456,
315
- last30DaysCostUSD: 78.9,
316
- daily: [],
317
- updatedAt: now)
318
- let model = UsageMenuCardView.Model.make(.init(
319
- provider: .codex,
320
- metadata: metadata,
321
- snapshot: snapshot,
322
- credits: nil,
323
- creditsError: nil,
324
- dashboard: nil,
325
- dashboardError: nil,
326
- tokenSnapshot: tokenSnapshot,
327
- tokenError: nil,
328
- account: AccountInfo(email: nil, plan: nil),
329
- isRefreshing: false,
330
- lastError: nil,
331
- usageBarsShowUsed: false,
332
- tokenCostUsageEnabled: true,
333
- showOptionalCreditsAndExtraUsage: true,
334
- now: now))
335
-
336
- #expect(model.tokenUsage?.monthLine.contains("456") == true)
337
- #expect(model.tokenUsage?.monthLine.contains("tokens") == true)
338
- }
339
-
340
- @Test
341
- func claudeModelDoesNotLeakCodexPlan() {
342
- let metadata = ProviderDefaults.metadata[.claude]!
343
- let model = UsageMenuCardView.Model.make(.init(
344
- provider: .claude,
345
- metadata: metadata,
346
- snapshot: nil,
347
- credits: nil,
348
- creditsError: nil,
349
- dashboard: nil,
350
- dashboardError: nil,
351
- tokenSnapshot: nil,
352
- tokenError: nil,
353
- account: AccountInfo(email: "codex@example.com", plan: "plus"),
354
- isRefreshing: false,
355
- lastError: nil,
356
- usageBarsShowUsed: false,
357
- tokenCostUsageEnabled: false,
358
- showOptionalCreditsAndExtraUsage: true,
359
- now: Date()))
360
-
361
- #expect(model.planText == nil)
362
- #expect(model.email.isEmpty)
363
- }
364
-
365
- @Test
366
- func hidesCodexCreditsWhenDisabled() {
367
- let now = Date()
368
- let identity = ProviderIdentitySnapshot(
369
- providerID: .codex,
370
- accountEmail: "codex@example.com",
371
- accountOrganization: nil,
372
- loginMethod: nil)
373
- let snapshot = UsageSnapshot(
374
- primary: RateWindow(usedPercent: 0, windowMinutes: 300, resetsAt: nil, resetDescription: nil),
375
- secondary: nil,
376
- tertiary: nil,
377
- updatedAt: now,
378
- identity: identity)
379
- let metadata = ProviderDefaults.metadata[.codex]!
380
-
381
- let model = UsageMenuCardView.Model.make(.init(
382
- provider: .codex,
383
- metadata: metadata,
384
- snapshot: snapshot,
385
- credits: CreditsSnapshot(remaining: 12, events: [], updatedAt: now),
386
- creditsError: nil,
387
- dashboard: nil,
388
- dashboardError: nil,
389
- tokenSnapshot: nil,
390
- tokenError: nil,
391
- account: AccountInfo(email: "codex@example.com", plan: nil),
392
- isRefreshing: false,
393
- lastError: nil,
394
- usageBarsShowUsed: false,
395
- tokenCostUsageEnabled: false,
396
- showOptionalCreditsAndExtraUsage: false,
397
- now: now))
398
-
399
- #expect(model.creditsText == nil)
400
- }
401
-
402
- @Test
403
- func hidesClaudeExtraUsageWhenDisabled() {
404
- let now = Date()
405
- let identity = ProviderIdentitySnapshot(
406
- providerID: .claude,
407
- accountEmail: "claude@example.com",
408
- accountOrganization: nil,
409
- loginMethod: nil)
410
- let snapshot = UsageSnapshot(
411
- primary: RateWindow(usedPercent: 0, windowMinutes: nil, resetsAt: nil, resetDescription: nil),
412
- secondary: nil,
413
- tertiary: nil,
414
- providerCost: ProviderCostSnapshot(used: 12, limit: 200, currencyCode: "USD", updatedAt: now),
415
- updatedAt: now,
416
- identity: identity)
417
- let metadata = ProviderDefaults.metadata[.claude]!
418
-
419
- let model = UsageMenuCardView.Model.make(.init(
420
- provider: .claude,
421
- metadata: metadata,
422
- snapshot: snapshot,
423
- credits: nil,
424
- creditsError: nil,
425
- dashboard: nil,
426
- dashboardError: nil,
427
- tokenSnapshot: nil,
428
- tokenError: nil,
429
- account: AccountInfo(email: nil, plan: nil),
430
- isRefreshing: false,
431
- lastError: nil,
432
- usageBarsShowUsed: false,
433
- tokenCostUsageEnabled: false,
434
- showOptionalCreditsAndExtraUsage: false,
435
- now: now))
436
-
437
- #expect(model.providerCost == nil)
438
- }
439
-
440
- @Test
441
- func insightsShowForecastAndBudgetETAForTopProject() {
442
- let now = Date()
443
- let metadata = ProviderDefaults.metadata[.codex]!
444
- let topProject = UsageLedgerProjectSummary(
445
- provider: .codex,
446
- projectKey: "id:proj-runic",
447
- projectID: "proj-runic",
448
- projectName: "Runic",
449
- entryCount: 5,
450
- totals: UsageLedgerTotals(
451
- inputTokens: 2_000,
452
- outputTokens: 1_000,
453
- cacheCreationTokens: 0,
454
- cacheReadTokens: 0,
455
- costUSD: 12.5),
456
- modelsUsed: ["gpt-5"])
457
- let providerForecast = UsageLedgerSpendForecast(
458
- provider: .codex,
459
- observedDays: 3,
460
- observedCostUSD: 36,
461
- averageDailyCostUSD: 12,
462
- projected30DayCostUSD: 360,
463
- projectedCostP50USD: 330,
464
- projectedCostP80USD: 420,
465
- projectedCostP95USD: 510)
466
- let projectForecast = UsageLedgerSpendForecast(
467
- provider: .codex,
468
- projectKey: "id:proj-runic",
469
- projectID: "proj-runic",
470
- projectName: "Runic",
471
- observedDays: 3,
472
- observedCostUSD: 36,
473
- averageDailyCostUSD: 12,
474
- projected30DayCostUSD: 360)
475
- .applyingBudget(monthlyLimitUSD: 60)
476
-
477
- let model = UsageMenuCardView.Model.make(.init(
478
- provider: .codex,
479
- metadata: metadata,
480
- snapshot: nil,
481
- credits: nil,
482
- creditsError: nil,
483
- dashboard: nil,
484
- dashboardError: nil,
485
- tokenSnapshot: nil,
486
- tokenError: nil,
487
- ledgerTopProject: topProject,
488
- ledgerSpendForecast: providerForecast,
489
- ledgerTopProjectSpendForecast: projectForecast,
490
- account: AccountInfo(email: nil, plan: nil),
491
- isRefreshing: false,
492
- lastError: nil,
493
- usageBarsShowUsed: false,
494
- tokenCostUsageEnabled: false,
495
- showOptionalCreditsAndExtraUsage: true,
496
- now: now))
497
-
498
- #expect(model.insights?.forecastLine?.contains("Month-end forecast") == true)
499
- #expect(model.insights?.forecastLine?.contains("p80") == true)
500
- #expect(model.insights?.forecastLine?.contains("p95") == true)
501
- #expect(model.insights?.projectDetail?.contains("Budget") == true)
502
- #expect(model.insights?.projectDetail?.contains("Breach") == true)
503
- }
504
-
505
- @Test
506
- func insightsSurfaceAnomalySeverityLine() {
507
- let metadata = ProviderDefaults.metadata[.codex]!
508
- let anomaly = UsageLedgerAnomalySummary(
509
- provider: .codex,
510
- baselineDays: 7,
511
- tokenAnomaly: UsageLedgerAnomalySummary.MetricAnomaly(
512
- metric: .tokens,
513
- severity: .high,
514
- todayValue: 4_200,
515
- baselineAverage: 1_500,
516
- percentIncrease: 1.8),
517
- spendAnomaly: UsageLedgerAnomalySummary.MetricAnomaly(
518
- metric: .spend,
519
- severity: .elevated,
520
- todayValue: 17.5,
521
- baselineAverage: 9.0,
522
- percentIncrease: 0.94))
523
- let model = UsageMenuCardView.Model.make(.init(
524
- provider: .codex,
525
- metadata: metadata,
526
- snapshot: nil,
527
- credits: nil,
528
- creditsError: nil,
529
- dashboard: nil,
530
- dashboardError: nil,
531
- tokenSnapshot: nil,
532
- tokenError: nil,
533
- ledgerAnomaly: anomaly,
534
- account: AccountInfo(email: nil, plan: nil),
535
- isRefreshing: false,
536
- lastError: nil,
537
- usageBarsShowUsed: false,
538
- tokenCostUsageEnabled: false,
539
- showOptionalCreditsAndExtraUsage: true,
540
- now: Date()))
541
-
542
- #expect(model.insights?.anomalyLine == "Anomaly: High tokens spike")
543
- #expect(model.insights?.anomalyDetail?.contains("+180%") == true)
544
- }
545
- }
@@ -1,8 +0,0 @@
1
- @testable import Runic
2
-
3
- struct NoopMiniMaxCookieHeaderStore: MiniMaxCookieHeaderStoring {
4
- func loadHeader() throws -> String? { nil }
5
- func storeHeader(_ header: String?) throws {
6
- _ = header
7
- }
8
- }
@@ -1,8 +0,0 @@
1
- @testable import Runic
2
-
3
- struct NoopMiniMaxGroupIDStore: MiniMaxGroupIDStoring {
4
- func loadGroupID() throws -> String? { nil }
5
- func storeGroupID(_ groupID: String?) throws {
6
- _ = groupID
7
- }
8
- }
@@ -1,68 +0,0 @@
1
- import Foundation
2
- import Testing
3
- @testable import RunicCore
4
-
5
- @Suite
6
- struct MiniMaxParsingTests {
7
- @Test
8
- func parseManualInputCookieHeader() {
9
- let input = "Cookie: foo=bar; baz=qux"
10
- let parsed = MiniMaxWebParsing.parseManualInput(input)
11
- #expect(parsed?.cookieHeader == "foo=bar; baz=qux")
12
- #expect(parsed?.accessToken == nil)
13
- }
14
-
15
- @Test
16
- func parseManualInputCurlExtractsBearerAndGroupID() {
17
- let curl = """
18
- curl 'https://platform.minimax.io/v1/api/openplatform/coding_plan/remains?GroupId=group_123' \
19
- -H 'Cookie: session=abc; foo=bar' \
20
- -H 'Authorization: Bearer header.token.value'
21
- """
22
- let parsed = MiniMaxWebParsing.parseManualInput(curl)
23
- #expect(parsed?.cookieHeader == "session=abc; foo=bar")
24
- #expect(parsed?.accessToken == "header.token.value")
25
- #expect(parsed?.groupID == "group_123")
26
- }
27
-
28
- @Test
29
- func parseHTMLUsageWithPercentAndReset() {
30
- let html = """
31
- <html>
32
- <head><title>MiniMax Pro</title></head>
33
- <body>
34
- <div>Available usage: 40%</div>
35
- <div>Resets in 2d 3h</div>
36
- </body>
37
- </html>
38
- """
39
- let now = Date(timeIntervalSince1970: 0)
40
- let parsed = MiniMaxWebParsing.parseHTMLUsage(html, now: now)
41
- #expect(parsed?.usedPercent == 60)
42
- #expect(parsed?.planName == "MiniMax Pro")
43
- #expect(parsed?.resetDescription == "Resets in 2d 3h")
44
- #expect(parsed?.resetsAt == now.addingTimeInterval(TimeInterval((2 * 24 * 60 + 3 * 60) * 60)))
45
- }
46
-
47
- @Test
48
- func parseRemainsResponseUsesModelRemains() throws {
49
- let json = """
50
- {
51
- "base_resp": { "retcode": 0, "msg": "ok", "success": true },
52
- "data": {
53
- "model_remains": { "used": 20, "total": 100 },
54
- "start_time": 1700000000,
55
- "end_time": 1700003600,
56
- "remains_time": 600,
57
- "plan_name": "MiniMax Pro"
58
- }
59
- }
60
- """
61
- let now = Date(timeIntervalSince1970: 0)
62
- let parsed = try MiniMaxWebParsing.parseRemainsResponse(Data(json.utf8), now: now)
63
- #expect(parsed.usedPercent == 20)
64
- #expect(parsed.windowMinutes == 60)
65
- #expect(parsed.resetsAt == now.addingTimeInterval(600))
66
- #expect(parsed.planName == "MiniMax Pro")
67
- }
68
- }
@@ -1,8 +0,0 @@
1
- @testable import Runic
2
-
3
- struct NoopMiniMaxTokenStore: MiniMaxTokenStoring {
4
- func loadToken() throws -> String? { nil }
5
- func storeToken(_ token: String?) throws {
6
- _ = token
7
- }
8
- }