pontus-x_cli 1.1.4 → 1.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +71 -41
  2. package/dist/commands/compute.d.ts +3 -2
  3. package/dist/commands/compute.js +125 -71
  4. package/dist/commands/compute.js.map +1 -1
  5. package/dist/commands/edit-trusted-algos.d.ts +5 -4
  6. package/dist/commands/edit-trusted-algos.js +132 -21
  7. package/dist/commands/edit-trusted-algos.js.map +1 -1
  8. package/dist/commands/edit-trusted-publishers.d.ts +13 -0
  9. package/dist/commands/edit-trusted-publishers.js +132 -0
  10. package/dist/commands/edit-trusted-publishers.js.map +1 -0
  11. package/dist/commands/publish.js +28 -28
  12. package/dist/commands/publish.js.map +1 -1
  13. package/dist/commands/render.js +5 -1
  14. package/dist/commands/render.js.map +1 -1
  15. package/dist/commands/revoke.js +1 -1
  16. package/dist/commands/revoke.js.map +1 -1
  17. package/dist/lib/aquarius.d.ts +25 -3
  18. package/dist/lib/aquarius.js +161 -20
  19. package/dist/lib/aquarius.js.map +1 -1
  20. package/dist/lib/manifest.d.ts +1 -0
  21. package/dist/lib/manifest.js +4 -0
  22. package/dist/lib/manifest.js.map +1 -1
  23. package/dist/lib/spec.js +1 -1
  24. package/dist/lib/spec.js.map +1 -1
  25. package/dist/lib/wallet.d.ts +2 -1
  26. package/dist/lib/wallet.js +7 -2
  27. package/dist/lib/wallet.js.map +1 -1
  28. package/dist/utils/account.d.ts +2 -0
  29. package/dist/utils/account.js +41 -0
  30. package/dist/utils/account.js.map +1 -0
  31. package/dist/utils/asset.d.ts +25 -0
  32. package/dist/utils/asset.js +108 -0
  33. package/dist/utils/asset.js.map +1 -0
  34. package/dist/utils/login.d.ts +14 -0
  35. package/dist/utils/login.js +99 -0
  36. package/dist/utils/login.js.map +1 -0
  37. package/oclif.manifest.json +137 -33
  38. package/package.json +3 -1
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPrivateKeyForOwner = getPrivateKeyForOwner;
7
+ exports.manifestToLoginInfos = manifestToLoginInfos;
8
+ exports.getEnvLoginInfo = getEnvLoginInfo;
9
+ exports.printLoginInfos = printLoginInfos;
10
+ exports.getLoginInfos = getLoginInfos;
11
+ exports.askForNetwork = askForNetwork;
12
+ exports.getEnvNetwork = getEnvNetwork;
13
+ const prompts_1 = require("@inquirer/prompts");
14
+ const chalk_1 = __importDefault(require("chalk"));
15
+ const config_1 = require("../config");
16
+ const aquarius_1 = require("../lib/aquarius");
17
+ const manifest_1 = require("../lib/manifest");
18
+ const wallet_1 = require("../lib/wallet");
19
+ function getPrivateKeyForOwner(loginInfos, ownerAddress) {
20
+ const address = ownerAddress.toLowerCase();
21
+ const loginInfo = loginInfos.find((info) => info.ownerAddress.toLowerCase() === address);
22
+ if (!loginInfo) {
23
+ throw new Error(`No login info found for address ${ownerAddress}`);
24
+ }
25
+ return loginInfo.privateKey;
26
+ }
27
+ async function manifestToLoginInfos(manifest) {
28
+ return Promise.all(manifest.accounts.map(async (account) => {
29
+ try {
30
+ const password = process.env[account.passwordEnvKey || ""] || "";
31
+ const privateKey = await (0, wallet_1.readPrivateKey)(account.privateKeyPath, password);
32
+ const ownerAddress = await (0, wallet_1.getOwnerAddress)(privateKey);
33
+ const ownerName = await (0, aquarius_1.getOwnerName)(ownerAddress);
34
+ return {
35
+ privateKey,
36
+ ownerAddress,
37
+ ownerName,
38
+ };
39
+ }
40
+ catch (err) {
41
+ throw new Error(`Failed processing account with keyPath=${account.privateKeyPath}: ${err instanceof Error ? err.message : String(err)}`);
42
+ }
43
+ }));
44
+ }
45
+ async function getEnvLoginInfo() {
46
+ const privateKey = process.env.PRIVATE_KEY || "";
47
+ if (privateKey === "") {
48
+ throw new Error(`You are not logged in. Please login using "pontus-x_cli login" or set the PRIVATE_KEY environment variable.`);
49
+ }
50
+ const ownerAddress = await (0, wallet_1.getOwnerAddress)(privateKey);
51
+ const ownerName = await (0, aquarius_1.getOwnerName)(ownerAddress);
52
+ return {
53
+ privateKey,
54
+ ownerAddress,
55
+ ownerName,
56
+ };
57
+ }
58
+ function printLoginInfos(loginInfos) {
59
+ loginInfos.forEach((loginInfo, index) => {
60
+ console.log(chalk_1.default.bold(`Account ${(index + 1).toString().padStart(2, "0")}: ${chalk_1.default.gray(loginInfo.ownerAddress)} ${chalk_1.default.magenta(loginInfo.ownerName)}`));
61
+ });
62
+ console.log();
63
+ }
64
+ async function getLoginInfos(manifestPath) {
65
+ let loginInfos = [];
66
+ if (manifestPath) {
67
+ console.log(chalk_1.default.green(`Using manifest file for authentication ${chalk_1.default.gray(`(path: ${manifestPath})\n`)}`));
68
+ const manifest = (0, manifest_1.readManifest)(manifestPath);
69
+ loginInfos = await manifestToLoginInfos(manifest);
70
+ }
71
+ else {
72
+ console.log(chalk_1.default.green(`Using environment variables for authentication ${chalk_1.default.gray("(env: PRIVATE_KEY)")}\n`));
73
+ loginInfos = [await getEnvLoginInfo()];
74
+ }
75
+ return loginInfos;
76
+ }
77
+ async function askForNetwork() {
78
+ const network = await (0, prompts_1.select)({
79
+ message: "Select network:",
80
+ choices: Object.keys(config_1.NETWORK_CONFIGS).map((network) => ({
81
+ name: network,
82
+ value: network,
83
+ })),
84
+ });
85
+ return network;
86
+ }
87
+ function getEnvNetwork() {
88
+ var _a;
89
+ const envNetwork = (_a = process.env.NETWORK) === null || _a === void 0 ? void 0 : _a.toUpperCase();
90
+ if (!envNetwork) {
91
+ return null;
92
+ }
93
+ const network = Object.keys(config_1.NETWORK_CONFIGS).find((network) => network === envNetwork);
94
+ if (!network) {
95
+ throw new Error(`Invalid NETWORK environment variable value "${envNetwork}". Please set it to one of: ${Object.keys(config_1.NETWORK_CONFIGS).join(", ")}`);
96
+ }
97
+ return network;
98
+ }
99
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/utils/login.ts"],"names":[],"mappings":"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"}
@@ -196,32 +196,21 @@
196
196
  "compute": {
197
197
  "aliases": [],
198
198
  "args": {
199
- "algo": {
200
- "description": "Algorithm DID",
201
- "name": "algo",
202
- "required": true
199
+ "algorithm": {
200
+ "description": "Algorithm DID (did:op:...)",
201
+ "name": "algorithm"
203
202
  }
204
203
  },
205
204
  "description": "Compute the algorithm on one or more datasets.",
206
205
  "examples": [
207
- "<%= config.bin %> <%= command.id %> did:op:34e2f... -d did:op:d8a36... -d did:op:12b45...",
208
- "<%= config.bin %> <%= command.id %> did:op:34e2f... -t tag1 -t tag2"
206
+ "<%= config.bin %> <%= command.id %> <algorithmDid> -d <datasetDid1> <datasetDid2> ...",
207
+ "<%= config.bin %> <%= command.id %> <algorithmDid> -t <tag1> -t <tag2> ..."
209
208
  ],
210
209
  "flags": {
211
210
  "datasets": {
212
211
  "char": "d",
213
- "description": "Dataset DIDs",
212
+ "description": "Dataset DIDs (did:op:...)",
214
213
  "name": "datasets",
215
- "required": false,
216
- "hasDynamicHelp": false,
217
- "multiple": true,
218
- "type": "option"
219
- },
220
- "tags": {
221
- "char": "t",
222
- "description": "Tags to filter datasets (they must have all the provided tags)",
223
- "name": "tags",
224
- "required": false,
225
214
  "hasDynamicHelp": false,
226
215
  "multiple": true,
227
216
  "type": "option"
@@ -230,9 +219,28 @@
230
219
  "char": "y",
231
220
  "description": "Automatic yes to prompts",
232
221
  "name": "yes",
233
- "required": false,
234
222
  "allowNo": false,
235
223
  "type": "boolean"
224
+ },
225
+ "manifest": {
226
+ "char": "m",
227
+ "description": "Path to manifest file with the accounts to use for authentication",
228
+ "name": "manifest",
229
+ "hasDynamicHelp": false,
230
+ "multiple": false,
231
+ "type": "option"
232
+ },
233
+ "network": {
234
+ "char": "n",
235
+ "description": "Network to use (env: NETWORK)",
236
+ "name": "network",
237
+ "hasDynamicHelp": false,
238
+ "multiple": false,
239
+ "options": [
240
+ "PONTUSXDEV",
241
+ "PONTUSXTEST"
242
+ ],
243
+ "type": "option"
236
244
  }
237
245
  },
238
246
  "hasDynamicHelp": false,
@@ -396,22 +404,24 @@
396
404
  },
397
405
  "edit-trusted-algos": {
398
406
  "aliases": [],
399
- "args": {
400
- "did": {
401
- "description": "DID of the asset",
402
- "name": "did",
403
- "required": true
404
- }
405
- },
406
- "description": "Overwrite the trusted algorithms for a data asset to the provided algorithm DIDs",
407
+ "args": {},
408
+ "description": "Overwrite datasets trusted algorithms",
407
409
  "examples": [
408
- "<%= config.bin %> <%= command.id %> did:op:ffeee8c8f19328985ef6743b08e61ef89d5141027fd47612e32e7900cacd2b7a --algos did:op:8f9994d01975cadd0196a2f7f811ed850e5d02a7223e7c5a31faaebe7371c81a did:op:0b970c95211cb8ef4574383386376646081bb7eb949b2a75e1e2171ea25949a7"
410
+ "<%= config.bin %> <%= command.id %> -d <datasetDid1> <datasetDid2> ... -a <algorithmDid1> <algorithmDid2> ..."
409
411
  ],
410
412
  "flags": {
411
- "algos": {
412
- "description": "Algorithm DIDs",
413
- "name": "algos",
414
- "required": true,
413
+ "datasets": {
414
+ "char": "d",
415
+ "description": "Dataset DIDs (did:op:...)",
416
+ "name": "datasets",
417
+ "hasDynamicHelp": false,
418
+ "multiple": true,
419
+ "type": "option"
420
+ },
421
+ "algorithms": {
422
+ "char": "a",
423
+ "description": "Trusted algorithm DIDs (did:op:...)",
424
+ "name": "algorithms",
415
425
  "hasDynamicHelp": false,
416
426
  "multiple": true,
417
427
  "type": "option"
@@ -422,6 +432,33 @@
422
432
  "name": "yes",
423
433
  "allowNo": false,
424
434
  "type": "boolean"
435
+ },
436
+ "manifest": {
437
+ "char": "m",
438
+ "description": "Path to manifest file with the accounts to use for authentication",
439
+ "name": "manifest",
440
+ "hasDynamicHelp": false,
441
+ "multiple": false,
442
+ "type": "option"
443
+ },
444
+ "public": {
445
+ "char": "p",
446
+ "description": "Make dataset public (set all algorithms as trusted)",
447
+ "name": "public",
448
+ "allowNo": false,
449
+ "type": "boolean"
450
+ },
451
+ "network": {
452
+ "char": "n",
453
+ "description": "Network to use (env: NETWORK)",
454
+ "name": "network",
455
+ "hasDynamicHelp": false,
456
+ "multiple": false,
457
+ "options": [
458
+ "PONTUSXDEV",
459
+ "PONTUSXTEST"
460
+ ],
461
+ "type": "option"
425
462
  }
426
463
  },
427
464
  "hasDynamicHelp": false,
@@ -439,6 +476,73 @@
439
476
  "edit-trusted-algos.js"
440
477
  ]
441
478
  },
479
+ "edit-trusted-publishers": {
480
+ "aliases": [],
481
+ "args": {},
482
+ "description": "Overwrite datasets trusted publishers",
483
+ "examples": [
484
+ "<%= config.bin %> <%= command.id %> -d <datasetDid1> <datasetDid2> ... -p <publisherDid1> <publisherDid2> ..."
485
+ ],
486
+ "flags": {
487
+ "datasets": {
488
+ "char": "d",
489
+ "description": "Dataset DIDs (did:op:...)",
490
+ "name": "datasets",
491
+ "hasDynamicHelp": false,
492
+ "multiple": true,
493
+ "type": "option"
494
+ },
495
+ "publishers": {
496
+ "char": "p",
497
+ "description": "Trusted publisher DIDs (did:op:...)",
498
+ "name": "publishers",
499
+ "hasDynamicHelp": false,
500
+ "multiple": true,
501
+ "type": "option"
502
+ },
503
+ "yes": {
504
+ "char": "y",
505
+ "description": "Skip confirmation prompt",
506
+ "name": "yes",
507
+ "allowNo": false,
508
+ "type": "boolean"
509
+ },
510
+ "manifest": {
511
+ "char": "m",
512
+ "description": "Path to manifest file with the accounts to use for authentication",
513
+ "name": "manifest",
514
+ "hasDynamicHelp": false,
515
+ "multiple": false,
516
+ "type": "option"
517
+ },
518
+ "network": {
519
+ "char": "n",
520
+ "description": "Network to use (env: NETWORK)",
521
+ "name": "network",
522
+ "hasDynamicHelp": false,
523
+ "multiple": false,
524
+ "options": [
525
+ "PONTUSXDEV",
526
+ "PONTUSXTEST"
527
+ ],
528
+ "type": "option"
529
+ }
530
+ },
531
+ "hasDynamicHelp": false,
532
+ "hiddenAliases": [],
533
+ "id": "edit-trusted-publishers",
534
+ "pluginAlias": "pontus-x_cli",
535
+ "pluginName": "pontus-x_cli",
536
+ "pluginType": "core",
537
+ "strict": true,
538
+ "enableJsonFlag": false,
539
+ "isESM": false,
540
+ "relativePath": [
541
+ "dist",
542
+ "commands",
543
+ "edit-trusted-publishers.js"
544
+ ]
545
+ },
442
546
  "export-private-key": {
443
547
  "aliases": [],
444
548
  "args": {},
@@ -872,7 +976,7 @@
872
976
  "args": {},
873
977
  "description": "Publisher revocation of one or more owned DIDs",
874
978
  "examples": [
875
- "<%= config.bin %> <%= command.id %> did:op:ffeee8c8f19328985ef6743b08e61ef89d5141027fd47612e32e7900cacd2b7a did:op:abcee8c8f19328985ef6743b08e61ef89d5141027fd47612e32e7900cacd2b7b"
979
+ "<%= config.bin %> <%= command.id %> -d did:op:ffeee8c8f19328985ef6743b08e61ef89d5141027fd47612e32e7900cacd2b7a did:op:abcee8c8f19328985ef6743b08e61ef89d5141027fd47612e32e7900cacd2b7b"
876
980
  ],
877
981
  "flags": {
878
982
  "dids": {
@@ -976,5 +1080,5 @@
976
1080
  ]
977
1081
  }
978
1082
  },
979
- "version": "1.1.4"
1083
+ "version": "1.2.5"
980
1084
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pontus-x_cli",
3
3
  "description": "Command Line Interface for the Pontus-X Data Space Ecosystem",
4
- "version": "1.1.4",
4
+ "version": "1.2.5",
5
5
  "author": "AgrospAI",
6
6
  "bin": {
7
7
  "pontus-x_cli": "bin/run.js"
@@ -11,6 +11,8 @@
11
11
  "@deltadao/nautilus": "^1.1.0",
12
12
  "@gaia-x/did-web-generator": "^1.1.0",
13
13
  "@gaia-x/json-web-signature-2020": "^2.3.0",
14
+ "@inquirer/prompts": "^8.2.0",
15
+ "@inquirer/search": "^4.1.0",
14
16
  "@oceanprotocol/ddo-js": "^0.1.3",
15
17
  "@oceanprotocol/lib": "^5.0.4",
16
18
  "@oclif/core": "^4",