@guveno/cli 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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Guveno LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # Guveno CLI
2
+
3
+ `guveno` — a command-line tool for managing Guveno HD wallet groups and server resources. It wraps the [`@guveno/wallet-sdk`](https://www.npmjs.com/package/@guveno/wallet-sdk) package for all cryptography, local storage, and API access.
4
+
5
+ ## Install
6
+
7
+ Install the published package straight from npm:
8
+
9
+ ```bash
10
+ npm install -g @guveno/cli
11
+ guveno --help
12
+ ```
13
+
14
+ ### Local development
15
+
16
+ This package depends on `@guveno/wallet-sdk` (`^1.0.0`), resolved from
17
+ `node_modules`. The SDK lives alongside this package in the monorepo at
18
+ [`../sdk`](../sdk). To develop against the local copy, build and link it:
19
+
20
+ ```bash
21
+ # in ../sdk
22
+ npm install && npm run build && npm link
23
+
24
+ # in this directory
25
+ npm install && npm link @guveno/wallet-sdk
26
+ ```
27
+
28
+ Then build, lint, test, or run it directly:
29
+
30
+ ```bash
31
+ npm run build
32
+ npm run lint
33
+ npm test
34
+ npm run cli -- --help
35
+ ```
36
+
37
+ To use the `guveno` binary from a local build, `npm link` this package too.
38
+
39
+ ## Scripts
40
+
41
+ ```bash
42
+ npm run build # tsc -> dist
43
+ npm run lint # typecheck
44
+ npm test # vitest
45
+ ```
46
+
47
+ `build`, `lint`, and `test` all resolve `@guveno/wallet-sdk` from `node_modules`
48
+ (the published package, or a `npm link`ed local checkout).
49
+
50
+ ## Local wallet commands
51
+
52
+ ### Create a new wallet group
53
+
54
+ ```bash
55
+ guveno create-group treasury-btc --chain bitcoin --words 24 --label main
56
+ ```
57
+
58
+ To print the newly generated mnemonic once:
59
+
60
+ ```bash
61
+ guveno create-group primary --chain ethereum --reveal-mnemonic
62
+ ```
63
+
64
+ ### Import an existing mnemonic
65
+
66
+ ```bash
67
+ guveno import-group restored-xrp \
68
+ --chain xrp \
69
+ --mnemonic "test test test test test test test test test test test junk"
70
+ ```
71
+
72
+ Or from a file:
73
+
74
+ ```bash
75
+ guveno import-group restored-eth --chain ethereum --mnemonic-file ./mnemonic.txt
76
+ ```
77
+
78
+ ### Derive and inspect
79
+
80
+ ```bash
81
+ guveno show-first treasury-btc
82
+ guveno derive-address treasury-btc --label fees
83
+ guveno list-groups
84
+ guveno list-addresses treasury-btc
85
+ guveno rename-group treasury-btc treasury-btc-main
86
+ guveno label-address treasury-btc-main 1 --label cold-spend
87
+ guveno export-group treasury-btc-main --output ./exports/treasury-btc-main.json
88
+ ```
89
+
90
+ ### JSON output for automation
91
+
92
+ ```bash
93
+ guveno list-groups --json
94
+ ```
95
+
96
+ ## Auth and remote wallet commands
97
+
98
+ ```bash
99
+ guveno signup user@example.com
100
+ guveno login user@example.com
101
+ guveno whoami
102
+ guveno push-wallet treasury-btc-main
103
+ guveno list-remote-wallets
104
+ guveno get-remote-wallet <wallet-id>
105
+ guveno rename-remote-wallet <wallet-id> treasury-btc-archive
106
+ guveno delete-remote-wallet <wallet-id>
107
+ ```
108
+
109
+ ## Webhook commands
110
+
111
+ ```bash
112
+ # HTTP endpoint subscribed to all events (prints the signing secret once)
113
+ guveno create-webhook --type api --url https://example.com/hook --all-events
114
+
115
+ # Slack / Telegram, scoped to specific events
116
+ guveno create-webhook --type slack --slack-url https://hooks.slack.com/services/... \
117
+ --events deposit.confirmed,withdrawal.confirmed
118
+ guveno create-webhook --type telegram --bot-token <token> --chat-id <id> --all-events
119
+
120
+ guveno list-webhooks
121
+ guveno webhook-deliveries <webhook-id> --limit 50
122
+ guveno delete-webhook <webhook-id>
123
+ ```
124
+
125
+ Create/delete require an `owner` or `admin` role. All server commands accept `--json`, `--base-url`, `--token`, and `--token-env`.
126
+
127
+ ## Withdrawals (hot wallet)
128
+
129
+ `guveno withdraw` runs the full prepare → sign → broadcast loop for an automated hot wallet — no per-withdrawal human step. The transaction is signed **locally** (Ethereum/XRP); the server never sees the key. Authenticate with a `gv_live_...` API key whose role is `owner`, `admin`, `manager`, or `signer`.
130
+
131
+ ```bash
132
+ export GUVENO_API_KEY=gv_live_...
133
+
134
+ # Single-key hot wallet: read the mnemonic from a file
135
+ guveno withdraw --address-id 100 --asset-id 1 \
136
+ --to 0x70997970C51812dc3A010C7d01b50e0d17dc79C8 --amount 1.5 \
137
+ --mnemonic-file /run/secrets/hot.mnemonic \
138
+ --token-env GUVENO_API_KEY
139
+
140
+ # Multiple keys: a JSON file mapping keyFingerprint -> mnemonic
141
+ guveno withdraw --address-id 100 --asset-id 1 --to <address> --amount 1.5 \
142
+ --keys /run/secrets/keys.json --wallet-id 10 --token-env GUVENO_API_KEY
143
+ ```
144
+
145
+ Key source (exactly one): `--keys <path>` (JSON `{ "<keyFingerprint>": "<mnemonic>" }`), `--mnemonic`, or `--mnemonic-file`. Optional: `--destination-tag` (XRP), `--max-fee`/`--max-priority-fee`/`--gas-limit` (Ethereum, in wei/gas units), `--wallet-id` (skips scanning all wallets to resolve the address), and `--idempotency-key` (reused across prepare + broadcast for safe retries). KMS/HSM key unwrapping is available in the SDK (`KmsKeyProvider`) but not the CLI. The command returns once the withdrawal is `broadcast`; confirmation arrives via the chain workers / webhooks.
146
+
147
+ ## Security Notes
148
+
149
+ - The CLI never prints a generated mnemonic unless `--reveal-mnemonic` is passed explicitly.
150
+ - The CLI stores bearer-token session data in `auth-session.json`; treat that file as sensitive.
151
+ - `--mnemonic` and `--password` can leak through shell history; prefer `--mnemonic-file`, `--password-env`, or interactive prompts.
152
+ - All cryptography, client-side encryption, and key handling are performed by [`@guveno/wallet-sdk`](../sdk/docs/security.md).
package/dist/app.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { FileSystemConfigStore } from '@guveno/wallet-sdk';
2
+ type WritableLike = Pick<NodeJS.WriteStream, 'write'>;
3
+ export interface CliDependencies {
4
+ stdout?: WritableLike;
5
+ stderr?: WritableLike;
6
+ readSecret?: (message: string) => Promise<string>;
7
+ configStore?: FileSystemConfigStore;
8
+ /** Local config/cache directory (the `localStorage` equivalent). Used to build a config store when one isn't supplied. */
9
+ storageDir?: string;
10
+ fetchImpl?: typeof fetch;
11
+ }
12
+ export declare function runCli(argv: string[], dependencies?: CliDependencies): Promise<number>;
13
+ export {};
14
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,qBAAqB,EAUtB,MAAM,oBAAoB,CAAC;AAyB5B,KAAK,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAClD,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,0HAA0H;IAC1H,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAw0BD,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,GAAE,eAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BhG"}
package/dist/app.js ADDED
@@ -0,0 +1,649 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import { Command, CommanderError, InvalidArgumentError, Option } from 'commander';
3
+ import { AuthenticationError, DEFAULT_API_BASE_URL_ENV_VAR, DEFAULT_API_KEY_ENV_VAR, EncryptionSession, FileKeyProvider, FileSystemConfigStore, GuvenoApiClient, HotWallet, SUPPORTED_CHAINS, SUPPORTED_NETWORKS, ValidationError, WalletSdkError, WalletService, WEBHOOK_EVENT_TYPES, fingerprintMnemonic } from '@guveno/wallet-sdk';
4
+ import { formatApiUser, formatApiWalletAddress, formatApiWalletDetail, formatApiWalletSummary, formatApiWebhook, formatApiWebhookDelivery, formatApiWithdrawal } from './format.js';
5
+ import { promptForSecret } from './prompt.js';
6
+ const CLI_VERSION = '1.0.1';
7
+ const ENCRYPTION_PASSWORD_ENV = 'GUVENO_ENCRYPTION_PASSWORD';
8
+ function writeLine(stream, line = '') {
9
+ stream.write(`${line}\n`);
10
+ }
11
+ function printJson(stream, value) {
12
+ writeLine(stream, JSON.stringify(value, null, 2));
13
+ }
14
+ function envTrim(name) {
15
+ const value = process.env[name];
16
+ return value != null && value.trim().length > 0 ? value.trim() : undefined;
17
+ }
18
+ function readEnvValue(name, descriptor) {
19
+ const value = envTrim(name);
20
+ if (value == null) {
21
+ throw new ValidationError(`Environment variable "${name}" does not contain a ${descriptor}.`);
22
+ }
23
+ return value;
24
+ }
25
+ function normalizeProvided(value, source) {
26
+ if (value == null) {
27
+ return undefined;
28
+ }
29
+ if (value.trim().length === 0) {
30
+ throw new ValidationError(`${source} cannot be empty.`);
31
+ }
32
+ return value.trim();
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Option parsers
36
+ // ---------------------------------------------------------------------------
37
+ function parseMnemonicWordCount(value) {
38
+ const parsed = Number(value);
39
+ if (parsed !== 12 && parsed !== 24) {
40
+ throw new InvalidArgumentError('Word count must be either 12 or 24.');
41
+ }
42
+ return parsed;
43
+ }
44
+ function parseSupportedChain(value) {
45
+ const normalized = value.trim().toLowerCase();
46
+ if (!SUPPORTED_CHAINS.includes(normalized)) {
47
+ throw new InvalidArgumentError(`Chain must be one of: ${SUPPORTED_CHAINS.join(', ')}.`);
48
+ }
49
+ return normalized;
50
+ }
51
+ function parseSupportedNetwork(value) {
52
+ const normalized = value.trim().toLowerCase();
53
+ if (!SUPPORTED_NETWORKS.includes(normalized)) {
54
+ throw new InvalidArgumentError(`Network must be one of: ${SUPPORTED_NETWORKS.join(', ')}.`);
55
+ }
56
+ return normalized;
57
+ }
58
+ function positiveIntegerParser(flag) {
59
+ return (value) => {
60
+ const parsed = Number(value);
61
+ if (!Number.isInteger(parsed) || parsed < 1) {
62
+ throw new InvalidArgumentError(`${flag} must be a positive integer.`);
63
+ }
64
+ return parsed;
65
+ };
66
+ }
67
+ function nonNegativeIntegerParser(flag) {
68
+ return (value) => {
69
+ const parsed = Number(value);
70
+ if (!Number.isInteger(parsed) || parsed < 0) {
71
+ throw new InvalidArgumentError(`${flag} must be a non-negative integer.`);
72
+ }
73
+ return parsed;
74
+ };
75
+ }
76
+ // Gas fields are wei / gas units — large integers passed through verbatim to the signer.
77
+ function integerStringParser(flag) {
78
+ return (value) => {
79
+ if (!/^\d+$/.test(value.trim())) {
80
+ throw new InvalidArgumentError(`${flag} must be a non-negative integer (in wei or gas units).`);
81
+ }
82
+ return value.trim();
83
+ };
84
+ }
85
+ const WEBHOOK_TYPES = ['api', 'slack', 'telegram'];
86
+ function parseWebhookType(value) {
87
+ const normalized = value.trim().toLowerCase();
88
+ if (!WEBHOOK_TYPES.includes(normalized)) {
89
+ throw new InvalidArgumentError(`Webhook type must be one of: ${WEBHOOK_TYPES.join(', ')}.`);
90
+ }
91
+ return normalized;
92
+ }
93
+ function parseDeliveryLimit(value) {
94
+ const parsed = Number(value);
95
+ if (!Number.isInteger(parsed) || parsed < 1 || parsed > 100) {
96
+ throw new InvalidArgumentError('Limit must be an integer between 1 and 100.');
97
+ }
98
+ return parsed;
99
+ }
100
+ const parseWalletId = positiveIntegerParser('<wallet-id>');
101
+ /** Add the shared API-key + (hidden) base-URL options to a command. */
102
+ function authOptions(cmd) {
103
+ return cmd
104
+ .option('--api-key <key>', `Guveno API key (gv_live_...). Defaults to $${DEFAULT_API_KEY_ENV_VAR} or the saved config.`)
105
+ .option('--api-key-env <name>', 'Read the API key from an environment variable')
106
+ .addOption(new Option('--base-url <url>', 'Advanced: override the API base URL').hideHelp());
107
+ }
108
+ /** Add the shared encryption-password options to a command that unlocks the key. */
109
+ function encryptionOptions(cmd) {
110
+ return cmd
111
+ .option('--encryption-password <value>', 'Encryption password that unlocks your key (set during dashboard onboarding)')
112
+ .option('--encryption-password-env <name>', 'Read the encryption password from an environment variable');
113
+ }
114
+ function resolveApiKeyFromOptions(options) {
115
+ const direct = normalizeProvided(options.apiKey, '--api-key');
116
+ const fromEnv = options.apiKeyEnv != null ? readEnvValue(options.apiKeyEnv, 'API key') : undefined;
117
+ if (direct != null && fromEnv != null) {
118
+ throw new ValidationError('Use only one of --api-key or --api-key-env.');
119
+ }
120
+ return direct ?? fromEnv;
121
+ }
122
+ function resolveBaseUrlFromOptions(baseUrl) {
123
+ return normalizeProvided(baseUrl, '--base-url');
124
+ }
125
+ function resolveApiKey(options, config) {
126
+ const key = resolveApiKeyFromOptions(options) ?? envTrim(DEFAULT_API_KEY_ENV_VAR) ?? config.apiKey;
127
+ if (key == null) {
128
+ throw new AuthenticationError('No API key configured. Run `guveno init`, pass --api-key, or set $' + DEFAULT_API_KEY_ENV_VAR + '.');
129
+ }
130
+ return key;
131
+ }
132
+ function resolveBaseUrl(options, config) {
133
+ return resolveBaseUrlFromOptions(options.baseUrl) ?? envTrim(DEFAULT_API_BASE_URL_ENV_VAR) ?? config.baseUrl;
134
+ }
135
+ async function resolveClient(context, options) {
136
+ const config = (await context.configStore.read()) ?? {};
137
+ const apiKey = resolveApiKey(options, config);
138
+ const baseUrl = resolveBaseUrl(options, config);
139
+ return new GuvenoApiClient({
140
+ apiKey,
141
+ ...(baseUrl != null ? { baseUrl } : {}),
142
+ ...(context.fetchImpl != null ? { fetchImpl: context.fetchImpl } : {})
143
+ });
144
+ }
145
+ function resolveEncryptionPassword(options) {
146
+ const direct = normalizeProvided(options.encryptionPassword, '--encryption-password');
147
+ const fromEnv = options.encryptionPasswordEnv != null ? readEnvValue(options.encryptionPasswordEnv, 'encryption password') : undefined;
148
+ if (direct != null && fromEnv != null) {
149
+ throw new ValidationError('Use only one of --encryption-password or --encryption-password-env.');
150
+ }
151
+ return direct ?? fromEnv ?? envTrim(ENCRYPTION_PASSWORD_ENV);
152
+ }
153
+ async function unlockSession(context, client, options) {
154
+ const password = resolveEncryptionPassword(options) ??
155
+ normalizeProvided(await context.readSecret('Encryption password: '), 'Encryption password');
156
+ if (password == null) {
157
+ throw new ValidationError('An encryption password is required.');
158
+ }
159
+ return EncryptionSession.unlock(client, password);
160
+ }
161
+ async function resolveMnemonicInput(options) {
162
+ if (options.mnemonic && options.mnemonicFile) {
163
+ throw new ValidationError('Use either --mnemonic or --mnemonic-file, not both.');
164
+ }
165
+ if (options.mnemonic) {
166
+ return options.mnemonic;
167
+ }
168
+ if (options.mnemonicFile) {
169
+ return (await fs.readFile(options.mnemonicFile, 'utf8')).trim();
170
+ }
171
+ throw new ValidationError('Provide a mnemonic using --mnemonic or --mnemonic-file.');
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // Webhook helpers
175
+ // ---------------------------------------------------------------------------
176
+ function resolveWebhookEvents(options) {
177
+ if (options.allEvents) {
178
+ return ['*'];
179
+ }
180
+ const events = (options.events ?? '')
181
+ .split(',')
182
+ .map((event) => event.trim())
183
+ .filter((event) => event.length > 0);
184
+ if (events.length === 0) {
185
+ throw new ValidationError(`Provide --events (comma-separated from: ${WEBHOOK_EVENT_TYPES.join(', ')}) or --all-events.`);
186
+ }
187
+ return events;
188
+ }
189
+ function resolveWebhookConfig(type, options) {
190
+ if (type === 'api') {
191
+ if (!options.url)
192
+ throw new ValidationError('--url is required for an api webhook.');
193
+ return { url: options.url };
194
+ }
195
+ if (type === 'slack') {
196
+ if (!options.slackUrl)
197
+ throw new ValidationError('--slack-url is required for a slack webhook.');
198
+ return { webhookUrl: options.slackUrl };
199
+ }
200
+ if (!options.botToken || !options.chatId) {
201
+ throw new ValidationError('--bot-token and --chat-id are required for a telegram webhook.');
202
+ }
203
+ return { botToken: options.botToken, chatId: options.chatId };
204
+ }
205
+ // Optional explicit key source for the hot wallet. When omitted, the CLI sources
206
+ // the secret from the server via the encryption session (the default).
207
+ async function resolveOptionalKeyProvider(options) {
208
+ const configured = [options.keys, options.mnemonic, options.mnemonicFile].filter((value) => value != null);
209
+ if (configured.length === 0) {
210
+ return undefined;
211
+ }
212
+ if (configured.length > 1) {
213
+ throw new ValidationError('Use only one of --keys, --mnemonic, or --mnemonic-file.');
214
+ }
215
+ if (options.keys != null) {
216
+ return new FileKeyProvider(options.keys);
217
+ }
218
+ const mnemonic = options.mnemonic ?? (await fs.readFile(options.mnemonicFile, 'utf8')).trim();
219
+ return new FileKeyProvider({ [fingerprintMnemonic(mnemonic)]: mnemonic });
220
+ }
221
+ function buildGasOverrides(options) {
222
+ const gas = {
223
+ ...(options.maxFee != null ? { maxFeePerGas: options.maxFee } : {}),
224
+ ...(options.maxPriorityFee != null ? { maxPriorityFeePerGas: options.maxPriorityFee } : {}),
225
+ ...(options.gasLimit != null ? { gasLimit: options.gasLimit } : {})
226
+ };
227
+ return Object.keys(gas).length > 0 ? gas : undefined;
228
+ }
229
+ // ---------------------------------------------------------------------------
230
+ // CLI
231
+ // ---------------------------------------------------------------------------
232
+ function buildCli(context) {
233
+ const program = new Command();
234
+ program
235
+ .name('guveno')
236
+ .description('Manage Guveno custody wallets from your terminal. Authenticate with an API key (guveno init); wallets and addresses live on the server.')
237
+ .version(CLI_VERSION)
238
+ .showHelpAfterError()
239
+ .configureOutput({
240
+ writeOut: (chunk) => context.stdout.write(chunk),
241
+ writeErr: (chunk) => context.stderr.write(chunk)
242
+ })
243
+ .exitOverride();
244
+ // --- Auth / config ---
245
+ authOptions(program
246
+ .command('init')
247
+ .description('Save your API key so the CLI can talk to Guveno. Generate a key in the dashboard under API keys.')
248
+ .option('--json', 'Emit JSON output')).action(async (options) => {
249
+ const apiKey = resolveApiKeyFromOptions(options) ??
250
+ envTrim(DEFAULT_API_KEY_ENV_VAR) ??
251
+ normalizeProvided(await context.readSecret('Enter your Guveno API key (gv_live_...): '), 'API key');
252
+ if (apiKey == null) {
253
+ throw new ValidationError('An API key is required.');
254
+ }
255
+ const baseUrl = resolveBaseUrlFromOptions(options.baseUrl);
256
+ // Validate the key against the server before persisting it.
257
+ const client = new GuvenoApiClient({
258
+ apiKey,
259
+ ...(baseUrl != null ? { baseUrl } : {}),
260
+ ...(context.fetchImpl != null ? { fetchImpl: context.fetchImpl } : {})
261
+ });
262
+ const user = await client.getCurrentUser();
263
+ await context.configStore.update({ apiKey, ...(baseUrl != null ? { baseUrl } : {}) });
264
+ if (options.json) {
265
+ printJson(context.stdout, { action: 'init', user, baseUrl: client.baseUrl });
266
+ return;
267
+ }
268
+ writeLine(context.stdout, `Saved API key for ${user.email} (${client.baseUrl}).`);
269
+ if (user.encryptionKey == null) {
270
+ writeLine(context.stdout, 'Note: this account has no encryption key yet. Set one up in the dashboard before creating or signing wallets.');
271
+ }
272
+ });
273
+ authOptions(program
274
+ .command('whoami')
275
+ .description('Show the account the configured API key belongs to.')
276
+ .option('--json', 'Emit JSON output')).action(async (options) => {
277
+ const client = await resolveClient(context, options);
278
+ const user = await client.getCurrentUser();
279
+ if (options.json) {
280
+ printJson(context.stdout, { user, baseUrl: client.baseUrl });
281
+ return;
282
+ }
283
+ writeLine(context.stdout, formatApiUser(user, client.baseUrl));
284
+ });
285
+ program
286
+ .command('logout')
287
+ .description('Clear the saved API key and base URL from local config.')
288
+ .action(async () => {
289
+ await context.configStore.clear();
290
+ writeLine(context.stdout, 'Cleared the saved Guveno config.');
291
+ });
292
+ // --- Wallets (server-backed) ---
293
+ authOptions(encryptionOptions(program
294
+ .command('create-wallet')
295
+ .alias('create')
296
+ .description('Create a new wallet on the server from a freshly generated recovery phrase.')
297
+ .argument('<name>', 'Wallet name')
298
+ .option('-c, --chain <chain>', `Chain: ${SUPPORTED_CHAINS.join(', ')}`, parseSupportedChain, 'ethereum')
299
+ .option('-n, --network <network>', `Network: ${SUPPORTED_NETWORKS.join(', ')}`, parseSupportedNetwork, 'mainnet')
300
+ .option('-w, --words <count>', 'Recovery phrase length: 12 or 24', parseMnemonicWordCount, 12)
301
+ .option('-l, --label <label>', 'Label for the first derived address')
302
+ .option('--json', 'Emit JSON output'))).action(async (name, options) => {
303
+ const client = await resolveClient(context, options);
304
+ const session = await unlockSession(context, client, options);
305
+ const wallets = new WalletService({ api: client, session });
306
+ const created = await wallets.createWallet({
307
+ name,
308
+ chain: options.chain,
309
+ network: options.network,
310
+ words: options.words,
311
+ ...(options.label != null ? { label: options.label } : {})
312
+ });
313
+ session.lock();
314
+ if (options.json) {
315
+ printJson(context.stdout, { action: 'create-wallet', ...created });
316
+ return;
317
+ }
318
+ writeLine(context.stdout, `Created wallet "${created.wallet.name}" (${created.wallet.id}) on ${client.baseUrl}.`);
319
+ writeLine(context.stdout, `Chain: ${created.wallet.chain} (${created.wallet.network})`);
320
+ writeLine(context.stdout, `First address: ${created.firstAddress.address}`);
321
+ writeLine(context.stdout, '');
322
+ writeLine(context.stdout, 'Back up this recovery phrase now — it is the key to your funds:');
323
+ writeLine(context.stdout, created.mnemonic);
324
+ });
325
+ authOptions(encryptionOptions(program
326
+ .command('import-wallet')
327
+ .alias('import')
328
+ .description('Import an existing recovery phrase as a new server-side wallet.')
329
+ .argument('<name>', 'Wallet name')
330
+ .option('-c, --chain <chain>', `Chain: ${SUPPORTED_CHAINS.join(', ')}`, parseSupportedChain, 'ethereum')
331
+ .option('-n, --network <network>', `Network: ${SUPPORTED_NETWORKS.join(', ')}`, parseSupportedNetwork, 'mainnet')
332
+ .option('--mnemonic <phrase>', 'Recovery phrase to import')
333
+ .option('--mnemonic-file <path>', 'Read the recovery phrase from a file')
334
+ .option('-l, --label <label>', 'Label for the first derived address')
335
+ .option('--json', 'Emit JSON output'))).action(async (name, options) => {
336
+ const mnemonic = await resolveMnemonicInput(options);
337
+ const client = await resolveClient(context, options);
338
+ const session = await unlockSession(context, client, options);
339
+ const wallets = new WalletService({ api: client, session });
340
+ const wallet = await wallets.importWallet({
341
+ name,
342
+ chain: options.chain,
343
+ network: options.network,
344
+ mnemonic,
345
+ ...(options.label != null ? { label: options.label } : {})
346
+ });
347
+ session.lock();
348
+ if (options.json) {
349
+ printJson(context.stdout, { action: 'import-wallet', wallet });
350
+ return;
351
+ }
352
+ writeLine(context.stdout, `Imported wallet "${wallet.name}" (${wallet.id}).`);
353
+ writeLine(context.stdout, formatApiWalletDetail(wallet));
354
+ });
355
+ authOptions(program
356
+ .command('list-wallets')
357
+ .alias('wallets')
358
+ .description('List wallets stored on the server.')
359
+ .option('--json', 'Emit JSON output')).action(async (options) => {
360
+ const client = await resolveClient(context, options);
361
+ const wallets = await client.listWalletRecords();
362
+ if (options.json) {
363
+ printJson(context.stdout, { action: 'list-wallets', wallets });
364
+ return;
365
+ }
366
+ if (wallets.length === 0) {
367
+ writeLine(context.stdout, 'No wallets found.');
368
+ return;
369
+ }
370
+ wallets.forEach((wallet, index) => {
371
+ if (index > 0)
372
+ writeLine(context.stdout);
373
+ writeLine(context.stdout, formatApiWalletSummary(wallet));
374
+ });
375
+ });
376
+ authOptions(program
377
+ .command('get-wallet')
378
+ .description('Fetch a wallet by id.')
379
+ .argument('<wallet-id>', 'Wallet id', parseWalletId)
380
+ .option('--json', 'Emit JSON output')).action(async (walletId, options) => {
381
+ const client = await resolveClient(context, options);
382
+ const wallet = await client.getWalletRecord(walletId);
383
+ if (options.json) {
384
+ printJson(context.stdout, { action: 'get-wallet', wallet });
385
+ return;
386
+ }
387
+ writeLine(context.stdout, formatApiWalletDetail(wallet));
388
+ });
389
+ authOptions(encryptionOptions(program
390
+ .command('derive-address')
391
+ .alias('derive')
392
+ .description('Derive and register the next address for a wallet (uses the server index).')
393
+ .argument('<wallet-id>', 'Wallet id', parseWalletId)
394
+ .option('-l, --label <label>', 'Label for the new address')
395
+ .option('--json', 'Emit JSON output'))).action(async (walletId, options) => {
396
+ const client = await resolveClient(context, options);
397
+ const session = await unlockSession(context, client, options);
398
+ const wallets = new WalletService({ api: client, session });
399
+ const result = await wallets.deriveAddress(walletId, { ...(options.label != null ? { label: options.label } : {}) });
400
+ session.lock();
401
+ if (options.json) {
402
+ printJson(context.stdout, { action: 'derive-address', walletId, ...result });
403
+ return;
404
+ }
405
+ writeLine(context.stdout, `Derived ${result.wallet.chain} address ${result.address.address} at index ${result.address.accountIndex}.`);
406
+ writeLine(context.stdout, `Derivation path: ${result.address.derivationPath}`);
407
+ });
408
+ authOptions(program
409
+ .command('list-addresses')
410
+ .alias('addresses')
411
+ .description('List the addresses registered for a wallet.')
412
+ .argument('<wallet-id>', 'Wallet id', parseWalletId)
413
+ .option('--json', 'Emit JSON output')).action(async (walletId, options) => {
414
+ const client = await resolveClient(context, options);
415
+ const items = [];
416
+ let cursor;
417
+ do {
418
+ const page = await client.listWalletAddresses(walletId, cursor != null ? { cursor } : {});
419
+ items.push(...page.items);
420
+ cursor = page.pageInfo.hasNextPage ? page.pageInfo.nextCursor ?? undefined : undefined;
421
+ } while (cursor != null);
422
+ if (options.json) {
423
+ printJson(context.stdout, { action: 'list-addresses', walletId, addresses: items });
424
+ return;
425
+ }
426
+ if (items.length === 0) {
427
+ writeLine(context.stdout, 'No addresses found for this wallet.');
428
+ return;
429
+ }
430
+ items.forEach((address, index) => {
431
+ if (index > 0)
432
+ writeLine(context.stdout);
433
+ writeLine(context.stdout, formatApiWalletAddress(address));
434
+ });
435
+ });
436
+ authOptions(program
437
+ .command('rename-wallet')
438
+ .alias('rename')
439
+ .description('Rename a wallet.')
440
+ .argument('<wallet-id>', 'Wallet id', parseWalletId)
441
+ .argument('<new-name>', 'New wallet name')
442
+ .option('--json', 'Emit JSON output')).action(async (walletId, newName, options) => {
443
+ const client = await resolveClient(context, options);
444
+ const wallet = await client.updateWalletRecord(walletId, { name: newName });
445
+ if (options.json) {
446
+ printJson(context.stdout, { action: 'rename-wallet', wallet });
447
+ return;
448
+ }
449
+ writeLine(context.stdout, `Renamed wallet to "${wallet.name}".`);
450
+ writeLine(context.stdout, formatApiWalletSummary(wallet));
451
+ });
452
+ authOptions(program
453
+ .command('delete-wallet')
454
+ .alias('delete')
455
+ .description('Delete (archive) a wallet. The wallet must hold no balance.')
456
+ .argument('<wallet-id>', 'Wallet id', parseWalletId)
457
+ .option('--json', 'Emit JSON output')).action(async (walletId, options) => {
458
+ const client = await resolveClient(context, options);
459
+ await client.deleteWalletRecord(walletId);
460
+ if (options.json) {
461
+ printJson(context.stdout, { action: 'delete-wallet', walletId });
462
+ return;
463
+ }
464
+ writeLine(context.stdout, `Deleted wallet ${walletId}.`);
465
+ });
466
+ authOptions(encryptionOptions(program
467
+ .command('reveal-mnemonic')
468
+ .description('Fetch and decrypt a wallet’s recovery phrase from the server (audited).')
469
+ .argument('<wallet-id>', 'Wallet id', parseWalletId)
470
+ .option('--json', 'Emit JSON output'))).action(async (walletId, options) => {
471
+ const client = await resolveClient(context, options);
472
+ const session = await unlockSession(context, client, options);
473
+ const wallets = new WalletService({ api: client, session });
474
+ const mnemonic = await wallets.revealMnemonic(walletId);
475
+ session.lock();
476
+ if (options.json) {
477
+ printJson(context.stdout, { action: 'reveal-mnemonic', walletId, mnemonic });
478
+ return;
479
+ }
480
+ writeLine(context.stdout, mnemonic);
481
+ });
482
+ // --- Webhooks ---
483
+ authOptions(program
484
+ .command('create-webhook')
485
+ .description('Subscribe the company to deposit/withdrawal events via an HTTP endpoint, Slack, or Telegram.')
486
+ .requiredOption('--type <type>', `Webhook type (${WEBHOOK_TYPES.join(', ')})`, parseWebhookType)
487
+ .option('--url <url>', 'HTTP endpoint URL (type=api)')
488
+ .option('--slack-url <url>', 'Slack incoming webhook URL (type=slack)')
489
+ .option('--bot-token <token>', 'Telegram bot token (type=telegram)')
490
+ .option('--chat-id <id>', 'Telegram chat id (type=telegram)')
491
+ .option('--events <list>', `Comma-separated event types (${WEBHOOK_EVENT_TYPES.join(', ')})`)
492
+ .option('--all-events', 'Subscribe to all event types')
493
+ .option('--disabled', 'Create the webhook in a disabled state')
494
+ .option('--json', 'Emit JSON output')).action(async (options) => {
495
+ const input = {
496
+ type: options.type,
497
+ config: resolveWebhookConfig(options.type, options),
498
+ events: resolveWebhookEvents(options),
499
+ ...(options.disabled ? { enabled: false } : {})
500
+ };
501
+ const client = await resolveClient(context, options);
502
+ const webhook = await client.createWebhook(input);
503
+ if (options.json) {
504
+ printJson(context.stdout, { action: 'create-webhook', webhook });
505
+ return;
506
+ }
507
+ writeLine(context.stdout, formatApiWebhook(webhook));
508
+ writeLine(context.stdout);
509
+ writeLine(context.stdout, `Signing secret (shown only once): ${webhook.signingSecret}`);
510
+ });
511
+ authOptions(program
512
+ .command('list-webhooks')
513
+ .description('List the company webhooks configured on the server.')
514
+ .option('--json', 'Emit JSON output')).action(async (options) => {
515
+ const client = await resolveClient(context, options);
516
+ const webhooks = await client.listWebhooks();
517
+ if (options.json) {
518
+ printJson(context.stdout, { action: 'list-webhooks', webhooks });
519
+ return;
520
+ }
521
+ if (webhooks.length === 0) {
522
+ writeLine(context.stdout, 'No webhooks configured.');
523
+ return;
524
+ }
525
+ webhooks.forEach((webhook, index) => {
526
+ if (index > 0)
527
+ writeLine(context.stdout);
528
+ writeLine(context.stdout, formatApiWebhook(webhook));
529
+ });
530
+ });
531
+ authOptions(program
532
+ .command('webhook-deliveries')
533
+ .description('Show recent delivery logs for a webhook.')
534
+ .argument('<webhook-id>', 'Webhook id')
535
+ .option('--limit <count>', 'Maximum number of deliveries to return (1-100)', parseDeliveryLimit)
536
+ .option('--json', 'Emit JSON output')).action(async (webhookId, options) => {
537
+ const client = await resolveClient(context, options);
538
+ const deliveries = await client.listWebhookDeliveries(webhookId, {
539
+ ...(options.limit !== undefined ? { limit: options.limit } : {})
540
+ });
541
+ if (options.json) {
542
+ printJson(context.stdout, { action: 'webhook-deliveries', webhookId, deliveries });
543
+ return;
544
+ }
545
+ if (deliveries.length === 0) {
546
+ writeLine(context.stdout, 'No deliveries found for this webhook.');
547
+ return;
548
+ }
549
+ deliveries.forEach((delivery, index) => {
550
+ if (index > 0)
551
+ writeLine(context.stdout);
552
+ writeLine(context.stdout, formatApiWebhookDelivery(delivery));
553
+ });
554
+ });
555
+ authOptions(program
556
+ .command('delete-webhook')
557
+ .description('Delete a company webhook.')
558
+ .argument('<webhook-id>', 'Webhook id')
559
+ .option('--json', 'Emit JSON output')).action(async (webhookId, options) => {
560
+ const client = await resolveClient(context, options);
561
+ await client.deleteWebhook(webhookId);
562
+ if (options.json) {
563
+ printJson(context.stdout, { action: 'delete-webhook', webhookId });
564
+ return;
565
+ }
566
+ writeLine(context.stdout, `Deleted webhook ${webhookId}.`);
567
+ });
568
+ // --- Withdrawals ---
569
+ authOptions(encryptionOptions(program
570
+ .command('withdraw')
571
+ .description('Prepare, sign locally, and broadcast a withdrawal. Signs with the server-held key by default (unlock with your encryption password); pass --keys/--mnemonic to sign from a local key instead.')
572
+ .requiredOption('--address-id <id>', 'Source address id', positiveIntegerParser('--address-id'))
573
+ .requiredOption('--asset-id <id>', 'Asset id to withdraw', positiveIntegerParser('--asset-id'))
574
+ .option('--to <address>', 'Destination address (required for Ethereum/XRP/Polkadot)')
575
+ .option('--amount <decimal>', 'Amount in display units, e.g. "1.5"')
576
+ .option('--destination-tag <n>', 'XRP destination tag', nonNegativeIntegerParser('--destination-tag'))
577
+ .option('--wallet-id <id>', 'Wallet id of the source address (skips scanning all wallets)', positiveIntegerParser('--wallet-id'))
578
+ .option('--keys <path>', 'JSON file mapping keyFingerprint to mnemonic (local signing)')
579
+ .option('--mnemonic <phrase>', 'Signing mnemonic (local signing)')
580
+ .option('--mnemonic-file <path>', 'Read the signing mnemonic from a file (local signing)')
581
+ .option('--max-fee <wei>', 'Ethereum maxFeePerGas override (wei)', integerStringParser('--max-fee'))
582
+ .option('--max-priority-fee <wei>', 'Ethereum maxPriorityFeePerGas override (wei)', integerStringParser('--max-priority-fee'))
583
+ .option('--gas-limit <units>', 'Ethereum gasLimit override (gas units)', integerStringParser('--gas-limit'))
584
+ .option('--idempotency-key <key>', 'Replay-safe key reused across prepare + broadcast')
585
+ .option('--json', 'Emit JSON output'))).action(async (options) => {
586
+ const client = await resolveClient(context, options);
587
+ const keyProvider = await resolveOptionalKeyProvider(options);
588
+ // Default to server-sourced signing (session). Use a local key only when one
589
+ // is explicitly supplied.
590
+ let session;
591
+ const hotWallet = keyProvider != null
592
+ ? new HotWallet({ api: client, keys: keyProvider })
593
+ : new HotWallet({ api: client, session: (session = await unlockSession(context, client, options)) });
594
+ const ethereumGas = buildGasOverrides(options);
595
+ try {
596
+ const withdrawal = await hotWallet.withdraw({
597
+ addressId: options.addressId,
598
+ assetId: options.assetId,
599
+ ...(options.to != null ? { toAddress: options.to } : {}),
600
+ ...(options.amount != null ? { amount: options.amount } : {}),
601
+ ...(options.destinationTag != null ? { destinationTag: options.destinationTag } : {}),
602
+ ...(options.walletId != null ? { walletId: options.walletId } : {}),
603
+ ...(options.idempotencyKey != null ? { idempotencyKey: options.idempotencyKey } : {}),
604
+ ...(ethereumGas != null ? { ethereumGas } : {})
605
+ });
606
+ if (options.json) {
607
+ printJson(context.stdout, { action: 'withdraw', withdrawal });
608
+ return;
609
+ }
610
+ writeLine(context.stdout, `Broadcast withdrawal ${withdrawal.id} (${withdrawal.status}).`);
611
+ writeLine(context.stdout, formatApiWithdrawal(withdrawal));
612
+ }
613
+ finally {
614
+ session?.lock();
615
+ }
616
+ });
617
+ return program;
618
+ }
619
+ export async function runCli(argv, dependencies = {}) {
620
+ const context = {
621
+ stdout: dependencies.stdout ?? process.stdout,
622
+ stderr: dependencies.stderr ?? process.stderr,
623
+ readSecret: dependencies.readSecret ?? promptForSecret,
624
+ configStore: dependencies.configStore ?? new FileSystemConfigStore(dependencies.storageDir),
625
+ ...(dependencies.fetchImpl != null ? { fetchImpl: dependencies.fetchImpl } : {})
626
+ };
627
+ try {
628
+ const program = buildCli(context);
629
+ await program.parseAsync(argv, { from: 'user' });
630
+ return 0;
631
+ }
632
+ catch (error) {
633
+ if (error instanceof WalletSdkError) {
634
+ writeLine(context.stderr, `Error: ${error.message}`);
635
+ return 1;
636
+ }
637
+ if (error instanceof CommanderError) {
638
+ if (error.code === 'commander.helpDisplayed' || error.code === 'commander.version') {
639
+ return 0;
640
+ }
641
+ if (!error.message.startsWith('(outputHelp)')) {
642
+ writeLine(context.stderr, error.message);
643
+ }
644
+ return error.exitCode || 1;
645
+ }
646
+ throw error;
647
+ }
648
+ }
649
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ApiUser, ApiWalletAddress, ApiWalletDetail, ApiWalletSummary, ApiWebhook, ApiWebhookDelivery, ApiWithdrawal } from '@guveno/wallet-sdk';
2
+ export declare function formatApiUser(user: ApiUser, baseUrl: string): string;
3
+ export declare function formatApiWalletSummary(wallet: ApiWalletSummary): string;
4
+ export declare function formatApiWalletDetail(wallet: ApiWalletDetail): string;
5
+ export declare function formatApiWalletAddress(address: ApiWalletAddress): string;
6
+ export declare function formatApiWebhook(webhook: ApiWebhook): string;
7
+ export declare function formatApiWithdrawal(withdrawal: ApiWithdrawal): string;
8
+ export declare function formatApiWebhookDelivery(delivery: ApiWebhookDelivery): string;
9
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,kBAAkB,EAClB,aAAa,EACd,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CASpE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAWvE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAOrE;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAOxE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAS5D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,aAAa,GAAG,MAAM,CAarE;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAS7E"}
package/dist/format.js ADDED
@@ -0,0 +1,73 @@
1
+ export function formatApiUser(user, baseUrl) {
2
+ return [
3
+ `${user.email} (${user.id})`,
4
+ ` api: ${baseUrl}`,
5
+ ` company: ${user.company == null ? '-' : `${user.company.name} (${user.company.role})`}`,
6
+ ` encryption key: ${user.encryptionKey == null ? 'not configured' : 'configured'}`,
7
+ ` created: ${user.createdAt}`,
8
+ ` updated: ${user.updatedAt}`
9
+ ].join('\n');
10
+ }
11
+ export function formatApiWalletSummary(wallet) {
12
+ return [
13
+ `${wallet.name} (${wallet.id})`,
14
+ ` key: ${wallet.keyId ?? '-'}`,
15
+ ` chain: ${wallet.chain}`,
16
+ ` network: ${wallet.network}`,
17
+ ` status: ${wallet.status}`,
18
+ ` addresses: ${wallet.addressCount}`,
19
+ ` created: ${wallet.createdAt}`,
20
+ ` updated: ${wallet.updatedAt}`
21
+ ].join('\n');
22
+ }
23
+ export function formatApiWalletDetail(wallet) {
24
+ return [
25
+ formatApiWalletSummary(wallet),
26
+ ` key fingerprint: ${wallet.key?.fingerprint ?? '-'}`,
27
+ ` key access: ${wallet.keyAccess == null ? 'not granted to this user' : 'granted'}`,
28
+ ` next index: ${wallet.nextAccountIndex}`
29
+ ].join('\n');
30
+ }
31
+ export function formatApiWalletAddress(address) {
32
+ return [
33
+ `index ${address.accountIndex} [${address.chain}]: ${address.address}`,
34
+ ` path: ${address.derivationPath}`,
35
+ ` label: ${address.label ?? '-'}`,
36
+ ` status: ${address.status}`
37
+ ].join('\n');
38
+ }
39
+ export function formatApiWebhook(webhook) {
40
+ return [
41
+ `webhook ${webhook.id} [${webhook.type}]`,
42
+ ` events: ${webhook.events.join(', ')}`,
43
+ ` enabled: ${webhook.enabled ? 'yes' : 'no'}`,
44
+ ` config: ${JSON.stringify(webhook.config)}`,
45
+ ` created: ${webhook.createdAt}`,
46
+ ` updated: ${webhook.updatedAt}`
47
+ ].join('\n');
48
+ }
49
+ export function formatApiWithdrawal(withdrawal) {
50
+ return [
51
+ `withdrawal ${withdrawal.id} [${withdrawal.status}]`,
52
+ ` network: ${withdrawal.network}`,
53
+ ` address id: ${withdrawal.addressId}`,
54
+ ` asset id: ${withdrawal.assetId}`,
55
+ ` amount: ${withdrawal.amount}`,
56
+ ` to: ${withdrawal.toAddress ?? '-'}`,
57
+ ` tx hash: ${withdrawal.txHash ?? '-'}`,
58
+ ` expires: ${withdrawal.expiresAt}`,
59
+ ` created: ${withdrawal.createdAt}`,
60
+ ` updated: ${withdrawal.updatedAt}`
61
+ ].join('\n');
62
+ }
63
+ export function formatApiWebhookDelivery(delivery) {
64
+ return [
65
+ `delivery ${delivery.id} [${delivery.status}]`,
66
+ ` event: ${delivery.eventType ?? delivery.eventId}`,
67
+ ` attempts: ${delivery.attempts}`,
68
+ ` http: ${delivery.responseCode ?? '-'}`,
69
+ ` error: ${delivery.lastError ?? '-'}`,
70
+ ` created: ${delivery.createdAt}`
71
+ ].join('\n');
72
+ }
73
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from './app.js';
3
+ const exitCode = await runCli(process.argv.slice(2));
4
+ process.exit(exitCode);
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function promptForSecret(message: string): Promise<string>;
2
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAoBA,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6CtE"}
package/dist/prompt.js ADDED
@@ -0,0 +1,48 @@
1
+ import readline from 'node:readline';
2
+ import { stdin, stderr } from 'node:process';
3
+ import { ValidationError } from '@guveno/wallet-sdk';
4
+ function getInteractiveStdin() {
5
+ if (!stdin.isTTY || !stderr.isTTY || typeof stdin.setRawMode !== 'function') {
6
+ throw new ValidationError('No encryption password was provided and no interactive terminal is available. Use --password or --password-env.');
7
+ }
8
+ return stdin;
9
+ }
10
+ export async function promptForSecret(message) {
11
+ const input = getInteractiveStdin();
12
+ return new Promise((resolve, reject) => {
13
+ readline.emitKeypressEvents(input);
14
+ const wasRaw = input.isRaw === true;
15
+ let value = '';
16
+ const cleanup = () => {
17
+ input.removeListener('keypress', onKeypress);
18
+ input.setRawMode(wasRaw);
19
+ input.pause();
20
+ stderr.write('\n');
21
+ };
22
+ const onKeypress = (chunk, key) => {
23
+ if (key.ctrl && key.name === 'c') {
24
+ cleanup();
25
+ reject(new ValidationError('Password prompt cancelled.'));
26
+ return;
27
+ }
28
+ if (key.name === 'return' || key.name === 'enter') {
29
+ cleanup();
30
+ resolve(value);
31
+ return;
32
+ }
33
+ if (key.name === 'backspace') {
34
+ value = value.slice(0, -1);
35
+ return;
36
+ }
37
+ if (key.ctrl || key.meta) {
38
+ return;
39
+ }
40
+ value += chunk;
41
+ };
42
+ stderr.write(message);
43
+ input.setRawMode(true);
44
+ input.resume();
45
+ input.on('keypress', onKeypress);
46
+ });
47
+ }
48
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../src/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAQrD,SAAS,mBAAmB;IAC1B,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5E,MAAM,IAAI,eAAe,CACvB,iHAAiH,CAClH,CAAC;IACJ,CAAC;IAED,OAAO,KAAyB,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACnD,MAAM,KAAK,GAAG,mBAAmB,EAAE,CAAC;IAEpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;QACpC,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC7C,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YACzB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,GAAsD,EAAE,EAAE;YAC3F,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjC,OAAO,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClD,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC3B,OAAO;YACT,CAAC;YAED,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YAED,KAAK,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACtB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@guveno/cli",
3
+ "version": "1.0.2",
4
+ "description": "Command-line tool for managing Guveno HD wallet groups and server resources — create wallets, sign withdrawals, and drive the Guveno API from your terminal.",
5
+ "author": "Guveno LLC",
6
+ "license": "MIT",
7
+ "type": "module",
8
+ "bin": {
9
+ "guveno": "./dist/index.js"
10
+ },
11
+ "keywords": [
12
+ "guveno",
13
+ "wallet",
14
+ "cli",
15
+ "crypto",
16
+ "custody",
17
+ "hd-wallet",
18
+ "bitcoin",
19
+ "ethereum"
20
+ ],
21
+ "homepage": "https://guveno.com",
22
+ "files": [
23
+ "dist",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "engines": {
28
+ "node": ">=20.0.0"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "scripts": {
34
+ "build": "tsc -p tsconfig.build.json",
35
+ "clean": "rm -rf dist coverage .vitest-temp",
36
+ "lint": "tsc --noEmit -p tsconfig.json",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "cli": "tsx src/index.ts",
40
+ "prepublishOnly": "npm run clean && npm run build"
41
+ },
42
+ "dependencies": {
43
+ "@guveno/wallet-sdk": "^1.0.1",
44
+ "commander": "^14.0.3"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^25.6.0",
48
+ "tsx": "^4.21.0",
49
+ "typescript": "^6.0.2",
50
+ "vitest": "^4.1.4"
51
+ }
52
+ }