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.
- package/LICENSE +21 -0
- package/README.md +266 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +183 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/accounts.d.ts +19 -0
- package/dist/core/accounts.d.ts.map +1 -0
- package/dist/core/accounts.js +181 -0
- package/dist/core/accounts.js.map +1 -0
- package/dist/core/config-store.d.ts +48 -0
- package/dist/core/config-store.d.ts.map +1 -0
- package/dist/core/config-store.js +206 -0
- package/dist/core/config-store.js.map +1 -0
- package/dist/core/crypto.d.ts +40 -0
- package/dist/core/crypto.d.ts.map +1 -0
- package/dist/core/crypto.js +172 -0
- package/dist/core/crypto.js.map +1 -0
- package/dist/core/importers/amJson.d.ts +17 -0
- package/dist/core/importers/amJson.d.ts.map +1 -0
- package/dist/core/importers/amJson.js +131 -0
- package/dist/core/importers/amJson.js.map +1 -0
- package/dist/core/opencode-config.d.ts +92 -0
- package/dist/core/opencode-config.d.ts.map +1 -0
- package/dist/core/opencode-config.js +148 -0
- package/dist/core/opencode-config.js.map +1 -0
- package/dist/core/paths.d.ts +5 -0
- package/dist/core/paths.d.ts.map +1 -0
- package/dist/core/paths.js +38 -0
- package/dist/core/paths.js.map +1 -0
- package/dist/core/types.d.ts +74 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +30 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils.d.ts +5 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +35 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/tui/Dashboard.d.ts +7 -0
- package/dist/tui/Dashboard.d.ts.map +1 -0
- package/dist/tui/Dashboard.js +331 -0
- package/dist/tui/Dashboard.js.map +1 -0
- package/dist/tui/components/AccountList.d.ts +18 -0
- package/dist/tui/components/AccountList.d.ts.map +1 -0
- package/dist/tui/components/AccountList.js +92 -0
- package/dist/tui/components/AccountList.js.map +1 -0
- package/dist/tui/components/Box.d.ts +11 -0
- package/dist/tui/components/Box.d.ts.map +1 -0
- package/dist/tui/components/Box.js +15 -0
- package/dist/tui/components/Box.js.map +1 -0
- package/dist/tui/components/ExportModal.d.ts +10 -0
- package/dist/tui/components/ExportModal.d.ts.map +1 -0
- package/dist/tui/components/ExportModal.js +192 -0
- package/dist/tui/components/ExportModal.js.map +1 -0
- package/dist/tui/components/FileBrowser.d.ts +12 -0
- package/dist/tui/components/FileBrowser.d.ts.map +1 -0
- package/dist/tui/components/FileBrowser.js +349 -0
- package/dist/tui/components/FileBrowser.js.map +1 -0
- package/dist/tui/components/Header.d.ts +8 -0
- package/dist/tui/components/Header.d.ts.map +1 -0
- package/dist/tui/components/Header.js +20 -0
- package/dist/tui/components/Header.js.map +1 -0
- package/dist/tui/components/ImportModal.d.ts +10 -0
- package/dist/tui/components/ImportModal.d.ts.map +1 -0
- package/dist/tui/components/ImportModal.js +215 -0
- package/dist/tui/components/ImportModal.js.map +1 -0
- package/dist/tui/components/McpServerList.d.ts +8 -0
- package/dist/tui/components/McpServerList.d.ts.map +1 -0
- package/dist/tui/components/McpServerList.js +35 -0
- package/dist/tui/components/McpServerList.js.map +1 -0
- package/dist/tui/components/Menu.d.ts +10 -0
- package/dist/tui/components/Menu.d.ts.map +1 -0
- package/dist/tui/components/Menu.js +83 -0
- package/dist/tui/components/Menu.js.map +1 -0
- package/dist/tui/components/PasswordInput.d.ts +12 -0
- package/dist/tui/components/PasswordInput.d.ts.map +1 -0
- package/dist/tui/components/PasswordInput.js +130 -0
- package/dist/tui/components/PasswordInput.js.map +1 -0
- package/dist/tui/components/ProviderList.d.ts +8 -0
- package/dist/tui/components/ProviderList.d.ts.map +1 -0
- package/dist/tui/components/ProviderList.js +37 -0
- package/dist/tui/components/ProviderList.js.map +1 -0
- package/dist/tui/components/SectionBox.d.ts +10 -0
- package/dist/tui/components/SectionBox.d.ts.map +1 -0
- package/dist/tui/components/SectionBox.js +16 -0
- package/dist/tui/components/SectionBox.js.map +1 -0
- package/dist/tui/components/StatsRow.d.ts +13 -0
- package/dist/tui/components/StatsRow.d.ts.map +1 -0
- package/dist/tui/components/StatsRow.js +18 -0
- package/dist/tui/components/StatsRow.js.map +1 -0
- package/dist/tui/components/StatusBadge.d.ts +8 -0
- package/dist/tui/components/StatusBadge.d.ts.map +1 -0
- package/dist/tui/components/StatusBadge.js +30 -0
- package/dist/tui/components/StatusBadge.js.map +1 -0
- package/dist/tui/components/index.d.ts +14 -0
- package/dist/tui/components/index.d.ts.map +1 -0
- package/dist/tui/components/index.js +32 -0
- package/dist/tui/components/index.js.map +1 -0
- package/dist/tui/index.d.ts +5 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +13 -0
- package/dist/tui/index.js.map +1 -0
- package/docs/BLUEPRINT.md +476 -0
- package/docs/ROADMAP.md +74 -0
- package/package.json +38 -0
- package/src/cli.ts +207 -0
- package/src/core/accounts.ts +215 -0
- package/src/core/config-store.ts +212 -0
- package/src/core/crypto.ts +162 -0
- package/src/core/importers/amJson.ts +185 -0
- package/src/core/opencode-config.ts +217 -0
- package/src/core/paths.ts +32 -0
- package/src/core/types.ts +118 -0
- package/src/core/utils.ts +28 -0
- package/src/tui/Dashboard.tsx +431 -0
- package/src/tui/components/AccountList.tsx +155 -0
- package/src/tui/components/Box.tsx +37 -0
- package/src/tui/components/ExportModal.tsx +255 -0
- package/src/tui/components/FileBrowser.tsx +393 -0
- package/src/tui/components/Header.tsx +26 -0
- package/src/tui/components/ImportModal.tsx +288 -0
- package/src/tui/components/McpServerList.tsx +67 -0
- package/src/tui/components/Menu.tsx +103 -0
- package/src/tui/components/PasswordInput.tsx +159 -0
- package/src/tui/components/ProviderList.tsx +61 -0
- package/src/tui/components/SectionBox.tsx +35 -0
- package/src/tui/components/StatsRow.tsx +33 -0
- package/src/tui/components/StatusBadge.tsx +33 -0
- package/src/tui/components/index.ts +13 -0
- package/src/tui/index.tsx +11 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,192 @@
|
|
|
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.ExportModal = ExportModal;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const ink_1 = require("ink");
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const FileBrowser_1 = require("./FileBrowser");
|
|
41
|
+
const PasswordInput_1 = require("./PasswordInput");
|
|
42
|
+
const crypto_1 = require("../../core/crypto");
|
|
43
|
+
const utils_1 = require("../../core/utils");
|
|
44
|
+
const config_store_1 = require("../../core/config-store");
|
|
45
|
+
function ExportModal({ accounts, onComplete, onCancel }) {
|
|
46
|
+
const [step, setStep] = (0, react_1.useState)("format");
|
|
47
|
+
const [format, setFormat] = (0, react_1.useState)("encrypted");
|
|
48
|
+
const [folder, setFolder] = (0, react_1.useState)("");
|
|
49
|
+
const [exportedPath, setExportedPath] = (0, react_1.useState)("");
|
|
50
|
+
const [error, setError] = (0, react_1.useState)("");
|
|
51
|
+
// Generate filename with timestamp
|
|
52
|
+
const generateFilename = (ext) => {
|
|
53
|
+
const date = new Date();
|
|
54
|
+
const dateStr = date.toISOString().split("T")[0]; // YYYY-MM-DD
|
|
55
|
+
return `opencode-accounts-${dateStr}${ext}`;
|
|
56
|
+
};
|
|
57
|
+
// Handle format selection
|
|
58
|
+
(0, ink_1.useInput)((input, key) => {
|
|
59
|
+
if (step !== "format")
|
|
60
|
+
return;
|
|
61
|
+
if (key.escape) {
|
|
62
|
+
onCancel();
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (input === "1") {
|
|
66
|
+
setFormat("encrypted");
|
|
67
|
+
setStep("folder");
|
|
68
|
+
}
|
|
69
|
+
else if (input === "2") {
|
|
70
|
+
setFormat("plain");
|
|
71
|
+
setStep("folder");
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// Handle folder selection
|
|
75
|
+
const handleFolderSelect = (selectedFolder) => {
|
|
76
|
+
setFolder(selectedFolder);
|
|
77
|
+
(0, config_store_1.updateLastExportFolder)(selectedFolder);
|
|
78
|
+
if (format === "encrypted") {
|
|
79
|
+
setStep("password");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Plain export - no password needed
|
|
83
|
+
doExport(selectedFolder, undefined);
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
// Handle password submission
|
|
87
|
+
const handlePasswordSubmit = (password) => {
|
|
88
|
+
doExport(folder, password);
|
|
89
|
+
};
|
|
90
|
+
// Do the actual export
|
|
91
|
+
const doExport = (targetFolder, password) => {
|
|
92
|
+
setStep("exporting");
|
|
93
|
+
try {
|
|
94
|
+
const ext = format === "encrypted" ? ".ocam" : ".json";
|
|
95
|
+
const filename = generateFilename(ext);
|
|
96
|
+
const filePath = path.join(targetFolder, filename);
|
|
97
|
+
if (format === "encrypted" && password) {
|
|
98
|
+
// Create encrypted export
|
|
99
|
+
const payload = {
|
|
100
|
+
version: 1,
|
|
101
|
+
accounts: accounts,
|
|
102
|
+
exportedAt: Date.now(),
|
|
103
|
+
};
|
|
104
|
+
const encrypted = (0, crypto_1.encrypt)(payload, password);
|
|
105
|
+
const encryptedFile = {
|
|
106
|
+
version: 1,
|
|
107
|
+
format: "encrypted",
|
|
108
|
+
algorithm: "aes-256-gcm",
|
|
109
|
+
salt: encrypted.salt,
|
|
110
|
+
iv: encrypted.iv,
|
|
111
|
+
authTag: encrypted.authTag,
|
|
112
|
+
data: encrypted.data,
|
|
113
|
+
exportedAt: Date.now(),
|
|
114
|
+
accountCount: accounts.length,
|
|
115
|
+
exportedFrom: "opencode-account-manager",
|
|
116
|
+
};
|
|
117
|
+
(0, utils_1.writeJsonFile)(filePath, encryptedFile);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
// Plain export
|
|
121
|
+
const plainFile = {
|
|
122
|
+
version: 1,
|
|
123
|
+
exportedAt: Date.now(),
|
|
124
|
+
exportedFrom: "opencode-account-manager",
|
|
125
|
+
accounts: accounts,
|
|
126
|
+
};
|
|
127
|
+
(0, utils_1.writeJsonFile)(filePath, plainFile);
|
|
128
|
+
}
|
|
129
|
+
setExportedPath(filePath);
|
|
130
|
+
setStep("success");
|
|
131
|
+
// Auto-complete after 2 seconds
|
|
132
|
+
setTimeout(() => {
|
|
133
|
+
onComplete(filePath);
|
|
134
|
+
}, 2000);
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
setError(err instanceof Error ? err.message : "Unknown error");
|
|
138
|
+
setStep("error");
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
// Handle success/error dismissal
|
|
142
|
+
(0, ink_1.useInput)((input, key) => {
|
|
143
|
+
if (step === "success" || step === "error") {
|
|
144
|
+
if (key.return || key.escape) {
|
|
145
|
+
if (step === "success") {
|
|
146
|
+
onComplete(exportedPath);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
onCancel();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
155
|
+
step === "format" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1 },
|
|
156
|
+
react_1.default.createElement(ink_1.Text, { bold: true, color: "cyan" },
|
|
157
|
+
"EXPORT ",
|
|
158
|
+
accounts.length,
|
|
159
|
+
" ACCOUNTS"),
|
|
160
|
+
react_1.default.createElement(ink_1.Box, { marginY: 1, flexDirection: "column" },
|
|
161
|
+
react_1.default.createElement(ink_1.Text, null, "Select export format:"),
|
|
162
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
163
|
+
react_1.default.createElement(ink_1.Text, { color: "green" }, "[1] Encrypted (.ocam)"),
|
|
164
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, " - Password protected, recommended")),
|
|
165
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
166
|
+
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "[2] Plain JSON"),
|
|
167
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, " - No encryption (tokens visible!)"))),
|
|
168
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
169
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "[1-2] Select [Esc] Cancel")))),
|
|
170
|
+
step === "folder" && (react_1.default.createElement(FileBrowser_1.FileBrowser, { mode: "folder", initialPath: (0, config_store_1.getLastExportFolder)(), title: `Export to folder (${format === "encrypted" ? ".ocam" : ".json"})`, onSelect: handleFolderSelect, onCancel: onCancel })),
|
|
171
|
+
step === "password" && (react_1.default.createElement(PasswordInput_1.PasswordInput, { mode: "confirm", title: "Set Export Password", subtitle: `${accounts.length} accounts`, warning: "Remember this password! Without it, you cannot recover your accounts.", onSubmit: handlePasswordSubmit, onCancel: () => setStep("folder") })),
|
|
172
|
+
step === "exporting" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1 },
|
|
173
|
+
react_1.default.createElement(ink_1.Text, { color: "cyan" }, "Exporting..."))),
|
|
174
|
+
step === "success" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: "green", paddingX: 2, paddingY: 1 },
|
|
175
|
+
react_1.default.createElement(ink_1.Text, { bold: true, color: "green" }, "\u2713 Export Successful!"),
|
|
176
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
177
|
+
react_1.default.createElement(ink_1.Text, null,
|
|
178
|
+
"Exported ",
|
|
179
|
+
accounts.length,
|
|
180
|
+
" accounts to:")),
|
|
181
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
182
|
+
react_1.default.createElement(ink_1.Text, { color: "cyan" }, exportedPath)),
|
|
183
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
184
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "[Enter] Close")))),
|
|
185
|
+
step === "error" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: "red", paddingX: 2, paddingY: 1 },
|
|
186
|
+
react_1.default.createElement(ink_1.Text, { bold: true, color: "red" }, "\u2717 Export Failed"),
|
|
187
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
188
|
+
react_1.default.createElement(ink_1.Text, { color: "red" }, error)),
|
|
189
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
190
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "[Enter] Close"))))));
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=ExportModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExportModal.js","sourceRoot":"","sources":["../../../src/tui/components/ExportModal.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,kCAoOC;AA9PD,+CAAwC;AACxC,6BAA0C;AAC1C,2CAA6B;AAC7B,+CAA4C;AAC5C,mDAAgD;AAOhD,8CAA4C;AAC5C,4CAAiD;AACjD,0DAGiC;AAUjC,SAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAoB;IAC9E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAa,QAAQ,CAAC,CAAC;IACvD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAe,WAAW,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,IAAA,gBAAQ,EAAS,EAAE,CAAC,CAAC;IACjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,IAAA,gBAAQ,EAAS,EAAE,CAAC,CAAC;IAC7D,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAS,EAAE,CAAC,CAAC;IAE/C,mCAAmC;IACnC,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAU,EAAE;QAC/C,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa;QAC/D,OAAO,qBAAqB,OAAO,GAAG,GAAG,EAAE,CAAC;IAC9C,CAAC,CAAC;IAEF,0BAA0B;IAC1B,IAAA,cAAQ,EAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO;QAE9B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,SAAS,CAAC,WAAW,CAAC,CAAC;YACvB,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;aAAM,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACzB,SAAS,CAAC,OAAO,CAAC,CAAC;YACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,MAAM,kBAAkB,GAAG,CAAC,cAAsB,EAAE,EAAE;QACpD,SAAS,CAAC,cAAc,CAAC,CAAC;QAC1B,IAAA,qCAAsB,EAAC,cAAc,CAAC,CAAC;QAEvC,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,OAAO,CAAC,UAAU,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC;IAEF,6BAA6B;IAC7B,MAAM,oBAAoB,GAAG,CAAC,QAAgB,EAAE,EAAE;QAChD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;IAEF,uBAAuB;IACvB,MAAM,QAAQ,GAAG,CAAC,YAAoB,EAAE,QAAiB,EAAE,EAAE;QAC3D,OAAO,CAAC,WAAW,CAAC,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YACvD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;YAEnD,IAAI,MAAM,KAAK,WAAW,IAAI,QAAQ,EAAE,CAAC;gBACvC,0BAA0B;gBAC1B,MAAM,OAAO,GAAG;oBACd,OAAO,EAAE,CAAC;oBACV,QAAQ,EAAE,QAAQ;oBAClB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;iBACvB,CAAC;gBAEF,MAAM,SAAS,GAAG,IAAA,gBAAO,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAE7C,MAAM,aAAa,GAAwB;oBACzC,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,WAAW;oBACnB,SAAS,EAAE,aAAa;oBACxB,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,EAAE,EAAE,SAAS,CAAC,EAAE;oBAChB,OAAO,EAAE,SAAS,CAAC,OAAO;oBAC1B,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;oBACtB,YAAY,EAAE,QAAQ,CAAC,MAAM;oBAC7B,YAAY,EAAE,0BAA0B;iBACzC,CAAC;gBAEF,IAAA,qBAAa,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,eAAe;gBACf,MAAM,SAAS,GAAuB;oBACpC,OAAO,EAAE,CAAC;oBACV,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;oBACtB,YAAY,EAAE,0BAA0B;oBACxC,QAAQ,EAAE,QAAQ;iBACnB,CAAC;gBAEF,IAAA,qBAAa,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrC,CAAC;YAED,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,CAAC,SAAS,CAAC,CAAC;YAEnB,gCAAgC;YAChC,UAAU,CAAC,GAAG,EAAE;gBACd,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC,EAAE,IAAI,CAAC,CAAC;QACX,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YAC/D,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,iCAAiC;IACjC,IAAA,cAAQ,EAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC3C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC7B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;oBACvB,UAAU,CAAC,YAAY,CAAC,CAAC;gBAC3B,CAAC;qBAAM,CAAC;oBACN,QAAQ,EAAE,CAAC;gBACb,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,8BAAC,SAAG,IAAC,aAAa,EAAC,QAAQ;QAExB,IAAI,KAAK,QAAQ,IAAI,CACpB,8BAAC,SAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC;YAEX,8BAAC,UAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM;;gBAAS,QAAQ,CAAC,MAAM;4BAAiB;YAChE,8BAAC,SAAG,IAAC,OAAO,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;gBACrC,8BAAC,UAAI,gCAA6B;gBAClC,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;oBACf,8BAAC,UAAI,IAAC,KAAK,EAAC,OAAO,4BAA6B;oBAChD,8BAAC,UAAI,IAAC,QAAQ,+CAA0C,CACpD;gBACN,8BAAC,SAAG;oBACF,8BAAC,UAAI,IAAC,KAAK,EAAC,QAAQ,qBAAsB;oBAC1C,8BAAC,UAAI,IAAC,QAAQ,+CAA0C,CACpD,CACF;YACN,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;gBACf,8BAAC,UAAI,IAAC,QAAQ,uCAAkC,CAC5C,CACF,CACP;QAGA,IAAI,KAAK,QAAQ,IAAI,CACpB,8BAAC,yBAAW,IACV,IAAI,EAAC,QAAQ,EACb,WAAW,EAAE,IAAA,kCAAmB,GAAE,EAClC,KAAK,EAAE,qBAAqB,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,EACzE,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,EAAE,QAAQ,GAClB,CACH;QAGA,IAAI,KAAK,UAAU,IAAI,CACtB,8BAAC,6BAAa,IACZ,IAAI,EAAC,SAAS,EACd,KAAK,EAAC,qBAAqB,EAC3B,QAAQ,EAAE,GAAG,QAAQ,CAAC,MAAM,WAAW,EACvC,OAAO,EAAC,uEAAuE,EAC/E,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GACjC,CACH;QAGA,IAAI,KAAK,WAAW,IAAI,CACvB,8BAAC,SAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC;YAEX,8BAAC,UAAI,IAAC,KAAK,EAAC,MAAM,mBAAoB,CAClC,CACP;QAGA,IAAI,KAAK,SAAS,IAAI,CACrB,8BAAC,SAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,OAAO,EACnB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC;YAEX,8BAAC,UAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,gCAA4B;YACpD,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;gBACf,8BAAC,UAAI;;oBAAW,QAAQ,CAAC,MAAM;oCAAqB,CAChD;YACN,8BAAC,SAAG;gBACF,8BAAC,UAAI,IAAC,KAAK,EAAC,MAAM,IAAE,YAAY,CAAQ,CACpC;YACN,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;gBACf,8BAAC,UAAI,IAAC,QAAQ,0BAAqB,CAC/B,CACF,CACP;QAGA,IAAI,KAAK,OAAO,IAAI,CACnB,8BAAC,SAAG,IACF,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,KAAK,EACjB,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC;YAEX,8BAAC,UAAI,IAAC,IAAI,QAAC,KAAK,EAAC,KAAK,2BAAuB;YAC7C,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;gBACf,8BAAC,UAAI,IAAC,KAAK,EAAC,KAAK,IAAE,KAAK,CAAQ,CAC5B;YACN,8BAAC,SAAG,IAAC,SAAS,EAAE,CAAC;gBACf,8BAAC,UAAI,IAAC,QAAQ,0BAAqB,CAC/B,CACF,CACP,CACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface FileBrowserProps {
|
|
3
|
+
mode: "folder" | "file";
|
|
4
|
+
initialPath?: string;
|
|
5
|
+
extensions?: string[];
|
|
6
|
+
title?: string;
|
|
7
|
+
onSelect: (selectedPath: string) => void;
|
|
8
|
+
onCancel: () => void;
|
|
9
|
+
}
|
|
10
|
+
export declare function FileBrowser({ mode, initialPath, extensions, title, onSelect, onCancel, }: FileBrowserProps): React.JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=FileBrowser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileBrowser.d.ts","sourceRoot":"","sources":["../../../src/tui/components/FileBrowser.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD,UAAU,gBAAgB;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAYD,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,WAAW,EACX,UAAe,EACf,KAAK,EACL,QAAQ,EACR,QAAQ,GACT,EAAE,gBAAgB,qBAwWlB"}
|
|
@@ -0,0 +1,349 @@
|
|
|
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.FileBrowser = FileBrowser;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const ink_1 = require("ink");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const config_store_1 = require("../../core/config-store");
|
|
42
|
+
function FileBrowser({ mode, initialPath, extensions = [], title, onSelect, onCancel, }) {
|
|
43
|
+
const [currentPath, setCurrentPath] = (0, react_1.useState)(initialPath || process.cwd());
|
|
44
|
+
const [items, setItems] = (0, react_1.useState)([]);
|
|
45
|
+
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
|
|
46
|
+
const [viewMode, setViewMode] = (0, react_1.useState)("quick");
|
|
47
|
+
const [inputPath, setInputPath] = (0, react_1.useState)("");
|
|
48
|
+
const [error, setError] = (0, react_1.useState)(null);
|
|
49
|
+
const [quickLocations, setQuickLocations] = (0, react_1.useState)([]);
|
|
50
|
+
// Load quick locations on mount
|
|
51
|
+
(0, react_1.useEffect)(() => {
|
|
52
|
+
setQuickLocations((0, config_store_1.getQuickLocations)());
|
|
53
|
+
}, []);
|
|
54
|
+
// Load directory contents when path changes
|
|
55
|
+
(0, react_1.useEffect)(() => {
|
|
56
|
+
if (viewMode !== "browse")
|
|
57
|
+
return;
|
|
58
|
+
try {
|
|
59
|
+
if (!fs.existsSync(currentPath)) {
|
|
60
|
+
setError(`Path not found: ${currentPath}`);
|
|
61
|
+
setItems([]);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const stat = fs.statSync(currentPath);
|
|
65
|
+
if (!stat.isDirectory()) {
|
|
66
|
+
setError("Not a directory");
|
|
67
|
+
setItems([]);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const entries = fs.readdirSync(currentPath, { withFileTypes: true });
|
|
71
|
+
const fileItems = [];
|
|
72
|
+
// Add parent directory
|
|
73
|
+
const parentPath = path.dirname(currentPath);
|
|
74
|
+
if (parentPath !== currentPath) {
|
|
75
|
+
fileItems.push({
|
|
76
|
+
name: "..",
|
|
77
|
+
isDirectory: true,
|
|
78
|
+
path: parentPath,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Add directories and files
|
|
82
|
+
for (const entry of entries) {
|
|
83
|
+
const fullPath = path.join(currentPath, entry.name);
|
|
84
|
+
const isDir = entry.isDirectory();
|
|
85
|
+
// Skip hidden files/folders (starting with .)
|
|
86
|
+
if (entry.name.startsWith("."))
|
|
87
|
+
continue;
|
|
88
|
+
// In file mode, filter by extension
|
|
89
|
+
if (mode === "file" && !isDir) {
|
|
90
|
+
if (extensions.length > 0) {
|
|
91
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
92
|
+
if (!extensions.includes(ext))
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// In folder mode, only show directories
|
|
97
|
+
if (mode === "folder" && !isDir)
|
|
98
|
+
continue;
|
|
99
|
+
try {
|
|
100
|
+
const stat = fs.statSync(fullPath);
|
|
101
|
+
fileItems.push({
|
|
102
|
+
name: entry.name,
|
|
103
|
+
isDirectory: isDir,
|
|
104
|
+
path: fullPath,
|
|
105
|
+
size: stat.size,
|
|
106
|
+
mtime: stat.mtime,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// Skip files we can't stat
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Sort: directories first, then files
|
|
114
|
+
fileItems.sort((a, b) => {
|
|
115
|
+
if (a.name === "..")
|
|
116
|
+
return -1;
|
|
117
|
+
if (b.name === "..")
|
|
118
|
+
return 1;
|
|
119
|
+
if (a.isDirectory && !b.isDirectory)
|
|
120
|
+
return -1;
|
|
121
|
+
if (!a.isDirectory && b.isDirectory)
|
|
122
|
+
return 1;
|
|
123
|
+
return a.name.localeCompare(b.name);
|
|
124
|
+
});
|
|
125
|
+
setItems(fileItems);
|
|
126
|
+
setSelectedIndex(0);
|
|
127
|
+
setError(null);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
setError(`Error reading directory: ${err}`);
|
|
131
|
+
setItems([]);
|
|
132
|
+
}
|
|
133
|
+
}, [currentPath, viewMode, mode, extensions]);
|
|
134
|
+
(0, ink_1.useInput)((input, key) => {
|
|
135
|
+
// Handle escape
|
|
136
|
+
if (key.escape) {
|
|
137
|
+
if (viewMode === "input") {
|
|
138
|
+
setViewMode("quick");
|
|
139
|
+
setInputPath("");
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
onCancel();
|
|
143
|
+
}
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
// Handle input mode
|
|
147
|
+
if (viewMode === "input") {
|
|
148
|
+
if (key.return) {
|
|
149
|
+
// Try to navigate to input path
|
|
150
|
+
const trimmed = inputPath.trim();
|
|
151
|
+
if (trimmed) {
|
|
152
|
+
if (fs.existsSync(trimmed)) {
|
|
153
|
+
const stat = fs.statSync(trimmed);
|
|
154
|
+
if (mode === "folder" && stat.isDirectory()) {
|
|
155
|
+
onSelect(trimmed);
|
|
156
|
+
}
|
|
157
|
+
else if (mode === "file" && stat.isFile()) {
|
|
158
|
+
onSelect(trimmed);
|
|
159
|
+
}
|
|
160
|
+
else if (stat.isDirectory()) {
|
|
161
|
+
setCurrentPath(trimmed);
|
|
162
|
+
setViewMode("browse");
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
setError("Invalid path for this mode");
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
setError("Path does not exist");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
if (key.backspace || key.delete) {
|
|
175
|
+
setInputPath(prev => prev.slice(0, -1));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (input && !key.ctrl && !key.meta) {
|
|
179
|
+
setInputPath(prev => prev + input);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Handle quick location mode
|
|
185
|
+
if (viewMode === "quick") {
|
|
186
|
+
// Number keys for quick locations
|
|
187
|
+
const num = parseInt(input, 10);
|
|
188
|
+
if (!isNaN(num) && num >= 1 && num <= quickLocations.length) {
|
|
189
|
+
const loc = quickLocations[num - 1];
|
|
190
|
+
if (mode === "folder") {
|
|
191
|
+
onSelect(loc.path);
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
setCurrentPath(loc.path);
|
|
195
|
+
setViewMode("browse");
|
|
196
|
+
}
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
// 'p' for paste path
|
|
200
|
+
if (input.toLowerCase() === "p") {
|
|
201
|
+
setViewMode("input");
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// 'b' for browse
|
|
205
|
+
if (input.toLowerCase() === "b") {
|
|
206
|
+
setViewMode("browse");
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
// Arrow keys to navigate quick locations
|
|
210
|
+
if (key.upArrow) {
|
|
211
|
+
setSelectedIndex(prev => Math.max(0, prev - 1));
|
|
212
|
+
}
|
|
213
|
+
if (key.downArrow) {
|
|
214
|
+
setSelectedIndex(prev => Math.min(quickLocations.length - 1, prev + 1));
|
|
215
|
+
}
|
|
216
|
+
if (key.return) {
|
|
217
|
+
const loc = quickLocations[selectedIndex];
|
|
218
|
+
if (loc) {
|
|
219
|
+
if (mode === "folder") {
|
|
220
|
+
onSelect(loc.path);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
setCurrentPath(loc.path);
|
|
224
|
+
setViewMode("browse");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
// Handle browse mode
|
|
231
|
+
if (viewMode === "browse") {
|
|
232
|
+
if (key.upArrow) {
|
|
233
|
+
setSelectedIndex(prev => Math.max(0, prev - 1));
|
|
234
|
+
}
|
|
235
|
+
if (key.downArrow) {
|
|
236
|
+
setSelectedIndex(prev => Math.min(items.length - 1, prev + 1));
|
|
237
|
+
}
|
|
238
|
+
if (key.return) {
|
|
239
|
+
const item = items[selectedIndex];
|
|
240
|
+
if (!item)
|
|
241
|
+
return;
|
|
242
|
+
if (item.isDirectory) {
|
|
243
|
+
if (mode === "folder") {
|
|
244
|
+
// In folder mode, enter selects current folder
|
|
245
|
+
// Navigate into with right arrow
|
|
246
|
+
onSelect(item.path === path.dirname(currentPath) ? currentPath : item.path);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
// In file mode, navigate into directory
|
|
250
|
+
setCurrentPath(item.path);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
// Select file
|
|
255
|
+
onSelect(item.path);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
if (key.rightArrow) {
|
|
259
|
+
const item = items[selectedIndex];
|
|
260
|
+
if (item?.isDirectory && item.name !== "..") {
|
|
261
|
+
setCurrentPath(item.path);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
if (key.leftArrow) {
|
|
265
|
+
const parent = path.dirname(currentPath);
|
|
266
|
+
if (parent !== currentPath) {
|
|
267
|
+
setCurrentPath(parent);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// 'p' for paste path
|
|
271
|
+
if (input.toLowerCase() === "p") {
|
|
272
|
+
setViewMode("input");
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// 'q' for quick locations
|
|
276
|
+
if (input.toLowerCase() === "q") {
|
|
277
|
+
setViewMode("quick");
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
const formatSize = (bytes) => {
|
|
283
|
+
if (bytes === undefined)
|
|
284
|
+
return "";
|
|
285
|
+
if (bytes < 1024)
|
|
286
|
+
return `${bytes}B`;
|
|
287
|
+
if (bytes < 1024 * 1024)
|
|
288
|
+
return `${(bytes / 1024).toFixed(1)}K`;
|
|
289
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}M`;
|
|
290
|
+
};
|
|
291
|
+
const truncatePath = (p, maxLen) => {
|
|
292
|
+
if (p.length <= maxLen)
|
|
293
|
+
return p;
|
|
294
|
+
return "..." + p.slice(-(maxLen - 3));
|
|
295
|
+
};
|
|
296
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", borderStyle: "round", borderColor: "cyan", paddingX: 2, paddingY: 1 },
|
|
297
|
+
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
|
|
298
|
+
react_1.default.createElement(ink_1.Text, { bold: true, color: "cyan" }, title || (mode === "folder" ? "Select Folder" : "Select File"))),
|
|
299
|
+
react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
|
|
300
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Path: "),
|
|
301
|
+
react_1.default.createElement(ink_1.Text, null, truncatePath(currentPath, 50))),
|
|
302
|
+
error && (react_1.default.createElement(ink_1.Box, { marginBottom: 1 },
|
|
303
|
+
react_1.default.createElement(ink_1.Text, { color: "red" },
|
|
304
|
+
"\u2717 ",
|
|
305
|
+
error))),
|
|
306
|
+
viewMode === "quick" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
307
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Quick Locations:"),
|
|
308
|
+
quickLocations.map((loc, index) => (react_1.default.createElement(ink_1.Box, { key: loc.path },
|
|
309
|
+
react_1.default.createElement(ink_1.Text, { color: index === selectedIndex ? "yellow" : "white" },
|
|
310
|
+
index === selectedIndex ? "> " : " ",
|
|
311
|
+
"[",
|
|
312
|
+
index + 1,
|
|
313
|
+
"] ",
|
|
314
|
+
loc.label),
|
|
315
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true },
|
|
316
|
+
" (",
|
|
317
|
+
truncatePath(loc.path, 30),
|
|
318
|
+
")")))),
|
|
319
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
320
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true },
|
|
321
|
+
"[1-",
|
|
322
|
+
quickLocations.length,
|
|
323
|
+
"] Select [B] Browse [P] Paste path [Esc] Cancel")))),
|
|
324
|
+
viewMode === "browse" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
325
|
+
react_1.default.createElement(ink_1.Box, { flexDirection: "column", height: 10 }, items.slice(Math.max(0, selectedIndex - 4), Math.max(10, selectedIndex + 6)).map((item, displayIndex) => {
|
|
326
|
+
const actualIndex = Math.max(0, selectedIndex - 4) + displayIndex;
|
|
327
|
+
const isSelected = actualIndex === selectedIndex;
|
|
328
|
+
return (react_1.default.createElement(ink_1.Box, { key: item.path },
|
|
329
|
+
react_1.default.createElement(ink_1.Text, { color: isSelected ? "yellow" : "white" },
|
|
330
|
+
isSelected ? "> " : " ",
|
|
331
|
+
item.isDirectory ? "📁 " : "📄 ",
|
|
332
|
+
item.name),
|
|
333
|
+
!item.isDirectory && (react_1.default.createElement(ink_1.Text, { dimColor: true },
|
|
334
|
+
" (",
|
|
335
|
+
formatSize(item.size),
|
|
336
|
+
")"))));
|
|
337
|
+
})),
|
|
338
|
+
react_1.default.createElement(ink_1.Box, { marginTop: 1 },
|
|
339
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "[\u2191\u2193] Navigate [Enter] Select [\u2190\u2192] Navigate dirs [Q] Quick [P] Paste [Esc] Cancel")))),
|
|
340
|
+
viewMode === "input" && (react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
|
|
341
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "Paste or type path:"),
|
|
342
|
+
react_1.default.createElement(ink_1.Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, marginY: 1 },
|
|
343
|
+
react_1.default.createElement(ink_1.Text, null,
|
|
344
|
+
inputPath,
|
|
345
|
+
react_1.default.createElement(ink_1.Text, { color: "yellow" }, "\u258C"))),
|
|
346
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
347
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "[Enter] Confirm [Esc] Back"))))));
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=FileBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileBrowser.js","sourceRoot":"","sources":["../../../src/tui/components/FileBrowser.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,MAAM,CAAC,EACrB,KAAkC,EAClC,QAAQ,GACT,EAAE,WAAW,qBAcb"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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.Header = Header;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const ink_1 = require("ink");
|
|
9
|
+
function Header({ title = "OpenCode Account Manager", subtitle, }) {
|
|
10
|
+
return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 1 },
|
|
11
|
+
react_1.default.createElement(ink_1.Box, null,
|
|
12
|
+
react_1.default.createElement(ink_1.Text, { bold: true, color: "cyan" },
|
|
13
|
+
"* ",
|
|
14
|
+
title),
|
|
15
|
+
subtitle && react_1.default.createElement(ink_1.Text, { dimColor: true },
|
|
16
|
+
" - ",
|
|
17
|
+
subtitle)),
|
|
18
|
+
react_1.default.createElement(ink_1.Text, { dimColor: true }, "\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=Header.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/tui/components/Header.tsx"],"names":[],"mappings":";;;;;AAQA,wBAiBC;AAzBD,kDAA0B;AAC1B,6BAAgC;AAOhC,SAAgB,MAAM,CAAC,EACrB,KAAK,GAAG,0BAA0B,EAClC,QAAQ,GACI;IACZ,OAAO,CACL,8BAAC,SAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC;QACzC,8BAAC,SAAG;YACF,8BAAC,UAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM;;gBAClB,KAAK,CACH;YACN,QAAQ,IAAI,8BAAC,UAAI,IAAC,QAAQ;;gBAAK,QAAQ,CAAQ,CAC5C;QACN,8BAAC,UAAI,IAAC,QAAQ,6YAEP,CACH,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Account } from "../../core/types";
|
|
3
|
+
interface ImportModalProps {
|
|
4
|
+
existingAccounts: Account[];
|
|
5
|
+
onComplete: (accounts: Account[], newCount: number, overwrittenCount: number) => void;
|
|
6
|
+
onCancel: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function ImportModal({ existingAccounts, onComplete, onCancel }: ImportModalProps): React.JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=ImportModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImportModal.d.ts","sourceRoot":"","sources":["../../../src/tui/components/ImportModal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAMxC,OAAO,EACL,OAAO,EAKR,MAAM,kBAAkB,CAAC;AAK1B,UAAU,gBAAgB;IACxB,gBAAgB,EAAE,OAAO,EAAE,CAAC;IAC5B,UAAU,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;IACtF,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AASD,wBAAgB,WAAW,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,gBAAgB,qBAiQvF"}
|