ft-scout 1.0.9 → 1.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/.firebase/hosting.d2Vi.cache +9 -0
- package/.firebaserc +14 -0
- package/AUTONOMOUS_FEATURES.md +192 -0
- package/README.md +482 -29
- package/bin/ft.js +2 -0
- package/bin/src/commands/agent.d.ts.map +1 -0
- package/bin/src/commands/agent.js +1230 -0
- package/bin/src/commands/agent.js.map +1 -0
- package/bin/src/commands/audit.d.ts.map +1 -0
- package/bin/src/commands/audit.js +104 -0
- package/bin/src/commands/audit.js.map +1 -0
- package/bin/src/commands/authCommand.d.ts.map +1 -0
- package/bin/src/commands/authCommand.js +38 -0
- package/bin/src/commands/authCommand.js.map +1 -0
- package/bin/src/commands/benchmark.d.ts.map +1 -0
- package/bin/src/commands/benchmark.js +135 -0
- package/bin/src/commands/benchmark.js.map +1 -0
- package/bin/src/commands/brief.d.ts.map +1 -0
- package/bin/src/commands/brief.js +37 -0
- package/bin/src/commands/brief.js.map +1 -0
- package/bin/src/commands/configCommand.d.ts.map +1 -0
- package/bin/src/commands/configCommand.js +53 -0
- package/bin/src/commands/configCommand.js.map +1 -0
- package/bin/src/commands/dashboard.d.ts.map +1 -0
- package/bin/src/commands/dashboard.js +41 -0
- package/bin/src/commands/dashboard.js.map +1 -0
- package/bin/src/commands/history.d.ts.map +1 -0
- package/bin/src/commands/history.js +20 -0
- package/bin/src/commands/history.js.map +1 -0
- package/bin/src/commands/init.d.ts.map +1 -1
- package/bin/src/commands/init.js +408 -79
- package/bin/src/commands/init.js.map +1 -1
- package/bin/src/commands/login.d.ts.map +1 -0
- package/bin/src/commands/login.js +190 -0
- package/bin/src/commands/login.js.map +1 -0
- package/bin/src/commands/logout.d.ts.map +1 -0
- package/bin/src/commands/logout.js +15 -0
- package/bin/src/commands/logout.js.map +1 -0
- package/bin/src/commands/mcp.d.ts.map +1 -0
- package/bin/src/commands/mcp.js +393 -0
- package/bin/src/commands/mcp.js.map +1 -0
- package/bin/src/commands/owners.js +6 -6
- package/bin/src/commands/owners.js.map +1 -1
- package/bin/src/commands/plan.d.ts.map +1 -0
- package/bin/src/commands/plan.js +152 -0
- package/bin/src/commands/plan.js.map +1 -0
- package/bin/src/commands/quota.d.ts.map +1 -0
- package/bin/src/commands/quota.js +32 -0
- package/bin/src/commands/quota.js.map +1 -0
- package/bin/src/commands/recommend.d.ts.map +1 -0
- package/bin/src/commands/recommend.js +46 -0
- package/bin/src/commands/recommend.js.map +1 -0
- package/bin/src/commands/risky.d.ts.map +1 -1
- package/bin/src/commands/risky.js +235 -39
- package/bin/src/commands/risky.js.map +1 -1
- package/bin/src/commands/setup.d.ts.map +1 -1
- package/bin/src/commands/setup.js +411 -16
- package/bin/src/commands/setup.js.map +1 -1
- package/bin/src/commands/signup.d.ts.map +1 -0
- package/bin/src/commands/signup.js +118 -0
- package/bin/src/commands/signup.js.map +1 -0
- package/bin/src/commands/undo.d.ts.map +1 -0
- package/bin/src/commands/undo.js +59 -0
- package/bin/src/commands/undo.js.map +1 -0
- package/bin/src/commands/web.d.ts.map +1 -0
- package/bin/src/commands/web.js +90 -0
- package/bin/src/commands/web.js.map +1 -0
- package/bin/src/discovery/config.d.ts.map +1 -0
- package/bin/src/discovery/config.js +41 -0
- package/bin/src/discovery/config.js.map +1 -0
- package/bin/src/discovery/display.d.ts.map +1 -0
- package/bin/src/discovery/display.js +57 -0
- package/bin/src/discovery/display.js.map +1 -0
- package/bin/src/discovery/messages.d.ts.map +1 -0
- package/bin/src/discovery/messages.js +7 -0
- package/bin/src/discovery/messages.js.map +1 -0
- package/bin/src/discovery/signals.d.ts.map +1 -0
- package/bin/src/discovery/signals.js +33 -0
- package/bin/src/discovery/signals.js.map +1 -0
- package/bin/src/engine/actionVerifier.d.ts.map +1 -0
- package/bin/src/engine/actionVerifier.js +283 -0
- package/bin/src/engine/actionVerifier.js.map +1 -0
- package/bin/src/engine/agentEngine.d.ts.map +1 -0
- package/bin/src/engine/agentEngine.js +2188 -0
- package/bin/src/engine/agentEngine.js.map +1 -0
- package/bin/src/engine/agentState.d.ts.map +1 -0
- package/bin/src/engine/agentState.js +381 -0
- package/bin/src/engine/agentState.js.map +1 -0
- package/bin/src/engine/browser/browserController.d.ts.map +1 -0
- package/bin/src/engine/browser/browserController.js +737 -0
- package/bin/src/engine/browser/browserController.js.map +1 -0
- package/bin/src/engine/browser/index.d.ts.map +1 -0
- package/bin/src/engine/browser/index.js +2 -0
- package/bin/src/engine/browser/index.js.map +1 -0
- package/bin/src/engine/computer/computerController.d.ts.map +1 -0
- package/bin/src/engine/computer/computerController.js +773 -0
- package/bin/src/engine/computer/computerController.js.map +1 -0
- package/bin/src/engine/computer/computerDiagnostic.d.ts.map +1 -0
- package/bin/src/engine/computer/computerDiagnostic.js +71 -0
- package/bin/src/engine/computer/computerDiagnostic.js.map +1 -0
- package/bin/src/engine/computer/index.d.ts.map +1 -0
- package/bin/src/engine/computer/index.js +4 -0
- package/bin/src/engine/computer/index.js.map +1 -0
- package/bin/src/engine/computer/mockComputer.d.ts.map +1 -0
- package/bin/src/engine/computer/mockComputer.js +260 -0
- package/bin/src/engine/computer/mockComputer.js.map +1 -0
- package/bin/src/engine/computer/scoutDriver.cs +1161 -0
- package/bin/src/engine/computer/scout_driver.exe +0 -0
- package/bin/src/engine/git.d.ts.map +1 -1
- package/bin/src/engine/git.js +71 -0
- package/bin/src/engine/git.js.map +1 -1
- package/bin/src/engine/llm.d.ts.map +1 -1
- package/bin/src/engine/llm.js +1264 -35
- package/bin/src/engine/llm.js.map +1 -1
- package/bin/src/engine/planner.d.ts.map +1 -0
- package/bin/src/engine/planner.js +321 -0
- package/bin/src/engine/planner.js.map +1 -0
- package/bin/src/engine/runtime/agentRuntime.d.ts.map +1 -0
- package/bin/src/engine/runtime/agentRuntime.js +1258 -0
- package/bin/src/engine/runtime/agentRuntime.js.map +1 -0
- package/bin/src/engine/runtime/index.d.ts.map +1 -0
- package/bin/src/engine/runtime/index.js +2 -0
- package/bin/src/engine/runtime/index.js.map +1 -0
- package/bin/src/engine/safety.d.ts.map +1 -0
- package/bin/src/engine/safety.js +316 -0
- package/bin/src/engine/safety.js.map +1 -0
- package/bin/src/engine/scoutAudioRecorder.cs +215 -0
- package/bin/src/engine/scout_audio_recorder.exe +0 -0
- package/bin/src/engine/toolRegistry.d.ts.map +1 -0
- package/bin/src/engine/toolRegistry.js +521 -0
- package/bin/src/engine/toolRegistry.js.map +1 -0
- package/bin/src/engine/verifier.d.ts.map +1 -0
- package/bin/src/engine/verifier.js +414 -0
- package/bin/src/engine/verifier.js.map +1 -0
- package/bin/src/engine/voiceEngine.d.ts.map +1 -0
- package/bin/src/engine/voiceEngine.js +474 -0
- package/bin/src/engine/voiceEngine.js.map +1 -0
- package/bin/src/engine/web.d.ts.map +1 -0
- package/bin/src/engine/web.js +161 -0
- package/bin/src/engine/web.js.map +1 -0
- package/bin/src/engine/workspace/agentWorkspace.d.ts.map +1 -0
- package/bin/src/engine/workspace/agentWorkspace.js +505 -0
- package/bin/src/engine/workspace/agentWorkspace.js.map +1 -0
- package/bin/src/engine/workspace/index.d.ts.map +1 -0
- package/bin/src/engine/workspace/index.js +2 -0
- package/bin/src/engine/workspace/index.js.map +1 -0
- package/bin/src/index.js +369 -19
- package/bin/src/index.js.map +1 -1
- package/bin/src/mcp/client.d.ts.map +1 -0
- package/bin/src/mcp/client.js +127 -0
- package/bin/src/mcp/client.js.map +1 -0
- package/bin/src/mcp/discovery.d.ts.map +1 -0
- package/bin/src/mcp/discovery.js +91 -0
- package/bin/src/mcp/discovery.js.map +1 -0
- package/bin/src/mcp/health.d.ts.map +1 -0
- package/bin/src/mcp/health.js +44 -0
- package/bin/src/mcp/health.js.map +1 -0
- package/bin/src/mcp/index.d.ts.map +1 -0
- package/bin/src/mcp/index.js +15 -0
- package/bin/src/mcp/index.js.map +1 -0
- package/bin/src/mcp/manager.d.ts.map +1 -0
- package/bin/src/mcp/manager.js +648 -0
- package/bin/src/mcp/manager.js.map +1 -0
- package/bin/src/mcp/permissions.d.ts.map +1 -0
- package/bin/src/mcp/permissions.js +50 -0
- package/bin/src/mcp/permissions.js.map +1 -0
- package/bin/src/mcp/persistence.d.ts.map +1 -0
- package/bin/src/mcp/persistence.js +171 -0
- package/bin/src/mcp/persistence.js.map +1 -0
- package/bin/src/mcp/recovery.d.ts.map +1 -0
- package/bin/src/mcp/recovery.js +75 -0
- package/bin/src/mcp/recovery.js.map +1 -0
- package/bin/src/mcp/telemetry.d.ts.map +1 -0
- package/bin/src/mcp/telemetry.js +82 -0
- package/bin/src/mcp/telemetry.js.map +1 -0
- package/bin/src/mcp/toolRouter.d.ts.map +1 -0
- package/bin/src/mcp/toolRouter.js +127 -0
- package/bin/src/mcp/toolRouter.js.map +1 -0
- package/bin/src/mcp/transport.d.ts.map +1 -0
- package/bin/src/mcp/transport.js +328 -0
- package/bin/src/mcp/transport.js.map +1 -0
- package/bin/src/mcp/types.d.ts.map +1 -0
- package/bin/src/mcp/types.js +6 -0
- package/bin/src/mcp/types.js.map +1 -0
- package/bin/src/server/server.d.ts.map +1 -0
- package/bin/src/server/server.js +989 -0
- package/bin/src/server/server.js.map +1 -0
- package/bin/src/utils/admin.d.ts.map +1 -0
- package/bin/src/utils/admin.js +231 -0
- package/bin/src/utils/admin.js.map +1 -0
- package/bin/src/utils/auditLogger.d.ts.map +1 -0
- package/bin/src/utils/auditLogger.js +70 -0
- package/bin/src/utils/auditLogger.js.map +1 -0
- package/bin/src/utils/auth.d.ts.map +1 -0
- package/bin/src/utils/auth.js +679 -0
- package/bin/src/utils/auth.js.map +1 -0
- package/bin/src/utils/branding.d.ts.map +1 -0
- package/bin/src/utils/branding.js +14 -0
- package/bin/src/utils/branding.js.map +1 -0
- package/bin/src/utils/config.d.ts.map +1 -1
- package/bin/src/utils/config.js +124 -3
- package/bin/src/utils/config.js.map +1 -1
- package/bin/src/utils/email.d.ts.map +1 -0
- package/bin/src/utils/email.js +267 -0
- package/bin/src/utils/email.js.map +1 -0
- package/bin/src/utils/firebaseAuth.d.ts.map +1 -0
- package/bin/src/utils/firebaseAuth.js +174 -0
- package/bin/src/utils/firebaseAuth.js.map +1 -0
- package/bin/src/utils/holoseneAuth.d.ts.map +1 -0
- package/bin/src/utils/holoseneAuth.js +307 -0
- package/bin/src/utils/holoseneAuth.js.map +1 -0
- package/bin/src/utils/language.d.ts.map +1 -0
- package/bin/src/utils/language.js +181 -0
- package/bin/src/utils/language.js.map +1 -0
- package/bin/src/utils/markdown.d.ts.map +1 -0
- package/bin/src/utils/markdown.js +215 -0
- package/bin/src/utils/markdown.js.map +1 -0
- package/bin/src/utils/payment.d.ts.map +1 -0
- package/bin/src/utils/payment.js +290 -0
- package/bin/src/utils/payment.js.map +1 -0
- package/bin/src/utils/pricing.d.ts.map +1 -0
- package/bin/src/utils/pricing.js +165 -0
- package/bin/src/utils/pricing.js.map +1 -0
- package/bin/src/utils/razorpay.d.ts.map +1 -0
- package/bin/src/utils/razorpay.js +144 -0
- package/bin/src/utils/razorpay.js.map +1 -0
- package/bin/src/utils/session.d.ts.map +1 -0
- package/bin/src/utils/session.js +82 -0
- package/bin/src/utils/session.js.map +1 -0
- package/bin/src/utils/updateCheck.d.ts.map +1 -0
- package/bin/src/utils/updateCheck.js +108 -0
- package/bin/src/utils/updateCheck.js.map +1 -0
- package/downloads/invoice-2026-03.pdf +1 -0
- package/firebase.json +74 -0
- package/package.json +49 -46
- package/web/ScoutFavicon.png +0 -0
- package/web/app.js +3944 -0
- package/web/styles.css +3081 -0
- package/.ft/context.json +0 -17
- package/email-template.txt +0 -44
package/bin/src/index.js
CHANGED
|
@@ -1,41 +1,391 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
1
3
|
import { Command } from 'commander';
|
|
2
|
-
import { intro, outro } from '@clack/prompts';
|
|
4
|
+
import { intro, outro, select, isCancel, cancel } from '@clack/prompts';
|
|
3
5
|
import chalk from 'chalk';
|
|
4
6
|
import { handleInit } from './commands/init.js';
|
|
5
7
|
import { handleOwners } from './commands/owners.js';
|
|
6
8
|
import { handleRisky } from './commands/risky.js';
|
|
7
9
|
import { handleSetup } from './commands/setup.js';
|
|
10
|
+
import { handleWebSearch } from './commands/web.js';
|
|
11
|
+
import { handleBrief } from './commands/brief.js';
|
|
12
|
+
import { handleRecommend } from './commands/recommend.js';
|
|
13
|
+
import { handleAudit } from './commands/audit.js';
|
|
14
|
+
import { handleBenchmark } from './commands/benchmark.js';
|
|
15
|
+
import { handleHistory } from './commands/history.js';
|
|
16
|
+
import { handleUndo } from './commands/undo.js';
|
|
17
|
+
import { handleConfig } from './commands/configCommand.js';
|
|
18
|
+
import { handleAgent } from './commands/agent.js';
|
|
19
|
+
import { handleSignup } from './commands/signup.js';
|
|
20
|
+
import { handleLogin } from './commands/login.js';
|
|
21
|
+
import { handleLogout } from './commands/logout.js';
|
|
22
|
+
import { handleAuthStatus } from './commands/authCommand.js';
|
|
23
|
+
import { handleDashboard } from './commands/dashboard.js';
|
|
24
|
+
import { handleQuota } from './commands/quota.js';
|
|
25
|
+
import { handlePlanCommand } from './commands/plan.js';
|
|
26
|
+
import { handleMcpList, handleMcpAdd, handleMcpRemove, handleMcpConnect, handleMcpDisconnect, handleMcpInspect, handleMcpTools, handleMcpHealth } from './commands/mcp.js';
|
|
27
|
+
import { renderBranding } from './utils/branding.js';
|
|
28
|
+
import { checkForUpdates } from './utils/updateCheck.js';
|
|
29
|
+
import { maybeShowDiscoveryMessage } from './discovery/display.js';
|
|
30
|
+
import { loadContext } from './utils/config.js';
|
|
31
|
+
import { isLoggedIn } from './utils/auth.js';
|
|
8
32
|
const program = new Command();
|
|
9
33
|
program
|
|
10
|
-
.
|
|
11
|
-
.
|
|
12
|
-
.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
//
|
|
22
|
-
|
|
23
|
-
|
|
34
|
+
.name('scout')
|
|
35
|
+
.alias('ft')
|
|
36
|
+
.description('FrontTerrain The Onboarding Co-Pilot for New Codebases')
|
|
37
|
+
.version('1.1.0');
|
|
38
|
+
// Header UI on execution with FrontTerrain proprietary logo & version auto-checker
|
|
39
|
+
program.hook('preAction', async (_thisCommand, actionCommand) => {
|
|
40
|
+
intro(renderBranding('1.1.0'));
|
|
41
|
+
const cmdName = actionCommand ? actionCommand.name() : '';
|
|
42
|
+
if (cmdName !== 'upgrade') {
|
|
43
|
+
await checkForUpdates('1.1.0');
|
|
44
|
+
}
|
|
45
|
+
// Auth Guard: enforce authentication for all commands except login, signup, upgrade, help, dashboard, auth, status, plan, mcp
|
|
46
|
+
const EXEMPT_COMMANDS = ['login', 'signin', 'signup', 'register', 'upgrade', 'help', 'dashboard', 'web-ui', 'gui', 'auth', 'status', 'quota', 'usage', 'credits', 'plan', 'pricing', 'subscribe', 'mcp'];
|
|
47
|
+
if (!EXEMPT_COMMANDS.includes(cmdName)) {
|
|
48
|
+
if (!isLoggedIn()) {
|
|
49
|
+
const choice = await select({
|
|
50
|
+
message: 'Authentication Required: You must be logged in to use FrontTerrain Scout.',
|
|
51
|
+
options: [
|
|
52
|
+
{ label: 'Log in to existing account', value: 'login' },
|
|
53
|
+
{ label: 'Sign up for a new account', value: 'signup' },
|
|
54
|
+
{ label: 'Exit', value: 'exit' },
|
|
55
|
+
],
|
|
56
|
+
});
|
|
57
|
+
if (isCancel(choice) || choice === 'exit') {
|
|
58
|
+
cancel('Operation cancelled. Login or sign up required.');
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
if (choice === 'login') {
|
|
62
|
+
await handleLogin();
|
|
63
|
+
}
|
|
64
|
+
else if (choice === 'signup') {
|
|
65
|
+
await handleSignup();
|
|
66
|
+
}
|
|
67
|
+
if (!isLoggedIn()) {
|
|
68
|
+
cancel('Authentication failed. You must log in to run scout commands.');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// PostAction hook for Discovery Layer (runs on successful command completion)
|
|
75
|
+
program.hook('postAction', async (_thisCommand, actionCommand) => {
|
|
76
|
+
if (actionCommand) {
|
|
77
|
+
let repoContext;
|
|
78
|
+
try {
|
|
79
|
+
const context = loadContext();
|
|
80
|
+
const ftDir = path.join(process.cwd(), '.ft');
|
|
81
|
+
const scanFile = path.join(ftDir, 'scan-report.json');
|
|
82
|
+
let riskyFiles = [];
|
|
83
|
+
if (fs.existsSync(scanFile)) {
|
|
84
|
+
try {
|
|
85
|
+
const scanData = JSON.parse(fs.readFileSync(scanFile, 'utf-8'));
|
|
86
|
+
if (Array.isArray(scanData)) {
|
|
87
|
+
riskyFiles = scanData.map((s) => s.file);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch { }
|
|
91
|
+
}
|
|
92
|
+
repoContext = {
|
|
93
|
+
riskyFiles,
|
|
94
|
+
testCoverageEstimate: context ? 0.7 : 0.5,
|
|
95
|
+
highRiskFileCount: riskyFiles.length,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
catch { }
|
|
99
|
+
maybeShowDiscoveryMessage(repoContext);
|
|
100
|
+
}
|
|
24
101
|
});
|
|
25
102
|
// Command definitions
|
|
26
103
|
program
|
|
27
104
|
.command('init [repoUrl]')
|
|
28
|
-
.description('
|
|
29
|
-
.
|
|
30
|
-
|
|
105
|
+
.description('Clone + build local understanding map of the repository')
|
|
106
|
+
.option('-a, --ask', 'Interactive Q&A mode after repository initialization')
|
|
107
|
+
.option('-w, --web', 'Allow scout to access internet for web search & live web context')
|
|
108
|
+
.option('-l, --lang <language>', 'Language for AI teardowns, summaries, and Q&A responses')
|
|
109
|
+
.option('--native', 'Force native script instead of Romanized terminal script')
|
|
110
|
+
.action(async (repoUrl, options) => {
|
|
111
|
+
await handleInit(repoUrl, options);
|
|
31
112
|
outro(chalk.green('Initialization complete!'));
|
|
32
113
|
});
|
|
114
|
+
program
|
|
115
|
+
.command('brief')
|
|
116
|
+
.description('Human-readable onboarding summary (the "week-one explainer")')
|
|
117
|
+
.action(async () => {
|
|
118
|
+
await handleBrief();
|
|
119
|
+
outro(chalk.cyan('Brief overview complete.'));
|
|
120
|
+
});
|
|
33
121
|
program
|
|
34
122
|
.command('owners <path>')
|
|
35
|
-
.description('
|
|
123
|
+
.description('Who actually knows this file (from git history, not guesses)')
|
|
36
124
|
.action(async (path) => {
|
|
37
125
|
await handleOwners(path);
|
|
38
126
|
outro(chalk.cyan('File ownership analysis complete.'));
|
|
39
127
|
});
|
|
128
|
+
program
|
|
129
|
+
.command('setup')
|
|
130
|
+
.description('Diagnoses and fixes local environment/run failures')
|
|
131
|
+
.action(async () => {
|
|
132
|
+
await handleSetup();
|
|
133
|
+
outro(chalk.cyan('Environment setup check complete.'));
|
|
134
|
+
});
|
|
135
|
+
program
|
|
136
|
+
.command('risky [targetRepo]')
|
|
137
|
+
.description('Fragility map: high-churn files, untested code, hotfix magnets, logical coupling, & knowledge silos')
|
|
138
|
+
.option('-e, --explain', 'AI root-cause diagnosis & refactoring strategy for high-risk files')
|
|
139
|
+
.option('-f, --fix', 'Trigger AI agent to auto-fix and add tests for top fragile hotspot')
|
|
140
|
+
.option('-l, --lang <language>', 'Language for AI risk analysis')
|
|
141
|
+
.option('--native', 'Force native script')
|
|
142
|
+
.action(async (targetRepo, options) => {
|
|
143
|
+
await handleRisky(targetRepo, options);
|
|
144
|
+
outro(chalk.cyan('Fragility scan complete.'));
|
|
145
|
+
});
|
|
146
|
+
program
|
|
147
|
+
.command('agent [goal...]')
|
|
148
|
+
.alias('task')
|
|
149
|
+
.alias('goal')
|
|
150
|
+
.description('Autonomous AI agent: analyzes goals, creates/fixes code, executes commands, scans issues, & plans features')
|
|
151
|
+
.option('-c, --create <filePath>', 'Generate and create a new source code file at target relative path')
|
|
152
|
+
.option('-f, --file <file>', 'Specific file path to modify or fix')
|
|
153
|
+
.option('-i, --issue <id>', 'Specific issue ID from scan report to apply fix for')
|
|
154
|
+
.option('-r, --run <command...>', 'Execute shell command with automated AI failure diagnosis and auto-fix prompt')
|
|
155
|
+
.option('-s, --scan', 'Perform read-only bug & vulnerability scan across codebase')
|
|
156
|
+
.option('-a, --add <idea>', 'Evaluate feasibility & generate step-by-step roadmap for a feature idea')
|
|
157
|
+
.option('-v, --verify <cmd>', 'Custom verification command (e.g. "npm test" or "npm run build")')
|
|
158
|
+
.option('-m, --max-retries <number>', 'Maximum self-healing attempt iterations (default 3)')
|
|
159
|
+
.option('--steps <number>', 'Maximum autonomous execution steps (default 30)')
|
|
160
|
+
.option('-y, --yes', 'Automatically retain changes without prompting for review')
|
|
161
|
+
.option('-l, --lang <language>', 'Language for AI teardowns, explanations, and summaries')
|
|
162
|
+
.option('-V, --voice', 'Enable Text-to-Speech (TTS) & Speech-to-Text (STT) voice mode')
|
|
163
|
+
.option('--resume <taskId>', 'Resume an existing autonomous task by ID from .ft/tasks/')
|
|
164
|
+
.option('--native', 'Force native script')
|
|
165
|
+
.action(async (goalParts, options) => {
|
|
166
|
+
const goalStr = Array.isArray(goalParts) && goalParts.length > 0 ? goalParts.join(' ') : undefined;
|
|
167
|
+
const runStr = Array.isArray(options.run) ? options.run.join(' ') : options.run;
|
|
168
|
+
await handleAgent(goalStr, {
|
|
169
|
+
...options,
|
|
170
|
+
run: runStr,
|
|
171
|
+
verifyCmd: options.verify,
|
|
172
|
+
maxRetries: options.maxRetries ? Number(options.maxRetries) : undefined,
|
|
173
|
+
steps: options.steps ? Number(options.steps) : undefined,
|
|
174
|
+
resume: options.resume,
|
|
175
|
+
});
|
|
176
|
+
outro(chalk.green('Agent workflow complete.'));
|
|
177
|
+
});
|
|
178
|
+
program
|
|
179
|
+
.command('recommend')
|
|
180
|
+
.description('Architecture, performance, and DSA-level suggestions')
|
|
181
|
+
.option('-l, --lang <language>', 'Language for recommendations')
|
|
182
|
+
.option('--native', 'Force native script')
|
|
183
|
+
.action(async (options) => {
|
|
184
|
+
await handleRecommend(options);
|
|
185
|
+
outro(chalk.cyan('Recommendations complete.'));
|
|
186
|
+
});
|
|
187
|
+
program
|
|
188
|
+
.command('audit')
|
|
189
|
+
.description('Security & dependency/supply-chain scan')
|
|
190
|
+
.action(async () => {
|
|
191
|
+
await handleAudit();
|
|
192
|
+
outro(chalk.cyan('Security audit complete.'));
|
|
193
|
+
});
|
|
194
|
+
program
|
|
195
|
+
.command('benchmark')
|
|
196
|
+
.description('Measure LLM latency and tokens/sec across all configured models (Nemotron, Qwen, Gemini, GPT)')
|
|
197
|
+
.action(async () => {
|
|
198
|
+
await handleBenchmark();
|
|
199
|
+
outro(chalk.cyan('Benchmark complete.'));
|
|
200
|
+
});
|
|
201
|
+
program
|
|
202
|
+
.command('history')
|
|
203
|
+
.description('Log of everything FT has done in this repo')
|
|
204
|
+
.action(async () => {
|
|
205
|
+
await handleHistory();
|
|
206
|
+
outro(chalk.cyan('History view complete.'));
|
|
207
|
+
});
|
|
208
|
+
program
|
|
209
|
+
.command('undo')
|
|
210
|
+
.description("Revert FT's last change")
|
|
211
|
+
.action(async () => {
|
|
212
|
+
await handleUndo();
|
|
213
|
+
outro(chalk.cyan('Undo complete.'));
|
|
214
|
+
});
|
|
215
|
+
program
|
|
216
|
+
.command('config')
|
|
217
|
+
.description('Manage permissions and confidential-data access')
|
|
218
|
+
.option('-c, --confidential', 'Allow access to confidential data / schemas')
|
|
219
|
+
.option('-d, --deny', 'Deny access to confidential data')
|
|
220
|
+
.option('-t, --tips <mode>', 'Toggle or check discovery tips (on | off | status)')
|
|
221
|
+
.action(async (options) => {
|
|
222
|
+
await handleConfig(options);
|
|
223
|
+
outro(chalk.cyan('Configuration updated.'));
|
|
224
|
+
});
|
|
225
|
+
program
|
|
226
|
+
.command('search <query>')
|
|
227
|
+
.alias('web')
|
|
228
|
+
.description('Allow scout to search the internet for live web context, docs, & technical solutions')
|
|
229
|
+
.option('-a, --ask', 'Synthesize an AI answer using live internet search results')
|
|
230
|
+
.option('-l, --lang <language>', 'Language for AI search synthesis')
|
|
231
|
+
.option('--native', 'Force native script')
|
|
232
|
+
.action(async (query, options) => {
|
|
233
|
+
await handleWebSearch(query, options);
|
|
234
|
+
outro(chalk.cyan('Internet search complete.'));
|
|
235
|
+
});
|
|
236
|
+
program
|
|
237
|
+
.command('upgrade')
|
|
238
|
+
.description('Check for updates and auto-upgrade Scout to the latest version')
|
|
239
|
+
.action(async () => {
|
|
240
|
+
await checkForUpdates('1.1.0', true);
|
|
241
|
+
outro(chalk.cyan('Upgrade check complete.'));
|
|
242
|
+
});
|
|
243
|
+
program
|
|
244
|
+
.command('signup')
|
|
245
|
+
.alias('register')
|
|
246
|
+
.description('Create a new Scout developer account')
|
|
247
|
+
.option('-n, --name <name>', 'Full name')
|
|
248
|
+
.option('-e, --email <email>', 'Email address')
|
|
249
|
+
.option('-p, --password <password>', 'Password')
|
|
250
|
+
.option('-h, --holosene', 'Sign up via Holosene Account (holosene.frontterrain.com)')
|
|
251
|
+
.action(async (options) => {
|
|
252
|
+
await handleSignup(options);
|
|
253
|
+
outro(chalk.cyan('Sign up flow finished.'));
|
|
254
|
+
});
|
|
255
|
+
program
|
|
256
|
+
.command('login')
|
|
257
|
+
.alias('signin')
|
|
258
|
+
.description('Log into your FrontTerrain / Holosene account')
|
|
259
|
+
.option('-e, --email <email>', 'Email or username')
|
|
260
|
+
.option('-p, --password <password>', 'Password')
|
|
261
|
+
.option('-t, --token <token>', 'API Personal Access Token')
|
|
262
|
+
.option('-h, --holosene', 'Authenticate using Holosene account credentials')
|
|
263
|
+
.option('--holosene-token <token>', 'Authenticate with direct Holosene access token')
|
|
264
|
+
.action(async (options) => {
|
|
265
|
+
await handleLogin(options);
|
|
266
|
+
outro(chalk.cyan('Login flow finished.'));
|
|
267
|
+
process.exit(0);
|
|
268
|
+
});
|
|
269
|
+
program
|
|
270
|
+
.command('logout')
|
|
271
|
+
.description('Log out of your active FrontTerrain session')
|
|
272
|
+
.action(async () => {
|
|
273
|
+
await handleLogout();
|
|
274
|
+
outro(chalk.cyan('Logout complete.'));
|
|
275
|
+
});
|
|
276
|
+
program
|
|
277
|
+
.command('auth')
|
|
278
|
+
.alias('status')
|
|
279
|
+
.description('Check current authentication status and user session details')
|
|
280
|
+
.action(async () => {
|
|
281
|
+
await handleAuthStatus();
|
|
282
|
+
outro(chalk.cyan('Auth status check complete.'));
|
|
283
|
+
});
|
|
284
|
+
program
|
|
285
|
+
.command('dashboard')
|
|
286
|
+
.alias('web-ui')
|
|
287
|
+
.alias('gui')
|
|
288
|
+
.description('Launch interactive Scout Web Dashboard sync server')
|
|
289
|
+
.option('--open', 'Automatically open browser on web dashboard')
|
|
290
|
+
.action(async (options) => {
|
|
291
|
+
await handleDashboard({
|
|
292
|
+
open: !!options.open,
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
program
|
|
296
|
+
.command('quota')
|
|
297
|
+
.alias('usage')
|
|
298
|
+
.alias('credits')
|
|
299
|
+
.description('Check Scout credits, renewal status, and BYOK mode')
|
|
300
|
+
.action(async () => {
|
|
301
|
+
await handleQuota();
|
|
302
|
+
outro(chalk.cyan('Quota check complete.'));
|
|
303
|
+
});
|
|
304
|
+
program
|
|
305
|
+
.command('plan')
|
|
306
|
+
.alias('pricing')
|
|
307
|
+
.alias('subscribe')
|
|
308
|
+
.description('Manage Scout subscription tier, check pricing, and upgrade quota')
|
|
309
|
+
.action(async () => {
|
|
310
|
+
await handlePlanCommand();
|
|
311
|
+
outro(chalk.cyan('Subscription workflow complete.'));
|
|
312
|
+
});
|
|
313
|
+
const mcp = program
|
|
314
|
+
.command('mcp')
|
|
315
|
+
.description('Manage Model Context Protocol (MCP) server connections, tools, and health');
|
|
316
|
+
mcp
|
|
317
|
+
.command('list')
|
|
318
|
+
.description('List configured MCP servers, transport type, tool counts, and connection states')
|
|
319
|
+
.action(async () => {
|
|
320
|
+
await handleMcpList();
|
|
321
|
+
outro(chalk.cyan('MCP list complete.'));
|
|
322
|
+
});
|
|
323
|
+
mcp
|
|
324
|
+
.command('add [name]')
|
|
325
|
+
.description('Connect a new MCP server (HTTP or Stdio transport) with interactive wizard or flags')
|
|
326
|
+
.option('--name <name>', 'Server friendly name')
|
|
327
|
+
.option('--transport <transport>', 'Transport protocol: http or stdio')
|
|
328
|
+
.option('--endpoint <url>', 'Endpoint URL for HTTP transport')
|
|
329
|
+
.option('--command <command>', 'Executable command for Stdio transport')
|
|
330
|
+
.option('--args <args...>', 'Arguments for Stdio command')
|
|
331
|
+
.option('--auth-type <type>', 'Auth type: none, bearer, or apiKey')
|
|
332
|
+
.option('--token <token>', 'Bearer token or API key')
|
|
333
|
+
.option('--header-key <name>', 'Header name for apiKey auth (e.g. X-API-Key)')
|
|
334
|
+
.option('--auto-connect', 'Automatically connect and discover tools after adding')
|
|
335
|
+
.action(async (nameOrOpts, maybeOpts) => {
|
|
336
|
+
const name = typeof nameOrOpts === 'string' ? nameOrOpts : nameOrOpts?.name;
|
|
337
|
+
const options = typeof nameOrOpts === 'object' && !maybeOpts ? nameOrOpts : (maybeOpts || {});
|
|
338
|
+
if (Array.isArray(options.args)) {
|
|
339
|
+
options.args = options.args.join(' ');
|
|
340
|
+
}
|
|
341
|
+
await handleMcpAdd(name, options);
|
|
342
|
+
});
|
|
343
|
+
mcp
|
|
344
|
+
.command('remove [id]')
|
|
345
|
+
.alias('rm')
|
|
346
|
+
.description('Remove an MCP server configuration and wipe associated credentials')
|
|
347
|
+
.action(async (id) => {
|
|
348
|
+
await handleMcpRemove(id);
|
|
349
|
+
outro(chalk.cyan('MCP remove complete.'));
|
|
350
|
+
});
|
|
351
|
+
mcp
|
|
352
|
+
.command('connect [id]')
|
|
353
|
+
.description('Initiate connection handshake and discover tools from an MCP server')
|
|
354
|
+
.action(async (id) => {
|
|
355
|
+
await handleMcpConnect(id);
|
|
356
|
+
outro(chalk.cyan('MCP connect complete.'));
|
|
357
|
+
});
|
|
358
|
+
mcp
|
|
359
|
+
.command('disconnect [id]')
|
|
360
|
+
.description('Disconnect an active MCP server session')
|
|
361
|
+
.action(async (id) => {
|
|
362
|
+
await handleMcpDisconnect(id);
|
|
363
|
+
outro(chalk.cyan('MCP disconnect complete.'));
|
|
364
|
+
});
|
|
365
|
+
mcp
|
|
366
|
+
.command('inspect [id]')
|
|
367
|
+
.description('Display detailed server metadata, endpoint, permissions, and tool inventory')
|
|
368
|
+
.action(async (id) => {
|
|
369
|
+
await handleMcpInspect(id);
|
|
370
|
+
outro(chalk.cyan('MCP inspect complete.'));
|
|
371
|
+
});
|
|
372
|
+
mcp
|
|
373
|
+
.command('tools [id]')
|
|
374
|
+
.description('List all discovered tools, input schemas, and permission levels for a server')
|
|
375
|
+
.action(async (id) => {
|
|
376
|
+
await handleMcpTools(id);
|
|
377
|
+
outro(chalk.cyan('MCP tools inspect complete.'));
|
|
378
|
+
});
|
|
379
|
+
mcp
|
|
380
|
+
.command('health')
|
|
381
|
+
.description('Run live health checks, latency probes, and connection verifications across all servers')
|
|
382
|
+
.action(async () => {
|
|
383
|
+
await handleMcpHealth();
|
|
384
|
+
outro(chalk.cyan('MCP health check complete.'));
|
|
385
|
+
});
|
|
386
|
+
mcp.action(async () => {
|
|
387
|
+
await handleMcpList();
|
|
388
|
+
outro(chalk.cyan('Use "scout mcp --help" for all available commands.'));
|
|
389
|
+
});
|
|
40
390
|
program.parse(process.argv);
|
|
41
391
|
//# sourceMappingURL=index.js.map
|
package/bin/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAErC,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kEAAkE,CAAC;KAC/E,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;AAGrC,OAAO;KACJ,IAAI,CAAC,IAAI,CAAC;KACV,WAAW,CAAC,0DAA0D,CAAC;KACvE,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,yBAAyB;AACzB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;IAC7B,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;AAC3D,CAAC,CAAC,CAAC;AAEH,sBAAsB;AACtB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,iDAAiD,CAAC;KAC9D,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IAC1B,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,yDAAyD,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAChC,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,qBAAqB,CAAC;IACpC,UAAU,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACtB,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,SAAS;IAClB,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,UAAU,CAAC,CAAoC;IACvD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,eAAe,CAAwB;IAE/C,YAAY,SAAS,EAAE,aAAa,EAEnC;IAEM,WAAW,IAAI,OAAO,CAE5B;IAEM,aAAa;;cAtBV,MAAM;kBACF,MAAM;kBAuBnB;IAEM,eAAe,IAAI,qBAAqB,CAE9C;IAEM,kBAAkB,IAAI,MAAM,CAElC;IAED;;OAEG;IACU,oBAAoB,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA2BzF;IAED;;OAEG;IACU,IAAI,CAAC,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAa3D;IAED;;OAEG;IACU,SAAS,CAAC,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAehE;IAED;;OAEG;IACU,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,SAAS,GAAE,MAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAiC3G;IAED;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAGvC;CACJ"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout MCP Ecosystem - Protocol Client
|
|
3
|
+
* Implements JSON-RPC 2.0 handshake, capability negotiation, ping, tool discovery, and tool execution.
|
|
4
|
+
*/
|
|
5
|
+
export class MCPClient {
|
|
6
|
+
transport;
|
|
7
|
+
initialized = false;
|
|
8
|
+
serverInfo;
|
|
9
|
+
capabilities = {};
|
|
10
|
+
protocolVersion = '2024-11-05';
|
|
11
|
+
constructor(transport) {
|
|
12
|
+
this.transport = transport;
|
|
13
|
+
}
|
|
14
|
+
isConnected() {
|
|
15
|
+
return this.transport.isConnected() && this.initialized;
|
|
16
|
+
}
|
|
17
|
+
getServerInfo() {
|
|
18
|
+
return this.serverInfo;
|
|
19
|
+
}
|
|
20
|
+
getCapabilities() {
|
|
21
|
+
return this.capabilities;
|
|
22
|
+
}
|
|
23
|
+
getProtocolVersion() {
|
|
24
|
+
return this.protocolVersion;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Connect transport and perform the MCP initialization handshake
|
|
28
|
+
*/
|
|
29
|
+
async connectAndInitialize(timeoutMs = 30000) {
|
|
30
|
+
await this.transport.connect();
|
|
31
|
+
// Send initialize request per MCP specification
|
|
32
|
+
const initParams = {
|
|
33
|
+
protocolVersion: '2024-11-05',
|
|
34
|
+
capabilities: {
|
|
35
|
+
roots: { listChanged: true },
|
|
36
|
+
sampling: {},
|
|
37
|
+
},
|
|
38
|
+
clientInfo: {
|
|
39
|
+
name: 'scout',
|
|
40
|
+
version: '1.1.0',
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const result = await this.transport.sendRequest('initialize', initParams, timeoutMs);
|
|
44
|
+
this.initialized = true;
|
|
45
|
+
this.protocolVersion = result.protocolVersion || '2024-11-05';
|
|
46
|
+
this.capabilities = result.capabilities || {};
|
|
47
|
+
this.serverInfo = result.serverInfo;
|
|
48
|
+
// Send initialized notification acknowledgment
|
|
49
|
+
await this.transport.sendNotification('notifications/initialized', {});
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Measure ping round-trip latency in milliseconds
|
|
54
|
+
*/
|
|
55
|
+
async ping(timeoutMs = 5000) {
|
|
56
|
+
const start = Date.now();
|
|
57
|
+
try {
|
|
58
|
+
await this.transport.sendRequest('ping', {}, timeoutMs);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// Some servers don't implement 'ping' method explicitly; fallback to listing tools as ping
|
|
62
|
+
if (err?.message?.includes('Method not found') || err?.message?.includes('-32601')) {
|
|
63
|
+
await this.transport.sendRequest('tools/list', {}, timeoutMs);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return Date.now() - start;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Discover all tools exposed by the MCP server with automatic pagination
|
|
73
|
+
*/
|
|
74
|
+
async listTools(timeoutMs = 20000) {
|
|
75
|
+
const allTools = [];
|
|
76
|
+
let cursor = undefined;
|
|
77
|
+
do {
|
|
78
|
+
const params = cursor ? { cursor } : {};
|
|
79
|
+
const res = await this.transport.sendRequest('tools/list', params, timeoutMs);
|
|
80
|
+
const tools = res?.tools || [];
|
|
81
|
+
if (Array.isArray(tools)) {
|
|
82
|
+
allTools.push(...tools);
|
|
83
|
+
}
|
|
84
|
+
cursor = res?.nextCursor;
|
|
85
|
+
} while (cursor);
|
|
86
|
+
return allTools;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Execute an MCP tool via 'tools/call'
|
|
90
|
+
*/
|
|
91
|
+
async callTool(name, args = {}, timeoutMs = 60000) {
|
|
92
|
+
const params = {
|
|
93
|
+
name,
|
|
94
|
+
arguments: args || {},
|
|
95
|
+
};
|
|
96
|
+
const res = await this.transport.sendRequest('tools/call', params, timeoutMs);
|
|
97
|
+
// Check if MCP returned isError flag
|
|
98
|
+
if (res && res.isError) {
|
|
99
|
+
const contentText = Array.isArray(res.content)
|
|
100
|
+
? res.content.map((c) => c.text || JSON.stringify(c)).join('\n')
|
|
101
|
+
: (typeof res.content === 'string' ? res.content : JSON.stringify(res));
|
|
102
|
+
throw new Error(`MCP Tool Error (${name}): ${contentText}`);
|
|
103
|
+
}
|
|
104
|
+
// Normalize output content into readable text or structured format
|
|
105
|
+
if (res && Array.isArray(res.content)) {
|
|
106
|
+
const textParts = res.content.filter((c) => c.type === 'text').map((c) => c.text);
|
|
107
|
+
const nonTextParts = res.content.filter((c) => c.type !== 'text');
|
|
108
|
+
if (nonTextParts.length === 0) {
|
|
109
|
+
return textParts.join('\n');
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
text: textParts.join('\n'),
|
|
113
|
+
artifacts: nonTextParts,
|
|
114
|
+
raw: res.content,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
return res;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Disconnect the client and close transport
|
|
121
|
+
*/
|
|
122
|
+
async disconnect() {
|
|
123
|
+
this.initialized = false;
|
|
124
|
+
await this.transport.disconnect();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["discovery.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAExE,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,GAAG,GAAG;IACjD,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB,CAuBA;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAE,MAAW,GAAG,kBAAkB,CAiDtG;AAED,wBAAgB,gBAAgB,CAC5B,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACnB,iBAAiB,CAyBnB"}
|