@thelioo/opencode-balancer 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/INSTALL.txt +16 -7
  2. package/README.md +24 -45
  3. package/dist/core/accounts.d.ts +14 -0
  4. package/dist/core/accounts.js +260 -0
  5. package/dist/core/accounts.js.map +1 -0
  6. package/dist/core/database.d.ts +4 -0
  7. package/dist/core/database.js +69 -0
  8. package/dist/core/database.js.map +1 -0
  9. package/dist/core/events.d.ts +18 -0
  10. package/dist/core/events.js +39 -0
  11. package/dist/core/events.js.map +1 -0
  12. package/dist/core/native-auth-suppression.d.ts +3 -0
  13. package/dist/core/native-auth-suppression.js +19 -0
  14. package/dist/core/native-auth-suppression.js.map +1 -0
  15. package/dist/core/native-connect.d.ts +4 -0
  16. package/dist/core/native-connect.js +19 -0
  17. package/dist/core/native-connect.js.map +1 -0
  18. package/dist/core/path.d.ts +4 -0
  19. package/dist/core/path.js +26 -0
  20. package/dist/core/path.js.map +1 -0
  21. package/dist/core/pending.d.ts +9 -0
  22. package/dist/core/pending.js +237 -0
  23. package/dist/core/pending.js.map +1 -0
  24. package/dist/core/priority.d.ts +20 -0
  25. package/dist/core/priority.js +120 -0
  26. package/dist/core/priority.js.map +1 -0
  27. package/dist/core/schema.d.ts +2 -0
  28. package/dist/core/schema.js +265 -0
  29. package/dist/core/schema.js.map +1 -0
  30. package/dist/core/time.d.ts +1 -0
  31. package/dist/core/time.js +4 -0
  32. package/dist/core/time.js.map +1 -0
  33. package/dist/core/types.d.ts +59 -0
  34. package/dist/core/types.js +2 -0
  35. package/dist/core/types.js.map +1 -0
  36. package/dist/core/usage/index.d.ts +4 -0
  37. package/dist/core/usage/index.js +16 -0
  38. package/dist/core/usage/index.js.map +1 -0
  39. package/dist/core/usage/providers/copilot.d.ts +2 -0
  40. package/dist/core/usage/providers/copilot.js +169 -0
  41. package/dist/core/usage/providers/copilot.js.map +1 -0
  42. package/dist/core/usage/providers/openai.d.ts +2 -0
  43. package/dist/core/usage/providers/openai.js +133 -0
  44. package/dist/core/usage/providers/openai.js.map +1 -0
  45. package/dist/core/usage/redact.d.ts +3 -0
  46. package/dist/core/usage/redact.js +67 -0
  47. package/dist/core/usage/redact.js.map +1 -0
  48. package/dist/core/usage/store.d.ts +4 -0
  49. package/dist/core/usage/store.js +31 -0
  50. package/dist/core/usage/store.js.map +1 -0
  51. package/dist/core/usage/types.d.ts +21 -0
  52. package/dist/core/usage/types.js +2 -0
  53. package/dist/core/usage/types.js.map +1 -0
  54. package/dist/index.d.ts +1 -37
  55. package/dist/index.js +1 -60
  56. package/dist/index.js.map +1 -1
  57. package/dist/server/auth-watcher.d.ts +31 -0
  58. package/dist/server/auth-watcher.js +227 -0
  59. package/dist/server/auth-watcher.js.map +1 -0
  60. package/dist/server/commands.d.ts +2 -0
  61. package/dist/server/commands.js +46 -0
  62. package/dist/server/commands.js.map +1 -0
  63. package/dist/server/fetch-patch.d.ts +3 -0
  64. package/dist/server/fetch-patch.js +118 -0
  65. package/dist/server/fetch-patch.js.map +1 -0
  66. package/dist/server/index.d.ts +8 -0
  67. package/dist/server/index.js +94 -0
  68. package/dist/server/index.js.map +1 -0
  69. package/dist/server/native.d.ts +6 -0
  70. package/dist/server/native.js +35 -0
  71. package/dist/server/native.js.map +1 -0
  72. package/dist/server/request-balancer.d.ts +16 -0
  73. package/dist/server/request-balancer.js +43 -0
  74. package/dist/server/request-balancer.js.map +1 -0
  75. package/dist/tui/actions.d.ts +41 -0
  76. package/dist/tui/actions.js +88 -0
  77. package/dist/tui/actions.js.map +1 -0
  78. package/dist/tui/actions.ts +140 -0
  79. package/dist/tui/balancer-bar-sync.d.ts +19 -0
  80. package/dist/tui/balancer-bar-sync.js +45 -0
  81. package/dist/tui/balancer-bar-sync.js.map +1 -0
  82. package/dist/tui/balancer-bar-sync.ts +56 -0
  83. package/dist/tui/components/alias-dialog.d.ts +4 -0
  84. package/dist/tui/components/alias-dialog.js +57 -0
  85. package/dist/tui/components/alias-dialog.js.map +1 -0
  86. package/dist/tui/components/alias-dialog.tsx +72 -0
  87. package/dist/tui/components/dashboard.d.ts +12 -0
  88. package/dist/tui/components/dashboard.js +201 -0
  89. package/dist/tui/components/dashboard.js.map +1 -0
  90. package/dist/tui/components/dashboard.tsx +393 -0
  91. package/dist/tui/components/priority-screen.d.ts +9 -0
  92. package/dist/tui/components/priority-screen.js +120 -0
  93. package/dist/tui/components/priority-screen.js.map +1 -0
  94. package/dist/tui/components/priority-screen.tsx +302 -0
  95. package/dist/tui/components/provider-model-dialog.d.ts +13 -0
  96. package/dist/tui/components/provider-model-dialog.js +45 -0
  97. package/dist/tui/components/provider-model-dialog.js.map +1 -0
  98. package/dist/tui/components/provider-model-dialog.tsx +71 -0
  99. package/dist/tui/components/rename-dialog.d.ts +4 -0
  100. package/dist/tui/components/rename-dialog.js +24 -0
  101. package/dist/tui/components/rename-dialog.js.map +1 -0
  102. package/dist/tui/components/rename-dialog.tsx +40 -0
  103. package/dist/tui/components/sidebar.d.ts +10 -0
  104. package/dist/tui/components/sidebar.js +27 -0
  105. package/dist/tui/components/sidebar.js.map +1 -0
  106. package/dist/tui/components/sidebar.tsx +97 -0
  107. package/dist/tui/components/status-indicator.d.ts +9 -0
  108. package/dist/tui/components/status-indicator.js +59 -0
  109. package/dist/tui/components/status-indicator.js.map +1 -0
  110. package/dist/tui/components/status-indicator.tsx +78 -0
  111. package/dist/tui/components/usage-bar.d.ts +8 -0
  112. package/dist/tui/components/usage-bar.js +7 -0
  113. package/dist/tui/components/usage-bar.js.map +1 -0
  114. package/dist/tui/components/usage-bar.tsx +13 -0
  115. package/dist/tui/components/usage-display.d.ts +10 -0
  116. package/dist/tui/components/usage-display.js +32 -0
  117. package/dist/tui/components/usage-display.js.map +1 -0
  118. package/dist/tui/components/usage-display.tsx +29 -0
  119. package/dist/tui/connect.d.ts +30 -0
  120. package/dist/tui/connect.js +73 -0
  121. package/dist/tui/connect.js.map +1 -0
  122. package/dist/tui/connect.ts +100 -0
  123. package/dist/tui/dashboard-keys.d.ts +45 -0
  124. package/dist/tui/dashboard-keys.js +44 -0
  125. package/dist/tui/dashboard-keys.js.map +1 -0
  126. package/dist/tui/dashboard-keys.ts +60 -0
  127. package/dist/tui/native-model-apply.d.ts +21 -0
  128. package/dist/tui/native-model-apply.js +53 -0
  129. package/dist/tui/native-model-apply.js.map +1 -0
  130. package/dist/tui/native-model-apply.ts +73 -0
  131. package/dist/tui/priority-keys.d.ts +40 -0
  132. package/dist/tui/priority-keys.js +38 -0
  133. package/dist/tui/priority-keys.js.map +1 -0
  134. package/dist/tui/priority-keys.ts +59 -0
  135. package/dist/tui/provider-models.d.ts +19 -0
  136. package/dist/tui/provider-models.js +17 -0
  137. package/dist/tui/provider-models.js.map +1 -0
  138. package/dist/tui/provider-models.ts +36 -0
  139. package/dist/tui/responsive.d.ts +9 -0
  140. package/dist/tui/responsive.js +13 -0
  141. package/dist/tui/responsive.js.map +1 -0
  142. package/dist/tui/responsive.ts +16 -0
  143. package/dist/tui/selection-colors.d.ts +10 -0
  144. package/dist/tui/selection-colors.js +38 -0
  145. package/dist/tui/selection-colors.js.map +1 -0
  146. package/dist/tui/selection-colors.ts +45 -0
  147. package/dist/tui/state.d.ts +14 -0
  148. package/dist/tui/state.js +46 -0
  149. package/dist/tui/state.js.map +1 -0
  150. package/dist/tui/state.ts +65 -0
  151. package/dist/tui/status-format.d.ts +15 -0
  152. package/dist/tui/status-format.js +17 -0
  153. package/dist/tui/status-format.js.map +1 -0
  154. package/dist/tui/status-format.ts +29 -0
  155. package/dist/tui/tui.d.ts +7 -0
  156. package/dist/tui/tui.js +120 -0
  157. package/dist/tui/tui.js.map +1 -0
  158. package/dist/tui/tui.tsx +142 -0
  159. package/dist/tui/usage-auto-refresh.d.ts +16 -0
  160. package/dist/tui/usage-auto-refresh.js +46 -0
  161. package/dist/tui/usage-auto-refresh.js.map +1 -0
  162. package/dist/tui/usage-auto-refresh.ts +64 -0
  163. package/dist/tui/usage-format.d.ts +2 -0
  164. package/dist/tui/usage-format.js +17 -0
  165. package/dist/tui/usage-format.js.map +1 -0
  166. package/dist/tui/usage-format.ts +14 -0
  167. package/package.json +10 -3
