@agentbridgeai/cli 0.1.0
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/LICENSE +21 -0
- package/dist/commands.d.ts +12 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +111 -0
- package/dist/commands.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +347 -0
- package/dist/index.js.map +1 -0
- package/dist/repl.d.ts +3 -0
- package/dist/repl.d.ts.map +1 -0
- package/dist/repl.js +103 -0
- package/dist/repl.js.map +1 -0
- package/package.json +51 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AgentBridge
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive init command: guides API owners through making their API agent-ready.
|
|
3
|
+
*
|
|
4
|
+
* npx agentbridge init
|
|
5
|
+
*
|
|
6
|
+
* 1. Ask for OpenAPI spec (file path or URL)
|
|
7
|
+
* 2. Parse and preview actions
|
|
8
|
+
* 3. Generate .agentbridge.json manifest
|
|
9
|
+
* 4. Optionally generate MCP server config
|
|
10
|
+
*/
|
|
11
|
+
export declare function runInit(): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AASA;;;;;;;;;GASG;AACH,wBAAsB,OAAO,kBAmG5B"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
4
|
+
import { convertOpenAPIToManifest } from '@agentbridgeai/openapi';
|
|
5
|
+
function ask(rl, question) {
|
|
6
|
+
return new Promise(resolve => rl.question(question, resolve));
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Interactive init command: guides API owners through making their API agent-ready.
|
|
10
|
+
*
|
|
11
|
+
* npx agentbridge init
|
|
12
|
+
*
|
|
13
|
+
* 1. Ask for OpenAPI spec (file path or URL)
|
|
14
|
+
* 2. Parse and preview actions
|
|
15
|
+
* 3. Generate .agentbridge.json manifest
|
|
16
|
+
* 4. Optionally generate MCP server config
|
|
17
|
+
*/
|
|
18
|
+
export async function runInit() {
|
|
19
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
20
|
+
console.log('');
|
|
21
|
+
console.log(chalk.bold.cyan(' AgentBridge Init'));
|
|
22
|
+
console.log(chalk.gray(' Make your API agent-ready in 30 seconds'));
|
|
23
|
+
console.log('');
|
|
24
|
+
// Step 1: Get the OpenAPI spec
|
|
25
|
+
const specSource = await ask(rl, chalk.white(' Path to your OpenAPI spec (or URL): '));
|
|
26
|
+
let specContent;
|
|
27
|
+
try {
|
|
28
|
+
if (specSource.startsWith('http')) {
|
|
29
|
+
console.log(chalk.gray(' Fetching...'));
|
|
30
|
+
const res = await fetch(specSource);
|
|
31
|
+
if (!res.ok)
|
|
32
|
+
throw new Error(`HTTP ${res.status}`);
|
|
33
|
+
specContent = await res.text();
|
|
34
|
+
}
|
|
35
|
+
else if (existsSync(specSource)) {
|
|
36
|
+
specContent = readFileSync(specSource, 'utf-8');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
console.error(chalk.red(` File not found: ${specSource}`));
|
|
40
|
+
rl.close();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
console.error(chalk.red(` Failed to load spec: ${err.message}`));
|
|
46
|
+
rl.close();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
// Step 2: Convert and preview
|
|
50
|
+
let manifest;
|
|
51
|
+
try {
|
|
52
|
+
manifest = convertOpenAPIToManifest(specContent);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
console.error(chalk.red(` Failed to parse spec: ${err.message}`));
|
|
56
|
+
rl.close();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
console.log('');
|
|
60
|
+
console.log(chalk.green(' Detected API:'));
|
|
61
|
+
console.log(` Name: ${chalk.bold(manifest.name)}`);
|
|
62
|
+
console.log(` Description: ${manifest.description}`);
|
|
63
|
+
console.log(` Base URL: ${manifest.base_url}`);
|
|
64
|
+
console.log(` Auth: ${manifest.auth?.type ?? 'none'}`);
|
|
65
|
+
console.log(` Actions: ${manifest.actions.length}`);
|
|
66
|
+
for (const action of manifest.actions.slice(0, 10)) {
|
|
67
|
+
console.log(` ${chalk.cyan(action.id)} ${chalk.gray(`[${action.method}]`)} — ${action.description}`);
|
|
68
|
+
}
|
|
69
|
+
if (manifest.actions.length > 10) {
|
|
70
|
+
console.log(chalk.gray(` ... and ${manifest.actions.length - 10} more`));
|
|
71
|
+
}
|
|
72
|
+
console.log('');
|
|
73
|
+
// Step 3: Confirm and save
|
|
74
|
+
const confirm = await ask(rl, chalk.white(' Generate .agentbridge.json? (Y/n): '));
|
|
75
|
+
if (confirm.toLowerCase() === 'n') {
|
|
76
|
+
console.log(chalk.gray(' Cancelled.'));
|
|
77
|
+
rl.close();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const manifestPath = '.agentbridge.json';
|
|
81
|
+
writeFileSync(manifestPath, JSON.stringify(manifest, null, 2));
|
|
82
|
+
console.log(chalk.green(` Created ${manifestPath}`));
|
|
83
|
+
// Step 4: MCP config
|
|
84
|
+
const mcpAnswer = await ask(rl, chalk.white(' Generate MCP server config for Claude/Cursor? (Y/n): '));
|
|
85
|
+
if (mcpAnswer.toLowerCase() !== 'n') {
|
|
86
|
+
const mcpConfig = {
|
|
87
|
+
mcpServers: {
|
|
88
|
+
[manifest.name]: {
|
|
89
|
+
command: 'npx',
|
|
90
|
+
args: ['@agentbridgeai/mcp', '--manifest', './.agentbridge.json'],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
const mcpPath = 'mcp-config.json';
|
|
95
|
+
writeFileSync(mcpPath, JSON.stringify(mcpConfig, null, 2));
|
|
96
|
+
console.log(chalk.green(` Created ${mcpPath}`));
|
|
97
|
+
console.log('');
|
|
98
|
+
console.log(chalk.gray(' To use with Claude Desktop, add the config to:'));
|
|
99
|
+
console.log(chalk.gray(' ~/.claude/claude_desktop_config.json'));
|
|
100
|
+
}
|
|
101
|
+
console.log('');
|
|
102
|
+
console.log(chalk.bold.green(' Your API is now agent-ready!'));
|
|
103
|
+
console.log('');
|
|
104
|
+
console.log(chalk.gray(' Next steps:'));
|
|
105
|
+
console.log(chalk.gray(' 1. Host .agentbridge.json alongside your API'));
|
|
106
|
+
console.log(chalk.gray(' 2. Users can: agentbridge add https://your-api.com/.agentbridge.json'));
|
|
107
|
+
console.log(chalk.gray(' 3. Or use MCP: npx @agentbridgeai/mcp --manifest .agentbridge.json'));
|
|
108
|
+
console.log('');
|
|
109
|
+
rl.close();
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { AgentBridgeEngine } from '@agentbridgeai/core';
|
|
5
|
+
import { ClaudeProvider, OpenAIProvider } from '@agentbridgeai/llm';
|
|
6
|
+
import { APIRegistry, convertOpenAPIToManifest, discoverFromDomain } from '@agentbridgeai/openapi';
|
|
7
|
+
import { startRepl } from './repl.js';
|
|
8
|
+
import { runInit } from './commands.js';
|
|
9
|
+
import { readFileSync } from 'fs';
|
|
10
|
+
const REGISTRY_URL = process.env.AGENTBRIDGE_REGISTRY || 'https://agentbridge.cc';
|
|
11
|
+
const program = new Command();
|
|
12
|
+
program
|
|
13
|
+
.name('agentbridge')
|
|
14
|
+
.description('Make any API agent-ready — interact with any service using natural language')
|
|
15
|
+
.version('0.1.0');
|
|
16
|
+
// ---- Main chat command (default) ----
|
|
17
|
+
// Supports: `agentbridge chat` (all installed APIs)
|
|
18
|
+
// `agentbridge chat spotify` (search + auto-install + chat)
|
|
19
|
+
program
|
|
20
|
+
.command('chat [api]', { isDefault: true })
|
|
21
|
+
.description('Start chatting — optionally specify an API name to auto-install from the directory')
|
|
22
|
+
.option('--token <token>', 'API auth token for the target API')
|
|
23
|
+
.action(async (apiName, opts) => {
|
|
24
|
+
const llm = createLLMProvider();
|
|
25
|
+
const registry = new APIRegistry();
|
|
26
|
+
// If user specified an API name, try to find and install it
|
|
27
|
+
if (apiName) {
|
|
28
|
+
const existing = registry.getManifest(apiName);
|
|
29
|
+
if (!existing) {
|
|
30
|
+
// Search the directory and auto-install
|
|
31
|
+
console.log(chalk.gray(` Searching for "${apiName}"...`));
|
|
32
|
+
try {
|
|
33
|
+
const res = await fetch(`${REGISTRY_URL}/api/discover?q=${encodeURIComponent(apiName)}`);
|
|
34
|
+
if (res.ok) {
|
|
35
|
+
const data = await res.json();
|
|
36
|
+
if (data.apis && data.apis.length > 0) {
|
|
37
|
+
const match = data.apis[0];
|
|
38
|
+
const manifestUrl = `${REGISTRY_URL}/api/${match.name}/manifest`;
|
|
39
|
+
const manifest = await registry.addFromURL(manifestUrl);
|
|
40
|
+
console.log(chalk.green(` Installed "${manifest.name}" (${manifest.actions.length} actions)`));
|
|
41
|
+
// Set auth if provided
|
|
42
|
+
if (opts?.token && manifest.auth) {
|
|
43
|
+
registry.setCredentials(manifest.name, { token: opts.token, api_key: opts.token });
|
|
44
|
+
console.log(chalk.green(` Auth configured for "${manifest.name}"`));
|
|
45
|
+
}
|
|
46
|
+
else if (manifest.auth) {
|
|
47
|
+
console.log(chalk.yellow(` This API requires auth (${manifest.auth.type}).`));
|
|
48
|
+
console.log(chalk.gray(` Run: agentbridge auth ${manifest.name} --token YOUR_TOKEN`));
|
|
49
|
+
console.log(chalk.gray(` Or: agentbridge chat ${manifest.name} --token YOUR_TOKEN`));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
console.log(chalk.yellow(` No API found for "${apiName}" — chatting with installed APIs only.`));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
console.log(chalk.gray(` Could not reach directory — chatting with installed APIs only.`));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Load all plugins
|
|
63
|
+
const registryPlugins = registry.toPlugins();
|
|
64
|
+
const allPlugins = [...registryPlugins];
|
|
65
|
+
if (allPlugins.length === 2) {
|
|
66
|
+
// Only built-in plugins
|
|
67
|
+
console.log(chalk.gray('\n No APIs installed. Using built-in weather & todo plugins.'));
|
|
68
|
+
console.log(chalk.gray(' Install an API: agentbridge chat <api-name>'));
|
|
69
|
+
console.log(chalk.gray(' Or browse: agentbridge search <query>\n'));
|
|
70
|
+
}
|
|
71
|
+
const engine = new AgentBridgeEngine({
|
|
72
|
+
llmProvider: llm,
|
|
73
|
+
plugins: allPlugins,
|
|
74
|
+
});
|
|
75
|
+
await startRepl(engine);
|
|
76
|
+
});
|
|
77
|
+
// ---- Add an API from manifest URL ----
|
|
78
|
+
program
|
|
79
|
+
.command('add <url>')
|
|
80
|
+
.description('Add an API from a manifest URL')
|
|
81
|
+
.action(async (url) => {
|
|
82
|
+
const registry = new APIRegistry();
|
|
83
|
+
try {
|
|
84
|
+
const manifest = await registry.addFromURL(url);
|
|
85
|
+
console.log(chalk.green(`Added "${manifest.name}" (${manifest.actions.length} actions)`));
|
|
86
|
+
if (manifest.auth) {
|
|
87
|
+
console.log(chalk.yellow(`This API requires auth (${manifest.auth.type}). Set credentials with:`));
|
|
88
|
+
console.log(chalk.gray(` agentbridge auth ${manifest.name} --token YOUR_TOKEN`));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
console.error(chalk.red(`Failed to add API: ${err.message}`));
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// ---- Import from OpenAPI spec (local file) ----
|
|
96
|
+
program
|
|
97
|
+
.command('import <file>')
|
|
98
|
+
.description('Import an API from a local OpenAPI/Swagger spec file')
|
|
99
|
+
.option('--base-url <url>', 'Override the base URL')
|
|
100
|
+
.option('--max-actions <n>', 'Max number of actions to import', parseInt)
|
|
101
|
+
.option('--tags <tags>', 'Only include operations with these tags (comma-separated)')
|
|
102
|
+
.action(async (file, opts) => {
|
|
103
|
+
const registry = new APIRegistry();
|
|
104
|
+
try {
|
|
105
|
+
const specContent = readFileSync(file, 'utf-8');
|
|
106
|
+
const manifest = convertOpenAPIToManifest(specContent, {
|
|
107
|
+
baseUrl: opts.baseUrl,
|
|
108
|
+
maxActions: opts.maxActions,
|
|
109
|
+
includeTags: opts.tags?.split(','),
|
|
110
|
+
});
|
|
111
|
+
registry.addManifest(manifest);
|
|
112
|
+
console.log(chalk.green(`Imported "${manifest.name}" with ${manifest.actions.length} actions:`));
|
|
113
|
+
for (const action of manifest.actions) {
|
|
114
|
+
console.log(` ${chalk.cyan(action.id)} — ${action.description}`);
|
|
115
|
+
}
|
|
116
|
+
if (manifest.auth) {
|
|
117
|
+
console.log(chalk.yellow(`\nThis API requires auth (${manifest.auth.type}). Set credentials with:`));
|
|
118
|
+
console.log(chalk.gray(` agentbridge auth ${manifest.name} --token YOUR_TOKEN`));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
console.error(chalk.red(`Failed to import: ${err.message}`));
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
// ---- Publish: register your API on agentbridge.cc directly from CLI ----
|
|
126
|
+
program
|
|
127
|
+
.command('publish [file]')
|
|
128
|
+
.description('Publish your API to the AgentBridge directory (agentbridge.cc)')
|
|
129
|
+
.option('--url <url>', 'URL to your OpenAPI spec (instead of local file)')
|
|
130
|
+
.option('--registry <url>', 'Custom registry URL')
|
|
131
|
+
.action(async (file, opts) => {
|
|
132
|
+
const registryUrl = opts?.registry || REGISTRY_URL;
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(chalk.bold.cyan(' Publishing to AgentBridge'));
|
|
135
|
+
console.log('');
|
|
136
|
+
try {
|
|
137
|
+
let body;
|
|
138
|
+
if (opts?.url) {
|
|
139
|
+
console.log(chalk.gray(` Fetching spec from ${opts.url}...`));
|
|
140
|
+
body = { url: opts.url };
|
|
141
|
+
}
|
|
142
|
+
else if (file) {
|
|
143
|
+
console.log(chalk.gray(` Reading ${file}...`));
|
|
144
|
+
const specContent = readFileSync(file, 'utf-8');
|
|
145
|
+
body = { spec: specContent };
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Try common file names
|
|
149
|
+
const candidates = ['openapi.json', 'openapi.yaml', 'openapi.yml', 'swagger.json', 'swagger.yaml', '.agentbridge.json'];
|
|
150
|
+
let found = '';
|
|
151
|
+
for (const c of candidates) {
|
|
152
|
+
try {
|
|
153
|
+
readFileSync(c, 'utf-8');
|
|
154
|
+
found = c;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
catch { }
|
|
158
|
+
}
|
|
159
|
+
if (!found) {
|
|
160
|
+
console.error(chalk.red(' No OpenAPI spec found. Provide a file path or --url:'));
|
|
161
|
+
console.error(chalk.gray(' agentbridge publish openapi.json'));
|
|
162
|
+
console.error(chalk.gray(' agentbridge publish --url https://api.example.com/openapi.json'));
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
console.log(chalk.gray(` Found ${found}`));
|
|
166
|
+
body = { spec: readFileSync(found, 'utf-8') };
|
|
167
|
+
}
|
|
168
|
+
const res = await fetch(`${registryUrl}/api/import`, {
|
|
169
|
+
method: 'POST',
|
|
170
|
+
headers: { 'Content-Type': 'application/json' },
|
|
171
|
+
body: JSON.stringify(body),
|
|
172
|
+
});
|
|
173
|
+
const data = await res.json();
|
|
174
|
+
if (!res.ok) {
|
|
175
|
+
console.error(chalk.red(` Failed: ${data.error}`));
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
console.log('');
|
|
179
|
+
console.log(chalk.green.bold(` Published: ${data.name}`));
|
|
180
|
+
console.log(chalk.gray(` ${data.description}`));
|
|
181
|
+
console.log(chalk.gray(` ${data.action_count} actions registered`));
|
|
182
|
+
console.log('');
|
|
183
|
+
console.log(chalk.white(' Your API is now live at:'));
|
|
184
|
+
console.log(chalk.cyan(` ${registryUrl}/api/${data.name}`));
|
|
185
|
+
console.log('');
|
|
186
|
+
console.log(chalk.white(' Anyone can now use it:'));
|
|
187
|
+
console.log(chalk.gray(` Web: ${registryUrl}/chat`));
|
|
188
|
+
console.log(chalk.gray(` CLI: agentbridge chat ${data.name}`));
|
|
189
|
+
console.log(chalk.gray(` SDK: fetch("${registryUrl}/api/${data.name}/manifest")`));
|
|
190
|
+
console.log('');
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
console.error(chalk.red(` Publish failed: ${err.message}`));
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
// ---- Set auth credentials ----
|
|
197
|
+
program
|
|
198
|
+
.command('auth <name>')
|
|
199
|
+
.description('Set authentication credentials for a registered API')
|
|
200
|
+
.option('--token <token>', 'Bearer token or API key')
|
|
201
|
+
.option('--key <key>', 'API key value')
|
|
202
|
+
.action((name, opts) => {
|
|
203
|
+
const registry = new APIRegistry();
|
|
204
|
+
const creds = {};
|
|
205
|
+
if (opts.token)
|
|
206
|
+
creds.token = opts.token;
|
|
207
|
+
if (opts.key)
|
|
208
|
+
creds.api_key = opts.key;
|
|
209
|
+
if (Object.keys(creds).length === 0) {
|
|
210
|
+
console.error(chalk.red('Provide at least --token or --key'));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
registry.setCredentials(name, creds);
|
|
215
|
+
console.log(chalk.green(`Credentials saved for "${name}"`));
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
console.error(chalk.red(err.message));
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
// ---- List registered APIs ----
|
|
222
|
+
program
|
|
223
|
+
.command('list')
|
|
224
|
+
.description('List all registered APIs')
|
|
225
|
+
.action(() => {
|
|
226
|
+
const registry = new APIRegistry();
|
|
227
|
+
const apis = registry.list();
|
|
228
|
+
if (apis.length === 0) {
|
|
229
|
+
console.log(chalk.gray('No APIs registered. Try:'));
|
|
230
|
+
console.log(chalk.gray(' agentbridge chat <api-name> Search & install & chat'));
|
|
231
|
+
console.log(chalk.gray(' agentbridge search <query> Browse the directory'));
|
|
232
|
+
console.log(chalk.gray(' agentbridge import openapi.json Import a local spec'));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
console.log(chalk.bold('\nRegistered APIs:'));
|
|
236
|
+
for (const api of apis) {
|
|
237
|
+
console.log(` ${chalk.cyan(api.name)} v${api.version} — ${api.description} (${api.actionCount} actions)`);
|
|
238
|
+
}
|
|
239
|
+
console.log('');
|
|
240
|
+
});
|
|
241
|
+
// ---- Remove an API ----
|
|
242
|
+
program
|
|
243
|
+
.command('remove <name>')
|
|
244
|
+
.description('Remove a registered API')
|
|
245
|
+
.action((name) => {
|
|
246
|
+
const registry = new APIRegistry();
|
|
247
|
+
registry.remove(name);
|
|
248
|
+
console.log(chalk.green(`Removed "${name}"`));
|
|
249
|
+
});
|
|
250
|
+
// ---- Discover: auto-detect agent-ready APIs on any domain ----
|
|
251
|
+
program
|
|
252
|
+
.command('discover <domain>')
|
|
253
|
+
.description('Check if a domain has an agent-ready API (via /.well-known/agentbridge.json)')
|
|
254
|
+
.action(async (domain) => {
|
|
255
|
+
console.log(chalk.gray(` Checking ${domain}...`));
|
|
256
|
+
const manifest = await discoverFromDomain(domain);
|
|
257
|
+
if (!manifest) {
|
|
258
|
+
console.log(chalk.yellow(` No agent-ready API found at ${domain}`));
|
|
259
|
+
console.log(chalk.gray(' The domain needs to host /.well-known/agentbridge.json'));
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
console.log(chalk.green(` Found: ${manifest.name} (${manifest.actions.length} actions)`));
|
|
263
|
+
console.log(` ${manifest.description}`);
|
|
264
|
+
for (const a of manifest.actions.slice(0, 5)) {
|
|
265
|
+
console.log(` ${chalk.cyan(a.id)} — ${a.description}`);
|
|
266
|
+
}
|
|
267
|
+
if (manifest.actions.length > 5) {
|
|
268
|
+
console.log(chalk.gray(` ... and ${manifest.actions.length - 5} more`));
|
|
269
|
+
}
|
|
270
|
+
const registry = new APIRegistry();
|
|
271
|
+
registry.addManifest(manifest, `https://${domain.replace(/^https?:\/\//, '')}/.well-known/agentbridge.json`);
|
|
272
|
+
console.log(chalk.green(`\n Auto-registered "${manifest.name}" to your local registry.`));
|
|
273
|
+
});
|
|
274
|
+
// ---- Search: find APIs on the AgentBridge directory ----
|
|
275
|
+
program
|
|
276
|
+
.command('search <query>')
|
|
277
|
+
.description('Search for APIs on the AgentBridge directory')
|
|
278
|
+
.option('--install', 'Auto-install the first result')
|
|
279
|
+
.option('--registry <url>', 'Custom registry URL')
|
|
280
|
+
.action(async (query, opts) => {
|
|
281
|
+
const registryUrl = opts?.registry || REGISTRY_URL;
|
|
282
|
+
console.log(chalk.gray(` Searching for "${query}"...`));
|
|
283
|
+
try {
|
|
284
|
+
const res = await fetch(`${registryUrl}/api/discover?q=${encodeURIComponent(query)}`);
|
|
285
|
+
if (!res.ok)
|
|
286
|
+
throw new Error(`HTTP ${res.status}`);
|
|
287
|
+
const data = await res.json();
|
|
288
|
+
if (!data.apis || data.apis.length === 0) {
|
|
289
|
+
console.log(chalk.yellow(` No APIs found for "${query}"`));
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
console.log(chalk.bold(`\n Found ${data.apis.length} API(s):\n`));
|
|
293
|
+
for (const api of data.apis) {
|
|
294
|
+
const authBadge = api.auth_type && api.auth_type !== 'none'
|
|
295
|
+
? chalk.yellow(` [${api.auth_type}]`)
|
|
296
|
+
: '';
|
|
297
|
+
console.log(` ${chalk.cyan(api.name)}${authBadge} — ${api.description}`);
|
|
298
|
+
console.log(chalk.gray(` ${api.actions.length} actions`));
|
|
299
|
+
console.log(chalk.gray(` Chat: agentbridge chat ${api.name}`));
|
|
300
|
+
console.log('');
|
|
301
|
+
}
|
|
302
|
+
if (opts?.install) {
|
|
303
|
+
const first = data.apis[0];
|
|
304
|
+
const manifestUrl = `${registryUrl}/api/${first.name}/manifest`;
|
|
305
|
+
console.log(chalk.gray(` Installing ${first.name}...`));
|
|
306
|
+
const registry = new APIRegistry();
|
|
307
|
+
const manifest = await registry.addFromURL(manifestUrl);
|
|
308
|
+
console.log(chalk.green(` Installed "${manifest.name}" (${manifest.actions.length} actions)`));
|
|
309
|
+
if (manifest.auth) {
|
|
310
|
+
console.log(chalk.yellow(` Requires auth. Run: agentbridge chat ${manifest.name} --token YOUR_TOKEN`));
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
console.error(chalk.red(` Search failed: ${err.message}`));
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
// ---- Init: make your API agent-ready (local) ----
|
|
319
|
+
program
|
|
320
|
+
.command('init')
|
|
321
|
+
.description('Generate .agentbridge.json from your OpenAPI spec (local only, use "publish" for directory)')
|
|
322
|
+
.action(async () => {
|
|
323
|
+
await runInit();
|
|
324
|
+
});
|
|
325
|
+
// ---- Helper ----
|
|
326
|
+
function createLLMProvider() {
|
|
327
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
328
|
+
return new ClaudeProvider({
|
|
329
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
330
|
+
model: process.env.AGENTBRIDGE_MODEL || undefined,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
if (process.env.OPENAI_API_KEY) {
|
|
334
|
+
return new OpenAIProvider({
|
|
335
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
336
|
+
model: process.env.AGENTBRIDGE_MODEL || undefined,
|
|
337
|
+
baseURL: process.env.OPENAI_BASE_URL || undefined,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
console.error(chalk.red('No LLM API key found. Set one of:'));
|
|
341
|
+
console.error(' ANTHROPIC_API_KEY=sk-ant-...');
|
|
342
|
+
console.error(' OPENAI_API_KEY=sk-...');
|
|
343
|
+
console.error(' OPENAI_API_KEY=gsk_... OPENAI_BASE_URL=https://api.groq.com/openai/v1');
|
|
344
|
+
process.exit(1);
|
|
345
|
+
}
|
|
346
|
+
program.parse();
|
|
347
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/repl.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.d.ts","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAA0B,MAAM,qBAAqB,CAAC;AAErF,wBAAsB,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuExE"}
|
package/dist/repl.js
ADDED
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as readline from 'readline';
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
export async function startRepl(engine) {
|
|
5
|
+
const sessionId = engine.createSession();
|
|
6
|
+
const plugins = engine.getPlugins();
|
|
7
|
+
console.log('');
|
|
8
|
+
console.log(chalk.bold.cyan(' AgentBridge') + chalk.gray(' v0.1.0'));
|
|
9
|
+
console.log(chalk.gray(` Loaded plugins: ${plugins.map(p => p.name).join(', ') || 'none'}`));
|
|
10
|
+
console.log(chalk.gray(' Type naturally, or use /help, /plugins, /quit'));
|
|
11
|
+
console.log('');
|
|
12
|
+
const rl = readline.createInterface({
|
|
13
|
+
input: process.stdin,
|
|
14
|
+
output: process.stdout,
|
|
15
|
+
prompt: chalk.green('> '),
|
|
16
|
+
});
|
|
17
|
+
rl.prompt();
|
|
18
|
+
rl.on('line', async (line) => {
|
|
19
|
+
const input = line.trim();
|
|
20
|
+
if (!input) {
|
|
21
|
+
rl.prompt();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
// Handle slash commands
|
|
25
|
+
if (input.startsWith('/')) {
|
|
26
|
+
handleCommand(input, engine);
|
|
27
|
+
rl.prompt();
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const spinner = ora({ text: 'Thinking...', color: 'cyan' }).start();
|
|
31
|
+
try {
|
|
32
|
+
const response = await engine.chat(sessionId, input, {
|
|
33
|
+
onToolCall: (tc) => {
|
|
34
|
+
spinner.text = `Running ${tc.pluginName}.${tc.actionName}...`;
|
|
35
|
+
},
|
|
36
|
+
onToolResult: (name, result) => {
|
|
37
|
+
if (!result.success) {
|
|
38
|
+
spinner.warn(chalk.yellow(`${name} failed: ${result.message}`));
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
askUser: async (question) => {
|
|
42
|
+
spinner.stop();
|
|
43
|
+
return new Promise((resolve) => {
|
|
44
|
+
rl.question(chalk.yellow(` ${question} `), (answer) => {
|
|
45
|
+
resolve(answer);
|
|
46
|
+
spinner.start();
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
spinner.stop();
|
|
52
|
+
console.log('');
|
|
53
|
+
console.log(chalk.white(` ${response}`));
|
|
54
|
+
console.log('');
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
spinner.fail(chalk.red(`Error: ${error.message}`));
|
|
58
|
+
console.log('');
|
|
59
|
+
}
|
|
60
|
+
rl.prompt();
|
|
61
|
+
});
|
|
62
|
+
rl.on('close', () => {
|
|
63
|
+
console.log(chalk.gray('\nGoodbye!'));
|
|
64
|
+
process.exit(0);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function handleCommand(input, engine) {
|
|
68
|
+
const cmd = input.toLowerCase();
|
|
69
|
+
if (cmd === '/quit' || cmd === '/exit' || cmd === '/q') {
|
|
70
|
+
console.log(chalk.gray('\nGoodbye!'));
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
if (cmd === '/plugins') {
|
|
74
|
+
const plugins = engine.getPlugins();
|
|
75
|
+
if (plugins.length === 0) {
|
|
76
|
+
console.log(chalk.gray(' No plugins installed.'));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log('');
|
|
80
|
+
console.log(chalk.bold(' Installed Plugins:'));
|
|
81
|
+
for (const p of plugins) {
|
|
82
|
+
console.log(` ${chalk.cyan(p.name)} ${chalk.gray(`v${p.version}`)} — ${p.description}`);
|
|
83
|
+
for (const a of p.actions) {
|
|
84
|
+
console.log(` ${chalk.green(a.name)} — ${a.description}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
console.log('');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
if (cmd === '/help') {
|
|
91
|
+
console.log('');
|
|
92
|
+
console.log(chalk.bold(' AgentBridge Commands:'));
|
|
93
|
+
console.log(` ${chalk.green('/plugins')} — List installed plugins and their actions`);
|
|
94
|
+
console.log(` ${chalk.green('/help')} — Show this help message`);
|
|
95
|
+
console.log(` ${chalk.green('/quit')} — Exit AgentBridge`);
|
|
96
|
+
console.log('');
|
|
97
|
+
console.log(chalk.gray(' Or just type naturally! e.g. "what\'s the weather in Tokyo?"'));
|
|
98
|
+
console.log('');
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
console.log(chalk.yellow(` Unknown command: ${input}. Type /help for available commands.`));
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=repl.js.map
|
package/dist/repl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repl.js","sourceRoot":"","sources":["../src/repl.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agentbridgeai/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI to chat with any API using natural language — powered by AgentBridge",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"bin": {
|
|
9
|
+
"agentbridge": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"repository": {
|
|
13
|
+
"type": "git",
|
|
14
|
+
"url": "git+https://github.com/ranausmanai/AgentBridge.git",
|
|
15
|
+
"directory": "packages/cli"
|
|
16
|
+
},
|
|
17
|
+
"homepage": "https://agentbridge.cc",
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"cli",
|
|
26
|
+
"ai-agents",
|
|
27
|
+
"api",
|
|
28
|
+
"natural-language",
|
|
29
|
+
"agentbridge",
|
|
30
|
+
"chatbot"
|
|
31
|
+
],
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"chalk": "^5.3.0",
|
|
34
|
+
"ora": "^8.1.0",
|
|
35
|
+
"commander": "^12.1.0",
|
|
36
|
+
"conf": "^13.0.0",
|
|
37
|
+
"@agentbridgeai/core": "^0.1.0",
|
|
38
|
+
"@agentbridgeai/openapi": "^0.1.0",
|
|
39
|
+
"@agentbridgeai/llm": "^0.1.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^22.0.0",
|
|
43
|
+
"typescript": "^5.5.0"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc",
|
|
47
|
+
"dev": "tsc --watch",
|
|
48
|
+
"start": "node ./dist/index.js",
|
|
49
|
+
"clean": "rm -rf dist"
|
|
50
|
+
}
|
|
51
|
+
}
|