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,20 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { formatMinimalQuotaString, getNormalizedQuota } from "./quota.js";
3
+ describe("Quota Tracker & Normalization", () => {
4
+ it("formats minimal quota string correctly", () => {
5
+ const quota = { fiveHourPercent: 75, weeklyPercent: 100 };
6
+ expect(formatMinimalQuotaString(quota)).toBe("5h: 75% | W: 100%");
7
+ });
8
+ it("handles 0 accounts gracefully", async () => {
9
+ const quota = await getNormalizedQuota([], "claude-sonnet-4-6");
10
+ expect(quota).toEqual({ fiveHourPercent: 100, weeklyPercent: 100 });
11
+ });
12
+ it("normalizes multi-account values accurately", () => {
13
+ const accountA = 0.5; // 50%
14
+ const accountB = 1.0; // 100%
15
+ const avg = (accountA + accountB) / 2;
16
+ const percent = Math.round(avg * 100);
17
+ expect(percent).toBe(75);
18
+ });
19
+ });
20
+ //# sourceMappingURL=quota.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.test.js","sourceRoot":"","sources":["../src/quota.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,UAAU,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AAG7F,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,KAAK,GAAiB,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;QACxE,MAAM,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,MAAM;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO;QAC7B,MAAM,GAAG,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { ApiKeyEntry, ExportedKey, ExportPayload, KeyStore, KeyStoreConfig, ProviderId } from "./types.js";
2
+ export declare const MODEL_BLACKLIST_BASE_DURATION_MS = 30000;
3
+ export declare const MODEL_BLACKLIST_MAX_DURATION_MS: number;
4
+ export declare function getDefaultStore(): KeyStore;
5
+ export declare function resolveStorePath(config?: KeyStoreConfig): string;
6
+ export declare function validateExportPath(filePath: string): string | null;
7
+ export declare function loadStore(config?: KeyStoreConfig): KeyStore | null;
8
+ export declare function saveStore(store: KeyStore, config?: KeyStoreConfig): void;
9
+ export declare function addKey(store: KeyStore, name: string, key: string, provider: ProviderId): void;
10
+ export declare function removeKey(store: KeyStore, id: string): void;
11
+ export declare function renameKey(store: KeyStore, id: string, newName: string): void;
12
+ export declare function toggleKey(store: KeyStore, id: string, enabled?: boolean): void;
13
+ export declare function isKeyBlacklisted(entry: ApiKeyEntry, modelId: string | undefined, now?: number): boolean;
14
+ export declare function getActiveKeys(store: KeyStore, provider?: ProviderId, modelId?: string): ApiKeyEntry[];
15
+ export declare function getNextKey(store: KeyStore, config?: KeyStoreConfig, modelId?: string, provider?: ProviderId): {
16
+ key: ApiKeyEntry;
17
+ index: number;
18
+ } | null;
19
+ export declare function resetFailures(store: KeyStore, keyId?: string): void;
20
+ export declare function recordRateLimit(store: KeyStore, keyId: string): void;
21
+ export declare function resetRateLimit(store: KeyStore, keyId: string): void;
22
+ export declare function recordModelRateLimit(store: KeyStore, keyId: string, modelId: string, now?: number): void;
23
+ export declare function clearModelBlacklist(store: KeyStore, keyId: string, modelId: string): void;
24
+ export declare function pruneAllExpiredBlacklists(store: KeyStore, now?: number): void;
25
+ export declare function exportKeys(store: KeyStore): ExportPayload;
26
+ export declare function writeExportFile(payload: ExportPayload, filePath: string): void;
27
+ export declare function readAndValidateImportFile(filePath: string): {
28
+ raw: string;
29
+ } | {
30
+ error: string;
31
+ };
32
+ export interface ImportResult {
33
+ added: number;
34
+ skipped: number;
35
+ errors: string[];
36
+ pendingKeys: ExportedKey[];
37
+ }
38
+ export declare function validateImportPayload(raw: string): ImportResult;
39
+ export declare function applyImport(store: KeyStore, pendingKeys: ExportedKey[]): {
40
+ added: number;
41
+ skipped: number;
42
+ };
43
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EAEb,QAAQ,EACR,cAAc,EAEd,UAAU,EACX,MAAM,YAAY,CAAC;AAoBpB,eAAO,MAAM,gCAAgC,QAAS,CAAC;AACvD,eAAO,MAAM,+BAA+B,QAAiB,CAAC;AAW9D,wBAAgB,eAAe,IAAI,QAAQ,CAU1C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,MAAM,CAOhE;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQlE;AAmED,wBAAgB,SAAS,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,QAAQ,GAAG,IAAI,CAoBlE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CA0BxE;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI,CAW7F;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAU3D;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAG5E;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,QAAQ,EACf,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,OAAO,GAChB,IAAI,CAGN;AAED,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,GAAG,GAAE,MAAmB,GACvB,OAAO,CAIT;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,CAAC,EAAE,UAAU,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,EAAE,CAWf;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,QAAQ,EACf,MAAM,CAAC,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,UAAU,GACpB;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqC5C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAWnE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAIpE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAmB,GACvB,IAAI,CA4BN;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,IAAI,CAON;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,QAAQ,EACf,GAAG,GAAE,MAAmB,GACvB,IAAI,CAYN;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAMzD;AAED,wBAAgB,eAAe,CAC7B,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,MAAM,GACf,IAAI,CAwBN;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,GACf;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAgBrC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,WAAW,EAAE,CAAC;CAC5B;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAyF/D;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EACf,WAAW,EAAE,WAAW,EAAE,GACzB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAsBpC"}
@@ -0,0 +1,447 @@
1
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "fs";
2
+ import { join, dirname, resolve } from "path";
3
+ import { homedir } from "os";
4
+ const SUPEROC_STORE_PATH = join(homedir(), ".config", "opencode", "superoc-keys.json");
5
+ const LEGACY_STORE_PATH = join(homedir(), ".config", "opencode", "nimsuper-keys.json");
6
+ const DEFAULT_STORE_PATH = existsSync(SUPEROC_STORE_PATH)
7
+ ? SUPEROC_STORE_PATH
8
+ : existsSync(LEGACY_STORE_PATH)
9
+ ? LEGACY_STORE_PATH
10
+ : SUPEROC_STORE_PATH;
11
+ export const MODEL_BLACKLIST_BASE_DURATION_MS = 30_000;
12
+ export const MODEL_BLACKLIST_MAX_DURATION_MS = 60 * 60 * 1000;
13
+ const MODEL_BLACKLIST_ESCALATION = 1.5;
14
+ const MAX_IMPORT_SIZE = 1024 * 1024;
15
+ const MAX_IMPORT_KEYS = 100;
16
+ const MAX_KEY_LENGTH = 1024;
17
+ const MAX_NAME_LENGTH = 128;
18
+ const SYSTEM_PATH_PREFIXES = ["/etc/", "/proc/", "/sys/", "/dev/"];
19
+ const PROVIDERS = ["nvidia", "google", "antigravity"];
20
+ export function getDefaultStore() {
21
+ return {
22
+ keys: [],
23
+ currentIndex: 0,
24
+ rotationStrategy: "round-robin",
25
+ updatedAt: Date.now(),
26
+ lastUsedKeyId: undefined,
27
+ fallbackChains: { nvidia: [], google: [], antigravity: [] },
28
+ maxRateLimitFailures: 3,
29
+ };
30
+ }
31
+ export function resolveStorePath(config) {
32
+ return (config?.storePath ??
33
+ process.env.SUPEROC_STORE_PATH ??
34
+ process.env.NIMSUPER_STORE_PATH ??
35
+ DEFAULT_STORE_PATH);
36
+ }
37
+ export function validateExportPath(filePath) {
38
+ const resolved = resolve(filePath);
39
+ for (const prefix of SYSTEM_PATH_PREFIXES) {
40
+ if (resolved.startsWith(prefix)) {
41
+ return "Cannot write to system directories";
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ function migrateStore(raw) {
47
+ const store = getDefaultStore();
48
+ if (raw.keys && Array.isArray(raw.keys)) {
49
+ store.keys = raw.keys
50
+ .filter((k) => k !== null && typeof k === "object")
51
+ .map((k) => {
52
+ const kr = k;
53
+ return {
54
+ ...k,
55
+ provider: kr.provider ?? "nvidia",
56
+ rateLimitCount: typeof k.rateLimitCount === "number" ? k.rateLimitCount : 0,
57
+ modelBlacklist: kr.modelBlacklist && typeof kr.modelBlacklist === "object"
58
+ ? kr.modelBlacklist
59
+ : undefined,
60
+ };
61
+ });
62
+ }
63
+ if (typeof raw.currentIndex === "number" &&
64
+ Number.isFinite(raw.currentIndex) &&
65
+ raw.currentIndex >= 0 &&
66
+ Number.isInteger(raw.currentIndex)) {
67
+ store.currentIndex = raw.currentIndex;
68
+ }
69
+ if (raw.rotationStrategy === "round-robin" || raw.rotationStrategy === "least-failures") {
70
+ store.rotationStrategy = raw.rotationStrategy;
71
+ }
72
+ if (typeof raw.updatedAt === "number") {
73
+ store.updatedAt = raw.updatedAt;
74
+ }
75
+ if (typeof raw.lastUsedKeyId === "string") {
76
+ store.lastUsedKeyId = raw.lastUsedKeyId;
77
+ }
78
+ if (raw.fallbackChain && Array.isArray(raw.fallbackChain)) {
79
+ store.fallbackChains = { nvidia: raw.fallbackChain, google: [], antigravity: [] };
80
+ }
81
+ else if (raw.fallbackChains && typeof raw.fallbackChains === "object") {
82
+ store.fallbackChains = {
83
+ nvidia: Array.isArray(raw.fallbackChains.nvidia) ? raw.fallbackChains.nvidia : [],
84
+ google: Array.isArray(raw.fallbackChains.google) ? raw.fallbackChains.google : [],
85
+ antigravity: Array.isArray(raw.fallbackChains.antigravity) ? raw.fallbackChains.antigravity : [],
86
+ };
87
+ }
88
+ if (typeof raw.maxRateLimitFailures === "number" &&
89
+ Number.isFinite(raw.maxRateLimitFailures) &&
90
+ raw.maxRateLimitFailures >= 1) {
91
+ store.maxRateLimitFailures = raw.maxRateLimitFailures;
92
+ }
93
+ return store;
94
+ }
95
+ export function loadStore(config) {
96
+ const storePath = resolveStorePath(config);
97
+ try {
98
+ if (existsSync(storePath)) {
99
+ const raw = readFileSync(storePath, "utf-8");
100
+ const data = JSON.parse(raw);
101
+ if (typeof data !== "object" || data === null) {
102
+ console.warn(`[nimsuper] Store at "${storePath}" is not a valid object`);
103
+ return null;
104
+ }
105
+ const store = migrateStore(data);
106
+ pruneAllExpiredBlacklists(store);
107
+ return store;
108
+ }
109
+ }
110
+ catch (err) {
111
+ console.error(`[nimsuper] Failed to load store at "${storePath}":`, err);
112
+ }
113
+ return null;
114
+ }
115
+ export function saveStore(store, config) {
116
+ const storePath = resolveStorePath(config);
117
+ pruneAllExpiredBlacklists(store);
118
+ const dir = dirname(storePath);
119
+ if (!existsSync(dir)) {
120
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
121
+ }
122
+ store.updatedAt = Date.now();
123
+ const tmpPath = storePath + ".tmp." + crypto.randomUUID();
124
+ try {
125
+ writeFileSync(tmpPath, JSON.stringify(store, null, 2) + "\n", {
126
+ mode: 0o600,
127
+ });
128
+ renameSync(tmpPath, storePath);
129
+ }
130
+ catch (err) {
131
+ try {
132
+ unlinkSync(tmpPath);
133
+ }
134
+ catch (cleanupErr) {
135
+ console.debug(`[nimsuper] Failed to clean up tmp file ${tmpPath}:`, cleanupErr);
136
+ }
137
+ throw err;
138
+ }
139
+ }
140
+ export function addKey(store, name, key, provider) {
141
+ const entry = {
142
+ id: crypto.randomUUID(),
143
+ name,
144
+ key,
145
+ createdAt: Date.now(),
146
+ rateLimitCount: 0,
147
+ enabled: true,
148
+ provider,
149
+ };
150
+ store.keys.push(entry);
151
+ }
152
+ export function removeKey(store, id) {
153
+ const index = store.keys.findIndex((k) => k.id === id);
154
+ if (index === -1)
155
+ return;
156
+ store.keys.splice(index, 1);
157
+ if (store.currentIndex >= store.keys.length) {
158
+ store.currentIndex = 0;
159
+ }
160
+ if (store.lastUsedKeyId === id) {
161
+ store.lastUsedKeyId = undefined;
162
+ }
163
+ }
164
+ export function renameKey(store, id, newName) {
165
+ const entry = store.keys.find((k) => k.id === id);
166
+ if (entry)
167
+ entry.name = newName;
168
+ }
169
+ export function toggleKey(store, id, enabled) {
170
+ const entry = store.keys.find((k) => k.id === id);
171
+ if (entry)
172
+ entry.enabled = enabled ?? !entry.enabled;
173
+ }
174
+ export function isKeyBlacklisted(entry, modelId, now = Date.now()) {
175
+ if (!modelId || !entry.modelBlacklist)
176
+ return false;
177
+ const slot = entry.modelBlacklist[modelId];
178
+ return !!slot && slot.blacklistedUntil > now;
179
+ }
180
+ export function getActiveKeys(store, provider, modelId) {
181
+ const enabled = store.keys.filter((k) => {
182
+ if (!k.enabled)
183
+ return false;
184
+ if (provider && k.provider !== provider)
185
+ return false;
186
+ return true;
187
+ });
188
+ const active = enabled.filter((k) => {
189
+ if (modelId && isKeyBlacklisted(k, modelId))
190
+ return false;
191
+ return true;
192
+ });
193
+ return active.length > 0 ? active : enabled;
194
+ }
195
+ export function getNextKey(store, config, modelId, provider) {
196
+ const active = getActiveKeys(store, provider, modelId);
197
+ if (active.length === 0)
198
+ return null;
199
+ const strategy = config?.rotationStrategy ?? store.rotationStrategy ?? "round-robin";
200
+ if (strategy === "least-failures") {
201
+ const now = Date.now();
202
+ const scoreBlacklists = (entry) => {
203
+ if (!entry.modelBlacklist)
204
+ return 0;
205
+ let sum = 0;
206
+ for (const slot of Object.values(entry.modelBlacklist)) {
207
+ if (slot.blacklistedUntil > now)
208
+ sum += slot.blacklistedUntil - now;
209
+ }
210
+ return sum;
211
+ };
212
+ const sorted = [...active].sort((a, b) => {
213
+ const aBlocked = scoreBlacklists(a);
214
+ const bBlocked = scoreBlacklists(b);
215
+ if (aBlocked !== bBlocked)
216
+ return aBlocked - bBlocked;
217
+ return (a.lastUsedAt ?? 0) - (b.lastUsedAt ?? 0);
218
+ });
219
+ const best = sorted[0];
220
+ const realIdx = store.keys.indexOf(best);
221
+ store.currentIndex = active.indexOf(best);
222
+ store.lastUsedKeyId = best.id;
223
+ best.lastUsedAt = Date.now();
224
+ return { key: best, index: realIdx };
225
+ }
226
+ const idx = store.currentIndex % active.length;
227
+ const selected = active[idx];
228
+ const realIdx = store.keys.indexOf(selected);
229
+ store.currentIndex = (idx + 1) % active.length;
230
+ store.lastUsedKeyId = selected.id;
231
+ selected.lastUsedAt = Date.now();
232
+ return { key: selected, index: realIdx };
233
+ }
234
+ export function resetFailures(store, keyId) {
235
+ const reset = (entry) => {
236
+ entry.rateLimitCount = 0;
237
+ delete entry.modelBlacklist;
238
+ };
239
+ if (keyId) {
240
+ const entry = store.keys.find((k) => k.id === keyId);
241
+ if (entry)
242
+ reset(entry);
243
+ }
244
+ else {
245
+ for (const k of store.keys)
246
+ reset(k);
247
+ }
248
+ }
249
+ export function recordRateLimit(store, keyId) {
250
+ const entry = store.keys.find((k) => k.id === keyId);
251
+ if (!entry)
252
+ return;
253
+ entry.rateLimitCount++;
254
+ }
255
+ export function resetRateLimit(store, keyId) {
256
+ const entry = store.keys.find((k) => k.id === keyId);
257
+ if (entry)
258
+ entry.rateLimitCount = 0;
259
+ }
260
+ export function recordModelRateLimit(store, keyId, modelId, now = Date.now()) {
261
+ const entry = store.keys.find((k) => k.id === keyId);
262
+ if (!entry)
263
+ return;
264
+ if (!entry.modelBlacklist)
265
+ entry.modelBlacklist = {};
266
+ const slot = entry.modelBlacklist[modelId];
267
+ if (slot && slot.blacklistedUntil > now) {
268
+ const remaining = slot.blacklistedUntil - now;
269
+ const extendedUntil = now + Math.max(remaining, MODEL_BLACKLIST_BASE_DURATION_MS);
270
+ const escalatedNext = Math.min(slot.nextDurationMs * MODEL_BLACKLIST_ESCALATION, MODEL_BLACKLIST_MAX_DURATION_MS);
271
+ entry.modelBlacklist[modelId] = {
272
+ blacklistedUntil: extendedUntil,
273
+ nextDurationMs: escalatedNext,
274
+ };
275
+ return;
276
+ }
277
+ const previousNext = slot?.nextDurationMs ?? MODEL_BLACKLIST_BASE_DURATION_MS;
278
+ const duration = Math.min(previousNext, MODEL_BLACKLIST_MAX_DURATION_MS);
279
+ entry.modelBlacklist[modelId] = {
280
+ blacklistedUntil: now + duration,
281
+ nextDurationMs: Math.min(duration * MODEL_BLACKLIST_ESCALATION, MODEL_BLACKLIST_MAX_DURATION_MS),
282
+ };
283
+ }
284
+ export function clearModelBlacklist(store, keyId, modelId) {
285
+ const entry = store.keys.find((k) => k.id === keyId);
286
+ if (!entry || !entry.modelBlacklist)
287
+ return;
288
+ delete entry.modelBlacklist[modelId];
289
+ if (Object.keys(entry.modelBlacklist).length === 0) {
290
+ delete entry.modelBlacklist;
291
+ }
292
+ }
293
+ export function pruneAllExpiredBlacklists(store, now = Date.now()) {
294
+ for (const entry of store.keys) {
295
+ if (!entry.modelBlacklist)
296
+ continue;
297
+ for (const [modelId, slot] of Object.entries(entry.modelBlacklist)) {
298
+ if (slot.blacklistedUntil <= now) {
299
+ delete entry.modelBlacklist[modelId];
300
+ }
301
+ }
302
+ if (Object.keys(entry.modelBlacklist).length === 0) {
303
+ delete entry.modelBlacklist;
304
+ }
305
+ }
306
+ }
307
+ export function exportKeys(store) {
308
+ return {
309
+ version: 1,
310
+ exportedAt: Date.now(),
311
+ keys: store.keys.map((k) => ({ name: k.name, key: k.key, provider: k.provider })),
312
+ };
313
+ }
314
+ export function writeExportFile(payload, filePath) {
315
+ const pathError = validateExportPath(filePath);
316
+ if (pathError)
317
+ throw new Error(pathError);
318
+ const dir = dirname(filePath);
319
+ if (!existsSync(dir)) {
320
+ mkdirSync(dir, { recursive: true, mode: 0o700 });
321
+ }
322
+ const tmpPath = filePath + ".tmp." + process.pid;
323
+ try {
324
+ writeFileSync(tmpPath, JSON.stringify(payload, null, 2) + "\n", {
325
+ mode: 0o600,
326
+ });
327
+ renameSync(tmpPath, filePath);
328
+ }
329
+ catch (err) {
330
+ try {
331
+ unlinkSync(tmpPath);
332
+ }
333
+ catch (cleanupErr) {
334
+ console.debug(`[nimsuper] Failed to clean up tmp file ${tmpPath}:`, cleanupErr);
335
+ }
336
+ throw err;
337
+ }
338
+ }
339
+ export function readAndValidateImportFile(filePath) {
340
+ const resolved = resolve(filePath);
341
+ for (const prefix of SYSTEM_PATH_PREFIXES) {
342
+ if (resolved.startsWith(prefix)) {
343
+ return { error: "Cannot read from system directories" };
344
+ }
345
+ }
346
+ let raw;
347
+ try {
348
+ raw = readFileSync(resolved, "utf-8");
349
+ }
350
+ catch (err) {
351
+ console.debug(`[nimsuper] Cannot read import file ${resolved}:`, err);
352
+ return { error: "Cannot read file" };
353
+ }
354
+ return { raw };
355
+ }
356
+ export function validateImportPayload(raw) {
357
+ const result = {
358
+ added: 0,
359
+ skipped: 0,
360
+ errors: [],
361
+ pendingKeys: [],
362
+ };
363
+ if (raw.length > MAX_IMPORT_SIZE) {
364
+ result.errors.push(`Import file too large (max ${MAX_IMPORT_SIZE / 1024}KB)`);
365
+ return result;
366
+ }
367
+ let data;
368
+ try {
369
+ data = JSON.parse(raw);
370
+ }
371
+ catch (err) {
372
+ console.debug("[nimsuper] Import file invalid JSON:", err);
373
+ result.errors.push("Invalid JSON format");
374
+ return result;
375
+ }
376
+ if (typeof data !== "object" || data === null) {
377
+ result.errors.push("Expected a JSON object");
378
+ return result;
379
+ }
380
+ const rec = data;
381
+ if (rec.version !== 1) {
382
+ result.errors.push("Unsupported export version");
383
+ return result;
384
+ }
385
+ if (!Array.isArray(rec.keys)) {
386
+ result.errors.push("Missing or invalid 'keys' array");
387
+ return result;
388
+ }
389
+ for (const entry of rec.keys) {
390
+ if (result.pendingKeys.length >= MAX_IMPORT_KEYS) {
391
+ result.errors.push(`Too many keys in import file (max ${MAX_IMPORT_KEYS})`);
392
+ break;
393
+ }
394
+ if (typeof entry !== "object" ||
395
+ entry === null ||
396
+ typeof entry.name !== "string" ||
397
+ typeof entry.key !== "string") {
398
+ result.errors.push("Invalid key entry: must have 'name' and 'key' strings");
399
+ continue;
400
+ }
401
+ const name = entry.name.trim();
402
+ const key = entry.key.trim();
403
+ const provider = entry.provider ?? "nvidia";
404
+ if (!name) {
405
+ result.errors.push("Key entry has empty name");
406
+ continue;
407
+ }
408
+ if (name.length > MAX_NAME_LENGTH) {
409
+ result.errors.push("Key name exceeds maximum length");
410
+ continue;
411
+ }
412
+ if (!key) {
413
+ result.errors.push(`Key "${name}" has empty key value`);
414
+ continue;
415
+ }
416
+ if (key.length > MAX_KEY_LENGTH) {
417
+ result.errors.push(`Key "${name}" exceeds maximum length`);
418
+ continue;
419
+ }
420
+ if (provider === "nvidia" && !key.startsWith("nvapi-")) {
421
+ result.errors.push(`Key "${name}" does not start with 'nvapi-'`);
422
+ continue;
423
+ }
424
+ result.pendingKeys.push({ name, key, provider });
425
+ }
426
+ return result;
427
+ }
428
+ export function applyImport(store, pendingKeys) {
429
+ let added = 0;
430
+ let skipped = 0;
431
+ for (const { name, key, provider } of pendingKeys) {
432
+ const existingByName = store.keys.find((k) => k.name === name && k.provider === provider);
433
+ if (existingByName) {
434
+ skipped++;
435
+ continue;
436
+ }
437
+ const existingByKey = store.keys.find((k) => k.key === key && k.provider === provider);
438
+ if (existingByKey) {
439
+ skipped++;
440
+ continue;
441
+ }
442
+ addKey(store, name, key, provider);
443
+ added++;
444
+ }
445
+ return { added, skipped };
446
+ }
447
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ export interface SelectThemeColors {
2
+ backgroundColor: string;
3
+ focusedBackgroundColor: string;
4
+ focusedTextColor: string;
5
+ selectedBackgroundColor: string;
6
+ selectedTextColor: string;
7
+ textColor: string;
8
+ descriptionColor: string;
9
+ selectedDescriptionColor: string;
10
+ }
11
+ export interface InputThemeColors {
12
+ backgroundColor: string;
13
+ focusedBackgroundColor: string;
14
+ textColor: string;
15
+ cursorColor: string;
16
+ }
17
+ export declare function selectColors(theme: RotatorTheme): SelectThemeColors;
18
+ export declare function inputColors(theme: RotatorTheme): InputThemeColors;
19
+ export declare function dangerSelectColors(theme: RotatorTheme): SelectThemeColors;
20
+ export declare function applySelectColors(target: {
21
+ backgroundColor: string;
22
+ focusedBackgroundColor: string;
23
+ focusedTextColor: string;
24
+ selectedBackgroundColor: string;
25
+ selectedTextColor: string;
26
+ textColor: string;
27
+ descriptionColor: string;
28
+ selectedDescriptionColor: string;
29
+ }, colors: SelectThemeColors): void;
30
+ export interface RotatorTheme {
31
+ id: string;
32
+ name: string;
33
+ background: string;
34
+ backgroundPanel: string;
35
+ backgroundElement: string;
36
+ text: string;
37
+ textMuted: string;
38
+ primary: string;
39
+ primaryMuted: string;
40
+ accent: string;
41
+ error: string;
42
+ errorBg: string;
43
+ success: string;
44
+ warning: string;
45
+ selectedBg: string;
46
+ selectedText: string;
47
+ border: string;
48
+ borderActive: string;
49
+ inputBg: string;
50
+ inputFocusedBg: string;
51
+ cursor: string;
52
+ description: string;
53
+ selectedDescription: string;
54
+ }
55
+ export declare function getTheme(id: string): RotatorTheme;
56
+ export declare function listThemes(): RotatorTheme[];
57
+ export declare function getThemeIdFromOpenCodeConfig(): string | null;
58
+ export declare function getResolvedTheme(): RotatorTheme;
59
+ export declare function getThemeOverride(): string | null;
60
+ export declare function saveThemeOverride(themeId: string): void;
61
+ export declare function setPreviewTheme(themeId: string | null): void;
62
+ export declare function getPreviewTheme(): string | null;
63
+ export declare function getActiveTheme(): RotatorTheme;
64
+ //# sourceMappingURL=themes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"themes.d.ts","sourceRoot":"","sources":["../src/themes.ts"],"names":[],"mappings":"AAmFA,MAAM,WAAW,iBAAiB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAWnE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,gBAAgB,CAOjE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,CAWzE;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE;IACN,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,gBAAgB,EAAE,MAAM,CAAC;IACzB,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,MAAM,CAAC;CAClC,EACD,MAAM,EAAE,iBAAiB,GACxB,IAAI,CASN;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AA+PD,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAEjD;AAED,wBAAgB,UAAU,IAAI,YAAY,EAAE,CAE3C;AAED,wBAAgB,4BAA4B,IAAI,MAAM,GAAG,IAAI,CAG5D;AAED,wBAAgB,gBAAgB,IAAI,YAAY,CAM/C;AAUD,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAQhD;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAevD;AAID,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE5D;AAED,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,cAAc,IAAI,YAAY,CAS7C"}