@123456btc/123456btc-cli 1.0.1 → 1.0.2

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 (130) hide show
  1. package/dist/api/client.d.ts +4 -0
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/api/client.js +74 -16
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/provider.d.ts +163 -0
  6. package/dist/api/provider.d.ts.map +1 -0
  7. package/dist/api/provider.js +123 -0
  8. package/dist/api/provider.js.map +1 -0
  9. package/dist/api/signal-crypto.d.ts +17 -0
  10. package/dist/api/signal-crypto.d.ts.map +1 -0
  11. package/dist/api/signal-crypto.js +48 -0
  12. package/dist/api/signal-crypto.js.map +1 -0
  13. package/dist/api/signals.d.ts +47 -0
  14. package/dist/api/signals.d.ts.map +1 -0
  15. package/dist/api/signals.js +34 -0
  16. package/dist/api/signals.js.map +1 -0
  17. package/dist/api/strategy-stream.d.ts +59 -0
  18. package/dist/api/strategy-stream.d.ts.map +1 -0
  19. package/dist/api/strategy-stream.js +136 -0
  20. package/dist/api/strategy-stream.js.map +1 -0
  21. package/dist/api/strategy.d.ts +66 -20
  22. package/dist/api/strategy.d.ts.map +1 -1
  23. package/dist/api/strategy.js +15 -18
  24. package/dist/api/strategy.js.map +1 -1
  25. package/dist/api/token-manager.d.ts +37 -0
  26. package/dist/api/token-manager.d.ts.map +1 -0
  27. package/dist/api/token-manager.js +191 -0
  28. package/dist/api/token-manager.js.map +1 -0
  29. package/dist/api/wallet.d.ts +38 -0
  30. package/dist/api/wallet.d.ts.map +1 -0
  31. package/dist/api/wallet.js +23 -0
  32. package/dist/api/wallet.js.map +1 -0
  33. package/dist/cli.js +12 -2
  34. package/dist/cli.js.map +1 -1
  35. package/dist/commands/auth.d.ts.map +1 -1
  36. package/dist/commands/auth.js +149 -3
  37. package/dist/commands/auth.js.map +1 -1
  38. package/dist/commands/health.d.ts +3 -0
  39. package/dist/commands/health.d.ts.map +1 -0
  40. package/dist/commands/health.js +77 -0
  41. package/dist/commands/health.js.map +1 -0
  42. package/dist/commands/install.d.ts.map +1 -1
  43. package/dist/commands/install.js +127 -24
  44. package/dist/commands/install.js.map +1 -1
  45. package/dist/commands/provider.d.ts +3 -0
  46. package/dist/commands/provider.d.ts.map +1 -0
  47. package/dist/commands/provider.js +371 -0
  48. package/dist/commands/provider.js.map +1 -0
  49. package/dist/commands/signals.d.ts +3 -0
  50. package/dist/commands/signals.d.ts.map +1 -0
  51. package/dist/commands/signals.js +104 -0
  52. package/dist/commands/signals.js.map +1 -0
  53. package/dist/commands/strategy.d.ts.map +1 -1
  54. package/dist/commands/strategy.js +147 -59
  55. package/dist/commands/strategy.js.map +1 -1
  56. package/dist/commands/tier.d.ts +3 -0
  57. package/dist/commands/tier.d.ts.map +1 -0
  58. package/dist/commands/tier.js +105 -0
  59. package/dist/commands/tier.js.map +1 -0
  60. package/dist/commands/vault.d.ts +7 -0
  61. package/dist/commands/vault.d.ts.map +1 -0
  62. package/dist/commands/vault.js +377 -0
  63. package/dist/commands/vault.js.map +1 -0
  64. package/dist/commands/wallet.d.ts +3 -0
  65. package/dist/commands/wallet.d.ts.map +1 -0
  66. package/dist/commands/wallet.js +74 -0
  67. package/dist/commands/wallet.js.map +1 -0
  68. package/dist/config.d.ts +1 -0
  69. package/dist/config.d.ts.map +1 -1
  70. package/dist/config.js +16 -2
  71. package/dist/config.js.map +1 -1
  72. package/dist/index.d.ts +12 -4
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +22 -6
  75. package/dist/index.js.map +1 -1
  76. package/dist/providers/executor.d.ts +55 -20
  77. package/dist/providers/executor.d.ts.map +1 -1
  78. package/dist/providers/executor.js +260 -58
  79. package/dist/providers/executor.js.map +1 -1
  80. package/dist/providers/risk.d.ts +17 -0
  81. package/dist/providers/risk.d.ts.map +1 -0
  82. package/dist/providers/risk.js +67 -0
  83. package/dist/providers/risk.js.map +1 -0
  84. package/dist/providers/state.d.ts +30 -0
  85. package/dist/providers/state.d.ts.map +1 -0
  86. package/dist/providers/state.js +190 -0
  87. package/dist/providers/state.js.map +1 -0
  88. package/dist/types/strategy.d.ts +65 -1
  89. package/dist/types/strategy.d.ts.map +1 -1
  90. package/dist/types/strategy.js +1 -0
  91. package/dist/types/strategy.js.map +1 -1
  92. package/dist/utils/auth.d.ts +1 -0
  93. package/dist/utils/auth.d.ts.map +1 -1
  94. package/dist/utils/device.d.ts +13 -0
  95. package/dist/utils/device.d.ts.map +1 -0
  96. package/dist/utils/device.js +104 -0
  97. package/dist/utils/device.js.map +1 -0
  98. package/dist/vault/backends/file.d.ts +15 -0
  99. package/dist/vault/backends/file.d.ts.map +1 -0
  100. package/dist/vault/backends/file.js +39 -0
  101. package/dist/vault/backends/file.js.map +1 -0
  102. package/dist/vault/backends/os-keychain.d.ts +13 -0
  103. package/dist/vault/backends/os-keychain.d.ts.map +1 -0
  104. package/dist/vault/backends/os-keychain.js +60 -0
  105. package/dist/vault/backends/os-keychain.js.map +1 -0
  106. package/dist/vault/backends/os-secret.d.ts +13 -0
  107. package/dist/vault/backends/os-secret.d.ts.map +1 -0
  108. package/dist/vault/backends/os-secret.js +57 -0
  109. package/dist/vault/backends/os-secret.js.map +1 -0
  110. package/dist/vault/backends/os-win-cred.d.ts +13 -0
  111. package/dist/vault/backends/os-win-cred.d.ts.map +1 -0
  112. package/dist/vault/backends/os-win-cred.js +76 -0
  113. package/dist/vault/backends/os-win-cred.js.map +1 -0
  114. package/dist/vault/crypto.d.ts +49 -0
  115. package/dist/vault/crypto.d.ts.map +1 -0
  116. package/dist/vault/crypto.js +122 -0
  117. package/dist/vault/crypto.js.map +1 -0
  118. package/dist/vault/index.d.ts +88 -0
  119. package/dist/vault/index.d.ts.map +1 -0
  120. package/dist/vault/index.js +276 -0
  121. package/dist/vault/index.js.map +1 -0
  122. package/dist/vault/storage.d.ts +14 -0
  123. package/dist/vault/storage.d.ts.map +1 -0
  124. package/dist/vault/storage.js +68 -0
  125. package/dist/vault/storage.js.map +1 -0
  126. package/dist/vault/types.d.ts +41 -0
  127. package/dist/vault/types.d.ts.map +1 -0
  128. package/dist/vault/types.js +6 -0
  129. package/dist/vault/types.js.map +1 -0
  130. package/package.json +3 -1
