@slkiser/opencode-quota 2.14.0 → 2.16.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 (152) hide show
  1. package/README.md +113 -34
  2. package/dist/index.d.ts +5 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +12 -6
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/alibaba-auth.d.ts +25 -0
  7. package/dist/lib/alibaba-auth.d.ts.map +1 -1
  8. package/dist/lib/alibaba-auth.js +82 -8
  9. package/dist/lib/alibaba-auth.js.map +1 -1
  10. package/dist/lib/api-key-resolver.d.ts +37 -4
  11. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  12. package/dist/lib/api-key-resolver.js +83 -23
  13. package/dist/lib/api-key-resolver.js.map +1 -1
  14. package/dist/lib/atomic-json.d.ts +5 -0
  15. package/dist/lib/atomic-json.d.ts.map +1 -0
  16. package/dist/lib/atomic-json.js +33 -0
  17. package/dist/lib/atomic-json.js.map +1 -0
  18. package/dist/lib/chutes-config.d.ts.map +1 -1
  19. package/dist/lib/chutes-config.js +7 -39
  20. package/dist/lib/chutes-config.js.map +1 -1
  21. package/dist/lib/chutes.d.ts +1 -2
  22. package/dist/lib/chutes.d.ts.map +1 -1
  23. package/dist/lib/chutes.js +5 -14
  24. package/dist/lib/chutes.js.map +1 -1
  25. package/dist/lib/cursor-detection.d.ts.map +1 -1
  26. package/dist/lib/cursor-detection.js +3 -3
  27. package/dist/lib/cursor-detection.js.map +1 -1
  28. package/dist/lib/cursor-pricing.d.ts.map +1 -1
  29. package/dist/lib/cursor-pricing.js +2 -2
  30. package/dist/lib/cursor-pricing.js.map +1 -1
  31. package/dist/lib/cursor-usage.d.ts.map +1 -1
  32. package/dist/lib/cursor-usage.js +6 -29
  33. package/dist/lib/cursor-usage.js.map +1 -1
  34. package/dist/lib/firmware-config.d.ts.map +1 -1
  35. package/dist/lib/firmware-config.js +7 -40
  36. package/dist/lib/firmware-config.js.map +1 -1
  37. package/dist/lib/firmware.d.ts +1 -2
  38. package/dist/lib/firmware.d.ts.map +1 -1
  39. package/dist/lib/firmware.js +7 -16
  40. package/dist/lib/firmware.js.map +1 -1
  41. package/dist/lib/google.d.ts +10 -0
  42. package/dist/lib/google.d.ts.map +1 -1
  43. package/dist/lib/google.js +82 -16
  44. package/dist/lib/google.js.map +1 -1
  45. package/dist/lib/minimax-auth.d.ts +25 -2
  46. package/dist/lib/minimax-auth.d.ts.map +1 -1
  47. package/dist/lib/minimax-auth.js +74 -7
  48. package/dist/lib/minimax-auth.js.map +1 -1
  49. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  50. package/dist/lib/modelsdev-pricing.js +8 -36
  51. package/dist/lib/modelsdev-pricing.js.map +1 -1
  52. package/dist/lib/nanogpt-config.d.ts.map +1 -1
  53. package/dist/lib/nanogpt-config.js +7 -36
  54. package/dist/lib/nanogpt-config.js.map +1 -1
  55. package/dist/lib/nanogpt.d.ts +1 -2
  56. package/dist/lib/nanogpt.d.ts.map +1 -1
  57. package/dist/lib/nanogpt.js +5 -14
  58. package/dist/lib/nanogpt.js.map +1 -1
  59. package/dist/lib/openai.d.ts +21 -2
  60. package/dist/lib/openai.d.ts.map +1 -1
  61. package/dist/lib/openai.js +53 -15
  62. package/dist/lib/openai.js.map +1 -1
  63. package/dist/lib/opencode-go-config.d.ts +35 -0
  64. package/dist/lib/opencode-go-config.d.ts.map +1 -0
  65. package/dist/lib/opencode-go-config.js +124 -0
  66. package/dist/lib/opencode-go-config.js.map +1 -0
  67. package/dist/lib/opencode-go.d.ts +15 -0
  68. package/dist/lib/opencode-go.d.ts.map +1 -0
  69. package/dist/lib/opencode-go.js +88 -0
  70. package/dist/lib/opencode-go.js.map +1 -0
  71. package/dist/lib/provider-availability.d.ts +6 -0
  72. package/dist/lib/provider-availability.d.ts.map +1 -1
  73. package/dist/lib/provider-availability.js +9 -0
  74. package/dist/lib/provider-availability.js.map +1 -1
  75. package/dist/lib/provider-metadata.d.ts +18 -0
  76. package/dist/lib/provider-metadata.d.ts.map +1 -1
  77. package/dist/lib/provider-metadata.js +120 -1
  78. package/dist/lib/provider-metadata.js.map +1 -1
  79. package/dist/lib/quota-command-format.d.ts +0 -5
  80. package/dist/lib/quota-command-format.d.ts.map +1 -1
  81. package/dist/lib/quota-command-format.js +1 -1
  82. package/dist/lib/quota-command-format.js.map +1 -1
  83. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  84. package/dist/lib/quota-stats-format.js +10 -13
  85. package/dist/lib/quota-stats-format.js.map +1 -1
  86. package/dist/lib/quota-stats.d.ts +2 -7
  87. package/dist/lib/quota-stats.d.ts.map +1 -1
  88. package/dist/lib/quota-stats.js +17 -43
  89. package/dist/lib/quota-stats.js.map +1 -1
  90. package/dist/lib/quota-status.d.ts.map +1 -1
  91. package/dist/lib/quota-status.js +214 -91
  92. package/dist/lib/quota-status.js.map +1 -1
  93. package/dist/lib/qwen-auth.d.ts +4 -0
  94. package/dist/lib/qwen-auth.d.ts.map +1 -1
  95. package/dist/lib/qwen-auth.js +6 -6
  96. package/dist/lib/qwen-auth.js.map +1 -1
  97. package/dist/lib/qwen-local-quota.d.ts.map +1 -1
  98. package/dist/lib/qwen-local-quota.js +5 -33
  99. package/dist/lib/qwen-local-quota.js.map +1 -1
  100. package/dist/lib/token-buckets.d.ts +24 -0
  101. package/dist/lib/token-buckets.d.ts.map +1 -0
  102. package/dist/lib/token-buckets.js +32 -0
  103. package/dist/lib/token-buckets.js.map +1 -0
  104. package/dist/lib/types.d.ts +25 -26
  105. package/dist/lib/types.d.ts.map +1 -1
  106. package/dist/lib/types.js +10 -2
  107. package/dist/lib/types.js.map +1 -1
  108. package/dist/lib/zai-auth.d.ts +38 -0
  109. package/dist/lib/zai-auth.d.ts.map +1 -0
  110. package/dist/lib/zai-auth.js +107 -0
  111. package/dist/lib/zai-auth.js.map +1 -0
  112. package/dist/lib/zai.d.ts.map +1 -1
  113. package/dist/lib/zai.js +17 -17
  114. package/dist/lib/zai.js.map +1 -1
  115. package/dist/plugin.d.ts.map +1 -1
  116. package/dist/plugin.js +81 -67
  117. package/dist/plugin.js.map +1 -1
  118. package/dist/providers/anthropic.js +3 -3
  119. package/dist/providers/anthropic.js.map +1 -1
  120. package/dist/providers/chutes.d.ts.map +1 -1
  121. package/dist/providers/chutes.js +8 -10
  122. package/dist/providers/chutes.js.map +1 -1
  123. package/dist/providers/copilot.d.ts.map +1 -1
  124. package/dist/providers/copilot.js +6 -8
  125. package/dist/providers/copilot.js.map +1 -1
  126. package/dist/providers/cursor.js +3 -3
  127. package/dist/providers/cursor.js.map +1 -1
  128. package/dist/providers/firmware.d.ts.map +1 -1
  129. package/dist/providers/firmware.js +8 -11
  130. package/dist/providers/firmware.js.map +1 -1
  131. package/dist/providers/google-antigravity.d.ts.map +1 -1
  132. package/dist/providers/google-antigravity.js +4 -14
  133. package/dist/providers/google-antigravity.js.map +1 -1
  134. package/dist/providers/minimax-coding-plan.js +3 -3
  135. package/dist/providers/minimax-coding-plan.js.map +1 -1
  136. package/dist/providers/nanogpt.d.ts.map +1 -1
  137. package/dist/providers/nanogpt.js +2 -13
  138. package/dist/providers/nanogpt.js.map +1 -1
  139. package/dist/providers/openai.d.ts.map +1 -1
  140. package/dist/providers/openai.js +8 -4
  141. package/dist/providers/openai.js.map +1 -1
  142. package/dist/providers/opencode-go.d.ts +9 -0
  143. package/dist/providers/opencode-go.d.ts.map +1 -0
  144. package/dist/providers/opencode-go.js +80 -0
  145. package/dist/providers/opencode-go.js.map +1 -0
  146. package/dist/providers/registry.d.ts.map +1 -1
  147. package/dist/providers/registry.js +2 -0
  148. package/dist/providers/registry.js.map +1 -1
  149. package/dist/providers/zai.d.ts.map +1 -1
  150. package/dist/providers/zai.js +19 -12
  151. package/dist/providers/zai.js.map +1 -1
  152. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ import { readFile } from "fs/promises";
