@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.
- package/INSTALL.txt +49 -21
- package/README.md +92 -50
- package/dist/core/accounts.ts +404 -0
- package/dist/core/database.ts +67 -0
- package/dist/core/events.ts +75 -0
- package/dist/core/native-auth-suppression.ts +36 -0
- package/dist/core/native-connect.ts +31 -0
- package/dist/core/path.ts +34 -0
- package/dist/core/pending.ts +351 -0
- package/dist/core/priority.ts +193 -0
- package/dist/core/schema.ts +439 -0
- package/dist/core/time.ts +3 -0
- package/dist/core/types.ts +72 -0
- package/dist/core/usage/index.ts +23 -0
- package/dist/core/usage/providers/copilot.ts +243 -0
- package/dist/core/usage/providers/openai.ts +179 -0
- package/dist/core/usage/redact.ts +80 -0
- package/dist/core/usage/store.ts +66 -0
- package/dist/core/usage/types.ts +24 -0
- package/dist/index.js +173 -4
- package/dist/index.js.map +1 -1
- package/dist/server/auth-watcher.ts +318 -0
- package/dist/server/commands.ts +58 -0
- package/dist/server/fetch-patch.ts +162 -0
- package/dist/server/index.ts +134 -0
- package/dist/server/native.ts +49 -0
- package/dist/server/request-balancer.ts +67 -0
- package/dist/tui/actions.ts +176 -108
- package/dist/tui/balancer-bar-sync.ts +55 -45
- package/dist/tui/components/alias-dialog.tsx +71 -56
- package/dist/tui/components/dashboard.tsx +530 -358
- package/dist/tui/components/priority-screen.tsx +389 -266
- package/dist/tui/components/provider-model-dialog.tsx +72 -55
- package/dist/tui/components/rename-dialog.tsx +35 -28
- package/dist/tui/components/sidebar.tsx +103 -79
- package/dist/tui/components/status-indicator.tsx +78 -59
- package/dist/tui/components/usage-bar.tsx +18 -7
- package/dist/tui/components/usage-display.tsx +32 -16
- package/dist/tui/connect.ts +105 -72
- package/dist/tui/dashboard-keys.ts +53 -41
- package/dist/tui/native-model-apply.ts +45 -36
- package/dist/tui/priority-keys.ts +44 -36
- package/dist/tui/provider-models.ts +32 -25
- package/dist/tui/responsive.ts +10 -7
- package/dist/tui/selected-account-bar-sync.ts +32 -0
- package/dist/tui/selection-colors.ts +38 -30
- package/dist/tui/state.ts +61 -44
- package/dist/tui/status-format.ts +24 -20
- package/dist/tui/tui.js +165 -120
- package/dist/tui/tui.js.map +1 -1
- package/dist/tui/tui.tsx +199 -117
- package/dist/tui/usage-auto-refresh.ts +52 -45
- package/dist/tui/usage-format.ts +9 -9
- package/package.json +61 -52
- package/dist/balancer/accounts.d.ts +0 -9
- package/dist/balancer/accounts.js +0 -102
- package/dist/balancer/accounts.js.map +0 -1
- package/dist/balancer/auth-watcher.d.ts +0 -1
- package/dist/balancer/auth-watcher.js +0 -30
- package/dist/balancer/auth-watcher.js.map +0 -1
- package/dist/balancer/commands.d.ts +0 -1
- package/dist/balancer/commands.js +0 -94
- package/dist/balancer/commands.js.map +0 -1
- package/dist/balancer/core.d.ts +0 -6
- package/dist/balancer/core.js +0 -7
- package/dist/balancer/core.js.map +0 -1
- package/dist/balancer/fetch-patch.d.ts +0 -1
- package/dist/balancer/fetch-patch.js +0 -110
- package/dist/balancer/fetch-patch.js.map +0 -1
- package/dist/balancer/http.d.ts +0 -40
- package/dist/balancer/http.js +0 -199
- package/dist/balancer/http.js.map +0 -1
- package/dist/balancer/native.d.ts +0 -3
- package/dist/balancer/native.js +0 -16
- package/dist/balancer/native.js.map +0 -1
- package/dist/balancer/state.d.ts +0 -14
- package/dist/balancer/state.js +0 -16
- package/dist/balancer/state.js.map +0 -1
- package/dist/balancer/storage.d.ts +0 -8
- package/dist/balancer/storage.js +0 -92
- package/dist/balancer/storage.js.map +0 -1
- package/dist/balancer/types.d.ts +0 -44
- package/dist/balancer/types.js +0 -2
- package/dist/balancer/types.js.map +0 -1
- package/dist/core/accounts.d.ts +0 -14
- package/dist/core/accounts.js +0 -260
- package/dist/core/accounts.js.map +0 -1
- package/dist/core/database.d.ts +0 -4
- package/dist/core/database.js +0 -69
- package/dist/core/database.js.map +0 -1
- package/dist/core/events.d.ts +0 -18
- package/dist/core/events.js +0 -39
- package/dist/core/events.js.map +0 -1
- package/dist/core/native-auth-suppression.d.ts +0 -3
- package/dist/core/native-auth-suppression.js +0 -19
- package/dist/core/native-auth-suppression.js.map +0 -1
- package/dist/core/native-connect.d.ts +0 -4
- package/dist/core/native-connect.js +0 -19
- package/dist/core/native-connect.js.map +0 -1
- package/dist/core/path.d.ts +0 -4
- package/dist/core/path.js +0 -26
- package/dist/core/path.js.map +0 -1
- package/dist/core/pending.d.ts +0 -9
- package/dist/core/pending.js +0 -237
- package/dist/core/pending.js.map +0 -1
- package/dist/core/priority.d.ts +0 -20
- package/dist/core/priority.js +0 -120
- package/dist/core/priority.js.map +0 -1
- package/dist/core/schema.d.ts +0 -2
- package/dist/core/schema.js +0 -265
- package/dist/core/schema.js.map +0 -1
- package/dist/core/time.d.ts +0 -1
- package/dist/core/time.js +0 -4
- package/dist/core/time.js.map +0 -1
- package/dist/core/types.d.ts +0 -59
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +0 -1
- package/dist/core/usage/index.d.ts +0 -4
- package/dist/core/usage/index.js +0 -16
- package/dist/core/usage/index.js.map +0 -1
- package/dist/core/usage/providers/copilot.d.ts +0 -2
- package/dist/core/usage/providers/copilot.js +0 -169
- package/dist/core/usage/providers/copilot.js.map +0 -1
- package/dist/core/usage/providers/openai.d.ts +0 -2
- package/dist/core/usage/providers/openai.js +0 -133
- package/dist/core/usage/providers/openai.js.map +0 -1
- package/dist/core/usage/redact.d.ts +0 -3
- package/dist/core/usage/redact.js +0 -67
- package/dist/core/usage/redact.js.map +0 -1
- package/dist/core/usage/store.d.ts +0 -4
- package/dist/core/usage/store.js +0 -31
- package/dist/core/usage/store.js.map +0 -1
- package/dist/core/usage/types.d.ts +0 -21
- package/dist/core/usage/types.js +0 -2
- package/dist/core/usage/types.js.map +0 -1
- package/dist/index.d.ts +0 -5
- package/dist/server/auth-watcher.d.ts +0 -31
- package/dist/server/auth-watcher.js +0 -227
- package/dist/server/auth-watcher.js.map +0 -1
- package/dist/server/commands.d.ts +0 -2
- package/dist/server/commands.js +0 -46
- package/dist/server/commands.js.map +0 -1
- package/dist/server/fetch-patch.d.ts +0 -3
- package/dist/server/fetch-patch.js +0 -118
- package/dist/server/fetch-patch.js.map +0 -1
- package/dist/server/index.d.ts +0 -8
- package/dist/server/index.js +0 -94
- package/dist/server/index.js.map +0 -1
- package/dist/server/native.d.ts +0 -6
- package/dist/server/native.js +0 -35
- package/dist/server/native.js.map +0 -1
- package/dist/server/request-balancer.d.ts +0 -16
- package/dist/server/request-balancer.js +0 -43
- package/dist/server/request-balancer.js.map +0 -1
- package/dist/tui/actions.d.ts +0 -41
- package/dist/tui/actions.js +0 -88
- package/dist/tui/actions.js.map +0 -1
- package/dist/tui/balancer-bar-sync.d.ts +0 -19
- package/dist/tui/balancer-bar-sync.js +0 -45
- package/dist/tui/balancer-bar-sync.js.map +0 -1
- package/dist/tui/components/alias-dialog.d.ts +0 -4
- package/dist/tui/components/dashboard.d.ts +0 -12
- package/dist/tui/components/priority-screen.d.ts +0 -9
- package/dist/tui/components/provider-model-dialog.d.ts +0 -13
- package/dist/tui/components/rename-dialog.d.ts +0 -4
- package/dist/tui/components/sidebar.d.ts +0 -10
- package/dist/tui/components/status-indicator.d.ts +0 -9
- package/dist/tui/components/usage-bar.d.ts +0 -8
- package/dist/tui/components/usage-display.d.ts +0 -10
- package/dist/tui/connect.d.ts +0 -30
- package/dist/tui/connect.js +0 -73
- package/dist/tui/connect.js.map +0 -1
- package/dist/tui/dashboard-keys.d.ts +0 -45
- package/dist/tui/dashboard-keys.js +0 -44
- package/dist/tui/dashboard-keys.js.map +0 -1
- package/dist/tui/native-model-apply.d.ts +0 -21
- package/dist/tui/native-model-apply.js +0 -53
- package/dist/tui/native-model-apply.js.map +0 -1
- package/dist/tui/priority-keys.d.ts +0 -40
- package/dist/tui/priority-keys.js +0 -38
- package/dist/tui/priority-keys.js.map +0 -1
- package/dist/tui/provider-models.d.ts +0 -19
- package/dist/tui/provider-models.js +0 -17
- package/dist/tui/provider-models.js.map +0 -1
- package/dist/tui/responsive.d.ts +0 -9
- package/dist/tui/responsive.js +0 -13
- package/dist/tui/responsive.js.map +0 -1
- package/dist/tui/selection-colors.d.ts +0 -10
- package/dist/tui/selection-colors.js +0 -38
- package/dist/tui/selection-colors.js.map +0 -1
- package/dist/tui/state.d.ts +0 -14
- package/dist/tui/state.js +0 -46
- package/dist/tui/state.js.map +0 -1
- package/dist/tui/status-format.d.ts +0 -15
- package/dist/tui/status-format.js +0 -17
- package/dist/tui/status-format.js.map +0 -1
- package/dist/tui/tui.d.ts +0 -7
- package/dist/tui/usage-auto-refresh.d.ts +0 -16
- package/dist/tui/usage-auto-refresh.js +0 -46
- package/dist/tui/usage-auto-refresh.js.map +0 -1
- package/dist/tui/usage-format.d.ts +0 -2
- package/dist/tui/usage-format.js +0 -17
- package/dist/tui/usage-format.js.map +0 -1
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { setActiveAccount } from "../core/accounts";
|
|
2
|
-
import { getBalancingEnabled } from "../core/priority";
|
|
3
|
-
import { showToast, setNativeAuth } from "./native";
|
|
4
|
-
import { chooseFailoverAccount, INTERNAL_REQUEST_HEADER, markRateLimited, RETRYABLE_STATUS, takePendingRequest, } from "./request-balancer";
|
|
5
|
-
let fetchPatched = false;
|
|
6
|
-
function headerEntries(headers) {
|
|
7
|
-
return Array.from(headers.entries()).map(([key, value]) => [key.toLowerCase(), value]);
|
|
8
|
-
}
|
|
9
|
-
function applyAuthToHeaders(headers, account, options = {}) {
|
|
10
|
-
const auth = account.auth;
|
|
11
|
-
const entries = headerEntries(headers);
|
|
12
|
-
if (auth.type === "oauth") {
|
|
13
|
-
if (options.preserveExistingOAuth && headers.has("authorization"))
|
|
14
|
-
return;
|
|
15
|
-
headers.set("authorization", `Bearer ${auth.access}`);
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
if (auth.type === "wellknown") {
|
|
19
|
-
if (headers.has("authorization")) {
|
|
20
|
-
headers.set("authorization", `Bearer ${auth.token}`);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
headers.set(auth.key, auth.token);
|
|
24
|
-
}
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const authHeaderNames = [
|
|
28
|
-
"authorization",
|
|
29
|
-
"x-api-key",
|
|
30
|
-
"api-key",
|
|
31
|
-
"x-goog-api-key",
|
|
32
|
-
"x-stainless-api-key",
|
|
33
|
-
"anthropic-api-key",
|
|
34
|
-
"cohere-api-key",
|
|
35
|
-
];
|
|
36
|
-
let changed = false;
|
|
37
|
-
for (const name of authHeaderNames) {
|
|
38
|
-
const current = entries.find(([key]) => key === name)?.[1];
|
|
39
|
-
if (!current)
|
|
40
|
-
continue;
|
|
41
|
-
headers.set(name, name === "authorization" && current.toLowerCase().startsWith("bearer ")
|
|
42
|
-
? `Bearer ${auth.key}`
|
|
43
|
-
: auth.key);
|
|
44
|
-
changed = true;
|
|
45
|
-
}
|
|
46
|
-
if (!changed)
|
|
47
|
-
headers.set("authorization", `Bearer ${auth.key}`);
|
|
48
|
-
}
|
|
49
|
-
export function __testResetFetchPatch() {
|
|
50
|
-
fetchPatched = false;
|
|
51
|
-
}
|
|
52
|
-
function headersFrom(input, init) {
|
|
53
|
-
if (init?.headers)
|
|
54
|
-
return new Headers(init.headers);
|
|
55
|
-
if (typeof Request !== "undefined" && input instanceof Request) {
|
|
56
|
-
return new Headers(input.headers);
|
|
57
|
-
}
|
|
58
|
-
return new Headers();
|
|
59
|
-
}
|
|
60
|
-
function cloneRequestInput(input, init, headers) {
|
|
61
|
-
if (typeof Request !== "undefined" && input instanceof Request) {
|
|
62
|
-
return [new Request(input, { ...init, headers }), undefined];
|
|
63
|
-
}
|
|
64
|
-
return [input, { ...init, headers }];
|
|
65
|
-
}
|
|
66
|
-
function retryAfterMs(response) {
|
|
67
|
-
const retryAfter = response.headers.get("retry-after");
|
|
68
|
-
if (!retryAfter)
|
|
69
|
-
return 60_000;
|
|
70
|
-
const seconds = Number(retryAfter);
|
|
71
|
-
if (Number.isFinite(seconds))
|
|
72
|
-
return Math.max(1_000, seconds * 1000);
|
|
73
|
-
const date = Date.parse(retryAfter);
|
|
74
|
-
if (Number.isFinite(date))
|
|
75
|
-
return Math.max(1_000, date - Date.now());
|
|
76
|
-
return 60_000;
|
|
77
|
-
}
|
|
78
|
-
export function installFetchPatch(db, client) {
|
|
79
|
-
if (fetchPatched)
|
|
80
|
-
return;
|
|
81
|
-
fetchPatched = true;
|
|
82
|
-
const originalFetch = globalThis.fetch.bind(globalThis);
|
|
83
|
-
globalThis.fetch = (async (input, init) => {
|
|
84
|
-
const headers = headersFrom(input, init);
|
|
85
|
-
const requestID = headers.get(INTERNAL_REQUEST_HEADER);
|
|
86
|
-
if (!requestID)
|
|
87
|
-
return originalFetch(input, init);
|
|
88
|
-
const pending = takePendingRequest(requestID);
|
|
89
|
-
headers.delete(INTERNAL_REQUEST_HEADER);
|
|
90
|
-
if (!pending?.account) {
|
|
91
|
-
const [nextInput, nextInit] = cloneRequestInput(input, init, headers);
|
|
92
|
-
return originalFetch(nextInput, nextInit);
|
|
93
|
-
}
|
|
94
|
-
let account = pending.account;
|
|
95
|
-
const maxAttempts = 3;
|
|
96
|
-
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
97
|
-
const attemptHeaders = new Headers(headers);
|
|
98
|
-
applyAuthToHeaders(attemptHeaders, account, { preserveExistingOAuth: attempt === 0 });
|
|
99
|
-
const [nextInput, nextInit] = cloneRequestInput(input, init, attemptHeaders);
|
|
100
|
-
const response = await originalFetch(nextInput, nextInit);
|
|
101
|
-
if (!RETRYABLE_STATUS.has(response.status))
|
|
102
|
-
return response;
|
|
103
|
-
markRateLimited(db, account.providerID, account.alias, retryAfterMs(response));
|
|
104
|
-
if (!getBalancingEnabled(db))
|
|
105
|
-
return response;
|
|
106
|
-
if (attempt === maxAttempts - 1)
|
|
107
|
-
return response;
|
|
108
|
-
const next = chooseFailoverAccount(db, account.providerID, account.alias);
|
|
109
|
-
if (!next)
|
|
110
|
-
return response;
|
|
111
|
-
account = setActiveAccount(db, next.providerID, next.alias);
|
|
112
|
-
await setNativeAuth(client, account.providerID, account.auth, db);
|
|
113
|
-
await showToast(client, `Balancer: ${pending.providerID}/${pending.account.alias} is rate limited. Switching to ${account.alias}.`, "warning");
|
|
114
|
-
}
|
|
115
|
-
throw new Error("Balancer retry loop exited unexpectedly");
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
//# sourceMappingURL=fetch-patch.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-patch.js","sourceRoot":"","sources":["../../src/server/fetch-patch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EACH,qBAAqB,EACrB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACrB,MAAM,oBAAoB,CAAC;AAE5B,IAAI,YAAY,GAAG,KAAK,CAAC;AAEzB,SAAS,aAAa,CAAC,OAAgB;IACnC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CACpC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,KAAK,CAAU,CACxD,CAAC;AACN,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAgB,EAAE,OAAgB,EAAE,UAA+C,EAAE;IAC7G,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAEvC,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACxB,IAAI,OAAO,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAAE,OAAO;QAC1E,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO;IACX,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QACD,OAAO;IACX,CAAC;IAED,MAAM,eAAe,GAAG;QACpB,eAAe;QACf,WAAW;QACX,SAAS;QACT,gBAAgB;QAChB,qBAAqB;QACrB,mBAAmB;QACnB,gBAAgB;KACnB,CAAC;IAEF,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,OAAO,CAAC,GAAG,CACP,IAAI,EACJ,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YACnE,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE;YACtB,CAAC,CAAC,IAAI,CAAC,GAAG,CACjB,CAAC;QACF,OAAO,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,qBAAqB;IACjC,YAAY,GAAG,KAAK,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,KAAwB,EAAE,IAAkB;IAC7D,IAAI,IAAI,EAAE,OAAO;QAAE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;QAC7D,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,OAAO,EAAE,CAAC;AACzB,CAAC;AAED,SAAS,iBAAiB,CACtB,KAAwB,EACxB,IAA6B,EAC7B,OAAgB;IAEhB,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,KAAK,YAAY,OAAO,EAAE,CAAC;QAC7D,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,YAAY,CAAC,QAAkB;IACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IACvD,IAAI,CAAC,UAAU;QAAE,OAAO,MAAM,CAAC;IAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IACnC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC,CAAC;IAErE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAErE,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAY,EAAE,MAAW;IACvD,IAAI,YAAY;QAAE,OAAO;IACzB,YAAY,GAAG,IAAI,CAAC;IACpB,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAExD,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,KAAwB,EAAE,IAAkB,EAAE,EAAE;QACvE,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACvD,IAAI,CAAC,SAAS;YAAE,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAC9C,OAAO,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;YACtE,OAAO,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC9B,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;YACrD,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;YAC5C,kBAAkB,CAAC,cAAc,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC;YACtF,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;YAC7E,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAE5D,eAAe,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAC9C,IAAI,OAAO,KAAK,WAAW,GAAG,CAAC;gBAAE,OAAO,QAAQ,CAAC;YAEjD,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,IAAI;gBAAE,OAAO,QAAQ,CAAC;YAE3B,OAAO,GAAG,gBAAgB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5D,MAAM,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAClE,MAAM,SAAS,CACX,MAAM,EACN,aAAa,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,KAAK,kCAAkC,OAAO,CAAC,KAAK,GAAG,EAC1G,SAAS,CACZ,CAAC;QACN,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC/D,CAAC,CAA4B,CAAC;AAClC,CAAC"}
|
package/dist/server/index.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type Config, type Hooks } from "@opencode-ai/plugin";
|
|
2
|
-
import type { Database } from "bun:sqlite";
|
|
3
|
-
export declare function configureFallbackCommand(cfg: Config): void;
|
|
4
|
-
export declare function createServerHooks({ db, client }: {
|
|
5
|
-
db: Database;
|
|
6
|
-
client: any;
|
|
7
|
-
}): Hooks;
|
|
8
|
-
export declare const serverPlugin: ({ client }: import("@opencode-ai/plugin").PluginInput) => Promise<Hooks>;
|
package/dist/server/index.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { tool } from "@opencode-ai/plugin";
|
|
2
|
-
import { getActiveAccount, getSelectedAccount, getSelectedModel, setActiveAccount } from "../core/accounts";
|
|
3
|
-
import { openBalancerDatabase } from "../core/database";
|
|
4
|
-
import { storePath } from "../core/path";
|
|
5
|
-
import { getBalancingEnabled, resolveActiveSelection } from "../core/priority";
|
|
6
|
-
import { migrate } from "../core/schema";
|
|
7
|
-
import { runFallbackBalancerCommand } from "./commands";
|
|
8
|
-
import { installFetchPatch } from "./fetch-patch";
|
|
9
|
-
import { setNativeAuth, showToast } from "./native";
|
|
10
|
-
import { BALANCER_METADATA_KEY, INTERNAL_REQUEST_HEADER, setPendingRequest, } from "./request-balancer";
|
|
11
|
-
export function configureFallbackCommand(cfg) {
|
|
12
|
-
if (!cfg.command?.balancer)
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
function runSafeFallbackBalancerCommand(db, raw) {
|
|
16
|
-
try {
|
|
17
|
-
return runFallbackBalancerCommand(db, raw);
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
return error instanceof Error ? error.message : "Balancer command failed.";
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export function createServerHooks({ db, client }) {
|
|
24
|
-
return {
|
|
25
|
-
config: async (cfg) => {
|
|
26
|
-
configureFallbackCommand(cfg);
|
|
27
|
-
},
|
|
28
|
-
"command.execute.before": async (input, output) => {
|
|
29
|
-
if (input.command !== "balancer")
|
|
30
|
-
return;
|
|
31
|
-
const result = runSafeFallbackBalancerCommand(db, input.arguments);
|
|
32
|
-
output.parts.length = 0;
|
|
33
|
-
await showToast(client, result.split("\n")[0] ?? result, "info");
|
|
34
|
-
throw new Error(`[balancer]\n${result}`);
|
|
35
|
-
},
|
|
36
|
-
"experimental.chat.messages.transform": async (_input, output) => {
|
|
37
|
-
output.messages = output.messages.filter((message) => {
|
|
38
|
-
return !message.parts.some((part) => {
|
|
39
|
-
return part?.metadata?.[BALANCER_METADATA_KEY] === true;
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
},
|
|
43
|
-
"chat.message": async (_input, output) => {
|
|
44
|
-
// Balancing on: the priority list decides the provider/model for every
|
|
45
|
-
// message (recomputed per message -> failover and recovery for free).
|
|
46
|
-
if (getBalancingEnabled(db)) {
|
|
47
|
-
const selection = resolveActiveSelection(db, undefined, output.message.model?.providerID);
|
|
48
|
-
if (!selection)
|
|
49
|
-
return;
|
|
50
|
-
setActiveAccount(db, selection.providerID, selection.account.alias);
|
|
51
|
-
output.message.model = { providerID: selection.providerID, modelID: selection.modelID };
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
// Balancing off: keep opencode's native choice; only fill when missing.
|
|
55
|
-
if (output.message.model?.providerID && output.message.model?.modelID)
|
|
56
|
-
return;
|
|
57
|
-
const selected = getSelectedAccount(db);
|
|
58
|
-
if (!selected)
|
|
59
|
-
return;
|
|
60
|
-
const model = getSelectedModel(db, selected.providerID);
|
|
61
|
-
if (!model)
|
|
62
|
-
return;
|
|
63
|
-
output.message.model = { providerID: model.providerID, modelID: model.modelID };
|
|
64
|
-
},
|
|
65
|
-
"chat.headers": async (input, output) => {
|
|
66
|
-
const providerID = input.model.providerID;
|
|
67
|
-
const account = getActiveAccount(db, providerID);
|
|
68
|
-
if (!account)
|
|
69
|
-
return;
|
|
70
|
-
if (account.auth.type === "oauth") {
|
|
71
|
-
await setNativeAuth(client, providerID, account.auth, db);
|
|
72
|
-
}
|
|
73
|
-
const requestID = crypto.randomUUID();
|
|
74
|
-
setPendingRequest(requestID, { providerID, account });
|
|
75
|
-
output.headers[INTERNAL_REQUEST_HEADER] = requestID;
|
|
76
|
-
},
|
|
77
|
-
tool: {
|
|
78
|
-
balancer_command: tool({
|
|
79
|
-
description: "Run fallback account balancer commands.",
|
|
80
|
-
args: {
|
|
81
|
-
command: tool.schema.string().describe("Command arguments for /balancer."),
|
|
82
|
-
},
|
|
83
|
-
execute: async (args) => runSafeFallbackBalancerCommand(db, args.command),
|
|
84
|
-
}),
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
export const serverPlugin = (async ({ client }) => {
|
|
89
|
-
const db = openBalancerDatabase(storePath());
|
|
90
|
-
migrate(db);
|
|
91
|
-
installFetchPatch(db, client);
|
|
92
|
-
return createServerHooks({ db, client });
|
|
93
|
-
});
|
|
94
|
-
//# sourceMappingURL=index.js.map
|
package/dist/server/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/native.d.ts
DELETED
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { Database } from "bun:sqlite";
|
|
2
|
-
import type { AuthInfo } from "../core/types";
|
|
3
|
-
export declare function suppressNativeAuthCapture(providerID: string, durationMs?: number): void;
|
|
4
|
-
export declare function isNativeAuthCaptureSuppressed(providerID: string): boolean;
|
|
5
|
-
export declare function setNativeAuth(client: any, providerID: string, auth: AuthInfo, db?: Database): Promise<void>;
|
|
6
|
-
export declare function showToast(client: any, message: string, variant?: "info" | "success" | "warning" | "error"): Promise<void>;
|
package/dist/server/native.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { now } from "../core/time";
|
|
2
|
-
import { isNativeConnectInProgress } from "../core/native-connect";
|
|
3
|
-
import { suppressNativeAuthCapture as suppressDbNativeAuthCapture } from "../core/native-auth-suppression";
|
|
4
|
-
const suppressAuthCaptureUntil = new Map();
|
|
5
|
-
export function suppressNativeAuthCapture(providerID, durationMs = 2_000) {
|
|
6
|
-
suppressAuthCaptureUntil.set(providerID, now() + durationMs);
|
|
7
|
-
}
|
|
8
|
-
export function isNativeAuthCaptureSuppressed(providerID) {
|
|
9
|
-
const suppressedUntil = suppressAuthCaptureUntil.get(providerID) ?? 0;
|
|
10
|
-
if (suppressedUntil <= now()) {
|
|
11
|
-
suppressAuthCaptureUntil.delete(providerID);
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
return true;
|
|
15
|
-
}
|
|
16
|
-
export async function setNativeAuth(client, providerID, auth, db) {
|
|
17
|
-
if (db && isNativeConnectInProgress(db))
|
|
18
|
-
return;
|
|
19
|
-
suppressNativeAuthCapture(providerID);
|
|
20
|
-
if (db)
|
|
21
|
-
suppressDbNativeAuthCapture(db, providerID);
|
|
22
|
-
try {
|
|
23
|
-
await client.auth.set({ path: { id: providerID }, body: auth });
|
|
24
|
-
}
|
|
25
|
-
catch { }
|
|
26
|
-
}
|
|
27
|
-
export async function showToast(client, message, variant = "info") {
|
|
28
|
-
try {
|
|
29
|
-
await client.tui.showToast({
|
|
30
|
-
body: { message, variant, duration: 15_000 },
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
catch { }
|
|
34
|
-
}
|
|
35
|
-
//# sourceMappingURL=native.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/server/native.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,yBAAyB,IAAI,2BAA2B,EAAE,MAAM,iCAAiC,CAAC;AAE3G,MAAM,wBAAwB,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3D,MAAM,UAAU,yBAAyB,CAAC,UAAkB,EAAE,UAAU,GAAG,KAAK;IAC5E,wBAAwB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,UAAkB;IAC5D,MAAM,eAAe,GAAG,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACtE,IAAI,eAAe,IAAI,GAAG,EAAE,EAAE,CAAC;QAC3B,wBAAwB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5C,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,MAAW,EACX,UAAkB,EAClB,IAAc,EACd,EAAa;IAEb,IAAI,EAAE,IAAI,yBAAyB,CAAC,EAAE,CAAC;QAAE,OAAO;IAChD,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,EAAE;QAAE,2BAA2B,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC3B,MAAW,EACX,OAAe,EACf,UAAoD,MAAM;IAE1D,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YACvB,IAAI,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;SAC/C,CAAC,CAAC;IACP,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACd,CAAC"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Database } from "bun:sqlite";
|
|
2
|
-
import type { Account } from "../core/types";
|
|
3
|
-
export declare const INTERNAL_REQUEST_HEADER = "x-opencode-balancer-request";
|
|
4
|
-
export declare const BALANCER_METADATA_KEY = "opencodeBalancerCommand";
|
|
5
|
-
export declare const RETRYABLE_STATUS: Set<number>;
|
|
6
|
-
type PendingRequest = {
|
|
7
|
-
providerID: string;
|
|
8
|
-
account?: Account;
|
|
9
|
-
};
|
|
10
|
-
export declare function setPendingRequest(requestID: string, request: PendingRequest): void;
|
|
11
|
-
export declare function takePendingRequest(requestID: string): PendingRequest | undefined;
|
|
12
|
-
export declare function __testGetPendingRequest(requestID: string): PendingRequest | undefined;
|
|
13
|
-
export declare function __testClearPendingRequests(): void;
|
|
14
|
-
export declare function markRateLimited(db: Database, providerID: string, alias: string, retryAfterMs?: number): void;
|
|
15
|
-
export declare function chooseFailoverAccount(db: Database, providerID: string, currentAlias: string): Account | undefined;
|
|
16
|
-
export {};
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { getAccount, listAccounts, normalizeAlias } from "../core/accounts";
|
|
2
|
-
import { now } from "../core/time";
|
|
3
|
-
export const INTERNAL_REQUEST_HEADER = "x-opencode-balancer-request";
|
|
4
|
-
export const BALANCER_METADATA_KEY = "opencodeBalancerCommand";
|
|
5
|
-
export const RETRYABLE_STATUS = new Set([429, 500, 502, 503, 504, 529]);
|
|
6
|
-
const pendingRequests = new Map();
|
|
7
|
-
export function setPendingRequest(requestID, request) {
|
|
8
|
-
pendingRequests.set(requestID, request);
|
|
9
|
-
}
|
|
10
|
-
export function takePendingRequest(requestID) {
|
|
11
|
-
const request = pendingRequests.get(requestID);
|
|
12
|
-
pendingRequests.delete(requestID);
|
|
13
|
-
return request;
|
|
14
|
-
}
|
|
15
|
-
export function __testGetPendingRequest(requestID) {
|
|
16
|
-
return pendingRequests.get(requestID);
|
|
17
|
-
}
|
|
18
|
-
export function __testClearPendingRequests() {
|
|
19
|
-
pendingRequests.clear();
|
|
20
|
-
}
|
|
21
|
-
export function markRateLimited(db, providerID, alias, retryAfterMs = 60_000) {
|
|
22
|
-
const account = getAccount(db, providerID, alias);
|
|
23
|
-
if (!account)
|
|
24
|
-
return;
|
|
25
|
-
const timestamp = now();
|
|
26
|
-
db.query(`UPDATE accounts
|
|
27
|
-
SET failures = failures + 1,
|
|
28
|
-
rate_limited_until = ?,
|
|
29
|
-
updated_at = ?
|
|
30
|
-
WHERE provider_id = ? AND alias = ?`).run(timestamp + retryAfterMs, timestamp, providerID, account.alias);
|
|
31
|
-
}
|
|
32
|
-
export function chooseFailoverAccount(db, providerID, currentAlias) {
|
|
33
|
-
const timestamp = now();
|
|
34
|
-
const normalizedCurrentAlias = normalizeAlias(currentAlias);
|
|
35
|
-
return listAccounts(db, providerID).find((account) => {
|
|
36
|
-
if (account.alias === normalizedCurrentAlias)
|
|
37
|
-
return false;
|
|
38
|
-
if (account.disabled)
|
|
39
|
-
return false;
|
|
40
|
-
return !account.rateLimitedUntil || account.rateLimitedUntil <= timestamp;
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
//# sourceMappingURL=request-balancer.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"request-balancer.js","sourceRoot":"","sources":["../../src/server/request-balancer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAGnC,MAAM,CAAC,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAOxE,MAAM,eAAe,GAAG,IAAI,GAAG,EAA0B,CAAC;AAE1D,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,OAAuB;IACxE,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAiB;IAChD,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,eAAe,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAClC,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,SAAiB;IACrD,OAAO,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,0BAA0B;IACtC,eAAe,CAAC,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,eAAe,CAC3B,EAAY,EACZ,UAAkB,EAClB,KAAa,EACb,YAAY,GAAG,MAAM;IAErB,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IACxB,EAAE,CAAC,KAAK,CACJ;;;;6CAIqC,CACxC,CAAC,GAAG,CAAC,SAAS,GAAG,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,qBAAqB,CACjC,EAAY,EACZ,UAAkB,EAClB,YAAoB;IAEpB,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC;IACxB,MAAM,sBAAsB,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO,YAAY,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACjD,IAAI,OAAO,CAAC,KAAK,KAAK,sBAAsB;YAAE,OAAO,KAAK,CAAC;QAC3D,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QACnC,OAAO,CAAC,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC;IAC9E,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/tui/actions.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { refreshAccountUsage } from "../core/usage";
|
|
2
|
-
import type { BalancerTuiState } from "./state";
|
|
3
|
-
type AuthSetApi = {
|
|
4
|
-
client: {
|
|
5
|
-
auth: {
|
|
6
|
-
set: (input: any) => unknown;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
keymap?: {
|
|
10
|
-
dispatchCommand?: (command: string) => unknown;
|
|
11
|
-
};
|
|
12
|
-
ui?: {
|
|
13
|
-
toast: (input: {
|
|
14
|
-
variant: "success" | "warning" | "error" | "info";
|
|
15
|
-
message: string;
|
|
16
|
-
}) => unknown;
|
|
17
|
-
};
|
|
18
|
-
};
|
|
19
|
-
type ActivateAccountOptions = {
|
|
20
|
-
sessionProviderID?: string;
|
|
21
|
-
openProviderModelPicker?: (providerID: string) => void;
|
|
22
|
-
};
|
|
23
|
-
type ToastApi = {
|
|
24
|
-
ui: {
|
|
25
|
-
toast: (input: {
|
|
26
|
-
variant: "success" | "warning" | "error" | "info";
|
|
27
|
-
message: string;
|
|
28
|
-
}) => unknown;
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
type RefreshUsageOptions = {
|
|
32
|
-
refreshUsage?: typeof refreshAccountUsage;
|
|
33
|
-
silent?: boolean;
|
|
34
|
-
};
|
|
35
|
-
export declare function savePendingAlias(state: BalancerTuiState, pendingID: string, alias: string): import("../core/types").Account;
|
|
36
|
-
export declare function activateAccount(api: AuthSetApi, state: BalancerTuiState, providerID: string, alias: string, options?: ActivateAccountOptions): Promise<void>;
|
|
37
|
-
export declare function refreshUsageForAccount(api: ToastApi, state: BalancerTuiState, providerID: string, alias: string, options?: RefreshUsageOptions): Promise<void>;
|
|
38
|
-
export declare function removeAccountFromTui(api: ToastApi, state: BalancerTuiState, providerID: string, alias: string): void;
|
|
39
|
-
export declare function renameAccountFromTui(api: ToastApi, state: BalancerTuiState, providerID: string, alias: string, nextAlias: string): import("../core/types").Account;
|
|
40
|
-
export declare function removePendingFromTui(api: ToastApi, state: BalancerTuiState, pendingID: string): void;
|
|
41
|
-
export {};
|
package/dist/tui/actions.js
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import { getAccount, getActiveAccount, removeAccount, renameAccount, setActiveAccount } from "../core/accounts";
|
|
2
|
-
import { appendEvent } from "../core/events";
|
|
3
|
-
import { completePendingConnection, removePendingConnection } from "../core/pending";
|
|
4
|
-
import { refreshAccountUsage } from "../core/usage";
|
|
5
|
-
import { saveUsageSnapshot } from "../core/usage/store";
|
|
6
|
-
import { suppressNativeAuthCapture } from "../core/native-auth-suppression";
|
|
7
|
-
export function savePendingAlias(state, pendingID, alias) {
|
|
8
|
-
const account = completePendingConnection(state.db, pendingID, alias);
|
|
9
|
-
state.refresh();
|
|
10
|
-
return account;
|
|
11
|
-
}
|
|
12
|
-
export async function activateAccount(api, state, providerID, alias, options = {}) {
|
|
13
|
-
const account = setActiveAccount(state.db, providerID, alias) ?? getActiveAccount(state.db, providerID);
|
|
14
|
-
if (account) {
|
|
15
|
-
try {
|
|
16
|
-
suppressNativeAuthCapture(state.db, providerID);
|
|
17
|
-
await api.client.auth.set({ path: { id: providerID }, body: account.auth });
|
|
18
|
-
}
|
|
19
|
-
catch { }
|
|
20
|
-
}
|
|
21
|
-
state.refresh();
|
|
22
|
-
api.ui?.toast({ variant: "success", message: `Activated ${providerID}/${alias}.` });
|
|
23
|
-
options.openProviderModelPicker?.(providerID);
|
|
24
|
-
}
|
|
25
|
-
export async function refreshUsageForAccount(api, state, providerID, alias, options = {}) {
|
|
26
|
-
const account = getAccount(state.db, providerID, alias) ?? state.accounts().find((candidate) => {
|
|
27
|
-
return candidate.providerID === providerID && candidate.alias === alias;
|
|
28
|
-
});
|
|
29
|
-
if (!account) {
|
|
30
|
-
api.ui.toast({ variant: "error", message: `Account not found: ${providerID}/${alias}` });
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
try {
|
|
34
|
-
const snapshot = await (options.refreshUsage ?? refreshAccountUsage)(account);
|
|
35
|
-
saveUsageSnapshot(state.db, snapshot);
|
|
36
|
-
appendEvent(state.db, {
|
|
37
|
-
type: snapshot.confidence === "unavailable" ? "usage_unavailable" : "usage_refreshed",
|
|
38
|
-
providerID,
|
|
39
|
-
alias,
|
|
40
|
-
message: snapshot.message,
|
|
41
|
-
});
|
|
42
|
-
state.refresh();
|
|
43
|
-
if (!options.silent) {
|
|
44
|
-
api.ui.toast({
|
|
45
|
-
variant: snapshot.confidence === "unavailable" ? "warning" : "success",
|
|
46
|
-
message: snapshot.message,
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
catch (error) {
|
|
51
|
-
const message = error instanceof Error ? error.message : "Usage refresh failed.";
|
|
52
|
-
api.ui.toast({ variant: "error", message });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export function removeAccountFromTui(api, state, providerID, alias) {
|
|
56
|
-
const removed = removeAccount(state.db, providerID, alias);
|
|
57
|
-
if (!removed) {
|
|
58
|
-
api.ui.toast({ variant: "error", message: `Account not found: ${providerID}/${alias}` });
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
const message = `Removed account ${providerID}/${alias}.`;
|
|
62
|
-
appendEvent(state.db, {
|
|
63
|
-
type: "account_removed",
|
|
64
|
-
providerID,
|
|
65
|
-
alias,
|
|
66
|
-
message,
|
|
67
|
-
});
|
|
68
|
-
state.refresh();
|
|
69
|
-
state.removeAccountView(providerID, alias);
|
|
70
|
-
api.ui.toast({ variant: "success", message });
|
|
71
|
-
}
|
|
72
|
-
export function renameAccountFromTui(api, state, providerID, alias, nextAlias) {
|
|
73
|
-
const account = renameAccount(state.db, providerID, alias, nextAlias);
|
|
74
|
-
state.refresh();
|
|
75
|
-
api.ui.toast({ variant: "success", message: `Renamed ${providerID}/${alias} to ${account.alias}.` });
|
|
76
|
-
return account;
|
|
77
|
-
}
|
|
78
|
-
export function removePendingFromTui(api, state, pendingID) {
|
|
79
|
-
const removed = removePendingConnection(state.db, pendingID);
|
|
80
|
-
if (!removed) {
|
|
81
|
-
api.ui.toast({ variant: "error", message: "Pending connection not found." });
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
state.refresh();
|
|
85
|
-
state.removePendingView(pendingID);
|
|
86
|
-
api.ui.toast({ variant: "success", message: "Removed pending connection." });
|
|
87
|
-
}
|
|
88
|
-
//# sourceMappingURL=actions.js.map
|
package/dist/tui/actions.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/tui/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
2
|
-
import type { BalancerTuiState } from "./state";
|
|
3
|
-
import { type NativeModelApplier } from "./native-model-apply";
|
|
4
|
-
export type BalancerBarSyncDeps = {
|
|
5
|
-
balancingEnabled: () => boolean;
|
|
6
|
-
dialogOpen: () => boolean;
|
|
7
|
-
activeSelection: () => {
|
|
8
|
-
providerID: string;
|
|
9
|
-
modelID: string;
|
|
10
|
-
} | undefined;
|
|
11
|
-
modelTitle: (providerID: string, modelID: string) => string | undefined;
|
|
12
|
-
apply: NativeModelApplier;
|
|
13
|
-
};
|
|
14
|
-
export declare function createBalancerBarSync(deps: BalancerBarSyncDeps): {
|
|
15
|
-
maybeSync: () => Promise<boolean>;
|
|
16
|
-
};
|
|
17
|
-
export declare function createTuiBalancerBarSync(api: TuiPluginApi, state: BalancerTuiState): {
|
|
18
|
-
maybeSync: () => Promise<boolean>;
|
|
19
|
-
};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { getBalancingEnabled, resolveActiveSelection } from "../core/priority";
|
|
2
|
-
import { createNativeModelApplier } from "./native-model-apply";
|
|
3
|
-
export function createBalancerBarSync(deps) {
|
|
4
|
-
let lastApplied;
|
|
5
|
-
let applying = false;
|
|
6
|
-
const maybeSync = async () => {
|
|
7
|
-
if (!deps.balancingEnabled()) {
|
|
8
|
-
lastApplied = undefined;
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
if (applying || deps.dialogOpen())
|
|
12
|
-
return false;
|
|
13
|
-
const selection = deps.activeSelection();
|
|
14
|
-
if (!selection)
|
|
15
|
-
return false;
|
|
16
|
-
const key = `${selection.providerID}/${selection.modelID}`;
|
|
17
|
-
if (key === lastApplied)
|
|
18
|
-
return false;
|
|
19
|
-
const title = deps.modelTitle(selection.providerID, selection.modelID) ?? selection.modelID;
|
|
20
|
-
applying = true;
|
|
21
|
-
try {
|
|
22
|
-
const applied = await deps.apply(selection, title);
|
|
23
|
-
if (applied)
|
|
24
|
-
lastApplied = key;
|
|
25
|
-
return applied;
|
|
26
|
-
}
|
|
27
|
-
finally {
|
|
28
|
-
applying = false;
|
|
29
|
-
}
|
|
30
|
-
};
|
|
31
|
-
return { maybeSync };
|
|
32
|
-
}
|
|
33
|
-
export function createTuiBalancerBarSync(api, state) {
|
|
34
|
-
return createBalancerBarSync({
|
|
35
|
-
balancingEnabled: () => getBalancingEnabled(state.db),
|
|
36
|
-
dialogOpen: () => api.ui.dialog.open,
|
|
37
|
-
activeSelection: () => resolveActiveSelection(state.db),
|
|
38
|
-
modelTitle: (providerID, modelID) => {
|
|
39
|
-
const provider = api.state.provider.find((item) => item.id === providerID);
|
|
40
|
-
return provider?.models?.[modelID]?.name;
|
|
41
|
-
},
|
|
42
|
-
apply: createNativeModelApplier(api),
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=balancer-bar-sync.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"balancer-bar-sync.js","sourceRoot":"","sources":["../../src/tui/balancer-bar-sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,wBAAwB,EAA2B,MAAM,sBAAsB,CAAC;AAUzF,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC3D,IAAI,WAA+B,CAAC;IACpC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YAC3B,WAAW,GAAG,SAAS,CAAC;YACxB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE;YAAE,OAAO,KAAK,CAAC;QAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,UAAU,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;QAC3D,IAAI,GAAG,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC;QAC5F,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACnD,IAAI,OAAO;gBAAE,WAAW,GAAG,GAAG,CAAC;YAC/B,OAAO,OAAO,CAAC;QACnB,CAAC;gBAAS,CAAC;YACP,QAAQ,GAAG,KAAK,CAAC;QACrB,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,EAAE,SAAS,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAiB,EAAE,KAAuB;IAC/E,OAAO,qBAAqB,CAAC;QACzB,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI;QACpC,eAAe,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE;YAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;YAC3E,OAAO,QAAQ,EAAE,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;QAC7C,CAAC;QACD,KAAK,EAAE,wBAAwB,CAAC,GAAG,CAAC;KACvC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource @opentui/solid */
|
|
2
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
|
-
import type { BalancerTuiState } from "../state";
|
|
4
|
-
export declare function Dashboard(props: {
|
|
5
|
-
api: TuiPluginApi;
|
|
6
|
-
state: BalancerTuiState;
|
|
7
|
-
onBack: () => void;
|
|
8
|
-
openPriority: () => void;
|
|
9
|
-
openConnect: () => void;
|
|
10
|
-
renameAccount: (providerID: string, alias: string) => void;
|
|
11
|
-
removeAccount: (providerID: string, alias: string) => void;
|
|
12
|
-
}): any;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource @opentui/solid */
|
|
2
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
|
-
import type { BalancerTuiState } from "../state";
|
|
4
|
-
export declare function PriorityScreen(props: {
|
|
5
|
-
api: TuiPluginApi;
|
|
6
|
-
state: BalancerTuiState;
|
|
7
|
-
onBack: () => void;
|
|
8
|
-
openModelPicker: (providerID: string) => void;
|
|
9
|
-
}): any;
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource @opentui/solid */
|
|
2
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
|
-
import { type NativeModelApplier } from "../native-model-apply";
|
|
4
|
-
import type { BalancerTuiState } from "../state";
|
|
5
|
-
type OpenProviderModelDialogOptions = {
|
|
6
|
-
applyNativeSelection?: NativeModelApplier;
|
|
7
|
-
onSelected?: (model: {
|
|
8
|
-
providerID: string;
|
|
9
|
-
modelID: string;
|
|
10
|
-
}) => void;
|
|
11
|
-
};
|
|
12
|
-
export declare function openProviderModelDialog(api: TuiPluginApi, state: Pick<BalancerTuiState, "db" | "refresh">, providerID: string, options?: OpenProviderModelDialogOptions): void;
|
|
13
|
-
export {};
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource @opentui/solid */
|
|
2
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
|
-
import type { BalancerTuiState } from "../state";
|
|
4
|
-
export declare function openRenameDialog(api: TuiPluginApi, state: BalancerTuiState, providerID: string, alias: string): void;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource @opentui/solid */
|
|
2
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
|
-
import type { BalancerTuiState } from "../state";
|
|
4
|
-
export type BalancerSidebarProps = {
|
|
5
|
-
api: TuiPluginApi;
|
|
6
|
-
state: BalancerTuiState;
|
|
7
|
-
openDashboard: () => void;
|
|
8
|
-
activateAccount: (providerID: string, alias: string) => void;
|
|
9
|
-
};
|
|
10
|
-
export declare function BalancerSidebar(props: BalancerSidebarProps): any;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/** @jsxImportSource @opentui/solid */
|
|
2
|
-
import type { TuiPluginApi } from "@opencode-ai/plugin/tui";
|
|
3
|
-
import type { BalancerTuiState } from "../state";
|
|
4
|
-
export type BalancerStatusIndicatorProps = {
|
|
5
|
-
api: TuiPluginApi;
|
|
6
|
-
state: BalancerTuiState;
|
|
7
|
-
providerID?: string | (() => string | undefined);
|
|
8
|
-
};
|
|
9
|
-
export declare function BalancerStatusIndicator(props: BalancerStatusIndicatorProps): any;
|