@hashimkarim/usagestat-linux-x64-gnu 2.0.0-alpha.1 → 2.0.0-alpha.4

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 (384) hide show
  1. package/LICENSE +0 -0
  2. package/native-manifest.json +1088 -134
  3. package/package.json +160 -1
  4. package/plugins/UPSTREAM-LICENSES.md +113 -0
  5. package/plugins/_provider-icons/LICENSE +21 -0
  6. package/plugins/_provider-icons/NOTICE +12 -0
  7. package/plugins/_provider-icons/licenses/CodexBar-MIT.txt +21 -0
  8. package/plugins/_provider-icons/licenses/LobeHub-MIT.txt +21 -0
  9. package/plugins/_provider-icons/licenses/UsageStat-Bar-MIT.txt +21 -0
  10. package/plugins/_provider-icons/manifest.json +1219 -0
  11. package/plugins/_provider-icons/provenance.json +269 -0
  12. package/plugins/_provider-icons/source.json +4 -0
  13. package/plugins/abacus-ai/icon-color.svg +18 -0
  14. package/plugins/abacus-ai/icon.svg +0 -0
  15. package/plugins/abacus-ai/plugin.js +0 -0
  16. package/plugins/abacus-ai/plugin.json +0 -0
  17. package/plugins/aiand/icon.svg +6 -0
  18. package/plugins/aiand/plugin.js +108 -0
  19. package/plugins/aiand/plugin.json +22 -0
  20. package/plugins/aixy/LICENSE +21 -0
  21. package/plugins/aixy/plugin.js +261 -0
  22. package/plugins/aixy/plugin.json +24 -0
  23. package/plugins/alibaba/icon-color.svg +0 -0
  24. package/plugins/alibaba/icon.svg +0 -0
  25. package/plugins/alibaba/plugin.js +0 -0
  26. package/plugins/alibaba/plugin.json +0 -0
  27. package/plugins/alibaba-token-plan/icon-color.svg +0 -0
  28. package/plugins/alibaba-token-plan/icon.svg +0 -0
  29. package/plugins/alibaba-token-plan/plugin.js +0 -0
  30. package/plugins/alibaba-token-plan/plugin.json +0 -0
  31. package/plugins/amp/icon-color.svg +0 -0
  32. package/plugins/amp/icon-conflict.svg +0 -0
  33. package/plugins/amp/icon.svg +0 -0
  34. package/plugins/amp/plugin.js +0 -0
  35. package/plugins/amp/plugin.json +0 -0
  36. package/plugins/antigravity/icon-color.svg +0 -0
  37. package/plugins/antigravity/icon-conflict.svg +0 -0
  38. package/plugins/antigravity/icon.svg +0 -0
  39. package/plugins/antigravity/plugin.js +136 -46
  40. package/plugins/antigravity/plugin.json +0 -0
  41. package/plugins/antigravity-cli/icon-color.svg +1 -0
  42. package/plugins/antigravity-cli/icon.svg +1 -3
  43. package/plugins/antigravity-cli/plugin.js +11 -15
  44. package/plugins/antigravity-cli/plugin.json +0 -0
  45. package/plugins/antigravity-ide/icon-color.svg +1 -0
  46. package/plugins/antigravity-ide/icon.svg +1 -3
  47. package/plugins/antigravity-ide/plugin.js +0 -0
  48. package/plugins/antigravity-ide/plugin.json +0 -0
  49. package/plugins/atlascloud/LICENSE +21 -0
  50. package/plugins/atlascloud/icon-color.svg +1 -0
  51. package/plugins/atlascloud/icon.svg +1 -0
  52. package/plugins/atlascloud/plugin.js +49 -0
  53. package/plugins/atlascloud/plugin.json +23 -0
  54. package/plugins/augment/icon-color.svg +14 -0
  55. package/plugins/augment/icon.svg +0 -0
  56. package/plugins/augment/plugin.js +0 -0
  57. package/plugins/augment/plugin.json +0 -0
  58. package/plugins/aws-bedrock/icon-color.svg +0 -0
  59. package/plugins/aws-bedrock/icon.svg +0 -0
  60. package/plugins/aws-bedrock/plugin.js +0 -0
  61. package/plugins/aws-bedrock/plugin.json +0 -0
  62. package/plugins/azure-openai/icon-color.svg +0 -0
  63. package/plugins/azure-openai/icon.svg +0 -0
  64. package/plugins/azure-openai/plugin.js +0 -0
  65. package/plugins/azure-openai/plugin.json +0 -0
  66. package/plugins/bifrost/LICENSE +21 -0
  67. package/plugins/bifrost/plugin.js +361 -0
  68. package/plugins/bifrost/plugin.json +23 -0
  69. package/plugins/chutes/icon.svg +0 -0
  70. package/plugins/chutes/plugin.js +0 -0
  71. package/plugins/chutes/plugin.json +0 -0
  72. package/plugins/claude/icon-color.svg +0 -0
  73. package/plugins/claude/icon.svg +0 -0
  74. package/plugins/claude/plugin.js +358 -161
  75. package/plugins/claude/plugin.json +1 -1
  76. package/plugins/clawrouter/icon.svg +7 -0
  77. package/plugins/clawrouter/plugin.js +45 -0
  78. package/plugins/clawrouter/plugin.json +22 -0
  79. package/plugins/clinepass/icon.svg +4 -0
  80. package/plugins/clinepass/plugin.js +87 -0
  81. package/plugins/clinepass/plugin.json +23 -0
  82. package/plugins/codebuddy/plugin.js +331 -0
  83. package/plugins/codebuddy/plugin.json +30 -0
  84. package/plugins/codebuff/icon-color.svg +92 -0
  85. package/plugins/codebuff/icon.svg +0 -0
  86. package/plugins/codebuff/plugin.js +0 -0
  87. package/plugins/codebuff/plugin.json +0 -0
  88. package/plugins/coderabbit/plugin.js +25 -0
  89. package/plugins/coderabbit/plugin.json +12 -0
  90. package/plugins/codex/icon-color.svg +0 -0
  91. package/plugins/codex/icon.svg +0 -0
  92. package/plugins/codex/plugin.js +8 -2
  93. package/plugins/codex/plugin.json +0 -0
  94. package/plugins/command-code/icon-color.svg +3 -0
  95. package/plugins/command-code/icon.svg +0 -0
  96. package/plugins/command-code/plugin.js +14 -3
  97. package/plugins/command-code/plugin.json +0 -0
  98. package/plugins/copilot/icon-color.svg +0 -0
  99. package/plugins/copilot/icon.svg +1 -1
  100. package/plugins/copilot/plugin.js +61 -9
  101. package/plugins/copilot/plugin.json +4 -1
  102. package/plugins/crof/icon-color.svg +3 -0
  103. package/plugins/crof/icon.svg +0 -0
  104. package/plugins/crof/plugin.js +0 -0
  105. package/plugins/crof/plugin.json +0 -0
  106. package/plugins/crofai/icon-color.svg +3 -0
  107. package/plugins/crofai/icon.svg +2 -15
  108. package/plugins/crofai/plugin.js +0 -0
  109. package/plugins/crofai/plugin.json +0 -0
  110. package/plugins/cursor/icon-color.svg +1 -0
  111. package/plugins/cursor/icon-conflict.svg +0 -0
  112. package/plugins/cursor/icon.svg +0 -0
  113. package/plugins/cursor/plugin.js +46 -9
  114. package/plugins/cursor/plugin.json +3 -2
  115. package/plugins/cursor-nightly/icon.png +0 -0
  116. package/plugins/cursor-nightly/plugin.js +45 -8
  117. package/plugins/cursor-nightly/plugin.json +3 -2
  118. package/plugins/deepgram/icon.svg +0 -0
  119. package/plugins/deepgram/plugin.js +0 -0
  120. package/plugins/deepgram/plugin.json +0 -0
  121. package/plugins/deepinfra/icon-color.svg +1 -0
  122. package/plugins/deepinfra/icon.svg +1 -0
  123. package/plugins/deepinfra/plugin.js +97 -0
  124. package/plugins/deepinfra/plugin.json +28 -0
  125. package/plugins/deepseek/icon-color.svg +0 -0
  126. package/plugins/deepseek/icon.svg +0 -0
  127. package/plugins/deepseek/plugin.js +150 -59
  128. package/plugins/deepseek/plugin.json +3 -1
  129. package/plugins/devin/icon.svg +0 -0
  130. package/plugins/devin/plugin.js +114 -0
  131. package/plugins/devin/plugin.json +2 -1
  132. package/plugins/devpass/LICENSE +21 -0
  133. package/plugins/devpass/plugin.js +115 -0
  134. package/plugins/devpass/plugin.json +23 -0
  135. package/plugins/doubao/icon-color.svg +0 -0
  136. package/plugins/doubao/icon.svg +0 -0
  137. package/plugins/doubao/plugin.js +0 -0
  138. package/plugins/doubao/plugin.json +0 -0
  139. package/plugins/droid/icon.svg +0 -0
  140. package/plugins/droid/plugin.json +2 -1
  141. package/plugins/elevenlabs/icon-color.svg +4 -0
  142. package/plugins/elevenlabs/icon.svg +0 -0
  143. package/plugins/elevenlabs/plugin.js +17 -2
  144. package/plugins/elevenlabs/plugin.json +0 -0
  145. package/plugins/factory/icon-color.svg +1 -0
  146. package/plugins/factory/icon-conflict.svg +0 -0
  147. package/plugins/factory/icon.svg +0 -0
  148. package/plugins/factory/plugin.js +38 -14
  149. package/plugins/factory/plugin.json +2 -1
  150. package/plugins/fireworks-ai/icon-color.svg +1 -0
  151. package/plugins/fireworks-ai/icon.svg +1 -6
  152. package/plugins/fireworks-ai/plugin.js +0 -0
  153. package/plugins/fireworks-ai/plugin.json +0 -0
  154. package/plugins/gemini/icon-color.svg +0 -0
  155. package/plugins/gemini/icon.svg +0 -0
  156. package/plugins/gemini/plugin.js +0 -0
  157. package/plugins/gemini/plugin.json +0 -0
  158. package/plugins/gemini-apps/LICENSE +22 -0
  159. package/plugins/gemini-apps/icon-color.svg +1 -0
  160. package/plugins/gemini-apps/icon.svg +1 -0
  161. package/plugins/gemini-apps/plugin.js +470 -0
  162. package/plugins/gemini-apps/plugin.json +19 -0
  163. package/plugins/gitkraken/LICENSE +21 -0
  164. package/plugins/gitkraken/plugin.js +153 -0
  165. package/plugins/gitkraken/plugin.json +24 -0
  166. package/plugins/grok/icon-color.svg +1 -0
  167. package/plugins/grok/icon.svg +0 -0
  168. package/plugins/grok/plugin.js +30 -5
  169. package/plugins/grok/plugin.json +3 -1
  170. package/plugins/groqcloud/icon-color.svg +1 -0
  171. package/plugins/groqcloud/icon.svg +0 -0
  172. package/plugins/groqcloud/plugin.js +0 -0
  173. package/plugins/groqcloud/plugin.json +0 -0
  174. package/plugins/helmcode/LICENSE +21 -0
  175. package/plugins/helmcode/plugin.js +188 -0
  176. package/plugins/helmcode/plugin.json +24 -0
  177. package/plugins/huggingface/LICENSE +21 -0
  178. package/plugins/huggingface/icon-color.svg +1 -0
  179. package/plugins/huggingface/icon.svg +1 -0
  180. package/plugins/huggingface/plugin.js +293 -0
  181. package/plugins/huggingface/plugin.json +25 -0
  182. package/plugins/hyper/LICENSE +21 -0
  183. package/plugins/hyper/plugin.js +131 -0
  184. package/plugins/hyper/plugin.json +26 -0
  185. package/plugins/ibmbob/icon.svg +23 -0
  186. package/plugins/ibmbob/plugin.js +61 -0
  187. package/plugins/ibmbob/plugin.json +22 -0
  188. package/plugins/jetbrains-ai-assistant/icon-color.svg +0 -0
  189. package/plugins/jetbrains-ai-assistant/icon-conflict.svg +0 -0
  190. package/plugins/jetbrains-ai-assistant/icon.svg +0 -0
  191. package/plugins/jetbrains-ai-assistant/plugin.js +0 -0
  192. package/plugins/jetbrains-ai-assistant/plugin.json +0 -0
  193. package/plugins/kilo/icon-color.svg +1 -0
  194. package/plugins/kilo/icon.svg +0 -0
  195. package/plugins/kilo/plugin.js +0 -0
  196. package/plugins/kilo/plugin.json +0 -0
  197. package/plugins/kimi/icon-color.svg +0 -0
  198. package/plugins/kimi/icon-conflict.svg +0 -0
  199. package/plugins/kimi/icon.svg +0 -0
  200. package/plugins/kimi/plugin.js +122 -141
  201. package/plugins/kimi/plugin.json +5 -2
  202. package/plugins/kimi-k2/icon-color.svg +0 -0
  203. package/plugins/kimi-k2/icon.svg +0 -0
  204. package/plugins/kimi-k2/plugin.js +0 -0
  205. package/plugins/kimi-k2/plugin.json +0 -0
  206. package/plugins/kiro/icon-color.svg +0 -0
  207. package/plugins/kiro/icon-conflict.svg +0 -0
  208. package/plugins/kiro/icon.svg +0 -0
  209. package/plugins/kiro/plugin.js +49 -10
  210. package/plugins/kiro/plugin.json +3 -1
  211. package/plugins/litellm/icon.svg +0 -0
  212. package/plugins/litellm/plugin.js +54 -3
  213. package/plugins/litellm/plugin.json +0 -0
  214. package/plugins/llm-proxy/icon.svg +0 -0
  215. package/plugins/llm-proxy/plugin.js +0 -0
  216. package/plugins/llm-proxy/plugin.json +0 -0
  217. package/plugins/llmman/LICENSE +21 -0
  218. package/plugins/llmman/plugin.js +133 -0
  219. package/plugins/llmman/plugin.json +23 -0
  220. package/plugins/longcat/icon-color.svg +1 -0
  221. package/plugins/longcat/icon.svg +1 -0
  222. package/plugins/longcat/plugin.js +182 -0
  223. package/plugins/longcat/plugin.json +23 -0
  224. package/plugins/manus/icon-color.svg +6 -0
  225. package/plugins/manus/icon.svg +0 -0
  226. package/plugins/manus/plugin.js +0 -0
  227. package/plugins/manus/plugin.json +0 -0
  228. package/plugins/mimo/icon-color.svg +4 -0
  229. package/plugins/mimo/icon.svg +4 -1
  230. package/plugins/mimo/plugin.js +0 -0
  231. package/plugins/mimo/plugin.json +0 -0
  232. package/plugins/minimax/icon-color.svg +0 -0
  233. package/plugins/minimax/icon-conflict.svg +0 -0
  234. package/plugins/minimax/icon.svg +0 -0
  235. package/plugins/minimax/plugin.js +25 -31
  236. package/plugins/minimax/plugin.json +0 -0
  237. package/plugins/mistral/icon-color.svg +0 -0
  238. package/plugins/mistral/icon.svg +0 -0
  239. package/plugins/mistral/plugin.js +110 -5
  240. package/plugins/mistral/plugin.json +0 -0
  241. package/plugins/moonshot/icon-color.svg +1 -0
  242. package/plugins/moonshot/icon.svg +0 -0
  243. package/plugins/moonshot/plugin.js +8 -6
  244. package/plugins/moonshot/plugin.json +0 -0
  245. package/plugins/muse/LICENSE +21 -0
  246. package/plugins/muse/plugin.js +319 -0
  247. package/plugins/muse/plugin.json +26 -0
  248. package/plugins/nanogpt/icon-color.svg +0 -0
  249. package/plugins/nanogpt/icon.svg +0 -0
  250. package/plugins/nanogpt/plugin.js +0 -0
  251. package/plugins/nanogpt/plugin.json +0 -0
  252. package/plugins/neuralwatt/icon.svg +0 -0
  253. package/plugins/neuralwatt/plugin.js +0 -0
  254. package/plugins/neuralwatt/plugin.json +0 -0
  255. package/plugins/notion/icon.svg +1 -0
  256. package/plugins/notion/plugin.js +282 -0
  257. package/plugins/notion/plugin.json +29 -0
  258. package/plugins/nous/LICENSE +21 -0
  259. package/plugins/nous/icon-color.svg +1 -0
  260. package/plugins/nous/icon.svg +1 -0
  261. package/plugins/nous/plugin.js +124 -0
  262. package/plugins/nous/plugin.json +24 -0
  263. package/plugins/ollama/icon-color.svg +1 -0
  264. package/plugins/ollama/icon.svg +0 -0
  265. package/plugins/ollama/plugin.js +257 -56
  266. package/plugins/ollama/plugin.json +6 -3
  267. package/plugins/openai-api/icon-color.svg +1 -0
  268. package/plugins/openai-api/icon.svg +0 -0
  269. package/plugins/openai-api/plugin.js +0 -0
  270. package/plugins/openai-api/plugin.json +0 -0
  271. package/plugins/opencode/icon-color.svg +1 -0
  272. package/plugins/opencode/icon.svg +0 -0
  273. package/plugins/opencode/plugin.js +0 -0
  274. package/plugins/opencode/plugin.json +0 -0
  275. package/plugins/opencode-go/icon-color.svg +1 -0
  276. package/plugins/opencode-go/icon-conflict.svg +0 -0
  277. package/plugins/opencode-go/icon.svg +0 -0
  278. package/plugins/opencode-go/plugin.js +103 -17
  279. package/plugins/opencode-go/plugin.json +5 -2
  280. package/plugins/openrouter/icon-color.svg +1 -0
  281. package/plugins/openrouter/icon.svg +0 -0
  282. package/plugins/openrouter/plugin.js +371 -114
  283. package/plugins/openrouter/plugin.json +6 -0
  284. package/plugins/perplexity/icon-color.svg +0 -0
  285. package/plugins/perplexity/icon-conflict.svg +0 -0
  286. package/plugins/perplexity/icon.svg +0 -0
  287. package/plugins/perplexity/plugin.js +0 -0
  288. package/plugins/perplexity/plugin.json +0 -0
  289. package/plugins/pi/plugin.js +113 -0
  290. package/plugins/pi/plugin.json +11 -0
  291. package/plugins/poe/icon.svg +0 -0
  292. package/plugins/poe/plugin.js +24 -18
  293. package/plugins/poe/plugin.json +2 -0
  294. package/plugins/qoder/icon.svg +3 -0
  295. package/plugins/qoder/plugin.js +227 -0
  296. package/plugins/qoder/plugin.json +23 -0
  297. package/plugins/qwencloud/icon-color.svg +1 -0
  298. package/plugins/qwencloud/icon.svg +1 -0
  299. package/plugins/qwencloud/plugin.js +677 -0
  300. package/plugins/qwencloud/plugin.json +29 -0
  301. package/plugins/raycast/LICENSE +21 -0
  302. package/plugins/raycast/plugin.js +174 -0
  303. package/plugins/raycast/plugin.json +24 -0
  304. package/plugins/replicate/LICENSE +21 -0
  305. package/plugins/replicate/icon-color.svg +1 -0
  306. package/plugins/replicate/icon.svg +1 -0
  307. package/plugins/replicate/plugin.js +165 -0
  308. package/plugins/replicate/plugin.json +24 -0
  309. package/plugins/sakana/icon.svg +5 -0
  310. package/plugins/sakana/plugin.js +156 -0
  311. package/plugins/sakana/plugin.json +23 -0
  312. package/plugins/stepfun/icon-color.svg +0 -0
  313. package/plugins/stepfun/icon.svg +0 -0
  314. package/plugins/stepfun/plugin.js +0 -0
  315. package/plugins/stepfun/plugin.json +0 -0
  316. package/plugins/sub2api/icon.svg +4 -0
  317. package/plugins/sub2api/plugin.js +191 -0
  318. package/plugins/sub2api/plugin.json +16 -0
  319. package/plugins/synthetic/icon-color.svg +14 -0
  320. package/plugins/synthetic/icon-conflict.svg +0 -0
  321. package/plugins/synthetic/icon.svg +0 -0
  322. package/plugins/synthetic/plugin.js +0 -0
  323. package/plugins/synthetic/plugin.json +0 -0
  324. package/plugins/t3chat/icon-color.svg +0 -0
  325. package/plugins/t3chat/icon.svg +0 -0
  326. package/plugins/t3chat/plugin.js +0 -0
  327. package/plugins/t3chat/plugin.json +0 -0
  328. package/plugins/typesafe/LICENSE +21 -0
  329. package/plugins/typesafe/plugin.js +225 -0
  330. package/plugins/typesafe/plugin.json +24 -0
  331. package/plugins/v0/LICENSE +21 -0
  332. package/plugins/v0/icon-color.svg +1 -0
  333. package/plugins/v0/icon.svg +1 -0
  334. package/plugins/v0/plugin.js +214 -0
  335. package/plugins/v0/plugin.json +24 -0
  336. package/plugins/venice/icon-color.svg +0 -0
  337. package/plugins/venice/icon.svg +0 -0
  338. package/plugins/venice/plugin.js +50 -1
  339. package/plugins/venice/plugin.json +2 -1
  340. package/plugins/vercel/LICENSE +21 -0
  341. package/plugins/vercel/icon-color.svg +1 -0
  342. package/plugins/vercel/icon.svg +1 -0
  343. package/plugins/vercel/plugin.js +55 -0
  344. package/plugins/vercel/plugin.json +23 -0
  345. package/plugins/vertex-ai/icon-color.svg +0 -0
  346. package/plugins/vertex-ai/icon.svg +0 -0
  347. package/plugins/vertex-ai/plugin.js +0 -0
  348. package/plugins/vertex-ai/plugin.json +0 -0
  349. package/plugins/warp/icon-color.svg +0 -0
  350. package/plugins/warp/icon.svg +0 -0
  351. package/plugins/warp/plugin.js +0 -0
  352. package/plugins/warp/plugin.json +0 -0
  353. package/plugins/wayfinder/icon.svg +5 -0
  354. package/plugins/wayfinder/plugin.js +47 -0
  355. package/plugins/wayfinder/plugin.json +16 -0
  356. package/plugins/windsurf/icon-color.svg +1 -0
  357. package/plugins/windsurf/icon-conflict.svg +0 -0
  358. package/plugins/windsurf/icon.svg +0 -0
  359. package/plugins/windsurf/plugin.js +0 -0
  360. package/plugins/windsurf/plugin.json +0 -0
  361. package/plugins/xai/icon-color.svg +1 -0
  362. package/plugins/xai/icon.svg +1 -0
  363. package/plugins/xai/plugin.js +162 -0
  364. package/plugins/xai/plugin.json +28 -0
  365. package/plugins/xkiro/LICENSE +21 -0
  366. package/plugins/xkiro/plugin.js +99 -0
  367. package/plugins/xkiro/plugin.json +23 -0
  368. package/plugins/zai/icon-color.svg +1 -0
  369. package/plugins/zai/icon-conflict.svg +0 -0
  370. package/plugins/zai/icon.svg +0 -0
  371. package/plugins/zai/plugin.js +111 -161
  372. package/plugins/zai/plugin.json +4 -1
  373. package/plugins/zed/icon.svg +0 -0
  374. package/plugins/zed/plugin.js +0 -0
  375. package/plugins/zed/plugin.json +0 -0
  376. package/plugins/zenmux/icon-color.svg +1 -0
  377. package/plugins/zenmux/icon.svg +1 -0
  378. package/plugins/zenmux/plugin.js +102 -0
  379. package/plugins/zenmux/plugin.json +23 -0
  380. package/plugins/zoommate/icon.svg +1 -0
  381. package/plugins/zoommate/plugin.js +244 -0
  382. package/plugins/zoommate/plugin.json +29 -0
  383. package/usagestat +0 -0
  384. package/usagestatd +0 -0
