@thelioo/opencode-balancer 0.1.6 → 0.2.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 (203) hide show
  1. package/INSTALL.txt +49 -21
  2. package/README.md +92 -50
  3. package/dist/core/accounts.ts +404 -0
  4. package/dist/core/database.ts +67 -0
  5. package/dist/core/events.ts +75 -0
  6. package/dist/core/native-auth-suppression.ts +36 -0
  7. package/dist/core/native-connect.ts +31 -0
  8. package/dist/core/path.ts +34 -0
  9. package/dist/core/pending.ts +351 -0
  10. package/dist/core/priority.ts +193 -0
  11. package/dist/core/schema.ts +439 -0
  12. package/dist/core/time.ts +3 -0
  13. package/dist/core/types.ts +72 -0
  14. package/dist/core/usage/index.ts +23 -0
  15. package/dist/core/usage/providers/copilot.ts +243 -0
  16. package/dist/core/usage/providers/openai.ts +179 -0
  17. package/dist/core/usage/redact.ts +80 -0
  18. package/dist/core/usage/store.ts +66 -0
  19. package/dist/core/usage/types.ts +24 -0
  20. package/dist/index.js +173 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/server/auth-watcher.ts +318 -0
  23. package/dist/server/commands.ts +58 -0
  24. package/dist/server/fetch-patch.ts +162 -0
  25. package/dist/server/index.ts +134 -0
  26. package/dist/server/native.ts +49 -0
  27. package/dist/server/request-balancer.ts +67 -0
  28. package/dist/tui/actions.ts +176 -108
  29. package/dist/tui/balancer-bar-sync.ts +55 -45
  30. package/dist/tui/components/alias-dialog.tsx +71 -56
  31. package/dist/tui/components/dashboard.tsx +530 -358
  32. package/dist/tui/components/priority-screen.tsx +389 -266
  33. package/dist/tui/components/provider-model-dialog.tsx +72 -55
  34. package/dist/tui/components/rename-dialog.tsx +35 -28
  35. package/dist/tui/components/sidebar.tsx +103 -79
  36. package/dist/tui/components/status-indicator.tsx +78 -59
  37. package/dist/tui/components/usage-bar.tsx +18 -7
  38. package/dist/tui/components/usage-display.tsx +32 -16
  39. package/dist/tui/connect.ts +105 -72
  40. package/dist/tui/dashboard-keys.ts +53 -41
  41. package/dist/tui/native-model-apply.ts +45 -36
  42. package/dist/tui/priority-keys.ts +44 -36
  43. package/dist/tui/provider-models.ts +32 -25
  44. package/dist/tui/responsive.ts +10 -7
  45. package/dist/tui/selected-account-bar-sync.ts +32 -0
  46. package/dist/tui/selection-colors.ts +38 -30
  47. package/dist/tui/state.ts +61 -44
  48. package/dist/tui/status-format.ts +24 -20
  49. package/dist/tui/tui.js +165 -120
  50. package/dist/tui/tui.js.map +1 -1
  51. package/dist/tui/tui.tsx +199 -117
  52. package/dist/tui/usage-auto-refresh.ts +52 -45
  53. package/dist/tui/usage-format.ts +9 -9
  54. package/package.json +61 -52
  55. package/dist/balancer/accounts.d.ts +0 -9
  56. package/dist/balancer/accounts.js +0 -102
  57. package/dist/balancer/accounts.js.map +0 -1
  58. package/dist/balancer/auth-watcher.d.ts +0 -1
  59. package/dist/balancer/auth-watcher.js +0 -30
  60. package/dist/balancer/auth-watcher.js.map +0 -1
  61. package/dist/balancer/commands.d.ts +0 -1
  62. package/dist/balancer/commands.js +0 -94
  63. package/dist/balancer/commands.js.map +0 -1
  64. package/dist/balancer/core.d.ts +0 -6
  65. package/dist/balancer/core.js +0 -7
  66. package/dist/balancer/core.js.map +0 -1
  67. package/dist/balancer/fetch-patch.d.ts +0 -1
  68. package/dist/balancer/fetch-patch.js +0 -110
  69. package/dist/balancer/fetch-patch.js.map +0 -1
  70. package/dist/balancer/http.d.ts +0 -40
  71. package/dist/balancer/http.js +0 -199
  72. package/dist/balancer/http.js.map +0 -1
  73. package/dist/balancer/native.d.ts +0 -3
  74. package/dist/balancer/native.js +0 -16
  75. package/dist/balancer/native.js.map +0 -1
  76. package/dist/balancer/state.d.ts +0 -14
  77. package/dist/balancer/state.js +0 -16
  78. package/dist/balancer/state.js.map +0 -1
  79. package/dist/balancer/storage.d.ts +0 -8
  80. package/dist/balancer/storage.js +0 -92
  81. package/dist/balancer/storage.js.map +0 -1
  82. package/dist/balancer/types.d.ts +0 -44
  83. package/dist/balancer/types.js +0 -2
  84. package/dist/balancer/types.js.map +0 -1
  85. package/dist/core/accounts.d.ts +0 -14
  86. package/dist/core/accounts.js +0 -260
  87. package/dist/core/accounts.js.map +0 -1
  88. package/dist/core/database.d.ts +0 -4
  89. package/dist/core/database.js +0 -69
  90. package/dist/core/database.js.map +0 -1
  91. package/dist/core/events.d.ts +0 -18
  92. package/dist/core/events.js +0 -39
  93. package/dist/core/events.js.map +0 -1
  94. package/dist/core/native-auth-suppression.d.ts +0 -3
  95. package/dist/core/native-auth-suppression.js +0 -19
  96. package/dist/core/native-auth-suppression.js.map +0 -1
  97. package/dist/core/native-connect.d.ts +0 -4
  98. package/dist/core/native-connect.js +0 -19
  99. package/dist/core/native-connect.js.map +0 -1
  100. package/dist/core/path.d.ts +0 -4
  101. package/dist/core/path.js +0 -26
  102. package/dist/core/path.js.map +0 -1
  103. package/dist/core/pending.d.ts +0 -9
  104. package/dist/core/pending.js +0 -237
  105. package/dist/core/pending.js.map +0 -1
  106. package/dist/core/priority.d.ts +0 -20
  107. package/dist/core/priority.js +0 -120
  108. package/dist/core/priority.js.map +0 -1
  109. package/dist/core/schema.d.ts +0 -2
  110. package/dist/core/schema.js +0 -265
  111. package/dist/core/schema.js.map +0 -1
  112. package/dist/core/time.d.ts +0 -1
  113. package/dist/core/time.js +0 -4
  114. package/dist/core/time.js.map +0 -1
  115. package/dist/core/types.d.ts +0 -59
  116. package/dist/core/types.js +0 -2
  117. package/dist/core/types.js.map +0 -1
  118. package/dist/core/usage/index.d.ts +0 -4
  119. package/dist/core/usage/index.js +0 -16
  120. package/dist/core/usage/index.js.map +0 -1
  121. package/dist/core/usage/providers/copilot.d.ts +0 -2
  122. package/dist/core/usage/providers/copilot.js +0 -169
  123. package/dist/core/usage/providers/copilot.js.map +0 -1
  124. package/dist/core/usage/providers/openai.d.ts +0 -2
  125. package/dist/core/usage/providers/openai.js +0 -133
  126. package/dist/core/usage/providers/openai.js.map +0 -1
  127. package/dist/core/usage/redact.d.ts +0 -3
  128. package/dist/core/usage/redact.js +0 -67
  129. package/dist/core/usage/redact.js.map +0 -1
  130. package/dist/core/usage/store.d.ts +0 -4
  131. package/dist/core/usage/store.js +0 -31
  132. package/dist/core/usage/store.js.map +0 -1
  133. package/dist/core/usage/types.d.ts +0 -21
  134. package/dist/core/usage/types.js +0 -2
  135. package/dist/core/usage/types.js.map +0 -1
  136. package/dist/index.d.ts +0 -5
  137. package/dist/server/auth-watcher.d.ts +0 -31
  138. package/dist/server/auth-watcher.js +0 -227
  139. package/dist/server/auth-watcher.js.map +0 -1
  140. package/dist/server/commands.d.ts +0 -2
  141. package/dist/server/commands.js +0 -46
  142. package/dist/server/commands.js.map +0 -1
  143. package/dist/server/fetch-patch.d.ts +0 -3
  144. package/dist/server/fetch-patch.js +0 -118
  145. package/dist/server/fetch-patch.js.map +0 -1
  146. package/dist/server/index.d.ts +0 -8
  147. package/dist/server/index.js +0 -94
  148. package/dist/server/index.js.map +0 -1
  149. package/dist/server/native.d.ts +0 -6
  150. package/dist/server/native.js +0 -35
  151. package/dist/server/native.js.map +0 -1
  152. package/dist/server/request-balancer.d.ts +0 -16
  153. package/dist/server/request-balancer.js +0 -43
  154. package/dist/server/request-balancer.js.map +0 -1
  155. package/dist/tui/actions.d.ts +0 -41
  156. package/dist/tui/actions.js +0 -88
  157. package/dist/tui/actions.js.map +0 -1
  158. package/dist/tui/balancer-bar-sync.d.ts +0 -19
  159. package/dist/tui/balancer-bar-sync.js +0 -45
  160. package/dist/tui/balancer-bar-sync.js.map +0 -1
  161. package/dist/tui/components/alias-dialog.d.ts +0 -4
  162. package/dist/tui/components/dashboard.d.ts +0 -12
  163. package/dist/tui/components/priority-screen.d.ts +0 -9
  164. package/dist/tui/components/provider-model-dialog.d.ts +0 -13
  165. package/dist/tui/components/rename-dialog.d.ts +0 -4
  166. package/dist/tui/components/sidebar.d.ts +0 -10
  167. package/dist/tui/components/status-indicator.d.ts +0 -9
  168. package/dist/tui/components/usage-bar.d.ts +0 -8
  169. package/dist/tui/components/usage-display.d.ts +0 -10
  170. package/dist/tui/connect.d.ts +0 -30
  171. package/dist/tui/connect.js +0 -73
  172. package/dist/tui/connect.js.map +0 -1
  173. package/dist/tui/dashboard-keys.d.ts +0 -45
  174. package/dist/tui/dashboard-keys.js +0 -44
  175. package/dist/tui/dashboard-keys.js.map +0 -1
  176. package/dist/tui/native-model-apply.d.ts +0 -21
  177. package/dist/tui/native-model-apply.js +0 -53
  178. package/dist/tui/native-model-apply.js.map +0 -1
  179. package/dist/tui/priority-keys.d.ts +0 -40
  180. package/dist/tui/priority-keys.js +0 -38
  181. package/dist/tui/priority-keys.js.map +0 -1
  182. package/dist/tui/provider-models.d.ts +0 -19
  183. package/dist/tui/provider-models.js +0 -17
  184. package/dist/tui/provider-models.js.map +0 -1
  185. package/dist/tui/responsive.d.ts +0 -9
  186. package/dist/tui/responsive.js +0 -13
  187. package/dist/tui/responsive.js.map +0 -1
  188. package/dist/tui/selection-colors.d.ts +0 -10
  189. package/dist/tui/selection-colors.js +0 -38
  190. package/dist/tui/selection-colors.js.map +0 -1
  191. package/dist/tui/state.d.ts +0 -14
  192. package/dist/tui/state.js +0 -46
  193. package/dist/tui/state.js.map +0 -1
  194. package/dist/tui/status-format.d.ts +0 -15
  195. package/dist/tui/status-format.js +0 -17
  196. package/dist/tui/status-format.js.map +0 -1
  197. package/dist/tui/tui.d.ts +0 -7
  198. package/dist/tui/usage-auto-refresh.d.ts +0 -16
  199. package/dist/tui/usage-auto-refresh.js +0 -46
  200. package/dist/tui/usage-auto-refresh.js.map +0 -1
  201. package/dist/tui/usage-format.d.ts +0 -2
  202. package/dist/tui/usage-format.js +0 -17
  203. package/dist/tui/usage-format.js.map +0 -1
