opencode-nim-rotator 0.0.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.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +201 -0
  3. package/bin/opencode-nim-rotator.ts +10 -0
  4. package/dist/index.d.ts +4 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +103 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/storage.d.ts +18 -0
  9. package/dist/storage.d.ts.map +1 -0
  10. package/dist/storage.js +129 -0
  11. package/dist/storage.js.map +1 -0
  12. package/dist/themes.d.ts +64 -0
  13. package/dist/themes.d.ts.map +1 -0
  14. package/dist/themes.js +422 -0
  15. package/dist/themes.js.map +1 -0
  16. package/dist/tui/actions.d.ts +3 -0
  17. package/dist/tui/actions.d.ts.map +1 -0
  18. package/dist/tui/actions.js +68 -0
  19. package/dist/tui/actions.js.map +1 -0
  20. package/dist/tui/app.d.ts +2 -0
  21. package/dist/tui/app.d.ts.map +1 -0
  22. package/dist/tui/app.js +141 -0
  23. package/dist/tui/app.js.map +1 -0
  24. package/dist/tui/screens.d.ts +10 -0
  25. package/dist/tui/screens.d.ts.map +1 -0
  26. package/dist/tui/screens.js +316 -0
  27. package/dist/tui/screens.js.map +1 -0
  28. package/dist/tui/state.d.ts +29 -0
  29. package/dist/tui/state.d.ts.map +1 -0
  30. package/dist/tui/state.js +47 -0
  31. package/dist/tui/state.js.map +1 -0
  32. package/dist/tui/types.d.ts +12 -0
  33. package/dist/tui/types.d.ts.map +1 -0
  34. package/dist/tui/types.js +2 -0
  35. package/dist/tui/types.js.map +1 -0
  36. package/dist/tui/ui.d.ts +17 -0
  37. package/dist/tui/ui.d.ts.map +1 -0
  38. package/dist/tui/ui.js +77 -0
  39. package/dist/tui/ui.js.map +1 -0
  40. package/dist/types.d.ts +22 -0
  41. package/dist/types.d.ts.map +1 -0
  42. package/dist/types.js +2 -0
  43. package/dist/types.js.map +1 -0
  44. package/package.json +62 -0
  45. package/scripts/postinstall.js +69 -0
  46. package/scripts/uninstall.js +79 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ScreenContent } from "./types.js";
