agenticpool 1.0.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.
Files changed (69) hide show
  1. package/AGENTS.md +56 -0
  2. package/README.md +42 -0
  3. package/agenticpool-cli-1.0.0.tgz +0 -0
  4. package/dist/api/ApiClient.d.ts +24 -0
  5. package/dist/api/ApiClient.js +79 -0
  6. package/dist/api/index.d.ts +1 -0
  7. package/dist/api/index.js +6 -0
  8. package/dist/auth/AuthHelper.d.ts +16 -0
  9. package/dist/auth/AuthHelper.js +137 -0
  10. package/dist/commands/auth.d.ts +2 -0
  11. package/dist/commands/auth.js +166 -0
  12. package/dist/commands/config.d.ts +2 -0
  13. package/dist/commands/config.js +51 -0
  14. package/dist/commands/connections.d.ts +2 -0
  15. package/dist/commands/connections.js +244 -0
  16. package/dist/commands/contacts.d.ts +2 -0
  17. package/dist/commands/contacts.js +205 -0
  18. package/dist/commands/conversations.d.ts +2 -0
  19. package/dist/commands/conversations.js +209 -0
  20. package/dist/commands/humans.d.ts +2 -0
  21. package/dist/commands/humans.js +129 -0
  22. package/dist/commands/identities.d.ts +2 -0
  23. package/dist/commands/identities.js +120 -0
  24. package/dist/commands/index.d.ts +10 -0
  25. package/dist/commands/index.js +24 -0
  26. package/dist/commands/messages.d.ts +2 -0
  27. package/dist/commands/messages.js +72 -0
  28. package/dist/commands/networks.d.ts +2 -0
  29. package/dist/commands/networks.js +237 -0
  30. package/dist/commands/profile.d.ts +2 -0
  31. package/dist/commands/profile.js +204 -0
  32. package/dist/config/ConfigManager.d.ts +31 -0
  33. package/dist/config/ConfigManager.js +135 -0
  34. package/dist/config/index.d.ts +1 -0
  35. package/dist/config/index.js +7 -0
  36. package/dist/index.d.ts +2 -0
  37. package/dist/index.js +22 -0
  38. package/dist/limits/LimitsManager.d.ts +23 -0
  39. package/dist/limits/LimitsManager.js +99 -0
  40. package/jest.config.js +23 -0
  41. package/package.json +47 -0
  42. package/src/api/ApiClient.ts +100 -0
  43. package/src/api/index.ts +1 -0
  44. package/src/auth/AuthHelper.ts +123 -0
  45. package/src/commands/auth.ts +169 -0
  46. package/src/commands/config.ts +51 -0
  47. package/src/commands/connections.ts +261 -0
  48. package/src/commands/contacts.ts +221 -0
  49. package/src/commands/conversations.ts +218 -0
  50. package/src/commands/humans.ts +124 -0
  51. package/src/commands/identities.ts +126 -0
  52. package/src/commands/index.ts +10 -0
  53. package/src/commands/messages.ts +72 -0
  54. package/src/commands/networks.ts +245 -0
  55. package/src/commands/profile.ts +184 -0
  56. package/src/config/ConfigManager.ts +137 -0
  57. package/src/config/index.ts +1 -0
  58. package/src/index.ts +35 -0
  59. package/src/limits/LimitsManager.ts +76 -0
  60. package/tests/ApiClient.test.ts +99 -0
  61. package/tests/ConfigManager.test.ts +41 -0
  62. package/tests/LimitsManager.test.ts +169 -0
  63. package/tests/__mocks__/@toon-format/toon.ts +27 -0
  64. package/tests/integration/cleanup.ts +187 -0
  65. package/tests/integration/e2e-cli.test.ts +465 -0
  66. package/tests/integration/e2e.test.ts +480 -0
  67. package/tests/integration/run-e2e.sh +44 -0
  68. package/tests/integration/setup.ts +188 -0
  69. package/tsconfig.json +28 -0
