agenticpool 1.0.18 → 2.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 (132) hide show
  1. package/README.md +68 -118
  2. package/bin/agenticpool.js +6 -0
  3. package/dist/adapters/autogen.d.ts +33 -0
  4. package/dist/adapters/autogen.d.ts.map +1 -0
  5. package/dist/adapters/autogen.js +49 -0
  6. package/dist/adapters/autogen.js.map +1 -0
  7. package/dist/adapters/crewai.d.ts +30 -0
  8. package/dist/adapters/crewai.d.ts.map +1 -0
  9. package/dist/adapters/crewai.js +48 -0
  10. package/dist/adapters/crewai.js.map +1 -0
  11. package/dist/adapters/langchain.d.ts +30 -0
  12. package/dist/adapters/langchain.d.ts.map +1 -0
  13. package/dist/adapters/langchain.js +53 -0
  14. package/dist/adapters/langchain.js.map +1 -0
  15. package/dist/adapters/llamaindex.d.ts +29 -0
  16. package/dist/adapters/llamaindex.d.ts.map +1 -0
  17. package/dist/adapters/llamaindex.js +47 -0
  18. package/dist/adapters/llamaindex.js.map +1 -0
  19. package/dist/adapters/openai.d.ts +21 -0
  20. package/dist/adapters/openai.d.ts.map +1 -0
  21. package/dist/adapters/openai.js +51 -0
  22. package/dist/adapters/openai.js.map +1 -0
  23. package/dist/cli.d.ts +3 -0
  24. package/dist/cli.d.ts.map +1 -0
  25. package/dist/cli.js +187 -0
  26. package/dist/cli.js.map +1 -0
  27. package/dist/client.d.ts +115 -0
  28. package/dist/client.d.ts.map +1 -0
  29. package/dist/client.js +251 -0
  30. package/dist/client.js.map +1 -0
  31. package/dist/commands/balance.d.ts +4 -0
  32. package/dist/commands/balance.d.ts.map +1 -0
  33. package/dist/commands/balance.js +34 -0
  34. package/dist/commands/balance.js.map +1 -0
  35. package/dist/commands/contract.d.ts +20 -0
  36. package/dist/commands/contract.d.ts.map +1 -0
  37. package/dist/commands/contract.js +188 -0
  38. package/dist/commands/contract.js.map +1 -0
  39. package/dist/commands/favor.d.ts +21 -0
  40. package/dist/commands/favor.d.ts.map +1 -0
  41. package/dist/commands/favor.js +144 -0
  42. package/dist/commands/favor.js.map +1 -0
  43. package/dist/commands/init.d.ts +5 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +77 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/reputation.d.ts +2 -0
  48. package/dist/commands/reputation.d.ts.map +1 -0
  49. package/dist/commands/reputation.js +38 -0
  50. package/dist/commands/reputation.js.map +1 -0
  51. package/dist/commands/serve.d.ts +7 -0
  52. package/dist/commands/serve.d.ts.map +1 -0
  53. package/dist/commands/serve.js +110 -0
  54. package/dist/commands/serve.js.map +1 -0
  55. package/dist/commands/services.d.ts +16 -0
  56. package/dist/commands/services.d.ts.map +1 -0
  57. package/dist/commands/services.js +93 -0
  58. package/dist/commands/services.js.map +1 -0
  59. package/dist/commands/trust.d.ts +2 -0
  60. package/dist/commands/trust.d.ts.map +1 -0
  61. package/dist/commands/trust.js +44 -0
  62. package/dist/commands/trust.js.map +1 -0
  63. package/dist/commands/whoami.d.ts +2 -0
  64. package/dist/commands/whoami.d.ts.map +1 -0
  65. package/dist/commands/whoami.js +32 -0
  66. package/dist/commands/whoami.js.map +1 -0
  67. package/dist/config.d.ts +30 -0
  68. package/dist/config.d.ts.map +1 -0
  69. package/dist/config.js +72 -0
  70. package/dist/config.js.map +1 -0
  71. package/dist/economy/duckies.d.ts +75 -0
  72. package/dist/economy/duckies.d.ts.map +1 -0
  73. package/dist/economy/duckies.js +386 -0
  74. package/dist/economy/duckies.js.map +1 -0
  75. package/dist/index.d.ts +12 -2
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +12 -29
  78. package/dist/index.js.map +1 -0
  79. package/dist/types.d.ts +90 -0
  80. package/dist/types.d.ts.map +1 -0
  81. package/dist/types.js +5 -0
  82. package/dist/types.js.map +1 -0
  83. package/package.json +28 -38
  84. package/LICENSE +0 -1
  85. package/dist/api/ApiClient.d.ts +0 -37
  86. package/dist/api/ApiClient.js +0 -160
  87. package/dist/api/index.d.ts +0 -1
  88. package/dist/api/index.js +0 -6
  89. package/dist/auth/AuthHelper.d.ts +0 -17
  90. package/dist/auth/AuthHelper.js +0 -197
  91. package/dist/commands/auth.d.ts +0 -2
  92. package/dist/commands/auth.js +0 -206
  93. package/dist/commands/config.d.ts +0 -2
  94. package/dist/commands/config.js +0 -51
  95. package/dist/commands/connections.d.ts +0 -2
  96. package/dist/commands/connections.js +0 -244
  97. package/dist/commands/contacts.d.ts +0 -2
  98. package/dist/commands/contacts.js +0 -205
  99. package/dist/commands/conversations.d.ts +0 -2
  100. package/dist/commands/conversations.js +0 -251
  101. package/dist/commands/errors.d.ts +0 -2
  102. package/dist/commands/errors.js +0 -73
  103. package/dist/commands/humans.d.ts +0 -2
  104. package/dist/commands/humans.js +0 -161
  105. package/dist/commands/identities.d.ts +0 -2
  106. package/dist/commands/identities.js +0 -141
  107. package/dist/commands/index.d.ts +0 -11
  108. package/dist/commands/index.js +0 -26
  109. package/dist/commands/messages.d.ts +0 -2
  110. package/dist/commands/messages.js +0 -154
  111. package/dist/commands/networks.d.ts +0 -2
  112. package/dist/commands/networks.js +0 -430
  113. package/dist/commands/profile.d.ts +0 -2
  114. package/dist/commands/profile.js +0 -225
  115. package/dist/config/ConfigManager.d.ts +0 -47
  116. package/dist/config/ConfigManager.js +0 -234
  117. package/dist/config/index.d.ts +0 -1
  118. package/dist/config/index.js +0 -7
  119. package/dist/datamodel/index.d.ts +0 -3
  120. package/dist/datamodel/index.js +0 -20
  121. package/dist/datamodel/models/humans.d.ts +0 -81
  122. package/dist/datamodel/models/humans.js +0 -3
  123. package/dist/datamodel/models/index.d.ts +0 -110
  124. package/dist/datamodel/models/index.js +0 -3
  125. package/dist/datamodel/toon/index.d.ts +0 -5
  126. package/dist/datamodel/toon/index.js +0 -211
  127. package/dist/limits/LimitsManager.d.ts +0 -23
  128. package/dist/limits/LimitsManager.js +0 -99
  129. package/dist/utils/colors.d.ts +0 -16
  130. package/dist/utils/colors.js +0 -23
  131. package/dist/utils/logger.d.ts +0 -11
  132. package/dist/utils/logger.js +0 -34
