@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.
- package/README.md +422 -169
- package/convex/_generated/api.d.ts +16 -0
- package/convex/agents.ts +403 -0
- package/convex/billing.ts +651 -216
- package/convex/crons.ts +17 -0
- package/convex/directCall.ts +80 -0
- package/convex/earnProgress.ts +753 -0
- package/convex/email.ts +135 -82
- package/convex/feedback.ts +265 -0
- package/convex/http.ts +80 -4
- package/convex/logs.ts +304 -0
- package/convex/providerKeys.ts +289 -0
- package/convex/providers.ts +18 -0
- package/convex/schema.ts +185 -1
- package/convex/stripeActions.ts +512 -0
- package/convex/webhooks.ts +494 -0
- package/convex/workspaces.ts +158 -3
- package/dist/adapters/base.d.ts +112 -0
- package/dist/adapters/base.d.ts.map +1 -0
- package/dist/adapters/base.js +247 -0
- package/dist/adapters/base.js.map +1 -0
- package/dist/adapters/claude-desktop.d.ts +12 -0
- package/dist/adapters/claude-desktop.d.ts.map +1 -0
- package/dist/adapters/claude-desktop.js +36 -0
- package/dist/adapters/claude-desktop.js.map +1 -0
- package/dist/adapters/cline.d.ts +20 -0
- package/dist/adapters/cline.d.ts.map +1 -0
- package/dist/adapters/cline.js +77 -0
- package/dist/adapters/cline.js.map +1 -0
- package/dist/adapters/continue.d.ts +26 -0
- package/dist/adapters/continue.d.ts.map +1 -0
- package/dist/adapters/continue.js +68 -0
- package/dist/adapters/continue.js.map +1 -0
- package/dist/adapters/cursor.d.ts +12 -0
- package/dist/adapters/cursor.d.ts.map +1 -0
- package/dist/adapters/cursor.js +38 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/custom.d.ts +47 -0
- package/dist/adapters/custom.d.ts.map +1 -0
- package/dist/adapters/custom.js +146 -0
- package/dist/adapters/custom.js.map +1 -0
- package/dist/adapters/detect.d.ts +69 -0
- package/dist/adapters/detect.d.ts.map +1 -0
- package/dist/adapters/detect.js +158 -0
- package/dist/adapters/detect.js.map +1 -0
- package/dist/adapters/index.d.ts +21 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +23 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/windsurf.d.ts +12 -0
- package/dist/adapters/windsurf.d.ts.map +1 -0
- package/dist/adapters/windsurf.js +39 -0
- package/dist/adapters/windsurf.js.map +1 -0
- package/dist/bin.d.ts +9 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +19 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +34 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +312 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/index.d.ts +9 -0
- package/dist/cli/commands/index.d.ts.map +1 -0
- package/dist/cli/commands/index.js +9 -0
- package/dist/cli/commands/index.js.map +1 -0
- package/dist/cli/commands/restore.d.ts +50 -0
- package/dist/cli/commands/restore.d.ts.map +1 -0
- package/dist/cli/commands/restore.js +260 -0
- package/dist/cli/commands/restore.js.map +1 -0
- package/dist/cli/commands/setup.d.ts +19 -0
- package/dist/cli/commands/setup.d.ts.map +1 -0
- package/dist/cli/commands/setup.js +206 -0
- package/dist/cli/commands/setup.js.map +1 -0
- package/dist/cli/commands/uninstall.d.ts +37 -0
- package/dist/cli/commands/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/uninstall.js +189 -0
- package/dist/cli/commands/uninstall.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +97 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/discovery.d.ts +6 -2
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +296 -2
- package/dist/discovery.js.map +1 -1
- package/dist/enterprise/env.d.ts +56 -0
- package/dist/enterprise/env.d.ts.map +1 -0
- package/dist/enterprise/env.js +124 -0
- package/dist/enterprise/env.js.map +1 -0
- package/dist/enterprise/index.d.ts +7 -0
- package/dist/enterprise/index.d.ts.map +1 -0
- package/dist/enterprise/index.js +7 -0
- package/dist/enterprise/index.js.map +1 -0
- package/dist/enterprise/script-generator.d.ts +32 -0
- package/dist/enterprise/script-generator.d.ts.map +1 -0
- package/dist/enterprise/script-generator.js +461 -0
- package/dist/enterprise/script-generator.js.map +1 -0
- package/dist/execute.d.ts +21 -0
- package/dist/execute.d.ts.map +1 -1
- package/dist/execute.js +231 -0
- package/dist/execute.js.map +1 -1
- package/dist/index.js +257 -7
- package/dist/index.js.map +1 -1
- package/dist/metered.d.ts +62 -0
- package/dist/metered.d.ts.map +1 -0
- package/dist/metered.js +81 -0
- package/dist/metered.js.map +1 -0
- package/dist/stripe.d.ts +62 -0
- package/dist/stripe.d.ts.map +1 -1
- package/dist/stripe.js +212 -0
- package/dist/stripe.js.map +1 -1
- package/dist/types.d.ts +29 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/colors.d.ts +111 -0
- package/dist/ui/colors.d.ts.map +1 -0
- package/dist/ui/colors.js +185 -0
- package/dist/ui/colors.js.map +1 -0
- package/dist/ui/errors.d.ts +69 -0
- package/dist/ui/errors.d.ts.map +1 -0
- package/dist/ui/errors.js +334 -0
- package/dist/ui/errors.js.map +1 -0
- package/dist/ui/index.d.ts +10 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +14 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/prompts.d.ts +88 -0
- package/dist/ui/prompts.d.ts.map +1 -0
- package/dist/ui/prompts.js +295 -0
- package/dist/ui/prompts.js.map +1 -0
- package/dist/ui/spinner.d.ts +112 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +229 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/utils/backup.d.ts +48 -0
- package/dist/utils/backup.d.ts.map +1 -0
- package/dist/utils/backup.js +182 -0
- package/dist/utils/backup.js.map +1 -0
- package/dist/utils/config.d.ts +80 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +221 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/os.d.ts +45 -0
- package/dist/utils/os.d.ts.map +1 -0
- package/dist/utils/os.js +106 -0
- package/dist/utils/os.js.map +1 -0
- package/dist/utils/paths.d.ts +38 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +160 -0
- package/dist/utils/paths.js.map +1 -0
- package/docs/PRD-BILLING.md +226 -0
- package/docs/PRD-EARN-SYSTEM.md +261 -0
- package/docs/PRD-MCP-AUTO-SETUP.md +623 -0
- package/docs/PRD-final-polish.md +117 -0
- package/docs/PRD-mobile-responsive.md +56 -0
- package/docs/PRD-navigation-expansion.md +295 -0
- package/docs/PRD-stripe-billing.md +312 -0
- package/docs/PRD-workspace-cleanup.md +200 -0
- package/docs/enterprise-deployment.md +728 -0
- package/landing/next.config.mjs +14 -0
- package/landing/public/stats.json +4 -2
- package/landing/scripts/generate-stats.js +12 -0
- package/landing/src/app/api/billing/checkout/route.ts +109 -0
- package/landing/src/app/api/billing/payment-method/route.ts +118 -0
- package/landing/src/app/api/billing/portal/route.ts +64 -0
- package/landing/src/app/api/workspace-auth/magic-link/route.ts +6 -3
- package/landing/src/app/auth/verify/page.tsx +31 -9
- package/landing/src/app/docs/page.tsx +1 -1
- package/landing/src/app/earn/page.tsx +6 -6
- package/landing/src/app/join/page.tsx +49 -0
- package/landing/src/app/login/page.tsx +8 -2
- package/landing/src/app/page.tsx +81 -96
- package/landing/src/app/providers/dashboard/page.tsx +1 -1
- package/landing/src/app/providers/register/page.tsx +1 -1
- package/landing/src/app/workspace/page.tsx +3269 -534
- package/landing/src/components/CheckoutButton.tsx +188 -0
- package/landing/src/components/EarnCreditsTab.tsx +842 -0
- package/landing/src/components/Toast.tsx +84 -0
- package/landing/src/lib/stats.json +3 -1
- package/package.json +9 -2
- package/src/adapters/base.ts +363 -0
- package/src/adapters/claude-desktop.ts +41 -0
- package/src/adapters/cline.ts +88 -0
- package/src/adapters/continue.ts +91 -0
- package/src/adapters/cursor.ts +43 -0
- package/src/adapters/custom.ts +188 -0
- package/src/adapters/detect.ts +202 -0
- package/src/adapters/index.ts +47 -0
- package/src/adapters/windsurf.ts +44 -0
- package/src/bin.ts +19 -0
- package/src/cli/commands/doctor.ts +367 -0
- package/src/cli/commands/index.ts +9 -0
- package/src/cli/commands/restore.ts +333 -0
- package/src/cli/commands/setup.ts +276 -0
- package/src/cli/commands/uninstall.ts +240 -0
- package/src/cli/index.ts +107 -0
- package/src/discovery.ts +328 -3
- package/src/enterprise/env.ts +156 -0
- package/src/enterprise/index.ts +7 -0
- package/src/enterprise/script-generator.ts +481 -0
- package/src/execute.ts +256 -0
- package/src/index.ts +290 -7
- package/src/metered.ts +149 -0
- package/src/stripe.ts +253 -0
- package/src/types.ts +32 -0
- package/src/ui/colors.ts +219 -0
- package/src/ui/errors.ts +394 -0
- package/src/ui/index.ts +17 -0
- package/src/ui/prompts.ts +390 -0
- package/src/ui/spinner.ts +325 -0
- package/src/utils/backup.ts +224 -0
- package/src/utils/config.ts +315 -0
- package/src/utils/os.ts +124 -0
- package/src/utils/paths.ts +203 -0
- 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"}
|