2
+ export declare function buildMainMenu(): ScreenContent;
3
+ export declare function buildKeySelector(): ScreenContent;
4
+ export declare function buildKeyActions(): ScreenContent;
5
+ export declare function buildThemeSelector(): ScreenContent;
6
+ export declare function buildConfirmDelete(): ScreenContent;
7
+ export declare function buildAddNameInput(): ScreenContent;
8
+ export declare function buildAddKeyInput(): ScreenContent;
9
+ export declare function buildRenameInput(): ScreenContent;
10
+ //# sourceMappingURL=screens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.d.ts","sourceRoot":"","sources":["../../src/tui/screens.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,YAAY,CAAC;AAgB9D,wBAAgB,aAAa,IAAI,aAAa,CAmD7C;AAMD,wBAAgB,gBAAgB,IAAI,aAAa,CAuChD;AAMD,wBAAgB,eAAe,IAAI,aAAa,CA0D/C;AAMD,wBAAgB,kBAAkB,IAAI,aAAa,CAoElD;AAMD,wBAAgB,kBAAkB,IAAI,aAAa,CA+ClD;AAMD,wBAAgB,iBAAiB,IAAI,aAAa,CA+BjD;AAMD,wBAAgB,gBAAgB,IAAI,aAAa,CAiChD;AAMD,wBAAgB,gBAAgB,IAAI,aAAa,CAkDhD"}
@@ -0,0 +1,316 @@
1
+ import { Box, Text } from "@opentui/core";
2
+ import { getActiveTheme, getTheme, getResolvedTheme, getThemeOverride, listThemes, saveThemeOverride, setPreviewTheme, dangerSelectColors, } from "../themes.js";
3
+ import { addKey, getMaxFailures, removeKey, renameKey, saveStore, } from "../storage.js";
4
+ import { state, navigate, callRenderApp, refreshStore, setStatus, clampIndex, } from "./state.js";
5
+ import { themedSelect, themedInput, events, maskKey, applyThemeToScreen, } from "./ui.js";
6
+ import { handleMenuSelect, handleKeyAction } from "./actions.js";
7
+ function keyStatus(entry) {
8
+ const maxFails = getMaxFailures();
9
+ return !entry.enabled
10
+ ? "OFF"
11
+ : entry.failureCount >= maxFails
12
+ ? "FAIL"
13
+ : "OK";
14
+ }
15
+ // ---------------------------------------------------------------------------
16
+ // Main Menu
17
+ // ---------------------------------------------------------------------------
18
+ export function buildMainMenu() {
19
+ const { store } = state;
20
+ const hasKeys = store.keys.length > 0;
21
+ const theme = getActiveTheme();
22
+ const override = getThemeOverride();
23
+ const opts = [
24
+ hasKeys && {
25
+ name: "Manage Keys",
26
+ description: "Select a key to rename, delete, or toggle",
27
+ value: "manage",
28
+ },
29
+ {
30
+ name: "Add Key",
31
+ description: "Add a new NVIDIA NIM API key",
32
+ value: "add",
33
+ },
34
+ hasKeys && {
35
+ name: "Reset Failures",
36
+ description: "Reset all failure counts to zero",
37
+ value: "reset-failures",
38
+ },
39
+ {
40
+ name: `Strategy: ${store.rotationStrategy}`,
41
+ description: "Toggle between round-robin and least-failures",
42
+ value: "toggle-strategy",
43
+ },
44
+ {
45
+ name: `Theme: ${theme.name}${!override ? " (synced with opencode)" : ""}`,
46
+ description: "Change the color theme",
47
+ value: "theme",
48
+ },
49
+ { name: "Quit", description: "Exit the key manager", value: "quit" },
50
+ ];
51
+ const options = opts.filter(Boolean);
52
+ state.mainMenuIndex = clampIndex(state.mainMenuIndex, options.length);
53
+ const menu = themedSelect("main-menu", 56, 12, options, state.mainMenuIndex, (idx, opt) => {
54
+ state.mainMenuIndex = idx;
55
+ handleMenuSelect(opt.value);
56
+ });
57
+ return { element: menu, helpText: "[Ctrl+C] quit" };
58
+ }
59
+ // ---------------------------------------------------------------------------
60
+ // Key Selector
61
+ // ---------------------------------------------------------------------------
62
+ export function buildKeySelector() {
63
+ const options = state.store.keys.map((entry) => ({
64
+ name: `${entry.name} [${keyStatus(entry)}]`,
65
+ description: `${maskKey(entry.key)} fails:${entry.failureCount} ${entry.lastUsedAt ? new Date(entry.lastUsedAt).toLocaleString() : "never used"}`,
66
+ value: entry.id,
67
+ }));
68
+ if (options.length === 0) {
69
+ navigate("list");
70
+ return { element: Text({ content: "", fg: "#000000" }), helpText: "" };
71
+ }
72
+ state.keySelectorIndex = clampIndex(state.keySelectorIndex, options.length);
73
+ const selector = themedSelect("key-selector", 64, 12, options, state.keySelectorIndex, (idx, opt) => {
74
+ state.keySelectorIndex = idx;
75
+ state.selectedKeyId = opt.value;
76
+ state.keyActionsIndex = 0;
77
+ navigate("key-actions");
78
+ });
79
+ return {
80
+ element: Box({ flexDirection: "column", gap: 1 }, Text({
81
+ content: " Select a key to manage:",
82
+ fg: getActiveTheme().primary,
83
+ }), selector),
84
+ helpText: "[Esc] back",
85
+ };
86
+ }
87
+ // ---------------------------------------------------------------------------
88
+ // Key Actions
89
+ // ---------------------------------------------------------------------------
90
+ export function buildKeyActions() {
91
+ const { selectedKeyId } = state;
92
+ if (!selectedKeyId) {
93
+ navigate("key-selector");
94
+ return { element: Text({ content: "", fg: "#000000" }), helpText: "" };
95
+ }
96
+ const entry = state.store.keys.find((k) => k.id === selectedKeyId);
97
+ if (!entry) {
98
+ state.selectedKeyId = null;
99
+ navigate("key-selector");
100
+ return { element: Text({ content: "", fg: "#000000" }), helpText: "" };
101
+ }
102
+ const options = [
103
+ {
104
+ name: `Toggle ${entry.enabled ? "OFF" : "ON"}`,
105
+ description: `${entry.enabled ? "Disable" : "Enable"} this key`,
106
+ value: "toggle",
107
+ },
108
+ {
109
+ name: "Rename",
110
+ description: "Change the friendly name",
111
+ value: "rename",
112
+ },
113
+ {
114
+ name: "Delete",
115
+ description: "Remove this key permanently",
116
+ value: "delete",
117
+ },
118
+ { name: "Back", description: "Return to key list", value: "back" },
119
+ ];
120
+ state.keyActionsIndex = clampIndex(state.keyActionsIndex, options.length);
121
+ const actions = themedSelect("key-actions", 40, 8, options, state.keyActionsIndex, (idx, opt) => {
122
+ state.keyActionsIndex = idx;
123
+ handleKeyAction(opt.value);
124
+ });
125
+ return {
126
+ element: Box({ flexDirection: "column", gap: 1 }, Text({
127
+ content: ` Key: ${entry.name} (${maskKey(entry.key)})`,
128
+ fg: getActiveTheme().primary,
129
+ }), actions),
130
+ helpText: "[Esc] back",
131
+ };
132
+ }
133
+ // ---------------------------------------------------------------------------
134
+ // Theme Selector
135
+ // ---------------------------------------------------------------------------
136
+ export function buildThemeSelector() {
137
+ const theme = getActiveTheme();
138
+ const allThemes = listThemes();
139
+ const currentOverride = getThemeOverride();
140
+ const resolvedId = getResolvedTheme().id;
141
+ const activeId = theme.id;
142
+ const options = [
143
+ {
144
+ name: "sync",
145
+ description: "Sync with opencode theme (default)",
146
+ value: "sync",
147
+ },
148
+ ...allThemes.map((th) => ({
149
+ name: th.id,
150
+ description: `${th.name}${th.id === activeId ? " *" : ""}${th.id === resolvedId && !currentOverride ? " (opencode)" : ""}`,
151
+ value: th.id,
152
+ })),
153
+ ];
154
+ state.themeSelectorIndex = clampIndex(currentOverride ? options.findIndex((o) => o.value === currentOverride) : 0, options.length);
155
+ const selector = themedSelect("theme-selector", 56, 12, options, state.themeSelectorIndex, (_index, option) => {
156
+ state.themeSelectorIndex = _index;
157
+ setPreviewTheme(null);
158
+ if (option.value === "sync") {
159
+ saveThemeOverride("");
160
+ setStatus("Theme synced with opencode", theme.success);
161
+ }
162
+ else {
163
+ saveThemeOverride(option.value);
164
+ setStatus(`Theme set to ${option.value}`, theme.success);
165
+ }
166
+ refreshStore();
167
+ navigate("list");
168
+ });
169
+ events(selector).on("selectionChanged", (index) => {
170
+ state.themeSelectorIndex = index;
171
+ const option = options[index];
172
+ if (!option)
173
+ return;
174
+ const previewId = option.value === "sync" ? getResolvedTheme().id : option.value;
175
+ setPreviewTheme(previewId);
176
+ applyThemeToScreen(getTheme(previewId));
177
+ });
178
+ return {
179
+ element: Box({ flexDirection: "column", gap: 1 }, Text({
180
+ id: "theme-label",
181
+ content: " Select a theme:",
182
+ fg: theme.primary,
183
+ }), selector),
184
+ helpText: "[Esc] back [Enter] apply",
185
+ };
186
+ }
187
+ // ---------------------------------------------------------------------------
188
+ // Confirm Delete
189
+ // ---------------------------------------------------------------------------
190
+ export function buildConfirmDelete() {
191
+ const entry = state.store.keys.find((k) => k.id === state.deleteTargetId);
192
+ const name = entry?.name ?? "this key";
193
+ const options = [
194
+ {
195
+ name: "Yes, delete",
196
+ description: `Permanently remove "${name}"`,
197
+ value: "yes",
198
+ },
199
+ { name: "No, cancel", description: "Keep the key", value: "no" },
200
+ ];
201
+ const confirm = themedSelect("confirm-delete", 40, 6, options, 0, (_index, option) => {
202
+ if (option.value === "yes" && state.deleteTargetId) {
203
+ const e = state.store.keys.find((k) => k.id === state.deleteTargetId);
204
+ const n = e?.name ?? "key";
205
+ removeKey(state.store, state.deleteTargetId);
206
+ saveStore(state.store);
207
+ refreshStore();
208
+ if (state.keySelectorIndex >= state.store.keys.length)
209
+ state.keySelectorIndex = Math.max(0, state.store.keys.length - 1);
210
+ setStatus(`Deleted "${n}"`, getActiveTheme().error);
211
+ }
212
+ state.deleteTargetId = null;
213
+ navigate("key-actions");
214
+ }, dangerSelectColors(getActiveTheme()));
215
+ return {
216
+ element: Box({ flexDirection: "column", gap: 1 }, Text({
217
+ content: "Are you sure you want to delete this key?",
218
+ fg: getActiveTheme().error,
219
+ }), confirm),
220
+ helpText: "[Esc] cancel",
221
+ };
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Add Name Input
225
+ // ---------------------------------------------------------------------------
226
+ export function buildAddNameInput() {
227
+ const theme = getActiveTheme();
228
+ const input = themedInput("add-name-input", "e.g. work-key, personal, team-alpha", 40);
229
+ events(input).on("enter", (value) => {
230
+ state.pendingKeyName = value.trim();
231
+ if (!state.pendingKeyName) {
232
+ setStatus("Name is required", theme.error);
233
+ callRenderApp();
234
+ return;
235
+ }
236
+ if (state.store.keys.some((k) => k.name === state.pendingKeyName)) {
237
+ setStatus("A key with this name already exists", theme.error);
238
+ callRenderApp();
239
+ return;
240
+ }
241
+ navigate("add-key");
242
+ });
243
+ return {
244
+ element: Box({ flexDirection: "column", gap: 1 }, Text({ content: "Enter a friendly name for this key:", fg: theme.text }), input),
245
+ helpText: "[Enter] next [Esc] cancel",
246
+ };
247
+ }
248
+ // ---------------------------------------------------------------------------
249
+ // Add Key Input
250
+ // ---------------------------------------------------------------------------
251
+ export function buildAddKeyInput() {
252
+ const theme = getActiveTheme();
253
+ const input = themedInput("add-key-input", "nvapi-...", 55);
254
+ events(input).on("enter", (value) => {
255
+ const key = value.trim();
256
+ if (!key) {
257
+ setStatus("API key is required", theme.error);
258
+ callRenderApp();
259
+ return;
260
+ }
261
+ if (!key.startsWith("nvapi-")) {
262
+ setStatus("Key must start with 'nvapi-'", theme.error);
263
+ callRenderApp();
264
+ return;
265
+ }
266
+ addKey(state.store, state.pendingKeyName, key);
267
+ saveStore(state.store);
268
+ refreshStore();
269
+ setStatus(`Added key "${state.pendingKeyName}"`, theme.success);
270
+ state.pendingKeyName = "";
271
+ navigate("list");
272
+ });
273
+ return {
274
+ element: Box({ flexDirection: "column", gap: 1 }, Text({ content: `Name: ${state.pendingKeyName}`, fg: theme.primary }), Text({ content: "Enter the NVIDIA NIM API key:", fg: theme.text }), input),
275
+ helpText: "[Enter] confirm [Esc] cancel",
276
+ };
277
+ }
278
+ // ---------------------------------------------------------------------------
279
+ // Rename Input
280
+ // ---------------------------------------------------------------------------
281
+ export function buildRenameInput() {
282
+ const theme = getActiveTheme();
283
+ if (!state.renameTargetId) {
284
+ return {
285
+ element: Text({ content: "Error: no key selected", fg: theme.error }),
286
+ helpText: "",
287
+ };
288
+ }
289
+ const entry = state.store.keys.find((k) => k.id === state.renameTargetId);
290
+ const currentName = entry?.name ?? "";
291
+ const input = themedInput("rename-input", "New friendly name", 40, currentName);
292
+ events(input).on("enter", (value) => {
293
+ const newName = value.trim();
294
+ if (!newName) {
295
+ setStatus("Name is required", theme.error);
296
+ callRenderApp();
297
+ return;
298
+ }
299
+ if (state.store.keys.some((k) => k.name === newName && k.id !== state.renameTargetId)) {
300
+ setStatus("A key with this name already exists", theme.error);
301
+ callRenderApp();
302
+ return;
303
+ }
304
+ renameKey(state.store, state.renameTargetId, newName);
305
+ saveStore(state.store);
306
+ refreshStore();
307
+ setStatus(`Renamed to "${newName}"`, theme.success);
308
+ state.renameTargetId = null;
309
+ navigate("key-actions");
310
+ });
311
+ return {
312
+ element: Box({ flexDirection: "column", gap: 1 }, Text({ content: "Enter new name:", fg: theme.text }), input),
313
+ helpText: "[Enter] confirm [Esc] cancel",
314
+ };
315
+ }
316
+ //# sourceMappingURL=screens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screens.js","sourceRoot":"","sources":["../../src/tui/screens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { KeyStore } from "../types.js";
2
+ import type { Screen } from "./types.js";
3
+ import type { CliRenderer } from "@opentui/core";
4
+ export declare const state: {
5
+ store: KeyStore;
6
+ currentScreen: Screen;
7
+ deleteTargetId: string | null;
8
+ renameTargetId: string | null;
9
+ pendingKeyName: string;
10
+ selectedKeyId: string | null;
11
+ statusMessage: string;
12
+ statusColor: string;
13
+ focusTargetId: string | null;
14
+ mainMenuIndex: number;
15
+ keySelectorIndex: number;
16
+ keyActionsIndex: number;
17
+ themeSelectorIndex: number;
18
+ isRendering: boolean;
19
+ renderPending: boolean;
20
+ renderer: CliRenderer | null;
21
+ };
22
+ export declare function setNavigate(fn: (screen: Screen) => void): void;
23
+ export declare function setRenderApp(fn: () => void): void;
24
+ export declare function navigate(screen: Screen): void;
25
+ export declare function callRenderApp(): void;
26
+ export declare function refreshStore(): void;
27
+ export declare function setStatus(msg: string, color?: string): void;
28
+ export declare function clampIndex(index: number, length: number): number;
29
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,eAAO,MAAM,KAAK,EAAE;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;CAkB9B,CAAC;AAKF,wBAAgB,WAAW,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAE9D;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI,CAEjD;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAG3D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhE"}
@@ -0,0 +1,47 @@
1
+ import { loadStore } from "../storage.js";
2
+ import { getActiveTheme } from "../themes.js";
3
+ export const state = {
4
+ store: loadStore(),
5
+ currentScreen: "list",
6
+ deleteTargetId: null,
7
+ renameTargetId: null,
8
+ pendingKeyName: "",
9
+ selectedKeyId: null,
10
+ statusMessage: "",
11
+ statusColor: "#888888",
12
+ focusTargetId: null,
13
+ mainMenuIndex: 0,
14
+ keySelectorIndex: 0,
15
+ keyActionsIndex: 0,
16
+ themeSelectorIndex: 0,
17
+ isRendering: false,
18
+ renderPending: false,
19
+ renderer: null,
20
+ };
21
+ let navigateImpl = null;
22
+ let renderAppImpl = null;
23
+ export function setNavigate(fn) {
24
+ navigateImpl = fn;
25
+ }
26
+ export function setRenderApp(fn) {
27
+ renderAppImpl = fn;
28
+ }
29
+ export function navigate(screen) {
30
+ if (navigateImpl)
31
+ navigateImpl(screen);
32
+ }
33
+ export function callRenderApp() {
34
+ if (renderAppImpl)
35
+ renderAppImpl();
36
+ }
37
+ export function refreshStore() {
38
+ state.store = loadStore();
39
+ }
40
+ export function setStatus(msg, color) {
41
+ state.statusMessage = msg;
42
+ state.statusColor = color ?? getActiveTheme().textMuted;
43
+ }
44
+ export function clampIndex(index, length) {
45
+ return index >= length ? Math.max(0, length - 1) : index;
46
+ }
47
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tui/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAI9C,MAAM,CAAC,MAAM,KAAK,GAiBd;IACF,KAAK,EAAE,SAAS,EAAc;IAC9B,aAAa,EAAE,MAAM;IACrB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,IAAI;IACpB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,SAAS;IACtB,aAAa,EAAE,IAAI;IACnB,aAAa,EAAE,CAAC;IAChB,gBAAgB,EAAE,CAAC;IACnB,eAAe,EAAE,CAAC;IAClB,kBAAkB,EAAE,CAAC;IACrB,WAAW,EAAE,KAAK;IAClB,aAAa,EAAE,KAAK;IACpB,QAAQ,EAAE,IAAI;CACf,CAAC;AAEF,IAAI,YAAY,GAAsC,IAAI,CAAC;AAC3D,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,EAA4B;IACtD,YAAY,GAAG,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAc;IACzC,aAAa,GAAG,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,MAAc;IACrC,IAAI,YAAY;QAAE,YAAY,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,aAAa;QAAE,aAAa,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,KAAK,CAAC,KAAK,GAAG,SAAS,EAAc,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAc;IACnD,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC;IAC1B,KAAK,CAAC,WAAW,GAAG,KAAK,IAAI,cAAc,EAAE,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,MAAc;IACtD,OAAO,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { VNode } from "@opentui/core";
2
+ export type Screen = "list" | "key-selector" | "key-actions" | "add-name" | "add-key" | "rename" | "confirm-delete" | "theme-selector";
3
+ export interface SelectOption {
4
+ name: string;
5
+ description: string;
6
+ value: string;
7
+ }
8
+ export interface ScreenContent {
9
+ element: VNode;
10
+ helpText: string;
11
+ }
12
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tui/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,MAAM,MAAM,GACd,MAAM,GACN,cAAc,GACd,aAAa,GACb,UAAU,GACV,SAAS,GACT,QAAQ,GACR,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,KAAK,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tui/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import type { VNode } from "@opentui/core";
2
+ import { selectColors } from "../themes.js";
3
+ import type { RotatorTheme } from "../themes.js";
4
+ import type { SelectOption } from "./types.js";
5
+ type EventHandler = (...args: any[]) => void;
6
+ interface EventTarget {
7
+ on(event: "itemSelected" | "selectionChanged" | "enter", handler: EventHandler): void;
8
+ on(event: string, handler: EventHandler): void;
9
+ }
10
+ export declare function events(vnode: VNode): EventTarget;
11
+ export declare function asRenderable(id: string): any;
12
+ export declare function maskKey(key: string): string;
13
+ export declare function themedSelect(id: string, width: number, height: number, options: SelectOption[], index: number, onItemSelected: (_index: number, option: SelectOption) => void, colors?: ReturnType<typeof selectColors>): VNode;
14
+ export declare function themedInput(id: string, placeholder: string, width: number, value?: string): VNode;
15
+ export declare function applyThemeToScreen(theme: RotatorTheme): void;
16
+ export {};
17
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../src/tui/ui.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAEL,YAAY,EAGb,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,KAAK,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAE7C,UAAU,WAAW;IACnB,EAAE,CACA,KAAK,EAAE,cAAc,GAAG,kBAAkB,GAAG,OAAO,EACpD,OAAO,EAAE,YAAY,GACpB,IAAI,CAAC;IACR,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAChD;AAED,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,WAAW,CAEhD;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,CAE5C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,KAAK,IAAI,EAC9D,MAAM,CAAC,EAAE,UAAU,CAAC,OAAO,YAAY,CAAC,GACvC,KAAK,CAqBP;AAED,wBAAgB,WAAW,CACzB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,KAAK,CAaP;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA4B5D"}
package/dist/tui/ui.js ADDED
@@ -0,0 +1,77 @@
1
+ import { Select, Input } from "@opentui/core";
2
+ import { getActiveTheme, selectColors, inputColors, applySelectColors, } from "../themes.js";
3
+ import { state } from "./state.js";
4
+ export function events(vnode) {
5
+ return vnode;
6
+ }
7
+ export function asRenderable(id) {
8
+ return state.renderer?.root.findDescendantById(id);
9
+ }
10
+ export function maskKey(key) {
11
+ return key.length <= 8 ? "****" : `${key.slice(0, 4)}****${key.slice(-4)}`;
12
+ }
13
+ export function themedSelect(id, width, height, options, index, onItemSelected, colors) {
14
+ const theme = getActiveTheme();
15
+ const c = colors ?? selectColors(theme);
16
+ const sel = Select({
17
+ id,
18
+ width,
19
+ height,
20
+ options,
21
+ selectedIndex: index,
22
+ backgroundColor: c.backgroundColor,
23
+ focusedBackgroundColor: c.focusedBackgroundColor,
24
+ focusedTextColor: c.focusedTextColor,
25
+ selectedBackgroundColor: c.selectedBackgroundColor,
26
+ selectedTextColor: c.selectedTextColor,
27
+ textColor: c.textColor,
28
+ descriptionColor: c.descriptionColor,
29
+ selectedDescriptionColor: c.selectedDescriptionColor,
30
+ });
31
+ events(sel).on("itemSelected", onItemSelected);
32
+ state.focusTargetId = id;
33
+ return sel;
34
+ }
35
+ export function themedInput(id, placeholder, width, value) {
36
+ const c = inputColors(getActiveTheme());
37
+ state.focusTargetId = id;
38
+ return Input({
39
+ id,
40
+ placeholder,
41
+ width,
42
+ value,
43
+ backgroundColor: c.backgroundColor,
44
+ focusedBackgroundColor: c.focusedBackgroundColor,
45
+ textColor: c.textColor,
46
+ cursorColor: c.cursorColor,
47
+ });
48
+ }
49
+ export function applyThemeToScreen(theme) {
50
+ if (!state.renderer)
51
+ return;
52
+ state.renderer.setBackgroundColor(theme.background);
53
+ const sel = asRenderable("theme-selector");
54
+ if (sel)
55
+ applySelectColors(sel, selectColors(theme));
56
+ const screenRoot = asRenderable("screen-root");
57
+ if (screenRoot)
58
+ screenRoot.backgroundColor = theme.background;
59
+ const panel = asRenderable("panel");
60
+ if (panel) {
61
+ panel.backgroundColor = theme.backgroundPanel;
62
+ panel.borderColor = theme.border;
63
+ }
64
+ for (const [id, color] of [
65
+ ["title-text", theme.primary],
66
+ ["keys-count", theme.textMuted],
67
+ ["active-count", theme.success],
68
+ ["status-text", state.statusColor],
69
+ ["help-text", theme.textMuted],
70
+ ["theme-label", theme.primary],
71
+ ]) {
72
+ const el = asRenderable(id);
73
+ if (el)
74
+ el.fg = color;
75
+ }
76
+ }
77
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../src/tui/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface ApiKeyEntry {
2
+ id: string;
3
+ name: string;
4
+ key: string;
5
+ createdAt: number;
6
+ lastUsedAt?: number;
7
+ failureCount: number;
8
+ enabled: boolean;
9
+ }
10
+ export interface KeyStore {
11
+ keys: ApiKeyEntry[];
12
+ currentIndex: number;
13
+ rotationStrategy: "round-robin" | "least-failures";
14
+ updatedAt: number;
15
+ lastUsedKeyId?: string;
16
+ }
17
+ export type KeyStoreConfig = {
18
+ storePath?: string;
19
+ rotationStrategy?: "round-robin" | "least-failures";
20
+ maxFailuresBeforeDisable?: number;
21
+ };
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,aAAa,GAAG,gBAAgB,CAAC;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,aAAa,GAAG,gBAAgB,CAAC;IACpD,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}