@123456btc/123456btc-cli 1.0.1 → 1.0.3
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/README.md +182 -39
- package/README.zh-CN.md +78 -0
- package/dist/api/client.d.ts +4 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +74 -16
- package/dist/api/client.js.map +1 -1
- package/dist/api/provider.d.ts +163 -0
- package/dist/api/provider.d.ts.map +1 -0
- package/dist/api/provider.js +123 -0
- package/dist/api/provider.js.map +1 -0
- package/dist/api/signal-crypto.d.ts +17 -0
- package/dist/api/signal-crypto.d.ts.map +1 -0
- package/dist/api/signal-crypto.js +48 -0
- package/dist/api/signal-crypto.js.map +1 -0
- package/dist/api/signals.d.ts +47 -0
- package/dist/api/signals.d.ts.map +1 -0
- package/dist/api/signals.js +34 -0
- package/dist/api/signals.js.map +1 -0
- package/dist/api/strategy-stream.d.ts +59 -0
- package/dist/api/strategy-stream.d.ts.map +1 -0
- package/dist/api/strategy-stream.js +136 -0
- package/dist/api/strategy-stream.js.map +1 -0
- package/dist/api/strategy.d.ts +66 -20
- package/dist/api/strategy.d.ts.map +1 -1
- package/dist/api/strategy.js +15 -18
- package/dist/api/strategy.js.map +1 -1
- package/dist/api/token-manager.d.ts +37 -0
- package/dist/api/token-manager.d.ts.map +1 -0
- package/dist/api/token-manager.js +191 -0
- package/dist/api/token-manager.js.map +1 -0
- package/dist/api/wallet.d.ts +38 -0
- package/dist/api/wallet.d.ts.map +1 -0
- package/dist/api/wallet.js +23 -0
- package/dist/api/wallet.js.map +1 -0
- package/dist/cli.js +12 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +149 -3
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +77 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +127 -24
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/provider.d.ts +3 -0
- package/dist/commands/provider.d.ts.map +1 -0
- package/dist/commands/provider.js +371 -0
- package/dist/commands/provider.js.map +1 -0
- package/dist/commands/signals.d.ts +3 -0
- package/dist/commands/signals.d.ts.map +1 -0
- package/dist/commands/signals.js +104 -0
- package/dist/commands/signals.js.map +1 -0
- package/dist/commands/strategy.d.ts.map +1 -1
- package/dist/commands/strategy.js +147 -59
- package/dist/commands/strategy.js.map +1 -1
- package/dist/commands/tier.d.ts +3 -0
- package/dist/commands/tier.d.ts.map +1 -0
- package/dist/commands/tier.js +105 -0
- package/dist/commands/tier.js.map +1 -0
- package/dist/commands/vault.d.ts +7 -0
- package/dist/commands/vault.d.ts.map +1 -0
- package/dist/commands/vault.js +377 -0
- package/dist/commands/vault.js.map +1 -0
- package/dist/commands/wallet.d.ts +3 -0
- package/dist/commands/wallet.d.ts.map +1 -0
- package/dist/commands/wallet.js +74 -0
- package/dist/commands/wallet.js.map +1 -0
- package/dist/config.d.ts +1 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -2
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -6
- package/dist/index.js.map +1 -1
- package/dist/providers/executor.d.ts +55 -20
- package/dist/providers/executor.d.ts.map +1 -1
- package/dist/providers/executor.js +260 -58
- package/dist/providers/executor.js.map +1 -1
- package/dist/providers/risk.d.ts +17 -0
- package/dist/providers/risk.d.ts.map +1 -0
- package/dist/providers/risk.js +67 -0
- package/dist/providers/risk.js.map +1 -0
- package/dist/providers/state.d.ts +30 -0
- package/dist/providers/state.d.ts.map +1 -0
- package/dist/providers/state.js +190 -0
- package/dist/providers/state.js.map +1 -0
- package/dist/types/strategy.d.ts +65 -1
- package/dist/types/strategy.d.ts.map +1 -1
- package/dist/types/strategy.js +1 -0
- package/dist/types/strategy.js.map +1 -1
- package/dist/utils/auth.d.ts +1 -0
- package/dist/utils/auth.d.ts.map +1 -1
- package/dist/utils/device.d.ts +13 -0
- package/dist/utils/device.d.ts.map +1 -0
- package/dist/utils/device.js +104 -0
- package/dist/utils/device.js.map +1 -0
- package/dist/vault/backends/file.d.ts +15 -0
- package/dist/vault/backends/file.d.ts.map +1 -0
- package/dist/vault/backends/file.js +39 -0
- package/dist/vault/backends/file.js.map +1 -0
- package/dist/vault/backends/os-keychain.d.ts +13 -0
- package/dist/vault/backends/os-keychain.d.ts.map +1 -0
- package/dist/vault/backends/os-keychain.js +60 -0
- package/dist/vault/backends/os-keychain.js.map +1 -0
- package/dist/vault/backends/os-secret.d.ts +13 -0
- package/dist/vault/backends/os-secret.d.ts.map +1 -0
- package/dist/vault/backends/os-secret.js +57 -0
- package/dist/vault/backends/os-secret.js.map +1 -0
- package/dist/vault/backends/os-win-cred.d.ts +13 -0
- package/dist/vault/backends/os-win-cred.d.ts.map +1 -0
- package/dist/vault/backends/os-win-cred.js +76 -0
- package/dist/vault/backends/os-win-cred.js.map +1 -0
- package/dist/vault/crypto.d.ts +49 -0
- package/dist/vault/crypto.d.ts.map +1 -0
- package/dist/vault/crypto.js +122 -0
- package/dist/vault/crypto.js.map +1 -0
- package/dist/vault/index.d.ts +88 -0
- package/dist/vault/index.d.ts.map +1 -0
- package/dist/vault/index.js +276 -0
- package/dist/vault/index.js.map +1 -0
- package/dist/vault/storage.d.ts +14 -0
- package/dist/vault/storage.d.ts.map +1 -0
- package/dist/vault/storage.js +68 -0
- package/dist/vault/storage.js.map +1 -0
- package/dist/vault/types.d.ts +41 -0
- package/dist/vault/types.d.ts.map +1 -0
- package/dist/vault/types.js +6 -0
- package/dist/vault/types.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* VaultManager - Secure key vault for 123456btc CLI
|
|
4
|
+
*
|
|
5
|
+
* Manages encrypted storage of:
|
|
6
|
+
* - Exchange API keys (Binance, OKX, Bybit, etc.)
|
|
7
|
+
* - LLM provider keys (OpenAI, Anthropic, etc.)
|
|
8
|
+
* - Wallet private keys (Solana, etc.)
|
|
9
|
+
*
|
|
10
|
+
* Security model:
|
|
11
|
+
* - Master password → scrypt KDF → KEK
|
|
12
|
+
* - KEK encrypts all vault data (AES-256-GCM)
|
|
13
|
+
* - Plaintext keys only exist in memory during active use
|
|
14
|
+
* - Memory buffers are explicitly wiped after use
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.VaultManager = void 0;
|
|
18
|
+
exports.getVault = getVault;
|
|
19
|
+
exports.resetVault = resetVault;
|
|
20
|
+
const crypto_1 = require("./crypto");
|
|
21
|
+
const storage_1 = require("./storage");
|
|
22
|
+
class VaultManager {
|
|
23
|
+
state = {
|
|
24
|
+
unlocked: false,
|
|
25
|
+
entries: [],
|
|
26
|
+
meta: null,
|
|
27
|
+
};
|
|
28
|
+
kek = null;
|
|
29
|
+
backend = null;
|
|
30
|
+
autoLockTimer = null;
|
|
31
|
+
autoLockMs;
|
|
32
|
+
constructor(options = {}) {
|
|
33
|
+
this.autoLockMs = options.autoLockMs ?? 300_000; // 5 minutes default
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Initialize vault with a master password
|
|
37
|
+
* Creates new vault if not exists
|
|
38
|
+
*/
|
|
39
|
+
async init(password) {
|
|
40
|
+
this.backend = await (0, storage_1.selectBackend)();
|
|
41
|
+
const existing = await this.backend.read();
|
|
42
|
+
if (existing) {
|
|
43
|
+
throw new Error('Vault already exists. Use `unlock` instead.');
|
|
44
|
+
}
|
|
45
|
+
const salt = (0, crypto_1.generateSalt)();
|
|
46
|
+
this.kek = (0, crypto_1.deriveKey)(password, salt);
|
|
47
|
+
const meta = {
|
|
48
|
+
version: crypto_1.VAULT_VERSION,
|
|
49
|
+
createdAt: new Date().toISOString(),
|
|
50
|
+
salt: Buffer.from(salt).toString('hex'),
|
|
51
|
+
kdfParams: crypto_1.DEFAULT_KDF,
|
|
52
|
+
};
|
|
53
|
+
this.state = {
|
|
54
|
+
unlocked: true,
|
|
55
|
+
entries: [],
|
|
56
|
+
meta,
|
|
57
|
+
};
|
|
58
|
+
await this._save();
|
|
59
|
+
this._startAutoLock();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Unlock vault with master password
|
|
63
|
+
*/
|
|
64
|
+
async unlock(password) {
|
|
65
|
+
if (this.state.unlocked)
|
|
66
|
+
return;
|
|
67
|
+
this.backend = await (0, storage_1.selectBackend)();
|
|
68
|
+
const encrypted = await this.backend.read();
|
|
69
|
+
if (!encrypted) {
|
|
70
|
+
throw new Error('Vault not found. Run `vault init` first.');
|
|
71
|
+
}
|
|
72
|
+
// First, try to decrypt to get metadata and validate password
|
|
73
|
+
let plaintext;
|
|
74
|
+
try {
|
|
75
|
+
// The file format: salt(32) + encrypted_payload
|
|
76
|
+
const salt = encrypted.slice(0, 32);
|
|
77
|
+
const payload = encrypted.slice(32);
|
|
78
|
+
this.kek = (0, crypto_1.deriveKey)(password, new Uint8Array(salt));
|
|
79
|
+
plaintext = (0, crypto_1.decrypt)(new Uint8Array(payload), this.kek.data);
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
this._clearKek();
|
|
83
|
+
throw new Error('Invalid master password.');
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
const data = (0, crypto_1.decodeVaultData)(plaintext);
|
|
87
|
+
if (data.version !== crypto_1.VAULT_VERSION) {
|
|
88
|
+
throw new Error(`Unsupported vault version: ${data.version}`);
|
|
89
|
+
}
|
|
90
|
+
this.state = {
|
|
91
|
+
unlocked: true,
|
|
92
|
+
entries: data.entries,
|
|
93
|
+
meta: data.meta,
|
|
94
|
+
};
|
|
95
|
+
this._startAutoLock();
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
this._clearKek();
|
|
99
|
+
throw new Error(`Failed to decode vault: ${err.message}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Lock vault, wipe KEK from memory
|
|
104
|
+
*/
|
|
105
|
+
lock() {
|
|
106
|
+
this._clearKek();
|
|
107
|
+
this.state.unlocked = false;
|
|
108
|
+
this.state.entries = [];
|
|
109
|
+
this.state.meta = null;
|
|
110
|
+
if (this.autoLockTimer) {
|
|
111
|
+
clearTimeout(this.autoLockTimer);
|
|
112
|
+
this.autoLockTimer = null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Check if vault is unlocked
|
|
117
|
+
*/
|
|
118
|
+
isUnlocked() {
|
|
119
|
+
return this.state.unlocked && this.kek !== null;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Set a vault entry (create or update)
|
|
123
|
+
*/
|
|
124
|
+
async set(name, data, category = 'other', tags) {
|
|
125
|
+
this._ensureUnlocked();
|
|
126
|
+
const now = new Date().toISOString();
|
|
127
|
+
const existingIndex = this.state.entries.findIndex(e => e.name === name);
|
|
128
|
+
if (existingIndex >= 0) {
|
|
129
|
+
this.state.entries[existingIndex] = {
|
|
130
|
+
...this.state.entries[existingIndex],
|
|
131
|
+
data,
|
|
132
|
+
category,
|
|
133
|
+
updatedAt: now,
|
|
134
|
+
tags,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
this.state.entries.push({
|
|
139
|
+
name,
|
|
140
|
+
category,
|
|
141
|
+
data,
|
|
142
|
+
createdAt: now,
|
|
143
|
+
updatedAt: now,
|
|
144
|
+
tags,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
await this._save();
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Get a vault entry by name
|
|
151
|
+
* Returns decrypted data as SecureBuffer-compatible plain object
|
|
152
|
+
*/
|
|
153
|
+
get(name) {
|
|
154
|
+
this._ensureUnlocked();
|
|
155
|
+
return this.state.entries.find(e => e.name === name);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Get sensitive value as SecureBuffer (must call .wipe() after use!)
|
|
159
|
+
*/
|
|
160
|
+
getSecure(name, field) {
|
|
161
|
+
this._ensureUnlocked();
|
|
162
|
+
const entry = this.state.entries.find(e => e.name === name);
|
|
163
|
+
if (!entry)
|
|
164
|
+
return undefined;
|
|
165
|
+
const value = entry.data[field];
|
|
166
|
+
if (!value)
|
|
167
|
+
return undefined;
|
|
168
|
+
return (0, crypto_1.secureBuffer)(new TextEncoder().encode(value));
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* List all vault entries (sensitive values masked)
|
|
172
|
+
*/
|
|
173
|
+
list() {
|
|
174
|
+
this._ensureUnlocked();
|
|
175
|
+
return this.state.entries.map(e => ({
|
|
176
|
+
name: e.name,
|
|
177
|
+
category: e.category,
|
|
178
|
+
createdAt: e.createdAt,
|
|
179
|
+
updatedAt: e.updatedAt,
|
|
180
|
+
tags: e.tags,
|
|
181
|
+
fields: Object.keys(e.data),
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Remove an entry by name
|
|
186
|
+
*/
|
|
187
|
+
async remove(name) {
|
|
188
|
+
this._ensureUnlocked();
|
|
189
|
+
const idx = this.state.entries.findIndex(e => e.name === name);
|
|
190
|
+
if (idx < 0)
|
|
191
|
+
return false;
|
|
192
|
+
this.state.entries.splice(idx, 1);
|
|
193
|
+
await this._save();
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Change master password
|
|
198
|
+
*/
|
|
199
|
+
async changePassword(oldPassword, newPassword) {
|
|
200
|
+
await this.unlock(oldPassword);
|
|
201
|
+
const salt = (0, crypto_1.generateSalt)();
|
|
202
|
+
const newKek = (0, crypto_1.deriveKey)(newPassword, salt);
|
|
203
|
+
const meta = {
|
|
204
|
+
version: crypto_1.VAULT_VERSION,
|
|
205
|
+
createdAt: this.state.meta.createdAt,
|
|
206
|
+
salt: Buffer.from(salt).toString('hex'),
|
|
207
|
+
kdfParams: crypto_1.DEFAULT_KDF,
|
|
208
|
+
};
|
|
209
|
+
this.state.meta = meta;
|
|
210
|
+
this._clearKek();
|
|
211
|
+
this.kek = newKek;
|
|
212
|
+
await this._save();
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Destroy vault (delete all data)
|
|
216
|
+
*/
|
|
217
|
+
async destroy() {
|
|
218
|
+
this.backend = await (0, storage_1.selectBackend)();
|
|
219
|
+
await this.backend.delete();
|
|
220
|
+
this.lock();
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get storage backend name
|
|
224
|
+
*/
|
|
225
|
+
getBackendName() {
|
|
226
|
+
return this.backend?.name ?? 'unknown';
|
|
227
|
+
}
|
|
228
|
+
// ---- Private helpers ----
|
|
229
|
+
_ensureUnlocked() {
|
|
230
|
+
if (!this.state.unlocked || !this.kek) {
|
|
231
|
+
throw new Error('Vault is locked. Run `vault unlock` first.');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async _save() {
|
|
235
|
+
if (!this.backend || !this.kek || !this.state.meta) {
|
|
236
|
+
throw new Error('Cannot save: vault not initialized');
|
|
237
|
+
}
|
|
238
|
+
const payload = (0, crypto_1.encodeVaultData)(this.state.entries, this.state.meta);
|
|
239
|
+
const encrypted = (0, crypto_1.encrypt)(payload, this.kek.data);
|
|
240
|
+
// Format: salt + encrypted
|
|
241
|
+
const salt = Buffer.from(this.state.meta.salt, 'hex');
|
|
242
|
+
const data = Buffer.concat([salt, Buffer.from(encrypted)]);
|
|
243
|
+
await this.backend.write(data);
|
|
244
|
+
}
|
|
245
|
+
_startAutoLock() {
|
|
246
|
+
if (this.autoLockTimer) {
|
|
247
|
+
clearTimeout(this.autoLockTimer);
|
|
248
|
+
}
|
|
249
|
+
this.autoLockTimer = setTimeout(() => {
|
|
250
|
+
console.log('\n[Vault] Auto-locked due to inactivity.');
|
|
251
|
+
this.lock();
|
|
252
|
+
}, this.autoLockMs);
|
|
253
|
+
}
|
|
254
|
+
_clearKek() {
|
|
255
|
+
if (this.kek) {
|
|
256
|
+
this.kek.wipe();
|
|
257
|
+
this.kek = null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.VaultManager = VaultManager;
|
|
262
|
+
// Singleton instance
|
|
263
|
+
let vaultInstance = null;
|
|
264
|
+
function getVault(options) {
|
|
265
|
+
if (!vaultInstance) {
|
|
266
|
+
vaultInstance = new VaultManager(options);
|
|
267
|
+
}
|
|
268
|
+
return vaultInstance;
|
|
269
|
+
}
|
|
270
|
+
function resetVault() {
|
|
271
|
+
if (vaultInstance) {
|
|
272
|
+
vaultInstance.lock();
|
|
273
|
+
vaultInstance = null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vault/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Storage backend selection and abstraction
|
|
3
|
+
*/
|
|
4
|
+
import type { IStorageBackend } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* Auto-detect and select the best available storage backend
|
|
7
|
+
* Priority: macOS Keychain > Linux libsecret > Windows Cred > encrypted file
|
|
8
|
+
*/
|
|
9
|
+
export declare function selectBackend(forceFile?: string): Promise<IStorageBackend>;
|
|
10
|
+
/**
|
|
11
|
+
* Reset backend selection (for testing)
|
|
12
|
+
*/
|
|
13
|
+
export declare function resetBackend(): void;
|
|
14
|
+
//# sourceMappingURL=storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/vault/storage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ/C;;;GAGG;AACH,wBAAsB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA+BhF;AAmBD;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAEnC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Storage backend selection and abstraction
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.selectBackend = selectBackend;
|
|
7
|
+
exports.resetBackend = resetBackend;
|
|
8
|
+
const os_keychain_1 = require("./backends/os-keychain");
|
|
9
|
+
const os_secret_1 = require("./backends/os-secret");
|
|
10
|
+
const os_win_cred_1 = require("./backends/os-win-cred");
|
|
11
|
+
const file_1 = require("./backends/file");
|
|
12
|
+
let selectedBackend = null;
|
|
13
|
+
/**
|
|
14
|
+
* Auto-detect and select the best available storage backend
|
|
15
|
+
* Priority: macOS Keychain > Linux libsecret > Windows Cred > encrypted file
|
|
16
|
+
*/
|
|
17
|
+
async function selectBackend(forceFile) {
|
|
18
|
+
if (selectedBackend)
|
|
19
|
+
return selectedBackend;
|
|
20
|
+
// Force file backend
|
|
21
|
+
if (forceFile) {
|
|
22
|
+
selectedBackend = new file_1.FileBackend(forceFile);
|
|
23
|
+
return selectedBackend;
|
|
24
|
+
}
|
|
25
|
+
// Try OS-native backends
|
|
26
|
+
const candidates = [
|
|
27
|
+
new os_keychain_1.MacOSKeychainBackend(),
|
|
28
|
+
new os_secret_1.LinuxSecretBackend(),
|
|
29
|
+
new os_win_cred_1.WindowsCredBackend(),
|
|
30
|
+
];
|
|
31
|
+
for (const backend of candidates) {
|
|
32
|
+
try {
|
|
33
|
+
if (await backend.isAvailable()) {
|
|
34
|
+
selectedBackend = backend;
|
|
35
|
+
return backend;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
// continue to next
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Fallback to encrypted file in user's config dir
|
|
43
|
+
const path = getDefaultVaultPath();
|
|
44
|
+
selectedBackend = new file_1.FileBackend(path);
|
|
45
|
+
return selectedBackend;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get default vault file path based on OS
|
|
49
|
+
*/
|
|
50
|
+
function getDefaultVaultPath() {
|
|
51
|
+
const os = process.platform;
|
|
52
|
+
const home = process.env.HOME || process.env.USERPROFILE || '.';
|
|
53
|
+
switch (os) {
|
|
54
|
+
case 'darwin':
|
|
55
|
+
return `${home}/Library/Application Support/123456btc/vault.enc`;
|
|
56
|
+
case 'win32':
|
|
57
|
+
return `${home}/AppData/Roaming/123456btc/vault.enc`;
|
|
58
|
+
default:
|
|
59
|
+
return `${home}/.config/123456btc/vault.enc`;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reset backend selection (for testing)
|
|
64
|
+
*/
|
|
65
|
+
function resetBackend() {
|
|
66
|
+
selectedBackend = null;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/vault/storage.ts"],"names":[],"mappings":";AAAA;;GAEG;;AAcH,sCA+BC;AAsBD,oCAEC;AAlED,wDAA8D;AAC9D,oDAA0D;AAC1D,wDAA4D;AAC5D,0CAA8C;AAE9C,IAAI,eAAe,GAA2B,IAAI,CAAC;AAEnD;;;GAGG;AACI,KAAK,UAAU,aAAa,CAAC,SAAkB;IACpD,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,qBAAqB;IACrB,IAAI,SAAS,EAAE,CAAC;QACd,eAAe,GAAG,IAAI,kBAAW,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAsB;QACpC,IAAI,kCAAoB,EAAE;QAC1B,IAAI,8BAAkB,EAAE;QACxB,IAAI,gCAAkB,EAAE;KACzB,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;gBAChC,eAAe,GAAG,OAAO,CAAC;gBAC1B,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;IAED,kDAAkD;IAClD,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,eAAe,GAAG,IAAI,kBAAW,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB;IAC1B,MAAM,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAC5B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,CAAC;IAEhE,QAAQ,EAAE,EAAE,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,GAAG,IAAI,kDAAkD,CAAC;QACnE,KAAK,OAAO;YACV,OAAO,GAAG,IAAI,sCAAsC,CAAC;QACvD;YACE,OAAO,GAAG,IAAI,8BAA8B,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY;IAC1B,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vault types - Secure key storage for 123456btc CLI
|
|
3
|
+
*/
|
|
4
|
+
export interface VaultEntry {
|
|
5
|
+
name: string;
|
|
6
|
+
category: 'exchange' | 'llm' | 'wallet' | 'other';
|
|
7
|
+
data: Record<string, string>;
|
|
8
|
+
createdAt: string;
|
|
9
|
+
updatedAt: string;
|
|
10
|
+
tags?: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface VaultMeta {
|
|
13
|
+
version: number;
|
|
14
|
+
createdAt: string;
|
|
15
|
+
salt: string;
|
|
16
|
+
kdfParams: KDFParams;
|
|
17
|
+
}
|
|
18
|
+
export interface KDFParams {
|
|
19
|
+
algorithm: 'scrypt' | 'argon2id';
|
|
20
|
+
n?: number;
|
|
21
|
+
r?: number;
|
|
22
|
+
p?: number;
|
|
23
|
+
dkLen: number;
|
|
24
|
+
}
|
|
25
|
+
export interface VaultState {
|
|
26
|
+
unlocked: boolean;
|
|
27
|
+
entries: VaultEntry[];
|
|
28
|
+
meta: VaultMeta | null;
|
|
29
|
+
}
|
|
30
|
+
export interface SecureBuffer {
|
|
31
|
+
data: Uint8Array;
|
|
32
|
+
wipe(): void;
|
|
33
|
+
}
|
|
34
|
+
export interface IStorageBackend {
|
|
35
|
+
readonly name: string;
|
|
36
|
+
isAvailable(): Promise<boolean>;
|
|
37
|
+
read(): Promise<Buffer | null>;
|
|
38
|
+
write(data: Buffer): Promise<void>;
|
|
39
|
+
delete(): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,QAAQ,GAAG,UAAU,CAAC;IACjC,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,IAAI,IAAI,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@123456btc/123456btc-cli",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "123456btc CLI -
|
|
3
|
+
"version": "1.0.3",
|
|
4
|
+
"description": "123456btc CLI - 策略订阅、信号接收、Provider 管理一站式工具",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"bin": {
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
"dist",
|
|
23
23
|
"bin",
|
|
24
24
|
"README.md",
|
|
25
|
+
"README.zh-CN.md",
|
|
25
26
|
"LICENSE"
|
|
26
27
|
],
|
|
27
28
|
"keywords": [
|
|
@@ -45,7 +46,9 @@
|
|
|
45
46
|
"envalid": "^8.0.0",
|
|
46
47
|
"figlet": "^1.7.0",
|
|
47
48
|
"inquirer": "^10.0.0",
|
|
49
|
+
"qrcode-terminal": "^0.12.0",
|
|
48
50
|
"semver": "^7.6.0",
|
|
51
|
+
"tar": "^6.2.0",
|
|
49
52
|
"zod": "^3.23.0"
|
|
50
53
|
},
|
|
51
54
|
"devDependencies": {
|