@nordsym/apiclaw 1.3.6 → 1.3.8

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 (214) hide show
  1. package/README.md +422 -169
  2. package/convex/_generated/api.d.ts +16 -0
  3. package/convex/agents.ts +403 -0
  4. package/convex/billing.ts +651 -216
  5. package/convex/crons.ts +17 -0
  6. package/convex/directCall.ts +80 -0
  7. package/convex/earnProgress.ts +753 -0
  8. package/convex/email.ts +135 -82
  9. package/convex/feedback.ts +265 -0
  10. package/convex/http.ts +80 -4
  11. package/convex/logs.ts +304 -0
  12. package/convex/providerKeys.ts +289 -0
  13. package/convex/providers.ts +18 -0
  14. package/convex/schema.ts +185 -1
  15. package/convex/stripeActions.ts +512 -0
  16. package/convex/webhooks.ts +494 -0
  17. package/convex/workspaces.ts +158 -3
  18. package/dist/adapters/base.d.ts +112 -0
  19. package/dist/adapters/base.d.ts.map +1 -0
  20. package/dist/adapters/base.js +247 -0
  21. package/dist/adapters/base.js.map +1 -0
  22. package/dist/adapters/claude-desktop.d.ts +12 -0
  23. package/dist/adapters/claude-desktop.d.ts.map +1 -0
  24. package/dist/adapters/claude-desktop.js +36 -0
  25. package/dist/adapters/claude-desktop.js.map +1 -0
  26. package/dist/adapters/cline.d.ts +20 -0
  27. package/dist/adapters/cline.d.ts.map +1 -0
  28. package/dist/adapters/cline.js +77 -0
  29. package/dist/adapters/cline.js.map +1 -0
  30. package/dist/adapters/continue.d.ts +26 -0
  31. package/dist/adapters/continue.d.ts.map +1 -0
  32. package/dist/adapters/continue.js +68 -0
  33. package/dist/adapters/continue.js.map +1 -0
  34. package/dist/adapters/cursor.d.ts +12 -0
  35. package/dist/adapters/cursor.d.ts.map +1 -0
  36. package/dist/adapters/cursor.js +38 -0
  37. package/dist/adapters/cursor.js.map +1 -0
  38. package/dist/adapters/custom.d.ts +47 -0
  39. package/dist/adapters/custom.d.ts.map +1 -0
  40. package/dist/adapters/custom.js +146 -0
  41. package/dist/adapters/custom.js.map +1 -0
  42. package/dist/adapters/detect.d.ts +69 -0
  43. package/dist/adapters/detect.d.ts.map +1 -0
  44. package/dist/adapters/detect.js +158 -0
  45. package/dist/adapters/detect.js.map +1 -0
  46. package/dist/adapters/index.d.ts +21 -0
  47. package/dist/adapters/index.d.ts.map +1 -0
  48. package/dist/adapters/index.js +23 -0
  49. package/dist/adapters/index.js.map +1 -0
  50. package/dist/adapters/windsurf.d.ts +12 -0
  51. package/dist/adapters/windsurf.d.ts.map +1 -0
  52. package/dist/adapters/windsurf.js +39 -0
  53. package/dist/adapters/windsurf.js.map +1 -0
  54. package/dist/bin.d.ts +9 -0
  55. package/dist/bin.d.ts.map +1 -0
  56. package/dist/bin.js +19 -0
  57. package/dist/bin.js.map +1 -0
  58. package/dist/cli/commands/doctor.d.ts +34 -0
  59. package/dist/cli/commands/doctor.d.ts.map +1 -0
  60. package/dist/cli/commands/doctor.js +312 -0
  61. package/dist/cli/commands/doctor.js.map +1 -0
  62. package/dist/cli/commands/index.d.ts +9 -0
  63. package/dist/cli/commands/index.d.ts.map +1 -0
  64. package/dist/cli/commands/index.js +9 -0
  65. package/dist/cli/commands/index.js.map +1 -0
  66. package/dist/cli/commands/restore.d.ts +50 -0
  67. package/dist/cli/commands/restore.d.ts.map +1 -0
  68. package/dist/cli/commands/restore.js +260 -0
  69. package/dist/cli/commands/restore.js.map +1 -0
  70. package/dist/cli/commands/setup.d.ts +19 -0
  71. package/dist/cli/commands/setup.d.ts.map +1 -0
  72. package/dist/cli/commands/setup.js +206 -0
  73. package/dist/cli/commands/setup.js.map +1 -0
  74. package/dist/cli/commands/uninstall.d.ts +37 -0
  75. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  76. package/dist/cli/commands/uninstall.js +189 -0
  77. package/dist/cli/commands/uninstall.js.map +1 -0
  78. package/dist/cli/index.d.ts +7 -0
  79. package/dist/cli/index.d.ts.map +1 -0
  80. package/dist/cli/index.js +97 -0
  81. package/dist/cli/index.js.map +1 -0
  82. package/dist/discovery.d.ts +6 -2
  83. package/dist/discovery.d.ts.map +1 -1
  84. package/dist/discovery.js +296 -2
  85. package/dist/discovery.js.map +1 -1
  86. package/dist/enterprise/env.d.ts +56 -0
  87. package/dist/enterprise/env.d.ts.map +1 -0
  88. package/dist/enterprise/env.js +124 -0
  89. package/dist/enterprise/env.js.map +1 -0
  90. package/dist/enterprise/index.d.ts +7 -0
  91. package/dist/enterprise/index.d.ts.map +1 -0
  92. package/dist/enterprise/index.js +7 -0
  93. package/dist/enterprise/index.js.map +1 -0
  94. package/dist/enterprise/script-generator.d.ts +32 -0
  95. package/dist/enterprise/script-generator.d.ts.map +1 -0
  96. package/dist/enterprise/script-generator.js +461 -0
  97. package/dist/enterprise/script-generator.js.map +1 -0
  98. package/dist/execute.d.ts +21 -0
  99. package/dist/execute.d.ts.map +1 -1
  100. package/dist/execute.js +231 -0
  101. package/dist/execute.js.map +1 -1
  102. package/dist/index.js +257 -7
  103. package/dist/index.js.map +1 -1
  104. package/dist/metered.d.ts +62 -0
  105. package/dist/metered.d.ts.map +1 -0
  106. package/dist/metered.js +81 -0
  107. package/dist/metered.js.map +1 -0
  108. package/dist/stripe.d.ts +62 -0
  109. package/dist/stripe.d.ts.map +1 -1
  110. package/dist/stripe.js +212 -0
  111. package/dist/stripe.js.map +1 -1
  112. package/dist/types.d.ts +29 -0
  113. package/dist/types.d.ts.map +1 -1
  114. package/dist/ui/colors.d.ts +111 -0
  115. package/dist/ui/colors.d.ts.map +1 -0
  116. package/dist/ui/colors.js +185 -0
  117. package/dist/ui/colors.js.map +1 -0
  118. package/dist/ui/errors.d.ts +69 -0
  119. package/dist/ui/errors.d.ts.map +1 -0
  120. package/dist/ui/errors.js +334 -0
  121. package/dist/ui/errors.js.map +1 -0
  122. package/dist/ui/index.d.ts +10 -0
  123. package/dist/ui/index.d.ts.map +1 -0
  124. package/dist/ui/index.js +14 -0
  125. package/dist/ui/index.js.map +1 -0
  126. package/dist/ui/prompts.d.ts +88 -0
  127. package/dist/ui/prompts.d.ts.map +1 -0
  128. package/dist/ui/prompts.js +295 -0
  129. package/dist/ui/prompts.js.map +1 -0
  130. package/dist/ui/spinner.d.ts +112 -0
  131. package/dist/ui/spinner.d.ts.map +1 -0
  132. package/dist/ui/spinner.js +229 -0
  133. package/dist/ui/spinner.js.map +1 -0
  134. package/dist/utils/backup.d.ts +48 -0
  135. package/dist/utils/backup.d.ts.map +1 -0
  136. package/dist/utils/backup.js +182 -0
  137. package/dist/utils/backup.js.map +1 -0
  138. package/dist/utils/config.d.ts +80 -0
  139. package/dist/utils/config.d.ts.map +1 -0
  140. package/dist/utils/config.js +221 -0
  141. package/dist/utils/config.js.map +1 -0
  142. package/dist/utils/os.d.ts +45 -0
  143. package/dist/utils/os.d.ts.map +1 -0
  144. package/dist/utils/os.js +106 -0
  145. package/dist/utils/os.js.map +1 -0
  146. package/dist/utils/paths.d.ts +38 -0
  147. package/dist/utils/paths.d.ts.map +1 -0
  148. package/dist/utils/paths.js +160 -0
  149. package/dist/utils/paths.js.map +1 -0
  150. package/docs/PRD-BILLING.md +226 -0
  151. package/docs/PRD-EARN-SYSTEM.md +261 -0
  152. package/docs/PRD-MCP-AUTO-SETUP.md +623 -0
  153. package/docs/PRD-final-polish.md +117 -0
  154. package/docs/PRD-mobile-responsive.md +56 -0
  155. package/docs/PRD-navigation-expansion.md +295 -0
  156. package/docs/PRD-stripe-billing.md +312 -0
  157. package/docs/PRD-workspace-cleanup.md +200 -0
  158. package/docs/enterprise-deployment.md +728 -0
  159. package/landing/next.config.mjs +14 -0
  160. package/landing/public/stats.json +4 -2
  161. package/landing/scripts/generate-stats.js +12 -0
  162. package/landing/src/app/api/billing/checkout/route.ts +109 -0
  163. package/landing/src/app/api/billing/payment-method/route.ts +118 -0
  164. package/landing/src/app/api/billing/portal/route.ts +64 -0
  165. package/landing/src/app/api/workspace-auth/magic-link/route.ts +6 -3
  166. package/landing/src/app/auth/verify/page.tsx +31 -9
  167. package/landing/src/app/docs/page.tsx +1 -1
  168. package/landing/src/app/earn/page.tsx +6 -6
  169. package/landing/src/app/join/page.tsx +49 -0
  170. package/landing/src/app/login/page.tsx +8 -2
  171. package/landing/src/app/page.tsx +81 -96
  172. package/landing/src/app/providers/dashboard/page.tsx +1 -1
  173. package/landing/src/app/providers/register/page.tsx +1 -1
  174. package/landing/src/app/workspace/page.tsx +3269 -534
  175. package/landing/src/components/CheckoutButton.tsx +188 -0
  176. package/landing/src/components/EarnCreditsTab.tsx +842 -0
  177. package/landing/src/components/Toast.tsx +84 -0
  178. package/landing/src/lib/stats.json +3 -1
  179. package/package.json +9 -2
  180. package/src/adapters/base.ts +363 -0
  181. package/src/adapters/claude-desktop.ts +41 -0
  182. package/src/adapters/cline.ts +88 -0
  183. package/src/adapters/continue.ts +91 -0
  184. package/src/adapters/cursor.ts +43 -0
  185. package/src/adapters/custom.ts +188 -0
  186. package/src/adapters/detect.ts +202 -0
  187. package/src/adapters/index.ts +47 -0
  188. package/src/adapters/windsurf.ts +44 -0
  189. package/src/bin.ts +19 -0
  190. package/src/cli/commands/doctor.ts +367 -0
  191. package/src/cli/commands/index.ts +9 -0
  192. package/src/cli/commands/restore.ts +333 -0
  193. package/src/cli/commands/setup.ts +276 -0
  194. package/src/cli/commands/uninstall.ts +240 -0
  195. package/src/cli/index.ts +107 -0
  196. package/src/discovery.ts +328 -3
  197. package/src/enterprise/env.ts +156 -0
  198. package/src/enterprise/index.ts +7 -0
  199. package/src/enterprise/script-generator.ts +481 -0
  200. package/src/execute.ts +256 -0
  201. package/src/index.ts +290 -7
  202. package/src/metered.ts +149 -0
  203. package/src/stripe.ts +253 -0
  204. package/src/types.ts +32 -0
  205. package/src/ui/colors.ts +219 -0
  206. package/src/ui/errors.ts +394 -0
  207. package/src/ui/index.ts +17 -0
  208. package/src/ui/prompts.ts +390 -0
  209. package/src/ui/spinner.ts +325 -0
  210. package/src/utils/backup.ts +224 -0
  211. package/src/utils/config.ts +315 -0
  212. package/src/utils/os.ts +124 -0
  213. package/src/utils/paths.ts +203 -0
  214. package/landing/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,229 @@