2
+ import { join } from "path";
3
+ import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
4
+ function getConfigCandidatePaths() {
5
+ const { configDirs } = getOpencodeRuntimeDirCandidates();
6
+ return configDirs.map((dir) => join(dir, "opencode-quota", "opencode-go.json"));
7
+ }
8
+ function getConfigFileError(error) {
9
+ if (error instanceof SyntaxError) {
10
+ return `Failed to parse JSON: ${error.message}`;
11
+ }
12
+ if (error instanceof Error && error.message) {
13
+ return `Failed to read config file: ${error.message}`;
14
+ }
15
+ return `Failed to read config file: ${String(error)}`;
16
+ }
17
+ async function readConfigFile(path) {
18
+ try {
19
+ const data = await readFile(path, "utf-8");
20
+ const parsed = JSON.parse(data);
21
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
22
+ return { state: "invalid", error: "Config file must contain a JSON object" };
23
+ }
24
+ return { state: "loaded", config: parsed };
25
+ }
26
+ catch (error) {
27
+ if (error?.code === "ENOENT") {
28
+ return { state: "missing" };
29
+ }
30
+ return { state: "invalid", error: getConfigFileError(error) };
31
+ }
32
+ }
33
+ export function resolveOpenCodeGoConfigFromEnv(env = process.env) {
34
+ const workspaceId = env.OPENCODE_GO_WORKSPACE_ID?.trim();
35
+ const authCookie = env.OPENCODE_GO_AUTH_COOKIE?.trim();
36
+ if (!workspaceId && !authCookie)
37
+ return null;
38
+ if (workspaceId && authCookie) {
39
+ return {
40
+ state: "configured",
41
+ config: { workspaceId, authCookie },
42
+ source: "env",
43
+ };
44
+ }
45
+ return {
46
+ state: "incomplete",
47
+ source: "env",
48
+ missing: workspaceId ? "OPENCODE_GO_AUTH_COOKIE" : "OPENCODE_GO_WORKSPACE_ID",
49
+ };
50
+ }
51
+ export async function resolveOpenCodeGoConfig() {
52
+ const envResult = resolveOpenCodeGoConfigFromEnv();
53
+ if (envResult)
54
+ return envResult;
55
+ const candidates = getConfigCandidatePaths();
56
+ for (const path of candidates) {
57
+ const fileResult = await readConfigFile(path);
58
+ if (fileResult.state === "missing")
59
+ continue;
60
+ if (fileResult.state === "invalid") {
61
+ return { state: "invalid", source: path, error: fileResult.error };
62
+ }
63
+ const config = fileResult.config;
64
+ const workspaceId = typeof config.workspaceId === "string" ? config.workspaceId.trim() : "";
65
+ const authCookie = typeof config.authCookie === "string" ? config.authCookie.trim() : "";
66
+ if (workspaceId && authCookie) {
67
+ return {
68
+ state: "configured",
69
+ config: { workspaceId, authCookie },
70
+ source: path,
71
+ };
72
+ }
73
+ const missing = !workspaceId ? "workspaceId" : "authCookie";
74
+ return { state: "incomplete", source: path, missing };
75
+ }
76
+ return { state: "none" };
77
+ }
78
+ let cachedConfig = null;
79
+ let cachedAt = 0;
80
+ const DEFAULT_CACHE_MAX_AGE_MS = 30_000;
81
+ export { DEFAULT_CACHE_MAX_AGE_MS as DEFAULT_OPENCODE_GO_CONFIG_CACHE_MAX_AGE_MS };
82
+ export async function resolveOpenCodeGoConfigCached(params) {
83
+ const maxAgeMs = Math.max(0, params?.maxAgeMs ?? DEFAULT_CACHE_MAX_AGE_MS);
84
+ const now = Date.now();
85
+ if (cachedConfig && now - cachedAt < maxAgeMs) {
86
+ return cachedConfig;
87
+ }
88
+ cachedConfig = await resolveOpenCodeGoConfig();
89
+ cachedAt = now;
90
+ return cachedConfig;
91
+ }
92
+ export async function getOpenCodeGoConfigDiagnostics() {
93
+ const resolved = await resolveOpenCodeGoConfig();
94
+ const checkedPaths = getConfigCandidatePaths();
95
+ if (resolved.state === "none") {
96
+ return { state: "none", source: null, missing: null, error: null, checkedPaths };
97
+ }
98
+ if (resolved.state === "incomplete") {
99
+ return {
100
+ state: "incomplete",
101
+ source: resolved.source,
102
+ missing: resolved.missing,
103
+ error: null,
104
+ checkedPaths,
105
+ };
106
+ }
107
+ if (resolved.state === "invalid") {
108
+ return {
109
+ state: "invalid",
110
+ source: resolved.source,
111
+ missing: null,
112
+ error: resolved.error,
113
+ checkedPaths,
114
+ };
115
+ }
116
+ return {
117
+ state: "configured",
118
+ source: resolved.source,
119
+ missing: null,
120
+ error: null,
121
+ checkedPaths,
122
+ };
123
+ }
124
+ //# sourceMappingURL=opencode-go-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-go-config.js","sourceRoot":"","sources":["../../src/lib/opencode-go-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OpenCode Go dashboard scraper.
3
+ *
4
+ * Fetches the OpenCode Go workspace page and parses SolidJS SSR hydration
5
+ * output for `monthlyUsage` containing `usagePercent` and `resetInSec`.
6
+ */
7
+ import type { OpenCodeGoResult } from "./types.js";
8
+ interface ScrapedMonthlyUsage {
9
+ usagePercent: number;
10
+ resetInSec: number;
11
+ }
12
+ declare function parseMonthlyUsage(html: string): ScrapedMonthlyUsage | null;
13
+ export declare function queryOpenCodeGoQuota(workspaceId: string, authCookie: string): Promise<OpenCodeGoResult>;
14
+ export { parseMonthlyUsage as _parseMonthlyUsage };
15
+ //# sourceMappingURL=opencode-go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-go.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-go.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAiBnD,UAAU,mBAAmB;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iBAAS,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAoBnE;AAOD,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,gBAAgB,CAAC,CAqD3B;AAED,OAAO,EAAE,iBAAiB,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * OpenCode Go dashboard scraper.
3
+ *
4
+ * Fetches the OpenCode Go workspace page and parses SolidJS SSR hydration
5
+ * output for `monthlyUsage` containing `usagePercent` and `resetInSec`.
6
+ */
7
+ import { fetchWithTimeout } from "./http.js";
8
+ import { sanitizeDisplayText } from "./display-sanitize.js";
9
+ const DASHBOARD_URL_PREFIX = "https://opencode.ai/workspace/";
10
+ const DASHBOARD_URL_SUFFIX = "/go";
11
+ const USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/148.0";
12
+ const SCRAPE_TIMEOUT_MS = 10_000;
13
+ /**
14
+ * Regex patterns matching the SolidJS SSR hydration output.
15
+ * Field order may vary, so we try both orderings.
16
+ */
17
+ const RE_MONTHLY_PCT_FIRST = /monthlyUsage:\$R\[\d+\]=\{[^}]*usagePercent:(\d+)[^}]*resetInSec:(\d+)[^}]*\}/;
18
+ const RE_MONTHLY_RESET_FIRST = /monthlyUsage:\$R\[\d+\]=\{[^}]*resetInSec:(\d+)[^}]*usagePercent:(\d+)[^}]*\}/;
19
+ function parseMonthlyUsage(html) {
20
+ const pctFirstMatch = RE_MONTHLY_PCT_FIRST.exec(html);
21
+ if (pctFirstMatch) {
22
+ const usagePercent = Number(pctFirstMatch[1]);
23
+ const resetInSec = Number(pctFirstMatch[2]);
24
+ if (Number.isFinite(usagePercent) && Number.isFinite(resetInSec)) {
25
+ return { usagePercent, resetInSec };
26
+ }
27
+ }
28
+ const resetFirstMatch = RE_MONTHLY_RESET_FIRST.exec(html);
29
+ if (resetFirstMatch) {
30
+ const resetInSec = Number(resetFirstMatch[1]);
31
+ const usagePercent = Number(resetFirstMatch[2]);
32
+ if (Number.isFinite(usagePercent) && Number.isFinite(resetInSec)) {
33
+ return { usagePercent, resetInSec };
34
+ }
35
+ }
36
+ return null;
37
+ }
38
+ function sanitizeMessage(text, maxLength = 120) {
39
+ const sanitized = sanitizeDisplayText(text).replace(/\s+/g, " ").trim();
40
+ return (sanitized || "unknown").slice(0, maxLength);
41
+ }
42
+ export async function queryOpenCodeGoQuota(workspaceId, authCookie) {
43
+ try {
44
+ const url = `${DASHBOARD_URL_PREFIX}${encodeURIComponent(workspaceId)}${DASHBOARD_URL_SUFFIX}`;
45
+ const response = await fetchWithTimeout(url, {
46
+ method: "GET",
47
+ headers: {
48
+ "User-Agent": USER_AGENT,
49
+ Accept: "text/html",
50
+ Cookie: `auth=${authCookie}`,
51
+ },
52
+ }, SCRAPE_TIMEOUT_MS);
53
+ if (!response.ok) {
54
+ const text = await response.text();
55
+ return {
56
+ success: false,
57
+ error: `OpenCode Go dashboard error ${response.status}: ${sanitizeMessage(text)}`,
58
+ };
59
+ }
60
+ const html = await response.text();
61
+ const monthly = parseMonthlyUsage(html);
62
+ if (!monthly) {
63
+ return {
64
+ success: false,
65
+ error: "Could not parse monthly usage from OpenCode Go dashboard",
66
+ };
67
+ }
68
+ const usagePercent = Math.max(0, Math.min(100, monthly.usagePercent));
69
+ const percentRemaining = 100 - usagePercent;
70
+ const resetInSec = Math.max(0, monthly.resetInSec);
71
+ const resetTimeIso = new Date(Date.now() + resetInSec * 1000).toISOString();
72
+ return {
73
+ success: true,
74
+ usagePercent,
75
+ resetInSec,
76
+ percentRemaining,
77
+ resetTimeIso,
78
+ };
79
+ }
80
+ catch (err) {
81
+ return {
82
+ success: false,
83
+ error: sanitizeMessage(err instanceof Error ? err.message : String(err)),
84
+ };
85
+ }
86
+ }
87
+ export { parseMonthlyUsage as _parseMonthlyUsage };
88
+ //# sourceMappingURL=opencode-go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-go.js","sourceRoot":"","sources":["../../src/lib/opencode-go.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,13 @@
1
1
  import type { QuotaProviderContext } from "./entries.js";
