@closedloop-ai/cli 0.2.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 (70) hide show
  1. package/dist/__tests__/cli.test.js +37 -0
  2. package/dist/__tests__/cli.test.js.map +1 -0
  3. package/dist/__tests__/config.test.js +33 -0
  4. package/dist/__tests__/config.test.js.map +1 -0
  5. package/dist/__tests__/errors.test.js +109 -0
  6. package/dist/__tests__/errors.test.js.map +1 -0
  7. package/dist/__tests__/setup.js +20 -0
  8. package/dist/__tests__/setup.js.map +1 -0
  9. package/dist/__tests__/validation.test.js +124 -0
  10. package/dist/__tests__/validation.test.js.map +1 -0
  11. package/dist/api/auth.js +27 -0
  12. package/dist/api/auth.js.map +1 -0
  13. package/dist/api/feedback.js +70 -0
  14. package/dist/api/feedback.js.map +1 -0
  15. package/dist/api/input.js +60 -0
  16. package/dist/api/input.js.map +1 -0
  17. package/dist/api/usage.js +49 -0
  18. package/dist/api/usage.js.map +1 -0
  19. package/dist/cli.js +156 -0
  20. package/dist/cli.js.map +1 -0
  21. package/dist/commands/config.js +186 -0
  22. package/dist/commands/config.js.map +1 -0
  23. package/dist/commands/feedback.js +234 -0
  24. package/dist/commands/feedback.js.map +1 -0
  25. package/dist/commands/input.js +370 -0
  26. package/dist/commands/input.js.map +1 -0
  27. package/dist/commands/list.js +81 -0
  28. package/dist/commands/list.js.map +1 -0
  29. package/dist/commands/status.js +93 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/commands/submit.js +225 -0
  32. package/dist/commands/submit.js.map +1 -0
  33. package/dist/commands/usage.js +168 -0
  34. package/dist/commands/usage.js.map +1 -0
  35. package/dist/config/constants.js +37 -0
  36. package/dist/config/constants.js.map +1 -0
  37. package/dist/config/index.js +84 -0
  38. package/dist/config/index.js.map +1 -0
  39. package/dist/types/index.js +3 -0
  40. package/dist/types/index.js.map +1 -0
  41. package/dist/utils/config.js +55 -0
  42. package/dist/utils/config.js.map +1 -0
  43. package/dist/utils/errors.js +70 -0
  44. package/dist/utils/errors.js.map +1 -0
  45. package/dist/utils/validation.js +133 -0
  46. package/dist/utils/validation.js.map +1 -0
  47. package/jest.config.js +14 -0
  48. package/package.json +42 -0
  49. package/src/__tests__/cli.test.ts +44 -0
  50. package/src/__tests__/config.test.ts +38 -0
  51. package/src/__tests__/errors.test.ts +132 -0
  52. package/src/__tests__/setup.ts +21 -0
  53. package/src/__tests__/validation.test.ts +156 -0
  54. package/src/api/auth.ts +21 -0
  55. package/src/api/feedback.ts +64 -0
  56. package/src/api/input.ts +55 -0
  57. package/src/api/usage.ts +45 -0
  58. package/src/cli.ts +158 -0
  59. package/src/commands/config.ts +192 -0
  60. package/src/commands/feedback.ts +250 -0
  61. package/src/commands/input.ts +389 -0
  62. package/src/commands/list.ts +84 -0
  63. package/src/commands/status.ts +96 -0
  64. package/src/commands/submit.ts +214 -0
  65. package/src/config/constants.ts +36 -0
  66. package/src/config/index.ts +59 -0
  67. package/src/types/index.ts +119 -0
  68. package/src/utils/errors.ts +98 -0
  69. package/src/utils/validation.ts +166 -0
  70. package/tsconfig.json +25 -0