@@ -0,0 +1 @@
1
+ <svg height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Antigravity</title><mask height="23" id="lobe-icons-antigravity-0-_R_0_" maskUnits="userSpaceOnUse" width="24" x="0" y="1"><path d="M21.751 22.607c1.34 1.005 3.35.335 1.508-1.508C17.73 15.74 18.904 1 12.037 1 5.17 1 6.342 15.74.815 21.1c-2.01 2.009.167 2.511 1.507 1.506 5.192-3.517 4.857-9.714 9.715-9.714 4.857 0 4.522 6.197 9.714 9.715z" fill="#fff"></path></mask><g mask="url(#lobe-icons-antigravity-0-_R_0_)"><g filter="url(#lobe-icons-antigravity-1-_R_0_)"><path d="M-1.018-3.992c-.408 3.591 2.686 6.89 6.91 7.37 4.225.48 7.98-2.043 8.387-5.633.408-3.59-2.686-6.89-6.91-7.37-4.225-.479-7.98 2.043-8.387 5.633z" fill="#FFE432"></path></g><g filter="url(#lobe-icons-antigravity-2-_R_0_)"><path d="M15.269 7.747c1.058 4.557 5.691 7.374 10.348 6.293 4.657-1.082 7.575-5.653 6.516-10.21-1.058-4.556-5.691-7.374-10.348-6.292-4.657 1.082-7.575 5.653-6.516 10.21z" fill="#FC413D"></path></g><g filter="url(#lobe-icons-antigravity-3-_R_0_)"><path d="M-12.443 10.804c1.338 4.703 7.36 7.11 13.453 5.378 6.092-1.733 9.947-6.95 8.61-11.652C8.282-.173 2.26-2.58-3.833-.848-9.925.884-13.78 6.1-12.443 10.804z" fill="#00B95C"></path></g><g filter="url(#lobe-icons-antigravity-4-_R_0_)"><path d="M-12.443 10.804c1.338 4.703 7.36 7.11 13.453 5.378 6.092-1.733 9.947-6.95 8.61-11.652C8.282-.173 2.26-2.58-3.833-.848-9.925.884-13.78 6.1-12.443 10.804z" fill="#00B95C"></path></g><g filter="url(#lobe-icons-antigravity-5-_R_0_)"><path d="M-7.608 14.703c3.352 3.424 9.126 3.208 12.896-.483 3.77-3.69 4.108-9.459.756-12.883C2.69-2.087-3.083-1.871-6.853 1.82c-3.77 3.69-4.108 9.458-.755 12.883z" fill="#00B95C"></path></g><g filter="url(#lobe-icons-antigravity-6-_R_0_)"><path d="M9.932 27.617c1.04 4.482 5.384 7.303 9.7 6.3 4.316-1.002 6.971-5.448 5.93-9.93-1.04-4.483-5.384-7.304-9.7-6.301-4.316 1.002-6.971 5.448-5.93 9.93z" fill="#3186FF"></path></g><g filter="url(#lobe-icons-antigravity-7-_R_0_)"><path d="M2.572-8.185C.392-3.329 2.778 2.472 7.9 4.771c5.122 2.3 11.042.227 13.222-4.63 2.18-4.855-.205-10.656-5.327-12.955-5.122-2.3-11.042-.227-13.222 4.63z" fill="#FBBC04"></path></g><g filter="url(#lobe-icons-antigravity-8-_R_0_)"><path d="M-3.267 38.686c-5.277-2.072 3.742-19.117 5.984-24.83 2.243-5.712 8.34-8.664 13.616-6.592 5.278 2.071 11.533 13.482 9.29 19.195-2.242 5.713-23.613 14.298-28.89 12.227z" fill="#3186FF"></path></g><g filter="url(#lobe-icons-antigravity-9-_R_0_)"><path d="M28.71 17.471c-1.413 1.649-5.1.808-8.236-1.878-3.135-2.687-4.531-6.201-3.118-7.85 1.412-1.649 5.1-.808 8.235 1.878s4.532 6.2 3.119 7.85z" fill="#749BFF"></path></g><g filter="url(#lobe-icons-antigravity-10-_R_0_)"><path d="M18.163 9.077c5.81 3.93 12.502 4.19 14.946.577 2.443-3.612-.287-9.727-6.098-13.658-5.81-3.931-12.502-4.19-14.946-.577-2.443 3.612.287 9.727 6.098 13.658z" fill="#FC413D"></path></g><g filter="url(#lobe-icons-antigravity-11-_R_0_)"><path d="M-.915 2.684c-1.44 3.473-.97 6.967 1.05 7.804 2.02.837 4.824-1.3 6.264-4.772 1.44-3.473.97-6.967-1.05-7.804-2.02-.837-4.824 1.3-6.264 4.772z" fill="#FFEE48"></path></g></g><defs><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="17.587" id="lobe-icons-antigravity-1-_R_0_" width="19.838" x="-3.288" y="-11.917"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="1.117"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="38.565" id="lobe-icons-antigravity-2-_R_0_" width="38.9" x="4.251" y="-13.493"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="5.4"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="36.517" id="lobe-icons-antigravity-3-_R_0_" width="40.955" x="-21.889" y="-10.592"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="36.517" id="lobe-icons-antigravity-4-_R_0_" width="40.955" x="-21.889" y="-10.592"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="36.595" id="lobe-icons-antigravity-5-_R_0_" width="36.632" x="-19.099" y="-10.278"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.591"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="34.087" id="lobe-icons-antigravity-6-_R_0_" width="33.533" x=".981" y="8.758"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="4.363"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="35.276" id="lobe-icons-antigravity-7-_R_0_" width="35.978" x="-6.143" y="-21.659"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.954"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="46.523" id="lobe-icons-antigravity-8-_R_0_" width="45.114" x="-11.96" y="-.46"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.531"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="24.054" id="lobe-icons-antigravity-9-_R_0_" width="25.094" x="10.485" y=".58"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.159"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="30.007" id="lobe-icons-antigravity-10-_R_0_" width="33.508" x="5.833" y="-12.467"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="2.669"></feGaussianBlur></filter><filter color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse" height="26.151" id="lobe-icons-antigravity-11-_R_0_" width="22.194" x="-8.355" y="-8.876"><feFlood flood-opacity="0" result="BackgroundImageFix"></feFlood><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape"></feBlend><feGaussianBlur result="effect1_foregroundBlur_977_115" stdDeviation="3.303"></feGaussianBlur></filter></defs></svg>
@@ -1,3 +1 @@
1
- <svg width="100" height="100" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
2
- <path d="M85.2843 88.0301C90.1329 91.6664 97.4057 89.2422 90.7389 82.5755C70.7389 63.1816 74.9813 9.84827 50.1329 9.84827C25.2843 9.84827 29.5267 63.1816 9.52673 82.5755C2.25402 89.8483 10.1328 91.6664 14.9813 88.0301C33.7692 75.3028 32.5571 52.8786 50.1329 52.8786C67.7086 52.8786 66.4965 75.3028 85.2843 88.0301Z" fill="currentColor"/>
3
- </svg>
1
+ <svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Antigravity</title><path d="M21.751 22.607c1.34 1.005 3.35.335 1.508-1.508C17.73 15.74 18.904 1 12.037 1 5.17 1 6.342 15.74.815 21.1c-2.01 2.009.167 2.511 1.507 1.506 5.192-3.517 4.857-9.714 9.715-9.714 4.857 0 4.522 6.197 9.714 9.715z"></path></svg>
File without changes
File without changes
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Peter Steinberger
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ <svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Atlas Cloud</title><path d="M20.2,18.01L12,0.47,3.8,18.01l-2.58,5.52c1.62,-1.05,3.39,-1.86,5.26,-2.41,1.76,-0.51,3.61,-0.79,5.52,-0.79,0.98,0,1.95,0.08,2.9,0.22l-1.86,-4.3c-0.53,-0.1,-2.87,-0.1,-4.59,0.3l3.56,-8.28,5.52,12.85c0.01,0,0.02,0.01,0.03,0.01,1.86,0.55,3.62,1.36,5.23,2.4l-2.58,-5.52Z"></path></svg>
@@ -0,0 +1 @@
1
+ <svg fill="currentColor" fill-rule="evenodd" height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Atlas Cloud</title><path d="M20.2,18.01L12,0.47,3.8,18.01l-2.58,5.52c1.62,-1.05,3.39,-1.86,5.26,-2.41,1.76,-0.51,3.61,-0.79,5.52,-0.79,0.98,0,1.95,0.08,2.9,0.22l-1.86,-4.3c-0.53,-0.1,-2.87,-0.1,-4.59,0.3l3.56,-8.28,5.52,12.85c0.01,0,0.02,0.01,0.03,0.01,1.86,0.55,3.62,1.36,5.23,2.4l-2.58,-5.52Z"></path></svg>
@@ -0,0 +1,49 @@
1
+ // Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
2
+ globalThis.__usagestat_bundled_options = {"labels":["Balance","Balance","Additional"],"defaults":{},"autoMode":"api"};
3
+ defineProvider({
4
+ id: "atlascloud",
5
+ name: "Atlas Cloud",
6
+ endpoints: ["https://api.atlascloud.ai"],
7
+ auth: { type: "bearer", secret: "ATLASCLOUD_API_KEY" },
8
+ settings: [{ key: "ATLASCLOUD_API_KEY", title: "Atlas Cloud API key", type: "secure" }],
9
+ capabilities: ["http-status"],
10
+ async fetchUsage(ctx) {
11
+ const response = await ctx.http.get("https://api.atlascloud.ai/public/v1/balance");
12
+ const message = `Atlas Cloud returned HTTP ${response.status}.`;
13
+ if (response.status === 401) throw ctx.fail.authenticationExpired(message);
14
+ if (response.status === 403) throw ctx.fail.permissionDenied(message);
15
+ if (response.status === 429) {
16
+ const delay = Number(response.headers["retry-after"] ?? 1);
17
+ throw ctx.fail.rateLimited(message, {
18
+ retryAfterSeconds: Number.isFinite(delay) && delay >= 0 ? Math.min(delay, 10) : 1,
19
+ });
20
+ }
21
+ if (response.status >= 500) throw ctx.fail.providerUnavailable(message);
22
+ if (response.status !== 200) throw ctx.fail.apiFailure(message);
23
+ function fail() {
24
+ throw ctx.fail.parseFailure("Atlas Cloud returned an unrecognized USD account balance.");
25
+ }
26
+ let data;
27
+ try {
28
+ data = JSON.parse(response.bodyText);
29
+ } catch {
30
+ return fail();
31
+ }
32
+ const value = data?.available?.value;
33
+ if (
34
+ data?.object !== "balance" ||
35
+ data.scope !== "account" ||
36
+ data.available?.currency !== "usd" ||
37
+ typeof value !== "string" ||
38
+ !/^-?\d+(?:\.\d+)?$/.test(value)
39
+ )
40
+ return fail();
41
+ const balance = Number(value);
42
+ if (!Number.isFinite(balance)) return fail();
43
+ return {
44
+ details: [{ title: "Account balance", rows: [{ label: "Available balance", value: ctx.format.usd(balance) }] }],
45
+ identity: { loginMethod: "API" },
46
+ dataConfidence: "exact",
47
+ };
48
+ },
49
+ });
@@ -0,0 +1,23 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "atlascloud",
4
+ "name": "Atlas Cloud",
5
+ "version": "0.1.0",
6
+ "entry": "plugin.js",
7
+ "enabledByDefault": false,
8
+ "supportedModes": [
9
+ "api"
10
+ ],
11
+ "autoMode": "api",
12
+ "usageDashboardUrl": "https://www.atlascloud.ai/console",
13
+ "envVars": [
14
+ "ATLASCLOUD_API_KEY"
15
+ ],
16
+ "upstream": {
17
+ "repository": "https://github.com/steipete/CodexBar",
18
+ "revision": "78ba5a1e65e6859da59a21b799df95ab91bc0b89",
19
+ "path": "Sources/CodexBarCore/Resources/Plugins/atlascloud.js",
20
+ "sha256": "852fb78abaf4fcdbbfbfeac0b60d6b82a9ca9b1d1d2f9014f6e5299b41ac47fa",
21
+ "license": "MIT"
22
+ }
23
+ }
@@ -0,0 +1,14 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
2
+ <g transform="translate(25 0) scale(8.25)" fill="currentColor" stroke="currentColor">
3
+ <path
4
+ d="M8.64,47.51c-.91,0-1.68-.16-2.3-.47-.62-.31-1.09-.79-1.41-1.41-.32-.63-.48-1.39-.48-2.29v-9.27c0-1.14-.23-1.97-.68-2.49-.46-.52-1.27-.79-2.43-.82-.36,0-.65-.14-.87-.41-.22-.27-.33-.59-.33-.94,0-.38.11-.69.33-.94.22-.25.51-.38.87-.41,1.16-.03,1.97-.3,2.43-.82.46-.52.68-1.34.68-2.45v-9.27c0-1.36.36-2.4,1.08-3.1.72-.71,1.76-1.06,3.12-1.06h11.08c.42,0,.76.12,1.04.37.28.25.42.56.42.94,0,.36-.12.66-.35.92-.23.26-.55.39-.94.39h-10.29c-.58,0-1.03.15-1.33.45-.3.3-.46.76-.46,1.39v9.32c0,.82-.17,1.56-.5,2.22-.33.67-.78,1.19-1.33,1.58-.55.38-1.2.57-1.95.57v-.16c.75,0,1.4.19,1.95.57.55.38,1,.91,1.33,1.58.33.67.5,1.41.5,2.23v9.36c0,.63.15,1.09.46,1.39.3.3.75.45,1.33.45h10.29c.39,0,.7.13.94.39.24.26.35.57.35.92s-.14.66-.42.92c-.28.26-.62.39-1.04.39h-11.08Z" />
5
+ <path
6
+ d="M35.79,47.51c-.42,0-.76-.13-1.04-.39-.28-.26-.42-.57-.42-.92s.12-.66.35-.92c.23-.26.55-.39.94-.39h10.29c.58,0,1.03-.15,1.33-.45.3-.3.46-.76.46-1.39v-9.36c0-.82.17-1.56.5-2.22.33-.67.77-1.19,1.33-1.58.55-.38,1.2-.57,1.95-.57v.16c-.75,0-1.4-.19-1.95-.57-.55-.38-1-.91-1.33-1.58-.33-.67-.5-1.41-.5-2.23v-9.32c0-.63-.15-1.09-.46-1.39-.3-.3-.75-.45-1.33-.45h-10.29c-.39,0-.7-.13-.94-.39-.23-.26-.35-.56-.35-.92,0-.38.14-.69.42-.94.28-.25.62-.37,1.04-.37h11.08c1.36,0,2.39.36,3.11,1.06.72.71,1.08,1.74,1.08,3.1v9.27c0,1.12.23,1.94.68,2.45.46.52,1.27.79,2.43.82.36.03.65.16.87.41.22.25.33.56.33.94,0,.36-.11.67-.33.94-.22.27-.51.41-.87.41-1.16.03-1.97.3-2.43.82-.46.52-.68,1.35-.68,2.49v9.27c0,.9-.16,1.66-.48,2.29-.32.63-.79,1.1-1.41,1.41-.62.31-1.39.47-2.31.47h-11.08Z" />
7
+ <path
8
+ d="M38.64,32.95c2.02,0,3.65-1.61,3.65-3.59s-1.64-3.59-3.65-3.59-3.65,1.61-3.65,3.59,1.64,3.59,3.65,3.59Z" />
9
+ <path
10
+ d="M18.18,32.95c2.02,0,3.65-1.61,3.65-3.59s-1.64-3.59-3.65-3.59-3.65,1.61-3.65,3.59,1.64,3.59,3.65,3.59Z" />
11
+ <path
12
+ d="M26.51.95l-.28,7.34c0,.41-.4.62-1.19.62s-1.18-.21-1.18-.62c-.07-1.83-.13-3.25-.17-4.26-.02-1.03-.05-1.76-.07-2.2-.02-.43-.04-.7-.04-.79v-.14c0-.53.49-.79,1.46-.79s1.46.28,1.46.82ZM32.44.95l-.28,7.34c0,.41-.4.62-1.19.62s-1.19-.21-1.19-.62c-.07-1.83-.13-3.25-.17-4.26-.02-1.03-.05-1.76-.07-2.2-.02-.43-.04-.7-.04-.79v-.14c0-.53.49-.79,1.46-.79s1.46.28,1.46.82Z" />
13
+ </g>
14
+ </svg>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Peter Steinberger
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,361 @@
1
+ // Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
2
+ globalThis.__usagestat_bundled_options = {"labels":["Budget","Secondary budget","Additional"],"defaults":{},"autoMode":"api"};
3
+ function _nullishCoalesce(lhs, rhsFn) {
4
+ if (lhs != null) {
5
+ return lhs;
6
+ } else {
7
+ return rhsFn();
8
+ }
9
+ }
10
+ function _optionalChain(ops) {
11
+ let lastAccessLHS = undefined;
12
+ let value = ops[0];
13
+ let i = 1;
14
+ while (i < ops.length) {
15
+ const op = ops[i];
16
+ const fn = ops[i + 1];
17
+ i += 2;
18
+ if ((op === "optionalAccess" || op === "optionalCall") && value == null) {
19
+ return undefined;
20
+ }
21
+ if (op === "access" || op === "optionalAccess") {
22
+ lastAccessLHS = value;
23
+ value = fn(value);
24
+ } else if (op === "call" || op === "optionalCall") {
25
+ value = fn((...args) => value.call(lastAccessLHS, ...args));
26
+ lastAccessLHS = undefined;
27
+ }
28
+ }
29
+ return value;
30
+ }
31
+ defineProvider({
32
+ id: "bifrost",
33
+ name: "Bifrost",
34
+ endpoints: [{ setting: "BIFROST_BASE_URL", policy: "https-or-private-network-http" }],
35
+ auth: { type: "header", header: "x-bf-vk", secret: "BIFROST_API_KEY" },
36
+ settings: [
37
+ { key: "BIFROST_API_KEY", title: "Virtual key", type: "secure" },
38
+ { key: "BIFROST_BASE_URL", title: "Base URL", type: "plain" },
39
+ ],
40
+ capabilities: ["http-status"],
41
+ async fetchUsage(ctx) {
42
+ const fail = (message) => {
43
+ throw ctx.fail.parseFailure(`Bifrost: ${message}`);
44
+ };
45
+ const object = (value) => {
46
+ if (!value || typeof value !== "object" || Array.isArray(value)) return fail("expected an object");
47
+ return value;
48
+ };
49
+ const array = (value) => {
50
+ if (value == null) return [];
51
+ if (!Array.isArray(value)) return fail("expected an array");
52
+ return value.map(object);
53
+ };
54
+ const text = (value) => {
55
+ if (value == null) return undefined;
56
+ if (typeof value !== "string") return fail("invalid string");
57
+ return value.trim() || undefined;
58
+ };
59
+ const number = (value) => {
60
+ if (value == null) return undefined;
61
+ if (typeof value !== "number" || !Number.isFinite(value)) return fail("invalid number");
62
+ return value;
63
+ };
64
+ const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
65
+ const bounded = (value) => Array.from(value).slice(0, 120).join("");
66
+ const labels = {
67
+ "1h": "Hourly",
68
+ "1d": "Daily",
69
+ "1w": "Weekly",
70
+ "1M": "Monthly",
71
+ "1Q": "Quarterly",
72
+ "1Y": "Yearly",
73
+ };
74
+ const units = {
75
+ Y: 31536000,
76
+ Q: 7776000,
77
+ M: 2592000,
78
+ w: 604800,
79
+ d: 86400,
80
+ h: 3600,
81
+ m: 60,
82
+ s: 1,
83
+ ms: 0.001,
84
+ us: 0.000001,
85
+ µs: 0.000001,
86
+ μs: 0.000001,
87
+ ns: 0.000000001,
88
+ };
89
+ const duration = (raw) => {
90
+ if (!raw) return undefined;
91
+ const extended = raw.match(/^(\d+(?:\.\d+)?)([dwMQY])$/u);
92
+ const parts = raw.match(/(?:\d+(?:\.\d*)?|\.\d+)(?:ns|us|µs|μs|ms|s|m|h)/gu);
93
+ let seconds;
94
+ if (extended) seconds = Number(extended[1]) * units[extended[2]];
95
+ else if (parts && parts.join("") === raw) {
96
+ seconds = parts.reduce((sum, part) => {
97
+ const match = part.match(/^([\d.]+)(.+)$/u);
98
+ return sum + Number(match[1]) * units[match[2]];
99
+ }, 0);
100
+ }
101
+ return seconds !== undefined && Number.isFinite(seconds) && seconds > 0 ? seconds : undefined;
102
+ };
103
+ const timing = (reset, lastReset) => {
104
+ const raw = text(reset),
105
+ seconds = duration(raw),
106
+ last = text(lastReset);
107
+ // The quota endpoint omits the owner's calendar-alignment policy. Do not invent calendar resets.
108
+ const fixed = raw !== undefined && !/[dwMQY]$/u.test(raw);
109
+ let resetsAt;
110
+ if (fixed && last && seconds) {
111
+ const start = new Date(last).getTime(),
112
+ period = seconds * 1000;
113
+ const next = new Date(
114
+ start + (Math.max(0, Math.floor((ctx.date.now().getTime() - start) / period)) + 1) * period,
115
+ );
116
+ if (Number.isFinite(next.getTime())) resetsAt = next;
117
+ }
118
+ const minutes = seconds === undefined ? 0 : Math.floor(seconds / 60);
119
+ return {
120
+ seconds,
121
+ resetsAt,
122
+ label: raw && Object.hasOwn(labels, raw) ? labels[raw] : undefined,
123
+ windowMinutes: fixed && Number.isSafeInteger(minutes) && minutes > 0 ? minutes : undefined,
124
+ };
125
+ };
126
+ const rawBase = ctx.settings.get("BIFROST_BASE_URL") || "";
127
+ const [base, suffix = ""] = rawBase.split(/(?=[?#])/u, 2);
128
+ let response;
129
+ try {
130
+ response = await ctx.http.get(`${base.replace(/\/+$/u, "")}/api/governance/virtual-keys/quota${suffix}`);
131
+ } catch (error) {
132
+ if (error.transportClass === "cancelled") throw error;
133
+ throw ctx.fail.networkFailure("Bifrost quota request could not reach the configured gateway.");
134
+ }
135
+ const message = `Bifrost quota request failed (HTTP ${response.status}).`;
136
+ if (response.status === 401) throw ctx.fail.authenticationExpired("Bifrost rejected the virtual key.");
137
+ if (response.status === 403) throw ctx.fail.permissionDenied("Bifrost denied access to this virtual key's quota.");
138
+ if (response.status === 429) throw ctx.fail.rateLimited(message);
139
+ if (response.status >= 500) throw ctx.fail.providerUnavailable(message);
140
+ if (response.status < 200 || response.status >= 300) throw ctx.fail.apiFailure(message);
141
+ let decoded;
142
+ try {
143
+ decoded = JSON.parse(response.bodyText);
144
+ } catch (error) {
145
+ void error;
146
+ return fail("invalid quota JSON");
147
+ }
148
+ const root = object(decoded);
149
+ if (root.is_active != null && typeof root.is_active !== "boolean") return fail("invalid key activity");
150
+ const scopes = [
151
+ { id: "", body: root },
152
+ ...array(root.provider_configs).map((body, index) => ({
153
+ id: `provider-${index}-`,
154
+ title: `Provider ${text(body.provider) || index + 1}`,
155
+ body,
156
+ })),
157
+ ...array(root.model_configs).map((body, index) => ({
158
+ id: `model-${index}-`,
159
+ title: `Model ${[text(body.provider), text(body.model_name) || index + 1].filter(Boolean).join(" · ")}`,
160
+ body,
161
+ })),
162
+ ];
163
+ const budgets = scopes
164
+ .flatMap((scope) =>
165
+ array(scope.body.budgets).flatMap((budget) => {
166
+ const id = text(budget.id);
167
+ if (!id) return [];
168
+ const amount = _nullishCoalesce(number(budget.override_amount), () => 0),
169
+ mode = text(budget.override_mode);
170
+ const cycles = _nullishCoalesce(number(budget.override_cycles_remaining), () => 0);
171
+ if (!Number.isInteger(cycles)) return fail("invalid override cycles");
172
+ const active = amount > 0 && (mode === "forever" || (mode === "cycles" && cycles > 0));
173
+ const limit = _nullishCoalesce(number(budget.max_limit), () => 0) + (active ? amount : 0);
174
+ if (!Number.isFinite(limit)) return fail("invalid effective budget");
175
+ return [
176
+ {
177
+ id,
178
+ scope,
179
+ source: text(budget.source_name),
180
+ limit,
181
+ used: _nullishCoalesce(number(budget.current_usage), () => 0),
182
+ timing: timing(budget.reset_duration, budget.last_reset),
183
+ models: array(budget.per_model_usage),
184
+ },
185
+ ];
186
+ }),
187
+ )
188
+ .sort(
189
+ (a, b) =>
190
+ _nullishCoalesce(a.timing.seconds, () => Infinity) - _nullishCoalesce(b.timing.seconds, () => Infinity) ||
191
+ compare(a.id, b.id),
192
+ );
193
+ const limits = scopes.flatMap((scope) => {
194
+ const components = array(scope.body.rate_limits);
195
+ // rate_limit is a compatibility merge of these components, not another pool.
196
+ const selected = components.length
197
+ ? components
198
+ : scope.body.rate_limit == null
199
+ ? []
200
+ : [object(scope.body.rate_limit)];
201
+ return selected.map((limit, index) => ({ scope, limit, index }));
202
+ });
203
+ if (root.is_active === false && !budgets.length && !limits.length) {
204
+ throw ctx.fail.permissionDenied("Bifrost virtual key is inactive and has no budgets or rate limits to display.");
205
+ }
206
+ const allWindows = budgets
207
+ .filter((budget) => budget.limit > 0)
208
+ .map((budget) => ({
209
+ id: `bifrost-${budget.scope.id}budget-${budget.id}`,
210
+ scope: budget.scope,
211
+ title: bounded([budget.scope.title, budget.source || "Budget"].filter(Boolean).join(" · ")),
212
+ window: {
213
+ usedPercent: ctx.pct(budget.used, budget.limit),
214
+ windowMinutes: budget.timing.windowMinutes,
215
+ resetsAt: budget.timing.resetsAt,
216
+ resetDescription: [
217
+ _optionalChain([
218
+ budget,
219
+ "access",
220
+ (_) => _.source,
221
+ "optionalAccess",
222
+ (_2) => _2.slice,
223
+ "call",
224
+ (_3) => _3(0, 24),
225
+ ]),
226
+ budget.timing.label,
227
+ `${ctx.format.usd(budget.used)} / ${ctx.format.usd(budget.limit)}`,
228
+ ]
229
+ .filter(Boolean)
230
+ .join(" · "),
231
+ },
232
+ }));
233
+ const windows = allWindows.filter((window) => !window.scope.id);
234
+ const extraWindows = [...windows.slice(2), ...allWindows.filter((window) => window.scope.id)].map(
235
+ ({ id, title, window }) => ({ id, title, window }),
236
+ );
237
+ limits.forEach(({ scope, limit, index }) => {
238
+ const source = text(limit.source_name);
239
+ for (const [key, title] of [
240
+ ["token", "Tokens"],
241
+ ["request", "Requests"],
242
+ ]) {
243
+ const max = number(limit[`${key}_max_limit`]),
244
+ used = _nullishCoalesce(number(limit[`${key}_current_usage`]), () => 0);
245
+ const reset = text(limit[`${key}_reset_duration`]),
246
+ known = max !== undefined && max > 0;
247
+ // Last-reset timestamps are serialized even for unconfigured dimensions.
248
+ if (!known && !reset) continue;
249
+ const time = timing(reset, limit[`${key}_last_reset`]);
250
+ extraWindows.push({
251
+ id: `bifrost-${scope.id}${key}s-${index}`,
252
+ title: bounded([scope.title, source, title].filter(Boolean).join(" ")),
253
+ usageKnown: known,
254
+ window: {
255
+ usedPercent: known ? ctx.pct(used, max) : 0,
256
+ windowMinutes: time.windowMinutes,
257
+ resetsAt: time.resetsAt,
258
+ resetDescription: time.label,
259
+ },
260
+ });
261
+ }
262
+ });
263
+ if (root.is_active === false) {
264
+ extraWindows.unshift({ id: "bifrost-key-inactive", title: "Key inactive", usageKnown: false, usedPercent: 0 });
265
+ }
266
+ const first = budgets.find((budget) => !budget.scope.id),
267
+ details = [];
268
+ const modelName = (raw) =>
269
+ raw
270
+ .replace(/^(us-gov|us|eu|apac|global)\./iu, "")
271
+ .replace(
272
+ /^(ai21|amazon|anthropic|cohere|deepseek|luma|meta|mistral|openai|qwen|stability|twelvelabs|writer)\./iu,
273
+ "",
274
+ )
275
+ .replace(/-v\d+:\d+$/u, "")
276
+ .replace(/(?:-|\s)(?:\d{8}|\d{4}-\d{2}-\d{2})$/u, "")
277
+ .replace(/[ \t-]+$/u, "") || raw;
278
+ const tokenCount = (value) => {
279
+ const magnitude = Math.abs(value),
280
+ sign = value < 0 ? "-" : "";
281
+ for (const [threshold, divisor, unit] of [
282
+ [999500000, 1e9, "B"],
283
+ [999500, 1e6, "M"],
284
+ [1000, 1000, "K"],
285
+ ]) {
286
+ if (magnitude >= threshold) {
287
+ const scaled = magnitude / divisor;
288
+ return sign + scaled.toFixed(scaled >= 10 ? 0 : 1).replace(/\.0$/u, "") + unit;
289
+ }
290
+ }
291
+ return String(value);
292
+ };
293
+ const models = (_optionalChain([first, "optionalAccess", (_4) => _4.models]) || [])
294
+ .map((model) => {
295
+ const tokens = number(model.total_tokens);
296
+ number(model.total_requests);
297
+ return {
298
+ raw: text(model.model) || "Model",
299
+ provider: text(model.provider),
300
+ cost: number(model.total_cost),
301
+ tokens: tokens !== undefined && Math.abs(tokens) < 9223372036854775808 ? Math.trunc(tokens) : undefined,
302
+ };
303
+ })
304
+ .filter((model) => (model.cost || 0) !== 0 || (model.tokens || 0) !== 0)
305
+ .sort((a, b) => (b.cost || 0) - (a.cost || 0) || (b.tokens || 0) - (a.tokens || 0) || compare(a.raw, b.raw));
306
+ if (models.length) {
307
+ const visible = models.slice(0, 5),
308
+ names = visible.map((model) => modelName(model.raw));
309
+ const mixed = new Set(visible.map((model) => model.provider).filter(Boolean)).size > 1;
310
+ const rows = visible.map((model, index) => ({
311
+ label: bounded(
312
+ [
313
+ mixed ? model.provider : undefined,
314
+ names.indexOf(names[index]) !== names.lastIndexOf(names[index]) ? model.raw : names[index],
315
+ ]
316
+ .filter(Boolean)
317
+ .join(" · "),
318
+ ),
319
+ value: model.cost === undefined ? "—" : ctx.format.usd(model.cost),
320
+ usageValue: model.cost,
321
+ secondaryValue: model.tokens === undefined ? undefined : `${tokenCount(model.tokens)} tokens`,
322
+ }));
323
+ if (models.length > 5) rows.push({ label: "Other models", value: String(models.length - 5) });
324
+ details.push({ title: "Models", rows });
325
+ }
326
+ if (budgets.length > 1 || budgets.some((budget) => budget.scope.id))
327
+ details.push({
328
+ title: "Budgets",
329
+ rows: budgets.slice(0, 24).map((budget) => ({
330
+ label: bounded([budget.scope.title, budget.source || `Budget ${budget.id}`].filter(Boolean).join(" · ")),
331
+ value:
332
+ budget.limit > 0
333
+ ? `${ctx.format.usd(budget.used)} / ${ctx.format.usd(budget.limit)}`
334
+ : ctx.format.usd(budget.used),
335
+ secondaryValue: budget.timing.label,
336
+ usageValue: budget.used,
337
+ progress: budget.limit > 0 ? ctx.pct(budget.used, budget.limit) / 100 : undefined,
338
+ })),
339
+ });
340
+ return {
341
+ primary: _optionalChain([windows, "access", (_5) => _5[0], "optionalAccess", (_6) => _6.window]),
342
+ secondary: _optionalChain([windows, "access", (_7) => _7[1], "optionalAccess", (_8) => _8.window]),
343
+ extraWindows,
344
+ details,
345
+ cost: first
346
+ ? {
347
+ used: first.used,
348
+ limit: Math.max(0, first.limit),
349
+ currency: "USD",
350
+ period: first.timing.label || (first.limit > 0 ? "Budget" : "Spend"),
351
+ resetsAt: first.timing.resetsAt,
352
+ }
353
+ : undefined,
354
+ identity: {
355
+ email: text(root.virtual_key_name),
356
+ organization: _optionalChain([first, "optionalAccess", (_9) => _9.source]),
357
+ loginMethod: "api",
358
+ },
359
+ };
360
+ },
361
+ });
@@ -0,0 +1,23 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "bifrost",
4
+ "name": "Bifrost",
5
+ "version": "0.1.0",
6
+ "entry": "plugin.js",
7
+ "enabledByDefault": false,
8
+ "supportedModes": [
9
+ "api"
10
+ ],
11
+ "autoMode": "api",
12
+ "envVars": [
13
+ "BIFROST_API_KEY",
14
+ "BIFROST_BASE_URL"
15
+ ],
16
+ "upstream": {
17
+ "repository": "https://github.com/steipete/CodexBar",
18
+ "revision": "78ba5a1e65e6859da59a21b799df95ab91bc0b89",
19
+ "path": "Sources/CodexBarCore/Resources/Plugins/bifrost.js",
20
+ "sha256": "b7576d59ccd077c812118cf09d282042589a80df470c621e414583050f03aa07",
21
+ "license": "MIT"
22
+ }
23
+ }
File without changes
File without changes
File without changes
File without changes
File without changes