@hashimkarim/usagestat-linux-x64-gnu 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/native-manifest.json +743 -119
  2. package/package.json +106 -2
  3. package/plugins/abliteration/LICENSE +21 -0
  4. package/plugins/abliteration/icon.svg +5 -0
  5. package/plugins/abliteration/plugin.js +89 -0
  6. package/plugins/abliteration/plugin.json +24 -0
  7. package/plugins/aerostack/LICENSE +21 -0
  8. package/plugins/aerostack/icon.svg +1 -0
  9. package/plugins/aerostack/plugin.js +94 -0
  10. package/plugins/aerostack/plugin.json +24 -0
  11. package/plugins/aixy/icon.svg +1 -0
  12. package/plugins/aixy/plugin.js +5 -0
  13. package/plugins/aixy/plugin.json +9 -1
  14. package/plugins/antigravity/plugin.js +20 -11
  15. package/plugins/antigravity-cli/plugin.js +9 -4
  16. package/plugins/antigravity-ide/plugin.js +8 -5
  17. package/plugins/atlascloud/plugin.js +5 -0
  18. package/plugins/atlascloud/plugin.json +2 -1
  19. package/plugins/bifrost/icon.svg +3 -0
  20. package/plugins/bifrost/plugin.js +5 -0
  21. package/plugins/bifrost/plugin.json +9 -1
  22. package/plugins/chatbox/LICENSE +21 -0
  23. package/plugins/chatbox/icon.svg +4 -0
  24. package/plugins/chatbox/plugin.js +208 -0
  25. package/plugins/chatbox/plugin.json +24 -0
  26. package/plugins/claude/plugin.js +39 -2
  27. package/plugins/claudeplatform/LICENSE +21 -0
  28. package/plugins/claudeplatform/icon.svg +3 -0
  29. package/plugins/claudeplatform/plugin.js +244 -0
  30. package/plugins/claudeplatform/plugin.json +25 -0
  31. package/plugins/codex/plugin.js +3 -2
  32. package/plugins/codex/plugin.json +1 -1
  33. package/plugins/cosmic/LICENSE +21 -0
  34. package/plugins/cosmic/icon.svg +1 -0
  35. package/plugins/cosmic/plugin.js +134 -0
  36. package/plugins/cosmic/plugin.json +32 -0
  37. package/plugins/cursor/plugin.js +33 -8
  38. package/plugins/cursor-nightly/plugin.json +1 -1
  39. package/plugins/devpass/icon.svg +3 -0
  40. package/plugins/devpass/plugin.js +5 -0
  41. package/plugins/devpass/plugin.json +2 -1
  42. package/plugins/exa/LICENSE +21 -0
  43. package/plugins/exa/icon-color.svg +1 -0
  44. package/plugins/exa/icon.svg +1 -0
  45. package/plugins/exa/plugin.js +75 -0
  46. package/plugins/exa/plugin.json +32 -0
  47. package/plugins/fal/LICENSE +21 -0
  48. package/plugins/fal/icon-color.svg +1 -0
  49. package/plugins/fal/icon.svg +1 -0
  50. package/plugins/fal/plugin.js +74 -0
  51. package/plugins/fal/plugin.json +24 -0
  52. package/plugins/flora/LICENSE +21 -0
  53. package/plugins/flora/icon.svg +4 -0
  54. package/plugins/flora/plugin.js +93 -0
  55. package/plugins/flora/plugin.json +32 -0
  56. package/plugins/futureagi/LICENSE +21 -0
  57. package/plugins/futureagi/icon.svg +24 -0
  58. package/plugins/futureagi/plugin.js +139 -0
  59. package/plugins/futureagi/plugin.json +32 -0
  60. package/plugins/gemini-apps/LICENSE +1 -2
  61. package/plugins/gemini-apps/plugin.js +136 -465
  62. package/plugins/gemini-apps/plugin.json +13 -7
  63. package/plugins/gitkraken/icon.svg +2 -0
  64. package/plugins/gitkraken/plugin.js +5 -0
  65. package/plugins/gitkraken/plugin.json +9 -1
  66. package/plugins/helmcode/icon.svg +5 -0
  67. package/plugins/helmcode/plugin.js +49 -41
  68. package/plugins/helmcode/plugin.json +10 -2
  69. package/plugins/huggingface/plugin.js +6 -1
  70. package/plugins/huggingface/plugin.json +4 -3
  71. package/plugins/hyper/plugin.js +53 -47
  72. package/plugins/hyper/plugin.json +3 -2
  73. package/plugins/kimi/plugin.js +39 -14
  74. package/plugins/langdock/LICENSE +21 -0
  75. package/plugins/langdock/icon.svg +4 -0
  76. package/plugins/langdock/plugin.js +106 -0
  77. package/plugins/langdock/plugin.json +25 -0
  78. package/plugins/linkup/LICENSE +21 -0
  79. package/plugins/linkup/icon.svg +10 -0
  80. package/plugins/linkup/plugin.js +46 -0
  81. package/plugins/linkup/plugin.json +24 -0
  82. package/plugins/lithosai/LICENSE +21 -0
  83. package/plugins/lithosai/icon.svg +1 -0
  84. package/plugins/lithosai/plugin.js +130 -0
  85. package/plugins/lithosai/plugin.json +26 -0
  86. package/plugins/llmman/icon.svg +4 -0
  87. package/plugins/llmman/plugin.js +5 -0
  88. package/plugins/llmman/plugin.json +9 -1
  89. package/plugins/munito/LICENSE +21 -0
  90. package/plugins/munito/icon.svg +7 -0
  91. package/plugins/munito/plugin.js +171 -0
  92. package/plugins/munito/plugin.json +24 -0
  93. package/plugins/muse/icon.svg +3 -0
  94. package/plugins/muse/plugin.js +98 -129
  95. package/plugins/muse/plugin.json +10 -2
  96. package/plugins/museai/LICENSE +21 -0
  97. package/plugins/museai/icon.svg +3 -0
  98. package/plugins/museai/plugin.js +159 -0
  99. package/plugins/museai/plugin.json +26 -0
  100. package/plugins/nous/plugin.js +5 -0
  101. package/plugins/nous/plugin.json +9 -1
  102. package/plugins/ollama/plugin.js +58 -0
  103. package/plugins/opencode-go/plugin.js +72 -24
  104. package/plugins/parallel/LICENSE +21 -0
  105. package/plugins/parallel/icon.svg +11 -0
  106. package/plugins/parallel/plugin.js +97 -0
  107. package/plugins/parallel/plugin.json +25 -0
  108. package/plugins/qwencloud/LICENSE +21 -0
  109. package/plugins/qwencloud/plugin.js +197 -0
  110. package/plugins/qwencloud/plugin.json +17 -0
  111. package/plugins/raycast/icon.svg +4 -0
  112. package/plugins/raycast/plugin.js +5 -0
  113. package/plugins/raycast/plugin.json +9 -1
  114. package/plugins/replicate/plugin.js +5 -0
  115. package/plugins/replicate/plugin.json +2 -1
  116. package/plugins/sailresearch/LICENSE +21 -0
  117. package/plugins/sailresearch/icon.svg +4 -0
  118. package/plugins/sailresearch/plugin.js +104 -0
  119. package/plugins/sailresearch/plugin.json +24 -0
  120. package/plugins/sofya/LICENSE +21 -0
  121. package/plugins/sofya/icon.svg +3 -0
  122. package/plugins/sofya/plugin.js +86 -0
  123. package/plugins/sofya/plugin.json +24 -0
  124. package/plugins/soniox/LICENSE +21 -0
  125. package/plugins/soniox/icon.svg +3 -0
  126. package/plugins/soniox/plugin.js +103 -0
  127. package/plugins/soniox/plugin.json +24 -0
  128. package/plugins/tavily/LICENSE +21 -0
  129. package/plugins/tavily/icon.svg +3 -0
  130. package/plugins/tavily/plugin.js +61 -0
  131. package/plugins/tavily/plugin.json +24 -0
  132. package/plugins/tinyapi/LICENSE +21 -0
  133. package/plugins/tinyapi/icon.svg +4 -0
  134. package/plugins/tinyapi/plugin.js +73 -0
  135. package/plugins/tinyapi/plugin.json +25 -0
  136. package/plugins/traecn/LICENSE +21 -0
  137. package/plugins/traecn/icon.svg +3 -0
  138. package/plugins/traecn/plugin.js +104 -0
  139. package/plugins/traecn/plugin.json +25 -0
  140. package/plugins/typesafe/icon.svg +4 -0
  141. package/plugins/typesafe/plugin.js +30 -25
  142. package/plugins/typesafe/plugin.json +3 -2
  143. package/plugins/v0/plugin.js +5 -0
  144. package/plugins/v0/plugin.json +9 -1
  145. package/plugins/vercel/plugin.js +147 -0
  146. package/plugins/vercel/plugin.json +34 -3
  147. package/plugins/workbuddy/LICENSE +21 -0
  148. package/plugins/workbuddy/icon.svg +1 -0
  149. package/plugins/workbuddy/plugin.js +232 -0
  150. package/plugins/workbuddy/plugin.json +51 -0
  151. package/plugins/xai/plugin.js +9 -0
  152. package/plugins/xapi/LICENSE +21 -0
  153. package/plugins/xapi/icon.svg +1 -0
  154. package/plugins/xapi/plugin.js +90 -0
  155. package/plugins/xapi/plugin.json +25 -0
  156. package/plugins/xkiro/icon.svg +1 -0
  157. package/plugins/xkiro/plugin.js +5 -0
  158. package/plugins/xkiro/plugin.json +2 -1
  159. package/usagestat +0 -0
  160. package/usagestatd +0 -0
  161. package/plugins/cursor-nightly/plugin.js +0 -1416