1
+ /**
2
+ * APIClaw MCP Auto-Setup - Spinner Utilities
3
+ *
4
+ * Ora-based spinner wrapper with consistent styling and state management.
5
+ * Provides a fluent API for progress indication during CLI operations.
6
+ */
7
+ import ora from 'ora';
8
+ import { colors, icons } from './colors.js';
9
+ /**
10
+ * Create a task spinner with APIClaw styling
11
+ */
12
+ export function createSpinner(options = {}) {
13
+ const { text = '', prefix = '', suffix = '', showInCI = false, spinner = 'dots', } = options;
14
+ const oraInstance = ora({
15
+ text,
16
+ prefixText: prefix,
17
+ suffixText: suffix,
18
+ spinner,
19
+ // Disable spinner in CI by default for cleaner logs
20
+ isEnabled: showInCI || !process.env.CI,
21
+ });
22
+ const wrapper = {
23
+ start(newText) {
24
+ if (newText)
25
+ oraInstance.text = newText;
26
+ oraInstance.start();
27
+ return wrapper;
28
+ },
29
+ text(newText) {
30
+ oraInstance.text = newText;
31
+ return wrapper;
32
+ },
33
+ succeed(newText) {
34
+ oraInstance.succeed(newText);
35
+ return wrapper;
36
+ },
37
+ fail(newText) {
38
+ oraInstance.fail(newText);
39
+ return wrapper;
40
+ },
41
+ warn(newText) {
42
+ oraInstance.warn(newText);
43
+ return wrapper;
44
+ },
45
+ info(newText) {
46
+ oraInstance.info(newText);
47
+ return wrapper;
48
+ },
49
+ stop() {
50
+ oraInstance.stop();
51
+ return wrapper;
52
+ },
53
+ clear() {
54
+ oraInstance.stopAndPersist({ symbol: '' });
55
+ return wrapper;
56
+ },
57
+ isSpinning() {
58
+ return oraInstance.isSpinning;
59
+ },
60
+ get ora() {
61
+ return oraInstance;
62
+ },
63
+ };
64
+ return wrapper;
65
+ }
66
+ /**
67
+ * Convenience function for common spinner patterns
68
+ */
69
+ export const spinner = {
70
+ /**
71
+ * Create and start a spinner in one call
72
+ */
73
+ start(text) {
74
+ return createSpinner({ text }).start();
75
+ },
76
+ /**
77
+ * Run an async task with spinner, auto-succeed/fail
78
+ */
79
+ async task(text, fn, options = {}) {
80
+ const s = createSpinner({ text }).start();
81
+ try {
82
+ const result = await fn(s);
83
+ const successMsg = typeof options.successText === 'function'
84
+ ? options.successText(result)
85
+ : options.successText || text;
86
+ s.succeed(successMsg);
87
+ return result;
88
+ }
89
+ catch (error) {
90
+ const failMsg = typeof options.failText === 'function'
91
+ ? options.failText(error)
92
+ : options.failText || `${text} - Failed`;
93
+ s.fail(failMsg);
94
+ throw error;
95
+ }
96
+ },
97
+ /**
98
+ * Run multiple tasks in sequence with spinners
99
+ */
100
+ async sequence(tasks) {
101
+ const results = [];
102
+ for (const { text, task, successText, failText } of tasks) {
103
+ const result = await this.task(text, task, { successText, failText });
104
+ results.push(result);
105
+ }
106
+ return results;
107
+ },
108
+ };
109
+ /**
110
+ * Progress tracker for multi-step operations
111
+ */
112
+ export class ProgressTracker {
113
+ current = 0;
114
+ total;
115
+ items;
116
+ taskSpinner;
117
+ constructor(items) {
118
+ this.items = items;
119
+ this.total = items.length;
120
+ this.taskSpinner = createSpinner();
121
+ }
122
+ /**
123
+ * Start tracking progress
124
+ */
125
+ start() {
126
+ this.current = 0;
127
+ this.updateText();
128
+ this.taskSpinner.start();
129
+ }
130
+ /**
131
+ * Move to next item
132
+ */
133
+ next() {
134
+ this.current++;
135
+ this.updateText();
136
+ }
137
+ /**
138
+ * Mark current item as done and move to next
139
+ */
140
+ done(message) {
141
+ this.taskSpinner.succeed(message || this.items[this.current - 1]);
142
+ if (this.current < this.total) {
143
+ this.taskSpinner.start(this.formatProgress());
144
+ }
145
+ }
146
+ /**
147
+ * Mark as complete
148
+ */
149
+ complete(message) {
150
+ this.taskSpinner.succeed(message);
151
+ }
152
+ /**
153
+ * Mark as failed
154
+ */
155
+ fail(message) {
156
+ this.taskSpinner.fail(message);
157
+ }
158
+ updateText() {
159
+ this.taskSpinner.text(this.formatProgress());
160
+ }
161
+ formatProgress() {
162
+ const item = this.items[this.current] || 'Processing...';
163
+ return `[${this.current + 1}/${this.total}] ${item}`;
164
+ }
165
+ }
166
+ /**
167
+ * Silent spinner for non-interactive/CI environments
168
+ * Logs plain text instead of animated spinners
169
+ */
170
+ export function createSilentSpinner(options = {}) {
171
+ const log = (symbol, text) => {
172
+ if (text) {
173
+ console.log(`${symbol} ${text}`);
174
+ }
175
+ };
176
+ let currentText = options.text || '';
177
+ const wrapper = {
178
+ start(text) {
179
+ currentText = text || currentText;
180
+ log(colors.muted('○'), currentText);
181
+ return wrapper;
182
+ },
183
+ text(text) {
184
+ currentText = text;
185
+ return wrapper;
186
+ },
187
+ succeed(text) {
188
+ log(icons.success, text || currentText);
189
+ return wrapper;
190
+ },
191
+ fail(text) {
192
+ log(icons.error, text || currentText);
193
+ return wrapper;
194
+ },
195
+ warn(text) {
196
+ log(icons.warning, text || currentText);
197
+ return wrapper;
198
+ },
199
+ info(text) {
200
+ log(icons.info, text || currentText);
201
+ return wrapper;
202
+ },
203
+ stop() {
204
+ return wrapper;
205
+ },
206
+ clear() {
207
+ return wrapper;
208
+ },
209
+ isSpinning() {
210
+ return false;
211
+ },
212
+ get ora() {
213
+ // Return a mock for compatibility
214
+ return {};
215
+ },
216
+ };
217
+ return wrapper;
218
+ }
219
+ /**
220
+ * Get appropriate spinner based on environment
221
+ */
222
+ export function getSpinner(options = {}) {
223
+ // Use silent spinner in CI or when stdout is not a TTY
224
+ if (process.env.CI || !process.stdout.isTTY) {
225
+ return createSilentSpinner(options);
226
+ }
227
+ return createSpinner(options);
228
+ }
229
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Backup System
3
+ * Handles timestamped backups of config files with automatic cleanup
4
+ */
5
+ export interface BackupResult {
6
+ success: boolean;
7
+ backupPath: string | null;
8
+ error?: string;
9
+ }
10
+ export interface BackupInfo {
11
+ path: string;
12
+ timestamp: number;
13
+ date: Date;
14
+ filename: string;
15
+ }
16
+ /**
17
+ * Create a backup of a config file
18
+ */
19
+ export declare function createBackup(configPath: string): BackupResult;
20
+ /**
21
+ * List all backups for a config file
22
+ */
23
+ export declare function listBackups(configPath: string): BackupInfo[];
24
+ /**
25
+ * Get the most recent backup
26
+ */
27
+ export declare function getLatestBackup(configPath: string): BackupInfo | null;
28
+ /**
29
+ * Cleanup old backups, keeping only MAX_BACKUPS most recent
30
+ */
31
+ export declare function cleanupOldBackups(configPath: string): number;
32
+ /**
33
+ * Restore from a backup
34
+ */
35
+ export declare function restoreBackup(backupPath: string, targetPath: string): BackupResult;
36
+ /**
37
+ * Restore from the most recent backup
38
+ */
39
+ export declare function restoreLatestBackup(configPath: string): BackupResult;
40
+ /**
41
+ * Format backup info for display
42
+ */
43
+ export declare function formatBackupInfo(backup: BackupInfo): string;
44
+ /**
45
+ * Delete all backups for a config file
46
+ */
47
+ export declare function deleteAllBackups(configPath: string): number;
48
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAqC7D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,EAAE,CA8B5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAiB5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CA2BlF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAYpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAG3D;AASD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAc3D"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Backup System
3
+ * Handles timestamped backups of config files with automatic cleanup
4
+ */
5
+ import { existsSync, mkdirSync, readdirSync, unlinkSync, copyFileSync } from 'fs';
6
+ import { dirname, basename, join } from 'path';
7
+ const MAX_BACKUPS = 5;
8
+ const BACKUP_PATTERN = /\.backup\.(\d+)\.json$/;
9
+ /**
10
+ * Generate backup filename with timestamp
11
+ */
12
+ function generateBackupFilename(originalPath) {
13
+ const dir = dirname(originalPath);
14
+ const base = basename(originalPath, '.json');
15
+ const timestamp = Date.now();
16
+ return join(dir, `${base}.backup.${timestamp}.json`);
17
+ }
18
+ /**
19
+ * Create a backup of a config file
20
+ */
21
+ export function createBackup(configPath) {
22
+ try {
23
+ // Check if original file exists
24
+ if (!existsSync(configPath)) {
25
+ return {
26
+ success: true,
27
+ backupPath: null,
28
+ // No backup needed if file doesn't exist
29
+ };
30
+ }
31
+ // Ensure backup directory exists
32
+ const dir = dirname(configPath);
33
+ if (!existsSync(dir)) {
34
+ mkdirSync(dir, { recursive: true });
35
+ }
36
+ // Generate backup path
37
+ const backupPath = generateBackupFilename(configPath);
38
+ // Copy file
39
+ copyFileSync(configPath, backupPath);
40
+ // Cleanup old backups
41
+ cleanupOldBackups(configPath);
42
+ return {
43
+ success: true,
44
+ backupPath,
45
+ };
46
+ }
47
+ catch (error) {
48
+ return {
49
+ success: false,
50
+ backupPath: null,
51
+ error: error instanceof Error ? error.message : 'Unknown error creating backup',
52
+ };
53
+ }
54
+ }
55
+ /**
56
+ * List all backups for a config file
57
+ */
58
+ export function listBackups(configPath) {
59
+ const dir = dirname(configPath);
60
+ const baseName = basename(configPath, '.json');
61
+ if (!existsSync(dir)) {
62
+ return [];
63
+ }
64
+ const files = readdirSync(dir);
65
+ const backups = [];
66
+ for (const file of files) {
67
+ // Match backup pattern: {basename}.backup.{timestamp}.json
68
+ const match = file.match(new RegExp(`^${escapeRegex(baseName)}\\.backup\\.(\\d+)\\.json$`));
69
+ if (match) {
70
+ const timestamp = parseInt(match[1], 10);
71
+ const fullPath = join(dir, file);
72
+ backups.push({
73
+ path: fullPath,
74
+ timestamp,
75
+ date: new Date(timestamp),
76
+ filename: file,
77
+ });
78
+ }
79
+ }
80
+ // Sort by timestamp, newest first
81
+ return backups.sort((a, b) => b.timestamp - a.timestamp);
82
+ }
83
+ /**
84
+ * Get the most recent backup
85
+ */
86
+ export function getLatestBackup(configPath) {
87
+ const backups = listBackups(configPath);
88
+ return backups[0] || null;
89
+ }
90
+ /**
91
+ * Cleanup old backups, keeping only MAX_BACKUPS most recent
92
+ */
93
+ export function cleanupOldBackups(configPath) {
94
+ const backups = listBackups(configPath);
95
+ let deleted = 0;
96
+ // Keep only the first MAX_BACKUPS
97
+ const toDelete = backups.slice(MAX_BACKUPS);
98
+ for (const backup of toDelete) {
99
+ try {
100
+ unlinkSync(backup.path);
101
+ deleted++;
102
+ }
103
+ catch {
104
+ // Ignore deletion errors
105
+ }
106
+ }
107
+ return deleted;
108
+ }
109
+ /**
110
+ * Restore from a backup
111
+ */
112
+ export function restoreBackup(backupPath, targetPath) {
113
+ try {
114
+ if (!existsSync(backupPath)) {
115
+ return {
116
+ success: false,
117
+ backupPath: null,
118
+ error: `Backup file not found: ${backupPath}`,
119
+ };
120
+ }
121
+ // Backup current file before restoring
122
+ const preRestoreBackup = createBackup(targetPath);
123
+ // Copy backup to target
124
+ copyFileSync(backupPath, targetPath);
125
+ return {
126
+ success: true,
127
+ backupPath: preRestoreBackup.backupPath,
128
+ };
129
+ }
130
+ catch (error) {
131
+ return {
132
+ success: false,
133
+ backupPath: null,
134
+ error: error instanceof Error ? error.message : 'Unknown error restoring backup',
135
+ };
136
+ }
137
+ }
138
+ /**
139
+ * Restore from the most recent backup
140
+ */
141
+ export function restoreLatestBackup(configPath) {
142
+ const latest = getLatestBackup(configPath);
143
+ if (!latest) {
144
+ return {
145
+ success: false,
146
+ backupPath: null,
147
+ error: 'No backups found',
148
+ };
149
+ }
150
+ return restoreBackup(latest.path, configPath);
151
+ }
152
+ /**
153
+ * Format backup info for display
154
+ */
155
+ export function formatBackupInfo(backup) {
156
+ const date = backup.date.toLocaleString();
157
+ return `${backup.filename} (${date})`;
158
+ }
159
+ /**
160
+ * Escape regex special characters
161
+ */
162
+ function escapeRegex(str) {
163
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
164
+ }
165
+ /**
166
+ * Delete all backups for a config file
167
+ */
168
+ export function deleteAllBackups(configPath) {
169
+ const backups = listBackups(configPath);
170
+ let deleted = 0;
171
+ for (const backup of backups) {
172
+ try {
173
+ unlinkSync(backup.path);
174
+ deleted++;
175
+ }
176
+ catch {
177
+ // Ignore deletion errors
178
+ }
179
+ }
180
+ return deleted;
181
+ }
182
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/utils/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Config Management
3
+ * Handles JSON read/write/merge operations for MCP config files
4
+ */
5
+ export interface MCPServerConfig {
6
+ command: string;
7
+ args?: string[];
8
+ env?: Record<string, string>;
9
+ }
10
+ export interface MCPConfig {
11
+ mcpServers?: Record<string, MCPServerConfig>;
12
+ [key: string]: unknown;
13
+ }
14
+ export interface ContinueServerConfig {
15
+ name: string;
16
+ command: string;
17
+ args?: string[];
18
+ env?: Record<string, string>;
19
+ }
20
+ export interface ContinueConfig {
21
+ mcpServers?: ContinueServerConfig[];
22
+ [key: string]: unknown;
23
+ }
24
+ export interface ConfigReadResult {
25
+ success: boolean;
26
+ config: MCPConfig | ContinueConfig | null;
27
+ error?: string;
28
+ isNew?: boolean;
29
+ }
30
+ export interface ConfigWriteResult {
31
+ success: boolean;
32
+ error?: string;
33
+ backupPath?: string | null;
34
+ }
35
+ export interface MergeOptions {
36
+ force?: boolean;
37
+ workspace?: string;
38
+ serverName?: string;
39
+ }
40
+ /**
41
+ * Read and parse a JSON config file
42
+ */
43
+ export declare function readConfig(configPath: string): ConfigReadResult;
44
+ /**
45
+ * Write config to file with backup
46
+ */
47
+ export declare function writeConfig(configPath: string, config: MCPConfig | ContinueConfig, createBackupFirst?: boolean): ConfigWriteResult;
48
+ /**
49
+ * Deep merge two objects
50
+ */
51
+ export declare function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T;
52
+ /**
53
+ * Generate APIClaw MCP server configuration
54
+ */
55
+ export declare function generateApiclawConfig(options?: MergeOptions): MCPServerConfig;
56
+ /**
57
+ * Generate APIClaw config for Continue (array format)
58
+ */
59
+ export declare function generateApiclawContinueConfig(options?: MergeOptions): ContinueServerConfig;
60
+ /**
61
+ * Check if APIClaw is already configured
62
+ */
63
+ export declare function hasApiclawConfig(config: MCPConfig | ContinueConfig, serverName?: string): boolean;
64
+ /**
65
+ * Merge APIClaw config into existing config (standard format)
66
+ */
67
+ export declare function mergeApiclawConfig(existingConfig: MCPConfig, options?: MergeOptions): MCPConfig;
68
+ /**
69
+ * Merge APIClaw config into Continue config (array format)
70
+ */
71
+ export declare function mergeApiclawContinueConfig(existingConfig: ContinueConfig, options?: MergeOptions): ContinueConfig;
72
+ /**
73
+ * Remove APIClaw from config
74
+ */
75
+ export declare function removeApiclawConfig(config: MCPConfig | ContinueConfig, serverName?: string): MCPConfig | ContinueConfig;
76
+ /**
77
+ * Detect if config uses Continue's array format
78
+ */
79
+ export declare function isContinueFormat(config: MCPConfig | ContinueConfig): config is ContinueConfig;
80
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,SAAS;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAGD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACpC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CA2C/D;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,GAAG,cAAc,EAClC,iBAAiB,UAAO,GACvB,iBAAiB,CAsCnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzD,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,CAAC,CA2BH;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,YAAiB,GAAG,eAAe,CAajF;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,OAAO,GAAE,YAAiB,GAAG,oBAAoB,CAc9F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,EAAE,UAAU,SAAY,GAAG,OAAO,CAUpG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,cAAc,EAAE,SAAS,EACzB,OAAO,GAAE,YAAiB,GACzB,SAAS,CAUX;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,YAAiB,GACzB,cAAc,CAuBhB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,GAAG,cAAc,EAClC,UAAU,SAAY,GACrB,SAAS,GAAG,cAAc,CAkB5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,GAAG,MAAM,IAAI,cAAc,CAE7F"}