@@ -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":";AAAA;;;;;;;;;;;;;GAaG;;;AAiSH,4BAKC;AAED,gCAKC;AA1SD,qCAUkB;AAClB,uCAA0C;AAE1C,MAAa,YAAY;IACf,KAAK,GAAe;QAC1B,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,IAAI;KACX,CAAC;IAEM,GAAG,GAAwB,IAAI,CAAC;IAChC,OAAO,GAA2B,IAAI,CAAC;IACvC,aAAa,GAA0B,IAAI,CAAC;IACnC,UAAU,CAAS;IAEpC,YAAY,UAAuD,EAAE;QACnE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,CAAC,oBAAoB;IACvE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI,CAAC,QAAgB;QACzB,IAAI,CAAC,OAAO,GAAG,MAAM,IAAA,uBAAa,GAAE,CAAC;QAErC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC5B,IAAI,CAAC,GAAG,GAAG,IAAA,kBAAS,EAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAErC,MAAM,IAAI,GAAc;YACtB,OAAO,EAAE,sBAAa;YACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvC,SAAS,EAAE,oBAAW;SACvB,CAAC;QAEF,IAAI,CAAC,KAAK,GAAG;YACX,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,EAAE;YACX,IAAI;SACL,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,EAAE,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE,OAAO;QAEhC,IAAI,CAAC,OAAO,GAAG,MAAM,IAAA,uBAAa,GAAE,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,8DAA8D;QAC9D,IAAI,SAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,gDAAgD;YAChD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAEpC,IAAI,CAAC,GAAG,GAAG,IAAA,kBAAS,EAAC,QAAQ,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YACrD,SAAS,GAAG,IAAA,gBAAO,EAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAA,wBAAe,EAAC,SAAS,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,OAAO,KAAK,sBAAa,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,IAAI,CAAC,KAAK,GAAG;gBACX,QAAQ,EAAE,IAAI;gBACd,OAAO,EAAE,IAAI,CAAC,OAAuB;gBACrC,IAAI,EAAE,IAAI,CAAC,IAAiB;aAC7B,CAAC;YACF,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,IAA4B,EAAE,WAAmC,OAAO,EAAE,IAAe;QAC/G,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAEzE,IAAI,aAAa,IAAI,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG;gBAClC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;gBACpC,IAAI;gBACJ,QAAQ;gBACR,SAAS,EAAE,GAAG;gBACd,IAAI;aACL,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;gBACtB,IAAI;gBACJ,QAAQ;gBACR,IAAI;gBACJ,SAAS,EAAE,GAAG;gBACd,SAAS,EAAE,GAAG;gBACd,IAAI;aACL,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,GAAG,CAAC,IAAY;QACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,IAAY,EAAE,KAAa;QACnC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,OAAO,IAAA,qBAAY,EAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;SAC5B,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAC/D,IAAI,GAAG,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,WAAmB;QAC3D,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAE/B,MAAM,IAAI,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAc;YACtB,OAAO,EAAE,sBAAa;YACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAK,CAAC,SAAS;YACrC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvC,SAAS,EAAE,oBAAW;SACvB,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAClB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,OAAO,GAAG,MAAM,IAAA,uBAAa,GAAE,CAAC;QACrC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;IACzC,CAAC;IAED,4BAA4B;IAEpB,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,wBAAe,EAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrE,MAAM,SAAS,GAAG,IAAA,gBAAO,EAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAElD,2BAA2B;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAE3D,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEO,cAAc;QACpB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAEO,SAAS;QACf,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;CACF;AA5QD,oCA4QC;AAED,qBAAqB;AACrB,IAAI,aAAa,GAAwB,IAAI,CAAC;AAE9C,SAAgB,QAAQ,CAAC,OAAqD;IAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,IAAI,EAAE,CAAC;QACrB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -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,6 @@
1
+ "use strict";
2
+ /**
3
+ * Vault types - Secure key storage for 123456btc CLI
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@123456btc/123456btc-cli",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "description": "123456btc CLI - Strategy dispatch & gas settlement for AI agents",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -45,7 +45,9 @@
45
45
  "envalid": "^8.0.0",
46
46
  "figlet": "^1.7.0",
47
47
  "inquirer": "^10.0.0",
48
+ "qrcode-terminal": "^0.12.0",
48
49
  "semver": "^7.6.0",
50
+ "tar": "^6.2.0",
49
51
  "zod": "^3.23.0"
50
52
  },
51
53
  "devDependencies": {