@@ -0,0 +1,75 @@
1
+ // Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
2
+ globalThis.__usagestat_bundled_options = {"labels":["Usage","Additional","Additional"],"defaults":{},"autoMode":"api"};
3
+ (function(defineProvider) {
4
+ // BEGIN UPSTREAM Sources/CodexBarCore/Resources/Plugins/exa.js
5
+ defineProvider({
6
+ id: "exa",
7
+ name: "Exa",
8
+ endpoints: ["https://admin-api.exa.ai"],
9
+ auth: { type: "x-api-key", secret: "EXA_SERVICE_KEY" },
10
+ settings: [
11
+ { key: "EXA_SERVICE_KEY", title: "Exa service key", type: "secure" },
12
+ { key: "EXA_API_KEY_ID", title: "API key ID", type: "plain" },
13
+ ],
14
+ capabilities: ["http-status"],
15
+ async fetchUsage(ctx) {
16
+ const id = ctx.settings.get("EXA_API_KEY_ID");
17
+ if (!id || id === "." || id === "..") {
18
+ throw ctx.fail.missingCredential(
19
+ "Set the Exa API key ID in Scope or EXA_API_KEY_ID; this is not the service key.",
20
+ );
21
+ }
22
+ const end = new Date(Math.floor(ctx.date.now().getTime() / 1000) * 1000);
23
+ const start = new Date(Date.UTC(end.getUTCFullYear(), end.getUTCMonth(), 1));
24
+ const url =
25
+ `https://admin-api.exa.ai/team-management/api-keys/${encodeURIComponent(id)}/usage` +
26
+ `?start_date=${encodeURIComponent(start.toISOString())}&end_date=${encodeURIComponent(end.toISOString())}`;
27
+ const response = await ctx.http.get(url);
28
+ const message = `Exa returned HTTP ${response.status}.`;
29
+ if (response.status === 401) {
30
+ throw ctx.fail.authenticationExpired("Exa rejected the service key. Ordinary search API keys are not supported.");
31
+ }
32
+ if (response.status === 403) {
33
+ throw ctx.fail.permissionDenied(
34
+ "Exa Team Management must be enabled and both keys must belong to the same team.",
35
+ );
36
+ }
37
+ if (response.status === 429) throw ctx.fail.rateLimited(message);
38
+ if (response.status >= 500) throw ctx.fail.providerUnavailable(message);
39
+ if (response.status !== 200) throw ctx.fail.apiFailure(message);
40
+ const fail = () => {
41
+ throw ctx.fail.parseFailure("Exa returned an unrecognized API key usage response.");
42
+ };
43
+ let data;
44
+ try {
45
+ data = JSON.parse(response.bodyText);
46
+ } catch {
47
+ return fail();
48
+ }
49
+ if (
50
+ !data ||
51
+ typeof data.total_cost_usd !== "number" ||
52
+ !Number.isFinite(data.total_cost_usd) ||
53
+ data.total_cost_usd < 0 ||
54
+ !data.period ||
55
+ typeof data.period.start !== "string" ||
56
+ typeof data.period.end !== "string" ||
57
+ Date.parse(data.period.start) !== start.getTime() ||
58
+ Date.parse(data.period.end) !== end.getTime()
59
+ )
60
+ return fail();
61
+ return {
62
+ details: [
63
+ {
64
+ title: "API key this month (UTC)",
65
+ rows: [{ label: "Spend", value: ctx.format.currency(data.total_cost_usd, "USD") }],
66
+ },
67
+ ],
68
+ identity: { loginMethod: "Service key" },
69
+ dataConfidence: "exact",
70
+ };
71
+ },
72
+ });
73
+
74
+ // END UPSTREAM
75
+ })(globalThis.defineProvider);
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "exa",
4
+ "name": "Exa",
5
+ "version": "0.1.0",
6
+ "entry": "plugin.js",
7
+ "enabledByDefault": false,
8
+ "supportedModes": [
9
+ "api"
10
+ ],
11
+ "autoMode": "api",
12
+ "usageDashboardUrl": "https://dashboard.exa.ai",
13
+ "envVars": [
14
+ "EXA_SERVICE_KEY",
15
+ "EXA_API_KEY_ID"
16
+ ],
17
+ "setupFields": [
18
+ {
19
+ "key": "EXA_API_KEY_ID",
20
+ "title": "API key ID",
21
+ "type": "string",
22
+ "description": "Provider-specific account or source selection."
23
+ }
24
+ ],
25
+ "upstream": {
26
+ "repository": "https://github.com/steipete/CodexBar",
27
+ "revision": "6070b29a1a5d51193a634dc1b0a14a67c39d0ccc",
28
+ "path": "Sources/CodexBarCore/Resources/Plugins/exa.js",
29
+ "sha256": "36d2cbf9973e160f2e0d2548ff1f9bbf254f94c9a09710004c0718749e5cdfbd",
30
+ "license": "MIT"
31
+ }
32
+ }
@@ -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 height="1em" style="flex:none;line-height:1" viewBox="0 0 24 24" width="1em" xmlns="http://www.w3.org/2000/svg"><title>Fal</title><path clip-rule="evenodd" d="M15.477 0c.415 0 .749.338.788.752a7.775 7.775 0 006.985 6.984c.413.04.752.373.752.788v6.952c0 .415-.338.748-.752.788a7.775 7.775 0 00-6.985 6.984c-.04.414-.373.752-.788.752H8.525c-.416 0-.749-.338-.789-.752a7.775 7.775 0 00-6.984-6.984c-.414-.04-.752-.373-.752-.788V8.524c0-.415.338-.748.752-.788A7.775 7.775 0 007.736.752C7.776.338 8.11 0 8.526 0h6.95zM4.819 11.98a7.226 7.226 0 007.223 7.23 7.226 7.226 0 007.223-7.23c0-3.994-3.234-7.23-7.223-7.23a7.227 7.227 0 00-7.223 7.23z" fill="#EC0648" fill-rule="evenodd"></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>Fal</title><path clip-rule="evenodd" d="M15.477 0c.415 0 .749.338.788.752a7.775 7.775 0 006.985 6.984c.413.04.752.373.752.788v6.952c0 .415-.338.748-.752.788a7.775 7.775 0 00-6.985 6.984c-.04.414-.373.752-.788.752H8.525c-.416 0-.749-.338-.789-.752a7.775 7.775 0 00-6.984-6.984c-.414-.04-.752-.373-.752-.788V8.524c0-.415.338-.748.752-.788A7.775 7.775 0 007.736.752C7.776.338 8.11 0 8.526 0h6.95zM4.819 11.98a7.226 7.226 0 007.223 7.23 7.226 7.226 0 007.223-7.23c0-3.994-3.234-7.23-7.223-7.23a7.227 7.227 0 00-7.223 7.23z"></path></svg>
@@ -0,0 +1,74 @@
1
+ // Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
2
+ globalThis.__usagestat_bundled_options = {"labels":["Balance","Additional","Additional"],"defaults":{},"autoMode":"api"};
3
+ (function(defineProvider) {
4
+ // BEGIN UPSTREAM Sources/CodexBarCore/Resources/Plugins/fal.js
5
+ defineProvider({
6
+ id: "fal",
7
+ name: "fal",
8
+ endpoints: ["https://api.fal.ai"],
9
+ auth: { type: "authorization-scheme", scheme: "Key", secret: "FAL_KEY" },
10
+ settings: [{ key: "FAL_KEY", title: "fal API key", type: "secure" }],
11
+ capabilities: ["http-status"],
12
+ async fetchUsage(ctx) {
13
+ const response = await ctx.http.get("https://api.fal.ai/v1/account/billing?expand=credits", {
14
+ retryPolicy: "transientIdempotent",
15
+ });
16
+ const message = `fal returned HTTP ${response.status}.`;
17
+ if (response.status === 401) throw ctx.fail.authenticationExpired(message);
18
+ if (response.status === 403) {
19
+ throw ctx.fail.permissionDenied(
20
+ "fal rejected the key: billing needs the billing:usage:read permission (BILLING, READONLY or FULL preset).",
21
+ );
22
+ }
23
+ if (response.status === 429) {
24
+ const delay = Number(response.headers["retry-after"] ?? 1);
25
+ throw ctx.fail.rateLimited(message, {
26
+ retryAfterSeconds: Number.isFinite(delay) && delay >= 0 ? Math.min(delay, 10) : 1,
27
+ });
28
+ }
29
+ if (response.status >= 500) throw ctx.fail.providerUnavailable(message);
30
+ if (response.status !== 200) throw ctx.fail.apiFailure(message);
31
+ let data;
32
+ try {
33
+ data = JSON.parse(response.bodyText);
34
+ } catch {
35
+ throw ctx.fail.parseFailure("fal returned a non-JSON billing response.");
36
+ }
37
+ if (!data || typeof data !== "object" || Array.isArray(data)) {
38
+ throw ctx.fail.parseFailure("fal returned an unrecognized billing response.");
39
+ }
40
+ const credits = data.credits;
41
+ if (!credits || typeof credits !== "object" || Array.isArray(credits)) {
42
+ // A successful response without credits cannot establish a balance.
43
+ throw ctx.fail.providerUnavailable("fal did not return the credit balance this time. Try Refresh in a moment.");
44
+ }
45
+ const raw = credits.current_balance;
46
+ const balance =
47
+ typeof raw === "string" && /^\s*-?\d+(?:\.\d+)?\s*$/.test(raw)
48
+ ? Number(raw)
49
+ : typeof raw === "number"
50
+ ? raw
51
+ : NaN;
52
+ if (!Number.isFinite(balance)) {
53
+ const kind = raw === null ? "null" : Array.isArray(raw) ? "array" : typeof raw;
54
+ throw ctx.fail.parseFailure(`fal returned an unrecognized credit balance (${kind}).`);
55
+ }
56
+ const currency =
57
+ typeof credits.currency === "string" && /^[A-Z]{3}$/.test(credits.currency) ? credits.currency : "USD";
58
+ const identity = { loginMethod: "API key" };
59
+ if (typeof data.username === "string" && data.username.trim()) identity.organization = data.username.trim();
60
+ return {
61
+ details: [
62
+ {
63
+ title: "Account balance",
64
+ rows: [{ label: "Credit balance", value: ctx.format.currency(balance, currency) }],
65
+ },
66
+ ],
67
+ identity,
68
+ dataConfidence: "exact",
69
+ };
70
+ },
71
+ });
72
+
73
+ // END UPSTREAM
74
+ })(globalThis.defineProvider);
@@ -0,0 +1,24 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "fal",
4
+ "name": "fal",
5
+ "version": "0.1.0",
6
+ "entry": "plugin.js",
7
+ "enabledByDefault": false,
8
+ "supportedModes": [
9
+ "api"
10
+ ],
11
+ "autoMode": "api",
12
+ "usageDashboardUrl": "https://fal.ai/dashboard/billing",
13
+ "envVars": [
14
+ "FAL_KEY"
15
+ ],
16
+ "setupFields": [],
17
+ "upstream": {
18
+ "repository": "https://github.com/steipete/CodexBar",
19
+ "revision": "6070b29a1a5d51193a634dc1b0a14a67c39d0ccc",
20
+ "path": "Sources/CodexBarCore/Resources/Plugins/fal.js",
21
+ "sha256": "5c3607c74508d8fcabe8fd04fbf6ed5edfec5364c24454a7dc9e8ab0ccedd30c",
22
+ "license": "MIT"
23
+ }
24
+ }
@@ -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,4 @@
1
+ <svg fill="currentColor" viewBox="-18 -18 100 100" xmlns="http://www.w3.org/2000/svg">
2
+ <title>FLORA</title>
3
+ <path d="M 33.283 15.358 C 33.283 6.876 40.159 0 48.641 0 C 56.32 0 64 0 64 0 C 64 0 64 7.679 64 15.359 C 64 23.841 57.124 30.717 48.642 30.717 C 48.641 30.717 48.641 30.717 48.641 30.717 C 40.159 30.717 33.283 23.841 33.283 15.359 C 33.283 15.359 33.283 15.359 33.283 15.358 Z M 0 48.641 C 0 40.159 6.876 33.283 15.358 33.283 C 15.358 33.283 15.359 33.283 15.359 33.283 C 23.841 33.283 30.717 40.159 30.717 48.641 C 30.717 48.641 30.717 48.642 30.717 48.642 C 30.717 57.124 23.841 64 15.359 64 C 7.68 64 0 64 0 64 C 0 64 0 56.32 0 48.641 Z M 33.283 48.641 C 33.283 40.159 40.159 33.283 48.641 33.283 C 48.641 33.283 48.641 33.283 48.642 33.283 C 57.124 33.283 64 40.159 64 48.641 C 64 56.321 64 64 64 64 C 64 64 56.32 64 48.641 64 C 40.159 64 33.283 57.124 33.283 48.642 C 33.283 48.641 33.283 48.641 33.283 48.641 Z M 0 0 C 0 0 7.68 0 15.359 0 C 23.841 0 30.717 6.876 30.717 15.358 C 30.717 15.358 30.717 15.359 30.717 15.359 C 30.717 23.841 23.841 30.717 15.359 30.717 C 15.359 30.717 15.358 30.717 15.358 30.717 C 6.876 30.717 0 23.841 0 15.359 C 0 7.68 0 0 0 0 Z"/>
4
+ </svg>
@@ -0,0 +1,93 @@
1
+ // Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
2
+ globalThis.__usagestat_bundled_options = {"labels":["Credits","Additional","Additional"],"defaults":{},"autoMode":"api"};
3
+ (function(defineProvider) {
4
+ // BEGIN UPSTREAM Sources/CodexBarCore/Resources/Plugins/flora.js
5
+ defineProvider({
6
+ id: "flora",
7
+ name: "FLORA",
8
+ endpoints: ["https://app.flora.ai"],
9
+ auth: { type: "bearer", secret: "FLORA_API_KEY" },
10
+ settings: [
11
+ { key: "FLORA_API_KEY", title: "FLORA API key", type: "secure" },
12
+ { key: "FLORA_WORKSPACE_ID", title: "Workspace ID", type: "plain" },
13
+ ],
14
+ capabilities: ["http-status"],
15
+ async fetchUsage(ctx) {
16
+ // Workspace listing can be empty without read permission, so billing uses an explicit workspace ID.
17
+ const workspace = (ctx.settings.get("FLORA_WORKSPACE_ID") || "").trim();
18
+ if (!workspace) {
19
+ throw ctx.fail.missingCredential("Set the FLORA workspace ID (ws_…) in Settings or FLORA_WORKSPACE_ID.");
20
+ }
21
+ if (!/^ws_[A-Za-z0-9]+$/.test(workspace))
22
+ throw ctx.fail.missingCredential("FLORA workspace ID must look like ws_….");
23
+
24
+ const now = ctx.date.now();
25
+ const pad = (value) => String(value).padStart(2, "0");
26
+ const month = `${now.getUTCFullYear()}-${pad(now.getUTCMonth() + 1)}`;
27
+ const today = `${month}-${pad(now.getUTCDate())}`;
28
+ const response = await ctx.http.get(
29
+ `https://app.flora.ai/api/v1/workspaces/${workspace}/usage?start_date=${month}-01&end_date=${today}`,
30
+ );
31
+ const message = `FLORA returned HTTP ${response.status}.`;
32
+ if (response.status === 401) throw ctx.fail.authenticationExpired(message);
33
+ if (response.status === 403) {
34
+ throw ctx.fail.permissionDenied("FLORA rejected the key: it needs billing permission on this workspace.");
35
+ }
36
+ if (response.status === 404) throw ctx.fail.apiFailure("FLORA did not find this workspace ID.");
37
+ if (response.status === 429) {
38
+ const delay = Number(response.headers["retry-after"] ?? 1);
39
+ throw ctx.fail.rateLimited(message, {
40
+ retryAfterSeconds: Number.isFinite(delay) && delay >= 0 ? Math.min(delay, 10) : 1,
41
+ });
42
+ }
43
+ if (response.status >= 500) throw ctx.fail.providerUnavailable(message);
44
+ if (response.status !== 200) throw ctx.fail.apiFailure(message);
45
+ function fail() {
46
+ throw ctx.fail.parseFailure("FLORA returned an unrecognized workspace usage response.");
47
+ }
48
+ const finite = (value) => typeof value === "number" && Number.isFinite(value);
49
+ const record = (value) => (value && typeof value === "object" && !Array.isArray(value) ? value : null);
50
+ let data;
51
+ try {
52
+ data = record(JSON.parse(response.bodyText));
53
+ } catch {
54
+ return fail();
55
+ }
56
+ if (!data || !finite(data.available_cost)) return fail();
57
+ const currency = typeof data.currency === "string" && /^[A-Z]{3}$/.test(data.currency) ? data.currency : "USD";
58
+ const money = (value) => ctx.format.currency(value, currency);
59
+ const scope = { workspace: "Workspace pool", caller: "Your allowance" }[data.balance_scope];
60
+ const rows = [{ label: "Available", value: money(data.available_cost), secondaryValue: scope ?? null }];
61
+
62
+ const limit = record(data.member_limit);
63
+ if (data.balance_scope === "caller" && limit && finite(limit.limit_cost)) {
64
+ const period = { month: "Monthly", all_time: "All time" }[limit.period];
65
+ rows.push({ label: "Member limit", value: money(limit.limit_cost), secondaryValue: period ?? null });
66
+ }
67
+
68
+ const spend = record(data.spend);
69
+ if (spend && spend.status === "available") {
70
+ if (!finite(spend.total_cost)) return fail();
71
+ rows.push({ label: "Spent this month", value: money(spend.total_cost) });
72
+ if (Number.isInteger(spend.classified_runs) && spend.classified_runs >= 0) {
73
+ rows.push({ label: "Runs this month", value: ctx.format.number(spend.classified_runs) });
74
+ }
75
+ } else if (spend && spend.status === "unavailable") {
76
+ const reason = {
77
+ entitlement_missing: "Plan has no usage reporting",
78
+ permission_missing: "Needs billing permission",
79
+ summary_unavailable: "Totals not computed; try again",
80
+ }[spend.reason];
81
+ rows.push({ label: "Spent this month", value: "Unavailable", secondaryValue: reason ?? "Not reported" });
82
+ }
83
+
84
+ return {
85
+ details: [{ title: "Workspace balance", rows }],
86
+ identity: { loginMethod: "API key" },
87
+ dataConfidence: "exact",
88
+ };
89
+ },
90
+ });
91
+
92
+ // END UPSTREAM
93
+ })(globalThis.defineProvider);
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "flora",
4
+ "name": "FLORA",
5
+ "version": "0.1.0",
6
+ "entry": "plugin.js",
7
+ "enabledByDefault": false,
8
+ "supportedModes": [
9
+ "api"
10
+ ],
11
+ "autoMode": "api",
12
+ "usageDashboardUrl": "https://app.flora.ai",
13
+ "envVars": [
14
+ "FLORA_API_KEY",
15
+ "FLORA_WORKSPACE_ID"
16
+ ],
17
+ "setupFields": [
18
+ {
19
+ "key": "FLORA_WORKSPACE_ID",
20
+ "title": "Workspace ID",
21
+ "type": "string",
22
+ "description": "Provider-specific account or source selection."
23
+ }
24
+ ],
25
+ "upstream": {
26
+ "repository": "https://github.com/steipete/CodexBar",
27
+ "revision": "6070b29a1a5d51193a634dc1b0a14a67c39d0ccc",
28
+ "path": "Sources/CodexBarCore/Resources/Plugins/flora.js",
29
+ "sha256": "451732a2e088769dcd023770cfa378c2c386eea8fad137c6db676b6e305e569f",
30
+ "license": "MIT"
31
+ }
32
+ }
@@ -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,24 @@
1
+ <svg width="51" height="51" viewBox="0 0 51 51" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M51 27.628L47.2995 29.7647L43.5967 31.9013L39.8963 34.0404L36.1958 36.177L34.0568 39.8798L31.9201 43.5803L29.7835 47.2831L27.6468 50.9835H23.3711L25.5078 47.2831L27.6468 43.5803L29.7835 39.8798L31.9201 36.177L33.4839 33.4651L36.1935 31.9013L39.8963 29.7647L43.5967 27.628L39.8963 25.4913L36.1935 23.3523L32.4907 21.2156L30.772 20.2248L29.7811 18.5084L27.6444 14.8056L25.5078 11.1028L27.6444 7.40234L29.7811 11.1028L31.9178 14.8056L33.4816 17.5152L36.1935 19.0789L39.8963 21.2156L43.5967 23.3523L47.2995 25.4913L51 27.628Z" fill="url(#paint0_linear_75_61877)"/>
3
+ <path d="M43.5812 27.6444L39.8807 29.7811L36.1779 31.9178L33.4683 33.4816L31.9046 36.1935L29.7679 39.8963L27.6312 43.5967L25.4922 47.2995L23.3555 51L21.2188 47.2995L19.0822 43.5967L16.9431 39.8963L14.8065 36.1958L11.1037 34.0568L7.40323 31.9201L3.70044 29.7835L0 27.6468L0 23.3711L3.70044 25.5078L7.40323 27.6468L11.1037 29.7835L14.8065 31.9201L17.5184 33.4839L19.0822 36.1935L21.2188 39.8963L23.3555 43.5967L25.4922 39.8963L27.6312 36.1935L29.7679 32.4907L30.7588 30.772L32.4751 29.7811L36.1779 27.6444L39.8807 25.5078L43.5812 27.6444Z" fill="url(#paint1_linear_75_61877)"/>
4
+ <path d="M11.1037 21.2188L7.40323 23.3555L11.1037 25.4922L14.8065 27.6312L18.5093 29.7679L20.228 30.7588L21.2188 32.4751L23.3555 36.1779L25.4922 39.8807L23.3555 43.5812L21.2188 39.8807L19.0822 36.1779L17.5184 33.4683L14.8065 31.9046L11.1037 29.7679L7.40323 27.6312L3.70044 25.4922L0 23.3555L3.70044 21.2188L7.40323 19.0822L11.1037 16.9431L14.8041 14.8065L16.9431 11.1037L19.0798 7.40323L21.2165 3.70044L23.3532 0H27.6289L25.4922 3.70044L23.3532 7.40323L21.2165 11.1037L19.0798 14.8065L17.516 17.5184L16.5933 18.0514L14.8065 19.0822L11.1037 21.2188Z" fill="url(#paint2_linear_75_61877)"/>
5
+ <path d="M50.9884 23.3532V27.6289L47.2879 25.4922L43.5852 23.3532L39.8847 21.2165L36.1819 19.0798L33.47 17.516L31.9062 14.8065L29.7695 11.1037L27.6329 7.40323L25.4962 11.1037L23.3572 14.8065L21.2205 18.5093L20.2296 20.228L18.5132 21.2188L14.8105 23.3555L11.1077 25.4922L7.40723 23.3555L11.1077 21.2188L14.8105 19.0822L16.5973 18.0514L17.52 17.5184L19.0838 14.8065L21.2205 11.1037L23.3572 7.40323L25.4962 3.70044L27.6329 0L29.7695 3.70044L31.9062 7.40323L34.0452 11.1037L36.1819 14.8041L39.8847 16.9431L43.5852 19.0798L47.2879 21.2165L50.9884 23.3532Z" fill="url(#paint3_linear_75_61877)"/>
6
+ <defs>
7
+ <linearGradient id="paint0_linear_75_61877" x1="37.1855" y1="7.40234" x2="37.1855" y2="50.9835" gradientUnits="userSpaceOnUse">
8
+ <stop stop-color="#CF6BE8"/>
9
+ <stop offset="1" stop-color="#7857FC"/>
10
+ </linearGradient>
11
+ <linearGradient id="paint1_linear_75_61877" x1="21.7906" y1="23.3711" x2="21.7906" y2="51" gradientUnits="userSpaceOnUse">
12
+ <stop stop-color="#8B44FF"/>
13
+ <stop offset="1" stop-color="#7A40D9"/>
14
+ </linearGradient>
15
+ <linearGradient id="paint2_linear_75_61877" x1="13.8144" y1="0" x2="13.8144" y2="43.5812" gradientUnits="userSpaceOnUse">
16
+ <stop stop-color="#CF6BE8"/>
17
+ <stop offset="1" stop-color="#7857FC"/>
18
+ </linearGradient>
19
+ <linearGradient id="paint3_linear_75_61877" x1="29.1978" y1="0" x2="29.1978" y2="27.6289" gradientUnits="userSpaceOnUse">
20
+ <stop stop-color="#8B44FF"/>
21
+ <stop offset="1" stop-color="#7A40D9"/>
22
+ </linearGradient>
23
+ </defs>
24
+ </svg>
@@ -0,0 +1,139 @@
1
+ // Generated by tools/vendor-codexbar-providers.cjs; see LICENSE.
2
+ globalThis.__usagestat_bundled_options = {"labels":["AI credits","Gateway requests","Additional"],"defaults":{},"autoMode":"api"};
3
+ (function(defineProvider) {
4
+ // BEGIN UPSTREAM Sources/CodexBarCore/Resources/Plugins/futureagi.js
5
+ function _nullishCoalesce(lhs, rhsFn) {
6
+ if (lhs != null) {
7
+ return lhs;
8
+ } else {
9
+ return rhsFn();
10
+ }
11
+ }
12
+ function _optionalChain(ops) {
13
+ let lastAccessLHS = undefined;
14
+ let value = ops[0];
15
+ let i = 1;
16
+ while (i < ops.length) {
17
+ const op = ops[i];
18
+ const fn = ops[i + 1];
19
+ i += 2;
20
+ if ((op === "optionalAccess" || op === "optionalCall") && value == null) {
21
+ return undefined;
22
+ }
23
+ if (op === "access" || op === "optionalAccess") {
24
+ lastAccessLHS = value;
25
+ value = fn(value);
26
+ } else if (op === "call" || op === "optionalCall") {
27
+ value = fn((...args) => value.call(lastAccessLHS, ...args));
28
+ lastAccessLHS = undefined;
29
+ }
30
+ }
31
+ return value;
32
+ }
33
+ defineProvider({
34
+ id: "futureagi",
35
+ name: "Future AGI",
36
+ endpoints: ["https://api.futureagi.com"],
37
+ auth: { type: "x-api-key", secret: "FI_API_KEY" },
38
+ settings: [
39
+ { key: "FI_API_KEY", title: "API key", type: "secure" },
40
+ { key: "FI_SECRET_KEY", title: "Secret key", type: "secure" },
41
+ ],
42
+ capabilities: ["http-status"],
43
+ async fetchUsage(ctx) {
44
+ const secret = ctx.settings.getSecret("FI_SECRET_KEY");
45
+ if (!secret) throw ctx.fail.missingCredential("Future AGI requires both an API key and a secret key.");
46
+ const response = await ctx.http.get("https://api.futureagi.com/usage/v2/usage-overview/", {
47
+ headers: { "X-Secret-Key": secret },
48
+ });
49
+ const message = `Future AGI returned HTTP ${response.status}.`;
50
+ if (response.status === 401) throw ctx.fail.authenticationExpired(message);
51
+ if (response.status === 403) throw ctx.fail.permissionDenied(message);
52
+ if (response.status === 429) {
53
+ const delay = Number(_nullishCoalesce(response.headers["retry-after"], () => 1));
54
+ throw ctx.fail.rateLimited(message, {
55
+ retryAfterSeconds: Number.isFinite(delay) && delay >= 0 ? Math.min(delay, 10) : 1,
56
+ });
57
+ }
58
+ if (response.status >= 500) throw ctx.fail.providerUnavailable(message);
59
+ if (response.status !== 200) throw ctx.fail.apiFailure(message);
60
+ const fail = () => {
61
+ throw ctx.fail.parseFailure("Future AGI returned an unrecognized usage overview.");
62
+ };
63
+ let body;
64
+ try {
65
+ body = JSON.parse(response.bodyText);
66
+ } catch (error) {
67
+ void error;
68
+ return fail();
69
+ }
70
+ const data = _optionalChain([body, "optionalAccess", (_) => _.result]);
71
+ if (
72
+ _optionalChain([body, "optionalAccess", (_2) => _2.status]) !== true ||
73
+ !data ||
74
+ !Array.isArray(data.dimensions)
75
+ )
76
+ return fail();
77
+ const amount = (value) =>
78
+ typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= Number.MAX_SAFE_INTEGER
79
+ ? value
80
+ : fail();
81
+ const date = (value) => {
82
+ if (
83
+ typeof value !== "string" ||
84
+ !/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2}))?$/.test(value)
85
+ )
86
+ return fail();
87
+ const parsed = new Date(value);
88
+ return Number.isFinite(parsed.getTime()) ? parsed : fail();
89
+ };
90
+ const start = date(data.billing_period_start);
91
+ const end = date(data.billing_period_end);
92
+ if (end <= start || data.dimensions.length === 0 || data.dimensions.length > 16) return fail();
93
+ const windows = {};
94
+ const rows = [];
95
+ const keys = new Set();
96
+ for (const meter of data.dimensions) {
97
+ if (
98
+ !meter ||
99
+ typeof meter.key !== "string" ||
100
+ keys.has(meter.key) ||
101
+ !ctx.isDetailLabel(meter.display_name) ||
102
+ !ctx.isDetailLabel(meter.display_unit)
103
+ )
104
+ return fail();
105
+ keys.add(meter.key);
106
+ const used = amount(meter.current_usage);
107
+ const allowance = amount(meter.free_allowance);
108
+ if (allowance > 0) {
109
+ windows[meter.key] = {
110
+ usedPercent: ctx.pct(used, allowance),
111
+ windowMinutes: Math.round((end.getTime() - start.getTime()) / 60000),
112
+ resetsAt: end,
113
+ quotaLimit: allowance,
114
+ quotaUnit: meter.display_unit,
115
+ };
116
+ }
117
+ rows.push({
118
+ label: meter.display_name,
119
+ value: `${ctx.format.number(used)} / ${ctx.format.number(allowance)} ${meter.display_unit}`,
120
+ });
121
+ }
122
+ return {
123
+ primary: windows.ai_credits,
124
+ secondary: windows.gateway_requests,
125
+ details: [
126
+ { title: "Used / free allowance", rows },
127
+ {
128
+ title: "Billing period",
129
+ rows: [{ label: "Estimated usage cost", value: ctx.format.usd(amount(data.total_estimated_cost)) }],
130
+ },
131
+ ],
132
+ identity: { loginMethod: typeof data.plan_display_name === "string" ? data.plan_display_name : undefined },
133
+ dataConfidence: "exact",
134
+ };
135
+ },
136
+ });
137
+
138
+ // END UPSTREAM
139
+ })(globalThis.defineProvider);
@@ -0,0 +1,32 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "futureagi",
4
+ "name": "Future AGI",
5
+ "version": "0.1.0",
6
+ "entry": "plugin.js",
7
+ "enabledByDefault": false,
8
+ "supportedModes": [
9
+ "api"
10
+ ],
11
+ "autoMode": "api",
12
+ "usageDashboardUrl": "https://app.futureagi.com",
13
+ "envVars": [
14
+ "FI_API_KEY",
15
+ "FI_SECRET_KEY"
16
+ ],
17
+ "setupFields": [
18
+ {
19
+ "key": "FI_SECRET_KEY",
20
+ "title": "Secret key",
21
+ "type": "string",
22
+ "description": "Additional credential for this provider instance; stored privately."
23
+ }
24
+ ],
25
+ "upstream": {
26
+ "repository": "https://github.com/steipete/CodexBar",
27
+ "revision": "6070b29a1a5d51193a634dc1b0a14a67c39d0ccc",
28
+ "path": "Sources/CodexBarCore/Resources/Plugins/futureagi.js",
29
+ "sha256": "48c4e8b36e4556bc56dfe16f954e180aba0e11fb4111e382049fe015b4340c42",
30
+ "license": "MIT"
31
+ }
32
+ }
@@ -1,7 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Robin Ebers (original macOS creator)
4
- Copyright (c) 2026 barramee kottanawadee
3
+ Copyright (c) 2026 Peter Steinberger
5
4
 
6
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
6
  of this software and associated documentation files (the "Software"), to deal