@vultisig/client-shared 0.2.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,38 @@
1
+ # @vultisig/client-shared
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#204](https://github.com/vultisig/vultisig-sdk/pull/204) [`0388700`](https://github.com/vultisig/vultisig-sdk/commit/03887009b7579fc0b193d068d4a205cdd3b7c214) Thanks [@premiumjibles](https://github.com/premiumjibles)! - feat(cli): agent-friendly CLI + new @vultisig/mcp package
8
+
9
+ ## @vultisig/cli
10
+ - Auto-TTY JSON output (`--output`, `--ci`, `--quiet`, `--fields`, `--non-interactive`)
11
+ - Versioned `{ success, v: 1, data }` envelope and typed error envelope with exit codes 0-7
12
+ - Safety: fixed `swap`/`send`/`execute`/`rujira swap`/`rujira withdraw` auto-executing in JSON mode; `--yes` now required uniformly
13
+ - `--dry-run` coverage across all mutating commands
14
+ - `vsig schema` machine-readable command introspection
15
+ - Auth: replaced `keytar` with `@napi-rs/keyring`, encrypted-file fallback for headless environments (AES-256-GCM + async scrypt)
16
+
17
+ ## @vultisig/client-shared (new package)
18
+
19
+ Shared client infrastructure for `@vultisig/cli` and `@vultisig/mcp`: auth setup, config store, credential store (keyring + file fallback), tool descriptions, vault discovery.
20
+
21
+ ## @vultisig/sdk
22
+ - `VaultBase.send()` and `VaultBase.swap()` accept `amount: 'max'`
23
+ - `SwapService` rejects quotes with near-zero output to guard against bad provider routes
24
+ - `FiatValueService.fetchTokenPrice` returns `0` for non-EVM chains instead of throwing (effective behavior identical — `getPortfolioValue` already caught the throw)
25
+ - `ServerManager`: removed stdout `console.log` calls that corrupted JSON output; raised `waitForPeers` timeout from 30s to 120s and tightened poll interval from 2s to 500ms
26
+
27
+ ## @vultisig/core-chain
28
+ - Narrowed EVM broadcast retry list to strings that genuinely indicate "same tx already in mempool under this hash" (`already known`, `transaction already exists`, `tx already in mempool`). Dropped strings that can silently swallow real broadcast failures (`nonce too low`, `transaction is temporarily banned`, `future transaction tries to replace pending`, `could not replace existing tx`)
29
+
30
+ ## @vultisig/core-mpc
31
+ - `maxInboundWaitTime` raised from 1 to 3 minutes for flaky networks
32
+ - Added 100ms sleep in `processInbound` recursion to prevent hot-looping on empty inbound
33
+ - Setup message polling: same 10-second budget, polls 5× more often (50 × 200ms vs 10 × 1000ms)
34
+
35
+ ### Patch Changes
36
+
37
+ - Updated dependencies [[`0388700`](https://github.com/vultisig/vultisig-sdk/commit/03887009b7579fc0b193d068d4a205cdd3b7c214), [`83fe4c3`](https://github.com/vultisig/vultisig-sdk/commit/83fe4c3c58637aea4823d0eaa7f21d4c5cdf3dc7)]:
38
+ - @vultisig/sdk@0.16.0
@@ -0,0 +1,21 @@
1
+ type AuthSetupOpts = {
2
+ vaultFile?: string;
3
+ nonInteractive?: boolean;
4
+ };
5
+ export declare function executeAuthSetup(opts: AuthSetupOpts): Promise<{
6
+ vaultId: string;
7
+ vaultName: string;
8
+ storageBackend: 'keyring' | 'file';
9
+ }>;
10
+ export declare function executeAuthStatus(): Promise<Array<{
11
+ id: string;
12
+ name: string;
13
+ filePath: string;
14
+ hasCredentials: boolean;
15
+ }>>;
16
+ export declare function executeAuthLogout(opts: {
17
+ vaultId?: string;
18
+ all?: boolean;
19
+ }): Promise<void>;
20
+ export {};
21
+ //# sourceMappingURL=auth-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-setup.d.ts","sourceRoot":"","sources":["../src/auth-setup.ts"],"names":[],"mappings":"AAoBA,KAAK,aAAa,GAAG;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,CAAC,CA6JrF;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAChD,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,OAAO,CAAA;CAAE,CAAC,CAC/E,CAeA;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBhG"}
@@ -0,0 +1,199 @@
1
+ // Interactive auth setup — shared between CLI and MCP.
2
+ // Imports vault, prompts for passwords, stores credentials in keyring.
3
+ import * as fs from 'node:fs/promises';
4
+ import { dirname } from 'node:path';
5
+ import { Vultisig } from '@vultisig/sdk';
6
+ import inquirer from 'inquirer';
7
+ import { loadConfig, saveConfig } from './config-store.js';
8
+ import { clearCredentials, getStoredServerPassword, isUsingFileFallback, setDecryptionPassword, setFilePassphrase, setServerPassword, } from './credential-store.js';
9
+ import { discoverVaultFiles, SEARCH_DIRS } from './vault-discovery.js';
10
+ export async function executeAuthSetup(opts) {
11
+ let vaultFilePath = opts.vaultFile;
12
+ if (!vaultFilePath) {
13
+ const config = await loadConfig();
14
+ const extraDirs = config.vaults
15
+ .map(v => v.filePath)
16
+ .filter(Boolean)
17
+ .map(f => dirname(f));
18
+ const files = await discoverVaultFiles(extraDirs);
19
+ if (files.length === 0) {
20
+ const searched = [...SEARCH_DIRS, process.cwd()].join('\n - ');
21
+ throw new Error(`No .vult files found. Searched:\n - ${searched}\n\n` +
22
+ 'Export your vault from the Vultisig app and place the .vult file in one of these locations,\n' +
23
+ 'or specify the path directly: vsig auth setup --vault-file /path/to/vault.vult');
24
+ }
25
+ if (files.length === 1) {
26
+ vaultFilePath = files[0];
27
+ }
28
+ else if (!process.stdin.isTTY || opts.nonInteractive) {
29
+ throw new Error('Multiple vault files found but no TTY available. Use --vault-file <path> to specify which vault to use.');
30
+ }
31
+ else {
32
+ const { selected } = await inquirer.prompt([
33
+ { type: 'list', name: 'selected', message: 'Select a vault file:', choices: files },
34
+ ]);
35
+ vaultFilePath = selected;
36
+ }
37
+ }
38
+ if (!vaultFilePath)
39
+ throw new Error('No vault file selected');
40
+ const vaultContent = await fs.readFile(vaultFilePath, 'utf-8');
41
+ const sdk = new Vultisig({});
42
+ try {
43
+ const isEncrypted = sdk.isVaultEncrypted(vaultContent);
44
+ let vault;
45
+ let decryptPassword;
46
+ if (isEncrypted) {
47
+ const envDecryptPw = process.env.VAULT_DECRYPT_PASSWORD;
48
+ if (envDecryptPw) {
49
+ try {
50
+ vault = await sdk.importVault(vaultContent, envDecryptPw);
51
+ decryptPassword = envDecryptPw;
52
+ }
53
+ catch {
54
+ throw new Error('VAULT_DECRYPT_PASSWORD is set but failed to decrypt the vault. Check that the password is correct.');
55
+ }
56
+ }
57
+ else if (!process.stdin.isTTY || opts.nonInteractive) {
58
+ throw new Error('Vault is encrypted but no TTY available. Set VAULT_DECRYPT_PASSWORD env var for non-interactive usage.');
59
+ }
60
+ else {
61
+ const MAX_ATTEMPTS = 3;
62
+ for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {
63
+ const { password } = await inquirer.prompt([
64
+ {
65
+ type: 'password',
66
+ name: 'password',
67
+ message: attempt === 1
68
+ ? 'Enter vault file password (the password you chose when exporting/backing up from the Vultisig app):'
69
+ : `Wrong password. Try again (attempt ${attempt}/${MAX_ATTEMPTS}):`,
70
+ mask: '*',
71
+ },
72
+ ]);
73
+ try {
74
+ vault = await sdk.importVault(vaultContent, password);
75
+ decryptPassword = password;
76
+ break;
77
+ }
78
+ catch {
79
+ if (attempt === MAX_ATTEMPTS) {
80
+ throw new Error('Failed to decrypt vault after 3 attempts. Check your decryption password.');
81
+ }
82
+ }
83
+ }
84
+ }
85
+ }
86
+ else {
87
+ vault = await sdk.importVault(vaultContent, undefined);
88
+ }
89
+ if (!vault)
90
+ throw new Error('unreachable: vault must be set after decrypt loop');
91
+ const v = vault;
92
+ let serverPassword;
93
+ const envServerPw = process.env.VAULT_PASSWORD;
94
+ if (envServerPw) {
95
+ serverPassword = envServerPw;
96
+ }
97
+ else if (!process.stdin.isTTY || opts.nonInteractive) {
98
+ throw new Error('No TTY available for password prompt. Set VAULT_PASSWORD env var for non-interactive usage.');
99
+ }
100
+ else {
101
+ const response = await inquirer.prompt([
102
+ {
103
+ type: 'password',
104
+ name: 'serverPassword',
105
+ message: 'Enter VultiServer password (your server signing password, used for 2-of-2 MPC signing):',
106
+ mask: '*',
107
+ },
108
+ ]);
109
+ serverPassword = response.serverPassword;
110
+ }
111
+ try {
112
+ await setServerPassword(v.id, serverPassword);
113
+ if (isEncrypted && decryptPassword) {
114
+ await setDecryptionPassword(v.id, decryptPassword);
115
+ }
116
+ }
117
+ catch {
118
+ // Keyring unavailable — fall back to encrypted file
119
+ const envPassphrase = process.env.VULTISIG_CREDENTIALS_PASSPHRASE;
120
+ let passphrase;
121
+ if (envPassphrase) {
122
+ passphrase = envPassphrase;
123
+ }
124
+ else if (!process.stdin.isTTY || opts.nonInteractive) {
125
+ throw new Error('OS keyring unavailable and no TTY for passphrase prompt. Set VULTISIG_CREDENTIALS_PASSPHRASE env var.');
126
+ }
127
+ else {
128
+ const response = await inquirer.prompt([
129
+ {
130
+ type: 'password',
131
+ name: 'passphrase',
132
+ message: 'OS keyring unavailable. Enter a passphrase to encrypt credentials on disk (~/.vultisig/credentials.enc):',
133
+ mask: '*',
134
+ },
135
+ ]);
136
+ passphrase = response.passphrase;
137
+ }
138
+ setFilePassphrase(passphrase);
139
+ await setServerPassword(v.id, serverPassword);
140
+ if (isEncrypted && decryptPassword) {
141
+ await setDecryptionPassword(v.id, decryptPassword);
142
+ }
143
+ }
144
+ const config = await loadConfig();
145
+ const existing = config.vaults.findIndex(c => c.id === v.id);
146
+ const entry = { id: v.id, name: v.name, filePath: vaultFilePath };
147
+ if (existing >= 0) {
148
+ config.vaults[existing] = entry;
149
+ }
150
+ else {
151
+ config.vaults.push(entry);
152
+ }
153
+ await saveConfig(config);
154
+ return { vaultId: v.id, vaultName: v.name, storageBackend: isUsingFileFallback() ? 'file' : 'keyring' };
155
+ }
156
+ finally {
157
+ if (typeof sdk.dispose === 'function')
158
+ sdk.dispose();
159
+ }
160
+ }
161
+ export async function executeAuthStatus() {
162
+ const config = await loadConfig();
163
+ return Promise.all(config.vaults.map(async (vault) => {
164
+ let hasCredentials = false;
165
+ try {
166
+ const pw = await getStoredServerPassword(vault.id);
167
+ hasCredentials = pw !== null;
168
+ }
169
+ catch {
170
+ // no credentials
171
+ }
172
+ return { id: vault.id, name: vault.name, filePath: vault.filePath, hasCredentials };
173
+ }));
174
+ }
175
+ export async function executeAuthLogout(opts) {
176
+ const config = await loadConfig();
177
+ if (opts.all) {
178
+ for (const vault of config.vaults) {
179
+ await clearCredentials(vault.id);
180
+ }
181
+ config.vaults = [];
182
+ }
183
+ else if (opts.vaultId) {
184
+ await clearCredentials(opts.vaultId);
185
+ config.vaults = config.vaults.filter(v => v.id !== opts.vaultId);
186
+ }
187
+ else if (config.vaults.length === 1) {
188
+ await clearCredentials(config.vaults[0].id);
189
+ config.vaults = [];
190
+ }
191
+ else if (config.vaults.length > 1) {
192
+ throw new Error('Multiple vaults configured. Use --vault-id <id> or --all. Run: vsig auth status');
193
+ }
194
+ else {
195
+ throw new Error('No vaults configured. Run: vsig auth setup');
196
+ }
197
+ await saveConfig(config);
198
+ }
199
+ //# sourceMappingURL=auth-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-setup.js","sourceRoot":"","sources":["../src/auth-setup.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,uEAAuE;AAEvE,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAOtE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAmB;IAEnB,IAAI,aAAa,GAAG,IAAI,CAAC,SAAS,CAAA;IAElC,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QACjC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;aAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,SAAS,CAAC,CAAA;QAEjD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,CAAC,GAAG,WAAW,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAC/D,MAAM,IAAI,KAAK,CACb,wCAAwC,QAAQ,MAAM;gBACpD,+FAA+F;gBAC/F,gFAAgF,CACnF,CAAA;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACzC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,OAAO,EAAE,KAAK,EAAE;aACpF,CAAC,CAAA;YACF,aAAa,GAAG,QAAQ,CAAA;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,CAAC,aAAa;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAA;IAC7D,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;IAE9D,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC5B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,GAAG,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAA;QAEtD,IAAI,KAA8D,CAAA;QAClE,IAAI,eAAmC,CAAA;QAEvC,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAA;YACvD,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;oBACzD,eAAe,GAAG,YAAY,CAAA;gBAChC,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,IAAI,KAAK,CACb,oGAAoG,CACrG,CAAA;gBACH,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CACb,wGAAwG,CACzG,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,CAAC,CAAA;gBACtB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;oBACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;wBACzC;4BACE,IAAI,EAAE,UAAU;4BAChB,IAAI,EAAE,UAAU;4BAChB,OAAO,EACL,OAAO,KAAK,CAAC;gCACX,CAAC,CAAC,qGAAqG;gCACvG,CAAC,CAAC,sCAAsC,OAAO,IAAI,YAAY,IAAI;4BACvE,IAAI,EAAE,GAAG;yBACV;qBACF,CAAC,CAAA;oBACF,IAAI,CAAC;wBACH,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;wBACrD,eAAe,GAAG,QAAQ,CAAA;wBAC1B,MAAK;oBACP,CAAC;oBAAC,MAAM,CAAC;wBACP,IAAI,OAAO,KAAK,YAAY,EAAE,CAAC;4BAC7B,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;wBAC9F,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,YAAY,EAAE,SAAS,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAChF,MAAM,CAAC,GAAG,KAAK,CAAA;QAEf,IAAI,cAAsB,CAAA;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QAC9C,IAAI,WAAW,EAAE,CAAC;YAChB,cAAc,GAAG,WAAW,CAAA;QAC9B,CAAC;aAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,6FAA6F,CAAC,CAAA;QAChH,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBACrC;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,gBAAgB;oBACtB,OAAO,EAAE,yFAAyF;oBAClG,IAAI,EAAE,GAAG;iBACV;aACF,CAAC,CAAA;YACF,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAA;QAC1C,CAAC;QAED,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;YAC7C,IAAI,WAAW,IAAI,eAAe,EAAE,CAAC;gBACnC,MAAM,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;YACpD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAA;YACjE,IAAI,UAAkB,CAAA;YACtB,IAAI,aAAa,EAAE,CAAC;gBAClB,UAAU,GAAG,aAAa,CAAA;YAC5B,CAAC;iBAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CACb,uGAAuG,CACxG,CAAA;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;oBACrC;wBACE,IAAI,EAAE,UAAU;wBAChB,IAAI,EAAE,YAAY;wBAClB,OAAO,EACL,0GAA0G;wBAC5G,IAAI,EAAE,GAAG;qBACV;iBACF,CAAC,CAAA;gBACF,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAA;YAClC,CAAC;YACD,iBAAiB,CAAC,UAAU,CAAC,CAAA;YAC7B,MAAM,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;YAC7C,IAAI,WAAW,IAAI,eAAe,EAAE,CAAC;gBACnC,MAAM,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE,eAAe,CAAC,CAAA;YACpD,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;QACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;QAC5D,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAA;QACjE,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAA;QACjC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;QACD,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;QAExB,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAE,SAAmB,EAAE,CAAA;IACpH,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,UAAU;YAAE,GAAG,CAAC,OAAO,EAAE,CAAA;IACtD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB;IAGrC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAC,EAAE;QAC9B,IAAI,cAAc,GAAG,KAAK,CAAA;QAC1B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YAClD,cAAc,GAAG,EAAE,KAAK,IAAI,CAAA;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,iBAAiB;QACnB,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;IACrF,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAyC;IAC/E,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC;QACD,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;IACpB,CAAC;SAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,CAAA;IAClE,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,GAAG,EAAE,CAAA;IACpB,CAAC;SAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAA;IACpG,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;AAC1B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type VaultEntry = {
2
+ id: string;
3
+ name: string;
4
+ filePath: string;
5
+ };
6
+ export type VsigConfig = {
7
+ vaults: VaultEntry[];
8
+ };
9
+ export declare function loadConfig(): Promise<VsigConfig>;
10
+ export declare function saveConfig(config: VsigConfig): Promise<void>;
11
+ export declare function getConfigPath(): string;
12
+ //# sourceMappingURL=config-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,UAAU,EAAE,CAAA;CACrB,CAAA;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,UAAU,CAAC,CAOtD;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
@@ -0,0 +1,24 @@
1
+ // Auth vault registry — maps vault IDs to file paths for credential management.
2
+ // Chain/token persistence is handled by the SDK's vault.save() mechanism.
3
+ import * as fs from 'node:fs/promises';
4
+ import * as os from 'node:os';
5
+ import * as path from 'node:path';
6
+ const CONFIG_DIR = path.join(os.homedir(), '.vultisig');
7
+ const CONFIG_PATH = path.join(CONFIG_DIR, 'config.json');
8
+ export async function loadConfig() {
9
+ try {
10
+ const raw = await fs.readFile(CONFIG_PATH, 'utf-8');
11
+ return JSON.parse(raw);
12
+ }
13
+ catch {
14
+ return { vaults: [] };
15
+ }
16
+ }
17
+ export async function saveConfig(config) {
18
+ await fs.mkdir(CONFIG_DIR, { recursive: true });
19
+ await fs.writeFile(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf-8');
20
+ }
21
+ export function getConfigPath() {
22
+ return CONFIG_PATH;
23
+ }
24
+ //# sourceMappingURL=config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-store.js","sourceRoot":"","sources":["../src/config-store.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,0EAA0E;AAE1E,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAA;AACvD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAA;AAYxD,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAA;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;IACvB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAkB;IACjD,MAAM,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,WAAW,CAAA;AACpB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function _resetAll(): void;
2
+ export declare function setFilePassphrase(passphrase: string): void;
3
+ export declare function isUsingFileFallback(): boolean;
4
+ export declare function getServerPassword(vaultId: string): Promise<string | null>;
5
+ export declare function getStoredServerPassword(vaultId: string): Promise<string | null>;
6
+ export declare function getDecryptionPassword(vaultId: string): Promise<string | null>;
7
+ export declare function setServerPassword(vaultId: string, password: string): Promise<void>;
8
+ export declare function setDecryptionPassword(vaultId: string, password: string): Promise<void>;
9
+ export declare function clearCredentials(vaultId: string): Promise<void>;
10
+ //# sourceMappingURL=credential-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.d.ts","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"AAuBA,wBAAgB,SAAS,IAAI,IAAI,CAIhC;AAiFD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAG1D;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AA0DD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAI/E;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAErF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAInF;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGrE"}
@@ -0,0 +1,190 @@
1
+ // Credential store — OS keyring via @napi-rs/keyring with encrypted-file fallback
2
+ // Keyring: macOS Keychain, Windows Credential Vault, Linux Secret Service (libsecret)
3
+ // Fallback: AES-256-GCM encrypted file at ~/.vultisig/credentials.enc for Docker/CI/headless
4
+ import { createCipheriv, createDecipheriv, randomBytes, scrypt as scryptCb } from 'node:crypto';
5
+ import { promisify } from 'node:util';
6
+ const scryptAsync = promisify(scryptCb);
7
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
8
+ import { homedir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ const SERVICE_NAME = 'vultisig';
11
+ function getCredentialsPath() {
12
+ return join(process.env.VULTISIG_CONFIG_DIR || join(homedir(), '.vultisig'), 'credentials.enc');
13
+ }
14
+ // --- Keyring backend (lazy import to avoid crash when native module unavailable) ---
15
+ // Three states: undefined = not yet checked, false = unavailable, module ref = available
16
+ let _keyringModule;
17
+ export function _resetAll() {
18
+ _keyringModule = undefined;
19
+ useFileFallback = false;
20
+ filePassphrase = undefined;
21
+ }
22
+ async function getKeyringModule() {
23
+ if (_keyringModule === false)
24
+ return null;
25
+ if (_keyringModule)
26
+ return _keyringModule;
27
+ try {
28
+ _keyringModule = await import('@napi-rs/keyring');
29
+ return _keyringModule;
30
+ }
31
+ catch {
32
+ _keyringModule = false;
33
+ return null;
34
+ }
35
+ }
36
+ async function keyringGet(account) {
37
+ const mod = await getKeyringModule();
38
+ if (!mod)
39
+ return null;
40
+ try {
41
+ return new mod.Entry(SERVICE_NAME, account).getPassword();
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ async function keyringSet(account, password) {
48
+ const mod = await getKeyringModule();
49
+ if (!mod)
50
+ throw new Error('Keyring not available');
51
+ new mod.Entry(SERVICE_NAME, account).setPassword(password);
52
+ }
53
+ async function keyringDelete(account) {
54
+ const mod = await getKeyringModule();
55
+ if (!mod)
56
+ return;
57
+ try {
58
+ new mod.Entry(SERVICE_NAME, account).deletePassword();
59
+ }
60
+ catch {
61
+ // ignore if not found
62
+ }
63
+ }
64
+ // --- Encrypted file backend ---
65
+ async function getFileStore(passphrase) {
66
+ const path = getCredentialsPath();
67
+ let raw;
68
+ try {
69
+ raw = await readFile(path);
70
+ }
71
+ catch {
72
+ return new Map();
73
+ }
74
+ const salt = raw.subarray(0, 16);
75
+ const iv = raw.subarray(16, 28);
76
+ const tag = raw.subarray(28, 44);
77
+ const encrypted = raw.subarray(44);
78
+ const key = (await scryptAsync(passphrase, salt, 32));
79
+ const decipher = createDecipheriv('aes-256-gcm', key, iv);
80
+ decipher.setAuthTag(tag);
81
+ const decrypted = Buffer.concat([decipher.update(encrypted), decipher.final()]);
82
+ return new Map(Object.entries(JSON.parse(decrypted.toString('utf-8'))));
83
+ }
84
+ async function saveFileStore(store, passphrase) {
85
+ const dir = process.env.VULTISIG_CONFIG_DIR || join(homedir(), '.vultisig');
86
+ await mkdir(dir, { recursive: true });
87
+ const salt = randomBytes(16);
88
+ const iv = randomBytes(12);
89
+ const key = (await scryptAsync(passphrase, salt, 32));
90
+ const cipher = createCipheriv('aes-256-gcm', key, iv);
91
+ const data = JSON.stringify(Object.fromEntries(store));
92
+ const encrypted = Buffer.concat([cipher.update(data, 'utf-8'), cipher.final()]);
93
+ const tag = cipher.getAuthTag();
94
+ await writeFile(getCredentialsPath(), Buffer.concat([salt, iv, tag, encrypted]), { mode: 0o600 });
95
+ }
96
+ // --- Unified interface ---
97
+ let useFileFallback = false;
98
+ let filePassphrase = process.env.VULTISIG_CREDENTIALS_PASSPHRASE;
99
+ if (filePassphrase)
100
+ useFileFallback = true;
101
+ export function setFilePassphrase(passphrase) {
102
+ filePassphrase = passphrase;
103
+ useFileFallback = true;
104
+ }
105
+ export function isUsingFileFallback() {
106
+ return useFileFallback;
107
+ }
108
+ async function get(account) {
109
+ if (!useFileFallback) {
110
+ try {
111
+ const result = await keyringGet(account);
112
+ if (result !== null)
113
+ return result;
114
+ }
115
+ catch {
116
+ // keyring unavailable
117
+ }
118
+ }
119
+ if (filePassphrase) {
120
+ try {
121
+ return (await getFileStore(filePassphrase)).get(account) ?? null;
122
+ }
123
+ catch {
124
+ return null;
125
+ }
126
+ }
127
+ return null;
128
+ }
129
+ async function writeToFileStore(account, password) {
130
+ const store = await getFileStore(filePassphrase);
131
+ store.set(account, password);
132
+ await saveFileStore(store, filePassphrase);
133
+ }
134
+ async function set(account, password) {
135
+ if (useFileFallback && filePassphrase) {
136
+ await writeToFileStore(account, password);
137
+ return;
138
+ }
139
+ try {
140
+ await keyringSet(account, password);
141
+ }
142
+ catch {
143
+ if (filePassphrase) {
144
+ await writeToFileStore(account, password);
145
+ }
146
+ else {
147
+ throw new Error('Cannot store credentials: keyring unavailable and no file passphrase configured');
148
+ }
149
+ }
150
+ }
151
+ async function del(account) {
152
+ try {
153
+ await keyringDelete(account);
154
+ }
155
+ catch {
156
+ /* ignore */
157
+ }
158
+ if (filePassphrase) {
159
+ const store = await getFileStore(filePassphrase);
160
+ store.delete(account);
161
+ await saveFileStore(store, filePassphrase);
162
+ }
163
+ }
164
+ // --- Public API (unchanged signatures) ---
165
+ export async function getServerPassword(vaultId) {
166
+ const fromStore = await get(`${vaultId}/server`);
167
+ if (fromStore)
168
+ return fromStore;
169
+ return process.env.VAULT_PASSWORD || null;
170
+ }
171
+ export async function getStoredServerPassword(vaultId) {
172
+ return get(`${vaultId}/server`);
173
+ }
174
+ export async function getDecryptionPassword(vaultId) {
175
+ const fromStore = await get(`${vaultId}/decrypt`);
176
+ if (fromStore)
177
+ return fromStore;
178
+ return process.env.VAULT_DECRYPT_PASSWORD || null;
179
+ }
180
+ export async function setServerPassword(vaultId, password) {
181
+ await set(`${vaultId}/server`, password);
182
+ }
183
+ export async function setDecryptionPassword(vaultId, password) {
184
+ await set(`${vaultId}/decrypt`, password);
185
+ }
186
+ export async function clearCredentials(vaultId) {
187
+ await del(`${vaultId}/server`);
188
+ await del(`${vaultId}/decrypt`);
189
+ }
190
+ //# sourceMappingURL=credential-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-store.js","sourceRoot":"","sources":["../src/credential-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ export declare const balance: {
2
+ readonly description: "Show balance for a chain or all chains";
3
+ readonly params: {
4
+ readonly chain: "Filter by chain name (e.g. Ethereum, Bitcoin)";
5
+ readonly includeTokens: "Include ERC-20/SPL token balances";
6
+ };
7
+ };
8
+ export declare const portfolio: {
9
+ readonly description: "Show total portfolio value with fiat (USD) valuations";
10
+ readonly params: {
11
+ readonly chain: "Filter by chain name";
12
+ readonly currency: "Fiat currency (usd, eur, gbp, etc.)";
13
+ };
14
+ };
15
+ export declare const address: {
16
+ readonly description: "Show the wallet address for a specific chain";
17
+ readonly params: {
18
+ readonly chain: "Chain name (e.g. Ethereum, Bitcoin)";
19
+ };
20
+ };
21
+ export declare const vaultInfo: {
22
+ readonly description: "Show vault metadata — name, type, chains, and signer configuration. Call this first to discover available chains.";
23
+ readonly params: {};
24
+ };
25
+ export declare const supportedChains: {
26
+ readonly description: "List chains that support swaps (not all vault chains support swaps)";
27
+ readonly params: {};
28
+ };
29
+ export declare const swapQuote: {
30
+ readonly description: "Get a swap quote without executing — shows estimated output, fees, and provider";
31
+ readonly params: {
32
+ readonly from: "Source chain or chain:token (e.g. Ethereum or Ethereum:USDC)";
33
+ readonly to: "Destination chain or chain:token";
34
+ readonly amount: "Amount to swap in human-readable units (e.g. \"0.1\")";
35
+ };
36
+ };
37
+ export declare const swap: {
38
+ readonly description: "Swap tokens between chains. Previews by default — pass --confirm to execute.";
39
+ readonly params: {
40
+ readonly from: "Source chain or chain:token (e.g. Ethereum or Ethereum:USDC)";
41
+ readonly to: "Destination chain or chain:token";
42
+ readonly amount: "Amount to swap in human-readable units (e.g. \"0.1\")";
43
+ readonly confirmed: "Set true to execute. Omit or false for a dry-run preview.";
44
+ };
45
+ };
46
+ export declare const send: {
47
+ readonly description: "Send tokens to an address. Previews by default — pass --confirm to execute.";
48
+ readonly params: {
49
+ readonly chain: "Chain to send on (e.g. Ethereum)";
50
+ readonly to: "Recipient address";
51
+ readonly amount: "Amount to send in human-readable units, or \"max\" for full balance minus fees";
52
+ readonly token: "Token symbol for ERC-20/SPL tokens (omit for native token)";
53
+ readonly memo: "Transaction memo (non-EVM chains only)";
54
+ readonly confirmed: "Set true to execute. Omit or false for a dry-run preview.";
55
+ };
56
+ };
57
+ //# sourceMappingURL=descriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptions.d.ts","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,OAAO;;;;;;CAMV,CAAA;AAEV,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAA;AAEV,eAAO,MAAM,OAAO;;;;;CAKV,CAAA;AAEV,eAAO,MAAM,SAAS;;;CAGZ,CAAA;AAEV,eAAO,MAAM,eAAe;;;CAGlB,CAAA;AAEV,eAAO,MAAM,SAAS;;;;;;;CAOZ,CAAA;AAEV,eAAO,MAAM,IAAI;;;;;;;;CAQP,CAAA;AAEV,eAAO,MAAM,IAAI;;;;;;;;;;CAUP,CAAA"}
@@ -0,0 +1,59 @@
1
+ // Shared tool descriptions — single source of truth for CLI help text and MCP tool metadata.
2
+ // Both transports compose these at their call site; this file is just the copy.
3
+ export const balance = {
4
+ description: 'Show balance for a chain or all chains',
5
+ params: {
6
+ chain: 'Filter by chain name (e.g. Ethereum, Bitcoin)',
7
+ includeTokens: 'Include ERC-20/SPL token balances',
8
+ },
9
+ };
10
+ export const portfolio = {
11
+ description: 'Show total portfolio value with fiat (USD) valuations',
12
+ params: {
13
+ chain: 'Filter by chain name',
14
+ currency: 'Fiat currency (usd, eur, gbp, etc.)',
15
+ },
16
+ };
17
+ export const address = {
18
+ description: 'Show the wallet address for a specific chain',
19
+ params: {
20
+ chain: 'Chain name (e.g. Ethereum, Bitcoin)',
21
+ },
22
+ };
23
+ export const vaultInfo = {
24
+ description: 'Show vault metadata — name, type, chains, and signer configuration. Call this first to discover available chains.',
25
+ params: {},
26
+ };
27
+ export const supportedChains = {
28
+ description: 'List chains that support swaps (not all vault chains support swaps)',
29
+ params: {},
30
+ };
31
+ export const swapQuote = {
32
+ description: 'Get a swap quote without executing — shows estimated output, fees, and provider',
33
+ params: {
34
+ from: 'Source chain or chain:token (e.g. Ethereum or Ethereum:USDC)',
35
+ to: 'Destination chain or chain:token',
36
+ amount: 'Amount to swap in human-readable units (e.g. "0.1")',
37
+ },
38
+ };
39
+ export const swap = {
40
+ description: 'Swap tokens between chains. Previews by default — pass --confirm to execute.',
41
+ params: {
42
+ from: 'Source chain or chain:token (e.g. Ethereum or Ethereum:USDC)',
43
+ to: 'Destination chain or chain:token',
44
+ amount: 'Amount to swap in human-readable units (e.g. "0.1")',
45
+ confirmed: 'Set true to execute. Omit or false for a dry-run preview.',
46
+ },
47
+ };
48
+ export const send = {
49
+ description: 'Send tokens to an address. Previews by default — pass --confirm to execute.',
50
+ params: {
51
+ chain: 'Chain to send on (e.g. Ethereum)',
52
+ to: 'Recipient address',
53
+ amount: 'Amount to send in human-readable units, or "max" for full balance minus fees',
54
+ token: 'Token symbol for ERC-20/SPL tokens (omit for native token)',
55
+ memo: 'Transaction memo (non-EVM chains only)',
56
+ confirmed: 'Set true to execute. Omit or false for a dry-run preview.',
57
+ },
58
+ };
59
+ //# sourceMappingURL=descriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptions.js","sourceRoot":"","sources":["../src/descriptions.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,gFAAgF;AAEhF,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,WAAW,EAAE,wCAAwC;IACrD,MAAM,EAAE;QACN,KAAK,EAAE,+CAA+C;QACtD,aAAa,EAAE,mCAAmC;KACnD;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,EAAE,uDAAuD;IACpE,MAAM,EAAE;QACN,KAAK,EAAE,sBAAsB;QAC7B,QAAQ,EAAE,qCAAqC;KAChD;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,WAAW,EAAE,8CAA8C;IAC3D,MAAM,EAAE;QACN,KAAK,EAAE,qCAAqC;KAC7C;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,EAAE,mHAAmH;IAChI,MAAM,EAAE,EAAE;CACF,CAAA;AAEV,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,WAAW,EAAE,qEAAqE;IAClF,MAAM,EAAE,EAAE;CACF,CAAA;AAEV,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW,EAAE,iFAAiF;IAC9F,MAAM,EAAE;QACN,IAAI,EAAE,8DAA8D;QACpE,EAAE,EAAE,kCAAkC;QACtC,MAAM,EAAE,qDAAqD;KAC9D;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,WAAW,EAAE,8EAA8E;IAC3F,MAAM,EAAE;QACN,IAAI,EAAE,8DAA8D;QACpE,EAAE,EAAE,kCAAkC;QACtC,MAAM,EAAE,qDAAqD;QAC7D,SAAS,EAAE,2DAA2D;KACvE;CACO,CAAA;AAEV,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,WAAW,EAAE,6EAA6E;IAC1F,MAAM,EAAE;QACN,KAAK,EAAE,kCAAkC;QACzC,EAAE,EAAE,mBAAmB;QACvB,MAAM,EAAE,8EAA8E;QACtF,KAAK,EAAE,4DAA4D;QACnE,IAAI,EAAE,wCAAwC;QAC9C,SAAS,EAAE,2DAA2D;KACvE;CACO,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { executeAuthLogout, executeAuthSetup, executeAuthStatus } from './auth-setup.js';
2
+ export * as descriptions from './descriptions.js';
3
+ export { getConfigPath, loadConfig, saveConfig, type VaultEntry, type VsigConfig } from './config-store.js';
4
+ export { _resetAll, clearCredentials, getDecryptionPassword, getServerPassword, getStoredServerPassword, isUsingFileFallback, setDecryptionPassword, setFilePassphrase, setServerPassword, } from './credential-store.js';
5
+ export { discoverVaultFiles, SEARCH_DIRS } from './vault-discovery.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC3G,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { executeAuthLogout, executeAuthSetup, executeAuthStatus } from './auth-setup.js';
2
+ export * as descriptions from './descriptions.js';
3
+ export { getConfigPath, loadConfig, saveConfig } from './config-store.js';
4
+ export { _resetAll, clearCredentials, getDecryptionPassword, getServerPassword, getStoredServerPassword, isUsingFileFallback, setDecryptionPassword, setFilePassphrase, setServerPassword, } from './credential-store.js';
5
+ export { discoverVaultFiles, SEARCH_DIRS } from './vault-discovery.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxF,OAAO,KAAK,YAAY,MAAM,mBAAmB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAoC,MAAM,mBAAmB,CAAA;AAC3G,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const SEARCH_DIRS: string[];
2
+ export declare function discoverVaultFiles(extraDirs?: string[]): Promise<string[]>;
3
+ //# sourceMappingURL=vault-discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-discovery.d.ts","sourceRoot":"","sources":["../src/vault-discovery.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,WAAW,UAAiB,CAAA;AAEzC,wBAAsB,kBAAkB,CAAC,SAAS,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAcpF"}
@@ -0,0 +1,39 @@
1
+ import * as fs from 'node:fs/promises';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ // Directories scanned with depth 2 (dedicated vultisig locations)
5
+ const DEEP_DIRS = [path.join(os.homedir(), '.vultisig'), path.join(os.homedir(), 'Documents', 'Vultisig')];
6
+ export const SEARCH_DIRS = [...DEEP_DIRS];
7
+ export async function discoverVaultFiles(extraDirs = []) {
8
+ const found = [];
9
+ const allDirs = [...DEEP_DIRS, process.cwd(), ...extraDirs];
10
+ process.stderr.write(`Scanning for .vult files in: ${allDirs.join(', ')}\n`);
11
+ for (const dir of DEEP_DIRS) {
12
+ await scanDir(dir, found, 0, 2);
13
+ }
14
+ await scanDir(process.cwd(), found, 0, 1);
15
+ for (const dir of extraDirs) {
16
+ await scanDir(dir, found, 0, 2);
17
+ }
18
+ return [...new Set(found)];
19
+ }
20
+ async function scanDir(dir, found, depth, maxDepth) {
21
+ if (depth > maxDepth)
22
+ return;
23
+ try {
24
+ const entries = await fs.readdir(dir, { withFileTypes: true });
25
+ for (const entry of entries) {
26
+ const fullPath = path.join(dir, entry.name);
27
+ if (entry.isFile() && entry.name.endsWith('.vult')) {
28
+ found.push(fullPath);
29
+ }
30
+ else if (entry.isDirectory() && depth < maxDepth) {
31
+ await scanDir(fullPath, found, depth + 1, maxDepth);
32
+ }
33
+ }
34
+ }
35
+ catch {
36
+ // directory doesn't exist or not accessible
37
+ }
38
+ }
39
+ //# sourceMappingURL=vault-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-discovery.js","sourceRoot":"","sources":["../src/vault-discovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACtC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,kEAAkE;AAClE,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,CAAA;AAE1G,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,CAAA;AAEzC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,YAAsB,EAAE;IAC/D,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,SAAS,CAAC,CAAA;IAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAE5E,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACjC,CAAC;IACD,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AAC5B,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,KAAe,EAAE,KAAa,EAAE,QAAgB;IAClF,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAM;IAC5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;QAC9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACtB,CAAC;iBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;gBACnD,MAAM,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@vultisig/client-shared",
3
+ "version": "0.2.0",
4
+ "description": "Shared client infrastructure for Vultisig CLI and MCP — auth, config, tool descriptions",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/vultisig/vultisig-sdk.git",
9
+ "directory": "packages/client-shared"
10
+ },
11
+ "type": "module",
12
+ "sideEffects": false,
13
+ "main": "./dist/index.js",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.js",
19
+ "default": "./dist/index.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.build.json",
28
+ "clean": "rm -rf dist",
29
+ "prepack": "tsc -p tsconfig.build.json",
30
+ "typecheck": "tsc --noEmit"
31
+ },
32
+ "dependencies": {
33
+ "@napi-rs/keyring": "^1.1.6",
34
+ "@vultisig/sdk": "^0.16.0",
35
+ "inquirer": "^12.6.0"
36
+ },
37
+ "devDependencies": {
38
+ "@types/node": "^25.5.0",
39
+ "typescript": "^5.9.3"
40
+ },
41
+ "publishConfig": {
42
+ "access": "public",
43
+ "registry": "https://registry.npmjs.org/"
44
+ }
45
+ }