pal-explorer-cli 0.4.12 → 0.4.13
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/README.md +149 -149
- package/bin/pal.js +63 -2
- package/extensions/@palexplorer/analytics/extension.json +20 -1
- package/extensions/@palexplorer/analytics/index.js +19 -9
- package/extensions/@palexplorer/audit/extension.json +14 -0
- package/extensions/@palexplorer/auth-email/extension.json +15 -0
- package/extensions/@palexplorer/auth-oauth/extension.json +15 -0
- package/extensions/@palexplorer/chat/extension.json +14 -0
- package/extensions/@palexplorer/discovery/extension.json +17 -0
- package/extensions/@palexplorer/discovery/index.js +1 -1
- package/extensions/@palexplorer/email-notifications/extension.json +23 -0
- package/extensions/@palexplorer/groups/extension.json +15 -0
- package/extensions/@palexplorer/share-links/extension.json +15 -0
- package/extensions/@palexplorer/sync/extension.json +16 -0
- package/extensions/@palexplorer/user-mgmt/extension.json +15 -0
- package/lib/capabilities.js +24 -24
- package/lib/commands/analytics.js +175 -175
- package/lib/commands/api-keys.js +131 -131
- package/lib/commands/audit.js +235 -235
- package/lib/commands/auth.js +137 -137
- package/lib/commands/backup.js +76 -76
- package/lib/commands/billing.js +148 -148
- package/lib/commands/chat.js +217 -217
- package/lib/commands/cloud-backup.js +231 -231
- package/lib/commands/comment.js +99 -99
- package/lib/commands/completion.js +203 -203
- package/lib/commands/compliance.js +218 -218
- package/lib/commands/config.js +136 -136
- package/lib/commands/connect.js +44 -44
- package/lib/commands/dept.js +294 -294
- package/lib/commands/device.js +146 -146
- package/lib/commands/download.js +240 -226
- package/lib/commands/explorer.js +178 -178
- package/lib/commands/extension.js +1060 -970
- package/lib/commands/favorite.js +90 -90
- package/lib/commands/federation.js +270 -270
- package/lib/commands/file.js +533 -533
- package/lib/commands/group.js +271 -271
- package/lib/commands/gui-share.js +29 -29
- package/lib/commands/init.js +61 -61
- package/lib/commands/invite.js +59 -59
- package/lib/commands/list.js +58 -58
- package/lib/commands/log.js +116 -116
- package/lib/commands/nearby.js +108 -108
- package/lib/commands/network.js +251 -251
- package/lib/commands/notify.js +198 -198
- package/lib/commands/org.js +273 -273
- package/lib/commands/pal.js +403 -180
- package/lib/commands/permissions.js +216 -216
- package/lib/commands/pin.js +97 -97
- package/lib/commands/protocol.js +357 -357
- package/lib/commands/rbac.js +147 -147
- package/lib/commands/recover.js +36 -36
- package/lib/commands/register.js +171 -171
- package/lib/commands/relay.js +131 -131
- package/lib/commands/remote.js +368 -368
- package/lib/commands/revoke.js +50 -50
- package/lib/commands/scanner.js +280 -280
- package/lib/commands/schedule.js +344 -344
- package/lib/commands/scim.js +203 -203
- package/lib/commands/search.js +181 -181
- package/lib/commands/serve.js +438 -438
- package/lib/commands/server.js +350 -350
- package/lib/commands/share-link.js +199 -199
- package/lib/commands/share.js +336 -323
- package/lib/commands/sso.js +200 -200
- package/lib/commands/status.js +145 -145
- package/lib/commands/stream.js +562 -562
- package/lib/commands/su.js +187 -187
- package/lib/commands/sync.js +979 -979
- package/lib/commands/transfers.js +152 -152
- package/lib/commands/uninstall.js +188 -188
- package/lib/commands/update.js +204 -204
- package/lib/commands/user.js +276 -276
- package/lib/commands/vfs.js +84 -84
- package/lib/commands/web-login.js +79 -79
- package/lib/commands/web.js +52 -52
- package/lib/commands/webhook.js +180 -180
- package/lib/commands/whoami.js +59 -59
- package/lib/commands/workspace.js +121 -121
- package/lib/core/billing.js +16 -5
- package/lib/core/dhtDiscovery.js +9 -2
- package/lib/core/discoveryClient.js +13 -7
- package/lib/core/extensions.js +142 -1
- package/lib/core/identity.js +33 -2
- package/lib/core/imageProcessor.js +109 -0
- package/lib/core/imageTorrent.js +167 -0
- package/lib/core/permissions.js +1 -1
- package/lib/core/pro.js +11 -4
- package/lib/core/serverList.js +4 -1
- package/lib/core/shares.js +12 -1
- package/lib/core/signalingServer.js +14 -2
- package/lib/core/su.js +1 -1
- package/lib/core/users.js +1 -1
- package/lib/protocol/messages.js +12 -3
- package/lib/utils/explorer.js +1 -1
- package/lib/utils/help.js +357 -357
- package/lib/utils/torrent.js +1 -0
- package/package.json +4 -3
package/lib/commands/device.js
CHANGED
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
import chalk from 'chalk';
|
|
2
|
-
import { getIdentity, getDeviceInfo, setDeviceName } from '../core/identity.js';
|
|
3
|
-
import config from '../utils/config.js';
|
|
4
|
-
import { getPrimaryServer } from '../core/discoveryClient.js';
|
|
5
|
-
|
|
6
|
-
export default function deviceCommand(program) {
|
|
7
|
-
const cmd = program
|
|
8
|
-
.command('device')
|
|
9
|
-
.description('view and manage this device\'s identity')
|
|
10
|
-
.addHelpText('after', `
|
|
11
|
-
Examples:
|
|
12
|
-
$
|
|
13
|
-
$
|
|
14
|
-
$
|
|
15
|
-
`);
|
|
16
|
-
|
|
17
|
-
// Default: show device info
|
|
18
|
-
cmd.action(async () => {
|
|
19
|
-
const identity = await getIdentity();
|
|
20
|
-
const device = getDeviceInfo();
|
|
21
|
-
if (!identity) {
|
|
22
|
-
console.log(chalk.red('No identity found. Run `
|
|
23
|
-
process.exitCode = 1;
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
if (program.opts().json) {
|
|
27
|
-
console.log(JSON.stringify({ device, identity: { name: identity.name, handle: identity.handle, publicKey: identity.publicKey } }, null, 2));
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
console.log('');
|
|
31
|
-
console.log(chalk.cyan('This Device:'));
|
|
32
|
-
console.log(` Device Name: ${chalk.white(device.name)}`);
|
|
33
|
-
console.log(` Device ID: ${chalk.gray(device.id)}`);
|
|
34
|
-
console.log(` Identity: ${chalk.white(identity.name)}${identity.handle ? chalk.cyan(` @${identity.handle}`) : ''}`);
|
|
35
|
-
console.log(` Public Key: ${chalk.gray(identity.publicKey)}`);
|
|
36
|
-
console.log(` Created At: ${chalk.gray(device.createdAt)}`);
|
|
37
|
-
console.log('');
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
cmd
|
|
41
|
-
.command('rename <name>')
|
|
42
|
-
.description('set a unique name for this device')
|
|
43
|
-
.action((name) => {
|
|
44
|
-
const updated = setDeviceName(name);
|
|
45
|
-
console.log(chalk.green(`✔ Device renamed to: ${updated.name}`));
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
cmd
|
|
49
|
-
.command('register <handle>')
|
|
50
|
-
.description('register this device with the discovery server under a handle')
|
|
51
|
-
.action(async (handle) => {
|
|
52
|
-
handle = handle.replace(/^@/, '');
|
|
53
|
-
const identity = await getIdentity();
|
|
54
|
-
const device = getDeviceInfo();
|
|
55
|
-
|
|
56
|
-
if (!identity || !identity.privateKey) {
|
|
57
|
-
console.log(chalk.red('No identity found. Run `
|
|
58
|
-
process.exitCode = 1;
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const sodium = (await import('sodium-native')).default;
|
|
63
|
-
const privateKey = Buffer.from(identity.privateKey, 'hex');
|
|
64
|
-
const now = Date.now();
|
|
65
|
-
const message = `${handle}:${device.id}:${device.name}:${now}`;
|
|
66
|
-
const sig = Buffer.alloc(sodium.crypto_sign_BYTES);
|
|
67
|
-
sodium.crypto_sign_detached(sig, Buffer.from(message), privateKey);
|
|
68
|
-
|
|
69
|
-
const url = getPrimaryServer();
|
|
70
|
-
try {
|
|
71
|
-
process.stdout.write(chalk.gray(`Registering device '${device.name}' under @${handle}... `));
|
|
72
|
-
const res = await fetch(`${url}/devices/register`, {
|
|
73
|
-
method: 'POST',
|
|
74
|
-
headers: { 'Content-Type': 'application/json' },
|
|
75
|
-
body: JSON.stringify({
|
|
76
|
-
handle,
|
|
77
|
-
deviceId: device.id,
|
|
78
|
-
deviceName: device.name,
|
|
79
|
-
publicKey: identity.publicKey,
|
|
80
|
-
timestamp: now,
|
|
81
|
-
signature: sig.toString('hex')
|
|
82
|
-
})
|
|
83
|
-
});
|
|
84
|
-
const result = await res.json();
|
|
85
|
-
if (result.success) {
|
|
86
|
-
console.log(chalk.green('done.'));
|
|
87
|
-
console.log(chalk.green(`✔ Device registered. Total devices for @${handle}: ${result.devices?.length || 1}`));
|
|
88
|
-
} else {
|
|
89
|
-
console.log(chalk.red(`\nFailed: ${result.error}`));
|
|
90
|
-
process.exitCode = 1;
|
|
91
|
-
}
|
|
92
|
-
} catch {
|
|
93
|
-
console.log(chalk.red(`\nCould not reach discovery server at ${url}`));
|
|
94
|
-
process.exitCode = 1;
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
cmd
|
|
99
|
-
.command('list [handle]')
|
|
100
|
-
.description('list all devices registered under a handle (defaults to your own)')
|
|
101
|
-
.action(async (handle) => {
|
|
102
|
-
if (!handle) {
|
|
103
|
-
const id = config.get('identity');
|
|
104
|
-
handle = id?.handle;
|
|
105
|
-
if (!handle) {
|
|
106
|
-
console.log(chalk.yellow('No handle registered. Provide one:
|
|
107
|
-
process.exitCode = 1;
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
const url = getPrimaryServer();
|
|
112
|
-
try {
|
|
113
|
-
const res = await fetch(`${url}/devices/${encodeURIComponent(handle)}`);
|
|
114
|
-
if (!res.ok) {
|
|
115
|
-
const err = await res.json().catch(() => ({}));
|
|
116
|
-
console.log(chalk.red(`Failed: ${err.error || res.statusText}`));
|
|
117
|
-
process.exitCode = 1;
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
const data = await res.json();
|
|
121
|
-
const devices = data.devices || [];
|
|
122
|
-
if (devices.length === 0) {
|
|
123
|
-
if (program.opts().json) {
|
|
124
|
-
console.log(JSON.stringify({ handle, devices: [] }, null, 2));
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
console.log(chalk.gray(`No devices found for @${handle}.`));
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
if (program.opts().json) {
|
|
131
|
-
console.log(JSON.stringify({ handle, devices }, null, 2));
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
console.log('');
|
|
135
|
-
console.log(chalk.cyan(`Devices for @${handle}:`));
|
|
136
|
-
devices.forEach(d => {
|
|
137
|
-
const status = d.status === 'online' ? chalk.green('online') : chalk.gray(d.status || 'offline');
|
|
138
|
-
console.log(` ${chalk.white(d.deviceName)} [${status}] ${chalk.gray(d.deviceId)}`);
|
|
139
|
-
console.log(` Last seen: ${chalk.gray(d.updatedAt || 'unknown')}`);
|
|
140
|
-
});
|
|
141
|
-
} catch {
|
|
142
|
-
console.log(chalk.red(`Could not reach discovery server at ${url}`));
|
|
143
|
-
process.exitCode = 1;
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getIdentity, getDeviceInfo, setDeviceName } from '../core/identity.js';
|
|
3
|
+
import config from '../utils/config.js';
|
|
4
|
+
import { getPrimaryServer } from '../core/discoveryClient.js';
|
|
5
|
+
|
|
6
|
+
export default function deviceCommand(program) {
|
|
7
|
+
const cmd = program
|
|
8
|
+
.command('device')
|
|
9
|
+
.description('view and manage this device\'s identity')
|
|
10
|
+
.addHelpText('after', `
|
|
11
|
+
Examples:
|
|
12
|
+
$ pal device list List linked devices
|
|
13
|
+
$ pal device rename "My Laptop" Rename this device
|
|
14
|
+
$ pal device register Register device on discovery server
|
|
15
|
+
`);
|
|
16
|
+
|
|
17
|
+
// Default: show device info
|
|
18
|
+
cmd.action(async () => {
|
|
19
|
+
const identity = await getIdentity();
|
|
20
|
+
const device = getDeviceInfo();
|
|
21
|
+
if (!identity) {
|
|
22
|
+
console.log(chalk.red('No identity found. Run `pal init <name>` first.'));
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (program.opts().json) {
|
|
27
|
+
console.log(JSON.stringify({ device, identity: { name: identity.name, handle: identity.handle, publicKey: identity.publicKey } }, null, 2));
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
console.log('');
|
|
31
|
+
console.log(chalk.cyan('This Device:'));
|
|
32
|
+
console.log(` Device Name: ${chalk.white(device.name)}`);
|
|
33
|
+
console.log(` Device ID: ${chalk.gray(device.id)}`);
|
|
34
|
+
console.log(` Identity: ${chalk.white(identity.name)}${identity.handle ? chalk.cyan(` @${identity.handle}`) : ''}`);
|
|
35
|
+
console.log(` Public Key: ${chalk.gray(identity.publicKey)}`);
|
|
36
|
+
console.log(` Created At: ${chalk.gray(device.createdAt)}`);
|
|
37
|
+
console.log('');
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
cmd
|
|
41
|
+
.command('rename <name>')
|
|
42
|
+
.description('set a unique name for this device')
|
|
43
|
+
.action((name) => {
|
|
44
|
+
const updated = setDeviceName(name);
|
|
45
|
+
console.log(chalk.green(`✔ Device renamed to: ${updated.name}`));
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
cmd
|
|
49
|
+
.command('register <handle>')
|
|
50
|
+
.description('register this device with the discovery server under a handle')
|
|
51
|
+
.action(async (handle) => {
|
|
52
|
+
handle = handle.replace(/^@/, '');
|
|
53
|
+
const identity = await getIdentity();
|
|
54
|
+
const device = getDeviceInfo();
|
|
55
|
+
|
|
56
|
+
if (!identity || !identity.privateKey) {
|
|
57
|
+
console.log(chalk.red('No identity found. Run `pal init <name>` first.'));
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const sodium = (await import('sodium-native')).default;
|
|
63
|
+
const privateKey = Buffer.from(identity.privateKey, 'hex');
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const message = `${handle}:${device.id}:${device.name}:${now}`;
|
|
66
|
+
const sig = Buffer.alloc(sodium.crypto_sign_BYTES);
|
|
67
|
+
sodium.crypto_sign_detached(sig, Buffer.from(message), privateKey);
|
|
68
|
+
|
|
69
|
+
const url = getPrimaryServer();
|
|
70
|
+
try {
|
|
71
|
+
process.stdout.write(chalk.gray(`Registering device '${device.name}' under @${handle}... `));
|
|
72
|
+
const res = await fetch(`${url}/devices/register`, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: { 'Content-Type': 'application/json' },
|
|
75
|
+
body: JSON.stringify({
|
|
76
|
+
handle,
|
|
77
|
+
deviceId: device.id,
|
|
78
|
+
deviceName: device.name,
|
|
79
|
+
publicKey: identity.publicKey,
|
|
80
|
+
timestamp: now,
|
|
81
|
+
signature: sig.toString('hex')
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
const result = await res.json();
|
|
85
|
+
if (result.success) {
|
|
86
|
+
console.log(chalk.green('done.'));
|
|
87
|
+
console.log(chalk.green(`✔ Device registered. Total devices for @${handle}: ${result.devices?.length || 1}`));
|
|
88
|
+
} else {
|
|
89
|
+
console.log(chalk.red(`\nFailed: ${result.error}`));
|
|
90
|
+
process.exitCode = 1;
|
|
91
|
+
}
|
|
92
|
+
} catch {
|
|
93
|
+
console.log(chalk.red(`\nCould not reach discovery server at ${url}`));
|
|
94
|
+
process.exitCode = 1;
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
cmd
|
|
99
|
+
.command('list [handle]')
|
|
100
|
+
.description('list all devices registered under a handle (defaults to your own)')
|
|
101
|
+
.action(async (handle) => {
|
|
102
|
+
if (!handle) {
|
|
103
|
+
const id = config.get('identity');
|
|
104
|
+
handle = id?.handle;
|
|
105
|
+
if (!handle) {
|
|
106
|
+
console.log(chalk.yellow('No handle registered. Provide one: pal device list <handle>'));
|
|
107
|
+
process.exitCode = 1;
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const url = getPrimaryServer();
|
|
112
|
+
try {
|
|
113
|
+
const res = await fetch(`${url}/devices/${encodeURIComponent(handle)}`);
|
|
114
|
+
if (!res.ok) {
|
|
115
|
+
const err = await res.json().catch(() => ({}));
|
|
116
|
+
console.log(chalk.red(`Failed: ${err.error || res.statusText}`));
|
|
117
|
+
process.exitCode = 1;
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const data = await res.json();
|
|
121
|
+
const devices = data.devices || [];
|
|
122
|
+
if (devices.length === 0) {
|
|
123
|
+
if (program.opts().json) {
|
|
124
|
+
console.log(JSON.stringify({ handle, devices: [] }, null, 2));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
console.log(chalk.gray(`No devices found for @${handle}.`));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (program.opts().json) {
|
|
131
|
+
console.log(JSON.stringify({ handle, devices }, null, 2));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
console.log('');
|
|
135
|
+
console.log(chalk.cyan(`Devices for @${handle}:`));
|
|
136
|
+
devices.forEach(d => {
|
|
137
|
+
const status = d.status === 'online' ? chalk.green('online') : chalk.gray(d.status || 'offline');
|
|
138
|
+
console.log(` ${chalk.white(d.deviceName)} [${status}] ${chalk.gray(d.deviceId)}`);
|
|
139
|
+
console.log(` Last seen: ${chalk.gray(d.updatedAt || 'unknown')}`);
|
|
140
|
+
});
|
|
141
|
+
} catch {
|
|
142
|
+
console.log(chalk.red(`Could not reach discovery server at ${url}`));
|
|
143
|
+
process.exitCode = 1;
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|