@vultisig/cli 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +391 -0
  2. package/dist/adapters/cli-context.js +25 -0
  3. package/dist/adapters/cli-context.js.map +1 -0
  4. package/dist/adapters/cli-runner.js +47 -0
  5. package/dist/adapters/cli-runner.js.map +1 -0
  6. package/dist/adapters/index.js +6 -0
  7. package/dist/adapters/index.js.map +1 -0
  8. package/dist/commands/balance.js +65 -0
  9. package/dist/commands/balance.js.map +1 -0
  10. package/dist/commands/chains.js +46 -0
  11. package/dist/commands/chains.js.map +1 -0
  12. package/dist/commands/index.js +12 -0
  13. package/dist/commands/index.js.map +1 -0
  14. package/dist/commands/settings.js +151 -0
  15. package/dist/commands/settings.js.map +1 -0
  16. package/dist/commands/swap.js +180 -0
  17. package/dist/commands/swap.js.map +1 -0
  18. package/dist/commands/tokens.js +116 -0
  19. package/dist/commands/tokens.js.map +1 -0
  20. package/dist/commands/transaction.js +99 -0
  21. package/dist/commands/transaction.js.map +1 -0
  22. package/dist/commands/vault-management.js +360 -0
  23. package/dist/commands/vault-management.js.map +1 -0
  24. package/dist/core/command-context.js +81 -0
  25. package/dist/core/command-context.js.map +1 -0
  26. package/dist/core/index.js +7 -0
  27. package/dist/core/index.js.map +1 -0
  28. package/dist/core/password-manager.js +92 -0
  29. package/dist/core/password-manager.js.map +1 -0
  30. package/dist/core/types.js +2 -0
  31. package/dist/core/types.js.map +1 -0
  32. package/dist/index.js +440 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/interactive/completer.js +170 -0
  35. package/dist/interactive/completer.js.map +1 -0
  36. package/dist/interactive/event-buffer.js +186 -0
  37. package/dist/interactive/event-buffer.js.map +1 -0
  38. package/dist/interactive/index.js +9 -0
  39. package/dist/interactive/index.js.map +1 -0
  40. package/dist/interactive/session.js +525 -0
  41. package/dist/interactive/session.js.map +1 -0
  42. package/dist/interactive/shell-commands.js +167 -0
  43. package/dist/interactive/shell-commands.js.map +1 -0
  44. package/dist/interactive/shell-context.js +112 -0
  45. package/dist/interactive/shell-context.js.map +1 -0
  46. package/dist/lib/completion.js +375 -0
  47. package/dist/lib/completion.js.map +1 -0
  48. package/dist/lib/config.js +172 -0
  49. package/dist/lib/config.js.map +1 -0
  50. package/dist/lib/errors.js +163 -0
  51. package/dist/lib/errors.js.map +1 -0
  52. package/dist/lib/index.js +9 -0
  53. package/dist/lib/index.js.map +1 -0
  54. package/dist/lib/output.js +155 -0
  55. package/dist/lib/output.js.map +1 -0
  56. package/dist/lib/version.js +210 -0
  57. package/dist/lib/version.js.map +1 -0
  58. package/dist/ui.js +286 -0
  59. package/dist/ui.js.map +1 -0
  60. package/package.json +76 -0