@@ -1,206 +0,0 @@
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.registerAuthCommands = registerAuthCommands;
7
- const config_1 = require("../config");
8
- const AuthHelper_1 = require("../auth/AuthHelper");
9
- const logger_1 = require("../utils/logger");
10
- const colors_1 = __importDefault(require("../utils/colors"));
11
- function registerAuthCommands(program) {
12
- const auth = program.command('auth').description('Authentication commands');
13
- auth
14
- .command('connect')
15
- .description('Connect to a network (auto-register if needed)')
16
- .argument('<networkId>', 'Network ID')
17
- .option('-k, --private-key <key>', 'Existing private key (optional)')
18
- .option('-r, --reason <text>', 'Reason for joining this network (for local records)')
19
- .action(async (networkId, options) => {
20
- try {
21
- logger_1.logger.info(`Connecting to network: ${networkId}...`);
22
- const result = await AuthHelper_1.AuthHelper.ensureAuthenticated(networkId, options.reason);
23
- if (result.isNewUser) {
24
- logger_1.logger.success('✓ Registered and connected!');
25
- }
26
- else {
27
- logger_1.logger.success('✓ Connected!');
28
- }
29
- // Record the network and reason locally
30
- await config_1.configManager.addRegisteredNetwork(networkId, options.reason);
31
- console.log(colors_1.default.gray('Network:'), networkId);
32
- console.log(colors_1.default.gray('Public Token:'), result.credentials.publicToken);
33
- if (options.reason) {
34
- console.log(colors_1.default.gray('Reason:'), options.reason);
35
- }
36
- if (result.credentials.expiresAt) {
37
- const expires = new Date(result.credentials.expiresAt);
38
- console.log(colors_1.default.gray('Token expires:'), expires.toISOString());
39
- }
40
- }
41
- catch (error) {
42
- logger_1.logger.error('\nError:', error instanceof Error ? error.message : 'Unknown error');
43
- }
44
- });
45
- auth
46
- .command('disconnect')
47
- .description('Disconnect from a network')
48
- .argument('<networkId>', 'Network ID')
49
- .action(async (networkId) => {
50
- await config_1.configManager.clearCredentials(networkId);
51
- logger_1.logger.success(`✓ Disconnected from network: ${networkId}`);
52
- });
53
- auth
54
- .command('generate-keys')
55
- .description('Generate a new public token and private key pair')
56
- .option('--force', 'Force generation of new keys even if they exist')
57
- .action(async (options) => {
58
- try {
59
- const existing = await config_1.configManager.getDefaultIdentity();
60
- if (existing && !options.force) {
61
- logger_1.logger.warn('Default identity already exists. Use --force to overwrite.');
62
- console.log(colors_1.default.cyan.bold('Public Token:'), colors_1.default.white(existing.publicToken));
63
- return;
64
- }
65
- logger_1.logger.info('Requesting new key pair from server...');
66
- const client = await AuthHelper_1.AuthHelper.getApiClient();
67
- const response = await client.get('/v1/auth/generate-keys');
68
- if (response.success && response.data) {
69
- await config_1.configManager.saveDefaultIdentity({
70
- publicToken: response.data.publicToken,
71
- privateKey: response.data.privateKey
72
- });
73
- logger_1.logger.success('✓ Keys generated and saved as default identity!\n');
74
- console.log(colors_1.default.cyan.bold('Public Token:'), colors_1.default.white(response.data.publicToken));
75
- console.log(colors_1.default.cyan.bold('Private Key: '), colors_1.default.yellow(response.data.privateKey));
76
- console.log(colors_1.default.red('\n⚠️ CRITICAL: Save your private key now if you want to use it on other devices.'));
77
- }
78
- else {
79
- logger_1.logger.error('Error:', response.error?.message || 'Failed to generate keys');
80
- }
81
- }
82
- catch (error) {
83
- logger_1.logger.error('Error:', error instanceof Error ? error.message : 'Unknown error');
84
- }
85
- });
86
- auth
87
- .command('identity')
88
- .description('Show your current default identity (public token)')
89
- .action(async () => {
90
- const identity = await config_1.configManager.getDefaultIdentity();
91
- if (identity) {
92
- console.log(colors_1.default.cyan.bold('Public Token:'), colors_1.default.white(identity.publicToken));
93
- }
94
- else {
95
- logger_1.logger.warn('No default identity found. Run "agenticpool auth generate-keys" first.');
96
- }
97
- });
98
- auth
99
- .command('register')
100
- .description('Register in a network')
101
- .requiredOption('-n, --network <id>', 'Network ID')
102
- .requiredOption('-p, --public-token <token>', 'Your public token')
103
- .requiredOption('-k, --private-key <key>', 'Your private key')
104
- .option('-r, --reason <text>', 'Reason for registering')
105
- .action(async (options) => {
106
- try {
107
- logger_1.logger.info(`Registering in ${options.network}...`);
108
- const client = await AuthHelper_1.AuthHelper.getApiClient();
109
- const response = await client.post('/v1/auth/register', {
110
- networkId: options.network,
111
- publicToken: options.publicToken,
112
- privateKey: options.privateKey,
113
- reason: options.reason
114
- });
115
- if (response.success && response.data) {
116
- const data = response.data;
117
- await config_1.configManager.saveCredentials(options.network, {
118
- publicToken: options.publicToken,
119
- privateKey: options.privateKey,
120
- jwt: data.tokens.jwt,
121
- expiresAt: data.tokens.expiresAt
122
- });
123
- await config_1.configManager.addRegisteredNetwork(options.network, options.reason);
124
- logger_1.logger.success('✓ Registered successfully!');
125
- console.log(colors_1.default.gray('Credentials saved locally.'));
126
- }
127
- else {
128
- logger_1.logger.error('Error:', response.error?.message || 'Registration failed');
129
- }
130
- }
131
- catch (error) {
132
- logger_1.logger.error('Error:', error instanceof Error ? error.message : 'Unknown error');
133
- }
134
- });
135
- auth
136
- .command('login')
137
- .description('Login to a network')
138
- .requiredOption('-n, --network <id>', 'Network ID')
139
- .requiredOption('-p, --public-token <token>', 'Your public token')
140
- .requiredOption('-k, --private-key <key>', 'Your private key')
141
- .option('-r, --reason <text>', 'Reason for login')
142
- .action(async (options) => {
143
- try {
144
- logger_1.logger.info(`Logging in to ${options.network}...`);
145
- const client = await AuthHelper_1.AuthHelper.getApiClient();
146
- const response = await client.post('/v1/auth/login', {
147
- networkId: options.network,
148
- publicToken: options.publicToken,
149
- privateKey: options.privateKey,
150
- reason: options.reason
151
- });
152
- if (response.success && response.data) {
153
- const tokens = response.data;
154
- await config_1.configManager.saveCredentials(options.network, {
155
- publicToken: options.publicToken,
156
- privateKey: options.privateKey,
157
- jwt: tokens.jwt,
158
- expiresAt: tokens.expiresAt
159
- });
160
- await config_1.configManager.addRegisteredNetwork(options.network, options.reason);
161
- logger_1.logger.success('✓ Logged in successfully!');
162
- console.log(colors_1.default.gray('New JWT session established.'));
163
- }
164
- else {
165
- logger_1.logger.error('Error:', response.error?.message || 'Login failed');
166
- }
167
- }
168
- catch (error) {
169
- logger_1.logger.error('Error:', error instanceof Error ? error.message : 'Unknown error');
170
- }
171
- });
172
- auth
173
- .command('logout')
174
- .description('Logout from a network')
175
- .requiredOption('-n, --network <id>', 'Network ID')
176
- .action(async (options) => {
177
- await config_1.configManager.clearCredentials(options.network);
178
- logger_1.logger.success(`✓ Logged out from network: ${options.network}`);
179
- });
180
- auth
181
- .command('status')
182
- .description('Show authentication status')
183
- .option('-n, --network <id>', 'Network ID to check')
184
- .action(async (options) => {
185
- const config = await config_1.configManager.getGlobalConfig();
186
- console.log(colors_1.default.cyan('API URL:'), config.apiUrl);
187
- console.log(colors_1.default.cyan('Format:'), config.defaultFormat);
188
- console.log(colors_1.default.cyan('Config dir:'), config_1.configManager.getConfigPath());
189
- if (options.network) {
190
- const creds = await config_1.configManager.getCredentials(options.network);
191
- if (creds) {
192
- console.log(colors_1.default.cyan('\nNetwork:'), options.network);
193
- console.log(colors_1.default.cyan('Public Token:'), creds.publicToken);
194
- if (creds.expiresAt) {
195
- const valid = Date.now() < creds.expiresAt;
196
- console.log(colors_1.default.cyan('Token valid:'), valid ? colors_1.default.green('Yes') : colors_1.default.red('No (expired)'));
197
- console.log(colors_1.default.cyan('Expires:'), new Date(creds.expiresAt).toISOString());
198
- }
199
- }
200
- else {
201
- logger_1.logger.warn(`\nNot connected to network: ${options.network}`);
202
- }
203
- }
204
- });
205
- }
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBT0Esb0RBNE1DO0FBak5ELHNDQUEwQztBQUMxQyxtREFBZ0Q7QUFDaEQsNENBQXlDO0FBQ3pDLDZEQUFvQztBQUVwQyxTQUFnQixvQkFBb0IsQ0FBQyxPQUFnQjtJQUNuRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRTVFLElBQUk7U0FDRCxPQUFPLENBQUMsU0FBUyxDQUFDO1NBQ2xCLFdBQVcsQ0FBQyxnREFBZ0QsQ0FBQztTQUM3RCxRQUFRLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQztTQUNyQyxNQUFNLENBQUMseUJBQXlCLEVBQUUsaUNBQWlDLENBQUM7U0FDcEUsTUFBTSxDQUFDLHFCQUFxQixFQUFFLHFEQUFxRCxDQUFDO1NBQ3BGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ25DLElBQUksQ0FBQztZQUNILGVBQU0sQ0FBQyxJQUFJLENBQUMsMEJBQTBCLFNBQVMsS0FBSyxDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsTUFBTSx1QkFBVSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFL0UsSUFBSSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3JCLGVBQU0sQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUNoRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sZUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqQyxDQUFDO1lBRUQsd0NBQXdDO1lBQ3hDLE1BQU0sc0JBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0s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QUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBBcGlDbGllbnQgfSBmcm9tICcuLi9hcGknO1xuaW1wb3J0IHsgY29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBBdXRoSGVscGVyIH0gZnJvbSAnLi4vYXV0aC9BdXRoSGVscGVyJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnLi4vdXRpbHMvY29sb3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQXV0aENvbW1hbmRzKHByb2dyYW06IENvbW1hbmQpOiB2b2lkIHtcbiAgY29uc3QgYXV0aCA9IHByb2dyYW0uY29tbWFuZCgnYXV0aCcpLmRlc2NyaXB0aW9uKCdBdXRoZW50aWNhdGlvbiBjb21tYW5kcycpO1xuXG4gIGF1dGhcbiAgICAuY29tbWFuZCgnY29ubmVjdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdDb25uZWN0IHRvIGEgbmV0d29yayAoYXV0by1yZWdpc3RlciBpZiBuZWVkZWQpJylcbiAgICAuYXJndW1lbnQoJzxuZXR3b3JrSWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5vcHRpb24oJy1rLCAtLXByaXZhdGUta2V5IDxrZXk+JywgJ0V4aXN0aW5nIHByaXZhdGUga2V5IChvcHRpb25hbCknKVxuICAgIC5vcHRpb24oJy1yLCAtLXJlYXNvbiA8dGV4dD4nLCAnUmVhc29uIGZvciBqb2luaW5nIHRoaXMgbmV0d29yayAoZm9yIGxvY2FsIHJlY29yZHMpJylcbiAgICAuYWN0aW9uKGFzeW5jIChuZXR3b3JrSWQsIG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBDb25uZWN0aW5nIHRvIG5ldHdvcms6ICR7bmV0d29ya0lkfS4uLmApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBBdXRoSGVscGVyLmVuc3VyZUF1dGhlbnRpY2F0ZWQobmV0d29ya0lkLCBvcHRpb25zLnJlYXNvbik7XG4gICAgICAgIFxuICAgICAgICBpZiAocmVzdWx0LmlzTmV3VXNlcikge1xuICAgICAgICAgIGxvZ2dlci5zdWNjZXNzKCfinJMgUmVnaXN0ZXJlZCBhbmQgY29ubmVjdGVkIScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5zdWNjZXNzKCfinJMgQ29ubmVjdGVkIScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVjb3JkIHRoZSBuZXR3b3JrIGFuZCByZWFzb24gbG9jYWxseVxuICAgICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLmFkZFJlZ2lzdGVyZWROZXR3b3JrKG5ldHdvcmtJZCwgb3B0aW9ucy5yZWFzb24pO1xuICAgICAgICBcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnTmV0d29yazonKSwgbmV0d29ya0lkKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnUHVibGljIFRva2VuOicpLCByZXN1bHQuY3JlZGVudGlhbHMucHVibGljVG9rZW4pO1xuICAgICAgICBpZiAob3B0aW9ucy5yZWFzb24pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdSZWFzb246JyksIG9wdGlvbnMucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHJlc3VsdC5jcmVkZW50aWFscy5leHBpcmVzQXQpIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzID0gbmV3IERhdGUocmVzdWx0LmNyZWRlbnRpYWxzLmV4cGlyZXNBdCk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVG9rZW4gZXhwaXJlczonKSwgZXhwaXJlcy50b0lTT1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdcXG5FcnJvcjonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgYXV0aFxuICAgIC5jb21tYW5kKCdkaXNjb25uZWN0JylcbiAgICAuZGVzY3JpcHRpb24oJ0Rpc2Nvbm5lY3QgZnJvbSBhIG5ldHdvcmsnKVxuICAgIC5hcmd1bWVudCgnPG5ldHdvcmtJZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAobmV0d29ya0lkKSA9PiB7XG4gICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLmNsZWFyQ3JlZGVudGlhbHMobmV0d29ya0lkKTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgRGlzY29ubmVjdGVkIGZyb20gbmV0d29yazogJHtuZXR3b3JrSWR9YCk7XG4gICAgfSk7XG5cbiAgYXV0aFxuICAgIC5jb21tYW5kKCdnZW5lcmF0ZS1rZXlzJylcbiAgICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIGEgbmV3IHB1YmxpYyB0b2tlbiBhbmQgcHJpdmF0ZSBrZXkgcGFpcicpXG4gICAgLm9wdGlvbignLS1mb3JjZScsICdGb3JjZSBnZW5lcmF0aW9uIG9mIG5ldyBrZXlzIGV2ZW4gaWYgdGhleSBleGlzdCcpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCBjb25maWdNYW5hZ2VyLmdldERlZmF1bHRJZGVudGl0eSgpO1xuICAgICAgICBpZiAoZXhpc3RpbmcgJiYgIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgICAgICBsb2dnZXIud2FybignRGVmYXVsdCBpZGVudGl0eSBhbHJlYWR5IGV4aXN0cy4gVXNlIC0tZm9yY2UgdG8gb3ZlcndyaXRlLicpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZCgnUHVibGljIFRva2VuOicpLCBjaGFsay53aGl0ZShleGlzdGluZy5wdWJsaWNUb2tlbikpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZ2dlci5pbmZvKCdSZXF1ZXN0aW5nIG5ldyBrZXkgcGFpciBmcm9tIHNlcnZlci4uLicpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBBdXRoSGVscGVyLmdldEFwaUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8eyBwdWJsaWNUb2tlbjogc3RyaW5nOyBwcml2YXRlS2V5OiBzdHJpbmcgfT4oJy92MS9hdXRoL2dlbmVyYXRlLWtleXMnKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zYXZlRGVmYXVsdElkZW50aXR5KHtcbiAgICAgICAgICAgIHB1YmxpY1Rva2VuOiByZXNwb25zZS5kYXRhLnB1YmxpY1Rva2VuLFxuICAgICAgICAgICAgcHJpdmF0ZUtleTogcmVzcG9uc2UuZGF0YS5wcml2YXRlS2V5XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsb2dnZXIuc3VjY2Vzcygn4pyTIEtleXMgZ2VuZXJhdGVkIGFuZCBzYXZlZCBhcyBkZWZhdWx0IGlkZW50aXR5IVxcbicpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4uYm9sZCgnUHVibGljIFRva2VuOicpLCBjaGFsay53aGl0ZShyZXNwb25zZS5kYXRhLnB1YmxpY1Rva2VuKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKCdQcml2YXRlIEtleTogJyksIGNoYWxrLnllbGxvdyhyZXNwb25zZS5kYXRhLnByaXZhdGVLZXkpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ1xcbuKaoO+4jyAgQ1JJVElDQUw6IFNhdmUgeW91ciBwcml2YXRlIGtleSBub3cgaWYgeW91IHdhbnQgdG8gdXNlIGl0IG9uIG90aGVyIGRldmljZXMuJykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3I6JywgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBnZW5lcmF0ZSBrZXlzJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3I6JywgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGF1dGhcbiAgICAuY29tbWFuZCgnaWRlbnRpdHknKVxuICAgIC5kZXNjcmlwdGlvbignU2hvdyB5b3VyIGN1cnJlbnQgZGVmYXVsdCBpZGVudGl0eSAocHVibGljIHRva2VuKScpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdElkZW50aXR5KCk7XG4gICAgICBpZiAoaWRlbnRpdHkpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKCdQdWJsaWMgVG9rZW46JyksIGNoYWxrLndoaXRlKGlkZW50aXR5LnB1YmxpY1Rva2VuKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIud2FybignTm8gZGVmYXVsdCBpZGVudGl0eSBmb3VuZC4gUnVuIFwiYWdlbnRpY3Bvb2wgYXV0aCBnZW5lcmF0ZS1rZXlzXCIgZmlyc3QuJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgYXV0aFxuICAgIC5jb21tYW5kKCdyZWdpc3RlcicpXG4gICAgLmRlc2NyaXB0aW9uKCdSZWdpc3RlciBpbiBhIG5ldHdvcmsnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLXAsIC0tcHVibGljLXRva2VuIDx0b2tlbj4nLCAnWW91ciBwdWJsaWMgdG9rZW4nKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWssIC0tcHJpdmF0ZS1rZXkgPGtleT4nLCAnWW91ciBwcml2YXRlIGtleScpXG4gICAgLm9wdGlvbignLXIsIC0tcmVhc29uIDx0ZXh0PicsICdSZWFzb24gZm9yIHJlZ2lzdGVyaW5nJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsb2dnZXIuaW5mbyhgUmVnaXN0ZXJpbmcgaW4gJHtvcHRpb25zLm5ldHdvcmt9Li4uYCk7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IEF1dGhIZWxwZXIuZ2V0QXBpQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoJy92MS9hdXRoL3JlZ2lzdGVyJywge1xuICAgICAgICAgIG5ldHdvcmtJZDogb3B0aW9ucy5uZXR3b3JrLFxuICAgICAgICAgIHB1YmxpY1Rva2VuOiBvcHRpb25zLnB1YmxpY1Rva2VuLFxuICAgICAgICAgIHByaXZhdGVLZXk6IG9wdGlvbnMucHJpdmF0ZUtleSxcbiAgICAgICAgICByZWFzb246IG9wdGlvbnMucmVhc29uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0gcmVzcG9uc2UuZGF0YSBhcyB7IG1lbWJlcjogYW55OyB0b2tlbnM6IGFueSB9O1xuICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuc2F2ZUNyZWRlbnRpYWxzKG9wdGlvbnMubmV0d29yaywge1xuICAgICAgICAgICAgcHVibGljVG9rZW46IG9wdGlvbnMucHVibGljVG9rZW4sXG4gICAgICAgICAgICBwcml2YXRlS2V5OiBvcHRpb25zLnByaXZhdGVLZXksXG4gICAgICAgICAgICBqd3Q6IGRhdGEudG9rZW5zLmp3dCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogZGF0YS50b2tlbnMuZXhwaXJlc0F0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5hZGRSZWdpc3RlcmVkTmV0d29yayhvcHRpb25zLm5ldHdvcmssIG9wdGlvbnMucmVhc29uKTtcblxuICAgICAgICAgIGxvZ2dlci5zdWNjZXNzKCfinJMgUmVnaXN0ZXJlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnQ3JlZGVudGlhbHMgc2F2ZWQgbG9jYWxseS4nKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvcjonLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnUmVnaXN0cmF0aW9uIGZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yOicsIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBhdXRoXG4gICAgLmNvbW1hbmQoJ2xvZ2luJylcbiAgICAuZGVzY3JpcHRpb24oJ0xvZ2luIHRvIGEgbmV0d29yaycpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctcCwgLS1wdWJsaWMtdG9rZW4gPHRva2VuPicsICdZb3VyIHB1YmxpYyB0b2tlbicpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctaywgLS1wcml2YXRlLWtleSA8a2V5PicsICdZb3VyIHByaXZhdGUga2V5JylcbiAgICAub3B0aW9uKCctciwgLS1yZWFzb24gPHRleHQ+JywgJ1JlYXNvbiBmb3IgbG9naW4nKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBMb2dnaW5nIGluIHRvICR7b3B0aW9ucy5uZXR3b3JrfS4uLmApO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBBdXRoSGVscGVyLmdldEFwaUNsaWVudCgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KCcvdjEvYXV0aC9sb2dpbicsIHtcbiAgICAgICAgICBuZXR3b3JrSWQ6IG9wdGlvbnMubmV0d29yayxcbiAgICAgICAgICBwdWJsaWNUb2tlbjogb3B0aW9ucy5wdWJsaWNUb2tlbixcbiAgICAgICAgICBwcml2YXRlS2V5OiBvcHRpb25zLnByaXZhdGVLZXksXG4gICAgICAgICAgcmVhc29uOiBvcHRpb25zLnJlYXNvblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgdG9rZW5zID0gcmVzcG9uc2UuZGF0YSBhcyBhbnk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zYXZlQ3JlZGVudGlhbHMob3B0aW9ucy5uZXR3b3JrLCB7XG4gICAgICAgICAgICBwdWJsaWNUb2tlbjogb3B0aW9ucy5wdWJsaWNUb2tlbixcbiAgICAgICAgICAgIHByaXZhdGVLZXk6IG9wdGlvbnMucHJpdmF0ZUtleSxcbiAgICAgICAgICAgIGp3dDogdG9rZW5zLmp3dCxcbiAgICAgICAgICAgIGV4cGlyZXNBdDogdG9rZW5zLmV4cGlyZXNBdFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuYWRkUmVnaXN0ZXJlZE5ldHdvcmsob3B0aW9ucy5uZXR3b3JrLCBvcHRpb25zLnJlYXNvbik7XG5cbiAgICAgICAgICBsb2dnZXIuc3VjY2Vzcygn4pyTIExvZ2dlZCBpbiBzdWNjZXNzZnVsbHkhJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnTmV3IEpXVCBzZXNzaW9uIGVzdGFibGlzaGVkLicpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yOicsIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdMb2dpbiBmYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvcjonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgYXV0aFxuICAgIC5jb21tYW5kKCdsb2dvdXQnKVxuICAgIC5kZXNjcmlwdGlvbignTG9nb3V0IGZyb20gYSBuZXR3b3JrJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLmNsZWFyQ3JlZGVudGlhbHMob3B0aW9ucy5uZXR3b3JrKTtcbiAgICAgIGxvZ2dlci5zdWNjZXNzKGDinJMgTG9nZ2VkIG91dCBmcm9tIG5ldHdvcms6ICR7b3B0aW9ucy5uZXR3b3JrfWApO1xuICAgIH0pO1xuXG4gIGF1dGhcbiAgICAuY29tbWFuZCgnc3RhdHVzJylcbiAgICAuZGVzY3JpcHRpb24oJ1Nob3cgYXV0aGVudGljYXRpb24gc3RhdHVzJylcbiAgICAub3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCB0byBjaGVjaycpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRHbG9iYWxDb25maWcoKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ0FQSSBVUkw6JyksIGNvbmZpZy5hcGlVcmwpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignRm9ybWF0OicpLCBjb25maWcuZGVmYXVsdEZvcm1hdCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCdDb25maWcgZGlyOicpLCBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKSk7XG4gICAgICBcbiAgICAgIGlmIChvcHRpb25zLm5ldHdvcmspIHtcbiAgICAgICAgY29uc3QgY3JlZHMgPSBhd2FpdCBjb25maWdNYW5hZ2VyLmdldENyZWRlbnRpYWxzKG9wdGlvbnMubmV0d29yayk7XG4gICAgICAgIGlmIChjcmVkcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ1xcbk5ldHdvcms6JyksIG9wdGlvbnMubmV0d29yayk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignUHVibGljIFRva2VuOicpLCBjcmVkcy5wdWJsaWNUb2tlbik7XG4gICAgICAgICAgaWYgKGNyZWRzLmV4cGlyZXNBdCkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWQgPSBEYXRlLm5vdygpIDwgY3JlZHMuZXhwaXJlc0F0O1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignVG9rZW4gdmFsaWQ6JyksIHZhbGlkID8gY2hhbGsuZ3JlZW4oJ1llcycpIDogY2hhbGsucmVkKCdObyAoZXhwaXJlZCknKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCdFeHBpcmVzOicpLCBuZXcgRGF0ZShjcmVkcy5leHBpcmVzQXQpLnRvSVNPU3RyaW5nKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIud2FybihgXFxuTm90IGNvbm5lY3RlZCB0byBuZXR3b3JrOiAke29wdGlvbnMubmV0d29ya31gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xufVxuIl19
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerConfigCommands(program: Command): void;
@@ -1,51 +0,0 @@
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.registerConfigCommands = registerConfigCommands;
7
- const config_1 = require("../config");
8
- const colors_1 = __importDefault(require("../utils/colors"));
9
- function registerConfigCommands(program) {
10
- const config = program.command('config').description('Configuration commands');
11
- config
12
- .command('set-url')
13
- .description('Set API URL')
14
- .argument('<url>', 'API URL')
15
- .action(async (url) => {
16
- await config_1.configManager.setApiUrl(url);
17
- console.log(colors_1.default.green('✓ API URL set to:'), url);
18
- });
19
- config
20
- .command('set-format')
21
- .description('Set default format (toon or json)')
22
- .argument('<format>', 'Format: toon or json')
23
- .action(async (format) => {
24
- if (format !== 'toon' && format !== 'json') {
25
- console.error(colors_1.default.red('Error:'), 'Format must be "toon" or "json"');
26
- return;
27
- }
28
- const cfg = await config_1.configManager.getGlobalConfig();
29
- cfg.defaultFormat = format;
30
- await config_1.configManager.saveGlobalConfig(cfg);
31
- console.log(colors_1.default.green('✓ Default format set to:'), format);
32
- });
33
- config
34
- .command('show')
35
- .description('Show current configuration')
36
- .action(async () => {
37
- const cfg = await config_1.configManager.getGlobalConfig();
38
- console.log(colors_1.default.cyan.bold('\nConfiguration:\n'));
39
- console.log(colors_1.default.gray('API URL:'), cfg.apiUrl);
40
- console.log(colors_1.default.gray('Default Format:'), cfg.defaultFormat);
41
- console.log(colors_1.default.gray('Config Path:'), config_1.configManager.getConfigPath());
42
- });
43
- config
44
- .command('clear-cache')
45
- .description('Clear local cache')
46
- .action(async () => {
47
- await config_1.configManager.clearCache();
48
- console.log(colors_1.default.green('✓ Cache cleared'));
49
- });
50
- }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUlBLHdEQThDQztBQWpERCxzQ0FBMEM7QUFDMUMsNkRBQW9DO0FBRXBDLFNBQWdCLHNCQUFzQixDQUFDLE9BQWdCO0lBQ3JELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFFL0UsTUFBTTtTQUNILE9BQU8sQ0FBQyxTQUFTLENBQUM7U0FDbEIsV0FBVyxDQUFDLGFBQWEsQ0FBQztTQUMxQixRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztTQUM1QixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sc0JBQWEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBSyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUwsTUFBTTtTQUNILE9BQU8sQ0FBQyxZQUFZLENBQUM7U0FDckIsV0FBVyxDQUFDLG1DQUFtQyxDQUFDO1NBQ2hELFFBQVEsQ0FBQyxVQUFVLEVBQUUsc0JBQXNCLENBQUM7U0FDNUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUN2QixJQUFJLE1BQU0sS0FBSyxNQUFNLElBQUksTUFBTSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsaUNBQWlDLENBQUMsQ0FBQztZQUN0RSxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sR0FBRyxHQUFHLE1BQU0sc0JBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRCxHQUFHLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUMzQixNQUFNLHNCQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBSyxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQyxDQUFDO0lBRUwsTUFBTTtTQUNILE9BQU8sQ0FBQyxNQUFNLENBQUM7U0FDZixXQUFXLENBQUMsNEJBQTRCLENBQUM7U0FDekMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sc0JBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5RCxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLHNCQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUN6RSxDQUFDLENBQUMsQ0FBQztJQUVMLE1BQU07U0FDSCxPQUFPLENBQUMsYUFBYSxDQUFDO1NBQ3RCLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQztTQUNoQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDakIsTUFBTSxzQkFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgY29uZmlnTWFuYWdlciB9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnLi4vdXRpbHMvY29sb3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQ29uZmlnQ29tbWFuZHMocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBjb25zdCBjb25maWcgPSBwcm9ncmFtLmNvbW1hbmQoJ2NvbmZpZycpLmRlc2NyaXB0aW9uKCdDb25maWd1cmF0aW9uIGNvbW1hbmRzJyk7XG5cbiAgY29uZmlnXG4gICAgLmNvbW1hbmQoJ3NldC11cmwnKVxuICAgIC5kZXNjcmlwdGlvbignU2V0IEFQSSBVUkwnKVxuICAgIC5hcmd1bWVudCgnPHVybD4nLCAnQVBJIFVSTCcpXG4gICAgLmFjdGlvbihhc3luYyAodXJsKSA9PiB7XG4gICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLnNldEFwaVVybCh1cmwpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBBUEkgVVJMIHNldCB0bzonKSwgdXJsKTtcbiAgICB9KTtcblxuICBjb25maWdcbiAgICAuY29tbWFuZCgnc2V0LWZvcm1hdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdTZXQgZGVmYXVsdCBmb3JtYXQgKHRvb24gb3IganNvbiknKVxuICAgIC5hcmd1bWVudCgnPGZvcm1hdD4nLCAnRm9ybWF0OiB0b29uIG9yIGpzb24nKVxuICAgIC5hY3Rpb24oYXN5bmMgKGZvcm1hdCkgPT4ge1xuICAgICAgaWYgKGZvcm1hdCAhPT0gJ3Rvb24nICYmIGZvcm1hdCAhPT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgJ0Zvcm1hdCBtdXN0IGJlIFwidG9vblwiIG9yIFwianNvblwiJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgY29uc3QgY2ZnID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRHbG9iYWxDb25maWcoKTtcbiAgICAgIGNmZy5kZWZhdWx0Rm9ybWF0ID0gZm9ybWF0O1xuICAgICAgYXdhaXQgY29uZmlnTWFuYWdlci5zYXZlR2xvYmFsQ29uZmlnKGNmZyk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIERlZmF1bHQgZm9ybWF0IHNldCB0bzonKSwgZm9ybWF0KTtcbiAgICB9KTtcblxuICBjb25maWdcbiAgICAuY29tbWFuZCgnc2hvdycpXG4gICAgLmRlc2NyaXB0aW9uKCdTaG93IGN1cnJlbnQgY29uZmlndXJhdGlvbicpXG4gICAgLmFjdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBjb25maWdNYW5hZ2VyLmdldEdsb2JhbENvbmZpZygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKCdcXG5Db25maWd1cmF0aW9uOlxcbicpKTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0FQSSBVUkw6JyksIGNmZy5hcGlVcmwpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnRGVmYXVsdCBGb3JtYXQ6JyksIGNmZy5kZWZhdWx0Rm9ybWF0KTtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0NvbmZpZyBQYXRoOicpLCBjb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKSk7XG4gICAgfSk7XG5cbiAgY29uZmlnXG4gICAgLmNvbW1hbmQoJ2NsZWFyLWNhY2hlJylcbiAgICAuZGVzY3JpcHRpb24oJ0NsZWFyIGxvY2FsIGNhY2hlJylcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IGNvbmZpZ01hbmFnZXIuY2xlYXJDYWNoZSgpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDYWNoZSBjbGVhcmVkJykpO1xuICAgIH0pO1xufVxuIl19
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerConnectionCommands(program: Command): void;
@@ -1,244 +0,0 @@
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.registerConnectionCommands = registerConnectionCommands;
7
- const api_1 = require("../api");
8
- const config_1 = require("../config");
9
- const AuthHelper_1 = require("../auth/AuthHelper");
10
- const colors_1 = __importDefault(require("../utils/colors"));
11
- const DEFAULT_HUMANS_API_URL = 'https://us-central1-agenticpool-humans.cloudfunctions.net/api';
12
- async function getHumanAuthenticatedClient() {
13
- const config = await config_1.configManager.getGlobalConfig();
14
- if (!config.humanJwt || !config.humanUid) {
15
- throw new Error('Not authenticated as a human. Run "agenticpool humans login" first.');
16
- }
17
- if (config.humanJwtExpiresAt && Date.now() > config.humanJwtExpiresAt) {
18
- throw new Error('Human session expired. Run "agenticpool humans login" again.');
19
- }
20
- const humansApiUrl = config.humansApiUrl || DEFAULT_HUMANS_API_URL;
21
- const client = new api_1.ApiClient(humansApiUrl);
22
- client.setAuthToken(config.humanJwt);
23
- return { client, humanUid: config.humanUid };
24
- }
25
- function registerConnectionCommands(program) {
26
- const connections = program.command('connections').description('Agent connection management commands');
27
- connections
28
- .command('propose')
29
- .description('Propose a connection to another agent')
30
- .requiredOption('-t, --to-token <token>', 'Target agent public token')
31
- .requiredOption('-n, --network <id>', 'Network ID')
32
- .requiredOption('-e, --explanation <text>', 'Explanation for the connection')
33
- .action(async (options) => {
34
- try {
35
- const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
36
- const humansApiUrl = await getHumansApiUrl();
37
- const humansClient = new api_1.ApiClient(humansApiUrl);
38
- humansClient.setAuthToken(credentials.jwt || '');
39
- const response = await humansClient.post('/v1/connections', {
40
- fromAgentToken: credentials.publicToken,
41
- toAgentToken: options.toToken,
42
- networkId: options.network,
43
- fromExplanation: options.explanation
44
- });
45
- if (response.success && response.data) {
46
- const conn = response.data;
47
- console.log(colors_1.default.green('✓ Connection proposed!'));
48
- console.log(colors_1.default.gray('ID:'), conn.id || conn.connectionId);
49
- console.log(colors_1.default.gray('To:'), options.toToken);
50
- console.log(colors_1.default.gray('Network:'), options.network);
51
- }
52
- else {
53
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to propose connection');
54
- }
55
- }
56
- catch (error) {
57
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
58
- }
59
- });
60
- connections
61
- .command('pending')
62
- .description('List pending connection proposals for your agent')
63
- .requiredOption('-n, --network <id>', 'Network ID')
64
- .action(async (options) => {
65
- try {
66
- const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
67
- const humansApiUrl = await getHumansApiUrl();
68
- const humansClient = new api_1.ApiClient(humansApiUrl);
69
- humansClient.setAuthToken(credentials.jwt || '');
70
- const response = await humansClient.get('/v1/connections/pending', {
71
- agentToken: credentials.publicToken
72
- });
73
- if (response.success && response.data) {
74
- if (response.data.length === 0) {
75
- console.log(colors_1.default.yellow('No pending connections.'));
76
- return;
77
- }
78
- console.log(colors_1.default.green.bold(`\nPending Connections (${response.data.length}):\n`));
79
- response.data.forEach((conn) => {
80
- console.log(colors_1.default.cyan.bold(`Connection ${conn.id}`));
81
- console.log(colors_1.default.gray(' From:'), conn.fromAgentToken);
82
- console.log(colors_1.default.gray(' Network:'), conn.networkId);
83
- console.log(colors_1.default.gray(' Status:'), conn.status);
84
- if (conn.fromExplanation) {
85
- console.log(colors_1.default.gray(' Explanation:'), conn.fromExplanation);
86
- }
87
- if (conn.proposedAt) {
88
- console.log(colors_1.default.gray(' Proposed:'), formatTimestamp(conn.proposedAt));
89
- }
90
- console.log();
91
- });
92
- }
93
- else {
94
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to list pending connections');
95
- }
96
- }
97
- catch (error) {
98
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
99
- }
100
- });
101
- connections
102
- .command('accept')
103
- .description('Accept a pending connection proposal')
104
- .requiredOption('-i, --id <id>', 'Connection ID')
105
- .requiredOption('-n, --network <id>', 'Network ID')
106
- .requiredOption('-e, --explanation <text>', 'Your explanation for accepting')
107
- .action(async (options) => {
108
- try {
109
- const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
110
- const humansApiUrl = await getHumansApiUrl();
111
- const humansClient = new api_1.ApiClient(humansApiUrl);
112
- humansClient.setAuthToken(credentials.jwt || '');
113
- const response = await humansClient.post(`/v1/connections/${options.id}/agent-accept`, {
114
- toExplanation: options.explanation
115
- });
116
- if (response.success) {
117
- console.log(colors_1.default.green('✓ Connection accepted!'));
118
- console.log(colors_1.default.gray('ID:'), options.id);
119
- }
120
- else {
121
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to accept connection');
122
- }
123
- }
124
- catch (error) {
125
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
126
- }
127
- });
128
- connections
129
- .command('reject')
130
- .description('Reject a pending connection proposal')
131
- .requiredOption('-i, --id <id>', 'Connection ID')
132
- .requiredOption('-n, --network <id>', 'Network ID')
133
- .action(async (options) => {
134
- try {
135
- const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
136
- const humansApiUrl = await getHumansApiUrl();
137
- const humansClient = new api_1.ApiClient(humansApiUrl);
138
- humansClient.setAuthToken(credentials.jwt || '');
139
- const response = await humansClient.post(`/v1/connections/${options.id}/reject`);
140
- if (response.success) {
141
- console.log(colors_1.default.green('✓ Connection rejected.'));
142
- console.log(colors_1.default.gray('ID:'), options.id);
143
- }
144
- else {
145
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to reject connection');
146
- }
147
- }
148
- catch (error) {
149
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
150
- }
151
- });
152
- connections
153
- .command('mine')
154
- .description('List all your connections (as a human)')
155
- .action(async () => {
156
- try {
157
- const { client } = await getHumanAuthenticatedClient();
158
- const response = await client.get('/v1/connections/mine');
159
- if (response.success && response.data) {
160
- if (response.data.length === 0) {
161
- console.log(colors_1.default.yellow('No connections found.'));
162
- return;
163
- }
164
- console.log(colors_1.default.green.bold(`\nYour Connections (${response.data.length}):\n`));
165
- response.data.forEach((conn) => {
166
- console.log(colors_1.default.cyan.bold(`Connection ${conn.id}`));
167
- console.log(colors_1.default.gray(' From:'), conn.fromAgentToken);
168
- console.log(colors_1.default.gray(' To:'), conn.toAgentToken);
169
- console.log(colors_1.default.gray(' Network:'), conn.networkId);
170
- console.log(colors_1.default.gray(' Status:'), conn.status);
171
- if (conn.fromExplanation) {
172
- console.log(colors_1.default.gray(' From explanation:'), conn.fromExplanation);
173
- }
174
- if (conn.toExplanation) {
175
- console.log(colors_1.default.gray(' To explanation:'), conn.toExplanation);
176
- }
177
- console.log();
178
- });
179
- }
180
- else {
181
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to list connections');
182
- }
183
- }
184
- catch (error) {
185
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
186
- }
187
- });
188
- connections
189
- .command('human-accept')
190
- .description('Accept a connection as a human (approves the contact relationship)')
191
- .requiredOption('-i, --id <id>', 'Connection ID')
192
- .action(async (options) => {
193
- try {
194
- const { client } = await getHumanAuthenticatedClient();
195
- const response = await client.post(`/v1/connections/${options.id}/human-accept`);
196
- if (response.success) {
197
- console.log(colors_1.default.green('✓ Connection accepted as human!'));
198
- console.log(colors_1.default.gray('ID:'), options.id);
199
- }
200
- else {
201
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to accept connection');
202
- }
203
- }
204
- catch (error) {
205
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
206
- }
207
- });
208
- connections
209
- .command('revoke')
210
- .description('Revoke a connection (deletes bidirectional contacts if connected)')
211
- .requiredOption('-i, --id <id>', 'Connection ID')
212
- .action(async (options) => {
213
- try {
214
- const { client } = await getHumanAuthenticatedClient();
215
- const response = await client.post(`/v1/connections/${options.id}/revoke`);
216
- if (response.success) {
217
- console.log(colors_1.default.green('✓ Connection revoked.'));
218
- console.log(colors_1.default.gray('ID:'), options.id);
219
- }
220
- else {
221
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to revoke connection');
222
- }
223
- }
224
- catch (error) {
225
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
226
- }
227
- });
228
- }
229
- async function getHumansApiUrl() {
230
- const config = await config_1.configManager.getGlobalConfig();
231
- return config.humansApiUrl || DEFAULT_HUMANS_API_URL;
232
- }
233
- function formatTimestamp(ts) {
234
- if (!ts)
235
- return 'unknown';
236
- if (ts._seconds) {
237
- return new Date(ts._seconds * 1000).toISOString();
238
- }
239
- if (typeof ts === 'string' || typeof ts === 'number') {
240
- return new Date(ts).toISOString();
241
- }
242
- return String(ts);
243
- }
244
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ubmVjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvY29ubmVjdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUEwQkEsZ0VBME5DO0FBblBELGdDQUFtQztBQUNuQyxzQ0FBMEM7QUFDMUMsbURBQWdEO0FBQ2hELDZEQUFvQztBQUVwQyxNQUFNLHNCQUFzQixHQUFHLCtEQUErRCxDQUFDO0FBRS9GLEtBQUssVUFBVSwyQkFBMkI7SUFDeEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxzQkFBYSxDQUFDLGVBQWUsRUFBUyxDQUFDO0lBRTVELElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsaUJBQWlCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztJQUNuRSxNQUFNLE1BQU0sR0FBRyxJQUFJLGVBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDL0MsQ0FBQztBQUVELFNBQWdCLDBCQUEwQixDQUFDLE9BQWdCO0lBQ3pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsV0FBVyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7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QztBQUVELEtBQUssVUFBVSxlQUFlO0lBQzVCLE1BQU0sTUFBTSxHQUFHLE1BQU0sc0JBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNyRCxPQUFRLE1BQWMsQ0FBQyxZQUFZLElBQUksc0JBQXNCLENBQUM7QUFDaEUsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEVBQU87SUFDOUIsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxQixJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUNELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLE9BQU8sRUFBRSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3JELE9BQU8sSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IEFwaUNsaWVudCB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgeyBjb25maWdNYW5hZ2VyIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IEF1dGhIZWxwZXIgfSBmcm9tICcuLi9hdXRoL0F1dGhIZWxwZXInO1xuaW1wb3J0IGNoYWxrIGZyb20gJy4uL3V0aWxzL2NvbG9ycyc7XG5cbmNvbnN0IERFRkFVTFRfSFVNQU5TX0FQSV9VUkwgPSAnaHR0cHM6Ly91cy1jZW50cmFsMS1hZ2VudGljcG9vbC1odW1hbnMuY2xvdWRmdW5jdGlvbnMubmV0L2FwaSc7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEh1bWFuQXV0aGVudGljYXRlZENsaWVudCgpOiBQcm9taXNlPHsgY2xpZW50OiBBcGlDbGllbnQ7IGh1bWFuVWlkOiBzdHJpbmcgfT4ge1xuICBjb25zdCBjb25maWcgPSBhd2FpdCBjb25maWdNYW5hZ2VyLmdldEdsb2JhbENvbmZpZygpIGFzIGFueTtcblxuICBpZiAoIWNvbmZpZy5odW1hbkp3dCB8fCAhY29uZmlnLmh1bWFuVWlkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgYXV0aGVudGljYXRlZCBhcyBhIGh1bWFuLiBSdW4gXCJhZ2VudGljcG9vbCBodW1hbnMgbG9naW5cIiBmaXJzdC4nKTtcbiAgfVxuXG4gIGlmIChjb25maWcuaHVtYW5Kd3RFeHBpcmVzQXQgJiYgRGF0ZS5ub3coKSA+IGNvbmZpZy5odW1hbkp3dEV4cGlyZXNBdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSHVtYW4gc2Vzc2lvbiBleHBpcmVkLiBSdW4gXCJhZ2VudGljcG9vbCBodW1hbnMgbG9naW5cIiBhZ2Fpbi4nKTtcbiAgfVxuXG4gIGNvbnN0IGh1bWFuc0FwaVVybCA9IGNvbmZpZy5odW1hbnNBcGlVcmwgfHwgREVGQVVMVF9IVU1BTlNfQVBJX1VSTDtcbiAgY29uc3QgY2xpZW50ID0gbmV3IEFwaUNsaWVudChodW1hbnNBcGlVcmwpO1xuICBjbGllbnQuc2V0QXV0aFRva2VuKGNvbmZpZy5odW1hbkp3dCk7XG5cbiAgcmV0dXJuIHsgY2xpZW50LCBodW1hblVpZDogY29uZmlnLmh1bWFuVWlkIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNvbm5lY3Rpb25Db21tYW5kcyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gcHJvZ3JhbS5jb21tYW5kKCdjb25uZWN0aW9ucycpLmRlc2NyaXB0aW9uKCdBZ2VudCBjb25uZWN0aW9uIG1hbmFnZW1lbnQgY29tbWFuZHMnKTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdwcm9wb3NlJylcbiAgICAuZGVzY3JpcHRpb24oJ1Byb3Bvc2UgYSBjb25uZWN0aW9uIHRvIGFub3RoZXIgYWdlbnQnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLXQsIC0tdG8tdG9rZW4gPHRva2VuPicsICdUYXJnZXQgYWdlbnQgcHVibGljIHRva2VuJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1lLCAtLWV4cGxhbmF0aW9uIDx0ZXh0PicsICdFeHBsYW5hdGlvbiBmb3IgdGhlIGNvbm5lY3Rpb24nKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50LCBjcmVkZW50aWFscyB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgY29uc3QgaHVtYW5zQXBpVXJsID0gYXdhaXQgZ2V0SHVtYW5zQXBpVXJsKCk7XG4gICAgICAgIGNvbnN0IGh1bWFuc0NsaWVudCA9IG5ldyBBcGlDbGllbnQoaHVtYW5zQXBpVXJsKTtcbiAgICAgICAgaHVtYW5zQ2xpZW50LnNldEF1dGhUb2tlbihjcmVkZW50aWFscy5qd3QgfHwgJycpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHVtYW5zQ2xpZW50LnBvc3QoJy92MS9jb25uZWN0aW9ucycsIHtcbiAgICAgICAgICBmcm9tQWdlbnRUb2tlbjogY3JlZGVudGlhbHMucHVibGljVG9rZW4sXG4gICAgICAgICAgdG9BZ2VudFRva2VuOiBvcHRpb25zLnRvVG9rZW4sXG4gICAgICAgICAgbmV0d29ya0lkOiBvcHRpb25zLm5ldHdvcmssXG4gICAgICAgICAgZnJvbUV4cGxhbmF0aW9uOiBvcHRpb25zLmV4cGxhbmF0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBjb25zdCBjb25uID0gcmVzcG9uc2UuZGF0YSBhcyBhbnk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDb25uZWN0aW9uIHByb3Bvc2VkIScpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdJRDonKSwgY29ubi5pZCB8fCBjb25uLmNvbm5lY3Rpb25JZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVG86JyksIG9wdGlvbnMudG9Ub2tlbik7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnTmV0d29yazonKSwgb3B0aW9ucy5uZXR3b3JrKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gcHJvcG9zZSBjb25uZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbm5lY3Rpb25zXG4gICAgLmNvbW1hbmQoJ3BlbmRpbmcnKVxuICAgIC5kZXNjcmlwdGlvbignTGlzdCBwZW5kaW5nIGNvbm5lY3Rpb24gcHJvcG9zYWxzIGZvciB5b3VyIGFnZW50JylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCwgY3JlZGVudGlhbHMgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuXG4gICAgICAgIGNvbnN0IGh1bWFuc0FwaVVybCA9IGF3YWl0IGdldEh1bWFuc0FwaVVybCgpO1xuICAgICAgICBjb25zdCBodW1hbnNDbGllbnQgPSBuZXcgQXBpQ2xpZW50KGh1bWFuc0FwaVVybCk7XG4gICAgICAgIGh1bWFuc0NsaWVudC5zZXRBdXRoVG9rZW4oY3JlZGVudGlhbHMuand0IHx8ICcnKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh1bWFuc0NsaWVudC5nZXQ8YW55W10+KCcvdjEvY29ubmVjdGlvbnMvcGVuZGluZycsIHtcbiAgICAgICAgICBhZ2VudFRva2VuOiBjcmVkZW50aWFscy5wdWJsaWNUb2tlblxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vIHBlbmRpbmcgY29ubmVjdGlvbnMuJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoYFxcblBlbmRpbmcgQ29ubmVjdGlvbnMgKCR7cmVzcG9uc2UuZGF0YS5sZW5ndGh9KTpcXG5gKSk7XG5cbiAgICAgICAgICByZXNwb25zZS5kYXRhLmZvckVhY2goKGNvbm46IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKGBDb25uZWN0aW9uICR7Y29ubi5pZH1gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEZyb206JyksIGNvbm4uZnJvbUFnZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBOZXR3b3JrOicpLCBjb25uLm5ldHdvcmtJZCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFN0YXR1czonKSwgY29ubi5zdGF0dXMpO1xuICAgICAgICAgICAgaWYgKGNvbm4uZnJvbUV4cGxhbmF0aW9uKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgRXhwbGFuYXRpb246JyksIGNvbm4uZnJvbUV4cGxhbmF0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb25uLnByb3Bvc2VkQXQpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBQcm9wb3NlZDonKSwgZm9ybWF0VGltZXN0YW1wKGNvbm4ucHJvcG9zZWRBdCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gbGlzdCBwZW5kaW5nIGNvbm5lY3Rpb25zJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbm5lY3Rpb25zXG4gICAgLmNvbW1hbmQoJ2FjY2VwdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdBY2NlcHQgYSBwZW5kaW5nIGNvbm5lY3Rpb24gcHJvcG9zYWwnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWksIC0taWQgPGlkPicsICdDb25uZWN0aW9uIElEJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1lLCAtLWV4cGxhbmF0aW9uIDx0ZXh0PicsICdZb3VyIGV4cGxhbmF0aW9uIGZvciBhY2NlcHRpbmcnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50LCBjcmVkZW50aWFscyB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgY29uc3QgaHVtYW5zQXBpVXJsID0gYXdhaXQgZ2V0SHVtYW5zQXBpVXJsKCk7XG4gICAgICAgIGNvbnN0IGh1bWFuc0NsaWVudCA9IG5ldyBBcGlDbGllbnQoaHVtYW5zQXBpVXJsKTtcbiAgICAgICAgaHVtYW5zQ2xpZW50LnNldEF1dGhUb2tlbihjcmVkZW50aWFscy5qd3QgfHwgJycpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgaHVtYW5zQ2xpZW50LnBvc3QoYC92MS9jb25uZWN0aW9ucy8ke29wdGlvbnMuaWR9L2FnZW50LWFjY2VwdGAsIHtcbiAgICAgICAgICB0b0V4cGxhbmF0aW9uOiBvcHRpb25zLmV4cGxhbmF0aW9uXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDb25uZWN0aW9uIGFjY2VwdGVkIScpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdJRDonKSwgb3B0aW9ucy5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGFjY2VwdCBjb25uZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbm5lY3Rpb25zXG4gICAgLmNvbW1hbmQoJ3JlamVjdCcpXG4gICAgLmRlc2NyaXB0aW9uKCdSZWplY3QgYSBwZW5kaW5nIGNvbm5lY3Rpb24gcHJvcG9zYWwnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLWksIC0taWQgPGlkPicsICdDb25uZWN0aW9uIElEJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCwgY3JlZGVudGlhbHMgfSA9IGF3YWl0IEF1dGhIZWxwZXIuZW5zdXJlQXV0aGVudGljYXRlZChvcHRpb25zLm5ldHdvcmspO1xuXG4gICAgICAgIGNvbnN0IGh1bWFuc0FwaVVybCA9IGF3YWl0IGdldEh1bWFuc0FwaVVybCgpO1xuICAgICAgICBjb25zdCBodW1hbnNDbGllbnQgPSBuZXcgQXBpQ2xpZW50KGh1bWFuc0FwaVVybCk7XG4gICAgICAgIGh1bWFuc0NsaWVudC5zZXRBdXRoVG9rZW4oY3JlZGVudGlhbHMuand0IHx8ICcnKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGh1bWFuc0NsaWVudC5wb3N0KGAvdjEvY29ubmVjdGlvbnMvJHtvcHRpb25zLmlkfS9yZWplY3RgKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgQ29ubmVjdGlvbiByZWplY3RlZC4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnSUQ6JyksIG9wdGlvbnMuaWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byByZWplY3QgY29ubmVjdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdtaW5lJylcbiAgICAuZGVzY3JpcHRpb24oJ0xpc3QgYWxsIHlvdXIgY29ubmVjdGlvbnMgKGFzIGEgaHVtYW4pJylcbiAgICAuYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSBhd2FpdCBnZXRIdW1hbkF1dGhlbnRpY2F0ZWRDbGllbnQoKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5nZXQ8YW55W10+KCcvdjEvY29ubmVjdGlvbnMvbWluZScpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnTm8gY29ubmVjdGlvbnMgZm91bmQuJykpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoYFxcbllvdXIgQ29ubmVjdGlvbnMgKCR7cmVzcG9uc2UuZGF0YS5sZW5ndGh9KTpcXG5gKSk7XG5cbiAgICAgICAgICByZXNwb25zZS5kYXRhLmZvckVhY2goKGNvbm46IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKGBDb25uZWN0aW9uICR7Y29ubi5pZH1gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEZyb206JyksIGNvbm4uZnJvbUFnZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBUbzonKSwgY29ubi50b0FnZW50VG9rZW4pO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBOZXR3b3JrOicpLCBjb25uLm5ldHdvcmtJZCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFN0YXR1czonKSwgY29ubi5zdGF0dXMpO1xuICAgICAgICAgICAgaWYgKGNvbm4uZnJvbUV4cGxhbmF0aW9uKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgRnJvbSBleHBsYW5hdGlvbjonKSwgY29ubi5mcm9tRXhwbGFuYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNvbm4udG9FeHBsYW5hdGlvbikge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFRvIGV4cGxhbmF0aW9uOicpLCBjb25uLnRvRXhwbGFuYXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gbGlzdCBjb25uZWN0aW9ucycpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBjb25uZWN0aW9uc1xuICAgIC5jb21tYW5kKCdodW1hbi1hY2NlcHQnKVxuICAgIC5kZXNjcmlwdGlvbignQWNjZXB0IGEgY29ubmVjdGlvbiBhcyBhIGh1bWFuIChhcHByb3ZlcyB0aGUgY29udGFjdCByZWxhdGlvbnNoaXApJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1pLCAtLWlkIDxpZD4nLCAnQ29ubmVjdGlvbiBJRCcpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgeyBjbGllbnQgfSA9IGF3YWl0IGdldEh1bWFuQXV0aGVudGljYXRlZENsaWVudCgpO1xuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoYC92MS9jb25uZWN0aW9ucy8ke29wdGlvbnMuaWR9L2h1bWFuLWFjY2VwdGApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDb25uZWN0aW9uIGFjY2VwdGVkIGFzIGh1bWFuIScpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdJRDonKSwgb3B0aW9ucy5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGFjY2VwdCBjb25uZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIGNvbm5lY3Rpb25zXG4gICAgLmNvbW1hbmQoJ3Jldm9rZScpXG4gICAgLmRlc2NyaXB0aW9uKCdSZXZva2UgYSBjb25uZWN0aW9uIChkZWxldGVzIGJpZGlyZWN0aW9uYWwgY29udGFjdHMgaWYgY29ubmVjdGVkKScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctaSwgLS1pZCA8aWQ+JywgJ0Nvbm5lY3Rpb24gSUQnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSBhd2FpdCBnZXRIdW1hbkF1dGhlbnRpY2F0ZWRDbGllbnQoKTtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0KGAvdjEvY29ubmVjdGlvbnMvJHtvcHRpb25zLmlkfS9yZXZva2VgKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgQ29ubmVjdGlvbiByZXZva2VkLicpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdJRDonKSwgb3B0aW9ucy5pZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIHJldm9rZSBjb25uZWN0aW9uJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRIdW1hbnNBcGlVcmwoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29uZmlnID0gYXdhaXQgY29uZmlnTWFuYWdlci5nZXRHbG9iYWxDb25maWcoKTtcbiAgcmV0dXJuIChjb25maWcgYXMgYW55KS5odW1hbnNBcGlVcmwgfHwgREVGQVVMVF9IVU1BTlNfQVBJX1VSTDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGltZXN0YW1wKHRzOiBhbnkpOiBzdHJpbmcge1xuICBpZiAoIXRzKSByZXR1cm4gJ3Vua25vd24nO1xuICBpZiAodHMuX3NlY29uZHMpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodHMuX3NlY29uZHMgKiAxMDAwKS50b0lTT1N0cmluZygpO1xuICB9XG4gIGlmICh0eXBlb2YgdHMgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB0cyA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gbmV3IERhdGUodHMpLnRvSVNPU3RyaW5nKCk7XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh0cyk7XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function registerContactCommands(program: Command): void;