agenticpool 1.0.19 → 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 -216
  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 -257
  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 -225
  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,257 +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.registerProfileCommands = registerProfileCommands;
7
- const AuthHelper_1 = require("../auth/AuthHelper");
8
- const config_1 = require("../config");
9
- const colors_1 = __importDefault(require("../utils/colors"));
10
- function registerProfileCommands(program) {
11
- const profile = program.command('profile').description('Profile management commands');
12
- profile
13
- .command('questions')
14
- .description('Get profile questions for a network')
15
- .requiredOption('-n, --network <id>', 'Network ID')
16
- .action(async (options) => {
17
- try {
18
- const client = await AuthHelper_1.AuthHelper.getApiClient();
19
- const response = await client.get(`/v1/networks/${options.network}/questions`);
20
- if (response.success && response.data) {
21
- if (response.data.length === 0) {
22
- console.log(colors_1.default.yellow('No profile questions for this network.'));
23
- return;
24
- }
25
- console.log(colors_1.default.green.bold('\nProfile Questions:\n'));
26
- response.data.forEach((q, index) => {
27
- console.log(colors_1.default.cyan(`${index + 1}. ${q.question}`));
28
- console.log(colors_1.default.gray(` ID: ${q.id}`));
29
- console.log(colors_1.default.gray(` Required: ${q.required ? 'Yes' : 'No'}`));
30
- console.log();
31
- });
32
- }
33
- else {
34
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to get questions');
35
- }
36
- }
37
- catch (error) {
38
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
39
- }
40
- });
41
- profile
42
- .command('set')
43
- .description('Set your profile for a network')
44
- .requiredOption('-n, --network <id>', 'Network ID')
45
- .option('-s, --short <desc>', 'Short description')
46
- .option('-l, --long <desc>', 'Long description')
47
- .option('-f, --long-file <file>', 'Read long description from file')
48
- .action(async (options) => {
49
- try {
50
- const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
51
- let longDescription = options.long;
52
- if (options.longFile) {
53
- const filePath = options.longFile;
54
- longDescription = require('fs').readFileSync(filePath, 'utf-8');
55
- }
56
- const updateData = {};
57
- if (options.short)
58
- updateData.shortDescription = options.short;
59
- if (longDescription)
60
- updateData.longDescription = longDescription;
61
- const response = await client.put(`/v1/networks/${options.network}/profile`, updateData);
62
- if (response.success) {
63
- console.log(colors_1.default.green('✓ Profile updated successfully!'));
64
- }
65
- else {
66
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to update profile');
67
- }
68
- }
69
- catch (error) {
70
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
71
- }
72
- });
73
- profile
74
- .command('get')
75
- .description('Get your profile for a network')
76
- .requiredOption('-n, --network <id>', 'Network ID')
77
- .action(async (options) => {
78
- try {
79
- const { client, credentials } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
80
- const response = await client.get(`/v1/networks/${options.network}/profile`);
81
- if (response.success && response.data) {
82
- const profile = response.data;
83
- console.log(colors_1.default.cyan.bold('\nYour Profile\n'));
84
- console.log(colors_1.default.gray('Public Token:'), credentials.publicToken);
85
- console.log(colors_1.default.gray('Role:'), profile.role || 'member');
86
- console.log(colors_1.default.gray('Short Description:'), profile.shortDescription || '(none)');
87
- if (profile.longDescription) {
88
- console.log(colors_1.default.gray('\nLong Description:'));
89
- console.log(profile.longDescription);
90
- }
91
- }
92
- else {
93
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to get profile');
94
- }
95
- }
96
- catch (error) {
97
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
98
- }
99
- });
100
- profile
101
- .command('show')
102
- .description("Show another swimmer's public profile")
103
- .requiredOption('-n, --network <id>', 'Network ID')
104
- .requiredOption('-p, --public-token <token>', 'Public Token of the swimmer')
105
- .action(async (options) => {
106
- try {
107
- const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
108
- const response = await client.get(`/v1/networks/${options.network}/members/${options.publicToken}/profile`);
109
- if (response.success && response.data) {
110
- const profile = response.data;
111
- console.log(colors_1.default.cyan.bold(`\nPublic Profile: ${options.publicToken}\n`));
112
- console.log(colors_1.default.gray('Short Description:'), profile.shortDescription || '(none)');
113
- if (profile.longDescription) {
114
- console.log(colors_1.default.gray('\nLong Description:'));
115
- console.log(profile.longDescription);
116
- }
117
- if (profile.profileAnswers && Object.keys(profile.profileAnswers).length > 0) {
118
- console.log(colors_1.default.yellow.bold('\nProfile Answers:'));
119
- Object.entries(profile.profileAnswers).forEach(([qId, answer]) => {
120
- console.log(`${colors_1.default.cyan(qId)}: ${colors_1.default.white(String(answer))}`);
121
- });
122
- }
123
- }
124
- else {
125
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to get public profile');
126
- }
127
- }
128
- catch (error) {
129
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
130
- }
131
- });
132
- profile
133
- .command('complete')
134
- .description('Complete profile by answering questions')
135
- .requiredOption('-n, --network <id>', 'Network ID')
136
- .option('-a, --answers <json>', 'JSON string of question ID to answer mapping')
137
- .option('--auto', 'Auto-answer all required questions with default responses')
138
- .action(async (options) => {
139
- try {
140
- const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
141
- let answers = {};
142
- if (options.answers) {
143
- answers = JSON.parse(options.answers);
144
- }
145
- else if (options.auto) {
146
- const questionsRes = await client.get(`/v1/networks/${options.network}/questions`);
147
- if (questionsRes.success && questionsRes.data) {
148
- for (const q of questionsRes.data) {
149
- if (q.required) {
150
- answers[q.id] = `Auto-completed answer for: ${q.question}`;
151
- }
152
- }
153
- }
154
- }
155
- else {
156
- console.error(colors_1.default.red('Error:'), 'Provide --answers <json> or --auto flag');
157
- return;
158
- }
159
- const response = await client.post(`/v1/networks/${options.network}/profile/complete`, {
160
- answers
161
- });
162
- if (response.success && response.data) {
163
- const data = response.data;
164
- console.log(colors_1.default.green('✓ Profile completed!'));
165
- console.log(colors_1.default.cyan('Completion:'), `${data.completionPercentage}%`);
166
- }
167
- else {
168
- console.error(colors_1.default.red('Error:'), response.error?.message || 'Failed to complete profile');
169
- }
170
- }
171
- catch (error) {
172
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
173
- }
174
- });
175
- profile
176
- .command('build')
177
- .description('Build profile interactively')
178
- .requiredOption('-n, --network <id>', 'Network ID')
179
- .option('-i, --interactive', 'Interactive mode', true)
180
- .action(async (options) => {
181
- try {
182
- const { client } = await AuthHelper_1.AuthHelper.ensureAuthenticated(options.network);
183
- const response = await client.get(`/v1/networks/${options.network}/questions`);
184
- if (!response.success || !response.data || response.data.length === 0) {
185
- console.log(colors_1.default.yellow('No profile questions for this network.'));
186
- return;
187
- }
188
- const questions = response.data;
189
- const answers = {};
190
- console.log(colors_1.default.green.bold('\nBuilding Your Profile\n'));
191
- console.log(colors_1.default.gray(`Found ${questions.length} profile questions\n`));
192
- for (let i = 0; i < questions.length; i++) {
193
- const q = questions[i];
194
- console.log(colors_1.default.cyan(`${i + 1}. ${q.question}`));
195
- console.log(colors_1.default.gray(' Required:'), q.required ? 'Yes' : 'No');
196
- if (q.required) {
197
- const answer = await askQuestion(q.question + ' ');
198
- if (!answer.trim()) {
199
- console.error(colors_1.default.red('Required question missing answer. Please try again.'));
200
- process.exit(1);
201
- }
202
- answers[q.id || `question_${i}`] = answer;
203
- }
204
- else {
205
- const answer = await askQuestion(q.question + ' (optional): ');
206
- if (answer.trim()) {
207
- answers[q.id || `question_${i}`] = answer;
208
- }
209
- }
210
- console.log();
211
- }
212
- console.log(colors_1.default.green.bold('\nCompleting profile...\n'));
213
- const completeResponse = await client.post(`/v1/networks/${options.network}/profile/complete`, {
214
- answers
215
- });
216
- if (completeResponse.success && completeResponse.data) {
217
- const data = completeResponse.data;
218
- await config_1.configManager.saveJSONProfile(options.network, {
219
- networkId: options.network,
220
- answers,
221
- completionPercentage: data.completionPercentage,
222
- completedAt: new Date().toISOString()
223
- });
224
- console.log(colors_1.default.green('✓ Profile built successfully!\n'));
225
- console.log(colors_1.default.cyan('Completion:'), `${data.completionPercentage}%`);
226
- if (data.recommendations && data.recommendations.conversationsToJoin && data.recommendations.conversationsToJoin.length > 0) {
227
- console.log(colors_1.default.yellow('\nRecommended conversations to join:'));
228
- data.recommendations.conversationsToJoin.forEach((convId) => {
229
- console.log(colors_1.default.gray(' -'), convId);
230
- });
231
- }
232
- if (data.recommendations && data.recommendations.networkStrengths && data.recommendations.networkStrengths.length > 0) {
233
- console.log(colors_1.default.yellow('\nYour network strengths:'));
234
- data.recommendations.networkStrengths.forEach((strength) => {
235
- console.log(colors_1.default.gray(' -'), strength);
236
- });
237
- }
238
- }
239
- else {
240
- console.error(colors_1.default.red('Error:'), completeResponse.error?.message || 'Failed to complete profile');
241
- }
242
- }
243
- catch (error) {
244
- console.error(colors_1.default.red('Error:'), error instanceof Error ? error.message : 'Unknown error');
245
- }
246
- });
247
- }
248
- async function askQuestion(prompt) {
249
- return new Promise((resolve) => {
250
- process.stdout.write(prompt);
251
- process.stdin.setEncoding('utf-8');
252
- process.stdin.once('data', (data) => {
253
- resolve(data.toString().trim());
254
- });
255
- });
256
- }
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9wcm9maWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBS0EsMERBaVFDO0FBclFELG1EQUFnRDtBQUNoRCxzQ0FBMEM7QUFDMUMsNkRBQW9DO0FBRXBDLFNBQWdCLHVCQUF1QixDQUFDLE9BQWdCO0lBQ3RELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsV0FBVyxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFFdEYsT0FBTztTQUNKLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDcEIsV0FBVyxDQUFDLHFDQUFxQyxDQUFDO1NBQ2xELGNBQWMsQ0FBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUM7U0FDbEQsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4QixJQUFJLENBQUM7WUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLHVCQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDL0MsTUFBTSxRQUFRLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFRLGdCQUFnQixPQUFPLENBQUMsT0FBTyxZQUFZLENBQUMsQ0FBQztZQUV0RixJQUFJLFFBQVEsQ0FBQyxPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFLLENBQUMsTUFBTSxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQztvQkFDcEUsT0FBTztnQkFDVCxDQUFDO2dCQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQztnQkFFeEQsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMs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Q0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE9BQU8sSUFBSSw0QkFBNEIsQ0FBQyxDQUFDO1lBQ3RHLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDL0YsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUVELEtBQUssVUFBVSxXQUFXLENBQUMsTUFBYztJQUN2QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBBdXRoSGVscGVyIH0gZnJvbSAnLi4vYXV0aC9BdXRoSGVscGVyJztcbmltcG9ydCB7IGNvbmZpZ01hbmFnZXIgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IGNoYWxrIGZyb20gJy4uL3V0aWxzL2NvbG9ycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclByb2ZpbGVDb21tYW5kcyhwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9ncmFtLmNvbW1hbmQoJ3Byb2ZpbGUnKS5kZXNjcmlwdGlvbignUHJvZmlsZSBtYW5hZ2VtZW50IGNvbW1hbmRzJyk7XG5cbiAgcHJvZmlsZVxuICAgIC5jb21tYW5kKCdxdWVzdGlvbnMnKVxuICAgIC5kZXNjcmlwdGlvbignR2V0IHByb2ZpbGUgcXVlc3Rpb25zIGZvciBhIG5ldHdvcmsnKVxuICAgIC5yZXF1aXJlZE9wdGlvbignLW4sIC0tbmV0d29yayA8aWQ+JywgJ05ldHdvcmsgSUQnKVxuICAgIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IEF1dGhIZWxwZXIuZ2V0QXBpQ2xpZW50KCk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxhbnlbXT4oYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vcXVlc3Rpb25zYCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdObyBwcm9maWxlIHF1ZXN0aW9ucyBmb3IgdGhpcyBuZXR3b3JrLicpKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbi5ib2xkKCdcXG5Qcm9maWxlIFF1ZXN0aW9uczpcXG4nKSk7XG5cbiAgICAgICAgICByZXNwb25zZS5kYXRhLmZvckVhY2goKHE6IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgJHtpbmRleCArIDF9LiAke3EucXVlc3Rpb259YCkpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAgSUQ6ICR7cS5pZH1gKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgICBSZXF1aXJlZDogJHtxLnJlcXVpcmVkID8gJ1llcycgOiAnTm8nfWApKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSB8fCAnRmFpbGVkIHRvIGdldCBxdWVzdGlvbnMnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcHJvZmlsZVxuICAgIC5jb21tYW5kKCdzZXQnKVxuICAgIC5kZXNjcmlwdGlvbignU2V0IHlvdXIgcHJvZmlsZSBmb3IgYSBuZXR3b3JrJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAub3B0aW9uKCctcywgLS1zaG9ydCA8ZGVzYz4nLCAnU2hvcnQgZGVzY3JpcHRpb24nKVxuICAgIC5vcHRpb24oJy1sLCAtLWxvbmcgPGRlc2M+JywgJ0xvbmcgZGVzY3JpcHRpb24nKVxuICAgIC5vcHRpb24oJy1mLCAtLWxvbmctZmlsZSA8ZmlsZT4nLCAnUmVhZCBsb25nIGRlc2NyaXB0aW9uIGZyb20gZmlsZScpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgbGV0IGxvbmdEZXNjcmlwdGlvbiA9IG9wdGlvbnMubG9uZztcbiAgICAgICAgaWYgKG9wdGlvbnMubG9uZ0ZpbGUpIHtcbiAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IG9wdGlvbnMubG9uZ0ZpbGU7XG4gICAgICAgICAgbG9uZ0Rlc2NyaXB0aW9uID0gcmVxdWlyZSgnZnMnKS5yZWFkRmlsZVN5bmMoZmlsZVBhdGgsICd1dGYtOCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXBkYXRlRGF0YTogYW55ID0ge307XG4gICAgICAgIGlmIChvcHRpb25zLnNob3J0KSB1cGRhdGVEYXRhLnNob3J0RGVzY3JpcHRpb24gPSBvcHRpb25zLnNob3J0O1xuICAgICAgICBpZiAobG9uZ0Rlc2NyaXB0aW9uKSB1cGRhdGVEYXRhLmxvbmdEZXNjcmlwdGlvbiA9IGxvbmdEZXNjcmlwdGlvbjtcblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wdXQoYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vcHJvZmlsZWAsIHVwZGF0ZURhdGEpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBQcm9maWxlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gdXBkYXRlIHByb2ZpbGUnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcHJvZmlsZVxuICAgIC5jb21tYW5kKCdnZXQnKVxuICAgIC5kZXNjcmlwdGlvbignR2V0IHlvdXIgcHJvZmlsZSBmb3IgYSBuZXR3b3JrJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zOiBhbnkpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgY2xpZW50LCBjcmVkZW50aWFscyB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PGFueT4oYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vcHJvZmlsZWApO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzICYmIHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICBjb25zdCBwcm9maWxlID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuLmJvbGQoJ1xcbllvdXIgUHJvZmlsZVxcbicpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdQdWJsaWMgVG9rZW46JyksIGNyZWRlbnRpYWxzLnB1YmxpY1Rva2VuKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdSb2xlOicpLCBwcm9maWxlLnJvbGUgfHwgJ21lbWJlcicpO1xuICAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdTaG9ydCBEZXNjcmlwdGlvbjonKSwgcHJvZmlsZS5zaG9ydERlc2NyaXB0aW9uIHx8ICcobm9uZSknKTtcblxuICAgICAgICAgIGlmIChwcm9maWxlLmxvbmdEZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnXFxuTG9uZyBEZXNjcmlwdGlvbjonKSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhwcm9maWxlLmxvbmdEZXNjcmlwdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgcmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBnZXQgcHJvZmlsZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBwcm9maWxlXG4gICAgLmNvbW1hbmQoJ3Nob3cnKVxuICAgIC5kZXNjcmlwdGlvbihcIlNob3cgYW5vdGhlciBzd2ltbWVyJ3MgcHVibGljIHByb2ZpbGVcIilcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1wLCAtLXB1YmxpYy10b2tlbiA8dG9rZW4+JywgJ1B1YmxpYyBUb2tlbiBvZiB0aGUgc3dpbW1lcicpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQuZ2V0PGFueT4oYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vbWVtYmVycy8ke29wdGlvbnMucHVibGljVG9rZW59L3Byb2ZpbGVgKTtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyAmJiByZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgcHJvZmlsZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbi5ib2xkKGBcXG5QdWJsaWMgUHJvZmlsZTogJHtvcHRpb25zLnB1YmxpY1Rva2VufVxcbmApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdTaG9ydCBEZXNjcmlwdGlvbjonKSwgcHJvZmlsZS5zaG9ydERlc2NyaXB0aW9uIHx8ICcobm9uZSknKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAocHJvZmlsZS5sb25nRGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1xcbkxvbmcgRGVzY3JpcHRpb246JykpO1xuICAgICAgICAgICAgY29uc29sZS5sb2cocHJvZmlsZS5sb25nRGVzY3JpcHRpb24pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwcm9maWxlLnByb2ZpbGVBbnN3ZXJzICYmIE9iamVjdC5rZXlzKHByb2ZpbGUucHJvZmlsZUFuc3dlcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKCdcXG5Qcm9maWxlIEFuc3dlcnM6JykpO1xuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocHJvZmlsZS5wcm9maWxlQW5zd2VycykuZm9yRWFjaCgoW3FJZCwgYW5zd2VyXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtjaGFsay5jeWFuKHFJZCl9OiAke2NoYWxrLndoaXRlKFN0cmluZyhhbnN3ZXIpKX1gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gZ2V0IHB1YmxpYyBwcm9maWxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gIHByb2ZpbGVcbiAgICAuY29tbWFuZCgnY29tcGxldGUnKVxuICAgIC5kZXNjcmlwdGlvbignQ29tcGxldGUgcHJvZmlsZSBieSBhbnN3ZXJpbmcgcXVlc3Rpb25zJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1uLCAtLW5ldHdvcmsgPGlkPicsICdOZXR3b3JrIElEJylcbiAgICAub3B0aW9uKCctYSwgLS1hbnN3ZXJzIDxqc29uPicsICdKU09OIHN0cmluZyBvZiBxdWVzdGlvbiBJRCB0byBhbnN3ZXIgbWFwcGluZycpXG4gICAgLm9wdGlvbignLS1hdXRvJywgJ0F1dG8tYW5zd2VyIGFsbCByZXF1aXJlZCBxdWVzdGlvbnMgd2l0aCBkZWZhdWx0IHJlc3BvbnNlcycpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG5cbiAgICAgICAgbGV0IGFuc3dlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgICAgICBpZiAob3B0aW9ucy5hbnN3ZXJzKSB7XG4gICAgICAgICAgYW5zd2VycyA9IEpTT04ucGFyc2Uob3B0aW9ucy5hbnN3ZXJzKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcHRpb25zLmF1dG8pIHtcbiAgICAgICAgICBjb25zdCBxdWVzdGlvbnNSZXMgPSBhd2FpdCBjbGllbnQuZ2V0PGFueVtdPihgL3YxL25ldHdvcmtzLyR7b3B0aW9ucy5uZXR3b3JrfS9xdWVzdGlvbnNgKTtcbiAgICAgICAgICBpZiAocXVlc3Rpb25zUmVzLnN1Y2Nlc3MgJiYgcXVlc3Rpb25zUmVzLmRhdGEpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcSBvZiBxdWVzdGlvbnNSZXMuZGF0YSkge1xuICAgICAgICAgICAgICBpZiAocS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgICAgIGFuc3dlcnNbcS5pZF0gPSBgQXV0by1jb21wbGV0ZWQgYW5zd2VyIGZvcjogJHtxLnF1ZXN0aW9ufWA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ0Vycm9yOicpLCAnUHJvdmlkZSAtLWFuc3dlcnMgPGpzb24+IG9yIC0tYXV0byBmbGFnJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdChgL3YxL25ldHdvcmtzLyR7b3B0aW9ucy5uZXR3b3JrfS9wcm9maWxlL2NvbXBsZXRlYCwge1xuICAgICAgICAgIGFuc3dlcnNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSByZXNwb25zZS5kYXRhIGFzIGFueTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIFByb2ZpbGUgY29tcGxldGVkIScpKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCdDb21wbGV0aW9uOicpLCBgJHtkYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlfSVgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIHJlc3BvbnNlLmVycm9yPy5tZXNzYWdlIHx8ICdGYWlsZWQgdG8gY29tcGxldGUgcHJvZmlsZScpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICBwcm9maWxlXG4gICAgLmNvbW1hbmQoJ2J1aWxkJylcbiAgICAuZGVzY3JpcHRpb24oJ0J1aWxkIHByb2ZpbGUgaW50ZXJhY3RpdmVseScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbiwgLS1uZXR3b3JrIDxpZD4nLCAnTmV0d29yayBJRCcpXG4gICAgLm9wdGlvbignLWksIC0taW50ZXJhY3RpdmUnLCAnSW50ZXJhY3RpdmUgbW9kZScsIHRydWUpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9uczogYW55KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB7IGNsaWVudCB9ID0gYXdhaXQgQXV0aEhlbHBlci5lbnN1cmVBdXRoZW50aWNhdGVkKG9wdGlvbnMubmV0d29yayk7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2xpZW50LmdldDxhbnlbXT4oYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vcXVlc3Rpb25zYCk7XG5cbiAgICAgICAgaWYgKCFyZXNwb25zZS5zdWNjZXNzIHx8ICFyZXNwb25zZS5kYXRhIHx8IHJlc3BvbnNlLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdObyBwcm9maWxlIHF1ZXN0aW9ucyBmb3IgdGhpcyBuZXR3b3JrLicpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWVzdGlvbnMgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICBjb25zdCBhbnN3ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4uYm9sZCgnXFxuQnVpbGRpbmcgWW91ciBQcm9maWxlXFxuJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBGb3VuZCAke3F1ZXN0aW9ucy5sZW5ndGh9IHByb2ZpbGUgcXVlc3Rpb25zXFxuYCkpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVlc3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcSA9IHF1ZXN0aW9uc1tpXTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGAke2kgKyAxfS4gJHtxLnF1ZXN0aW9ufWApKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICBSZXF1aXJlZDonKSwgcS5yZXF1aXJlZCA/ICdZZXMnIDogJ05vJyk7XG5cbiAgICAgICAgICBpZiAocS5yZXF1aXJlZCkge1xuICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgYXNrUXVlc3Rpb24ocS5xdWVzdGlvbiArICcgJyk7XG4gICAgICAgICAgICBpZiAoIWFuc3dlci50cmltKCkpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoJ1JlcXVpcmVkIHF1ZXN0aW9uIG1pc3NpbmcgYW5zd2VyLiBQbGVhc2UgdHJ5IGFnYWluLicpKTtcbiAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYW5zd2Vyc1txLmlkIHx8IGBxdWVzdGlvbl8ke2l9YF0gPSBhbnN3ZXI7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IGFza1F1ZXN0aW9uKHEucXVlc3Rpb24gKyAnIChvcHRpb25hbCk6ICcpO1xuICAgICAgICAgICAgaWYgKGFuc3dlci50cmltKCkpIHtcbiAgICAgICAgICAgICAgYW5zd2Vyc1txLmlkIHx8IGBxdWVzdGlvbl8ke2l9YF0gPSBhbnN3ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuLmJvbGQoJ1xcbkNvbXBsZXRpbmcgcHJvZmlsZS4uLlxcbicpKTtcblxuICAgICAgICBjb25zdCBjb21wbGV0ZVJlc3BvbnNlID0gYXdhaXQgY2xpZW50LnBvc3QoYC92MS9uZXR3b3Jrcy8ke29wdGlvbnMubmV0d29ya30vcHJvZmlsZS9jb21wbGV0ZWAsIHtcbiAgICAgICAgICBhbnN3ZXJzXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb21wbGV0ZVJlc3BvbnNlLnN1Y2Nlc3MgJiYgY29tcGxldGVSZXNwb25zZS5kYXRhKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBsZXRlUmVzcG9uc2UuZGF0YSBhcyBhbnk7XG5cbiAgICAgICAgICBhd2FpdCBjb25maWdNYW5hZ2VyLnNhdmVKU09OUHJvZmlsZShvcHRpb25zLm5ldHdvcmssIHtcbiAgICAgICAgICAgIG5ldHdvcmtJZDogb3B0aW9ucy5uZXR3b3JrLFxuICAgICAgICAgICAgYW5zd2VycyxcbiAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBkYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlLFxuICAgICAgICAgICAgY29tcGxldGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBQcm9maWxlIGJ1aWx0IHN1Y2Nlc3NmdWxseSFcXG4nKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignQ29tcGxldGlvbjonKSwgYCR7ZGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZX0lYCk7XG5cbiAgICAgICAgICBpZiAoZGF0YS5yZWNvbW1lbmRhdGlvbnMgJiYgZGF0YS5yZWNvbW1lbmRhdGlvbnMuY29udmVyc2F0aW9uc1RvSm9pbiAmJiBkYXRhLnJlY29tbWVuZGF0aW9ucy5jb252ZXJzYXRpb25zVG9Kb2luLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnXFxuUmVjb21tZW5kZWQgY29udmVyc2F0aW9ucyB0byBqb2luOicpKTtcbiAgICAgICAgICAgIGRhdGEucmVjb21tZW5kYXRpb25zLmNvbnZlcnNhdGlvbnNUb0pvaW4uZm9yRWFjaCgoY29udklkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAtJyksIGNvbnZJZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZGF0YS5yZWNvbW1lbmRhdGlvbnMgJiYgZGF0YS5yZWNvbW1lbmRhdGlvbnMubmV0d29ya1N0cmVuZ3RocyAmJiBkYXRhLnJlY29tbWVuZGF0aW9ucy5uZXR3b3JrU3RyZW5ndGhzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnXFxuWW91ciBuZXR3b3JrIHN0cmVuZ3RoczonKSk7XG4gICAgICAgICAgICBkYXRhLnJlY29tbWVuZGF0aW9ucy5uZXR3b3JrU3RyZW5ndGhzLmZvckVhY2goKHN0cmVuZ3RoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAtJyksIHN0cmVuZ3RoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZCgnRXJyb3I6JyksIGNvbXBsZXRlUmVzcG9uc2UuZXJyb3I/Lm1lc3NhZ2UgfHwgJ0ZhaWxlZCB0byBjb21wbGV0ZSBwcm9maWxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKCdFcnJvcjonKSwgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicpO1xuICAgICAgfVxuICAgIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBhc2tRdWVzdGlvbihwcm9tcHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHByb21wdCk7XG4gICAgcHJvY2Vzcy5zdGRpbi5zZXRFbmNvZGluZygndXRmLTgnKTtcbiAgICBwcm9jZXNzLnN0ZGluLm9uY2UoJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgcmVzb2x2ZShkYXRhLnRvU3RyaW5nKCkudHJpbSgpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=
@@ -1,47 +0,0 @@
1
- export interface GlobalConfig {
2
- apiUrl: string;
3
- defaultFormat: 'toon' | 'json';
4
- humansApiUrl?: string;
5
- humanUid?: string;
6
- humanJwt?: string;
7
- humanJwtExpiresAt?: number;
8
- }
9
- export interface NetworkCredentials {
10
- publicToken: string;
11
- privateKey: string;
12
- jwt?: string;
13
- expiresAt?: number;
14
- }
15
- export interface Identity {
16
- publicToken: string;
17
- privateKey: string;
18
- }
19
- export declare class ConfigManager {
20
- private initialized;
21
- private initializing;
22
- init(): Promise<void>;
23
- getGlobalConfig(): Promise<GlobalConfig>;
24
- saveGlobalConfig(config: GlobalConfig): Promise<void>;
25
- saveDefaultIdentity(identity: Identity): Promise<void>;
26
- getDefaultIdentity(): Promise<Identity | null>;
27
- setApiUrl(url: string): Promise<void>;
28
- getCredentials(networkId: string): Promise<NetworkCredentials | null>;
29
- saveCredentials(networkId: string, credentials: NetworkCredentials): Promise<void>;
30
- addRegisteredNetwork(networkId: string, reason?: string): Promise<void>;
31
- getRegisteredNetworks(): Promise<string[]>;
32
- getNetworkHistory(): Promise<{
33
- id: string;
34
- reason?: string;
35
- }[]>;
36
- clearCredentials(networkId: string): Promise<void>;
37
- getProfile(networkId: string): Promise<string | null>;
38
- saveProfile(networkId: string, content: string): Promise<void>;
39
- getJSONProfile<T = Record<string, any>>(networkId: string): Promise<T | null>;
40
- saveJSONProfile(networkId: string, data: Record<string, any>): Promise<void>;
41
- getAllJSONProfiles(): Promise<Record<string, any>>;
42
- getCache<T>(key: string): Promise<T | null>;
43
- setCache<T>(key: string, data: T): Promise<void>;
44
- clearCache(): Promise<void>;
45
- getConfigPath(): string;
46
- }
47
- export declare const configManager: ConfigManager;
@@ -1,234 +0,0 @@
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.configManager = exports.ConfigManager = void 0;
37
- const path = __importStar(require("path"));
38
- const os = __importStar(require("os"));
39
- const fs = __importStar(require("fs-extra"));
40
- const logger_1 = require("../utils/logger");
41
- const CONFIG_DIR = path.join(os.homedir(), '.agenticpool');
42
- const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
43
- const IDENTITY_FILE = path.join(CONFIG_DIR, 'identity.json');
44
- const CREDENTIALS_DIR = path.join(CONFIG_DIR, 'credentials');
45
- const PROFILES_DIR = path.join(CONFIG_DIR, 'profiles');
46
- const CACHE_DIR = path.join(CONFIG_DIR, 'cache');
47
- const NETWORKS_FILE = path.join(CONFIG_DIR, 'networks.md');
48
- class ConfigManager {
49
- constructor() {
50
- this.initialized = false;
51
- this.initializing = false;
52
- }
53
- async init() {
54
- if (this.initialized || this.initializing)
55
- return;
56
- this.initializing = true;
57
- logger_1.logger.debug(`Initializing ConfigManager. Path: ${CONFIG_DIR}`);
58
- try {
59
- await fs.ensureDir(CONFIG_DIR);
60
- await fs.ensureDir(CREDENTIALS_DIR);
61
- await fs.ensureDir(PROFILES_DIR);
62
- await fs.ensureDir(CACHE_DIR);
63
- if (!(await fs.pathExists(CONFIG_FILE))) {
64
- logger_1.logger.debug('Creating default config file');
65
- const defaultConfig = {
66
- apiUrl: 'https://api.agenticpool.net',
67
- defaultFormat: 'toon'
68
- };
69
- await fs.writeJson(CONFIG_FILE, defaultConfig, { spaces: 2 });
70
- }
71
- if (!(await fs.pathExists(NETWORKS_FILE))) {
72
- logger_1.logger.debug('Creating default networks file');
73
- await fs.writeFile(NETWORKS_FILE, '# Registered AgenticPool Networks\n\n');
74
- }
75
- this.initialized = true;
76
- logger_1.logger.debug('ConfigManager initialized');
77
- }
78
- catch (e) {
79
- logger_1.logger.debug(`ConfigManager init failed: ${e instanceof Error ? e.message : 'Unknown'}`);
80
- throw e;
81
- }
82
- finally {
83
- this.initializing = false;
84
- }
85
- }
86
- async getGlobalConfig() {
87
- await this.init();
88
- return fs.readJson(CONFIG_FILE);
89
- }
90
- async saveGlobalConfig(config) {
91
- await this.init();
92
- logger_1.logger.debug('Saving global config');
93
- await fs.writeJson(CONFIG_FILE, config, { spaces: 2 });
94
- }
95
- async saveDefaultIdentity(identity) {
96
- await this.init();
97
- logger_1.logger.debug('Saving default identity');
98
- await fs.writeJson(IDENTITY_FILE, identity, { spaces: 2 });
99
- }
100
- async getDefaultIdentity() {
101
- await this.init();
102
- if (!(await fs.pathExists(IDENTITY_FILE))) {
103
- return null;
104
- }
105
- return fs.readJson(IDENTITY_FILE);
106
- }
107
- async setApiUrl(url) {
108
- const config = await this.getGlobalConfig();
109
- config.apiUrl = url;
110
- await this.saveGlobalConfig(config);
111
- }
112
- async getCredentials(networkId) {
113
- await this.init();
114
- const credFile = path.join(CREDENTIALS_DIR, `${networkId}.json`);
115
- if (!(await fs.pathExists(credFile))) {
116
- return null;
117
- }
118
- const creds = await fs.readJson(credFile);
119
- if (creds.expiresAt && Date.now() > creds.expiresAt) {
120
- return null;
121
- }
122
- return creds;
123
- }
124
- async saveCredentials(networkId, credentials) {
125
- await this.init();
126
- const credFile = path.join(CREDENTIALS_DIR, `${networkId}.json`);
127
- logger_1.logger.debug(`Saving credentials for ${networkId}`);
128
- await fs.writeJson(credFile, credentials, { spaces: 2 });
129
- }
130
- async addRegisteredNetwork(networkId, reason) {
131
- await this.init();
132
- logger_1.logger.debug(`Registering network in local history: ${networkId}`);
133
- const content = await fs.readFile(NETWORKS_FILE, 'utf-8');
134
- const lines = content.split('\n');
135
- const entryPrefix = `- ${networkId}`;
136
- const fullEntry = `- ${networkId}${reason ? ` | Reason: ${reason}` : ''}`;
137
- const existingIndex = lines.findIndex(line => line.trim().startsWith(entryPrefix));
138
- if (existingIndex !== -1) {
139
- lines[existingIndex] = fullEntry;
140
- await fs.writeFile(NETWORKS_FILE, lines.join('\n'));
141
- }
142
- else {
143
- await fs.appendFile(NETWORKS_FILE, `${fullEntry}\n`);
144
- }
145
- }
146
- async getRegisteredNetworks() {
147
- await this.init();
148
- const content = await fs.readFile(NETWORKS_FILE, 'utf-8');
149
- return content
150
- .split('\n')
151
- .filter(line => line.startsWith('- '))
152
- .map(line => line.replace('- ', '').trim());
153
- }
154
- async getNetworkHistory() {
155
- await this.init();
156
- const content = await fs.readFile(NETWORKS_FILE, 'utf-8');
157
- return content
158
- .split('\n')
159
- .filter(line => line.startsWith('- '))
160
- .map(line => {
161
- const parts = line.replace('- ', '').split('| Reason:');
162
- return {
163
- id: parts[0].trim(),
164
- reason: parts[1] ? parts[1].trim() : undefined
165
- };
166
- });
167
- }
168
- async clearCredentials(networkId) {
169
- await this.init();
170
- const credFile = path.join(CREDENTIALS_DIR, `${networkId}.json`);
171
- await fs.remove(credFile);
172
- }
173
- async getProfile(networkId) {
174
- await this.init();
175
- const profileFile = path.join(PROFILES_DIR, `${networkId}.md`);
176
- if (!(await fs.pathExists(profileFile))) {
177
- return null;
178
- }
179
- return fs.readFile(profileFile, 'utf-8');
180
- }
181
- async saveProfile(networkId, content) {
182
- await this.init();
183
- const profileFile = path.join(PROFILES_DIR, `${networkId}.md`);
184
- await fs.writeFile(profileFile, content);
185
- }
186
- async getJSONProfile(networkId) {
187
- await this.init();
188
- const profileFile = path.join(PROFILES_DIR, `${networkId}.json`);
189
- if (!(await fs.pathExists(profileFile))) {
190
- return null;
191
- }
192
- return fs.readJson(profileFile);
193
- }
194
- async saveJSONProfile(networkId, data) {
195
- await this.init();
196
- const profileFile = path.join(PROFILES_DIR, `${networkId}.json`);
197
- await fs.writeJson(profileFile, data, { spaces: 2 });
198
- }
199
- async getAllJSONProfiles() {
200
- await this.init();
201
- const files = await fs.readdir(PROFILES_DIR);
202
- const profiles = {};
203
- for (const file of files) {
204
- if (file.endsWith('.json')) {
205
- const networkId = file.replace('.json', '');
206
- profiles[networkId] = await fs.readJson(path.join(PROFILES_DIR, file));
207
- }
208
- }
209
- return profiles;
210
- }
211
- async getCache(key) {
212
- await this.init();
213
- const cacheFile = path.join(CACHE_DIR, `${key}.json`);
214
- if (!(await fs.pathExists(cacheFile))) {
215
- return null;
216
- }
217
- return fs.readJson(cacheFile);
218
- }
219
- async setCache(key, data) {
220
- await this.init();
221
- const cacheFile = path.join(CACHE_DIR, `${key}.json`);
222
- await fs.writeJson(cacheFile, data, { spaces: 2 });
223
- }
224
- async clearCache() {
225
- await this.init();
226
- await fs.emptyDir(CACHE_DIR);
227
- }
228
- getConfigPath() {
229
- return CONFIG_DIR;
230
- }
231
- }
232
- exports.ConfigManager = ConfigManager;
233
- exports.configManager = new ConfigManager();
234
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvQ29uZmlnTWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBQ3pCLDZDQUErQjtBQUUvQiw0Q0FBeUM7QUFFekMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDM0QsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDekQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFDN0QsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDN0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDdkQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7QUF1QjNELE1BQWEsYUFBYTtJQUExQjtRQUNVLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBb04vQixDQUFDO0lBbE5DLEtBQUssQ0FBQyxJQUFJO1FBQ1IsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQUUsT0FBTztRQUVsRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixlQUFN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QUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQUksR0FBVyxFQUFFLElBQU87UUFDcEMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2QsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEIsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxhQUFhO1FBQ1gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGO0FBdE5ELHNDQXNOQztBQUVZLFFBQUEsYUFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0IHsgQXV0aFRva2VucyB9IGZyb20gJy4uL2RhdGFtb2RlbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXInO1xuXG5jb25zdCBDT05GSUdfRElSID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5hZ2VudGljcG9vbCcpO1xuY29uc3QgQ09ORklHX0ZJTEUgPSBwYXRoLmpvaW4oQ09ORklHX0RJUiwgJ2NvbmZpZy5qc29uJyk7XG5jb25zdCBJREVOVElUWV9GSUxFID0gcGF0aC5qb2luKENPTkZJR19ESVIsICdpZGVudGl0eS5qc29uJyk7XG5jb25zdCBDUkVERU5USUFMU19ESVIgPSBwYXRoLmpvaW4oQ09ORklHX0RJUiwgJ2NyZWRlbnRpYWxzJyk7XG5jb25zdCBQUk9GSUxFU19ESVIgPSBwYXRoLmpvaW4oQ09ORklHX0RJUiwgJ3Byb2ZpbGVzJyk7XG5jb25zdCBDQUNIRV9ESVIgPSBwYXRoLmpvaW4oQ09ORklHX0RJUiwgJ2NhY2hlJyk7XG5jb25zdCBORVRXT1JLU19GSUxFID0gcGF0aC5qb2luKENPTkZJR19ESVIsICduZXR3b3Jrcy5tZCcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEdsb2JhbENvbmZpZyB7XG4gIGFwaVVybDogc3RyaW5nO1xuICBkZWZhdWx0Rm9ybWF0OiAndG9vbicgfCAnanNvbic7XG4gIGh1bWFuc0FwaVVybD86IHN0cmluZztcbiAgaHVtYW5VaWQ/OiBzdHJpbmc7XG4gIGh1bWFuSnd0Pzogc3RyaW5nO1xuICBodW1hbkp3dEV4cGlyZXNBdD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrQ3JlZGVudGlhbHMge1xuICBwdWJsaWNUb2tlbjogc3RyaW5nO1xuICBwcml2YXRlS2V5OiBzdHJpbmc7XG4gIGp3dD86IHN0cmluZztcbiAgZXhwaXJlc0F0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5IHtcbiAgcHVibGljVG9rZW46IHN0cmluZztcbiAgcHJpdmF0ZUtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ29uZmlnTWFuYWdlciB7XG4gIHByaXZhdGUgaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpbml0aWFsaXppbmcgPSBmYWxzZTtcblxuICBhc3luYyBpbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmluaXRpYWxpemVkIHx8IHRoaXMuaW5pdGlhbGl6aW5nKSByZXR1cm47XG4gICAgXG4gICAgdGhpcy5pbml0aWFsaXppbmcgPSB0cnVlO1xuICAgIGxvZ2dlci5kZWJ1ZyhgSW5pdGlhbGl6aW5nIENvbmZpZ01hbmFnZXIuIFBhdGg6ICR7Q09ORklHX0RJUn1gKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMuZW5zdXJlRGlyKENPTkZJR19ESVIpO1xuICAgICAgYXdhaXQgZnMuZW5zdXJlRGlyKENSRURFTlRJQUxTX0RJUik7XG4gICAgICBhd2FpdCBmcy5lbnN1cmVEaXIoUFJPRklMRVNfRElSKTtcbiAgICAgIGF3YWl0IGZzLmVuc3VyZURpcihDQUNIRV9ESVIpO1xuICAgICAgXG4gICAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKENPTkZJR19GSUxFKSkpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdDcmVhdGluZyBkZWZhdWx0IGNvbmZpZyBmaWxlJyk7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRDb25maWc6IEdsb2JhbENvbmZpZyA9IHtcbiAgICAgICAgICBhcGlVcmw6ICdodHRwczovL2FwaS5hZ2VudGljcG9vbC5uZXQnLFxuICAgICAgICAgIGRlZmF1bHRGb3JtYXQ6ICd0b29uJ1xuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBmcy53cml0ZUpzb24oQ09ORklHX0ZJTEUsIGRlZmF1bHRDb25maWcsIHsgc3BhY2VzOiAyIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKE5FVFdPUktTX0ZJTEUpKSkge1xuICAgICAgICBsb2dnZXIuZGVidWcoJ0NyZWF0aW5nIGRlZmF1bHQgbmV0d29ya3MgZmlsZScpO1xuICAgICAgICBhd2FpdCBmcy53cml0ZUZpbGUoTkVUV09SS1NfRklMRSwgJyMgUmVnaXN0ZXJlZCBBZ2VudGljUG9vbCBOZXR3b3Jrc1xcblxcbicpO1xuICAgICAgfVxuICAgICAgXG4gICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnQ29uZmlnTWFuYWdlciBpbml0aWFsaXplZCcpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgQ29uZmlnTWFuYWdlciBpbml0IGZhaWxlZDogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiAnVW5rbm93bid9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluaXRpYWxpemluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldEdsb2JhbENvbmZpZygpOiBQcm9taXNlPEdsb2JhbENvbmZpZz4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIHJldHVybiBmcy5yZWFkSnNvbihDT05GSUdfRklMRSk7XG4gIH1cblxuICBhc3luYyBzYXZlR2xvYmFsQ29uZmlnKGNvbmZpZzogR2xvYmFsQ29uZmlnKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdTYXZpbmcgZ2xvYmFsIGNvbmZpZycpO1xuICAgIGF3YWl0IGZzLndyaXRlSnNvbihDT05GSUdfRklMRSwgY29uZmlnLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVEZWZhdWx0SWRlbnRpdHkoaWRlbnRpdHk6IElkZW50aXR5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgbG9nZ2VyLmRlYnVnKCdTYXZpbmcgZGVmYXVsdCBpZGVudGl0eScpO1xuICAgIGF3YWl0IGZzLndyaXRlSnNvbihJREVOVElUWV9GSUxFLCBpZGVudGl0eSwgeyBzcGFjZXM6IDIgfSk7XG4gIH1cblxuICBhc3luYyBnZXREZWZhdWx0SWRlbnRpdHkoKTogUHJvbWlzZTxJZGVudGl0eSB8IG51bGw+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKElERU5USVRZX0ZJTEUpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmcy5yZWFkSnNvbihJREVOVElUWV9GSUxFKTtcbiAgfVxuXG4gIGFzeW5jIHNldEFwaVVybCh1cmw6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IGF3YWl0IHRoaXMuZ2V0R2xvYmFsQ29uZmlnKCk7XG4gICAgY29uZmlnLmFwaVVybCA9IHVybDtcbiAgICBhd2FpdCB0aGlzLnNhdmVHbG9iYWxDb25maWcoY29uZmlnKTtcbiAgfVxuXG4gIGFzeW5jIGdldENyZWRlbnRpYWxzKG5ldHdvcmtJZDogc3RyaW5nKTogUHJvbWlzZTxOZXR3b3JrQ3JlZGVudGlhbHMgfCBudWxsPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgY29uc3QgY3JlZEZpbGUgPSBwYXRoLmpvaW4oQ1JFREVOVElBTFNfRElSLCBgJHtuZXR3b3JrSWR9Lmpzb25gKTtcbiAgICBcbiAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKGNyZWRGaWxlKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBjb25zdCBjcmVkcyA9IGF3YWl0IGZzLnJlYWRKc29uKGNyZWRGaWxlKTtcbiAgICBcbiAgICBpZiAoY3JlZHMuZXhwaXJlc0F0ICYmIERhdGUubm93KCkgPiBjcmVkcy5leHBpcmVzQXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gY3JlZHM7XG4gIH1cblxuICBhc3luYyBzYXZlQ3JlZGVudGlhbHMobmV0d29ya0lkOiBzdHJpbmcsIGNyZWRlbnRpYWxzOiBOZXR3b3JrQ3JlZGVudGlhbHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBjb25zdCBjcmVkRmlsZSA9IHBhdGguam9pbihDUkVERU5USUFMU19ESVIsIGAke25ldHdvcmtJZH0uanNvbmApO1xuICAgIGxvZ2dlci5kZWJ1ZyhgU2F2aW5nIGNyZWRlbnRpYWxzIGZvciAke25ldHdvcmtJZH1gKTtcbiAgICBhd2FpdCBmcy53cml0ZUpzb24oY3JlZEZpbGUsIGNyZWRlbnRpYWxzLCB7IHNwYWNlczogMiB9KTtcbiAgfVxuXG4gIGFzeW5jIGFkZFJlZ2lzdGVyZWROZXR3b3JrKG5ldHdvcmtJZDogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBsb2dnZXIuZGVidWcoYFJlZ2lzdGVyaW5nIG5ldHdvcmsgaW4gbG9jYWwgaGlzdG9yeTogJHtuZXR3b3JrSWR9YCk7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKE5FVFdPUktTX0ZJTEUsICd1dGYtOCcpO1xuICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gICAgXG4gICAgY29uc3QgZW50cnlQcmVmaXggPSBgLSAke25ldHdvcmtJZH1gO1xuICAgIGNvbnN0IGZ1bGxFbnRyeSA9IGAtICR7bmV0d29ya0lkfSR7cmVhc29uID8gYCB8IFJlYXNvbjogJHtyZWFzb259YCA6ICcnfWA7XG4gICAgXG4gICAgY29uc3QgZXhpc3RpbmdJbmRleCA9IGxpbmVzLmZpbmRJbmRleChsaW5lID0+IGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoZW50cnlQcmVmaXgpKTtcbiAgICBcbiAgICBpZiAoZXhpc3RpbmdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGxpbmVzW2V4aXN0aW5nSW5kZXhdID0gZnVsbEVudHJ5O1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKE5FVFdPUktTX0ZJTEUsIGxpbmVzLmpvaW4oJ1xcbicpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgZnMuYXBwZW5kRmlsZShORVRXT1JLU19GSUxFLCBgJHtmdWxsRW50cnl9XFxuYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0UmVnaXN0ZXJlZE5ldHdvcmtzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoTkVUV09SS1NfRklMRSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLnN0YXJ0c1dpdGgoJy0gJykpXG4gICAgICAubWFwKGxpbmUgPT4gbGluZS5yZXBsYWNlKCctICcsICcnKS50cmltKCkpO1xuICB9XG5cbiAgYXN5bmMgZ2V0TmV0d29ya0hpc3RvcnkoKTogUHJvbWlzZTx7IGlkOiBzdHJpbmc7IHJlYXNvbj86IHN0cmluZyB9W10+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoTkVUV09SS1NfRklMRSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIGNvbnRlbnRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLnN0YXJ0c1dpdGgoJy0gJykpXG4gICAgICAubWFwKGxpbmUgPT4ge1xuICAgICAgICBjb25zdCBwYXJ0cyA9IGxpbmUucmVwbGFjZSgnLSAnLCAnJykuc3BsaXQoJ3wgUmVhc29uOicpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkOiBwYXJ0c1swXS50cmltKCksXG4gICAgICAgICAgcmVhc29uOiBwYXJ0c1sxXSA/IHBhcnRzWzFdLnRyaW0oKSA6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBjbGVhckNyZWRlbnRpYWxzKG5ldHdvcmtJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgY29uc3QgY3JlZEZpbGUgPSBwYXRoLmpvaW4oQ1JFREVOVElBTFNfRElSLCBgJHtuZXR3b3JrSWR9Lmpzb25gKTtcbiAgICBhd2FpdCBmcy5yZW1vdmUoY3JlZEZpbGUpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UHJvZmlsZShuZXR3b3JrSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIGNvbnN0IHByb2ZpbGVGaWxlID0gcGF0aC5qb2luKFBST0ZJTEVTX0RJUiwgYCR7bmV0d29ya0lkfS5tZGApO1xuICAgIFxuICAgIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMocHJvZmlsZUZpbGUpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBmcy5yZWFkRmlsZShwcm9maWxlRmlsZSwgJ3V0Zi04Jyk7XG4gIH1cblxuICBhc3luYyBzYXZlUHJvZmlsZShuZXR3b3JrSWQ6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgY29uc3QgcHJvZmlsZUZpbGUgPSBwYXRoLmpvaW4oUFJPRklMRVNfRElSLCBgJHtuZXR3b3JrSWR9Lm1kYCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKHByb2ZpbGVGaWxlLCBjb250ZW50KTtcbiAgfVxuXG4gIGFzeW5jIGdldEpTT05Qcm9maWxlPFQgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+PihuZXR3b3JrSWQ6IHN0cmluZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBjb25zdCBwcm9maWxlRmlsZSA9IHBhdGguam9pbihQUk9GSUxFU19ESVIsIGAke25ldHdvcmtJZH0uanNvbmApO1xuICAgIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMocHJvZmlsZUZpbGUpKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBmcy5yZWFkSnNvbihwcm9maWxlRmlsZSk7XG4gIH1cblxuICBhc3luYyBzYXZlSlNPTlByb2ZpbGUobmV0d29ya0lkOiBzdHJpbmcsIGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICBjb25zdCBwcm9maWxlRmlsZSA9IHBhdGguam9pbihQUk9GSUxFU19ESVIsIGAke25ldHdvcmtJZH0uanNvbmApO1xuICAgIGF3YWl0IGZzLndyaXRlSnNvbihwcm9maWxlRmlsZSwgZGF0YSwgeyBzcGFjZXM6IDIgfSk7XG4gIH1cblxuICBhc3luYyBnZXRBbGxKU09OUHJvZmlsZXMoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKFBST0ZJTEVTX0RJUik7XG4gICAgY29uc3QgcHJvZmlsZXM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcuanNvbicpKSB7XG4gICAgICAgIGNvbnN0IG5ldHdvcmtJZCA9IGZpbGUucmVwbGFjZSgnLmpzb24nLCAnJyk7XG4gICAgICAgIHByb2ZpbGVzW25ldHdvcmtJZF0gPSBhd2FpdCBmcy5yZWFkSnNvbihwYXRoLmpvaW4oUFJPRklMRVNfRElSLCBmaWxlKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9maWxlcztcbiAgfVxuXG4gIGFzeW5jIGdldENhY2hlPFQ+KGtleTogc3RyaW5nKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIGNvbnN0IGNhY2hlRmlsZSA9IHBhdGguam9pbihDQUNIRV9ESVIsIGAke2tleX0uanNvbmApO1xuICAgIFxuICAgIGlmICghKGF3YWl0IGZzLnBhdGhFeGlzdHMoY2FjaGVGaWxlKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZnMucmVhZEpzb24oY2FjaGVGaWxlKTtcbiAgfVxuXG4gIGFzeW5jIHNldENhY2hlPFQ+KGtleTogc3RyaW5nLCBkYXRhOiBUKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgY29uc3QgY2FjaGVGaWxlID0gcGF0aC5qb2luKENBQ0hFX0RJUiwgYCR7a2V5fS5qc29uYCk7XG4gICAgYXdhaXQgZnMud3JpdGVKc29uKGNhY2hlRmlsZSwgZGF0YSwgeyBzcGFjZXM6IDIgfSk7XG4gIH1cblxuICBhc3luYyBjbGVhckNhY2hlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdCgpO1xuICAgIGF3YWl0IGZzLmVtcHR5RGlyKENBQ0hFX0RJUik7XG4gIH1cblxuICBnZXRDb25maWdQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIENPTkZJR19ESVI7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGNvbmZpZ01hbmFnZXIgPSBuZXcgQ29uZmlnTWFuYWdlcigpO1xuIl19
@@ -1 +0,0 @@
1
- export { ConfigManager, configManager, GlobalConfig, NetworkCredentials } from './ConfigManager';