@thelioo/opencode-balancer 0.1.8 → 0.2.1
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 +53 -25
- package/README.md +95 -51
- 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 -112
- 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 -267
- package/dist/tui/components/provider-model-dialog.tsx +71 -64
- 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 +104 -73
- 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 +23 -23
- 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 -153
- package/dist/tui/tui.js.map +1 -1
- package/dist/tui/tui.tsx +194 -144
- package/dist/tui/usage-auto-refresh.ts +52 -45
- package/dist/tui/usage-format.ts +9 -9
- package/package.json +61 -52
- 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 -32
- 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 -92
- 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 -14
- 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 -75
- 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/selected-account-bar-sync.d.ts +0 -10
- package/dist/tui/selected-account-bar-sync.js +0 -26
- package/dist/tui/selected-account-bar-sync.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,32 +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 sameSavedAuth(saved: AuthInfo, current: AuthInfo): boolean;
|
|
22
|
-
export declare function captureUnknownNativeAuth(db: Database, providerID: string, auth: AuthInfo): boolean;
|
|
23
|
-
declare function initialAuthSnapshot(db: Database, authByProvider: Record<string, AuthInfo>): Record<string, AuthInfo>;
|
|
24
|
-
export declare function startAuthWatcher(client: any, db: Database): void;
|
|
25
|
-
export declare const __testParseNativeAuthContent: typeof parseNativeAuthContent;
|
|
26
|
-
export declare const __testInitialAuthSnapshot: typeof initialAuthSnapshot;
|
|
27
|
-
export declare function __testCreateAuthWatcher(options: Omit<AuthWatcherOptions, "client"> & {
|
|
28
|
-
client?: any;
|
|
29
|
-
}): {
|
|
30
|
-
poll(): Promise<void>;
|
|
31
|
-
};
|
|
32
|
-
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
|
-
export 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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"}
|
package/dist/server/commands.js
DELETED
|
@@ -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,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 {};
|