superoc 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/bin/nimsuper.js +21 -0
  4. package/bin/nimsuper.ts +10 -0
  5. package/bin/superoc.js +21 -0
  6. package/bin/superoc.ts +10 -0
  7. package/dist/antigravity.d.ts +59 -0
  8. package/dist/antigravity.d.ts.map +1 -0
  9. package/dist/antigravity.js +423 -0
  10. package/dist/antigravity.js.map +1 -0
  11. package/dist/errors.d.ts +22 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +122 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/errors.test.d.ts +2 -0
  16. package/dist/errors.test.d.ts.map +1 -0
  17. package/dist/errors.test.js +137 -0
  18. package/dist/errors.test.js.map +1 -0
  19. package/dist/index.d.ts +5 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +809 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/opencode-sync.d.ts +9 -0
  24. package/dist/opencode-sync.d.ts.map +1 -0
  25. package/dist/opencode-sync.js +157 -0
  26. package/dist/opencode-sync.js.map +1 -0
  27. package/dist/provider.d.ts +5 -0
  28. package/dist/provider.d.ts.map +1 -0
  29. package/dist/provider.js +100 -0
  30. package/dist/provider.js.map +1 -0
  31. package/dist/provider.test.d.ts +2 -0
  32. package/dist/provider.test.d.ts.map +1 -0
  33. package/dist/provider.test.js +94 -0
  34. package/dist/provider.test.js.map +1 -0
  35. package/dist/quota.d.ts +12 -0
  36. package/dist/quota.d.ts.map +1 -0
  37. package/dist/quota.js +105 -0
  38. package/dist/quota.js.map +1 -0
  39. package/dist/quota.test.d.ts +2 -0
  40. package/dist/quota.test.d.ts.map +1 -0
  41. package/dist/quota.test.js +20 -0
  42. package/dist/quota.test.js.map +1 -0
  43. package/dist/storage.d.ts +43 -0
  44. package/dist/storage.d.ts.map +1 -0
  45. package/dist/storage.js +447 -0
  46. package/dist/storage.js.map +1 -0
  47. package/dist/themes.d.ts +64 -0
  48. package/dist/themes.d.ts.map +1 -0
  49. package/dist/themes.js +424 -0
  50. package/dist/themes.js.map +1 -0
  51. package/dist/tui/actions.d.ts +14 -0
  52. package/dist/tui/actions.d.ts.map +1 -0
  53. package/dist/tui/actions.js +464 -0
  54. package/dist/tui/actions.js.map +1 -0
  55. package/dist/tui/app.d.ts +2 -0
  56. package/dist/tui/app.d.ts.map +1 -0
  57. package/dist/tui/app.js +323 -0
  58. package/dist/tui/app.js.map +1 -0
  59. package/dist/tui/benchmark.d.ts +42 -0
  60. package/dist/tui/benchmark.d.ts.map +1 -0
  61. package/dist/tui/benchmark.js +379 -0
  62. package/dist/tui/benchmark.js.map +1 -0
  63. package/dist/tui/screens.d.ts +23 -0
  64. package/dist/tui/screens.d.ts.map +1 -0
  65. package/dist/tui/screens.js +791 -0
  66. package/dist/tui/screens.js.map +1 -0
  67. package/dist/tui/state.d.ts +54 -0
  68. package/dist/tui/state.d.ts.map +1 -0
  69. package/dist/tui/state.js +85 -0
  70. package/dist/tui/state.js.map +1 -0
  71. package/dist/tui/types.d.ts +16 -0
  72. package/dist/tui/types.d.ts.map +1 -0
  73. package/dist/tui/types.js +2 -0
  74. package/dist/tui/types.js.map +1 -0
  75. package/dist/tui/ui.d.ts +17 -0
  76. package/dist/tui/ui.d.ts.map +1 -0
  77. package/dist/tui/ui.js +77 -0
  78. package/dist/tui/ui.js.map +1 -0
  79. package/dist/types.d.ts +52 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +2 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +68 -0
  84. package/scripts/postinstall.js +77 -0
  85. package/scripts/uninstall.js +119 -0
