opencode-account-manager 0.4.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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +266 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +183 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/core/accounts.d.ts +19 -0
  8. package/dist/core/accounts.d.ts.map +1 -0
  9. package/dist/core/accounts.js +181 -0
  10. package/dist/core/accounts.js.map +1 -0
  11. package/dist/core/config-store.d.ts +48 -0
  12. package/dist/core/config-store.d.ts.map +1 -0
  13. package/dist/core/config-store.js +206 -0
  14. package/dist/core/config-store.js.map +1 -0
  15. package/dist/core/crypto.d.ts +40 -0
  16. package/dist/core/crypto.d.ts.map +1 -0
  17. package/dist/core/crypto.js +172 -0
  18. package/dist/core/crypto.js.map +1 -0
  19. package/dist/core/importers/amJson.d.ts +17 -0
  20. package/dist/core/importers/amJson.d.ts.map +1 -0
  21. package/dist/core/importers/amJson.js +131 -0
  22. package/dist/core/importers/amJson.js.map +1 -0
  23. package/dist/core/opencode-config.d.ts +92 -0
  24. package/dist/core/opencode-config.d.ts.map +1 -0
  25. package/dist/core/opencode-config.js +148 -0
  26. package/dist/core/opencode-config.js.map +1 -0
  27. package/dist/core/paths.d.ts +5 -0
  28. package/dist/core/paths.d.ts.map +1 -0
  29. package/dist/core/paths.js +38 -0
  30. package/dist/core/paths.js.map +1 -0
  31. package/dist/core/types.d.ts +74 -0
  32. package/dist/core/types.d.ts.map +1 -0
  33. package/dist/core/types.js +30 -0
  34. package/dist/core/types.js.map +1 -0
  35. package/dist/core/utils.d.ts +5 -0
  36. package/dist/core/utils.d.ts.map +1 -0
  37. package/dist/core/utils.js +35 -0
  38. package/dist/core/utils.js.map +1 -0
  39. package/dist/tui/Dashboard.d.ts +7 -0
  40. package/dist/tui/Dashboard.d.ts.map +1 -0
  41. package/dist/tui/Dashboard.js +331 -0
  42. package/dist/tui/Dashboard.js.map +1 -0
  43. package/dist/tui/components/AccountList.d.ts +18 -0
  44. package/dist/tui/components/AccountList.d.ts.map +1 -0
  45. package/dist/tui/components/AccountList.js +92 -0
  46. package/dist/tui/components/AccountList.js.map +1 -0
  47. package/dist/tui/components/Box.d.ts +11 -0
  48. package/dist/tui/components/Box.d.ts.map +1 -0
  49. package/dist/tui/components/Box.js +15 -0
  50. package/dist/tui/components/Box.js.map +1 -0
  51. package/dist/tui/components/ExportModal.d.ts +10 -0
  52. package/dist/tui/components/ExportModal.d.ts.map +1 -0
  53. package/dist/tui/components/ExportModal.js +192 -0
  54. package/dist/tui/components/ExportModal.js.map +1 -0
  55. package/dist/tui/components/FileBrowser.d.ts +12 -0
  56. package/dist/tui/components/FileBrowser.d.ts.map +1 -0
  57. package/dist/tui/components/FileBrowser.js +349 -0
  58. package/dist/tui/components/FileBrowser.js.map +1 -0
  59. package/dist/tui/components/Header.d.ts +8 -0
  60. package/dist/tui/components/Header.d.ts.map +1 -0
  61. package/dist/tui/components/Header.js +20 -0
  62. package/dist/tui/components/Header.js.map +1 -0
  63. package/dist/tui/components/ImportModal.d.ts +10 -0
  64. package/dist/tui/components/ImportModal.d.ts.map +1 -0
  65. package/dist/tui/components/ImportModal.js +215 -0
  66. package/dist/tui/components/ImportModal.js.map +1 -0
  67. package/dist/tui/components/McpServerList.d.ts +8 -0
  68. package/dist/tui/components/McpServerList.d.ts.map +1 -0
  69. package/dist/tui/components/McpServerList.js +35 -0
  70. package/dist/tui/components/McpServerList.js.map +1 -0
  71. package/dist/tui/components/Menu.d.ts +10 -0
  72. package/dist/tui/components/Menu.d.ts.map +1 -0
  73. package/dist/tui/components/Menu.js +83 -0
  74. package/dist/tui/components/Menu.js.map +1 -0
  75. package/dist/tui/components/PasswordInput.d.ts +12 -0
  76. package/dist/tui/components/PasswordInput.d.ts.map +1 -0
  77. package/dist/tui/components/PasswordInput.js +130 -0
  78. package/dist/tui/components/PasswordInput.js.map +1 -0
  79. package/dist/tui/components/ProviderList.d.ts +8 -0
  80. package/dist/tui/components/ProviderList.d.ts.map +1 -0
  81. package/dist/tui/components/ProviderList.js +37 -0
  82. package/dist/tui/components/ProviderList.js.map +1 -0
  83. package/dist/tui/components/SectionBox.d.ts +10 -0
  84. package/dist/tui/components/SectionBox.d.ts.map +1 -0
  85. package/dist/tui/components/SectionBox.js +16 -0
  86. package/dist/tui/components/SectionBox.js.map +1 -0
  87. package/dist/tui/components/StatsRow.d.ts +13 -0
  88. package/dist/tui/components/StatsRow.d.ts.map +1 -0
  89. package/dist/tui/components/StatsRow.js +18 -0
  90. package/dist/tui/components/StatsRow.js.map +1 -0
  91. package/dist/tui/components/StatusBadge.d.ts +8 -0
  92. package/dist/tui/components/StatusBadge.d.ts.map +1 -0
  93. package/dist/tui/components/StatusBadge.js +30 -0
  94. package/dist/tui/components/StatusBadge.js.map +1 -0
  95. package/dist/tui/components/index.d.ts +14 -0
  96. package/dist/tui/components/index.d.ts.map +1 -0
  97. package/dist/tui/components/index.js +32 -0
  98. package/dist/tui/components/index.js.map +1 -0
  99. package/dist/tui/index.d.ts +5 -0
  100. package/dist/tui/index.d.ts.map +1 -0
  101. package/dist/tui/index.js +13 -0
  102. package/dist/tui/index.js.map +1 -0
  103. package/docs/BLUEPRINT.md +476 -0
  104. package/docs/ROADMAP.md +74 -0
  105. package/package.json +38 -0
  106. package/src/cli.ts +207 -0
  107. package/src/core/accounts.ts +215 -0
  108. package/src/core/config-store.ts +212 -0
  109. package/src/core/crypto.ts +162 -0
  110. package/src/core/importers/amJson.ts +185 -0
  111. package/src/core/opencode-config.ts +217 -0
  112. package/src/core/paths.ts +32 -0
  113. package/src/core/types.ts +118 -0
  114. package/src/core/utils.ts +28 -0
  115. package/src/tui/Dashboard.tsx +431 -0
  116. package/src/tui/components/AccountList.tsx +155 -0
  117. package/src/tui/components/Box.tsx +37 -0
  118. package/src/tui/components/ExportModal.tsx +255 -0
  119. package/src/tui/components/FileBrowser.tsx +393 -0
  120. package/src/tui/components/Header.tsx +26 -0
  121. package/src/tui/components/ImportModal.tsx +288 -0
  122. package/src/tui/components/McpServerList.tsx +67 -0
  123. package/src/tui/components/Menu.tsx +103 -0
  124. package/src/tui/components/PasswordInput.tsx +159 -0
  125. package/src/tui/components/ProviderList.tsx +61 -0
  126. package/src/tui/components/SectionBox.tsx +35 -0
  127. package/src/tui/components/StatsRow.tsx +33 -0
  128. package/src/tui/components/StatusBadge.tsx +33 -0
  129. package/src/tui/components/index.ts +13 -0
  130. package/src/tui/index.tsx +11 -0
  131. package/tsconfig.json +20 -0