@@ -0,0 +1,72 @@
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.registerMessageCommands = registerMessageCommands;
7
+ const AuthHelper_1 = require("../auth/AuthHelper");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ function registerMessageCommands(program) {
10
+ const messages = program.command('messages').description('Message commands');
11
+ messages
12
+ .command('send')
13
+ .description('Send a message to a conversation')
14
+ .requiredOption('-n, --network <id>', 'Network ID')
15
+ .requiredOption('-c, --conversation <id>', 'Conversation ID')
16
+ .requiredOption('-m, --message <text>', 'Message content')
17
+ .option('-t, --to <userId>', 'Recipient (omit for broadcast)')
18
+ .action(async (options) => {
19
+ try {
20
+ const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
21
+ const response = await client.post(`/v1/conversations/${options.network}/${options.conversation}/messages`, {
22
+ content: options.message,
23
+ receiverId: options.to || null
24
+ });
25
+ if (response.success) {
26
+ console.log(chalk_1.default.green('✓ Message sent!'));
27
+ }
28
+ else {
29
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to send message');
30
+ }
31
+ }
32
+ catch (error) {
33
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
34
+ }
35
+ });
36
+ messages
37
+ .command('list')
38
+ .description('List messages in a conversation')
39
+ .requiredOption('-n, --network <id>', 'Network ID')
40
+ .requiredOption('-c, --conversation <id>', 'Conversation ID')
41
+ .option('-l, --limit <num>', 'Number of messages', '50')
42
+ .action(async (options) => {
43
+ try {
44
+ const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
45
+ const response = await client.get(`/v1/conversations/${options.network}/${options.conversation}/messages`, {
46
+ limit: options.limit
47
+ });
48
+ if (response.success && response.data) {
49
+ if (response.data.length === 0) {
50
+ console.log(chalk_1.default.yellow('No messages yet.'));
51
+ return;
52
+ }
53
+ console.log(chalk_1.default.green.bold(`\nMessages (${response.data.length}):\n`));
54
+ response.data.forEach((msg) => {
55
+ const time = msg.createdAt ? new Date(msg.createdAt._seconds * 1000 || msg.createdAt).toLocaleTimeString() : '';
56
+ const from = chalk_1.default.cyan(msg.senderId);
57
+ const to = msg.receiverId ? chalk_1.default.yellow(`→ ${msg.receiverId}`) : chalk_1.default.gray('→ all');
58
+ console.log(`${chalk_1.default.gray(`[${time}]`)} ${from} ${to}`);
59
+ console.log(` ${msg.content}`);
60
+ console.log();
61
+ });
62
+ }
63
+ else {
64
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list messages');
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
69
+ }
70
+ });
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbWVzc2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFJQSwwREFtRUM7QUF0RUQsbURBQWdEO0FBQ2hELGtEQUEwQjtBQUUxQixTQUFnQix1QkFBdUIsQ0FBQyxPQUFnQjtJQUN0RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRTdFLFFBQVE7U0FDTCxPQUFPLENBQUMsTUFBTSxDQUFDO1NBQ2YsV0FBVyxDQUFDLGtDQUFrQyxDQUFDO1NBQy9DLGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUM7U0FDbEQsY0FBYyxDQUFDLHlCQUF5QixFQUFFLGlCQUFpQixDQUFDO1NBQzVELGNBQWMsQ0FBQyxzQkFBc0IsRUFBRSxpQkFBaUIsQ0FBQztTQUN6RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsZ0NBQWdDLENBQUM7U0FDN0QsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4QixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV6RSxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFlBQVksV0FBVyxFQUFFO2dCQUMxRyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLElBQUk7YUFDL0IsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLEtBQUss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O2dCQUNoQixDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7aUJBQU0sQ0FBQztnQkFDTixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLElBQUkseUJBQXlCLENBQUMsQ0FBQztZQUMzRixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0YsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgQXV0aEhlbHBlciB9IGZyb20gJy4uL2F1dGgvQXV0aEhlbHBlcic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJNZXNzYWdlQ29tbWFuZHMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBjb25zdCBtZXNzYWdlcyA9IHByb2dyYW0uY29tbWFuZCgnbWVzc2FnZXMnKS5kZXNjcmlwdGlvbignTWVzc2FnZSBjb21tYW5kcycpO1xuXG4gIG1lc3NhZ2VzXG4gICAgLmNvbW1hbmQoJ3NlbmQnKVxuICAgIC5kZXNjcmlwdGlvbignU2VuZCBhIG1lc3NhZ2UgdG8gYSBjb252ZXJzYXRpb24nKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWMsIC0tY29udmVyc2F0aW9uIDxpZD4nLCAnQ29udmVyc2F0aW9uIElEJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1tLCAtLW1lc3NhZ2UgPHRleHQ+JywgJ01lc3NhZ2UgY29udGVudCcpXG4gICAgLm9wdGlvbignLXQsIC0tdG8gPHVzZXJJZD4nLCAnUmVjaXBpZW50IChvbWl0IGZvciBicm9hZGNhc3QpJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL3YxL2NvbnZlcnNhdGlvbnMvJHtvcHRpb25zLm5ldHdvcmt9LyR7b3B0aW9ucy5jb252ZXJzYXRpb259L21lc3NhZ2VzYCwge1xuICAgICAgICAgIGNvbnRlbnQ6IG9wdGlvbnMubWVzc2FnZSxcbiAgICAgICAgICByZWNlaXZlcklkOiBvcHRpb25zLnRvIHx8IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIE1lc3NhZ2Ugc2VudCEnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHNlbmQgbWVzc2FnZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBtZXNzYWdlc1xuICAgIC5jb21tYW5kKCdsaXN0JylcbiAgICAuZGVzY3JpcHRpb24oJ0xpc3QgbWVzc2FnZXMgaW4gYSBjb252ZXJzYXRpb24nKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWMsIC0tY29udmVyc2F0aW9uIDxpZD4nLCAnQ29udmVyc2F0aW9uIElEJylcbiAgICAub3B0aW9uKCctbCwgLS1saW1pdCA8bnVtPicsICdOdW1iZXIgb2YgbWVzc2FnZXMnLCAnNTAnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSBhd2FpdCBBdXRoSGVscGVyLmVuc3VyZUF1dGhlbnRpY2F0ZWQob3B0aW9ucy5uZXR3b3JrKTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxhbnlbXT4oYC92MS9jb252ZXJzYXRpb25zLyR7b3B0aW9ucy5uZXR3b3JrfS8ke29wdGlvbnMuY29udmVyc2F0aW9ufS9tZXNzYWdlc2AsIHtcbiAgICAgICAgICBsaW1pdDogb3B0aW9ucy5saW1pdFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vIG1lc3NhZ2VzIHlldC4nKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChgXFxuTWVzc2FnZXMgKCR7cmVzcG9uc2UuZGF0YS5sZW5ndGh9KTpcXG5gKSk7XG4gICAgICAgICAgXG4gICAgICAgICAgcmVzcG9uc2UuZGF0YS5mb3JFYWNoKChtc2c6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGltZSA9IG1zZy5jcmVhdGVkQXQgPyBuZXcgRGF0ZShtc2cuY3JlYXRlZEF0Ll9zZWNvbmRzICogMTAwMCB8fCBtc2cuY3JlYXRlZEF0KS50b0xvY2FsZVRpbWVTdHJpbmcoKSA6ICcnO1xuICAgICAgICAgICAgY29uc3QgZnJvbSA9IGNoYWxrLmN5YW4obXNnLnNlbmRlcklkKTtcbiAgICAgICAgICAgIGNvbnN0IHRvID0gbXNnLnJlY2VpdmVySWQgPyBjaGFsay55ZWxsb3coYOKGkiAke21zZy5yZWNlaXZlcklkfWApIDogY2hhbGsuZ3JheSgn4oaSIGFsbCcpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5ncmF5KGBbJHt0aW1lfV1gKX0gJHtmcm9tfSAke3RvfWApO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYCAgJHttc2cuY29udGVudH1gKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGxpc3QgbWVzc2FnZXMnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerNetworkCommands(program: Command): void;
@@ -0,0 +1,237 @@
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.registerNetworkCommands = registerNetworkCommands;
7
+ const AuthHelper_1 = require("../auth/AuthHelper");
8
+ const LimitsManager_1 = require("../limits/LimitsManager");
9
+ const chalk_1 = __importDefault(require("chalk"));
10
+ function registerNetworkCommands(program) {
11
+ const networks = program.command('networks').description('Network management commands');
12
+ networks
13
+ .command('list')
14
+ .description('List public networks')
15
+ .option('-f, --filter <type>', 'Filter: popular, new, unpopular')
16
+ .option('-s, --short', 'Show short format (no long descriptions)')
17
+ .action(async (options) => {
18
+ try {
19
+ const client = await AuthHelper_1.AuthHelper.getApiClient();
20
+ const response = await client.get('/v1/networks', {
21
+ filter: options.filter,
22
+ short: options.short ? 'true' : undefined
23
+ });
24
+ if (response.success && response.data) {
25
+ console.log(chalk_1.default.green.bold(`\nFound ${response.data.length} networks:\n`));
26
+ response.data.forEach((network) => {
27
+ console.log(chalk_1.default.cyan.bold(network.name || network.id));
28
+ console.log(chalk_1.default.gray(' ID:'), network.id);
29
+ console.log(chalk_1.default.gray(' Description:'), network.description);
30
+ console.log(chalk_1.default.gray(' Users:'), network.users);
31
+ console.log(chalk_1.default.gray(' Status:'), network.status);
32
+ console.log();
33
+ });
34
+ }
35
+ else {
36
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list networks');
37
+ }
38
+ }
39
+ catch (error) {
40
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
41
+ }
42
+ });
43
+ networks
44
+ .command('create')
45
+ .description('Create a new network')
46
+ .requiredOption('-n, --name <name>', 'Network name')
47
+ .requiredOption('-d, --description <desc>', 'Short description')
48
+ .option('-l, --long-description <desc>', 'Long description (markdown)')
49
+ .option('--logo <url>', 'Logo URL')
50
+ .option('--private', 'Make network private')
51
+ .action(async (options) => {
52
+ try {
53
+ const { client } = await AuthHelper_1.AuthHelper.getFirstAuthenticatedClient();
54
+ const mineRes = await client.get('/v1/networks/mine');
55
+ const currentCount = mineRes.success && mineRes.data ? mineRes.data.length : 0;
56
+ const limitCheck = await LimitsManager_1.limitsManager.canCreateNetwork(currentCount);
57
+ if (!limitCheck.allowed) {
58
+ console.error(chalk_1.default.red('Limit:'), limitCheck.reason);
59
+ return;
60
+ }
61
+ const response = await client.post('/v1/networks', {
62
+ name: options.name,
63
+ description: options.description,
64
+ longDescription: options.longDescription || '',
65
+ logoUrl: options.logo || '',
66
+ isPublic: !options.private
67
+ });
68
+ if (response.success && response.data) {
69
+ const network = response.data;
70
+ console.log(chalk_1.default.green('✓ Network created successfully!'));
71
+ console.log(chalk_1.default.gray('ID:'), network.id);
72
+ }
73
+ else {
74
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to create network');
75
+ }
76
+ }
77
+ catch (error) {
78
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
79
+ }
80
+ });
81
+ networks
82
+ .command('mine')
83
+ .description('List your networks')
84
+ .option('-s, --short', 'Show short format')
85
+ .action(async (options) => {
86
+ try {
87
+ const { client } = await AuthHelper_1.AuthHelper.getFirstAuthenticatedClient();
88
+ const response = await client.get('/v1/networks/mine', {
89
+ short: options.short ? 'true' : undefined
90
+ });
91
+ if (response.success && response.data) {
92
+ if (response.data.length === 0) {
93
+ console.log(chalk_1.default.yellow('No networks found.'));
94
+ return;
95
+ }
96
+ console.log(chalk_1.default.green.bold(`\nYour networks (${response.data.length}):\n`));
97
+ response.data.forEach((network) => {
98
+ console.log(chalk_1.default.cyan.bold(network.name || network.id));
99
+ console.log(chalk_1.default.gray(' ID:'), network.id);
100
+ console.log(chalk_1.default.gray(' Description:'), network.description);
101
+ console.log();
102
+ });
103
+ }
104
+ else {
105
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list networks');
106
+ }
107
+ }
108
+ catch (error) {
109
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
110
+ }
111
+ });
112
+ networks
113
+ .command('show')
114
+ .description('Show network details')
115
+ .argument('<networkId>', 'Network ID')
116
+ .action(async (networkId) => {
117
+ try {
118
+ const client = await AuthHelper_1.AuthHelper.getApiClient();
119
+ const response = await client.get(`/v1/networks/${networkId}`);
120
+ if (response.success && response.data) {
121
+ const network = response.data;
122
+ console.log(chalk_1.default.cyan.bold(`\n${network.name}\n`));
123
+ console.log(chalk_1.default.gray('ID:'), network.id);
124
+ console.log(chalk_1.default.gray('Description:'), network.description);
125
+ console.log(chalk_1.default.gray('Status:'), network.status);
126
+ console.log(chalk_1.default.gray('Public:'), network.isPublic ? 'Yes' : 'No');
127
+ console.log(chalk_1.default.gray('Users:'), network.users);
128
+ if (network.longDescription) {
129
+ console.log(chalk_1.default.gray('\nLong Description:'));
130
+ console.log(network.longDescription);
131
+ }
132
+ }
133
+ else {
134
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Network not found');
135
+ }
136
+ }
137
+ catch (error) {
138
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
139
+ }
140
+ });
141
+ networks
142
+ .command('members')
143
+ .description('List network members')
144
+ .argument('<networkId>', 'Network ID')
145
+ .action(async (networkId) => {
146
+ try {
147
+ const client = await AuthHelper_1.AuthHelper.getApiClient();
148
+ const response = await client.get(`/v1/networks/${networkId}/members`);
149
+ if (response.success && response.data) {
150
+ console.log(chalk_1.default.green.bold(`\nMembers (${response.data.length}):\n`));
151
+ response.data.forEach((member) => {
152
+ console.log(chalk_1.default.cyan(member.publicToken));
153
+ console.log(chalk_1.default.gray(' Role:'), member.role);
154
+ console.log(chalk_1.default.gray(' Description:'), member.shortDescription || '(none)');
155
+ console.log();
156
+ });
157
+ }
158
+ else {
159
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to list members');
160
+ }
161
+ }
162
+ catch (error) {
163
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
164
+ }
165
+ });
166
+ networks
167
+ .command('join')
168
+ .description('Join a network (auto-register if needed)')
169
+ .argument('<networkId>', 'Network ID')
170
+ .action(async (networkId) => {
171
+ try {
172
+ const { client: authClient } = await AuthHelper_1.AuthHelper.getFirstAuthenticatedClient();
173
+ const mineRes = await authClient.get('/v1/networks/mine');
174
+ const currentCount = mineRes.success && mineRes.data ? mineRes.data.length : 0;
175
+ const limitCheck = await LimitsManager_1.limitsManager.canJoinNetwork(currentCount);
176
+ if (!limitCheck.allowed) {
177
+ console.error(chalk_1.default.red('Limit:'), limitCheck.reason);
178
+ return;
179
+ }
180
+ const result = await AuthHelper_1.AuthHelper.ensureAuthenticated(networkId);
181
+ if (result.isNewUser) {
182
+ console.log(chalk_1.default.green('✓ Joined network successfully!'));
183
+ }
184
+ else {
185
+ console.log(chalk_1.default.green('✓ Already authenticated to network.'));
186
+ }
187
+ console.log(chalk_1.default.gray('Network:'), networkId);
188
+ console.log(chalk_1.default.gray('Public Token:'), result.credentials.publicToken);
189
+ }
190
+ catch (error) {
191
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
192
+ }
193
+ });
194
+ networks
195
+ .command('discover')
196
+ .description('Discover networks by strategy')
197
+ .option('-s, --strategy <type>', 'Strategy: popular, newest, unpopular, recommended', 'popular')
198
+ .option('-l, --limit <number>', 'Limit results', '20')
199
+ .option('-n, --network <id>', 'Target network (for recommended strategy)')
200
+ .action(async (options) => {
201
+ try {
202
+ const client = await AuthHelper_1.AuthHelper.getApiClient();
203
+ const response = await client.get('/v1/networks/discover', {
204
+ strategy: options.strategy,
205
+ limit: options.limit,
206
+ network: options.network
207
+ });
208
+ if (response.success && response.data) {
209
+ const data = response.data;
210
+ console.log(chalk_1.default.green.bold(`\nDiscovered ${data.totalFound} networks (${options.strategy} strategy):\n`));
211
+ data.networks.forEach((network) => {
212
+ console.log(chalk_1.default.cyan.bold(network.name || network.id));
213
+ console.log(chalk_1.default.gray(' ID:'), network.id);
214
+ console.log(chalk_1.default.gray(' Description:'), network.description);
215
+ console.log(chalk_1.default.gray(' Users:'), network.users);
216
+ console.log(chalk_1.default.gray(' Status:'), network.status);
217
+ console.log();
218
+ });
219
+ if (data.recommendedForYou && data.recommendedForYou.length > 0) {
220
+ console.log(chalk_1.default.yellow.bold('\nRecommended for you:\n'));
221
+ data.recommendedForYou.forEach((rec) => {
222
+ console.log(chalk_1.default.cyan(` ${rec.networkId}`));
223
+ console.log(chalk_1.default.gray(' Reason:'), rec.reason);
224
+ console.log();
225
+ });
226
+ }
227
+ }
228
+ else {
229
+ console.error(chalk_1.default.red('Error:'), response.error?.message || 'Failed to discover networks');
230
+ }
231
+ }
232
+ catch (error) {
233
+ console.error(chalk_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
234
+ }
235
+ });
236
+ }
237
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0d29ya3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvbmV0d29ya3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFPQSwwREE2T0M7QUFqUEQsbURBQWdEO0FBQ2hELDJEQUF3RDtBQUN4RCxrREFBMEI7QUFFMUIsU0FBZ0IsdUJBQXVCLENBQUMsT0FBZ0I7SUFDdEQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUV4RixRQUFRO1NBQ0wsT0FBTyxDQUFDLE1BQU0sQ0FBQztTQUNmLFdBQVcsQ0FBQyxzQkFBc0IsQ0FBQztTQUNuQyxNQUFNLENBQUMscUJBQXFCLEVBQUUsaUNBQWlDLENBQUM7U0FDaEUsTUFBTSxDQUFDLGFBQWEsRUFBRSwwQ0FBMEMsQ0FBQztTQUNqRSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sdUJBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQVEsY0FBYyxFQUFFO2dCQUN2RCxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDMUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLENBQUMsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUU3RSxRQUFRLENBQUMsSUFBSSxDQUFD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b3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgY29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoSGVscGVyIH0gZnJvbSAnLi4vYXV0aC9BdXRoSGVscGVyJztcbmltcG9ydCB7IGxpbWl0c01hbmFnZXIgfSBmcm9tICcuLi9saW1pdHMvTGltaXRzTWFuYWdlcic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJOZXR3b3JrQ29tbWFuZHMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBjb25zdCBuZXR3b3JrcyA9IHByb2dyYW0uY29tbWFuZCgnbmV0d29ya3MnKS5kZXNjcmlwdGlvbignTmV0d29yayBtYW5hZ2VtZW50IGNvbW1hbmRzJyk7XG5cbiAgbmV0d29ya3NcbiAgICAuY29tbWFuZCgnbGlzdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdMaXN0IHB1YmxpYyBuZXR3b3JrcycpXG4gICAgLm9wdGlvbignLWYsIC0tZmlsdGVyIDx0eXBlPicsICdGaWx0ZXI6IHBvcHVsYXIsIG5ldywgdW5wb3B1bGFyJylcbiAgICAub3B0aW9uKCctcywgLS1zaG9ydCcsICdTaG93IHNob3J0IGZvcm1hdCAobm8gbG9uZyBkZXNjcmlwdGlvbnMpJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBBdXRoSGVscGVyLmdldEFwaUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55W10+KCcvdjEvbmV0d29ya3MnLCB7XG4gICAgICAgICAgZmlsdGVyOiBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICBzaG9ydDogb3B0aW9ucy5zaG9ydCA/ICd0cnVlJyA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChgXFxuRm91bmQgJHtyZXNwb25zZS5kYXRhLmxlbmd0aH0gbmV0d29ya3M6XFxuYCkpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJlc3BvbnNlLmRhdGEuZm9yRWFjaCgobmV0d29yazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQobmV0d29yay5uYW1lIHx8IG5ldHdvcmsuaWQpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgSUQ6JyksIG5ldHdvcmsuaWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBEZXNjcmlwdGlvbjonKSwgbmV0d29yay5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFVzZXJzOicpLCBuZXR3b3JrLnVzZXJzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgU3RhdHVzOicpLCBuZXR3b3JrLnN0YXR1cyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsaXN0IG5ldHdvcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIG5ldHdvcmtzXG4gICAgLmNvbW1hbmQoJ2NyZWF0ZScpXG4gICAgLmRlc2NyaXB0aW9uKCdDcmVhdGUgYSBuZXcgbmV0d29yaycpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uYW1lIDxuYW1lPicsICdOZXR3b3JrIG5hbWUnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWQsIC0tZGVzY3JpcHRpb24gPGRlc2M+JywgJ1Nob3J0IGRlc2NyaXB0aW9uJylcbiAgICAub3B0aW9uKCctbCwgLS1sb25nLWRlc2NyaXB0aW9uIDxkZXNjPicsICdMb25nIGRlc2NyaXB0aW9uIChtYXJrZG93biknKVxuICAgIC5vcHRpb24oJy0tbG9nbyA8dXJsPicsICdMb2dvIFVSTCcpXG4gICAgLm9wdGlvbignLS1wcml2YXRlJywgJ01ha2UgbmV0d29yayBwcml2YXRlJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5nZXRGaXJzdEF1dGhlbnRpY2F0ZWRDbGllbnQoKTtcblxuICAgICAgICBjb25zdCBtaW5lUmVzID0gYXdhaXQgY2xpZW50LmdldDxhbnlbXT4oJy92MS9uZXR3b3Jrcy9taW5lJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb3VudCA9IG1pbmVSZXMuc3VjY2VzcyAmJiBtaW5lUmVzLmRhdGEgPyBtaW5lUmVzLmRhdGEubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgbGltaXRDaGVjayA9IGF3YWl0IGxpbWl0c01hbmFnZXIuY2FuQ3JlYXRlTmV0d29yayhjdXJyZW50Q291bnQpO1xuICAgICAgICBpZiAoIWxpbWl0Q2hlY2suYWxsb3dlZCkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdMaW1pdDonKSwgbGltaXRDaGVjay5yZWFzb24pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoJy92MS9uZXR3b3JrcycsIHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICAgICAgbG9uZ0Rlc2NyaXB0aW9uOiBvcHRpb25zLmxvbmdEZXNjcmlwdGlvbiB8fCAnJyxcbiAgICAgICAgICBsb2dvVXJsOiBvcHRpb25zLmxvZ28gfHwgJycsXG4gICAgICAgICAgaXNQdWJsaWM6ICFvcHRpb25zLnByaXZhdGVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgIGNvbnN0IG5ldHdvcmsgPSByZXNwb25zZS5kYXRhIGFzIGFueTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIE5ldHdvcmsgY3JlYXRlZCBzdWNjZXNzZnVsbHkhJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0lEOicpLCBuZXR3b3JrLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY3JlYXRlIG5ldHdvcmsnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgbmV0d29ya3NcbiAgICAuY29tbWFuZCgnbWluZScpXG4gICAgLmRlc2NyaXB0aW9uKCdMaXN0IHlvdXIgbmV0d29ya3MnKVxuICAgIC5vcHRpb24oJy1zLCAtLXNob3J0JywgJ1Nob3cgc2hvcnQgZm9ybWF0JylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5nZXRGaXJzdEF1dGhlbnRpY2F0ZWRDbGllbnQoKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55W10+KCcvdjEvbmV0d29ya3MvbWluZScsIHtcbiAgICAgICAgICBzaG9ydDogb3B0aW9ucy5zaG9ydCA/ICd0cnVlJyA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vIG5ldHdvcmtzIGZvdW5kLicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKGBcXG5Zb3VyIG5ldHdvcmtzICgke3Jlc3BvbnNlLmRhdGEubGVuZ3RofSk6XFxuYCkpO1xuICAgICAgICAgIFxuICAgICAgICAgIHJlc3BvbnNlLmRhdGEuZm9yRWFjaCgobmV0d29yazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQobmV0d29yay5uYW1lIHx8IG5ldHdvcmsuaWQpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgSUQ6JyksIG5ldHdvcmsuaWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBEZXNjcmlwdGlvbjonKSwgbmV0d29yay5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsaXN0IG5ldHdvcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIG5ldHdvcmtzXG4gICAgLmNvbW1hbmQoJ3Nob3cnKVxuICAgIC5kZXNjcmlwdGlvbignU2hvdyBuZXR3b3JrIGRldGFpbHMnKVxuICAgIC5hcmd1bWVudCgnPG5ldHdvcmtJZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAobmV0d29ya0lkKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBBdXRoSGVscGVyLmdldEFwaUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55PihgL3YxL25ldHdvcmtzLyR7bmV0d29ya0lkfWApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBjb25zdCBuZXR3b3JrID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQoYFxcbiR7bmV0d29yay5uYW1lfVxcbmApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdJRDonKSwgbmV0d29yay5pZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnRGVzY3JpcHRpb246JyksIG5ldHdvcmsuZGVzY3JpcHRpb24pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1N0YXR1czonKSwgbmV0d29yay5zdGF0dXMpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1B1YmxpYzonKSwgbmV0d29yay5pc1B1YmxpYyA/ICdZZXMnIDogJ05vJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVXNlcnM6JyksIG5ldHdvcmsudXNlcnMpO1xuICAgICAgICAgIFxuICAgICAgICAgIGlmIChuZXR3b3JrLmxvbmdEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnXFxuTG9uZyBEZXNjcmlwdGlvbjonKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhuZXR3b3JrLmxvbmdEZXNjcmlwdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ05ldHdvcmsgbm90IGZvdW5kJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIG5ldHdvcmtzXG4gICAgLmNvbW1hbmQoJ21lbWJlcnMnKVxuICAgIC5kZXNjcmlwdGlvbignTGlzdCBuZXR3b3JrIG1lbWJlcnMnKVxuICAgIC5hcmd1bWVudCgnPG5ldHdvcmtJZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAobmV0d29ya0lkKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBBdXRoSGVscGVyLmdldEFwaUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55W10+KGAvdjEvbmV0d29ya3MvJHtuZXR3b3JrSWR9L21lbWJlcnNgKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChgXFxuTWVtYmVycyAoJHtyZXNwb25zZS5kYXRhLmxlbmd0aH0pOlxcbmApKTtcbiAgICAgICAgICBcbiAgICAgICAgICByZXNwb25zZS5kYXRhLmZvckVhY2goKG1lbWJlcjogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKG1lbWJlci5wdWJsaWNUb2tlbikpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBSb2xlOicpLCBtZW1iZXIucm9sZSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIERlc2NyaXB0aW9uOicpLCBtZW1iZXIuc2hvcnREZXNjcmlwdGlvbiB8fCAnKG5vbmUpJyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBsaXN0IG1lbWJlcnMnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgbmV0d29ya3NcbiAgICAuY29tbWFuZCgnam9pbicpXG4gICAgLmRlc2NyaXB0aW9uKCdKb2luIGEgbmV0d29yayAoYXV0by1yZWdpc3RlciBpZiBuZWVkZWQpJylcbiAgICAuYXJndW1lbnQoJzxuZXR3b3JrSWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG5ldHdvcmtJZCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQ6IGF1dGhDbGllbnQgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZ2V0Rmlyc3RBdXRoZW50aWNhdGVkQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IG1pbmVSZXMgPSBhd2FpdCBhdXRoQ2xpZW50LmdldDxhbnlbXT4oJy92MS9uZXR3b3Jrcy9taW5lJyk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb3VudCA9IG1pbmVSZXMuc3VjY2VzcyAmJiBtaW5lUmVzLmRhdGEgPyBtaW5lUmVzLmRhdGEubGVuZ3RoIDogMDtcbiAgICAgICAgY29uc3QgbGltaXRDaGVjayA9IGF3YWl0IGxpbWl0c01hbmFnZXIuY2FuSm9pbk5ldHdvcmsoY3VycmVudENvdW50KTtcbiAgICAgICAgaWYgKCFsaW1pdENoZWNrLmFsbG93ZWQpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnTGltaXQ6JyksIGxpbWl0Q2hlY2sucmVhc29uKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBBdXRoSGVscGVyLmVuc3VyZUF1dGhlbnRpY2F0ZWQobmV0d29ya0lkKTtcblxuICAgICAgICBpZiAocmVzdWx0LmlzTmV3VXNlcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgSm9pbmVkIG5ldHdvcmsgc3VjY2Vzc2Z1bGx5IScpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIEFscmVhZHkgYXV0aGVudGljYXRlZCB0byBuZXR3b3JrLicpKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdOZXR3b3JrOicpLCBuZXR3b3JrSWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdQdWJsaWMgVG9rZW46JyksIHJlc3VsdC5jcmVkZW50aWFscy5wdWJsaWNUb2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBuZXR3b3Jrc1xuICAgIC5jb21tYW5kKCdkaXNjb3ZlcicpXG4gICAgLmRlc2NyaXB0aW9uKCdEaXNjb3ZlciBuZXR3b3JrcyBieSBzdHJhdGVneScpXG4gICAgLm9wdGlvbignLXMsIC0tc3RyYXRlZ3kgPHR5cGU+JywgJ1N0cmF0ZWd5OiBwb3B1bGFyLCBuZXdlc3QsIHVucG9wdWxhciwgcmVjb21tZW5kZWQnLCAncG9wdWxhcicpXG4gICAgLm9wdGlvbignLWwsIC0tbGltaXQgPG51bWJlcj4nLCAnTGltaXQgcmVzdWx0cycsICcyMCcpXG4gICAgLm9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ1RhcmdldCBuZXR3b3JrIChmb3IgcmVjb21tZW5kZWQgc3RyYXRlZ3kpJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBBdXRoSGVscGVyLmdldEFwaUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55PignL3YxL25ldHdvcmtzL2Rpc2NvdmVyJywge1xuICAgICAgICAgIHN0cmF0ZWd5OiBvcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0LFxuICAgICAgICAgIG5ldHdvcms6IG9wdGlvbnMubmV0d29ya1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZChgXFxuRGlzY292ZXJlZCAke2RhdGEudG90YWxGb3VuZH0gbmV0d29ya3MgKCR7b3B0aW9ucy5zdHJhdGVneX0gc3RyYXRlZ3kpOlxcbmApKTtcblxuICAgICAgICAgIGRhdGEubmV0d29ya3MuZm9yRWFjaCgobmV0d29yazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQobmV0d29yay5uYW1lIHx8IG5ldHdvcmsuaWQpKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgSUQ6JyksIG5ldHdvcmsuaWQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBEZXNjcmlwdGlvbjonKSwgbmV0d29yay5kZXNjcmlwdGlvbik7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFVzZXJzOicpLCBuZXR3b3JrLnVzZXJzKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgU3RhdHVzOicpLCBuZXR3b3JrLnN0YXR1cyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKGRhdGEucmVjb21tZW5kZWRGb3JZb3UgJiYgZGF0YS5yZWNvbW1lbmRlZEZvcllvdS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3cuYm9sZCgnXFxuUmVjb21tZW5kZWQgZm9yIHlvdTpcXG4nKSk7XG4gICAgICAgICAgICBkYXRhLnJlY29tbWVuZGVkRm9yWW91LmZvckVhY2goKHJlYzogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYCAgJHtyZWMubmV0d29ya0lkfWApKTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBSZWFzb246JyksIHJlYy5yZWFzb24pO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBkaXNjb3ZlciBuZXR3b3JrcycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProfileCommands(program: Command): void;
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.registerProfileCommands = registerProfileCommands;
37
+ const AuthHelper_1 = require("../auth/AuthHelper");
38
+ const chalk = __importStar(require("chalk"));
39
+ function registerProfileCommands(program) {
40
+ const profile = program.command('profile').description('Profile management commands');
41
+ profile
42
+ .command('questions')
43
+ .description('Get profile questions for a network')
44
+ .requiredOption('-n, --network <id>', 'Network ID')
45
+ .action(async (options) => {
46
+ try {
47
+ const client = await AuthHelper_1.AuthHelper.getApiClient();
48
+ const response = await client.get(`/v1/networks/${options.network}/questions`);
49
+ if (response.success && response.data) {
50
+ if (response.data.length === 0) {
51
+ console.log(chalk.yellow('No profile questions for this network.'));
52
+ return;
53
+ }
54
+ console.log(chalk.green.bold('\nProfile Questions:\n'));
55
+ response.data.forEach((q, index) => {
56
+ console.log(chalk.cyan(`${index + 1}. ${q.question}`));
57
+ console.log(chalk.gray(` Required: ${q.required ? 'Yes' : 'No'}`));
58
+ console.log();
59
+ });
60
+ }
61
+ else {
62
+ console.error(chalk.red('Error:'), response.error?.message || 'Failed to get questions');
63
+ }
64
+ }
65
+ catch (error) {
66
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
67
+ }
68
+ });
69
+ profile
70
+ .command('set')
71
+ .description('Set your profile for a network')
72
+ .requiredOption('-n, --network <id>', 'Network ID')
73
+ .option('-s, --short <desc>', 'Short description')
74
+ .option('-l, --long <desc>', 'Long description')
75
+ .option('-f, --long-file <file>', 'Read long description from file')
76
+ .action(async (options) => {
77
+ try {
78
+ const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
79
+ let longDescription = options.long;
80
+ if (options.longFile) {
81
+ const filePath = options.longFile;
82
+ longDescription = require('fs').readFileSync(filePath, 'utf-8');
83
+ }
84
+ const updateData = {};
85
+ if (options.short)
86
+ updateData.shortDescription = options.short;
87
+ if (longDescription)
88
+ updateData.longDescription = longDescription;
89
+ const response = await client.put(`/v1/networks/${options.network}/profile`, updateData);
90
+ if (response.success) {
91
+ console.log(chalk.green('✓ Profile updated successfully!'));
92
+ }
93
+ else {
94
+ console.error(chalk.red('Error:'), response.error?.message || 'Failed to update profile');
95
+ }
96
+ }
97
+ catch (error) {
98
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
99
+ }
100
+ });
101
+ profile
102
+ .command('get')
103
+ .description('Get your profile for a network')
104
+ .requiredOption('-n, --network <id>', 'Network ID')
105
+ .action(async (options) => {
106
+ try {
107
+ const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
108
+ const response = await client.get(`/v1/networks/${options.network}/profile`);
109
+ if (response.success && response.data) {
110
+ const profile = response.data;
111
+ console.log(chalk.cyan.bold('\nYour Profile\n'));
112
+ console.log(chalk.gray('Public Token:'), credentials.publicToken);
113
+ console.log(chalk.gray('Role:'), profile.role || 'member');
114
+ console.log(chalk.gray('Short Description:'), profile.shortDescription || '(none)');
115
+ if (profile.longDescription) {
116
+ console.log(chalk.gray('\nLong Description:'));
117
+ console.log(profile.longDescription);
118
+ }
119
+ }
120
+ else {
121
+ console.error(chalk.red('Error:'), response.error?.message || 'Failed to get profile');
122
+ }
123
+ }
124
+ catch (error) {
125
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
126
+ }
127
+ });
128
+ profile
129
+ .command('build')
130
+ .description('Build profile interactively')
131
+ .requiredOption('-n, --network <id>', 'Network ID')
132
+ .option('-i, --interactive', 'Interactive mode', true)
133
+ .action(async (options) => {
134
+ try {
135
+ const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
136
+ const response = await client.get(`/v1/networks/${options.network}/questions`);
137
+ if (!response.success || !response.data || response.data.length === 0) {
138
+ console.log(chalk.yellow('No profile questions for this network.'));
139
+ return;
140
+ }
141
+ const questions = response.data;
142
+ const answers = {};
143
+ console.log(chalk.green.bold('\nBuilding Your Profile\n'));
144
+ console.log(chalk.gray(`Found ${questions.length} profile questions\n`));
145
+ for (let i = 0; i < questions.length; i++) {
146
+ const q = questions[i];
147
+ console.log(chalk.cyan(`${i + 1}. ${q.question}`));
148
+ console.log(chalk.gray(' Required:'), q.required ? 'Yes' : 'No');
149
+ if (q.required) {
150
+ const answer = await askQuestion(q.question + ' ');
151
+ if (!answer.trim()) {
152
+ console.error(chalk.red('Required question missing answer. Please try again.'));
153
+ process.exit(1);
154
+ }
155
+ answers[q.id || `question_${i}`] = answer;
156
+ }
157
+ else {
158
+ const answer = await askQuestion(q.question + ' (optional): ');
159
+ if (answer.trim()) {
160
+ answers[q.id || `question_${i}`] = answer;
161
+ }
162
+ }
163
+ console.log();
164
+ }
165
+ console.log(chalk.green.bold('\nCompleting profile...\n'));
166
+ const completeResponse = await client.post(`/v1/networks/${options.network}/profile/complete`, {
167
+ answers
168
+ });
169
+ if (completeResponse.success && completeResponse.data) {
170
+ const data = completeResponse.data;
171
+ console.log(chalk.green('✓ Profile built successfully!\n'));
172
+ console.log(chalk.cyan('Completion:'), `${data.completionPercentage}%`);
173
+ if (data.recommendations && data.recommendations.conversationsToJoin && data.recommendations.conversationsToJoin.length > 0) {
174
+ console.log(chalk.yellow('\nRecommended conversations to join:'));
175
+ data.recommendations.conversationsToJoin.forEach((convId) => {
176
+ console.log(chalk.gray(' -'), convId);
177
+ });
178
+ }
179
+ if (data.recommendations && data.recommendations.networkStrengths && data.recommendations.networkStrengths.length > 0) {
180
+ console.log(chalk.yellow('\nYour network strengths:'));
181
+ data.recommendations.networkStrengths.forEach((strength) => {
182
+ console.log(chalk.gray(' -'), strength);
183
+ });
184
+ }
185
+ }
186
+ else {
187
+ console.error(chalk.red('Error:'), completeResponse.error?.message || 'Failed to complete profile');
188
+ }
189
+ }
190
+ catch (error) {
191
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
192
+ }
193
+ });
194
+ }
195
+ async function askQuestion(prompt) {
196
+ return new Promise((resolve) => {
197
+ process.stdout.write(prompt);
198
+ process.stdin.setEncoding('utf-8');
199
+ process.stdin.once('data', (data) => {
200
+ resolve(data.toString().trim());
201
+ });
202
+ });
203
+ }
204
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wcm9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsMERBeUtDO0FBNUtELG1EQUFnRDtBQUNoRCw2Q0FBK0I7QUFFL0IsU0FBZ0IsdUJBQXVCLENBQUMsT0FBZ0I7SUFDdEQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFXLENBQUMsNkJBQTZCLENBQUMsQ0FBQztJQUV0RixPQUFPO1NBQ0osT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUNwQixXQUFXLENBQUMscUNBQXFDLENBQUM7U0FDbEQsY0FBYyxDQUFDLG9CQUFvQixFQUFFLFlBQVksQ0FBQztTQUNsRCxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sdUJBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxHQUFHLENBQVEsZ0JBQWdCLE9BQU8sQ0FBQyxPQUFPLFlBQVksQ0FBQyxDQUFDO1lBRXRGLElBQUksUUFBUSxDQUFDLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3RDLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQy9CLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDLENBQUM7b0JBQ3BFLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztnQkFFeEQsUUFBUSxDQUFDLElBQUks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Q0FBQyxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxJQUFJLDRCQUE0QixDQUFDLENBQUM7WUFDdEcsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQy9GLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFFRCxLQUFLLFVBQVUsV0FBVyxDQUFDLE1BQWM7SUFDdkMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgQXV0aEhlbHBlciB9IGZyb20gJy4uL2F1dGgvQXV0aEhlbHBlcic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclByb2ZpbGVDb21tYW5kcyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9ncmFtLmNvbW1hbmQoJ3Byb2ZpbGUnKS5kZXNjcmlwdGlvbignUHJvZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzJyk7XG5cbiAgcHJvZmlsZVxuICAgIC5jb21tYW5kKCdxdWVzdGlvbnMnKVxuICAgIC5kZXNjcmlwdGlvbignR2V0IHByb2ZpbGUgcXVlc3Rpb25zIGZvciBhIG5ldHdvcmsnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IEF1dGhIZWxwZXIuZ2V0QXBpQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxhbnlbXT4oYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vcXVlc3Rpb25zYCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdObyBwcm9maWxlIHF1ZXN0aW9ucyBmb3IgdGhpcyBuZXR3b3JrLicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKCdcXG5Qcm9maWxlIFF1ZXN0aW9uczpcXG4nKSk7XG5cbiAgICAgICAgICByZXNwb25zZS5kYXRhLmZvckVhY2goKHE6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgJHtpbmRleCArIDF9LiAke3EucXVlc3Rpb259YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAgUmVxdWlyZWQ6ICR7cS5yZXF1aXJlZCA/ICdZZXMnIDogJ05vJ31gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBnZXQgcXVlc3Rpb25zJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHByb2ZpbGVcbiAgICAuY29tbWFuZCgnc2V0JylcbiAgICAuZGVzY3JpcHRpb24oJ1NldCB5b3VyIHByb2ZpbGUgZm9yIGEgbmV0d29yaycpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLm9wdGlvbignLXMsIC0tc2hvcnQgPGRlc2M+JywgJ1Nob3J0IGRlc2NyaXB0aW9uJylcbiAgICAub3B0aW9uKCctbCwgLS1sb25nIDxkZXNjPicsICdMb25nIGRlc2NyaXB0aW9uJylcbiAgICAub3B0aW9uKCctZiwgLS1sb25nLWZpbGUgPGZpbGU+JywgJ1JlYWQgbG9uZyBkZXNjcmlwdGlvbiBmcm9tIGZpbGUnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuXG4gICAgICAgIGxldCBsb25nRGVzY3JpcHRpb24gPSBvcHRpb25zLmxvbmc7XG4gICAgICAgIGlmIChvcHRpb25zLmxvbmdGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBvcHRpb25zLmxvbmdGaWxlO1xuICAgICAgICAgIGxvbmdEZXNjcmlwdGlvbiA9IHJlcXVpcmUoJ2ZzJykucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVwZGF0ZURhdGE6IGFueSA9IHt9O1xuICAgICAgICBpZiAob3B0aW9ucy5zaG9ydCkgdXBkYXRlRGF0YS5zaG9ydERlc2NyaXB0aW9uID0gb3B0aW9ucy5zaG9ydDtcbiAgICAgICAgaWYgKGxvbmdEZXNjcmlwdGlvbikgdXBkYXRlRGF0YS5sb25nRGVzY3JpcHRpb24gPSBsb25nRGVzY3JpcHRpb247XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucHV0KGAvdjEvbmV0d29ya3MvJHtvcHRpb25zLm5ldHdvcmt9L3Byb2ZpbGVgLCB1cGRhdGVEYXRhKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgUHJvZmlsZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHVwZGF0ZSBwcm9maWxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHByb2ZpbGVcbiAgICAuY29tbWFuZCgnZ2V0JylcbiAgICAuZGVzY3JpcHRpb24oJ0dldCB5b3VyIHByb2ZpbGUgZm9yIGEgbmV0d29yaycpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCwgY3JlZGVudGlhbHMgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxhbnk+KGAvdjEvbmV0d29ya3MvJHtvcHRpb25zLm5ldHdvcmt9L3Byb2ZpbGVgKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgcHJvZmlsZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKCdcXG5Zb3VyIFByb2ZpbGVcXG4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnUHVibGljIFRva2VuOicpLCBjcmVkZW50aWFscy5wdWJsaWNUb2tlbik7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnUm9sZTonKSwgcHJvZmlsZS5yb2xlIHx8ICdtZW1iZXInKTtcbiAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnU2hvcnQgRGVzY3JpcHRpb246JyksIHByb2ZpbGUuc2hvcnREZXNjcmlwdGlvbiB8fCAnKG5vbmUpJyk7XG5cbiAgICAgICAgICBpZiAocHJvZmlsZS5sb25nRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1xcbkxvbmcgRGVzY3JpcHRpb246JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZmlsZS5sb25nRGVzY3JpcHRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZ2V0IHByb2ZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcHJvZmlsZVxuICAgIC5jb21tYW5kKCdidWlsZCcpXG4gICAgLmRlc2NyaXB0aW9uKCdCdWlsZCBwcm9maWxlIGludGVyYWN0aXZlbHknKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5vcHRpb24oJy1pLCAtLWludGVyYWN0aXZlJywgJ0ludGVyYWN0aXZlIG1vZGUnLCB0cnVlKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IGFueSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55W10+KGAvdjEvbmV0d29ya3MvJHtvcHRpb25zLm5ldHdvcmt9L3F1ZXN0aW9uc2ApO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2Uuc3VjY2VzcyB8fCAhcmVzcG9uc2UuZGF0YSB8fCByZXNwb25zZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnTm8gcHJvZmlsZSBxdWVzdGlvbnMgZm9yIHRoaXMgbmV0d29yay4nKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcXVlc3Rpb25zID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgY29uc3QgYW5zd2VyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoJ1xcbkJ1aWxkaW5nIFlvdXIgUHJvZmlsZVxcbicpKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgRm91bmQgJHtxdWVzdGlvbnMubGVuZ3RofSBwcm9maWxlIHF1ZXN0aW9uc1xcbmApKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHF1ZXN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHEgPSBxdWVzdGlvbnNbaV07XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgJHtpICsgMX0uICR7cS5xdWVzdGlvbn1gKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgUmVxdWlyZWQ6JyksIHEucmVxdWlyZWQgPyAnWWVzJyA6ICdObycpO1xuXG4gICAgICAgICAgaWYgKHEucmVxdWlyZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFza1F1ZXN0aW9uKHEucXVlc3Rpb24gKyAnICcpO1xuICAgICAgICAgICAgaWYgKCFhbnN3ZXIudHJpbSgpKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdSZXF1aXJlZCBxdWVzdGlvbiBtaXNzaW5nIGFuc3dlci4gUGxlYXNlIHRyeSBhZ2Fpbi4nKSk7XG4gICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFuc3dlcnNbcS5pZCB8fCBgcXVlc3Rpb25fJHtpfWBdID0gYW5zd2VyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBhc2tRdWVzdGlvbihxLnF1ZXN0aW9uICsgJyAob3B0aW9uYWwpOiAnKTtcbiAgICAgICAgICAgIGlmIChhbnN3ZXIudHJpbSgpKSB7XG4gICAgICAgICAgICAgIGFuc3dlcnNbcS5pZCB8fCBgcXVlc3Rpb25fJHtpfWBdID0gYW5zd2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKCdcXG5Db21wbGV0aW5nIHByb2ZpbGUuLi5cXG4nKSk7XG5cbiAgICAgICAgY29uc3QgY29tcGxldGVSZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvdjEvbmV0d29ya3MvJHtvcHRpb25zLm5ldHdvcmt9L3Byb2ZpbGUvY29tcGxldGVgLCB7XG4gICAgICAgICAgYW5zd2Vyc1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29tcGxldGVSZXNwb25zZS5zdWNjZXNzICYmIGNvbXBsZXRlUmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb21wbGV0ZVJlc3BvbnNlLmRhdGEgYXMgYW55O1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgUHJvZmlsZSBidWlsdCBzdWNjZXNzZnVsbHkhXFxuJykpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ0NvbXBsZXRpb246JyksIGAke2RhdGEuY29tcGxldGlvblBlcmNlbnRhZ2V9JWApO1xuXG4gICAgICAgICAgaWYgKGRhdGEucmVjb21tZW5kYXRpb25zICYmIGRhdGEucmVjb21tZW5kYXRpb25zLmNvbnZlcnNhdGlvbnNUb0pvaW4gJiYgZGF0YS5yZWNvbW1lbmRhdGlvbnMuY29udmVyc2F0aW9uc1RvSm9pbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcblJlY29tbWVuZGVkIGNvbnZlcnNhdGlvbnMgdG8gam9pbjonKSk7XG4gICAgICAgICAgICBkYXRhLnJlY29tbWVuZGF0aW9ucy5jb252ZXJzYXRpb25zVG9Kb2luLmZvckVhY2goKGNvbnZJZDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgLScpLCBjb252SWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRhdGEucmVjb21tZW5kYXRpb25zICYmIGRhdGEucmVjb21tZW5kYXRpb25zLm5ldHdvcmtTdHJlbmd0aHMgJiYgZGF0YS5yZWNvbW1lbmRhdGlvbnMubmV0d29ya1N0cmVuZ3Rocy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbllvdXIgbmV0d29yayBzdHJlbmd0aHM6JykpO1xuICAgICAgICAgICAgZGF0YS5yZWNvbW1lbmRhdGlvbnMubmV0d29ya1N0cmVuZ3Rocy5mb3JFYWNoKChzdHJlbmd0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgLScpLCBzdHJlbmd0aCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBjb21wbGV0ZVJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY29tcGxldGUgcHJvZmlsZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXNrUXVlc3Rpb24ocHJvbXB0OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShwcm9tcHQpO1xuICAgIHByb2Nlc3Muc3RkaW4uc2V0RW5jb2RpbmcoJ3V0Zi04Jyk7XG4gICAgcHJvY2Vzcy5zdGRpbi5vbmNlKCdkYXRhJywgKGRhdGEpID0+IHtcbiAgICAgIHJlc29sdmUoZGF0YS50b1N0cmluZygpLnRyaW0oKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19