@@ -1,133 +0,0 @@
1
- import { redactUsageError, redactUsagePayload } from "../redact";
2
- function unavailable(account, message, error) {
3
- return {
4
- providerID: account.providerID,
5
- alias: account.alias,
6
- fetchedAt: Date.now(),
7
- confidence: "unavailable",
8
- message,
9
- ...(error ? { error: redactUsageError(error, account) } : {}),
10
- };
11
- }
12
- function isRecord(value) {
13
- return typeof value === "object" && value !== null && !Array.isArray(value);
14
- }
15
- function asNumber(value) {
16
- return typeof value === "number" && Number.isFinite(value) ? value : undefined;
17
- }
18
- function decodeJwtPayload(token) {
19
- const payload = token.split(".")[1];
20
- if (!payload)
21
- return undefined;
22
- try {
23
- const normalized = payload.replace(/-/g, "+").replace(/_/g, "/");
24
- const padded = `${normalized}${"=".repeat((4 - (normalized.length % 4)) % 4)}`;
25
- const decoded = JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
26
- return isRecord(decoded) ? decoded : undefined;
27
- }
28
- catch {
29
- return undefined;
30
- }
31
- }
32
- function chatgptAccountID(account) {
33
- if (account.auth.type !== "oauth")
34
- return undefined;
35
- if (account.auth.accountId)
36
- return account.auth.accountId;
37
- const payload = decodeJwtPayload(account.auth.access);
38
- const authClaim = payload?.["https://api.openai.com/auth"];
39
- if (!isRecord(authClaim))
40
- return undefined;
41
- const accountID = authClaim.chatgpt_account_id;
42
- return typeof accountID === "string" && accountID.trim() ? accountID : undefined;
43
- }
44
- function planName(planType) {
45
- if (typeof planType !== "string" || !planType.trim())
46
- return undefined;
47
- const normalized = planType.trim().toLowerCase();
48
- const names = {
49
- plus: "ChatGPT Plus",
50
- pro: "ChatGPT Pro",
51
- team: "ChatGPT Team",
52
- enterprise: "ChatGPT Enterprise",
53
- };
54
- return names[normalized] ?? planType;
55
- }
56
- function resetAtMillis(value) {
57
- const timestamp = asNumber(value);
58
- if (timestamp === undefined || timestamp < 0)
59
- return undefined;
60
- return timestamp > 1_000_000_000_000 ? timestamp : timestamp * 1000;
61
- }
62
- async function refreshChatGPTUsage(account) {
63
- if (account.auth.type !== "oauth") {
64
- return unavailable(account, "OpenAI ChatGPT usage requires OAuth auth.");
65
- }
66
- try {
67
- const headers = {
68
- Authorization: `Bearer ${account.auth.access}`,
69
- "User-Agent": "opencode-balancer/0.1.3",
70
- };
71
- const accountID = chatgptAccountID(account);
72
- if (accountID)
73
- headers["ChatGPT-Account-Id"] = accountID;
74
- const response = await fetch("https://chatgpt.com/backend-api/wham/usage", { headers });
75
- if (!response.ok) {
76
- return unavailable(account, `OpenAI ChatGPT usage request failed with HTTP ${response.status}.`);
77
- }
78
- const body = (await response.json());
79
- const rateLimit = isRecord(body) && isRecord(body.rate_limit) ? body.rate_limit : undefined;
80
- const primary = rateLimit && isRecord(rateLimit.primary_window) ? rateLimit.primary_window : undefined;
81
- return {
82
- providerID: account.providerID,
83
- alias: account.alias,
84
- fetchedAt: Date.now(),
85
- confidence: "exact",
86
- planName: isRecord(body) ? planName(body.plan_type) : undefined,
87
- usedPercent: primary ? asNumber(primary.used_percent) : undefined,
88
- resetAt: primary ? resetAtMillis(primary.reset_at) : undefined,
89
- message: "OpenAI ChatGPT usage fetched.",
90
- rawRedacted: redactUsagePayload(body, account),
91
- };
92
- }
93
- catch (error) {
94
- return unavailable(account, "OpenAI ChatGPT usage request failed; exact usage is unavailable.", error instanceof Error ? error.message : String(error));
95
- }
96
- }
97
- export const openaiUsageService = {
98
- providerID: "openai",
99
- supports(providerID) {
100
- return providerID === "openai";
101
- },
102
- async refreshUsage(account) {
103
- if (account.auth.type !== "api") {
104
- return refreshChatGPTUsage(account);
105
- }
106
- const url = new URL("https://api.openai.com/v1/organization/usage/completions");
107
- url.searchParams.set("start_time", String(Math.floor((Date.now() - 24 * 60 * 60 * 1000) / 1000)));
108
- url.searchParams.set("bucket_width", "1d");
109
- try {
110
- const response = await fetch(url, {
111
- headers: {
112
- Authorization: `Bearer ${account.auth.key}`,
113
- },
114
- });
115
- if (!response.ok) {
116
- return unavailable(account, `OpenAI usage request failed with HTTP ${response.status}.`);
117
- }
118
- const body = await response.json();
119
- return {
120
- providerID: account.providerID,
121
- alias: account.alias,
122
- fetchedAt: Date.now(),
123
- confidence: "exact",
124
- message: "OpenAI organization usage fetched.",
125
- rawRedacted: redactUsagePayload(body, account),
126
- };
127
- }
128
- catch (error) {
129
- return unavailable(account, "OpenAI usage request failed; exact usage is unavailable.", error instanceof Error ? error.message : String(error));
130
- }
131
- },
132
- };
133
- //# sourceMappingURL=openai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../../src/core/usage/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { Account } from "../types";
2
- export declare function redactUsagePayload(value: unknown, account: Account): unknown;
3
- export declare function redactUsageError(error: string, account: Account): string;
@@ -1,67 +0,0 @@
1
- const REDACTED = "[redacted]";
2
- function accountSecretValues(account) {
3
- const values = new Set();
4
- if (account.auth.type === "api")
5
- values.add(account.auth.key);
6
- if (account.auth.type === "oauth") {
7
- values.add(account.auth.access);
8
- values.add(account.auth.refresh);
9
- }
10
- if (account.auth.type === "wellknown") {
11
- values.add(account.auth.key);
12
- values.add(account.auth.token);
13
- }
14
- values.delete("");
15
- return values;
16
- }
17
- function keyWords(key) {
18
- return key
19
- .replace(/([a-z0-9])([A-Z])/g, "$1 $2")
20
- .toLowerCase()
21
- .split(/[^a-z0-9]+/)
22
- .filter(Boolean);
23
- }
24
- function isCredentialKey(key) {
25
- const lower = key.toLowerCase();
26
- const compact = lower.replace(/[^a-z0-9]/g, "");
27
- if (lower.includes("api_key") ||
28
- compact.includes("apikey") ||
29
- lower.includes("access_token") ||
30
- compact.includes("accesstoken") ||
31
- lower.includes("refresh_token") ||
32
- compact.includes("refreshtoken") ||
33
- lower.includes("x-api-key") ||
34
- compact.includes("xapikey") ||
35
- lower.includes("authorization")) {
36
- return true;
37
- }
38
- const words = keyWords(key);
39
- return ["token", "key", "secret", "password"].some((credential) => lower === credential || words.includes(credential));
40
- }
41
- export function redactUsagePayload(value, account) {
42
- return redactValue(value, accountSecretValues(account));
43
- }
44
- export function redactUsageError(error, account) {
45
- return redactString(error, accountSecretValues(account));
46
- }
47
- function redactString(value, secrets) {
48
- let redacted = value;
49
- for (const secret of [...secrets].sort((a, b) => b.length - a.length)) {
50
- redacted = redacted.split(secret).join(REDACTED);
51
- }
52
- return redacted;
53
- }
54
- function redactValue(value, secrets) {
55
- if (typeof value === "string")
56
- return redactString(value, secrets);
57
- if (!value || typeof value !== "object")
58
- return value;
59
- if (Array.isArray(value))
60
- return value.map((item) => redactValue(item, secrets));
61
- const redacted = {};
62
- for (const [key, child] of Object.entries(value)) {
63
- redacted[redactString(key, secrets)] = isCredentialKey(key) ? REDACTED : redactValue(child, secrets);
64
- }
65
- return redacted;
66
- }
67
- //# sourceMappingURL=redact.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/core/usage/redact.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { Database } from "bun:sqlite";
2
- import type { ProviderUsageSnapshot } from "./types";
3
- export declare function saveUsageSnapshot(db: Database, snapshot: ProviderUsageSnapshot): void;
4
- export declare function getUsageSnapshot(db: Database, providerID: string, alias: string): ProviderUsageSnapshot | undefined;
@@ -1,31 +0,0 @@
1
- export function saveUsageSnapshot(db, snapshot) {
2
- const { rawRedacted, ...normalizedSnapshot } = snapshot;
3
- const rawRedactedJSON = Object.hasOwn(snapshot, "rawRedacted") ? JSON.stringify(rawRedacted) : null;
4
- db.query(`INSERT INTO usage_snapshots (
5
- provider_id, alias, fetched_at, confidence, normalized_json, raw_redacted_json, error
6
- ) VALUES (?, ?, ?, ?, ?, ?, ?)
7
- ON CONFLICT(provider_id, alias) DO UPDATE SET
8
- fetched_at = excluded.fetched_at,
9
- confidence = excluded.confidence,
10
- normalized_json = excluded.normalized_json,
11
- raw_redacted_json = excluded.raw_redacted_json,
12
- error = excluded.error`).run(snapshot.providerID, snapshot.alias, snapshot.fetchedAt, snapshot.confidence, JSON.stringify(normalizedSnapshot), rawRedactedJSON, snapshot.error ?? null);
13
- if (snapshot.confidence === "exact" && snapshot.usedPercent !== undefined && snapshot.usedPercent < 100) {
14
- db.query(`UPDATE accounts
15
- SET rate_limited_until = NULL,
16
- updated_at = ?
17
- WHERE provider_id = ? AND alias = ?`).run(snapshot.fetchedAt, snapshot.providerID, snapshot.alias);
18
- }
19
- }
20
- export function getUsageSnapshot(db, providerID, alias) {
21
- const row = db
22
- .query("SELECT normalized_json, raw_redacted_json FROM usage_snapshots WHERE provider_id = ? AND alias = ?")
23
- .get(providerID, alias);
24
- if (!row)
25
- return undefined;
26
- const snapshot = JSON.parse(row.normalized_json);
27
- if (row.raw_redacted_json !== null)
28
- snapshot.rawRedacted = JSON.parse(row.raw_redacted_json);
29
- return snapshot;
30
- }
31
- //# sourceMappingURL=store.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/usage/store.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,EAAY,EAAE,QAA+B;IAC3E,MAAM,EAAE,WAAW,EAAE,GAAG,kBAAkB,EAAE,GAAG,QAAQ,CAAC;IACxD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpG,EAAE,CAAC,KAAK,CACJ;;;;;;;;mCAQ2B,CAC9B,CAAC,GAAG,CACD,QAAQ,CAAC,UAAU,EACnB,QAAQ,CAAC,KAAK,EACd,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,UAAU,EACnB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAClC,eAAe,EACf,QAAQ,CAAC,KAAK,IAAI,IAAI,CACzB,CAAC;IAEF,IAAI,QAAQ,CAAC,UAAU,KAAK,OAAO,IAAI,QAAQ,CAAC,WAAW,KAAK,SAAS,IAAI,QAAQ,CAAC,WAAW,GAAG,GAAG,EAAE,CAAC;QACtG,EAAE,CAAC,KAAK,CACJ;;;iDAGqC,CACxC,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAAY,EAAE,UAAkB,EAAE,KAAa;IAC5E,MAAM,GAAG,GAAG,EAAE;SACT,KAAK,CACF,oGAAoG,CACvG;SACA,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAE3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAA0B,CAAC;IAC1E,IAAI,GAAG,CAAC,iBAAiB,KAAK,IAAI;QAAE,QAAQ,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC7F,OAAO,QAAQ,CAAC;AACpB,CAAC"}
@@ -1,21 +0,0 @@
1
- import type { Account } from "../types";
2
- export type UsageConfidence = "exact" | "estimated" | "unavailable";
3
- export type ProviderUsageSnapshot = {
4
- providerID: string;
5
- alias: string;
6
- fetchedAt: number;
7
- confidence: UsageConfidence;
8
- planName?: string;
9
- usedTokens?: number;
10
- remainingTokens?: number;
11
- usedPercent?: number;
12
- resetAt?: number;
13
- message: string;
14
- rawRedacted?: unknown;
15
- error?: string;
16
- };
17
- export type ProviderUsageService = {
18
- providerID: string;
19
- supports(providerID: string): boolean;
20
- refreshUsage(account: Account): Promise<ProviderUsageSnapshot>;
21
- };
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/usage/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- declare const _default: (({ client }: import("@opencode-ai/plugin").PluginInput) => Promise<import("@opencode-ai/plugin").Hooks>) & {
2
- id: string;
3
- tui: import("@opencode-ai/plugin/tui").TuiPlugin;
4
- };
5
- export default _default;
@@ -1,31 +0,0 @@
1
- import type { Database } from "bun:sqlite";
2
- import type { AuthInfo } from "../core/types";
3
- type NativeAuthReadResult = {
4
- ok: true;
5
- auth: Record<string, AuthInfo>;
6
- } | {
7
- ok: false;
8
- };
9
- type ToastVariant = "info" | "success" | "warning" | "error";
10
- type AuthWatcherOptions = {
11
- db: Database;
12
- client: any;
13
- initialSnapshot?: Record<string, AuthInfo>;
14
- readAuth: () => NativeAuthReadResult;
15
- showToast?: (client: any, message: string, variant: ToastVariant) => Promise<void>;
16
- createPending?: (db: Database, providerID: string, auth: AuthInfo, source: "auth-file") => unknown;
17
- isSuppressed?: (providerID: string) => boolean;
18
- };
19
- declare function parseNativeAuthContent(content: string): NativeAuthReadResult;
20
- export declare function readNativeAuth(): NativeAuthReadResult;
21
- export declare function captureUnknownNativeAuth(db: Database, providerID: string, auth: AuthInfo): boolean;
22
- declare function initialAuthSnapshot(db: Database, authByProvider: Record<string, AuthInfo>): Record<string, AuthInfo>;
23
- export declare function startAuthWatcher(client: any, db: Database): void;
24
- export declare const __testParseNativeAuthContent: typeof parseNativeAuthContent;
25
- export declare const __testInitialAuthSnapshot: typeof initialAuthSnapshot;
26
- export declare function __testCreateAuthWatcher(options: Omit<AuthWatcherOptions, "client"> & {
27
- client?: any;
28
- }): {
29
- poll(): Promise<void>;
30
- };
31
- export {};
@@ -1,227 +0,0 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { getActiveAccount, listAccounts, updateAccountAuth } from "../core/accounts";
3
- import { isNativeAuthCaptureSuppressed as isDbNativeAuthCaptureSuppressed } from "../core/native-auth-suppression";
4
- import { nativeAuthPath } from "../core/path";
5
- import { createPendingConnection } from "../core/pending";
6
- import { isNativeAuthCaptureSuppressed, showToast as defaultShowToast } from "./native";
7
- let started = false;
8
- function isRecord(value) {
9
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
10
- }
11
- function stringMetadata(value) {
12
- if (value === undefined)
13
- return { ok: true, metadata: undefined };
14
- if (!isRecord(value))
15
- return { ok: false };
16
- const metadata = {};
17
- for (const [key, entry] of Object.entries(value)) {
18
- if (typeof entry !== "string")
19
- return { ok: false };
20
- metadata[key] = entry;
21
- }
22
- return { ok: true, metadata };
23
- }
24
- function attachMetadata(auth, value) {
25
- const result = stringMetadata(value);
26
- if (!result.ok)
27
- return undefined;
28
- if (result.metadata)
29
- auth.metadata = result.metadata;
30
- return auth;
31
- }
32
- function parseAuthInfo(value) {
33
- if (!isRecord(value) || typeof value.type !== "string")
34
- return undefined;
35
- if (value.type === "api" && typeof value.key === "string") {
36
- return attachMetadata({ type: "api", key: value.key }, value.metadata);
37
- }
38
- if (value.type === "oauth" &&
39
- typeof value.refresh === "string" &&
40
- typeof value.access === "string" &&
41
- typeof value.expires === "number" &&
42
- Number.isFinite(value.expires)) {
43
- const auth = {
44
- type: "oauth",
45
- refresh: value.refresh,
46
- access: value.access,
47
- expires: value.expires,
48
- };
49
- if (typeof value.accountId === "string")
50
- auth.accountId = value.accountId;
51
- if (typeof value.enterpriseUrl === "string")
52
- auth.enterpriseUrl = value.enterpriseUrl;
53
- return attachMetadata(auth, value.metadata);
54
- }
55
- if (value.type === "wellknown" &&
56
- typeof value.key === "string" &&
57
- typeof value.token === "string") {
58
- return attachMetadata({ type: "wellknown", key: value.key, token: value.token }, value.metadata);
59
- }
60
- return undefined;
61
- }
62
- function parseNativeAuthContent(content) {
63
- let raw;
64
- try {
65
- raw = JSON.parse(content);
66
- }
67
- catch {
68
- return { ok: false };
69
- }
70
- if (!isRecord(raw))
71
- return { ok: false };
72
- const authByProvider = {};
73
- for (const [providerID, auth] of Object.entries(raw)) {
74
- const parsed = parseAuthInfo(auth);
75
- if (!parsed)
76
- return { ok: false };
77
- authByProvider[providerID] = parsed;
78
- }
79
- return { ok: true, auth: authByProvider };
80
- }
81
- export function readNativeAuth() {
82
- const authContent = Bun.env.OPENCODE_AUTH_CONTENT;
83
- if (authContent !== undefined)
84
- return parseNativeAuthContent(authContent);
85
- const path = nativeAuthPath();
86
- if (!existsSync(path))
87
- return { ok: true, auth: {} };
88
- try {
89
- return parseNativeAuthContent(readFileSync(path, "utf8"));
90
- }
91
- catch {
92
- return { ok: false };
93
- }
94
- }
95
- function authChanged(previous, current) {
96
- return JSON.stringify(previous ?? null) !== JSON.stringify(current);
97
- }
98
- function decodeJwtPayload(token) {
99
- const payload = token.split(".")[1];
100
- if (!payload)
101
- return undefined;
102
- try {
103
- const decoded = JSON.parse(Buffer.from(payload, "base64url").toString("utf8"));
104
- return isRecord(decoded) ? decoded : undefined;
105
- }
106
- catch {
107
- return undefined;
108
- }
109
- }
110
- function oauthAccountID(auth) {
111
- if (auth.accountId)
112
- return auth.accountId;
113
- const claim = decodeJwtPayload(auth.access)?.["https://api.openai.com/auth"];
114
- if (!isRecord(claim))
115
- return undefined;
116
- const accountID = claim.chatgpt_account_id;
117
- return typeof accountID === "string" && accountID.length > 0 ? accountID : undefined;
118
- }
119
- function sameSavedAuth(saved, current) {
120
- if (saved.type !== current.type)
121
- return false;
122
- if (saved.type === "api" && current.type === "api")
123
- return saved.key === current.key;
124
- if (saved.type === "wellknown" && current.type === "wellknown")
125
- return saved.key === current.key && saved.token === current.token;
126
- if (saved.type === "oauth" && current.type === "oauth") {
127
- const savedAccountID = oauthAccountID(saved);
128
- const currentAccountID = oauthAccountID(current);
129
- if (savedAccountID && currentAccountID)
130
- return savedAccountID === currentAccountID;
131
- return saved.refresh === current.refresh;
132
- }
133
- return false;
134
- }
135
- function saveKnownNativeAuth(db, providerID, auth) {
136
- const account = listAccounts(db, providerID).find((candidate) => sameSavedAuth(candidate.auth, auth));
137
- if (!account)
138
- return false;
139
- updateAccountAuth(db, providerID, account.alias, auth);
140
- return true;
141
- }
142
- export function captureUnknownNativeAuth(db, providerID, auth) {
143
- if (saveKnownNativeAuth(db, providerID, auth))
144
- return false;
145
- createPendingConnection(db, providerID, auth, "auth-file");
146
- return true;
147
- }
148
- function initialAuthSnapshot(db, authByProvider) {
149
- const snapshot = {};
150
- for (const [providerID, auth] of Object.entries(authByProvider)) {
151
- if (listAccounts(db, providerID).some((account) => sameSavedAuth(account.auth, auth))) {
152
- snapshot[providerID] = auth;
153
- }
154
- }
155
- return snapshot;
156
- }
157
- function createAuthWatcher(options) {
158
- let lastAuthSnapshot = options.initialSnapshot ?? {};
159
- let inFlight = false;
160
- const notify = options.showToast ?? defaultShowToast;
161
- const createPending = options.createPending ?? createPendingConnection;
162
- const isSuppressed = options.isSuppressed ?? ((providerID) => {
163
- return isNativeAuthCaptureSuppressed(providerID) || isDbNativeAuthCaptureSuppressed(options.db, providerID);
164
- });
165
- return {
166
- async poll() {
167
- if (inFlight)
168
- return;
169
- inFlight = true;
170
- try {
171
- const result = options.readAuth();
172
- if (!result.ok)
173
- return;
174
- const next = result.auth;
175
- const changed = [];
176
- for (const [providerID, auth] of Object.entries(next)) {
177
- if (isSuppressed(providerID)) {
178
- const active = getActiveAccount(options.db, providerID);
179
- if (active && sameSavedAuth(active.auth, auth))
180
- updateAccountAuth(options.db, providerID, active.alias, auth);
181
- lastAuthSnapshot[providerID] = auth;
182
- continue;
183
- }
184
- if (saveKnownNativeAuth(options.db, providerID, auth)) {
185
- lastAuthSnapshot[providerID] = auth;
186
- continue;
187
- }
188
- if (!authChanged(lastAuthSnapshot[providerID], auth))
189
- continue;
190
- changed.push([providerID, auth]);
191
- }
192
- for (const [providerID, auth] of changed) {
193
- createPending(options.db, providerID, auth, "auth-file");
194
- lastAuthSnapshot[providerID] = auth;
195
- await notify(options.client, `Balancer detected a ${providerID} connection. Save an alias from the TUI sidebar.`, "info");
196
- }
197
- for (const providerID of Object.keys(lastAuthSnapshot)) {
198
- if (!(providerID in next))
199
- delete lastAuthSnapshot[providerID];
200
- }
201
- }
202
- finally {
203
- inFlight = false;
204
- }
205
- },
206
- };
207
- }
208
- export function startAuthWatcher(client, db) {
209
- if (started)
210
- return;
211
- started = true;
212
- const initial = readNativeAuth();
213
- const watcher = createAuthWatcher({
214
- db,
215
- client,
216
- initialSnapshot: initial.ok ? initialAuthSnapshot(db, initial.auth) : {},
217
- readAuth: readNativeAuth,
218
- });
219
- const timer = setInterval(() => void watcher.poll(), 1_000);
220
- timer.unref?.();
221
- }
222
- export const __testParseNativeAuthContent = parseNativeAuthContent;
223
- export const __testInitialAuthSnapshot = initialAuthSnapshot;
224
- export function __testCreateAuthWatcher(options) {
225
- return createAuthWatcher({ ...options, client: options.client ?? {} });
226
- }
227
- //# sourceMappingURL=auth-watcher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-watcher.js","sourceRoot":"","sources":["../../src/server/auth-watcher.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { Database } from "bun:sqlite";
2
- export declare function runFallbackBalancerCommand(db: Database, raw: string): string;
@@ -1,46 +0,0 @@
1
- import { getActiveAccount, listAccounts, setActiveAccount } from "../core/accounts";
2
- import { listPendingConnections } from "../core/pending";
3
- function parseArgs(input) {
4
- return input.match(/(?:[^\s"]+|"[^"]*")+/g)?.map((x) => x.replace(/^"|"$/g, "")) ?? [];
5
- }
6
- export function runFallbackBalancerCommand(db, raw) {
7
- const [action = "help", ...args] = parseArgs(raw);
8
- if (["help", "--help", "-h"].includes(action)) {
9
- return [
10
- "Balancer is TUI-first. Use fallback commands only for compatibility or troubleshooting.",
11
- "Fallback commands: list, status, use <provider> <alias>, active <provider>.",
12
- ].join("\n");
13
- }
14
- if (action === "list") {
15
- const accounts = listAccounts(db);
16
- if (accounts.length === 0)
17
- return "No accounts saved.";
18
- return accounts.map((account) => `${account.providerID}/${account.alias}`).join("\n");
19
- }
20
- if (action === "status") {
21
- return `accounts=${listAccounts(db).length} pending=${listPendingConnections(db).length}`;
22
- }
23
- if (action === "use") {
24
- const [providerID, alias] = args;
25
- if (!providerID || !alias)
26
- return "Usage: /balancer use <provider> <alias>";
27
- try {
28
- const account = setActiveAccount(db, providerID, alias);
29
- return `Active account changed to ${providerID}/${account.alias}`;
30
- }
31
- catch (error) {
32
- return error instanceof Error ? error.message : "Account not found.";
33
- }
34
- }
35
- if (action === "active") {
36
- const [providerID] = args;
37
- if (!providerID)
38
- return "Usage: /balancer active <provider>";
39
- const account = getActiveAccount(db, providerID);
40
- if (!account)
41
- return "No active account for provider.";
42
- return `${providerID}/${account.alias}`;
43
- }
44
- return `Unknown command: ${action}. Use /balancer help.`;
45
- }
46
- //# sourceMappingURL=commands.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/server/commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,SAAS,SAAS,CAAC,KAAa;IAC5B,OAAO,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,EAAY,EAAE,GAAW;IAChE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,OAAO;YACH,yFAAyF;YACzF,6EAA6E;SAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;QAClC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,oBAAoB,CAAC;QACvD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,YAAY,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,YAAY,sBAAsB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC9F,CAAC;IAED,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK;YAAE,OAAO,yCAAyC,CAAC;QAC5E,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,6BAA6B,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC;QACzE,CAAC;IACL,CAAC;IAED,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,UAAU;YAAE,OAAO,oCAAoC,CAAC;QAC7D,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO;YAAE,OAAO,iCAAiC,CAAC;QACvD,OAAO,GAAG,UAAU,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAC5C,CAAC;IAED,OAAO,oBAAoB,MAAM,uBAAuB,CAAC;AAC7D,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Database } from "bun:sqlite";
2
- export declare function __testResetFetchPatch(): void;
3
- export declare function installFetchPatch(db: Database, client: any): void;