package/dist/index.js ADDED
@@ -0,0 +1,440 @@
1
+ #!/usr/bin/env node
2
+ import 'dotenv/config';
3
+ import { Vultisig } from '@vultisig/sdk';
4
+ import chalk from 'chalk';
5
+ import { program } from 'commander';
6
+ import { CLIContext, withExit } from './adapters';
7
+ import { executeAddressBook, executeAddresses, executeBalance, executeChains, executeCreate, executeCurrency, executeExport, executeImport, executeInfo, executePortfolio, executeRename, executeSend, executeServer, executeSwap, executeSwapChains, executeSwapQuote, executeSwitch, executeTokens, executeVaults, executeVerify, } from './commands';
8
+ import { createPasswordCallback } from './core';
9
+ import { findChainByName } from './interactive';
10
+ import { ShellSession } from './interactive';
11
+ import { checkForUpdates, error, formatVersionDetailed, formatVersionShort, getUpdateCommand, handleCompletion, info, initOutputMode, printResult, setupCompletionCommand, warn, } from './lib';
12
+ import { setupVaultEvents } from './ui';
13
+ (async () => {
14
+ const handled = await handleCompletion();
15
+ if (handled)
16
+ process.exit(0);
17
+ })();
18
+ // ============================================================================
19
+ // Global State
20
+ // ============================================================================
21
+ let ctx;
22
+ // ============================================================================
23
+ // Program Configuration
24
+ // ============================================================================
25
+ program
26
+ .name('vultisig')
27
+ .description('Vultisig CLI - Secure multi-party crypto wallet')
28
+ .version(formatVersionShort(), '-v, --version', 'Show version')
29
+ .option('--debug', 'Enable debug output')
30
+ .option('--silent', 'Suppress informational output, show only results')
31
+ .option('-o, --output <format>', 'Output format: table, json (default: table)', 'table')
32
+ .option('-i, --interactive', 'Start interactive shell mode')
33
+ .option('--vault <nameOrId>', 'Specify vault by name or ID')
34
+ .hook('preAction', thisCommand => {
35
+ const opts = thisCommand.opts();
36
+ initOutputMode({ silent: opts.silent, output: opts.output });
37
+ });
38
+ // ============================================================================
39
+ // SDK Initialization
40
+ // ============================================================================
41
+ /**
42
+ * Find a vault by name or ID
43
+ * Tries exact ID match, then case-insensitive name match, then partial ID prefix match
44
+ */
45
+ async function findVaultByNameOrId(sdk, nameOrId) {
46
+ const vaults = await sdk.listVaults();
47
+ // Try exact ID match first
48
+ const byId = vaults.find(v => v.id === nameOrId);
49
+ if (byId)
50
+ return byId;
51
+ // Try name match (case-insensitive)
52
+ const byName = vaults.find(v => v.name.toLowerCase() === nameOrId.toLowerCase());
53
+ if (byName)
54
+ return byName;
55
+ // Try partial ID match (prefix)
56
+ const byPartialId = vaults.find(v => v.id.startsWith(nameOrId));
57
+ if (byPartialId)
58
+ return byPartialId;
59
+ return null;
60
+ }
61
+ async function init(vaultOverride) {
62
+ if (!ctx) {
63
+ const sdk = new Vultisig({
64
+ onPasswordRequired: createPasswordCallback(),
65
+ });
66
+ await sdk.initialize();
67
+ ctx = new CLIContext(sdk);
68
+ // Determine which vault to use (precedence: flag > env var > stored active)
69
+ const vaultSelector = vaultOverride || process.env.VULTISIG_VAULT;
70
+ let vault = null;
71
+ if (vaultSelector) {
72
+ vault = await findVaultByNameOrId(sdk, vaultSelector);
73
+ if (!vault) {
74
+ throw new Error(`Vault not found: "${vaultSelector}"`);
75
+ }
76
+ }
77
+ else {
78
+ vault = await sdk.getActiveVault();
79
+ }
80
+ if (vault) {
81
+ await ctx.setActiveVault(vault);
82
+ setupVaultEvents(vault);
83
+ }
84
+ }
85
+ return ctx;
86
+ }
87
+ // ============================================================================
88
+ // Commands
89
+ // ============================================================================
90
+ // Command: Create new vault
91
+ program
92
+ .command('create')
93
+ .description('Create a new vault')
94
+ .option('--type <type>', 'Vault type: fast or secure', 'fast')
95
+ .option('--name <name>', 'Vault name')
96
+ .option('--password <password>', 'Vault password')
97
+ .option('--email <email>', 'Email for verification (fast vault)')
98
+ .option('--code <code>', 'Verification code (if already received)')
99
+ .option('--threshold <m>', 'Signing threshold (secure vault)')
100
+ .option('--shares <n>', 'Total shares (secure vault)')
101
+ .action(withExit(async (options) => {
102
+ const context = await init(program.opts().vault);
103
+ await executeCreate(context, {
104
+ type: options.type,
105
+ name: options.name,
106
+ password: options.password,
107
+ email: options.email,
108
+ code: options.code,
109
+ threshold: options.threshold ? parseInt(options.threshold, 10) : undefined,
110
+ shares: options.shares ? parseInt(options.shares, 10) : undefined,
111
+ });
112
+ }));
113
+ // Command: Import vault from file
114
+ program
115
+ .command('import <file>')
116
+ .description('Import vault from .vult file')
117
+ .action(withExit(async (file) => {
118
+ const context = await init(program.opts().vault);
119
+ await executeImport(context, file);
120
+ }));
121
+ // Command: Verify vault with email code
122
+ program
123
+ .command('verify <vaultId>')
124
+ .description('Verify vault with email verification code')
125
+ .option('-r, --resend', 'Resend verification email')
126
+ .option('--code <code>', 'Verification code')
127
+ .action(withExit(async (vaultId, options) => {
128
+ const context = await init(program.opts().vault);
129
+ const verified = await executeVerify(context, vaultId, options);
130
+ if (!verified) {
131
+ const err = new Error('Verification failed');
132
+ err.exitCode = 1;
133
+ throw err;
134
+ }
135
+ }));
136
+ // Command: Show balances
137
+ program
138
+ .command('balance [chain]')
139
+ .description('Show balance for a chain or all chains')
140
+ .option('-t, --tokens', 'Include token balances')
141
+ .action(withExit(async (chainStr, options) => {
142
+ const context = await init(program.opts().vault);
143
+ await executeBalance(context, {
144
+ chain: chainStr ? findChainByName(chainStr) || chainStr : undefined,
145
+ includeTokens: options.tokens,
146
+ });
147
+ }));
148
+ // Command: Send transaction
149
+ program
150
+ .command('send <chain> <to> <amount>')
151
+ .description('Send tokens to an address')
152
+ .option('--token <tokenId>', 'Token to send (default: native)')
153
+ .option('--memo <memo>', 'Transaction memo')
154
+ .option('-y, --yes', 'Skip confirmation prompt')
155
+ .action(withExit(async (chainStr, to, amount, options) => {
156
+ const context = await init(program.opts().vault);
157
+ try {
158
+ await executeSend(context, {
159
+ chain: findChainByName(chainStr) || chainStr,
160
+ to,
161
+ amount,
162
+ tokenId: options.token,
163
+ memo: options.memo,
164
+ yes: options.yes,
165
+ });
166
+ }
167
+ catch (err) {
168
+ if (err.message === 'Transaction cancelled by user') {
169
+ warn('\nx Transaction cancelled');
170
+ return;
171
+ }
172
+ throw err;
173
+ }
174
+ }));
175
+ // Command: Show portfolio value
176
+ program
177
+ .command('portfolio')
178
+ .description('Show total portfolio value')
179
+ .option('-c, --currency <currency>', 'Fiat currency (usd, eur, gbp, etc.)', 'usd')
180
+ .action(withExit(async (options) => {
181
+ const context = await init(program.opts().vault);
182
+ await executePortfolio(context, { currency: options.currency.toLowerCase() });
183
+ }));
184
+ // Command: Manage currency
185
+ program
186
+ .command('currency [newCurrency]')
187
+ .description('View or set the vault currency preference')
188
+ .action(withExit(async (newCurrency) => {
189
+ const context = await init(program.opts().vault);
190
+ await executeCurrency(context, newCurrency);
191
+ }));
192
+ // Command: Server status
193
+ program
194
+ .command('server')
195
+ .description('Check server connectivity and status')
196
+ .action(withExit(async () => {
197
+ const context = await init(program.opts().vault);
198
+ await executeServer(context);
199
+ }));
200
+ // Command: Export vault
201
+ program
202
+ .command('export [path]')
203
+ .description('Export vault to file')
204
+ .option('--encrypt', 'Encrypt the export with a password')
205
+ .option('--no-encrypt', 'Export without encryption')
206
+ .option('--password <password>', 'Password for encryption')
207
+ .action(withExit(async (path, options) => {
208
+ const context = await init(program.opts().vault);
209
+ await executeExport(context, {
210
+ outputPath: path,
211
+ encrypt: options.encrypt,
212
+ password: options.password,
213
+ });
214
+ }));
215
+ // Command: Show addresses
216
+ program
217
+ .command('addresses')
218
+ .description('Show all vault addresses')
219
+ .action(withExit(async () => {
220
+ const context = await init(program.opts().vault);
221
+ await executeAddresses(context);
222
+ }));
223
+ // Command: Manage address book
224
+ program
225
+ .command('address-book')
226
+ .description('Manage address book entries')
227
+ .option('--add', 'Add a new address book entry')
228
+ .option('--remove <address>', 'Remove an address from the address book')
229
+ .option('--chain <chain>', 'Chain for the address (for --add or --remove)')
230
+ .option('--address <address>', 'Address to add (for --add)')
231
+ .option('--name <name>', 'Name/label for the address (for --add)')
232
+ .action(withExit(async (options) => {
233
+ const context = await init(program.opts().vault);
234
+ await executeAddressBook(context, {
235
+ add: options.add,
236
+ remove: options.remove,
237
+ chain: options.chain ? findChainByName(options.chain) || options.chain : undefined,
238
+ address: options.address,
239
+ name: options.name,
240
+ });
241
+ }));
242
+ // Command: Manage chains
243
+ program
244
+ .command('chains')
245
+ .description('List and manage chains')
246
+ .option('--add <chain>', 'Add a chain')
247
+ .option('--remove <chain>', 'Remove a chain')
248
+ .action(withExit(async (options) => {
249
+ const context = await init(program.opts().vault);
250
+ await executeChains(context, {
251
+ add: options.add ? findChainByName(options.add) || options.add : undefined,
252
+ remove: options.remove ? findChainByName(options.remove) || options.remove : undefined,
253
+ });
254
+ }));
255
+ // Command: List all vaults
256
+ program
257
+ .command('vaults')
258
+ .description('List all stored vaults')
259
+ .action(withExit(async () => {
260
+ const context = await init(program.opts().vault);
261
+ await executeVaults(context);
262
+ }));
263
+ // Command: Switch active vault
264
+ program
265
+ .command('switch <vaultId>')
266
+ .description('Switch to a different vault')
267
+ .action(withExit(async (vaultId) => {
268
+ const context = await init(program.opts().vault);
269
+ await executeSwitch(context, vaultId);
270
+ }));
271
+ // Command: Rename vault
272
+ program
273
+ .command('rename <newName>')
274
+ .description('Rename the active vault')
275
+ .action(withExit(async (newName) => {
276
+ const context = await init(program.opts().vault);
277
+ await executeRename(context, newName);
278
+ }));
279
+ // Command: Show vault info
280
+ program
281
+ .command('info')
282
+ .description('Show detailed vault information')
283
+ .action(withExit(async () => {
284
+ const context = await init(program.opts().vault);
285
+ await executeInfo(context);
286
+ }));
287
+ // Command: Manage tokens
288
+ program
289
+ .command('tokens <chain>')
290
+ .description('List and manage tokens for a chain')
291
+ .option('--add <contractAddress>', 'Add a token by contract address')
292
+ .option('--remove <tokenId>', 'Remove a token by ID')
293
+ .option('--symbol <symbol>', 'Token symbol (for --add)')
294
+ .option('--name <name>', 'Token name (for --add)')
295
+ .option('--decimals <decimals>', 'Token decimals (for --add)', '18')
296
+ .action(withExit(async (chainStr, options) => {
297
+ const context = await init(program.opts().vault);
298
+ await executeTokens(context, {
299
+ chain: findChainByName(chainStr) || chainStr,
300
+ add: options.add,
301
+ remove: options.remove,
302
+ symbol: options.symbol,
303
+ name: options.name,
304
+ decimals: options.decimals ? parseInt(options.decimals, 10) : undefined,
305
+ });
306
+ }));
307
+ // ============================================================================
308
+ // Swap Commands
309
+ // ============================================================================
310
+ // Command: List supported swap chains
311
+ program
312
+ .command('swap-chains')
313
+ .description('List chains that support swaps')
314
+ .action(withExit(async () => {
315
+ const context = await init(program.opts().vault);
316
+ await executeSwapChains(context);
317
+ }));
318
+ // Command: Get swap quote
319
+ program
320
+ .command('swap-quote <fromChain> <toChain> <amount>')
321
+ .description('Get a swap quote without executing')
322
+ .option('--from-token <address>', 'Token address to swap from (default: native)')
323
+ .option('--to-token <address>', 'Token address to swap to (default: native)')
324
+ .action(withExit(async (fromChainStr, toChainStr, amountStr, options) => {
325
+ const context = await init(program.opts().vault);
326
+ await executeSwapQuote(context, {
327
+ fromChain: findChainByName(fromChainStr) || fromChainStr,
328
+ toChain: findChainByName(toChainStr) || toChainStr,
329
+ amount: parseFloat(amountStr),
330
+ fromToken: options.fromToken,
331
+ toToken: options.toToken,
332
+ });
333
+ }));
334
+ // Command: Execute swap
335
+ program
336
+ .command('swap <fromChain> <toChain> <amount>')
337
+ .description('Swap tokens between chains')
338
+ .option('--from-token <address>', 'Token address to swap from (default: native)')
339
+ .option('--to-token <address>', 'Token address to swap to (default: native)')
340
+ .option('--slippage <percent>', 'Slippage tolerance in percent', '1')
341
+ .option('-y, --yes', 'Skip confirmation prompt')
342
+ .action(withExit(async (fromChainStr, toChainStr, amountStr, options) => {
343
+ const context = await init(program.opts().vault);
344
+ try {
345
+ await executeSwap(context, {
346
+ fromChain: findChainByName(fromChainStr) || fromChainStr,
347
+ toChain: findChainByName(toChainStr) || toChainStr,
348
+ amount: parseFloat(amountStr),
349
+ fromToken: options.fromToken,
350
+ toToken: options.toToken,
351
+ slippage: options.slippage ? parseFloat(options.slippage) : undefined,
352
+ yes: options.yes,
353
+ });
354
+ }
355
+ catch (err) {
356
+ if (err.message === 'Swap cancelled by user') {
357
+ warn('\nx Swap cancelled');
358
+ return;
359
+ }
360
+ throw err;
361
+ }
362
+ }));
363
+ // ============================================================================
364
+ // CLI Management Commands
365
+ // ============================================================================
366
+ // Command: Show detailed version
367
+ program
368
+ .command('version')
369
+ .description('Show detailed version information')
370
+ .action(withExit(async () => {
371
+ printResult(formatVersionDetailed());
372
+ // Check for updates
373
+ const result = await checkForUpdates();
374
+ if (result?.updateAvailable && result.latestVersion) {
375
+ info('');
376
+ info(chalk.yellow(`Update available: ${result.currentVersion} -> ${result.latestVersion}`));
377
+ info(chalk.gray(`Run "${getUpdateCommand()}" to update`));
378
+ }
379
+ }));
380
+ // Command: Check for updates
381
+ program
382
+ .command('update')
383
+ .description('Check for updates and show update command')
384
+ .option('--check', 'Just check for updates, do not update')
385
+ .action(withExit(async (options) => {
386
+ info('Checking for updates...');
387
+ const result = await checkForUpdates();
388
+ if (!result) {
389
+ printResult(chalk.gray('Update checking is disabled'));
390
+ return;
391
+ }
392
+ if (result.updateAvailable && result.latestVersion) {
393
+ printResult('');
394
+ printResult(chalk.green(`Update available: ${result.currentVersion} -> ${result.latestVersion}`));
395
+ printResult('');
396
+ if (options.check) {
397
+ printResult(`Run "${getUpdateCommand()}" to update`);
398
+ }
399
+ else {
400
+ const updateCmd = getUpdateCommand();
401
+ printResult(`To update, run:`);
402
+ printResult(chalk.cyan(` ${updateCmd}`));
403
+ }
404
+ }
405
+ else {
406
+ printResult(chalk.green(`You're on the latest version (${result.currentVersion})`));
407
+ }
408
+ }));
409
+ // Setup completion command
410
+ setupCompletionCommand(program);
411
+ // ============================================================================
412
+ // Interactive Mode
413
+ // ============================================================================
414
+ async function startInteractiveMode() {
415
+ const sdk = new Vultisig({
416
+ onPasswordRequired: createPasswordCallback(),
417
+ });
418
+ await sdk.initialize();
419
+ const session = new ShellSession(sdk);
420
+ await session.start();
421
+ }
422
+ // ============================================================================
423
+ // Cleanup & Entry Point
424
+ // ============================================================================
425
+ process.on('SIGINT', () => {
426
+ warn('\n\nShutting down...');
427
+ ctx?.dispose();
428
+ process.exit(0);
429
+ });
430
+ // Check for interactive mode before parsing commands
431
+ if (process.argv.includes('-i') || process.argv.includes('--interactive')) {
432
+ startInteractiveMode().catch(err => {
433
+ error(`Failed to start interactive mode: ${err.message}`);
434
+ process.exit(1);
435
+ });
436
+ }
437
+ else {
438
+ program.parse();
439
+ }
440
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ /**
2
+ * Tab Completion - Provides intelligent tab completion for the shell
3
+ */
4
+ import { Chain } from '@vultisig/sdk';
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ /**
8
+ * All available shell commands
9
+ */
10
+ const COMMANDS = [
11
+ // Vault management
12
+ 'vaults',
13
+ 'vault',
14
+ 'import',
15
+ 'create',
16
+ 'info',
17
+ 'export',
18
+ // Wallet operations
19
+ 'balance',
20
+ 'bal',
21
+ 'send',
22
+ 'portfolio',
23
+ 'addresses',
24
+ 'chains',
25
+ 'tokens',
26
+ // Swap operations
27
+ 'swap-chains',
28
+ 'swap-quote',
29
+ 'swap',
30
+ // Session commands (shell-only)
31
+ 'lock',
32
+ 'unlock',
33
+ 'status',
34
+ // Settings
35
+ 'currency',
36
+ 'server',
37
+ 'address-book',
38
+ // Help
39
+ 'help',
40
+ '?',
41
+ // REPL commands
42
+ '.help',
43
+ '.clear',
44
+ '.exit',
45
+ ];
46
+ /**
47
+ * Create a completer function for the REPL
48
+ */
49
+ export function createCompleter(ctx) {
50
+ return function completer(line) {
51
+ try {
52
+ const parts = line.split(/\s+/);
53
+ const command = parts[0]?.toLowerCase();
54
+ // File path completion for import/export
55
+ if ((command === 'import' || command === 'export') && parts.length > 1) {
56
+ const partial = parts.slice(1).join(' ');
57
+ return completeFilePath(partial, command === 'import');
58
+ }
59
+ // Vault name completion
60
+ if (command === 'vault' && parts.length > 1) {
61
+ const partial = parts.slice(1).join(' ');
62
+ return completeVaultName(ctx, partial);
63
+ }
64
+ // Chain completion for chains --add/--remove
65
+ if (command === 'chains' && parts.length >= 2) {
66
+ const flag = parts[parts.length - 2]?.toLowerCase();
67
+ if (flag === '--add' || flag === '--remove') {
68
+ const partial = parts[parts.length - 1] || '';
69
+ return completeChainName(partial);
70
+ }
71
+ if (parts[parts.length - 1]?.toLowerCase() === '--add' ||
72
+ parts[parts.length - 1]?.toLowerCase() === '--remove') {
73
+ return completeChainName('');
74
+ }
75
+ }
76
+ // Chain completion for balance, tokens, send, swap commands
77
+ if (['balance', 'bal', 'tokens', 'send', 'swap', 'swap-quote'].includes(command) && parts.length === 2) {
78
+ const partial = parts[1] || '';
79
+ return completeChainName(partial);
80
+ }
81
+ // Command completion
82
+ const hits = COMMANDS.filter(c => c.startsWith(line));
83
+ const show = hits.length ? hits : COMMANDS;
84
+ return [show, line];
85
+ }
86
+ catch {
87
+ return [[], line];
88
+ }
89
+ };
90
+ }
91
+ /**
92
+ * Complete file paths
93
+ */
94
+ function completeFilePath(partial, filterVult) {
95
+ try {
96
+ const endsWithSeparator = partial.endsWith('/') || partial.endsWith(path.sep);
97
+ let dir;
98
+ let basename;
99
+ if (endsWithSeparator) {
100
+ dir = partial;
101
+ basename = '';
102
+ }
103
+ else {
104
+ dir = path.dirname(partial);
105
+ basename = path.basename(partial);
106
+ if (fs.existsSync(partial) && fs.statSync(partial).isDirectory()) {
107
+ dir = partial;
108
+ basename = '';
109
+ }
110
+ }
111
+ const resolvedDir = path.resolve(dir);
112
+ if (!fs.existsSync(resolvedDir) || !fs.statSync(resolvedDir).isDirectory()) {
113
+ return [[], partial];
114
+ }
115
+ const files = fs.readdirSync(resolvedDir);
116
+ const matches = files
117
+ .filter((file) => file.startsWith(basename))
118
+ .map((file) => {
119
+ const fullPath = path.join(dir, file);
120
+ const stats = fs.statSync(path.join(resolvedDir, file));
121
+ if (stats.isDirectory()) {
122
+ return fullPath + '/';
123
+ }
124
+ if (filterVult) {
125
+ if (file.endsWith('.vult') || stats.isDirectory()) {
126
+ return fullPath;
127
+ }
128
+ return null;
129
+ }
130
+ return fullPath;
131
+ })
132
+ .filter((item) => item !== null);
133
+ return [matches, partial];
134
+ }
135
+ catch {
136
+ return [[], partial];
137
+ }
138
+ }
139
+ /**
140
+ * Complete vault names (case-insensitive)
141
+ */
142
+ function completeVaultName(ctx, partial) {
143
+ const vaultNames = Array.from(ctx.getVaults().values()).map(vault => vault.name);
144
+ const partialLower = partial.toLowerCase();
145
+ const matches = vaultNames.filter((name) => name.toLowerCase().startsWith(partialLower));
146
+ matches.sort();
147
+ const show = matches.length > 0 ? matches : vaultNames.sort();
148
+ return [show, partial];
149
+ }
150
+ /**
151
+ * Complete chain names (case-insensitive)
152
+ */
153
+ function completeChainName(partial) {
154
+ const allChains = Object.values(Chain);
155
+ const partialLower = partial.toLowerCase();
156
+ const matches = allChains.filter((chain) => chain.toLowerCase().startsWith(partialLower));
157
+ matches.sort();
158
+ const show = matches.length > 0 ? matches : allChains.sort();
159
+ return [show, partial];
160
+ }
161
+ /**
162
+ * Find a chain by name (case-insensitive)
163
+ */
164
+ export function findChainByName(name) {
165
+ const allChains = Object.values(Chain);
166
+ const nameLower = name.toLowerCase();
167
+ const found = allChains.find((chain) => chain.toLowerCase() === nameLower);
168
+ return found ? found : null;
169
+ }
170
+ //# sourceMappingURL=completer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completer.js","sourceRoot":"","sources":["../../src/interactive/completer.ts"],"names":[],"mappings":"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"}