@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,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Uninstall Command
|
|
3
|
+
* Remove APIClaw configuration from MCP clients
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { getAllClients, getClientConfig, parseClientArg } from '../../utils/paths.js';
|
|
7
|
+
import { readConfig, writeConfig, removeApiclawConfig, hasApiclawConfig } from '../../utils/config.js';
|
|
8
|
+
import { createBackup } from '../../utils/backup.js';
|
|
9
|
+
/**
|
|
10
|
+
* Remove APIClaw from a single client
|
|
11
|
+
*/
|
|
12
|
+
export function uninstallFromClient(client, options = {}) {
|
|
13
|
+
const config = getClientConfig(client);
|
|
14
|
+
const configPath = config.configPath;
|
|
15
|
+
const serverName = options.serverName || 'apiclaw';
|
|
16
|
+
// Check if config file exists
|
|
17
|
+
if (!existsSync(configPath)) {
|
|
18
|
+
return {
|
|
19
|
+
success: true,
|
|
20
|
+
client: config.displayName,
|
|
21
|
+
action: 'not-found',
|
|
22
|
+
message: 'Config file not found (client not installed)',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
// Read config
|
|
26
|
+
const readResult = readConfig(configPath);
|
|
27
|
+
if (!readResult.success || !readResult.config) {
|
|
28
|
+
return {
|
|
29
|
+
success: false,
|
|
30
|
+
client: config.displayName,
|
|
31
|
+
action: 'error',
|
|
32
|
+
message: readResult.error || 'Failed to read config',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Check if APIClaw is configured
|
|
36
|
+
if (!hasApiclawConfig(readResult.config, serverName)) {
|
|
37
|
+
if (options.force) {
|
|
38
|
+
return {
|
|
39
|
+
success: true,
|
|
40
|
+
client: config.displayName,
|
|
41
|
+
action: 'skipped',
|
|
42
|
+
message: `${serverName} not configured (forced check)`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
client: config.displayName,
|
|
48
|
+
action: 'skipped',
|
|
49
|
+
message: `${serverName} not configured`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
// Dry run - just report what would happen
|
|
53
|
+
if (options.dryRun) {
|
|
54
|
+
return {
|
|
55
|
+
success: true,
|
|
56
|
+
client: config.displayName,
|
|
57
|
+
action: 'skipped',
|
|
58
|
+
message: `Would remove ${serverName} (dry run)`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
// Create backup before modifying
|
|
62
|
+
let backupPath;
|
|
63
|
+
if (!options.noBackup) {
|
|
64
|
+
const backupResult = createBackup(configPath);
|
|
65
|
+
if (backupResult.success) {
|
|
66
|
+
backupPath = backupResult.backupPath || undefined;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Remove APIClaw from config
|
|
70
|
+
const updatedConfig = removeApiclawConfig(readResult.config, serverName);
|
|
71
|
+
// Write updated config (without creating another backup)
|
|
72
|
+
const writeResult = writeConfig(configPath, updatedConfig, false);
|
|
73
|
+
if (!writeResult.success) {
|
|
74
|
+
return {
|
|
75
|
+
success: false,
|
|
76
|
+
client: config.displayName,
|
|
77
|
+
action: 'error',
|
|
78
|
+
message: writeResult.error || 'Failed to write config',
|
|
79
|
+
backupPath,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
success: true,
|
|
84
|
+
client: config.displayName,
|
|
85
|
+
action: 'removed',
|
|
86
|
+
message: `${serverName} removed`,
|
|
87
|
+
backupPath,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Uninstall from all clients
|
|
92
|
+
*/
|
|
93
|
+
export function uninstallFromAll(options = {}) {
|
|
94
|
+
const results = [];
|
|
95
|
+
for (const client of getAllClients()) {
|
|
96
|
+
results.push(uninstallFromClient(client, options));
|
|
97
|
+
}
|
|
98
|
+
return results;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Format uninstall results for display
|
|
102
|
+
*/
|
|
103
|
+
export function formatUninstallResults(results) {
|
|
104
|
+
const lines = [];
|
|
105
|
+
lines.push('');
|
|
106
|
+
lines.push('🗑️ Uninstall Results');
|
|
107
|
+
lines.push('====================');
|
|
108
|
+
lines.push('');
|
|
109
|
+
const removed = results.filter(r => r.action === 'removed');
|
|
110
|
+
const skipped = results.filter(r => r.action === 'skipped');
|
|
111
|
+
const notFound = results.filter(r => r.action === 'not-found');
|
|
112
|
+
const errors = results.filter(r => r.action === 'error');
|
|
113
|
+
// Show removed
|
|
114
|
+
if (removed.length > 0) {
|
|
115
|
+
lines.push('Removed:');
|
|
116
|
+
for (const result of removed) {
|
|
117
|
+
lines.push(` ✓ ${result.client}`);
|
|
118
|
+
if (result.backupPath) {
|
|
119
|
+
lines.push(` Backup: ${result.backupPath}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
lines.push('');
|
|
123
|
+
}
|
|
124
|
+
// Show skipped
|
|
125
|
+
if (skipped.length > 0) {
|
|
126
|
+
lines.push('Skipped (not configured):');
|
|
127
|
+
for (const result of skipped) {
|
|
128
|
+
lines.push(` ○ ${result.client}`);
|
|
129
|
+
}
|
|
130
|
+
lines.push('');
|
|
131
|
+
}
|
|
132
|
+
// Show not found
|
|
133
|
+
if (notFound.length > 0) {
|
|
134
|
+
lines.push('Not installed:');
|
|
135
|
+
for (const result of notFound) {
|
|
136
|
+
lines.push(` ○ ${result.client}`);
|
|
137
|
+
}
|
|
138
|
+
lines.push('');
|
|
139
|
+
}
|
|
140
|
+
// Show errors
|
|
141
|
+
if (errors.length > 0) {
|
|
142
|
+
lines.push('Errors:');
|
|
143
|
+
for (const result of errors) {
|
|
144
|
+
lines.push(` ✗ ${result.client}: ${result.message}`);
|
|
145
|
+
}
|
|
146
|
+
lines.push('');
|
|
147
|
+
}
|
|
148
|
+
// Summary
|
|
149
|
+
if (removed.length > 0) {
|
|
150
|
+
lines.push(`✓ APIClaw removed from ${removed.length} client(s).`);
|
|
151
|
+
lines.push(' Restart your MCP clients for changes to take effect.');
|
|
152
|
+
}
|
|
153
|
+
else if (errors.length === 0) {
|
|
154
|
+
lines.push('No changes made - APIClaw was not configured in any client.');
|
|
155
|
+
}
|
|
156
|
+
lines.push('');
|
|
157
|
+
return lines.join('\n');
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Uninstall command handler
|
|
161
|
+
*/
|
|
162
|
+
export async function uninstallCommand(options = {}) {
|
|
163
|
+
const serverName = options.serverName || 'apiclaw';
|
|
164
|
+
// Dry run notice
|
|
165
|
+
if (options.dryRun) {
|
|
166
|
+
console.log('\n🔍 Dry run - no changes will be made\n');
|
|
167
|
+
}
|
|
168
|
+
let results;
|
|
169
|
+
// Uninstall from specific client
|
|
170
|
+
if (options.client) {
|
|
171
|
+
const client = parseClientArg(options.client);
|
|
172
|
+
if (!client) {
|
|
173
|
+
console.error(`\n✗ Unknown client: ${options.client}\n`);
|
|
174
|
+
console.error('Valid clients: claude, cursor, windsurf, cline, continue\n');
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
results = [uninstallFromClient(client, options)];
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// Uninstall from all clients
|
|
181
|
+
results = uninstallFromAll(options);
|
|
182
|
+
}
|
|
183
|
+
console.log(formatUninstallResults(results));
|
|
184
|
+
const errors = results.filter(r => r.action === 'error');
|
|
185
|
+
if (errors.length > 0) {
|
|
186
|
+
process.exit(1);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/cli/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* APIClaw MCP Auto-Setup CLI
|
|
4
|
+
* Enterprise-grade, platform-agnostic configuration tool
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
import { writeFileSync } from 'fs';
|
|
8
|
+
import { setupCommand } from './commands/setup.js';
|
|
9
|
+
import { doctorCommand } from './commands/doctor.js';
|
|
10
|
+
import { restoreCommand } from './commands/restore.js';
|
|
11
|
+
import { uninstallCommand } from './commands/uninstall.js';
|
|
12
|
+
import { generateScript } from '../enterprise/script-generator.js';
|
|
13
|
+
const VERSION = '1.0.0';
|
|
14
|
+
const program = new Command();
|
|
15
|
+
program
|
|
16
|
+
.name('apiclaw')
|
|
17
|
+
.description('APIClaw MCP Auto-Setup - Configure APIClaw across all your AI coding assistants')
|
|
18
|
+
.version(VERSION);
|
|
19
|
+
// Setup command - main entry point
|
|
20
|
+
program
|
|
21
|
+
.command('setup')
|
|
22
|
+
.description('Configure APIClaw for MCP clients')
|
|
23
|
+
.option('-c, --client <client>', 'Target specific client (claude-desktop, cursor, windsurf, cline, continue)')
|
|
24
|
+
.option('--config <path>', 'Custom config file path')
|
|
25
|
+
.option('-w, --workspace <id>', 'Pre-link APIClaw workspace ID')
|
|
26
|
+
.option('--dry-run', 'Show what would happen without making changes')
|
|
27
|
+
.option('-f, --force', 'Overwrite existing APIClaw configuration')
|
|
28
|
+
.option('--wizard', 'Interactive setup wizard')
|
|
29
|
+
.option('--all', 'Configure all detected clients')
|
|
30
|
+
.option('-v, --verbose', 'Verbose output')
|
|
31
|
+
.option('--enterprise', 'Generate enterprise deployment script')
|
|
32
|
+
.option('--output <file>', 'Output file for enterprise script')
|
|
33
|
+
.option('--script-type <type>', 'Script type: bash or powershell (default: auto)')
|
|
34
|
+
.action(async (options) => {
|
|
35
|
+
// Enterprise script generation mode
|
|
36
|
+
if (options.enterprise) {
|
|
37
|
+
const scriptType = options.scriptType || 'auto';
|
|
38
|
+
const result = generateScript(scriptType, {
|
|
39
|
+
workspace: options.workspace,
|
|
40
|
+
verbose: options.verbose,
|
|
41
|
+
});
|
|
42
|
+
if (options.output) {
|
|
43
|
+
writeFileSync(options.output, result.script);
|
|
44
|
+
console.log(`\n✓ Enterprise script written to: ${options.output}`);
|
|
45
|
+
console.log(` Type: ${result.platform}`);
|
|
46
|
+
console.log(`\nUsage:`);
|
|
47
|
+
if (result.platform === 'bash') {
|
|
48
|
+
console.log(` chmod +x ${options.output}`);
|
|
49
|
+
console.log(` ./${options.output}`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(` powershell -ExecutionPolicy Bypass -File ${options.output}`);
|
|
53
|
+
}
|
|
54
|
+
console.log('');
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
console.log(result.script);
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
// Normal setup
|
|
62
|
+
await setupCommand(options);
|
|
63
|
+
});
|
|
64
|
+
// Doctor command - health check
|
|
65
|
+
program
|
|
66
|
+
.command('doctor')
|
|
67
|
+
.description('Diagnose APIClaw setup and connectivity')
|
|
68
|
+
.option('--server-name <name>', 'Server name to check (default: apiclaw)')
|
|
69
|
+
.option('--json', 'Output as JSON')
|
|
70
|
+
.action(doctorCommand);
|
|
71
|
+
// Restore command - rollback from backup
|
|
72
|
+
program
|
|
73
|
+
.command('restore')
|
|
74
|
+
.description('Restore config from backup')
|
|
75
|
+
.option('-c, --client <client>', 'Target specific client')
|
|
76
|
+
.option('-l, --list', 'List available backups')
|
|
77
|
+
.option('-b, --backup <file>', 'Specific backup file to restore')
|
|
78
|
+
.option('--dry-run', 'Show what would be done without making changes')
|
|
79
|
+
.action(restoreCommand);
|
|
80
|
+
// Uninstall command - remove APIClaw
|
|
81
|
+
program
|
|
82
|
+
.command('uninstall')
|
|
83
|
+
.description('Remove APIClaw from all configured clients')
|
|
84
|
+
.option('-c, --client <client>', 'Target specific client')
|
|
85
|
+
.option('--all', 'Remove from all clients')
|
|
86
|
+
.option('--server-name <name>', 'Server name to remove (default: apiclaw)')
|
|
87
|
+
.option('--no-backup', 'Skip backup creation')
|
|
88
|
+
.option('--dry-run', 'Show what would be done without making changes')
|
|
89
|
+
.option('-f, --force', 'Remove even if not configured')
|
|
90
|
+
.action(uninstallCommand);
|
|
91
|
+
// Parse and execute
|
|
92
|
+
program.parse();
|
|
93
|
+
// Show help if no command provided
|
|
94
|
+
if (!process.argv.slice(2).length) {
|
|
95
|
+
program.outputHelp();
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AAGnE,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,iFAAiF,CAAC;KAC9F,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mCAAmC;AACnC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,uBAAuB,EAAE,4EAA4E,CAAC;KAC7G,MAAM,CAAC,iBAAiB,EAAE,yBAAyB,CAAC;KACpD,MAAM,CAAC,sBAAsB,EAAE,+BAA+B,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,+CAA+C,CAAC;KACpE,MAAM,CAAC,aAAa,EAAE,0CAA0C,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,0BAA0B,CAAC;KAC9C,MAAM,CAAC,OAAO,EAAE,gCAAgC,CAAC;KACjD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;KACzC,MAAM,CAAC,cAAc,EAAE,uCAAuC,CAAC;KAC/D,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;KAC9D,MAAM,CAAC,sBAAsB,EAAE,iDAAiD,CAAC;KACjF,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,oCAAoC;IACpC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAC;QAChD,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,EAAE;YACxC,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,qCAAqC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACvC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,8CAA8C,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC9E,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO;IACT,CAAC;IAED,eAAe;IACf,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC,CAAC,CAAC;AAEL,gCAAgC;AAChC,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,sBAAsB,EAAE,yCAAyC,CAAC;KACzE,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,yCAAyC;AACzC,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,qBAAqB,EAAE,iCAAiC,CAAC;KAChE,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;KACrE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,qCAAqC;AACrC,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,uBAAuB,EAAE,wBAAwB,CAAC;KACzD,MAAM,CAAC,OAAO,EAAE,yBAAyB,CAAC;KAC1C,MAAM,CAAC,sBAAsB,EAAE,0CAA0C,CAAC;KAC1E,MAAM,CAAC,aAAa,EAAE,sBAAsB,CAAC;KAC7C,MAAM,CAAC,WAAW,EAAE,gDAAgD,CAAC;KACrE,MAAM,CAAC,aAAa,EAAE,+BAA+B,CAAC;KACtD,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE5B,oBAAoB;AACpB,OAAO,CAAC,KAAK,EAAE,CAAC;AAEhB,mCAAmC;AACnC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAClC,OAAO,CAAC,UAAU,EAAE,CAAC;AACvB,CAAC"}
|
package/dist/discovery.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { APIProvider, SearchResult } from './types.js';
|
|
1
|
+
import { APIProvider, SearchResult, APIDetailsResponse } from './types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Discover APIs based on a natural language query
|
|
4
4
|
* MVP uses keyword matching; production would use embeddings
|
|
@@ -11,8 +11,12 @@ export declare function discoverAPIs(query: string, options?: {
|
|
|
11
11
|
}): SearchResult[];
|
|
12
12
|
/**
|
|
13
13
|
* Get detailed information about a specific API
|
|
14
|
+
* @param apiId - The API provider ID
|
|
15
|
+
* @param options.compact - If true, returns minified spec (saves ~60% tokens)
|
|
14
16
|
*/
|
|
15
|
-
export declare function getAPIDetails(apiId: string
|
|
17
|
+
export declare function getAPIDetails(apiId: string, options?: {
|
|
18
|
+
compact?: boolean;
|
|
19
|
+
}): APIDetailsResponse | null;
|
|
16
20
|
/**
|
|
17
21
|
* List all APIs in a category
|
|
18
22
|
*/
|
package/dist/discovery.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAmO3E;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IACP,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACZ,GACL,YAAY,EAAE,CA6EhB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAClC,kBAAkB,GAAG,IAAI,CA4G3B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE,CAE9D;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAExC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,WAAW,EAAE,CAE1C"}
|
package/dist/discovery.js
CHANGED
|
@@ -3,10 +3,217 @@
|
|
|
3
3
|
import { readFileSync } from 'fs';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { dirname, join } from 'path';
|
|
6
|
+
import { openAPIs, isOpenAPI } from './open-apis.js';
|
|
6
7
|
const __filename = fileURLToPath(import.meta.url);
|
|
7
8
|
const __dirname = dirname(__filename);
|
|
8
9
|
const apisData = JSON.parse(readFileSync(join(__dirname, 'registry', 'apis.json'), 'utf-8'));
|
|
9
10
|
const apis = apisData.apis;
|
|
11
|
+
// Direct Call provider specs (hardcoded handlers with params)
|
|
12
|
+
const DIRECT_CALL_SPECS = {
|
|
13
|
+
'46elks': {
|
|
14
|
+
description: 'Swedish SMS and voice API',
|
|
15
|
+
auth: 'basic',
|
|
16
|
+
docs: 'https://46elks.com/docs',
|
|
17
|
+
actions: {
|
|
18
|
+
send_sms: {
|
|
19
|
+
desc: 'Send SMS message',
|
|
20
|
+
params: [
|
|
21
|
+
{ name: 'to', required: true, desc: 'Phone number (+46...)' },
|
|
22
|
+
{ name: 'message', required: true, desc: 'SMS text (max 160 chars for 1 segment)' },
|
|
23
|
+
{ name: 'from', required: false, desc: 'Sender ID (default: APIClaw)' },
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
twilio: {
|
|
29
|
+
description: 'Global SMS and voice API',
|
|
30
|
+
auth: 'basic',
|
|
31
|
+
docs: 'https://www.twilio.com/docs',
|
|
32
|
+
actions: {
|
|
33
|
+
send_sms: {
|
|
34
|
+
desc: 'Send SMS message',
|
|
35
|
+
params: [
|
|
36
|
+
{ name: 'to', required: true, desc: 'Phone number (E.164 format)' },
|
|
37
|
+
{ name: 'message', required: true, desc: 'SMS text' },
|
|
38
|
+
{ name: 'from', required: false, desc: 'Sender phone number' },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
brave_search: {
|
|
44
|
+
description: 'Web search API',
|
|
45
|
+
auth: 'api_key',
|
|
46
|
+
docs: 'https://api.search.brave.com/docs',
|
|
47
|
+
actions: {
|
|
48
|
+
search: {
|
|
49
|
+
desc: 'Search the web',
|
|
50
|
+
params: [
|
|
51
|
+
{ name: 'query', required: true, desc: 'Search query' },
|
|
52
|
+
{ name: 'count', required: false, desc: 'Number of results (default: 5)' },
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
resend: {
|
|
58
|
+
description: 'Email API',
|
|
59
|
+
auth: 'bearer',
|
|
60
|
+
docs: 'https://resend.com/docs',
|
|
61
|
+
actions: {
|
|
62
|
+
send_email: {
|
|
63
|
+
desc: 'Send email',
|
|
64
|
+
params: [
|
|
65
|
+
{ name: 'to', required: true, desc: 'Recipient email' },
|
|
66
|
+
{ name: 'subject', required: true, desc: 'Email subject' },
|
|
67
|
+
{ name: 'html', required: false, desc: 'HTML body' },
|
|
68
|
+
{ name: 'text', required: false, desc: 'Plain text body' },
|
|
69
|
+
{ name: 'from', required: false, desc: 'Sender (default: noreply@apiclaw.nordsym.com)' },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
openrouter: {
|
|
75
|
+
description: 'LLM routing (100+ models)',
|
|
76
|
+
auth: 'bearer',
|
|
77
|
+
docs: 'https://openrouter.ai/docs',
|
|
78
|
+
actions: {
|
|
79
|
+
chat: {
|
|
80
|
+
desc: 'Chat completion',
|
|
81
|
+
params: [
|
|
82
|
+
{ name: 'messages', required: true, desc: 'Array of {role, content}' },
|
|
83
|
+
{ name: 'model', required: false, desc: 'Model ID (default: claude-3-haiku)' },
|
|
84
|
+
{ name: 'max_tokens', required: false, desc: 'Max response tokens (default: 1000)' },
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
elevenlabs: {
|
|
90
|
+
description: 'Text-to-speech',
|
|
91
|
+
auth: 'api_key',
|
|
92
|
+
docs: 'https://elevenlabs.io/docs',
|
|
93
|
+
actions: {
|
|
94
|
+
text_to_speech: {
|
|
95
|
+
desc: 'Generate audio from text',
|
|
96
|
+
params: [
|
|
97
|
+
{ name: 'text', required: true, desc: 'Text to speak' },
|
|
98
|
+
{ name: 'voice_id', required: false, desc: 'Voice ID (default: Rachel)' },
|
|
99
|
+
{ name: 'model_id', required: false, desc: 'Model ID' },
|
|
100
|
+
],
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
replicate: {
|
|
105
|
+
description: 'Run any AI model (images, video, audio)',
|
|
106
|
+
auth: 'bearer',
|
|
107
|
+
docs: 'https://replicate.com/docs',
|
|
108
|
+
actions: {
|
|
109
|
+
run: {
|
|
110
|
+
desc: 'Run a model',
|
|
111
|
+
params: [
|
|
112
|
+
{ name: 'model', required: true, desc: 'Model ID (e.g., stability-ai/sdxl:...)' },
|
|
113
|
+
{ name: 'input', required: true, desc: 'Model input parameters' },
|
|
114
|
+
],
|
|
115
|
+
},
|
|
116
|
+
list_models: {
|
|
117
|
+
desc: 'List available models',
|
|
118
|
+
params: [],
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
firecrawl: {
|
|
123
|
+
description: 'Web scraping and crawling',
|
|
124
|
+
auth: 'bearer',
|
|
125
|
+
docs: 'https://firecrawl.dev/docs',
|
|
126
|
+
actions: {
|
|
127
|
+
scrape: {
|
|
128
|
+
desc: 'Scrape a URL',
|
|
129
|
+
params: [
|
|
130
|
+
{ name: 'url', required: true, desc: 'URL to scrape' },
|
|
131
|
+
{ name: 'formats', required: false, desc: 'Output formats (default: ["markdown"])' },
|
|
132
|
+
],
|
|
133
|
+
},
|
|
134
|
+
crawl: {
|
|
135
|
+
desc: 'Start a crawl job',
|
|
136
|
+
params: [
|
|
137
|
+
{ name: 'url', required: true, desc: 'Starting URL' },
|
|
138
|
+
{ name: 'limit', required: false, desc: 'Max pages (default: 10)' },
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
map: {
|
|
142
|
+
desc: 'Map site structure',
|
|
143
|
+
params: [
|
|
144
|
+
{ name: 'url', required: true, desc: 'URL to map' },
|
|
145
|
+
],
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
github: {
|
|
150
|
+
description: 'Code repos and developer data',
|
|
151
|
+
auth: 'bearer',
|
|
152
|
+
docs: 'https://docs.github.com/rest',
|
|
153
|
+
actions: {
|
|
154
|
+
search_repos: {
|
|
155
|
+
desc: 'Search repositories',
|
|
156
|
+
params: [
|
|
157
|
+
{ name: 'query', required: true, desc: 'Search query' },
|
|
158
|
+
{ name: 'sort', required: false, desc: 'Sort by (default: stars)' },
|
|
159
|
+
{ name: 'limit', required: false, desc: 'Max results (default: 10)' },
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
get_repo: {
|
|
163
|
+
desc: 'Get repo details',
|
|
164
|
+
params: [
|
|
165
|
+
{ name: 'owner', required: true, desc: 'Repo owner' },
|
|
166
|
+
{ name: 'repo', required: true, desc: 'Repo name' },
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
list_issues: {
|
|
170
|
+
desc: 'List issues',
|
|
171
|
+
params: [
|
|
172
|
+
{ name: 'owner', required: true, desc: 'Repo owner' },
|
|
173
|
+
{ name: 'repo', required: true, desc: 'Repo name' },
|
|
174
|
+
{ name: 'state', required: false, desc: 'State filter (default: open)' },
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
create_issue: {
|
|
178
|
+
desc: 'Create issue',
|
|
179
|
+
params: [
|
|
180
|
+
{ name: 'owner', required: true, desc: 'Repo owner' },
|
|
181
|
+
{ name: 'repo', required: true, desc: 'Repo name' },
|
|
182
|
+
{ name: 'title', required: true, desc: 'Issue title' },
|
|
183
|
+
{ name: 'body', required: false, desc: 'Issue body' },
|
|
184
|
+
],
|
|
185
|
+
},
|
|
186
|
+
get_file: {
|
|
187
|
+
desc: 'Get file contents',
|
|
188
|
+
params: [
|
|
189
|
+
{ name: 'owner', required: true, desc: 'Repo owner' },
|
|
190
|
+
{ name: 'repo', required: true, desc: 'Repo name' },
|
|
191
|
+
{ name: 'path', required: true, desc: 'File path' },
|
|
192
|
+
],
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
e2b: {
|
|
197
|
+
description: 'Code sandbox for AI agents',
|
|
198
|
+
auth: 'api_key',
|
|
199
|
+
docs: 'https://e2b.dev/docs',
|
|
200
|
+
actions: {
|
|
201
|
+
run_code: {
|
|
202
|
+
desc: 'Execute code in sandbox',
|
|
203
|
+
params: [
|
|
204
|
+
{ name: 'code', required: true, desc: 'Code to run' },
|
|
205
|
+
{ name: 'language', required: false, desc: 'Language (default: python)' },
|
|
206
|
+
],
|
|
207
|
+
},
|
|
208
|
+
run_shell: {
|
|
209
|
+
desc: 'Execute shell command',
|
|
210
|
+
params: [
|
|
211
|
+
{ name: 'command', required: true, desc: 'Shell command' },
|
|
212
|
+
],
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
};
|
|
10
217
|
/**
|
|
11
218
|
* Discover APIs based on a natural language query
|
|
12
219
|
* MVP uses keyword matching; production would use embeddings
|
|
@@ -77,9 +284,96 @@ export function discoverAPIs(query, options = {}) {
|
|
|
77
284
|
}
|
|
78
285
|
/**
|
|
79
286
|
* Get detailed information about a specific API
|
|
287
|
+
* @param apiId - The API provider ID
|
|
288
|
+
* @param options.compact - If true, returns minified spec (saves ~60% tokens)
|
|
80
289
|
*/
|
|
81
|
-
export function getAPIDetails(apiId) {
|
|
82
|
-
|
|
290
|
+
export function getAPIDetails(apiId, options = {}) {
|
|
291
|
+
const { compact = false } = options;
|
|
292
|
+
// Check if it's a Direct Call provider (hardcoded handlers)
|
|
293
|
+
const directSpec = DIRECT_CALL_SPECS[apiId];
|
|
294
|
+
if (directSpec) {
|
|
295
|
+
if (compact) {
|
|
296
|
+
// Minified format: ~60% smaller
|
|
297
|
+
return {
|
|
298
|
+
id: apiId,
|
|
299
|
+
type: 'direct_call',
|
|
300
|
+
desc: directSpec.description,
|
|
301
|
+
auth: directSpec.auth,
|
|
302
|
+
actions: Object.fromEntries(Object.entries(directSpec.actions).map(([action, info]) => [
|
|
303
|
+
action,
|
|
304
|
+
{
|
|
305
|
+
params: info.params.map(p => p.required ? p.name : `${p.name}?`),
|
|
306
|
+
},
|
|
307
|
+
])),
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
return {
|
|
311
|
+
id: apiId,
|
|
312
|
+
type: 'direct_call',
|
|
313
|
+
name: apiId,
|
|
314
|
+
description: directSpec.description,
|
|
315
|
+
auth_type: directSpec.auth,
|
|
316
|
+
docs_url: directSpec.docs,
|
|
317
|
+
direct_call: true,
|
|
318
|
+
actions: Object.fromEntries(Object.entries(directSpec.actions).map(([action, info]) => [
|
|
319
|
+
action,
|
|
320
|
+
{
|
|
321
|
+
description: info.desc,
|
|
322
|
+
params: info.params,
|
|
323
|
+
},
|
|
324
|
+
])),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// Check if it's an Open API (free, no auth)
|
|
328
|
+
if (isOpenAPI(apiId)) {
|
|
329
|
+
const openApi = openAPIs[apiId];
|
|
330
|
+
const actions = Object.keys(openApi.actions);
|
|
331
|
+
if (compact) {
|
|
332
|
+
return {
|
|
333
|
+
id: apiId,
|
|
334
|
+
type: 'open',
|
|
335
|
+
desc: openApi.description,
|
|
336
|
+
auth: 'none',
|
|
337
|
+
actions: Object.fromEntries(actions.map(a => [a, { params: [] }])),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
id: apiId,
|
|
342
|
+
type: 'open',
|
|
343
|
+
name: openApi.name,
|
|
344
|
+
description: openApi.description,
|
|
345
|
+
auth_type: 'none',
|
|
346
|
+
free: true,
|
|
347
|
+
actions: Object.fromEntries(actions.map(a => [a, { description: `Execute ${a}`, params: [] }])),
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
// Fall back to registry (19,000+ APIs - basic info only)
|
|
351
|
+
const registryApi = apis.find(api => api.id === apiId ||
|
|
352
|
+
api.name?.toLowerCase() === apiId.toLowerCase());
|
|
353
|
+
if (!registryApi) {
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
if (compact) {
|
|
357
|
+
return {
|
|
358
|
+
id: registryApi.id || registryApi.name,
|
|
359
|
+
type: 'registry',
|
|
360
|
+
desc: registryApi.description?.slice(0, 80),
|
|
361
|
+
auth: registryApi.auth_type || registryApi.auth || 'unknown',
|
|
362
|
+
url: registryApi.base_url || registryApi.baseUrl,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
id: registryApi.id || registryApi.name,
|
|
367
|
+
type: 'registry',
|
|
368
|
+
name: registryApi.name,
|
|
369
|
+
description: registryApi.description,
|
|
370
|
+
category: registryApi.category,
|
|
371
|
+
auth_type: registryApi.auth_type || registryApi.auth,
|
|
372
|
+
base_url: registryApi.base_url || registryApi.baseUrl,
|
|
373
|
+
docs_url: registryApi.docs_url || registryApi.docsUrl,
|
|
374
|
+
pricing: registryApi.pricing || registryApi.pricing,
|
|
375
|
+
note: 'Registry API - use call_api with customer_key or check docs for integration',
|
|
376
|
+
};
|
|
83
377
|
}
|
|
84
378
|
/**
|
|
85
379
|
* List all APIs in a category
|