2
+ import { type CanonicalQuotaProviderId } from "./provider-metadata.js";
2
3
  export declare function isAnyProviderIdAvailable(params: {
3
4
  ctx: Pick<QuotaProviderContext, "client">;
4
5
  candidateIds: readonly string[];
5
6
  fallbackOnError: boolean;
6
7
  }): Promise<boolean>;
8
+ export declare function isCanonicalProviderAvailable(params: {
9
+ ctx: Pick<QuotaProviderContext, "client">;
10
+ providerId: CanonicalQuotaProviderId;
11
+ fallbackOnError: boolean;
12
+ }): Promise<boolean>;
7
13
  //# sourceMappingURL=provider-availability.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-availability.d.ts","sourceRoot":"","sources":["../../src/lib/provider-availability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEzD,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC1C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnB"}
1
+ {"version":3,"file":"provider-availability.d.ts","sourceRoot":"","sources":["../../src/lib/provider-availability.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,wBAAwB,CAAC;AAEhC,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC1C,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnB;AAED,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,GAAG,EAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;IAC1C,UAAU,EAAE,wBAAwB,CAAC;IACrC,eAAe,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnB"}
@@ -1,3 +1,4 @@
1
+ import { getQuotaProviderRuntimeIds, } from "./provider-metadata.js";
1
2
  export async function isAnyProviderIdAvailable(params) {
2
3
  const { ctx, candidateIds, fallbackOnError } = params;
3
4
  try {
@@ -9,4 +10,12 @@ export async function isAnyProviderIdAvailable(params) {
9
10
  return fallbackOnError;
10
11
  }
11
12
  }
13
+ export async function isCanonicalProviderAvailable(params) {
14
+ const { ctx, providerId, fallbackOnError } = params;
15
+ return isAnyProviderIdAvailable({
16
+ ctx,
17
+ candidateIds: getQuotaProviderRuntimeIds(providerId),
18
+ fallbackOnError,
19
+ });
20
+ }
12
21
  //# sourceMappingURL=provider-availability.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-availability.js","sourceRoot":"","sources":["../../src/lib/provider-availability.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAI9C;IACC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"provider-availability.js","sourceRoot":"","sources":["../../src/lib/provider-availability.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,GAE3B,MAAM,wBAAwB,CAAC;AAEhC,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAI9C;IACC,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACjD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,eAAe,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,MAIlD;IACC,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IACpD,OAAO,wBAAwB,CAAC;QAC9B,GAAG;QACH,YAAY,EAAE,0BAA0B,CAAC,UAAU,CAAC;QACpD,eAAe;KAChB,CAAC,CAAC;AACL,CAAC"}
@@ -1,5 +1,23 @@
1
+ export type CanonicalQuotaProviderId = "anthropic" | "copilot" | "openai" | "cursor" | "qwen-code" | "alibaba-coding-plan" | "firmware" | "chutes" | "google-antigravity" | "zai" | "nanogpt" | "minimax-coding-plan" | "opencode-go";
2
+ export type QuotaProviderAutoSetup = "yes" | "usually" | "needs_quick_setup";
3
+ export type QuotaProviderAuthentication = "opencode_auth_oauth_token" | "opencode_auth_api_key" | "companion_auth_oauth_token" | "local_cli_auth" | "github_oauth_or_pat" | "state_only";
4
+ export type QuotaProviderAuthFallback = "env_api_key" | "global_opencode_config";
5
+ export type QuotaProviderQuotaSource = "remote_api" | "local_estimation" | "local_runtime_accounting" | "local_cli_report";
6
+ export interface QuotaProviderShape {
7
+ id: CanonicalQuotaProviderId;
8
+ autoSetup: QuotaProviderAutoSetup;
9
+ authentication: QuotaProviderAuthentication;
10
+ authFallbacks?: QuotaProviderAuthFallback[];
11
+ quota: QuotaProviderQuotaSource;
12
+ notes?: string;
13
+ }
14
+ export type QuotaProviderRuntimeIds = Readonly<Record<CanonicalQuotaProviderId, readonly string[]>>;
1
15
  export declare const QUOTA_PROVIDER_LABELS: Readonly<Record<string, string>>;
2
16
  export declare const QUOTA_PROVIDER_ID_SYNONYMS: Readonly<Record<string, string>>;
17
+ export declare const QUOTA_PROVIDER_RUNTIME_IDS: QuotaProviderRuntimeIds;
18
+ export declare const QUOTA_PROVIDER_SHAPES: readonly QuotaProviderShape[];
3
19
  export declare function normalizeQuotaProviderId(id: string): string;
20
+ export declare function getQuotaProviderShape(id: string): QuotaProviderShape | undefined;
4
21
  export declare function getQuotaProviderDisplayLabel(id: string): string;
22
+ export declare function getQuotaProviderRuntimeIds(id: string): readonly string[];
5
23
  //# sourceMappingURL=provider-metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAalE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAavE,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/D"}
1
+ {"version":3,"file":"provider-metadata.d.ts","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,wBAAwB,GAChC,WAAW,GACX,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,qBAAqB,GACrB,UAAU,GACV,QAAQ,GACR,oBAAoB,GACpB,KAAK,GACL,SAAS,GACT,qBAAqB,GACrB,aAAa,CAAC;AAElB,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAE7E,MAAM,MAAM,2BAA2B,GACnC,2BAA2B,GAC3B,uBAAuB,GACvB,4BAA4B,GAC5B,gBAAgB,GAChB,qBAAqB,GACrB,YAAY,CAAC;AAEjB,MAAM,MAAM,yBAAyB,GAAG,aAAa,GAAG,wBAAwB,CAAC;AAEjF,MAAM,MAAM,wBAAwB,GAChC,YAAY,GACZ,kBAAkB,GAClB,0BAA0B,GAC1B,kBAAkB,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,wBAAwB,CAAC;IAC7B,SAAS,EAAE,sBAAsB,CAAC;IAClC,cAAc,EAAE,2BAA2B,CAAC;IAC5C,aAAa,CAAC,EAAE,yBAAyB,EAAE,CAAC;IAC5C,KAAK,EAAE,wBAAwB,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC,MAAM,CAAC,wBAAwB,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC,CAAC;AAEpG,eAAO,MAAM,qBAAqB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAclE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcvE,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,uBAcxC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,SAAS,kBAAkB,EAwF9D,CAAC;AAMF,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAGhF;AAED,wBAAgB,4BAA4B,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAG/D;AAED,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAOxE"}
@@ -11,6 +11,7 @@ export const QUOTA_PROVIDER_LABELS = {
11
11
  zai: "Z.ai",
12
12
  nanogpt: "NanoGPT",
13
13
  "minimax-coding-plan": "MiniMax Coding Plan",
14
+ "opencode-go": "OpenCode Go",
14
15
  };
15
16
  export const QUOTA_PROVIDER_ID_SYNONYMS = {
16
17
  "github-copilot": "copilot",
@@ -25,12 +26,130 @@ export const QUOTA_PROVIDER_ID_SYNONYMS = {
25
26
  alibaba: "alibaba-coding-plan",
26
27
  "nano-gpt": "nanogpt",
27
28
  minimax: "minimax-coding-plan",
29
+ "opencode-go-subscription": "opencode-go",
28
30
  };
31
+ export const QUOTA_PROVIDER_RUNTIME_IDS = {
32
+ anthropic: ["anthropic"],
33
+ copilot: ["copilot", "github-copilot", "copilot-chat", "github-copilot-chat"],
34
+ openai: ["openai", "chatgpt", "codex"],
35
+ cursor: ["cursor", "cursor-acp"],
36
+ "qwen-code": ["qwen-code"],
37
+ "alibaba-coding-plan": ["alibaba-coding-plan"],
38
+ firmware: ["firmware", "firmware-ai"],
39
+ chutes: ["chutes", "chutes-ai"],
40
+ "google-antigravity": ["google-antigravity", "google", "antigravity"],
41
+ zai: ["zai", "glm", "zai-coding-plan"],
42
+ nanogpt: ["nanogpt", "nano-gpt"],
43
+ "minimax-coding-plan": ["minimax-coding-plan", "minimax"],
44
+ "opencode-go": ["opencode-go"],
45
+ };
46
+ export const QUOTA_PROVIDER_SHAPES = [
47
+ {
48
+ id: "anthropic",
49
+ autoSetup: "needs_quick_setup",
50
+ authentication: "local_cli_auth",
51
+ quota: "local_cli_report",
52
+ },
53
+ {
54
+ id: "copilot",
55
+ autoSetup: "usually",
56
+ authentication: "github_oauth_or_pat",
57
+ quota: "remote_api",
58
+ notes: "OAuth for personal flow; PAT for managed billing",
59
+ },
60
+ {
61
+ id: "openai",
62
+ autoSetup: "yes",
63
+ authentication: "opencode_auth_oauth_token",
64
+ quota: "remote_api",
65
+ },
66
+ {
67
+ id: "cursor",
68
+ autoSetup: "needs_quick_setup",
69
+ authentication: "companion_auth_oauth_token",
70
+ quota: "local_runtime_accounting",
71
+ notes: "companion runtime/plugin integration plus local usage accounting",
72
+ },
73
+ {
74
+ id: "qwen-code",
75
+ autoSetup: "needs_quick_setup",
76
+ authentication: "companion_auth_oauth_token",
77
+ quota: "local_estimation",
78
+ },
79
+ {
80
+ id: "alibaba-coding-plan",
81
+ autoSetup: "yes",
82
+ authentication: "opencode_auth_api_key",
83
+ authFallbacks: ["env_api_key", "global_opencode_config"],
84
+ quota: "local_estimation",
85
+ },
86
+ {
87
+ id: "firmware",
88
+ autoSetup: "usually",
89
+ authentication: "opencode_auth_api_key",
90
+ authFallbacks: ["env_api_key", "global_opencode_config"],
91
+ quota: "remote_api",
92
+ },
93
+ {
94
+ id: "chutes",
95
+ autoSetup: "usually",
96
+ authentication: "opencode_auth_api_key",
97
+ authFallbacks: ["env_api_key", "global_opencode_config"],
98
+ quota: "remote_api",
99
+ },
100
+ {
101
+ id: "google-antigravity",
102
+ autoSetup: "needs_quick_setup",
103
+ authentication: "companion_auth_oauth_token",
104
+ quota: "remote_api",
105
+ },
106
+ {
107
+ id: "zai",
108
+ autoSetup: "yes",
109
+ authentication: "opencode_auth_api_key",
110
+ authFallbacks: ["env_api_key", "global_opencode_config"],
111
+ quota: "remote_api",
112
+ },
113
+ {
114
+ id: "nanogpt",
115
+ autoSetup: "usually",
116
+ authentication: "opencode_auth_api_key",
117
+ authFallbacks: ["env_api_key", "global_opencode_config"],
118
+ quota: "remote_api",
119
+ },
120
+ {
121
+ id: "minimax-coding-plan",
122
+ autoSetup: "yes",
123
+ authentication: "opencode_auth_api_key",
124
+ authFallbacks: ["env_api_key", "global_opencode_config"],
125
+ quota: "remote_api",
126
+ },
127
+ {
128
+ id: "opencode-go",
129
+ autoSetup: "needs_quick_setup",
130
+ authentication: "state_only",
131
+ quota: "remote_api",
132
+ notes: "Scrapes the OpenCode Go dashboard; requires workspaceId and authCookie",
133
+ },
134
+ ];
135
+ const QUOTA_PROVIDER_SHAPES_BY_ID = Object.fromEntries(QUOTA_PROVIDER_SHAPES.map((shape) => [shape.id, shape]));
29
136
  export function normalizeQuotaProviderId(id) {
30
137
  const normalized = id.trim().toLowerCase();
31
138
  return QUOTA_PROVIDER_ID_SYNONYMS[normalized] ?? normalized;
32
139
  }
140
+ export function getQuotaProviderShape(id) {
141
+ const normalized = normalizeQuotaProviderId(id);
142
+ return QUOTA_PROVIDER_SHAPES_BY_ID[normalized];
143
+ }
33
144
  export function getQuotaProviderDisplayLabel(id) {
34
- return QUOTA_PROVIDER_LABELS[id] ?? id;
145
+ const normalized = normalizeQuotaProviderId(id);
146
+ return QUOTA_PROVIDER_LABELS[normalized] ?? id;
147
+ }
148
+ export function getQuotaProviderRuntimeIds(id) {
149
+ const shape = getQuotaProviderShape(id);
150
+ if (!shape) {
151
+ return [];
152
+ }
153
+ return [...new Set(QUOTA_PROVIDER_RUNTIME_IDS[shape.id])];
35
154
  }
36
155
  //# sourceMappingURL=provider-metadata.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider-metadata.js","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAqC;IACrE,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,QAAQ;IAC9B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,MAAM;IACnB,qBAAqB,EAAE,qBAAqB;IAC5C,GAAG,EAAE,MAAM;IACX,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,qBAAqB;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAChC,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,WAAW;IAC1B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,qBAAqB;CAC/B,CAAC;AAEF,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,OAAO,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"provider-metadata.js","sourceRoot":"","sources":["../../src/lib/provider-metadata.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAC,MAAM,qBAAqB,GAAqC;IACrE,SAAS,EAAE,WAAW;IACtB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,oBAAoB,EAAE,QAAQ;IAC9B,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,MAAM;IACnB,qBAAqB,EAAE,qBAAqB;IAC5C,GAAG,EAAE,MAAM;IACX,OAAO,EAAE,SAAS;IAClB,qBAAqB,EAAE,qBAAqB;IAC5C,aAAa,EAAE,aAAa;CAC7B,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAqC;IAC1E,gBAAgB,EAAE,SAAS;IAC3B,cAAc,EAAE,SAAS;IACzB,qBAAqB,EAAE,SAAS;IAChC,YAAY,EAAE,QAAQ;IACtB,aAAa,EAAE,QAAQ;IACvB,wBAAwB,EAAE,QAAQ;IAClC,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,WAAW;IAC1B,IAAI,EAAE,WAAW;IACjB,OAAO,EAAE,qBAAqB;IAC9B,UAAU,EAAE,SAAS;IACrB,OAAO,EAAE,qBAAqB;IAC9B,0BAA0B,EAAE,aAAa;CAC1C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAA4B;IACjE,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,OAAO,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,qBAAqB,CAAC;IAC7E,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC;IACtC,MAAM,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,WAAW,EAAE,CAAC,WAAW,CAAC;IAC1B,qBAAqB,EAAE,CAAC,qBAAqB,CAAC;IAC9C,QAAQ,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;IACrC,MAAM,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,CAAC,oBAAoB,EAAE,QAAQ,EAAE,aAAa,CAAC;IACrE,GAAG,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC;IACtC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;IAChC,qBAAqB,EAAE,CAAC,qBAAqB,EAAE,SAAS,CAAC;IACzD,aAAa,EAAE,CAAC,aAAa,CAAC;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAkC;IAClE;QACE,EAAE,EAAE,WAAW;QACf,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,gBAAgB;QAChC,KAAK,EAAE,kBAAkB;KAC1B;IACD;QACE,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,qBAAqB;QACrC,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,kDAAkD;KAC1D;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,2BAA2B;QAC3C,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,4BAA4B;QAC5C,KAAK,EAAE,0BAA0B;QACjC,KAAK,EAAE,kEAAkE;KAC1E;IACD;QACE,EAAE,EAAE,WAAW;QACf,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,4BAA4B;QAC5C,KAAK,EAAE,kBAAkB;KAC1B;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC;QACxD,KAAK,EAAE,kBAAkB;KAC1B;IACD;QACE,EAAE,EAAE,UAAU;QACd,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC;QACxD,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC;QACxD,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,4BAA4B;QAC5C,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,KAAK;QACT,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC;QACxD,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,SAAS;QACb,SAAS,EAAE,SAAS;QACpB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC;QACxD,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,qBAAqB;QACzB,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,uBAAuB;QACvC,aAAa,EAAE,CAAC,aAAa,EAAE,wBAAwB,CAAC;QACxD,KAAK,EAAE,YAAY;KACpB;IACD;QACE,EAAE,EAAE,aAAa;QACjB,SAAS,EAAE,mBAAmB;QAC9B,cAAc,EAAE,YAAY;QAC5B,KAAK,EAAE,YAAY;QACnB,KAAK,EAAE,wEAAwE;KAChF;CACF,CAAC;AAEF,MAAM,2BAA2B,GAE7B,MAAM,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAEhF,MAAM,UAAU,wBAAwB,CAAC,EAAU;IACjD,MAAM,UAAU,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,OAAO,0BAA0B,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,EAAU;IAC9C,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,CAA6B,CAAC;IAC5E,OAAO,2BAA2B,CAAC,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,EAAU;IACrD,MAAM,UAAU,GAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,qBAAqB,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EAAU;IACnD,MAAM,KAAK,GAAG,qBAAqB,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,0BAA0B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAC5D,CAAC"}
@@ -7,11 +7,6 @@
7
7
  * - Includes session token summary (input/output per model)
8
8
  */
9
9
  import type { QuotaToastEntry, QuotaToastError, SessionTokensData } from "./entries.js";
10
- export declare function formatQuotaCommandBody(params: {
11
- entries: QuotaToastEntry[];
12
- errors: QuotaToastError[];
13
- sessionTokens?: SessionTokensData;
14
- }): string;
15
10
  export declare function formatQuotaCommand(params: {
16
11
  entries: QuotaToastEntry[];
17
12
  errors: QuotaToastError[];
@@ -1 +1 @@
1
- {"version":3,"file":"quota-command-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAiCxF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,CAAC;CACnC,GAAG,MAAM,CA+DT;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAOT"}
1
+ {"version":3,"file":"quota-command-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAsGxF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IACzC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAOT"}
@@ -40,7 +40,7 @@ function getGroupedLeftText(entry) {
40
40
  const right = entry.right?.trim();
41
41
  return right ? `${label} ${right}` : label;
42
42
  }
43
- export function formatQuotaCommandBody(params) {
43
+ function formatQuotaCommandBody(params) {
44
44
  const entries = normalizeGroupedQuotaEntries(params.entries, "quota");
45
45
  const groupOrder = [];
46
46
  const groups = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"quota-command-format.js","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"quota-command-format.js","sourceRoot":"","sources":["../../src/lib/quota-command-format.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"quota-stats-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-stats-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAC;AAqBvF,KAAK,oBAAoB,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;AA8GpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,WAAW,CAAC,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,eAAe,EAAE,CAAC;KAC1B,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CAyRT"}
1
+ {"version":3,"file":"quota-stats-format.d.ts","sourceRoot":"","sources":["../../src/lib/quota-stats-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAgB,MAAM,kBAAkB,CAAC;AAcvF,KAAK,oBAAoB,GAAG,UAAU,GAAG,SAAS,GAAG,cAAc,CAAC;AA8GpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,eAAe,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mGAAmG;IACnG,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAClC,WAAW,CAAC,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,eAAe,EAAE,CAAC;KAC1B,CAAC;IACF,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,MAAM,CA2RT"}
@@ -1,5 +1,6 @@
1
1
  import { renderCommandHeading } from "./format-utils.js";
2
2
  import { renderMarkdownTable } from "./markdown-table.js";
3
+ import { emptyTokenBuckets, totalTokenBuckets } from "./token-buckets.js";
3
4
  /** Use markdown-conceal for proper TUI alignment (strips markdown syntax for width calc) */
4
5
  const TABLE_WIDTH_MODE = "markdown-conceal";
5
6
  function fmtUsd(n) {
@@ -7,21 +8,15 @@ function fmtUsd(n) {
7
8
  return "$0.00";
8
9
  return `$${n.toFixed(2)}`;
9
10
  }
10
- function emptyBuckets() {
11
- return { input: 0, output: 0, reasoning: 0, cache_read: 0, cache_write: 0 };
12
- }
13
- function totalTokens(t) {
14
- return t.input + t.output + t.reasoning + t.cache_read + t.cache_write;
15
- }
16
11
  function hasRenderableSessionUsage(row) {
17
- return totalTokens(row.tokens) > 0 || row.costUsd > 0;
12
+ return totalTokenBuckets(row.tokens) > 0 || row.costUsd > 0;
18
13
  }
19
14
  function appendSessionRow(sessionRows, row, current = "") {
20
15
  sessionRows.push([
21
16
  current,
22
17
  row.sessionID,
23
18
  fmtUsd(row.costUsd),
24
- fmtCompact(totalTokens(row.tokens)),
19
+ fmtCompact(totalTokenBuckets(row.tokens)),
25
20
  fmtCompact(row.messageCount),
26
21
  truncateTitle(row.title),
27
22
  ]);
@@ -142,7 +137,9 @@ export function formatQuotaStatsReport(params) {
142
137
  if (sessionTreeMode && !sessionTree) {
143
138
  throw new Error("formatQuotaStatsReport requires sessionTree for session_tree reports");
144
139
  }
145
- const combinedTokens = totalTokens(r.totals.priced) + totalTokens(r.totals.unknown) + totalTokens(r.totals.unpriced);
140
+ const combinedTokens = totalTokenBuckets(r.totals.priced) +
141
+ totalTokenBuckets(r.totals.unknown) +
142
+ totalTokenBuckets(r.totals.unpriced);
146
143
  const lines = [];
147
144
  lines.push(renderCommandHeading({
148
145
  title: params.title,
@@ -239,7 +236,7 @@ export function formatQuotaStatsReport(params) {
239
236
  ];
240
237
  if (hasAnyReasoning)
241
238
  out.push(fmtCompact(t.reasoning));
242
- out.push(fmtCompact(totalTokens(t)), fmtUsd(row.costUsd));
239
+ out.push(fmtCompact(totalTokenBuckets(t)), fmtUsd(row.costUsd));
243
240
  rows.push(out);
244
241
  }
245
242
  // blank separator row between source groups
@@ -265,7 +262,7 @@ export function formatQuotaStatsReport(params) {
265
262
  node.parentID ?? "-",
266
263
  node.sessionID,
267
264
  fmtUsd(usage?.costUsd ?? 0),
268
- fmtCompact(totalTokens(usage?.tokens ?? emptyBuckets())),
265
+ fmtCompact(totalTokenBuckets(usage?.tokens ?? emptyTokenBuckets())),
269
266
  fmtCompact(usage?.messageCount ?? 0),
270
267
  truncateTitle(node.title ?? usage?.title),
271
268
  ];
@@ -337,7 +334,7 @@ export function formatQuotaStatsReport(params) {
337
334
  u.key.sourceModelID,
338
335
  mapped,
339
336
  u.key.reason,
340
- fmtCompact(totalTokens(u.tokens)),
337
+ fmtCompact(totalTokenBuckets(u.tokens)),
341
338
  fmtCompact(u.messageCount),
342
339
  ];
343
340
  }),
@@ -367,7 +364,7 @@ export function formatQuotaStatsReport(params) {
367
364
  normalizeSourceName(u.key.sourceProviderID),
368
365
  u.key.sourceModelID,
369
366
  mapped,
370
- fmtCompact(totalTokens(u.tokens)),
367
+ fmtCompact(totalTokenBuckets(u.tokens)),
371
368
  fmtCompact(u.messageCount),
372
369
  ];
373
370
  }),