@@ -0,0 +1,133 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../../src/core/usage/providers/openai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
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;
@@ -0,0 +1,67 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../../src/core/usage/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
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;
@@ -0,0 +1,31 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,21 @@
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
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/usage/types.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -1,37 +1 @@
1
- declare const _default: ({ client }: import("@opencode-ai/plugin").PluginInput) => Promise<{
2
- config: (cfg: import("@opencode-ai/plugin").Config) => Promise<void>;
3
- "command.execute.before": (input: {
4
- command: string;
5
- sessionID: string;
6
- arguments: string;
7
- }, output: {
8
- parts: import("@opencode-ai/sdk").Part[];
9
- }) => Promise<void>;
10
- "experimental.chat.messages.transform": (_input: {}, output: {
11
- messages: {
12
- info: import("@opencode-ai/sdk").Message;
13
- parts: import("@opencode-ai/sdk").Part[];
14
- }[];
15
- }) => Promise<void>;
16
- "chat.headers": (input: {
17
- sessionID: string;
18
- agent: string;
19
- model: import("@opencode-ai/sdk").Model;
20
- provider: import("@opencode-ai/plugin").ProviderContext;
21
- message: import("@opencode-ai/sdk").UserMessage;
22
- }, output: {
23
- headers: Record<string, string>;
24
- }) => Promise<void>;
25
- tool: {
26
- balancer_command: {
27
- description: string;
28
- args: {
29
- command: import("zod").ZodString;
30
- };
31
- execute(args: {
32
- command: string;
33
- }, context: import("@opencode-ai/plugin").ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
34
- };
35
- };
36
- }>;
37
- export default _default;
1
+ export { serverPlugin as default } from "./server/index";
package/dist/index.js CHANGED
@@ -1,61 +1,2 @@
1
- import { tool } from "@opencode-ai/plugin";
2
- import { BALANCER_METADATA_KEY, INTERNAL_REQUEST_HEADER, getActiveAccount, setNativeAuth, showToast, state, } from "./balancer/core";
3
- import { startAuthWatcher } from "./balancer/auth-watcher";
4
- import { runBalancerCommand } from "./balancer/commands";
5
- import { installFetchPatch } from "./balancer/fetch-patch";
6
- export default (async ({ client }) => {
7
- await installFetchPatch(client);
8
- startAuthWatcher(client);
9
- return {
10
- config: async (cfg) => {
11
- cfg.command = {
12
- ...(cfg.command ?? {}),
13
- balancer: {
14
- description: "Manage multiple accounts per provider",
15
- template: "Run the internal balancer command with these arguments: $ARGUMENTS",
16
- },
17
- };
18
- },
19
- "command.execute.before": async (input, output) => {
20
- if (input.command !== "balancer")
21
- return;
22
- const result = await runBalancerCommand(client, input.arguments);
23
- output.parts.length = 0;
24
- await showToast(client, result, "info");
25
- throw new Error(`[balancer]\n${result}`);
26
- },
27
- "experimental.chat.messages.transform": async (_input, output) => {
28
- output.messages = output.messages.filter((message) => {
29
- return !message.parts.some((part) => {
30
- return part?.metadata?.[BALANCER_METADATA_KEY] === true;
31
- });
32
- });
33
- },
34
- "chat.headers": async (input, output) => {
35
- const providerID = input.model.providerID;
36
- const account = await getActiveAccount(providerID);
37
- if (!account)
38
- return;
39
- if (account.auth.type === "oauth")
40
- await setNativeAuth(client, providerID, account.auth);
41
- const requestID = crypto.randomUUID();
42
- state.pendingRequests.set(requestID, {
43
- providerID,
44
- account,
45
- });
46
- output.headers[INTERNAL_REQUEST_HEADER] = requestID;
47
- },
48
- tool: {
49
- balancer_command: tool({
50
- description: "Run an opencode account balancer command. Use for managing provider account aliases.",
51
- args: {
52
- command: tool.schema
53
- .string()
54
- .describe("Command, e.g. 'list', 'alias work', 'use anthropic personal'."),
55
- },
56
- execute: async (args) => runBalancerCommand(client, args.command),
57
- }),
58
- },
59
- };
60
- });
1
+ export { serverPlugin as default } from "./server/index";
61
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,31 @@
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 {};