@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,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,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * APIClaw MCP Auto-Setup CLI
4
+ * Enterprise-grade, platform-agnostic configuration tool
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}
@@ -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): APIProvider | null;
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
  */
@@ -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;AAavD;;;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;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAE/D;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"}
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
- return apis.find(api => api.id === apiId) || null;
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