@@ -0,0 +1,331 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Dashboard = Dashboard;
37
+ const react_1 = __importStar(require("react"));
38
+ const ink_1 = require("ink");
39
+ const components_1 = require("./components");
40
+ const accounts_1 = require("../core/accounts");
41
+ const paths_1 = require("../core/paths");
42
+ const amJson_1 = require("../core/importers/amJson");
43
+ const opencode_config_1 = require("../core/opencode-config");
44
+ function safeReadPluginFile(pluginPath) {
45
+ try {
46
+ return (0, accounts_1.readPluginAccountsFile)(pluginPath);
47
+ }
48
+ catch {
49
+ return (0, accounts_1.createEmptyPluginAccountsFile)();
50
+ }
51
+ }
52
+ function Dashboard({ pluginPath }) {
53
+ const { exit } = (0, ink_1.useApp)();
54
+ const resolvedPath = (0, paths_1.getPluginAccountsPath)(pluginPath);
55
+ // OpenCode config state
56
+ const [opencodeInfo, setOpencodeInfo] = (0, react_1.useState)(null);
57
+ // Plugin accounts state
58
+ const [accounts, setAccounts] = (0, react_1.useState)([]);
59
+ const [summary, setSummary] = (0, react_1.useState)({ total: 0, available: 0, limited: 0 });
60
+ const [message, setMessage] = (0, react_1.useState)(null);
61
+ // UI state
62
+ const [activeSection, setActiveSection] = (0, react_1.useState)("providers");
63
+ const [selectMode, setSelectMode] = (0, react_1.useState)(false);
64
+ const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
65
+ const [checkedEmails, setCheckedEmails] = (0, react_1.useState)(new Set());
66
+ // Modal state
67
+ const [activeModal, setActiveModal] = (0, react_1.useState)("none");
68
+ const showMessage = (msg, duration = 3000) => {
69
+ setMessage(msg);
70
+ setTimeout(() => setMessage(null), duration);
71
+ };
72
+ const loadOpencodeConfig = () => {
73
+ const info = (0, opencode_config_1.parseOpencodeInfo)();
74
+ setOpencodeInfo(info);
75
+ };
76
+ const loadAccounts = () => {
77
+ const file = safeReadPluginFile(resolvedPath);
78
+ setAccounts(file.accounts);
79
+ setSummary((0, accounts_1.summarizeAccounts)(file.accounts));
80
+ setCheckedEmails(new Set());
81
+ setSelectedIndex(0);
82
+ };
83
+ const refresh = () => {
84
+ loadOpencodeConfig();
85
+ loadAccounts();
86
+ showMessage("Refreshed", 2000);
87
+ };
88
+ (0, react_1.useEffect)(() => {
89
+ loadOpencodeConfig();
90
+ loadAccounts();
91
+ }, []);
92
+ // Keyboard navigation (only when no modal is open)
93
+ (0, ink_1.useInput)((input, key) => {
94
+ if (activeModal !== "none")
95
+ return;
96
+ // Section switching with Tab
97
+ if (key.tab) {
98
+ setActiveSection(prev => {
99
+ if (prev === "providers")
100
+ return "accounts";
101
+ if (prev === "accounts")
102
+ return "mcp";
103
+ return "providers";
104
+ });
105
+ setSelectMode(false);
106
+ return;
107
+ }
108
+ // Only handle list navigation in accounts section with select mode
109
+ if (activeSection !== "accounts" || !selectMode)
110
+ return;
111
+ if (key.upArrow) {
112
+ setSelectedIndex(prev => Math.max(0, prev - 1));
113
+ }
114
+ if (key.downArrow) {
115
+ setSelectedIndex(prev => Math.min(accounts.length - 1, prev + 1));
116
+ }
117
+ if (input === " ") {
118
+ const email = accounts[selectedIndex]?.email;
119
+ if (email) {
120
+ setCheckedEmails(prev => {
121
+ const next = new Set(prev);
122
+ if (next.has(email)) {
123
+ next.delete(email);
124
+ }
125
+ else {
126
+ next.add(email);
127
+ }
128
+ return next;
129
+ });
130
+ }
131
+ }
132
+ });
133
+ // Export completion handler
134
+ const handleExportComplete = (filePath) => {
135
+ setActiveModal("none");
136
+ showMessage(`Exported to ${filePath}`, 4000);
137
+ };
138
+ // Import completion handler
139
+ const handleImportComplete = (importedAccounts, newCount, overwrittenCount) => {
140
+ // Merge imported accounts with existing (overwrite mode)
141
+ const file = safeReadPluginFile(resolvedPath);
142
+ const merged = (0, accounts_1.mergeAccounts)(file, importedAccounts, "merge");
143
+ (0, accounts_1.writePluginAccountsFile)(pluginPath, merged);
144
+ setActiveModal("none");
145
+ loadAccounts();
146
+ showMessage(`Imported: ${newCount} new, ${overwrittenCount} updated`, 4000);
147
+ };
148
+ const handleImportAM = () => {
149
+ const amPath = (0, paths_1.getAmFolderPath)();
150
+ const result = (0, amJson_1.importFromAmFolder)(amPath);
151
+ if (result.errors.length > 0) {
152
+ showMessage(`Error: ${result.errors[0]}`, 5000);
153
+ return;
154
+ }
155
+ if (result.accounts.length === 0) {
156
+ showMessage(`No accounts found in AM (${result.skipped.length} skipped)`, 4000);
157
+ return;
158
+ }
159
+ const existingFile = safeReadPluginFile(resolvedPath);
160
+ const merged = (0, accounts_1.mergeAccounts)(existingFile, result.accounts, "merge");
161
+ (0, accounts_1.writePluginAccountsFile)(pluginPath, merged);
162
+ const added = merged.accounts.length - existingFile.accounts.length;
163
+ showMessage(`Imported from AM: ${result.accounts.length} found, ${added} new. Total: ${merged.accounts.length}`, 5000);
164
+ loadAccounts();
165
+ };
166
+ const handleEnableSelected = () => {
167
+ if (checkedEmails.size === 0) {
168
+ showMessage("No accounts selected", 2000);
169
+ return;
170
+ }
171
+ const file = safeReadPluginFile(resolvedPath);
172
+ let count = 0;
173
+ file.accounts = file.accounts.map(acc => {
174
+ if (checkedEmails.has(acc.email)) {
175
+ count++;
176
+ return { ...acc, enabled: true };
177
+ }
178
+ return acc;
179
+ });
180
+ (0, accounts_1.writePluginAccountsFile)(pluginPath, file);
181
+ showMessage(`Enabled ${count} accounts`, 3000);
182
+ loadAccounts();
183
+ setSelectMode(false);
184
+ };
185
+ const handleDisableSelected = () => {
186
+ if (checkedEmails.size === 0) {
187
+ showMessage("No accounts selected", 2000);
188
+ return;
189
+ }
190
+ const file = safeReadPluginFile(resolvedPath);
191
+ let count = 0;
192
+ file.accounts = file.accounts.map(acc => {
193
+ if (checkedEmails.has(acc.email)) {
194
+ count++;
195
+ return { ...acc, enabled: false };
196
+ }
197
+ return acc;
198
+ });
199
+ (0, accounts_1.writePluginAccountsFile)(pluginPath, file);
200
+ showMessage(`Disabled ${count} accounts`, 3000);
201
+ loadAccounts();
202
+ setSelectMode(false);
203
+ };
204
+ const handleDeleteSelected = () => {
205
+ if (checkedEmails.size === 0) {
206
+ showMessage("No accounts selected", 2000);
207
+ return;
208
+ }
209
+ const file = safeReadPluginFile(resolvedPath);
210
+ const beforeCount = file.accounts.length;
211
+ file.accounts = file.accounts.filter(acc => !checkedEmails.has(acc.email));
212
+ const deletedCount = beforeCount - file.accounts.length;
213
+ (0, accounts_1.writePluginAccountsFile)(pluginPath, file);
214
+ showMessage(`Deleted ${deletedCount} accounts`, 3000);
215
+ loadAccounts();
216
+ setSelectMode(false);
217
+ };
218
+ const handleSelectAll = () => {
219
+ setCheckedEmails(new Set(accounts.map(a => a.email)));
220
+ };
221
+ const handleSelectNone = () => {
222
+ setCheckedEmails(new Set());
223
+ };
224
+ const handleAction = (action) => {
225
+ // Don't handle actions when modal is open
226
+ if (activeModal !== "none")
227
+ return;
228
+ switch (action) {
229
+ case "refresh":
230
+ refresh();
231
+ break;
232
+ case "export":
233
+ setActiveModal("export");
234
+ break;
235
+ case "import-file":
236
+ setActiveModal("import");
237
+ break;
238
+ case "import-am":
239
+ handleImportAM();
240
+ break;
241
+ case "toggle-select-mode":
242
+ if (activeSection === "accounts") {
243
+ setSelectMode(prev => !prev);
244
+ setCheckedEmails(new Set());
245
+ setSelectedIndex(0);
246
+ }
247
+ else {
248
+ showMessage("Switch to Accounts section first (Tab)", 2000);
249
+ }
250
+ break;
251
+ case "select-all":
252
+ handleSelectAll();
253
+ break;
254
+ case "select-none":
255
+ handleSelectNone();
256
+ break;
257
+ case "enable-selected":
258
+ handleEnableSelected();
259
+ break;
260
+ case "disable-selected":
261
+ handleDisableSelected();
262
+ break;
263
+ case "delete-selected":
264
+ handleDeleteSelected();
265
+ break;
266
+ case "export-selected":
267
+ if (checkedEmails.size === 0) {
268
+ showMessage("No accounts selected", 2000);
269
+ }
270
+ else {
271
+ setActiveModal("export-selected");
272
+ }
273
+ break;
274
+ case "quit":
275
+ exit();
276
+ break;
277
+ }
278
+ };
279
+ // Calculate stats
280
+ const configSummary = opencodeInfo ? (0, opencode_config_1.getConfigSummary)(opencodeInfo) : null;
281
+ // Get accounts to export (all or selected)
282
+ const getAccountsForExport = () => {
283
+ if (activeModal === "export-selected") {
284
+ return accounts.filter(acc => checkedEmails.has(acc.email));
285
+ }
286
+ return accounts;
287
+ };
288
+ // If modal is open, render only the modal
289
+ if (activeModal === "export" || activeModal === "export-selected") {
290
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", padding: 1 },
291
+ react_1.default.createElement(components_1.ExportModal, { accounts: getAccountsForExport(), onComplete: handleExportComplete, onCancel: () => setActiveModal("none") })));
292
+ }
293
+ if (activeModal === "import") {
294
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", padding: 1 },
295
+ react_1.default.createElement(components_1.ImportModal, { existingAccounts: accounts, onComplete: handleImportComplete, onCancel: () => setActiveModal("none") })));
296
+ }
297
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", padding: 1 },
298
+ react_1.default.createElement(components_1.Header, { title: "OpenCode Account Manager", subtitle: "Dashboard" }),
299
+ react_1.default.createElement(components_1.StatsRow, { stats: [
300
+ { label: "Providers", value: configSummary?.providers || 0, color: "cyan" },
301
+ { label: "Models", value: configSummary?.models || 0, color: "yellow" },
302
+ { label: "MCP On", value: configSummary?.mcpEnabled || 0, color: "green" },
303
+ { label: "MCP Off", value: configSummary?.mcpDisabled || 0, color: "red" },
304
+ { label: "Accounts", value: summary.total, color: "white" },
305
+ { label: "Available", value: summary.available, color: "green" },
306
+ { label: "Limited", value: summary.limited, color: "yellow" },
307
+ ] }),
308
+ react_1.default.createElement(ink_1.Box, { marginY: 1 },
309
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, "Sections: "),
310
+ react_1.default.createElement(ink_1.Text, { color: activeSection === "providers" ? "cyan" : "gray", bold: activeSection === "providers" }, "[1] Providers"),
311
+ react_1.default.createElement(ink_1.Text, null, " "),
312
+ react_1.default.createElement(ink_1.Text, { color: activeSection === "accounts" ? "cyan" : "gray", bold: activeSection === "accounts" }, "[2] Accounts"),
313
+ react_1.default.createElement(ink_1.Text, null, " "),
314
+ react_1.default.createElement(ink_1.Text, { color: activeSection === "mcp" ? "cyan" : "gray", bold: activeSection === "mcp" }, "[3] MCP"),
315
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, " (Tab to switch)")),
316
+ react_1.default.createElement(components_1.SectionBox, { title: "PROVIDERS", borderColor: activeSection === "providers" ? "cyan" : "gray", collapsed: activeSection !== "providers" }, opencodeInfo && react_1.default.createElement(components_1.ProviderList, { providers: opencodeInfo.providers })),
317
+ react_1.default.createElement(components_1.SectionBox, { title: `PLUGIN ACCOUNTS (${opencodeInfo?.plugins[0]?.name || "antigravity-auth"})`, borderColor: activeSection === "accounts" ? (selectMode ? "yellow" : "cyan") : "gray", collapsed: activeSection !== "accounts" },
318
+ react_1.default.createElement(components_1.AccountList, { accounts: accounts, selectedIndex: selectMode ? selectedIndex : -1, checkedEmails: checkedEmails, showCheckbox: selectMode })),
319
+ react_1.default.createElement(components_1.SectionBox, { title: "MCP SERVERS", borderColor: activeSection === "mcp" ? "cyan" : "gray", collapsed: activeSection !== "mcp" }, opencodeInfo && react_1.default.createElement(components_1.McpServerList, { servers: opencodeInfo.mcpServers })),
320
+ react_1.default.createElement(ink_1.Box, { marginTop: 1 },
321
+ react_1.default.createElement(ink_1.Text, { dimColor: true },
322
+ "Config: ",
323
+ opencodeInfo?.configPath || "N/A")),
324
+ react_1.default.createElement(ink_1.Box, { marginTop: 1 },
325
+ react_1.default.createElement(components_1.MenuBar, { onSelect: handleAction, selectMode: selectMode, selectedCount: checkedEmails.size })),
326
+ message && (react_1.default.createElement(ink_1.Box, { marginTop: 1 },
327
+ react_1.default.createElement(ink_1.Text, { color: "green" },
328
+ "\u2192 ",
329
+ message)))));
330
+ }
331
+ //# sourceMappingURL=Dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dashboard.js","sourceRoot":"","sources":["../../src/tui/Dashboard.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import React from "react";
2
+ import { Account } from "../../core/types";
3
+ interface AccountRowProps {
4
+ account: Account;
5
+ isSelected?: boolean;
6
+ isChecked?: boolean;
7
+ showCheckbox?: boolean;
8
+ }
9
+ export declare function AccountRow({ account, isSelected, isChecked, showCheckbox }: AccountRowProps): React.JSX.Element;
10
+ interface AccountListProps {
11
+ accounts: Account[];
12
+ selectedIndex?: number;
13
+ checkedEmails?: Set<string>;
14
+ showCheckbox?: boolean;
15
+ }
16
+ export declare function AccountList({ accounts, selectedIndex, checkedEmails, showCheckbox }: AccountListProps): React.JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=AccountList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountList.d.ts","sourceRoot":"","sources":["../../../src/tui/components/AccountList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AA2CD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,eAAe,qBA8C3F;AAED,UAAU,gBAAgB;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,aAAkB,EAClB,aAAyB,EACzB,YAAoB,EACrB,EAAE,gBAAgB,qBAyClB"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AccountRow = AccountRow;
7
+ exports.AccountList = AccountList;
8
+ const react_1 = __importDefault(require("react"));
9
+ const ink_1 = require("ink");
10
+ const StatusBadge_1 = require("./StatusBadge");
11
+ function formatDuration(ms) {
12
+ if (ms <= 0)
13
+ return "-";
14
+ const minutes = Math.floor(ms / 60000);
15
+ const hours = Math.floor(minutes / 60);
16
+ const days = Math.floor(hours / 24);
17
+ if (days > 0)
18
+ return `${days}d ${hours % 24}h`;
19
+ if (hours > 0)
20
+ return `${hours}h ${minutes % 60}m`;
21
+ return `${minutes}m`;
22
+ }
23
+ function getAccountStatus(account) {
24
+ if (account.enabled === false) {
25
+ return { status: "disabled", resetIn: "-", limitDetails: [] };
26
+ }
27
+ const resets = account.rateLimitResetTimes || {};
28
+ const now = Date.now();
29
+ const limitDetails = [];
30
+ // Build detailed limit info for each model
31
+ for (const [model, resetTime] of Object.entries(resets)) {
32
+ if (resetTime > now) {
33
+ limitDetails.push(`${model}: ${formatDuration(resetTime - now)}`);
34
+ }
35
+ }
36
+ if (limitDetails.length === 0) {
37
+ return { status: "available", resetIn: "-", limitDetails: [] };
38
+ }
39
+ const nextReset = Math.min(...Object.values(resets).filter((v) => v > now));
40
+ return {
41
+ status: "limited",
42
+ resetIn: formatDuration(nextReset - now),
43
+ limitDetails,
44
+ };
45
+ }
46
+ function AccountRow({ account, isSelected, isChecked, showCheckbox }) {
47
+ const { status, resetIn, limitDetails } = getAccountStatus(account);
48
+ const project = account.projectId || account.managedProjectId || "-";
49
+ const checkbox = showCheckbox
50
+ ? (isChecked ? "[x]" : "[ ]")
51
+ : "";
52
+ const cursor = isSelected ? ">" : " ";
53
+ const emailColor = status === "disabled" ? "gray" : (isSelected ? "white" : "cyan");
54
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
55
+ react_1.default.createElement(ink_1.Box, { flexDirection: "row", paddingX: 1 },
56
+ react_1.default.createElement(ink_1.Box, { width: 2 },
57
+ react_1.default.createElement(ink_1.Text, { color: isSelected ? "yellow" : "white" }, cursor)),
58
+ showCheckbox && (react_1.default.createElement(ink_1.Box, { width: 4 },
59
+ react_1.default.createElement(ink_1.Text, { color: isChecked ? "green" : "gray" }, checkbox))),
60
+ react_1.default.createElement(ink_1.Box, { width: 28 },
61
+ react_1.default.createElement(ink_1.Text, { color: emailColor, strikethrough: status === "disabled" }, account.email)),
62
+ react_1.default.createElement(ink_1.Box, { width: 18 },
63
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, project.slice(0, 16))),
64
+ react_1.default.createElement(ink_1.Box, { width: 12 },
65
+ react_1.default.createElement(StatusBadge_1.StatusBadge, { status: status })),
66
+ react_1.default.createElement(ink_1.Box, { width: 10 },
67
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, resetIn))),
68
+ status === "limited" && limitDetails.length > 0 && (react_1.default.createElement(ink_1.Box, { paddingLeft: showCheckbox ? 8 : 4 },
69
+ react_1.default.createElement(ink_1.Text, { color: "gray" },
70
+ "\u2514\u2500 ",
71
+ limitDetails.join(" | "))))));
72
+ }
73
+ function AccountList({ accounts, selectedIndex = -1, checkedEmails = new Set(), showCheckbox = false }) {
74
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
75
+ react_1.default.createElement(ink_1.Box, { flexDirection: "row", paddingX: 1, marginBottom: 1 },
76
+ react_1.default.createElement(ink_1.Box, { width: 2 },
77
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, " ")),
78
+ showCheckbox && (react_1.default.createElement(ink_1.Box, { width: 4 },
79
+ react_1.default.createElement(ink_1.Text, { bold: true, dimColor: true }, "SEL"))),
80
+ react_1.default.createElement(ink_1.Box, { width: 28 },
81
+ react_1.default.createElement(ink_1.Text, { bold: true, dimColor: true }, "EMAIL")),
82
+ react_1.default.createElement(ink_1.Box, { width: 18 },
83
+ react_1.default.createElement(ink_1.Text, { bold: true, dimColor: true }, "PROJECT")),
84
+ react_1.default.createElement(ink_1.Box, { width: 12 },
85
+ react_1.default.createElement(ink_1.Text, { bold: true, dimColor: true }, "STATUS")),
86
+ react_1.default.createElement(ink_1.Box, { width: 10 },
87
+ react_1.default.createElement(ink_1.Text, { bold: true, dimColor: true }, "RESET IN"))),
88
+ accounts.map((account, index) => (react_1.default.createElement(AccountRow, { key: account.email, account: account, isSelected: index === selectedIndex, isChecked: checkedEmails.has(account.email), showCheckbox: showCheckbox }))),
89
+ accounts.length === 0 && (react_1.default.createElement(ink_1.Box, { paddingX: 1 },
90
+ react_1.default.createElement(ink_1.Text, { dimColor: true }, "No accounts found")))));
91
+ }
92
+ //# sourceMappingURL=AccountList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountList.js","sourceRoot":"","sources":["../../../src/tui/components/AccountList.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface BoxProps {
3
+ title?: string;
4
+ children: React.ReactNode;
5
+ borderColor?: string;
6
+ width?: number | string;
7
+ padding?: number;
8
+ }
9
+ export declare function Box({ title, children, borderColor, width, padding, }: BoxProps): React.JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=Box.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Box.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Box.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,QAAQ;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,GAAG,CAAC,EAClB,KAAK,EACL,QAAQ,EACR,WAAoB,EACpB,KAAK,EACL,OAAW,GACZ,EAAE,QAAQ,qBAmBV"}
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Box = Box;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ink_1 = require("ink");
9
+ function Box({ title, children, borderColor = "cyan", width, padding = 1, }) {
10
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: borderColor, width: width, paddingX: padding },
11
+ title && (react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
12
+ react_1.default.createElement(ink_1.Text, { bold: true, color: borderColor }, title))),
13
+ children));
14
+ }
15
+ //# sourceMappingURL=Box.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Box.js","sourceRoot":"","sources":["../../../src/tui/components/Box.tsx"],"names":[],"mappings":";;;;;AAWA,kBAyBC;AApCD,kDAA0B;AAC1B,6BAA0C;AAU1C,SAAgB,GAAG,CAAC,EAClB,KAAK,EACL,QAAQ,EACR,WAAW,GAAG,MAAM,EACpB,KAAK,EACL,OAAO,GAAG,CAAC,GACF;IACT,OAAO,CACL,8BAAC,SAAM,IACL,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,OAAO;QAEhB,KAAK,IAAI,CACR,8BAAC,SAAM,IAAC,YAAY,EAAE,CAAC;YACrB,8BAAC,UAAI,IAAC,IAAI,QAAC,KAAK,EAAE,WAAW,IAC1B,KAAK,CACD,CACA,CACV;QACA,QAAQ,CACF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { Account } from "../../core/types";
3
+ interface ExportModalProps {
4
+ accounts: Account[];
5
+ onComplete: (filePath: string) => void;
6
+ onCancel: () => void;
7
+ }
8
+ export declare function ExportModal({ accounts, onComplete, onCancel }: ExportModalProps): React.JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=ExportModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExportModal.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ExportModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAKxC,OAAO,EACL,OAAO,EAIR,MAAM,kBAAkB,CAAC;AAQ1B,UAAU,gBAAgB;IACxB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAID,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBAoO/E"}