@closedloop-ai/cli 0.2.4 → 0.3.1

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 (71) hide show
  1. package/README.md +176 -270
  2. package/dist/THIRD_PARTY_NOTICES.txt +24 -0
  3. package/dist/closedloop.js +156 -0
  4. package/package.json +31 -62
  5. package/CONTRIBUTING.md +0 -437
  6. package/LICENSE +0 -21
  7. package/docs/CLI_COMMANDS.md +0 -522
  8. package/packages/cli/dist/__tests__/api.test.js +0 -151
  9. package/packages/cli/dist/__tests__/api.test.js.map +0 -1
  10. package/packages/cli/dist/__tests__/cli.test.js +0 -37
  11. package/packages/cli/dist/__tests__/cli.test.js.map +0 -1
  12. package/packages/cli/dist/__tests__/config.test.js +0 -33
  13. package/packages/cli/dist/__tests__/config.test.js.map +0 -1
  14. package/packages/cli/dist/__tests__/errors.test.js +0 -109
  15. package/packages/cli/dist/__tests__/errors.test.js.map +0 -1
  16. package/packages/cli/dist/__tests__/performance.test.js +0 -221
  17. package/packages/cli/dist/__tests__/performance.test.js.map +0 -1
  18. package/packages/cli/dist/__tests__/setup.js +0 -50
  19. package/packages/cli/dist/__tests__/setup.js.map +0 -1
  20. package/packages/cli/dist/__tests__/team-simple.test.js +0 -38
  21. package/packages/cli/dist/__tests__/team-simple.test.js.map +0 -1
  22. package/packages/cli/dist/__tests__/test-factories.js +0 -148
  23. package/packages/cli/dist/__tests__/test-factories.js.map +0 -1
  24. package/packages/cli/dist/__tests__/validation.test.js +0 -124
  25. package/packages/cli/dist/__tests__/validation.test.js.map +0 -1
  26. package/packages/cli/dist/api/auth.js +0 -27
  27. package/packages/cli/dist/api/auth.js.map +0 -1
  28. package/packages/cli/dist/api/feedback.js +0 -70
  29. package/packages/cli/dist/api/feedback.js.map +0 -1
  30. package/packages/cli/dist/api/ingest.js +0 -60
  31. package/packages/cli/dist/api/ingest.js.map +0 -1
  32. package/packages/cli/dist/api/input.js +0 -60
  33. package/packages/cli/dist/api/input.js.map +0 -1
  34. package/packages/cli/dist/api/team.js +0 -59
  35. package/packages/cli/dist/api/team.js.map +0 -1
  36. package/packages/cli/dist/api/usage.js +0 -49
  37. package/packages/cli/dist/api/usage.js.map +0 -1
  38. package/packages/cli/dist/cli.js +0 -201
  39. package/packages/cli/dist/cli.js.map +0 -1
  40. package/packages/cli/dist/commands/config.js +0 -186
  41. package/packages/cli/dist/commands/config.js.map +0 -1
  42. package/packages/cli/dist/commands/feedback.js +0 -234
  43. package/packages/cli/dist/commands/feedback.js.map +0 -1
  44. package/packages/cli/dist/commands/ingest.js +0 -391
  45. package/packages/cli/dist/commands/ingest.js.map +0 -1
  46. package/packages/cli/dist/commands/input.js +0 -370
  47. package/packages/cli/dist/commands/input.js.map +0 -1
  48. package/packages/cli/dist/commands/insight.js +0 -234
  49. package/packages/cli/dist/commands/insight.js.map +0 -1
  50. package/packages/cli/dist/commands/list.js +0 -81
  51. package/packages/cli/dist/commands/list.js.map +0 -1
  52. package/packages/cli/dist/commands/status.js +0 -93
  53. package/packages/cli/dist/commands/status.js.map +0 -1
  54. package/packages/cli/dist/commands/submit.js +0 -225
  55. package/packages/cli/dist/commands/submit.js.map +0 -1
  56. package/packages/cli/dist/commands/team.js +0 -82
  57. package/packages/cli/dist/commands/team.js.map +0 -1
  58. package/packages/cli/dist/commands/usage.js +0 -168
  59. package/packages/cli/dist/commands/usage.js.map +0 -1
  60. package/packages/cli/dist/config/constants.js +0 -38
  61. package/packages/cli/dist/config/constants.js.map +0 -1
  62. package/packages/cli/dist/config/index.js +0 -84
  63. package/packages/cli/dist/config/index.js.map +0 -1
  64. package/packages/cli/dist/types/index.js +0 -3
  65. package/packages/cli/dist/types/index.js.map +0 -1
  66. package/packages/cli/dist/utils/config.js +0 -55
  67. package/packages/cli/dist/utils/config.js.map +0 -1
  68. package/packages/cli/dist/utils/errors.js +0 -70
  69. package/packages/cli/dist/utils/errors.js.map +0 -1
  70. package/packages/cli/dist/utils/validation.js +0 -133
  71. package/packages/cli/dist/utils/validation.js.map +0 -1