@@ -0,0 +1,323 @@
1
+ import { Box, Text } from "@opentui/core";
2
+ import pkg from "../../package.json" with { type: "json" };
3
+ import { getActiveTheme, setPreviewTheme } from "../themes.js";
4
+ import { getActiveKeys } from "../storage.js";
5
+ import { state, setNavigate, setRenderApp, callRenderApp, } from "./state.js";
6
+ import { buildProviderTabs, buildMainMenu, buildKeySelector, buildKeyActions, buildThemeSelector, buildConfirmDelete, buildAddNameInput, buildAddKeyInput, buildOAuthLoginScreen, buildRenameInput, buildExportPathInput, buildImportPathInput, buildConfirmImport, buildFallbackMenu, buildFallbackChain, buildFallbackSettings, buildModelSelector, getFilteredModelsForSelector, } from "./screens.js";
7
+ import { handleFallbackChainKey, addFallbackModel, cancelBenchmark, } from "./actions.js";
8
+ import { openUrlInBrowser } from "../antigravity.js";
9
+ export function initApp() {
10
+ setNavigate((screen) => {
11
+ state.currentScreen = screen;
12
+ renderApp();
13
+ });
14
+ setRenderApp(renderApp);
15
+ if (!state.renderer)
16
+ return;
17
+ state.renderer.keyInput.on("keypress", (key) => {
18
+ if (key.name === "tab") {
19
+ if (state.currentScreen === "provider-tabs")
20
+ return;
21
+ state.activeTab = state.activeTab === "keys" ? "fallback" : "keys";
22
+ if (state.activeTab === "keys") {
23
+ navigateTo("list");
24
+ }
25
+ else {
26
+ navigateTo("fallback-menu");
27
+ }
28
+ return;
29
+ }
30
+ if (key.name === "1") {
31
+ if (state.currentScreen === "provider-tabs")
32
+ return;
33
+ state.activeTab = "keys";
34
+ navigateTo("list");
35
+ return;
36
+ }
37
+ if (key.name === "2") {
38
+ if (state.currentScreen === "provider-tabs")
39
+ return;
40
+ state.activeTab = "fallback";
41
+ navigateTo("fallback-menu");
42
+ return;
43
+ }
44
+ if (key.name === "escape") {
45
+ switch (state.currentScreen) {
46
+ case "provider-tabs":
47
+ return;
48
+ case "list":
49
+ navigateTo("provider-tabs");
50
+ return;
51
+ case "key-selector":
52
+ return navigateTo("list");
53
+ case "key-actions":
54
+ return navigateTo("key-selector");
55
+ case "add-name":
56
+ case "add-key":
57
+ state.pendingKeyName = "";
58
+ return navigateTo("list");
59
+ case "oauth-login":
60
+ if (state.oauthCleanup) {
61
+ state.oauthCleanup();
62
+ state.oauthCleanup = null;
63
+ }
64
+ state.pendingOAuthUrl = "";
65
+ state.pendingOAuthState = "";
66
+ return navigateTo("list");
67
+ case "rename":
68
+ state.renameTargetId = null;
69
+ return navigateTo("key-actions");
70
+ case "confirm-delete":
71
+ state.deleteTargetId = null;
72
+ return navigateTo("key-actions");
73
+ case "theme-selector":
74
+ setPreviewTheme(null);
75
+ return navigateTo("list");
76
+ case "export-path":
77
+ return navigateTo("list");
78
+ case "import-path":
79
+ return navigateTo("list");
80
+ case "confirm-import":
81
+ state.pendingImportPath = "";
82
+ state.pendingImportResult = null;
83
+ return navigateTo("list");
84
+ case "fallback-menu":
85
+ return navigateTo("list");
86
+ case "fallback-chain":
87
+ cancelBenchmark();
88
+ return navigateTo("fallback-menu");
89
+ case "fallback-settings":
90
+ return navigateTo("fallback-menu");
91
+ case "model-selector":
92
+ state.modelSearchQuery = "";
93
+ return navigateTo("fallback-chain");
94
+ }
95
+ }
96
+ if (key.ctrl && key.name === "c") {
97
+ if (state.oauthCleanup) {
98
+ state.oauthCleanup();
99
+ state.oauthCleanup = null;
100
+ }
101
+ if (state.renderer)
102
+ state.renderer.destroy();
103
+ process.exit(0);
104
+ }
105
+ if (state.currentScreen === "oauth-login") {
106
+ if (key.name === "o" && state.pendingOAuthUrl) {
107
+ openUrlInBrowser(state.pendingOAuthUrl);
108
+ return;
109
+ }
110
+ }
111
+ if (state.currentScreen === "fallback-chain") {
112
+ handleFallbackChainKey(key.name);
113
+ return;
114
+ }
115
+ if (state.currentScreen === "model-selector") {
116
+ const filteredModels = getFilteredModelsForSelector();
117
+ if (key.name === "up") {
118
+ if (filteredModels.length === 0)
119
+ return;
120
+ state.modelSelectorIndex[state.activeProvider] = Math.max(0, state.modelSelectorIndex[state.activeProvider] - 1);
121
+ callRenderApp();
122
+ return;
123
+ }
124
+ else if (key.name === "down") {
125
+ if (filteredModels.length === 0)
126
+ return;
127
+ state.modelSelectorIndex[state.activeProvider] = Math.min(filteredModels.length - 1, state.modelSelectorIndex[state.activeProvider] + 1);
128
+ callRenderApp();
129
+ return;
130
+ }
131
+ else if (key.name === "return" || key.name === "enter") {
132
+ if (state.modelSelectorIndex[state.activeProvider] >= 0 &&
133
+ state.modelSelectorIndex[state.activeProvider] < filteredModels.length) {
134
+ const model = filteredModels[state.modelSelectorIndex[state.activeProvider]];
135
+ if (model) {
136
+ addFallbackModel(model.id, model.name);
137
+ state.modelSearchQuery = "";
138
+ navigateTo("fallback-chain");
139
+ return;
140
+ }
141
+ }
142
+ const customQuery = state.modelSearchQuery.trim();
143
+ if (customQuery.length > 0) {
144
+ addFallbackModel(customQuery, customQuery);
145
+ state.modelSearchQuery = "";
146
+ navigateTo("fallback-chain");
147
+ }
148
+ return;
149
+ }
150
+ else if (key.name === "backspace") {
151
+ state.modelSearchQuery = state.modelSearchQuery.slice(0, -1);
152
+ state.modelSelectorIndex[state.activeProvider] = 0;
153
+ callRenderApp();
154
+ return;
155
+ }
156
+ else if (key.name === "r" && state.modelSearchQuery === "") {
157
+ state.modelsLoaded[state.activeProvider] = false;
158
+ state.availableModels[state.activeProvider] = [];
159
+ callRenderApp();
160
+ return;
161
+ }
162
+ else if (key.name && key.name.length === 1) {
163
+ state.modelSearchQuery += key.name;
164
+ state.modelSelectorIndex[state.activeProvider] = 0;
165
+ callRenderApp();
166
+ return;
167
+ }
168
+ }
169
+ });
170
+ renderApp();
171
+ }
172
+ function navigateTo(screen) {
173
+ state.currentScreen = screen;
174
+ renderApp();
175
+ }
176
+ function renderApp() {
177
+ if (state.isRendering) {
178
+ state.renderPending = true;
179
+ return;
180
+ }
181
+ state.isRendering = true;
182
+ try {
183
+ doRenderApp();
184
+ }
185
+ finally {
186
+ state.isRendering = false;
187
+ if (state.renderPending) {
188
+ state.renderPending = false;
189
+ queueMicrotask(renderApp);
190
+ }
191
+ }
192
+ }
193
+ function doRenderApp() {
194
+ if (!state.renderer)
195
+ return;
196
+ state.focusTargetId = null;
197
+ for (const child of state.renderer.root.getChildren())
198
+ child.destroyRecursively();
199
+ const theme = getActiveTheme();
200
+ const { element: content, helpText } = (() => {
201
+ switch (state.currentScreen) {
202
+ case "provider-tabs":
203
+ return buildProviderTabs();
204
+ case "list":
205
+ return buildMainMenu();
206
+ case "key-selector":
207
+ return buildKeySelector();
208
+ case "key-actions":
209
+ return buildKeyActions();
210
+ case "theme-selector":
211
+ return buildThemeSelector();
212
+ case "confirm-delete":
213
+ return buildConfirmDelete();
214
+ case "add-name":
215
+ return buildAddNameInput();
216
+ case "add-key":
217
+ return buildAddKeyInput();
218
+ case "oauth-login":
219
+ return buildOAuthLoginScreen();
220
+ case "rename":
221
+ return buildRenameInput();
222
+ case "export-path":
223
+ return buildExportPathInput();
224
+ case "import-path":
225
+ return buildImportPathInput();
226
+ case "confirm-import":
227
+ return buildConfirmImport();
228
+ case "fallback-menu":
229
+ return buildFallbackMenu();
230
+ case "fallback-chain":
231
+ return buildFallbackChain();
232
+ case "fallback-settings":
233
+ return buildFallbackSettings();
234
+ case "model-selector":
235
+ return buildModelSelector();
236
+ }
237
+ })();
238
+ const isProviderTabs = state.currentScreen === "provider-tabs";
239
+ const isKeysTab = state.activeTab === "keys";
240
+ let tabBar;
241
+ if (isProviderTabs) {
242
+ tabBar = Box({ flexDirection: "row", gap: 2 });
243
+ }
244
+ else {
245
+ tabBar = Box({ flexDirection: "row", gap: 1 }, Text({
246
+ content: "[1]",
247
+ fg: isKeysTab ? theme.primary : theme.textMuted,
248
+ }), Text({
249
+ content: state.activeProvider === "antigravity" ? "Account Rotation" : "API Key Rotation",
250
+ fg: isKeysTab ? theme.primary : theme.textMuted,
251
+ }), Text({ content: " | ", fg: theme.textMuted }), Text({
252
+ content: "[2]",
253
+ fg: !isKeysTab ? theme.primary : theme.textMuted,
254
+ }), Text({
255
+ content: state.activeProvider === "antigravity" ? "Models" : "Model Fallback Chain",
256
+ fg: !isKeysTab ? theme.primary : theme.textMuted,
257
+ }));
258
+ }
259
+ const providerName = state.activeProvider === "nvidia"
260
+ ? "NVIDIA NIM"
261
+ : state.activeProvider === "google"
262
+ ? "Google Gemini"
263
+ : "Antigravity";
264
+ const title = Box({ flexDirection: "row", gap: 2 }, Text({
265
+ id: "title-text",
266
+ content: isProviderTabs ? "NIM Super" : `${providerName} Key Rotator`,
267
+ fg: theme.primary,
268
+ }), Text({
269
+ id: "version-text",
270
+ content: `v${pkg.version}`,
271
+ fg: theme.textMuted,
272
+ }));
273
+ const activeKeysCount = getActiveKeys(state.store, state.activeProvider).length;
274
+ const totalKeysCount = state.store.keys.filter((k) => k.provider === state.activeProvider).length;
275
+ const modelsCount = state.store.fallbackChains[state.activeProvider]?.length ?? 0;
276
+ const status = Box({ flexDirection: "row", gap: 2 }, Text({
277
+ id: "keys-count",
278
+ content: `${state.activeProvider === "antigravity" ? "Accounts" : "Keys"}: ${totalKeysCount}`,
279
+ fg: theme.textMuted,
280
+ }), Text({
281
+ id: "active-count",
282
+ content: `Active: ${activeKeysCount}`,
283
+ fg: theme.success,
284
+ }), Text({
285
+ id: "models-count",
286
+ content: `Models: ${modelsCount}`,
287
+ fg: theme.textMuted,
288
+ }), Text({
289
+ id: "rl-threshold",
290
+ content: `RL: ${state.store.maxRateLimitFailures}`,
291
+ fg: theme.textMuted,
292
+ }), Text({
293
+ id: "status-text",
294
+ content: state.statusMessage,
295
+ fg: state.statusColor,
296
+ }));
297
+ const help = Box({ flexDirection: "row" }, Text({ id: "help-text", content: helpText, fg: theme.textMuted }));
298
+ state.renderer.root.add(Box({
299
+ id: "screen-root",
300
+ flexDirection: "column",
301
+ alignItems: "center",
302
+ justifyContent: "center",
303
+ width: "100%",
304
+ height: "100%",
305
+ backgroundColor: theme.background,
306
+ }, Box({
307
+ id: "panel",
308
+ flexDirection: "column",
309
+ paddingX: 2,
310
+ paddingY: 1,
311
+ border: true,
312
+ borderStyle: "rounded",
313
+ borderColor: theme.border,
314
+ gap: 1,
315
+ backgroundColor: theme.backgroundPanel,
316
+ }, tabBar, title, status, content, help)));
317
+ if (state.focusTargetId) {
318
+ const renderable = state.renderer.root.findDescendantById(state.focusTargetId);
319
+ if (renderable && typeof renderable.focus === "function")
320
+ renderable.focus();
321
+ }
322
+ }
323
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { FallbackModel, ProviderId } from "../types.js";
2
+ export interface BenchmarkMetrics {
3
+ ttfb: number | undefined;
4
+ tps: number | undefined;
5
+ tokenCount: number;
6
+ }
7
+ export type BenchmarkPhase = "idle" | "connecting" | "streaming" | "done" | "error" | "cancelled";
8
+ export interface BenchmarkState {
9
+ phase: BenchmarkPhase;
10
+ metrics: BenchmarkMetrics;
11
+ error: string | undefined;
12
+ }
13
+ export declare class BenchmarkRunner {
14
+ private generation;
15
+ private controller;
16
+ private spinnerInterval;
17
+ private _phase;
18
+ private _metrics;
19
+ private _error;
20
+ private _modelId;
21
+ private _cancelled;
22
+ private lastGoodTps;
23
+ private provider;
24
+ constructor(provider: ProviderId);
25
+ private setTps;
26
+ get phase(): BenchmarkPhase;
27
+ get metrics(): BenchmarkMetrics;
28
+ get error(): string | undefined;
29
+ get modelId(): string | undefined;
30
+ get isRunning(): boolean;
31
+ getState(): BenchmarkState;
32
+ cancel(): void;
33
+ run(model: FallbackModel, apiKey: string): Promise<BenchmarkState>;
34
+ applyResultToModel(model: FallbackModel): void;
35
+ resetModel(model: FallbackModel): void;
36
+ private execute;
37
+ private readStream;
38
+ private startSpinner;
39
+ private stopSpinner;
40
+ private teardown;
41
+ }
42
+ //# sourceMappingURL=benchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/tui/benchmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAa7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAElG,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAId;IACF,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAa;gBAEjB,QAAQ,EAAE,UAAU;IAIhC,OAAO,CAAC,MAAM;IASd,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,IAAI,OAAO,IAAI,gBAAgB,CAE9B;IAED,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAED,IAAI,OAAO,IAAI,MAAM,GAAG,SAAS,CAEhC;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,QAAQ,IAAI,cAAc;IAQ1B,MAAM,IAAI,IAAI;IAUR,GAAG,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA2CxE,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IA4B9C,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;YAOxB,OAAO;YAiHP,UAAU;IAmHxB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,QAAQ;CAIjB"}