@onekeyfe/hardware-cli 1.1.25-alpha.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.
@@ -0,0 +1,96 @@
1
+ import * as _onekeyfe_hd_core from '@onekeyfe/hd-core';
2
+ import { CoreApi } from '@onekeyfe/hd-core';
3
+
4
+ /**
5
+ * SDK Factory — creates and initializes the hardware SDK instance
6
+ * for CLI usage with the appropriate transport.
7
+ *
8
+ * CRITICAL: Must register UI event handlers for PIN, Passphrase, and Button
9
+ * confirmation. Without these, the SDK will hang waiting for responses.
10
+ *
11
+ * Reference: packages/core/src/core/index.ts (event registration pattern)
12
+ */
13
+ interface SDKOptions {
14
+ json?: boolean;
15
+ connectId?: string;
16
+ passphraseState?: string;
17
+ useEmptyPassphrase?: boolean;
18
+ }
19
+ declare function createSDK(opts: SDKOptions): Promise<_onekeyfe_hd_core.CoreApi>;
20
+
21
+ /**
22
+ * Chain Resolver — maps chain identifiers to the correct SDK API calls.
23
+ * Handles derivation path defaults and chain-specific parameter transformations.
24
+ *
25
+ * Reference: developer-portal docs at
26
+ * content/en/hardware-sdk/chains/<chain>/<method>.mdx
27
+ * content/en/hardware-sdk/core-api-guide.mdx (HD path section)
28
+ *
29
+ * Type definitions: packages/core/src/types/api/*.ts
30
+ */
31
+
32
+ /**
33
+ * Common params passed to all SDK methods.
34
+ * Reference: packages/core/src/types/api/export.ts (CommonParams)
35
+ */
36
+ interface CommonCLIParams {
37
+ connectId?: string;
38
+ deviceId?: string;
39
+ passphraseState?: string;
40
+ useEmptyPassphrase?: boolean;
41
+ }
42
+ interface GetAddressParams extends CommonCLIParams {
43
+ chain: string;
44
+ path?: string;
45
+ showOnDevice?: boolean;
46
+ }
47
+ declare function resolveGetAddress(sdk: CoreApi, params: GetAddressParams): Promise<{
48
+ success: boolean;
49
+ error: string;
50
+ chain: string;
51
+ path: string;
52
+ } | {
53
+ chain: string;
54
+ path: string;
55
+ success?: undefined;
56
+ error?: undefined;
57
+ }>;
58
+ interface GetPublicKeyParams extends CommonCLIParams {
59
+ chain: string;
60
+ path?: string;
61
+ }
62
+ declare function resolveGetPublicKey(sdk: CoreApi, params: GetPublicKeyParams): Promise<{
63
+ chain: string;
64
+ path: string;
65
+ }>;
66
+ interface SignTransactionParams extends CommonCLIParams {
67
+ chain: string;
68
+ path?: string;
69
+ transaction: Record<string, unknown>;
70
+ }
71
+ declare function resolveSignTransaction(sdk: CoreApi, params: SignTransactionParams): Promise<{
72
+ chain: string;
73
+ path: string;
74
+ }>;
75
+ interface SignMessageParams extends CommonCLIParams {
76
+ chain: string;
77
+ path?: string;
78
+ message: string;
79
+ }
80
+ declare function resolveSignMessage(sdk: CoreApi, params: SignMessageParams): Promise<{
81
+ chain: string;
82
+ path: string;
83
+ }>;
84
+ interface BatchGetAddressParams extends CommonCLIParams {
85
+ bundle: Array<{
86
+ chain: string;
87
+ path?: string;
88
+ showOnDevice?: boolean;
89
+ }>;
90
+ }
91
+ declare function resolveBatchGetAddress(sdk: CoreApi, params: BatchGetAddressParams): Promise<{
92
+ success: boolean;
93
+ addresses: Record<string, unknown>[];
94
+ }>;
95
+
96
+ export { BatchGetAddressParams, CommonCLIParams, GetAddressParams, GetPublicKeyParams, SDKOptions, SignMessageParams, SignTransactionParams, createSDK, resolveBatchGetAddress, resolveGetAddress, resolveGetPublicKey, resolveSignMessage, resolveSignTransaction };
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * @onekeyfe/hardware-cli
5
+ *
6
+ * OneKey hardware wallet CLI for AI agent integration.
7
+ * Provides device management, multi-chain signing, firmware updates,
8
+ * and security management capabilities.
9
+ *
10
+ * Usage:
11
+ * npx @onekeyfe/hardware-cli search
12
+ * npx @onekeyfe/hardware-cli get-address --chain evm
13
+ * npx @onekeyfe/hardware-cli sign-transaction --chain evm --tx '{...}'
14
+ *
15
+ * For AI agent integration, use --json flag for structured output.
16
+ *
17
+ * IMPORTANT: All signing operations require physical confirmation on the
18
+ * hardware device. The CLI handles PIN/Passphrase prompts via stdin for
19
+ * interactive use, or via SDK event system for programmatic use.
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.resolveBatchGetAddress = exports.resolveSignMessage = exports.resolveSignTransaction = exports.resolveGetPublicKey = exports.resolveGetAddress = exports.createSDK = void 0;
23
+ var sdk_1 = require("./sdk");
24
+ Object.defineProperty(exports, "createSDK", { enumerable: true, get: function () { return sdk_1.createSDK; } });
25
+ var chains_1 = require("./chains");
26
+ Object.defineProperty(exports, "resolveGetAddress", { enumerable: true, get: function () { return chains_1.resolveGetAddress; } });
27
+ Object.defineProperty(exports, "resolveGetPublicKey", { enumerable: true, get: function () { return chains_1.resolveGetPublicKey; } });
28
+ Object.defineProperty(exports, "resolveSignTransaction", { enumerable: true, get: function () { return chains_1.resolveSignTransaction; } });
29
+ Object.defineProperty(exports, "resolveSignMessage", { enumerable: true, get: function () { return chains_1.resolveSignMessage; } });
30
+ Object.defineProperty(exports, "resolveBatchGetAddress", { enumerable: true, get: function () { return chains_1.resolveBatchGetAddress; } });
package/dist/sdk.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SDK Factory — creates and initializes the hardware SDK instance
3
+ * for CLI usage with the appropriate transport.
4
+ *
5
+ * CRITICAL: Must register UI event handlers for PIN, Passphrase, and Button
6
+ * confirmation. Without these, the SDK will hang waiting for responses.
7
+ *
8
+ * Reference: packages/core/src/core/index.ts (event registration pattern)
9
+ */
10
+ export interface SDKOptions {
11
+ json?: boolean;
12
+ connectId?: string;
13
+ passphraseState?: string;
14
+ useEmptyPassphrase?: boolean;
15
+ }
16
+ export declare function createSDK(opts: SDKOptions): Promise<import("@onekeyfe/hd-core").CoreApi>;
package/dist/sdk.js ADDED
@@ -0,0 +1,187 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * SDK Factory — creates and initializes the hardware SDK instance
5
+ * for CLI usage with the appropriate transport.
6
+ *
7
+ * CRITICAL: Must register UI event handlers for PIN, Passphrase, and Button
8
+ * confirmation. Without these, the SDK will hang waiting for responses.
9
+ *
10
+ * Reference: packages/core/src/core/index.ts (event registration pattern)
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.createSDK = void 0;
14
+ const tslib_1 = require("tslib");
15
+ // @ts-ignore - hd-common-connect-sdk may not have type declarations
16
+ const hd_common_connect_sdk_1 = tslib_1.__importDefault(require("@onekeyfe/hd-common-connect-sdk"));
17
+ const hd_core_1 = require("@onekeyfe/hd-core");
18
+ const hd_transport_usb_1 = require("@onekeyfe/hd-transport-usb");
19
+ const readline = tslib_1.__importStar(require("readline"));
20
+ /**
21
+ * Prompt user for input in the terminal (hidden for PIN).
22
+ * Falls back to empty string in non-TTY (piped) mode.
23
+ */
24
+ function promptUser(question, hidden = false) {
25
+ if (!process.stdin.isTTY) {
26
+ // Non-interactive mode: return empty (agent should handle via uiResponse)
27
+ return Promise.resolve('');
28
+ }
29
+ return new Promise(resolve => {
30
+ const rl = readline.createInterface({
31
+ input: process.stdin,
32
+ output: process.stderr, // Use stderr so JSON stdout stays clean
33
+ });
34
+ if (hidden) {
35
+ // Mute output for PIN entry
36
+ process.stderr.write(question);
37
+ const { stdin } = process;
38
+ const wasRaw = stdin.isRaw;
39
+ if (stdin.setRawMode)
40
+ stdin.setRawMode(true);
41
+ let input = '';
42
+ const onData = (char) => {
43
+ const c = char.toString('utf8');
44
+ if (c === '\n' || c === '\r' || c === '\u0004') {
45
+ if (stdin.setRawMode)
46
+ stdin.setRawMode(wasRaw ?? false);
47
+ stdin.removeListener('data', onData);
48
+ process.stderr.write('\n');
49
+ rl.close();
50
+ resolve(input);
51
+ }
52
+ else if (c === '\u0003') {
53
+ // Ctrl+C
54
+ process.exit(1);
55
+ }
56
+ else if (c === '\u007F' || c === '\b') {
57
+ // Backspace
58
+ input = input.slice(0, -1);
59
+ }
60
+ else {
61
+ input += c;
62
+ process.stderr.write('*');
63
+ }
64
+ };
65
+ stdin.on('data', onData);
66
+ }
67
+ else {
68
+ rl.question(question, answer => {
69
+ rl.close();
70
+ resolve(answer);
71
+ });
72
+ }
73
+ });
74
+ }
75
+ /**
76
+ * Register UI event handlers for interactive device operations.
77
+ *
78
+ * The SDK emits events when the device needs user interaction:
79
+ * - PIN entry (entered on device screen for Touch/Pro, or via matrix for Classic)
80
+ * - Passphrase input (for hidden wallets)
81
+ * - Button confirmation (user must physically press on device)
82
+ *
83
+ * Reference: packages/core/src/core/index.ts lines 315-330, 1021-1098
84
+ */
85
+ function registerEventHandlers(sdk, opts) {
86
+ sdk.on(hd_core_1.UI_EVENT, (message) => {
87
+ // PIN Request
88
+ // For Touch/Pro devices, PIN is entered on-device (device screen shows numpad).
89
+ // For Classic devices, PIN uses a matrix mapping.
90
+ // In CLI context, we auto-acknowledge since PIN entry happens on-device.
91
+ if (message.type === hd_core_1.UI_REQUEST.REQUEST_PIN) {
92
+ const pinType = message.payload?.type;
93
+ if (pinType === 'ButtonRequest_PinEntry' || pinType === 'ButtonRequest_AttachPin') {
94
+ // PIN is entered directly on device screen (Touch/Pro)
95
+ process.stderr.write('[onekey-hw] Please enter PIN on your device screen...\n');
96
+ // No uiResponse needed — device handles PIN input internally
97
+ }
98
+ else {
99
+ // Classic devices: PIN entry via matrix
100
+ // In CLI mode, prompt user or let agent handle
101
+ process.stderr.write('[onekey-hw] PIN required. Please enter PIN on your device.\n');
102
+ promptUser('PIN (on-device numpad mapping): ', true).then(pin => {
103
+ sdk.uiResponse({
104
+ type: hd_core_1.UI_RESPONSE.RECEIVE_PIN,
105
+ payload: pin,
106
+ });
107
+ });
108
+ }
109
+ }
110
+ // Passphrase Request
111
+ // User must provide passphrase for hidden wallet access.
112
+ // Passphrase can be entered on-device (Touch/Pro) or via host.
113
+ if (message.type === hd_core_1.UI_REQUEST.REQUEST_PASSPHRASE) {
114
+ if (opts.useEmptyPassphrase) {
115
+ // Standard wallet (no passphrase)
116
+ sdk.uiResponse({
117
+ type: hd_core_1.UI_RESPONSE.RECEIVE_PASSPHRASE,
118
+ payload: {
119
+ value: '',
120
+ passphraseOnDevice: false,
121
+ save: false,
122
+ },
123
+ });
124
+ }
125
+ else {
126
+ process.stderr.write('[onekey-hw] Passphrase required for hidden wallet.\n');
127
+ promptUser('Enter passphrase (or press Enter for on-device entry): ').then(passphrase => {
128
+ if (passphrase === '') {
129
+ // Enter on device
130
+ sdk.uiResponse({
131
+ type: hd_core_1.UI_RESPONSE.RECEIVE_PASSPHRASE,
132
+ payload: {
133
+ value: '',
134
+ passphraseOnDevice: true,
135
+ save: false,
136
+ },
137
+ });
138
+ }
139
+ else {
140
+ sdk.uiResponse({
141
+ type: hd_core_1.UI_RESPONSE.RECEIVE_PASSPHRASE,
142
+ payload: {
143
+ value: passphrase,
144
+ passphraseOnDevice: false,
145
+ save: false,
146
+ },
147
+ });
148
+ }
149
+ });
150
+ }
151
+ }
152
+ // Passphrase On Device
153
+ if (message.type === hd_core_1.UI_REQUEST.REQUEST_PASSPHRASE_ON_DEVICE) {
154
+ process.stderr.write('[onekey-hw] Please enter passphrase on your device screen...\n');
155
+ }
156
+ // Button Confirmation
157
+ // User must physically press confirm/reject on the device.
158
+ if (message.type === hd_core_1.UI_REQUEST.REQUEST_BUTTON) {
159
+ process.stderr.write('[onekey-hw] Please confirm the action on your device...\n');
160
+ }
161
+ });
162
+ // Device connection events
163
+ sdk.on(hd_core_1.DEVICE.CONNECT, (device) => {
164
+ if (!opts.json) {
165
+ process.stderr.write(`[onekey-hw] Device connected: ${device?.name || 'Unknown'}\n`);
166
+ }
167
+ });
168
+ sdk.on(hd_core_1.DEVICE.DISCONNECT, (device) => {
169
+ if (!opts.json) {
170
+ process.stderr.write(`[onekey-hw] Device disconnected: ${device?.name || 'Unknown'}\n`);
171
+ }
172
+ });
173
+ }
174
+ async function createSDK(opts) {
175
+ const settings = {
176
+ debug: false,
177
+ fetchConfig: true,
178
+ };
179
+ // Direct USB via libusb — works on macOS, Linux, Windows
180
+ settings.env = 'lowlevel';
181
+ const plugin = hd_transport_usb_1.UsbPlugin;
182
+ await hd_common_connect_sdk_1.default.init(settings, undefined, plugin);
183
+ // Register event handlers AFTER init
184
+ registerEventHandlers(hd_common_connect_sdk_1.default, opts);
185
+ return hd_common_connect_sdk_1.default;
186
+ }
187
+ exports.createSDK = createSDK;