@@ -0,0 +1,225 @@
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.submitCommand = void 0;
7
+ const commander_1 = require("commander");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const ora_1 = __importDefault(require("ora"));
10
+ const inquirer_1 = __importDefault(require("inquirer"));
11
+ const feedback_1 = require("../api/feedback");
12
+ const constants_1 = require("../config/constants");
13
+ exports.submitCommand = new commander_1.Command('submit')
14
+ .description('Submit customer input for AI analysis and insight generation')
15
+ .argument('[content]', 'Customer input content to analyze')
16
+ .option('-t, --title <title>', 'Title for this customer input')
17
+ .option('-u, --url <url>', 'Where this input came from (support ticket, survey, etc.)')
18
+ .option('-c, --customer <id>', 'Customer identifier')
19
+ .option('-n, --name <name>', 'Name of person who provided the input')
20
+ .option('-e, --email <email>', 'Email of person who provided the input')
21
+ .option('--interactive', 'Fill in details step by step')
22
+ .option('-w, --wait', 'Wait until processing is completed')
23
+ .option('--json', 'Output in JSON format')
24
+ .action(async (content, options) => {
25
+ try {
26
+ let feedbackData = {};
27
+ if (options.interactive || !content) {
28
+ // Interactive mode
29
+ const answers = await inquirer_1.default.prompt([
30
+ {
31
+ type: 'input',
32
+ name: 'content',
33
+ message: 'What customer input would you like to analyze?',
34
+ validate: (input) => input.length >= 10 || 'Input must be at least 10 characters',
35
+ default: content
36
+ },
37
+ {
38
+ type: 'input',
39
+ name: 'title',
40
+ message: 'What should we call this input? (optional):',
41
+ default: options.title
42
+ },
43
+ {
44
+ type: 'input',
45
+ name: 'sourceUrl',
46
+ message: 'Where did this come from? (support ticket, survey, etc.) (optional):',
47
+ default: options.url
48
+ },
49
+ {
50
+ type: 'input',
51
+ name: 'customerId',
52
+ message: 'Customer identifier (optional):',
53
+ default: options.customer
54
+ },
55
+ {
56
+ type: 'input',
57
+ name: 'reporterName',
58
+ message: 'Who provided this input? (optional):',
59
+ default: options.name
60
+ },
61
+ {
62
+ type: 'input',
63
+ name: 'reporterEmail',
64
+ message: 'Their email address (optional):',
65
+ default: options.email
66
+ }
67
+ ]);
68
+ feedbackData = {
69
+ content: answers.content,
70
+ title: answers.title,
71
+ source_url: answers.sourceUrl,
72
+ customer_id: answers.customerId,
73
+ reporter_name: answers.reporterName,
74
+ reporter_email: answers.reporterEmail
75
+ };
76
+ }
77
+ else {
78
+ // Command line mode
79
+ feedbackData = {
80
+ content,
81
+ title: options.title,
82
+ source_url: options.url,
83
+ customer_id: options.customer,
84
+ reporter_name: options.name,
85
+ reporter_email: options.email
86
+ };
87
+ }
88
+ const spinner = (0, ora_1.default)('Submitting customer input for AI analysis...').start();
89
+ const result = await (0, feedback_1.submitFeedback)(feedbackData);
90
+ if (options.wait) {
91
+ // Wait for processing to complete
92
+ if (options.json) {
93
+ // For JSON, we'll output the final result after waiting
94
+ }
95
+ else {
96
+ console.log(chalk_1.default.green('✅ Customer input submitted successfully!'));
97
+ console.log(chalk_1.default.blue(`Submission ID: ${result.id}`));
98
+ }
99
+ const waitSpinner = (0, ora_1.default)('Processing...').start();
100
+ let attempts = 0;
101
+ const maxAttempts = constants_1.CONFIG.MAX_RETRY_ATTEMPTS;
102
+ while (attempts < maxAttempts) {
103
+ await new Promise(resolve => setTimeout(resolve, constants_1.CONFIG.POLL_INTERVAL_MS));
104
+ try {
105
+ const statusResult = await (0, feedback_1.getFeedbackStatus)(result.id);
106
+ if (statusResult.status === 'completed') {
107
+ waitSpinner.succeed('Processing completed!');
108
+ if (options.json) {
109
+ console.log(JSON.stringify({ success: true, data: statusResult }, null, 2));
110
+ }
111
+ else {
112
+ console.log(chalk_1.default.blue(`Feedback generated: ${statusResult.feedbackCount || 0}`));
113
+ console.log(chalk_1.default.blue(`Credits used: ${statusResult.creditsConsumed || 0}`));
114
+ if ((statusResult.feedbackCount || 0) > 0) {
115
+ console.log(chalk_1.default.gray('Run "cl list" to see all feedback'));
116
+ }
117
+ }
118
+ break;
119
+ }
120
+ else if (statusResult.status === 'failed') {
121
+ waitSpinner.fail('Processing failed');
122
+ if (options.json) {
123
+ console.log(JSON.stringify({ success: false, error: 'Processing failed', data: statusResult }, null, 2));
124
+ }
125
+ else {
126
+ console.log(chalk_1.default.red('\n❌ Processing failed. Check the status for more details.'));
127
+ }
128
+ break;
129
+ }
130
+ else {
131
+ // Still processing
132
+ waitSpinner.text = `Processing... (${statusResult.status})`;
133
+ }
134
+ }
135
+ catch (error) {
136
+ // Continue waiting on API errors
137
+ waitSpinner.text = 'Processing... (checking status)';
138
+ }
139
+ attempts++;
140
+ }
141
+ if (attempts >= maxAttempts) {
142
+ waitSpinner.warn('Processing is taking longer than expected');
143
+ if (options.json) {
144
+ console.log(JSON.stringify({ success: false, error: 'Processing timeout', data: { id: result.id, message: 'Processing is taking longer than expected' } }, null, 2));
145
+ }
146
+ else {
147
+ console.log(chalk_1.default.yellow('\n⏳ Processing is still in progress. You can check status manually:'));
148
+ console.log(chalk_1.default.gray(` cl status ${result.id}`));
149
+ }
150
+ }
151
+ }
152
+ else {
153
+ if (options.json) {
154
+ console.log(JSON.stringify({ success: true, data: result }, null, 2));
155
+ }
156
+ else {
157
+ console.log(chalk_1.default.green('✅ Customer input submitted successfully!'));
158
+ console.log(chalk_1.default.blue(`Submission ID: ${result.id}`));
159
+ console.log(chalk_1.default.gray('Run "cl status ' + result.id + '" to check progress'));
160
+ console.log(chalk_1.default.gray('Or use "cl submit --wait" to wait for completion'));
161
+ }
162
+ }
163
+ }
164
+ catch (error) {
165
+ if (options.json) {
166
+ console.log(JSON.stringify({
167
+ success: false,
168
+ error: error.message,
169
+ details: error.response?.data || 'Unknown error occurred'
170
+ }, null, 2));
171
+ }
172
+ else {
173
+ // User-friendly error messages
174
+ if (error.response?.status === 400) {
175
+ const errorData = error.response.data;
176
+ if (errorData?.code === 'VALIDATION_ERROR') {
177
+ console.error(chalk_1.default.red('❌ Validation Error:'), errorData.error);
178
+ console.log(chalk_1.default.gray('\n💡 Common issues:'));
179
+ console.log(chalk_1.default.gray(' • Content must be at least 10 characters'));
180
+ console.log(chalk_1.default.gray(' • Check that all required fields are provided'));
181
+ console.log(chalk_1.default.gray(' • Ensure API key is valid: cl config'));
182
+ }
183
+ else if (errorData?.code === 'PROCESSING_ERROR') {
184
+ console.error(chalk_1.default.red('❌ Processing Error:'), errorData.error);
185
+ console.log(chalk_1.default.gray('\n💡 This usually means:'));
186
+ console.log(chalk_1.default.gray(' • The content could not be processed by our AI'));
187
+ console.log(chalk_1.default.gray(' • Try rephrasing your input'));
188
+ console.log(chalk_1.default.gray(' • Make sure the content is clear and meaningful'));
189
+ console.log(chalk_1.default.gray(' • Check API key: cl config'));
190
+ }
191
+ else {
192
+ console.error(chalk_1.default.red('❌ Bad Request:'), errorData?.error || 'Invalid input provided');
193
+ console.log(chalk_1.default.gray('\n💡 Try:'));
194
+ console.log(chalk_1.default.gray(' • Check your input content'));
195
+ console.log(chalk_1.default.gray(' • Verify API key: cl config'));
196
+ console.log(chalk_1.default.gray(' • Get help: cl submit --help'));
197
+ }
198
+ }
199
+ else if (error.response?.status === 401) {
200
+ console.error(chalk_1.default.red('❌ Authentication Error:'), 'Invalid API key');
201
+ console.log(chalk_1.default.gray('\n💡 To fix:'));
202
+ console.log(chalk_1.default.gray(' 1. Get your free API key at: https://closedloop.sh'));
203
+ console.log(chalk_1.default.gray(' 2. Run: cl config --set-api-key <your-key>'));
204
+ }
205
+ else if (error.response?.status === 429) {
206
+ console.error(chalk_1.default.red('❌ Rate Limited:'), 'Too many requests');
207
+ console.log(chalk_1.default.gray('\n💡 Wait a moment and try again'));
208
+ }
209
+ else if (error.response?.status >= 500) {
210
+ console.error(chalk_1.default.red('❌ Server Error:'), 'Our servers are having issues');
211
+ console.log(chalk_1.default.gray('\n💡 Try again in a few minutes'));
212
+ }
213
+ else if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
214
+ console.error(chalk_1.default.red('❌ Connection Error:'), 'Cannot connect to ClosedLoop servers');
215
+ console.log(chalk_1.default.gray('\n💡 Check your internet connection and try again'));
216
+ }
217
+ else {
218
+ console.error(chalk_1.default.red('❌ Error:'), error.message);
219
+ console.log(chalk_1.default.gray('\n💡 Get help: cl --help'));
220
+ }
221
+ }
222
+ process.exit(1);
223
+ }
224
+ });
225
+ //# sourceMappingURL=submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/commands/submit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,168 @@
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.handleUsageCommand = handleUsageCommand;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const table_1 = require("table");
9
+ const usage_1 = require("../api/usage");
10
+ // UUID regex pattern for detecting IDs
11
+ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
12
+ // Main usage command handler
13
+ async function handleUsageCommand(id, options) {
14
+ // If ID provided, show specific usage details
15
+ if (id) {
16
+ if (!UUID_REGEX.test(id)) {
17
+ console.log(chalk_1.default.yellow('💡 Invalid usage ID format'));
18
+ console.log(chalk_1.default.black('Usage ID should be a UUID like: 74e3dd87-878f-41cf-8e5a-87527bbf7770'));
19
+ return;
20
+ }
21
+ return await showUsage(id, options);
22
+ }
23
+ // Otherwise, list all usage
24
+ return await listUsageData(options);
25
+ }
26
+ // Helper functions
27
+ async function listUsageData(options) {
28
+ const page = parseInt(options.page) || 1;
29
+ const limit = parseInt(options.limit) || 20;
30
+ const result = await (0, usage_1.listUsage)(page, limit);
31
+ if (options.json) {
32
+ console.log(JSON.stringify({ success: true, data: result }, null, 2));
33
+ return;
34
+ }
35
+ const usage = result.usage || [];
36
+ if (usage.length === 0) {
37
+ console.log(chalk_1.default.yellow('💰 No usage data found'));
38
+ return;
39
+ }
40
+ console.log(chalk_1.default.blue('\n💰 Usage Summary:'));
41
+ const tableData = [
42
+ [
43
+ chalk_1.default.bold('ID'),
44
+ chalk_1.default.bold('Title'),
45
+ chalk_1.default.bold('Status'),
46
+ chalk_1.default.bold('Credits Used'),
47
+ chalk_1.default.bold('AI Feedback'),
48
+ chalk_1.default.bold('Submitted')
49
+ ]
50
+ ];
51
+ usage.forEach((item) => {
52
+ tableData.push([
53
+ item.id,
54
+ item.title || chalk_1.default.gray('null'),
55
+ item.status || 'unknown',
56
+ item.credits_consumed || 0,
57
+ item.feedback_count || 0,
58
+ item.created_at ? new Date(item.created_at).toLocaleString() : 'Unknown'
59
+ ]);
60
+ });
61
+ console.log((0, table_1.table)(tableData, {
62
+ border: {
63
+ topBody: '─',
64
+ topJoin: '┬',
65
+ topLeft: '┌',
66
+ topRight: '┐',
67
+ bottomBody: '─',
68
+ bottomJoin: '┴',
69
+ bottomLeft: '└',
70
+ bottomRight: '┘',
71
+ bodyLeft: '│',
72
+ bodyRight: '│',
73
+ bodyJoin: '│',
74
+ joinBody: '─',
75
+ joinLeft: '├',
76
+ joinRight: '┤',
77
+ joinJoin: '┼'
78
+ }
79
+ }));
80
+ if (result.pagination) {
81
+ console.log(chalk_1.default.black(`\nPage ${result.pagination.page} of ${result.pagination.pages} (${result.pagination.total} total submissions)`));
82
+ if (result.pagination.page < result.pagination.pages) {
83
+ console.log(chalk_1.default.gray(`💡 Use --page ${result.pagination.page + 1} to see next page`));
84
+ }
85
+ }
86
+ // Show total credits
87
+ const totalCredits = usage.reduce((sum, item) => sum + (item.credits_consumed || 0), 0);
88
+ console.log(chalk_1.default.blue(`\n💰 Total Credits Used: ${totalCredits}`));
89
+ }
90
+ async function showUsage(id, options) {
91
+ try {
92
+ const result = await (0, usage_1.getUsageDetail)(id);
93
+ if (options.json) {
94
+ console.log(JSON.stringify({ success: true, data: result }, null, 2));
95
+ return;
96
+ }
97
+ console.log(chalk_1.default.blue('\n💰 Usage Details:'));
98
+ console.log(chalk_1.default.black('─'.repeat(50)));
99
+ console.log(chalk_1.default.blue('ID:'), result.id);
100
+ console.log(chalk_1.default.blue('Title:'), result.title || chalk_1.default.gray('null'));
101
+ console.log(chalk_1.default.blue('Status:'), result.status || 'unknown');
102
+ console.log(chalk_1.default.blue('Credits Used:'), result.credits_consumed || 0);
103
+ console.log(chalk_1.default.blue('AI Feedback Generated:'), result.feedback_count || 0);
104
+ console.log(chalk_1.default.blue('Submitted:'), result.created_at ? new Date(result.created_at).toLocaleString() : 'Unknown');
105
+ console.log(chalk_1.default.blue('Updated:'), result.updated_at ? new Date(result.updated_at).toLocaleString() : 'Unknown');
106
+ if (result.feedbacks && result.feedbacks.length > 0) {
107
+ console.log(chalk_1.default.blue('\nGenerated Feedback:'));
108
+ result.feedbacks.forEach((feedback, index) => {
109
+ console.log(chalk_1.default.black(` ${index + 1}. ${feedback.title || 'Untitled'}`));
110
+ console.log(chalk_1.default.gray(` ID: ${feedback.id}`));
111
+ console.log(chalk_1.default.gray(` Created: ${feedback.created_at ? new Date(feedback.created_at).toLocaleString() : 'Unknown'}`));
112
+ });
113
+ }
114
+ }
115
+ catch (error) {
116
+ if (options.json) {
117
+ console.log(JSON.stringify({
118
+ success: false,
119
+ error: error.message,
120
+ details: error.response?.data || 'Unknown error occurred'
121
+ }, null, 2));
122
+ }
123
+ else {
124
+ if (error.response?.status === 404) {
125
+ console.error(chalk_1.default.red('❌ Usage record not found'));
126
+ console.log(chalk_1.default.black('The usage ID you provided does not exist or is not accessible.'));
127
+ }
128
+ else if (error.response?.status === 401) {
129
+ console.error(chalk_1.default.red('❌ Authentication Error:'), 'Invalid API key');
130
+ console.log(chalk_1.default.black('\n💡 To fix:'));
131
+ console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
132
+ console.log(chalk_1.default.black(' 2. Run: cl config set --api-key <your-key>'));
133
+ }
134
+ else {
135
+ console.error(chalk_1.default.red('❌ Error:'), error.message);
136
+ console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
137
+ }
138
+ }
139
+ process.exit(1);
140
+ }
141
+ }
142
+ function handleError(error, options) {
143
+ if (options.json) {
144
+ console.log(JSON.stringify({
145
+ success: false,
146
+ error: error.message,
147
+ details: error.response?.data || 'Unknown error occurred'
148
+ }, null, 2));
149
+ }
150
+ else {
151
+ if (error.response?.status === 404) {
152
+ console.error(chalk_1.default.red('❌ Not found'));
153
+ console.log(chalk_1.default.black('The requested resource does not exist or is not accessible.'));
154
+ }
155
+ else if (error.response?.status === 401) {
156
+ console.error(chalk_1.default.red('❌ Authentication Error:'), 'Invalid API key');
157
+ console.log(chalk_1.default.black('\n💡 To fix:'));
158
+ console.log(chalk_1.default.black(' 1. Get your free API key at: https://closedloop.sh'));
159
+ console.log(chalk_1.default.black(' 2. Run: cl config set --api-key <your-key>'));
160
+ }
161
+ else {
162
+ console.error(chalk_1.default.red('❌ Error:'), error.message);
163
+ console.log(chalk_1.default.black('\n💡 Get help: cl --help'));
164
+ }
165
+ }
166
+ process.exit(1);
167
+ }
168
+ //# sourceMappingURL=usage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.URLS = exports.MESSAGES = exports.CONFIG = void 0;
4
+ exports.CONFIG = {
5
+ API_BASE_URL: process.env.CLOSEDLOOP_API_URL || 'https://mcp.closedloop.sh',
6
+ USER_AGENT: 'closedloop-cli/0.2.0',
7
+ MAX_RETRY_ATTEMPTS: 100,
8
+ POLL_INTERVAL_MS: 3000,
9
+ DEFAULT_PAGE_SIZE: 20,
10
+ MAX_PAGE_SIZE: 100,
11
+ MIN_API_KEY_LENGTH: 10,
12
+ MAX_CONTENT_LENGTH: 10000,
13
+ TIMEOUT_MS: 30000
14
+ };
15
+ exports.MESSAGES = {
16
+ NO_API_KEY: `🔑 No API key configured!
17
+
18
+ To get started:
19
+ 1. Go to https://closedloop.sh
20
+ 2. Sign up for a free account
21
+ 3. Generate your API key
22
+ 4. Run: cl config --set-api-key <your-key>
23
+
24
+ Get your free API key at: https://closedloop.sh`,
25
+ INVALID_API_KEY: '❌ Invalid API key. Get your free API key at https://closedloop.sh',
26
+ CONNECTION_ERROR: '❌ Connection Error: Cannot connect to ClosedLoop AI servers',
27
+ CHECK_INTERNET: 'Check your internet connection and try again',
28
+ GET_HELP: 'Get help: cl --help',
29
+ PROCESSING_ERROR: '❌ Processing Error: Unable to process feedback',
30
+ VALIDATION_ERROR: '❌ Validation Error:',
31
+ UNKNOWN_ERROR: 'Unknown error occurred'
32
+ };
33
+ exports.URLS = {
34
+ CLOSEDLOOP_HOME: 'https://closedloop.sh',
35
+ GET_API_KEY: 'https://closedloop.sh'
36
+ };
37
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,MAAM,GAAG;IACpB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B;IAC3E,UAAU,EAAE,sBAAsB;IAClC,kBAAkB,EAAE,GAAG;IACvB,gBAAgB,EAAE,IAAI;IACtB,iBAAiB,EAAE,EAAE;IACrB,aAAa,EAAE,GAAG;IAClB,kBAAkB,EAAE,EAAE;IACtB,kBAAkB,EAAE,KAAK;IACzB,UAAU,EAAE,KAAK;CACT,CAAC;AAEE,QAAA,QAAQ,GAAG;IACtB,UAAU,EAAE;;;;;;;;gDAQkC;IAE9C,eAAe,EAAE,mEAAmE;IACpF,gBAAgB,EAAE,6DAA6D;IAC/E,cAAc,EAAE,8CAA8C;IAC9D,QAAQ,EAAE,qBAAqB;IAC/B,gBAAgB,EAAE,gDAAgD;IAClE,gBAAgB,EAAE,qBAAqB;IACvC,aAAa,EAAE,wBAAwB;CAC/B,CAAC;AAEE,QAAA,IAAI,GAAG;IAClB,eAAe,EAAE,uBAAuB;IACxC,WAAW,EAAE,uBAAuB;CAC5B,CAAC"}
@@ -0,0 +1,84 @@
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.config = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ class ConfigManager {
41
+ constructor() {
42
+ this.config = {};
43
+ this.configPath = path.join(os.homedir(), '.closedloop', 'config.json');
44
+ this.load();
45
+ }
46
+ load() {
47
+ try {
48
+ if (fs.existsSync(this.configPath)) {
49
+ const data = fs.readFileSync(this.configPath, 'utf8');
50
+ this.config = JSON.parse(data);
51
+ }
52
+ }
53
+ catch (error) {
54
+ // Ignore config load errors
55
+ }
56
+ }
57
+ save() {
58
+ try {
59
+ const dir = path.dirname(this.configPath);
60
+ if (!fs.existsSync(dir)) {
61
+ fs.mkdirSync(dir, { recursive: true });
62
+ }
63
+ fs.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
64
+ }
65
+ catch (error) {
66
+ throw new Error('Failed to save configuration');
67
+ }
68
+ }
69
+ get(key) {
70
+ if (key) {
71
+ return this.config[key];
72
+ }
73
+ return { ...this.config };
74
+ }
75
+ set(key, value) {
76
+ this.config[key] = value;
77
+ this.save();
78
+ }
79
+ getConfigPath() {
80
+ return fs.existsSync(this.configPath) ? this.configPath : 'Not created yet';
81
+ }
82
+ }
83
+ exports.config = new ConfigManager();
84
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAOzB,MAAM,aAAa;IAIjB;QAFQ,WAAM,GAAW,EAAE,CAAC;QAG1B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;QACxE,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAEO,IAAI;QACV,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAEO,IAAI;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,GAAG,CAAC,GAAkB;QACpB,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,GAAG,CAAC,GAAiB,EAAE,KAAU;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,IAAI,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,aAAa;QACX,OAAO,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC9E,CAAC;CACF;AAEY,QAAA,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
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.ConfigManager = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ class ConfigManager {
11
+ constructor() {
12
+ this.config = {};
13
+ // Use XDG config directory if available, fallback to home directory
14
+ const configDir = process.env.XDG_CONFIG_HOME || path_1.default.join(os_1.default.homedir(), '.config');
15
+ const cliDir = path_1.default.join(configDir, 'closedloop');
16
+ // Ensure directory exists
17
+ if (!fs_1.default.existsSync(cliDir)) {
18
+ fs_1.default.mkdirSync(cliDir, { recursive: true });
19
+ }
20
+ this.configPath = path_1.default.join(cliDir, 'config.json');
21
+ this.loadConfig();
22
+ }
23
+ loadConfig() {
24
+ try {
25
+ if (fs_1.default.existsSync(this.configPath)) {
26
+ const data = fs_1.default.readFileSync(this.configPath, 'utf8');
27
+ this.config = JSON.parse(data);
28
+ }
29
+ }
30
+ catch (error) {
31
+ // If config file is corrupted, start fresh
32
+ this.config = {};
33
+ }
34
+ }
35
+ saveConfig() {
36
+ try {
37
+ fs_1.default.writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
38
+ }
39
+ catch (error) {
40
+ throw new Error(`Failed to save config: ${error}`);
41
+ }
42
+ }
43
+ getConfig() {
44
+ return { ...this.config };
45
+ }
46
+ setConfig(newConfig) {
47
+ this.config = { ...this.config, ...newConfig };
48
+ this.saveConfig();
49
+ }
50
+ getConfigPath() {
51
+ return this.configPath;
52
+ }
53
+ }
54
+ exports.ConfigManager = ConfigManager;
55
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAa,aAAa;IAIxB;QAFQ,WAAM,GAAQ,EAAE,CAAC;QAGvB,oEAAoE;QACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QAElD,0BAA0B;QAC1B,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,YAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,IAAI,YAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2CAA2C;YAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC;YACH,YAAE,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,SAAS;QACP,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC5B,CAAC;IAED,SAAS,CAAC,SAAc;QACtB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAlDD,sCAkDC"}