@@ -1,168 +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.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
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/commands/usage.ts"],"names":[],"mappings":"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"}
@@ -1,38 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.URLS = exports.MESSAGES = exports.CONFIG = exports.VERSION = void 0;
4
- exports.VERSION = '0.2.4';
5
- exports.CONFIG = {
6
- API_BASE_URL: process.env.CLOSEDLOOP_API_URL || 'https://mcp.closedloop.sh',
7
- USER_AGENT: `closedloop-cli/${exports.VERSION}`,
8
- MAX_RETRY_ATTEMPTS: 100,
9
- POLL_INTERVAL_MS: 3000,
10
- DEFAULT_PAGE_SIZE: 20,
11
- MAX_PAGE_SIZE: 100,
12
- MIN_API_KEY_LENGTH: 10,
13
- MAX_CONTENT_LENGTH: 50000,
14
- TIMEOUT_MS: 30000
15
- };
16
- exports.MESSAGES = {
17
- NO_API_KEY: `🔑 No API key configured!
18
-
19
- To get started:
20
- 1. Go to https://closedloop.sh
21
- 2. Sign up for a free account
22
- 3. Generate your API key
23
- 4. Run: cl config --set-api-key <your-key>
24
-
25
- Get your free API key at: https://closedloop.sh`,
26
- INVALID_API_KEY: '❌ Invalid API key. Get your free API key at https://closedloop.sh',
27
- CONNECTION_ERROR: '❌ Connection Error: Cannot connect to ClosedLoop AI servers',
28
- CHECK_INTERNET: 'Check your internet connection and try again',
29
- GET_HELP: 'Get help: cl --help',
30
- PROCESSING_ERROR: '❌ Processing Error: Unable to process feedback',
31
- VALIDATION_ERROR: '❌ Validation Error:',
32
- UNKNOWN_ERROR: 'Unknown error occurred'
33
- };
34
- exports.URLS = {
35
- CLOSEDLOOP_HOME: 'https://closedloop.sh',
36
- GET_API_KEY: 'https://closedloop.sh'
37
- };
38
- //# sourceMappingURL=constants.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/config/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,OAAO,CAAC;AAElB,QAAA,MAAM,GAAG;IACpB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,2BAA2B;IAC3E,UAAU,EAAE,kBAAkB,eAAO,EAAE;IACvC,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"}
@@ -1,84 +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.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
@@ -1 +0,0 @@
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"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -1,55 +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.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
@@ -1 +0,0 @@
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"}
@@ -1,70 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ERROR_CODES = exports.CliError = void 0;
4
- exports.handleApiError = handleApiError;
5
- exports.handleValidationError = handleValidationError;
6
- exports.handleInputError = handleInputError;
7
- exports.handleProcessingError = handleProcessingError;
8
- class CliError extends Error {
9
- constructor(message, code, exitCode = 1) {
10
- super(message);
11
- this.code = code;
12
- this.exitCode = exitCode;
13
- this.name = 'CliError';
14
- }
15
- }
16
- exports.CliError = CliError;
17
- exports.ERROR_CODES = {
18
- NO_API_KEY: 'NO_API_KEY',
19
- INVALID_API_KEY: 'INVALID_API_KEY',
20
- INVALID_INPUT: 'INVALID_INPUT',
21
- API_ERROR: 'API_ERROR',
22
- VALIDATION_ERROR: 'VALIDATION_ERROR',
23
- CONNECTION_ERROR: 'CONNECTION_ERROR',
24
- PROCESSING_ERROR: 'PROCESSING_ERROR',
25
- NOT_FOUND: 'NOT_FOUND',
26
- UNAUTHORIZED: 'UNAUTHORIZED',
27
- RATE_LIMITED: 'RATE_LIMITED',
28
- SERVER_ERROR: 'SERVER_ERROR',
29
- UNKNOWN_ERROR: 'UNKNOWN_ERROR'
30
- };
31
- function handleApiError(error) {
32
- if (error.response) {
33
- const status = error.response.status;
34
- const data = error.response.data;
35
- switch (status) {
36
- case 401:
37
- return new CliError('Invalid API key. Please check your configuration.', exports.ERROR_CODES.UNAUTHORIZED, 1);
38
- case 404:
39
- return new CliError('Resource not found. Please check the ID and try again.', exports.ERROR_CODES.NOT_FOUND, 1);
40
- case 429:
41
- return new CliError('Rate limit exceeded. Please wait a moment and try again.', exports.ERROR_CODES.RATE_LIMITED, 1);
42
- case 500:
43
- case 502:
44
- case 503:
45
- case 504:
46
- return new CliError('Server error. Please try again later.', exports.ERROR_CODES.SERVER_ERROR, 1);
47
- default:
48
- return new CliError(data?.message || `API error (${status})`, exports.ERROR_CODES.API_ERROR, 1);
49
- }
50
- }
51
- else if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {
52
- return new CliError('Cannot connect to ClosedLoop AI servers. Please check your internet connection.', exports.ERROR_CODES.CONNECTION_ERROR, 1);
53
- }
54
- else if (error.code === 'ETIMEDOUT') {
55
- return new CliError('Request timed out. Please try again.', exports.ERROR_CODES.CONNECTION_ERROR, 1);
56
- }
57
- else {
58
- return new CliError(error.message || 'An unknown error occurred', exports.ERROR_CODES.UNKNOWN_ERROR, 1);
59
- }
60
- }
61
- function handleValidationError(message) {
62
- return new CliError(message, exports.ERROR_CODES.VALIDATION_ERROR, 1);
63
- }
64
- function handleInputError(message) {
65
- return new CliError(message, exports.ERROR_CODES.INVALID_INPUT, 1);
66
- }
67
- function handleProcessingError(message) {
68
- return new CliError(message, exports.ERROR_CODES.PROCESSING_ERROR, 1);
69
- }
70
- //# sourceMappingURL=errors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"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"}
@@ -1,133 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateUuid = validateUuid;
4
- exports.validateInputContent = validateInputContent;
5
- exports.validateApiKey = validateApiKey;
6
- exports.validateEmail = validateEmail;
7
- exports.validateUrl = validateUrl;
8
- exports.validatePagination = validatePagination;
9
- exports.validateTitle = validateTitle;
10
- exports.validateCustomerId = validateCustomerId;
11
- exports.validateName = validateName;
12
- exports.sanitizeInput = sanitizeInput;
13
- exports.validateAndSanitizeInput = validateAndSanitizeInput;
14
- const errors_1 = require("./errors");
15
- const constants_1 = require("../config/constants");
16
- // UUID validation
17
- function validateUuid(id) {
18
- const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
19
- return uuidRegex.test(id);
20
- }
21
- // Content validation
22
- function validateInputContent(content) {
23
- if (!content || content.trim().length === 0) {
24
- throw (0, errors_1.handleInputError)('Content cannot be empty');
25
- }
26
- if (content.length > constants_1.CONFIG.MAX_CONTENT_LENGTH) {
27
- throw (0, errors_1.handleInputError)(`Content too long (max ${constants_1.CONFIG.MAX_CONTENT_LENGTH} characters)`);
28
- }
29
- return content.trim();
30
- }
31
- // API key validation
32
- function validateApiKey(apiKey) {
33
- if (!apiKey || apiKey.trim().length === 0 || apiKey.length < constants_1.CONFIG.MIN_API_KEY_LENGTH) {
34
- throw (0, errors_1.handleValidationError)('Invalid API key. Get your free API key at https://closedloop.sh');
35
- }
36
- return apiKey.trim();
37
- }
38
- // Email validation
39
- function validateEmail(email) {
40
- if (!email || email.trim().length === 0) {
41
- throw (0, errors_1.handleValidationError)('Email cannot be empty');
42
- }
43
- const trimmedEmail = email.trim();
44
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
45
- if (!emailRegex.test(trimmedEmail)) {
46
- throw (0, errors_1.handleValidationError)('Invalid email format');
47
- }
48
- return trimmedEmail.toLowerCase();
49
- }
50
- // URL validation
51
- function validateUrl(url) {
52
- if (!url || url.trim().length === 0) {
53
- throw (0, errors_1.handleValidationError)('URL cannot be empty');
54
- }
55
- try {
56
- const urlObj = new URL(url);
57
- if (!['http:', 'https:'].includes(urlObj.protocol)) {
58
- throw (0, errors_1.handleValidationError)('URL must use HTTP or HTTPS protocol');
59
- }
60
- return urlObj.toString();
61
- }
62
- catch (error) {
63
- throw (0, errors_1.handleValidationError)('Invalid URL format');
64
- }
65
- }
66
- // Pagination validation
67
- function validatePagination(page, limit) {
68
- const validatedPage = Math.max(1, page || 1);
69
- const validatedLimit = Math.min(Math.max(1, limit || constants_1.CONFIG.DEFAULT_PAGE_SIZE), constants_1.CONFIG.MAX_PAGE_SIZE);
70
- return { page: validatedPage, limit: validatedLimit };
71
- }
72
- // Title validation
73
- function validateTitle(title) {
74
- if (!title || title.trim().length === 0) {
75
- throw (0, errors_1.handleValidationError)('Title cannot be empty');
76
- }
77
- if (title.length > 200) {
78
- throw (0, errors_1.handleValidationError)('Title too long (max 200 characters)');
79
- }
80
- return title.trim();
81
- }
82
- // Customer ID validation
83
- function validateCustomerId(customerId) {
84
- if (!customerId || customerId.trim().length === 0) {
85
- throw (0, errors_1.handleValidationError)('Customer ID cannot be empty');
86
- }
87
- if (customerId.length > 100) {
88
- throw (0, errors_1.handleValidationError)('Customer ID too long (max 100 characters)');
89
- }
90
- return customerId.trim();
91
- }
92
- // Name validation
93
- function validateName(name) {
94
- if (!name || name.trim().length === 0) {
95
- throw (0, errors_1.handleValidationError)('Name cannot be empty');
96
- }
97
- if (name.length > 100) {
98
- throw (0, errors_1.handleValidationError)('Name too long (max 100 characters)');
99
- }
100
- return name.trim();
101
- }
102
- // Sanitize input to prevent XSS
103
- function sanitizeInput(input) {
104
- return input
105
- .replace(/[<>]/g, '') // Remove < and >
106
- .replace(/javascript:/gi, '') // Remove javascript: protocol
107
- .replace(/on\w+=/gi, '') // Remove event handlers
108
- .trim();
109
- }
110
- // Validate and sanitize all input data
111
- function validateAndSanitizeInput(data) {
112
- const validated = {};
113
- // Required fields
114
- validated.content = sanitizeInput(validateInputContent(data.content));
115
- // Optional fields
116
- if (data.title) {
117
- validated.title = sanitizeInput(validateTitle(data.title));
118
- }
119
- if (data.source_url) {
120
- validated.source_url = validateUrl(data.source_url);
121
- }
122
- if (data.customer_id) {
123
- validated.customer_id = sanitizeInput(validateCustomerId(data.customer_id));
124
- }
125
- if (data.reporter_name) {
126
- validated.reporter_name = sanitizeInput(validateName(data.reporter_name));
127
- }
128
- if (data.reporter_email) {
129
- validated.reporter_email = validateEmail(data.reporter_email);
130
- }
131
- return validated;
132
- }
133
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}