@shriyanss/js-recon 1.2.2 → 1.3.1-alpha.1

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 (117) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/analyze/engine/astEngine.js +32 -26
  3. package/build/analyze/engine/astEngine.js.map +1 -1
  4. package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
  5. package/build/analyze/helpers/schemas.js +1 -0
  6. package/build/analyze/helpers/schemas.js.map +1 -1
  7. package/build/endpoints/next_js/client_jsFilesHref.js +4 -2
  8. package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
  9. package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
  10. package/build/endpoints/next_js/client_subsequentRequests.js +12 -4
  11. package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
  12. package/build/globalConfig.js +1 -1
  13. package/build/globalConfig.js.map +1 -1
  14. package/build/index.js +16 -2
  15. package/build/index.js.map +1 -1
  16. package/build/lazyLoad/downloadFilesUtil.js +74 -80
  17. package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
  18. package/build/lazyLoad/downloadLoadedJsUtil.js +1 -1
  19. package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
  20. package/build/lazyLoad/index.js +31 -46
  21. package/build/lazyLoad/index.js.map +1 -1
  22. package/build/lazyLoad/next_js/NextJsCrawler.js +76 -22
  23. package/build/lazyLoad/next_js/NextJsCrawler.js.map +1 -1
  24. package/build/lazyLoad/next_js/next_GetJSScript.js +1 -1
  25. package/build/lazyLoad/next_js/next_GetJSScript.js.map +1 -1
  26. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +1 -1
  27. package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
  28. package/build/lazyLoad/next_js/next_SubsequentRequests.js +4 -2
  29. package/build/lazyLoad/next_js/next_SubsequentRequests.js.map +1 -1
  30. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js +8 -3
  31. package/build/lazyLoad/next_js/next_bruteForceJsFiles.js.map +1 -1
  32. package/build/lazyLoad/next_js/next_getClientSidePaths.js +83 -0
  33. package/build/lazyLoad/next_js/next_getClientSidePaths.js.map +1 -0
  34. package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
  35. package/build/lazyLoad/react/react_getScriptTags.js +29 -0
  36. package/build/lazyLoad/react/react_getScriptTags.js.map +1 -0
  37. package/build/lazyLoad/react/react_sourcemapUrls.js +44 -0
  38. package/build/lazyLoad/react/react_sourcemapUrls.js.map +1 -0
  39. package/build/lazyLoad/react/react_webpackChunkPaths.js +188 -0
  40. package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -0
  41. package/build/lazyLoad/techDetect/checkAngularJS.js +70 -0
  42. package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -0
  43. package/build/lazyLoad/techDetect/checkNextJS.js +45 -0
  44. package/build/lazyLoad/techDetect/checkNextJS.js.map +1 -0
  45. package/build/lazyLoad/techDetect/checkNuxtJS.js +39 -0
  46. package/build/lazyLoad/techDetect/checkNuxtJS.js.map +1 -0
  47. package/build/lazyLoad/techDetect/checkReact.js +44 -0
  48. package/build/lazyLoad/techDetect/checkReact.js.map +1 -0
  49. package/build/lazyLoad/techDetect/checkSvelte.js +69 -0
  50. package/build/lazyLoad/techDetect/checkSvelte.js.map +1 -0
  51. package/build/lazyLoad/techDetect/checkVueJS.js +118 -0
  52. package/build/lazyLoad/techDetect/checkVueJS.js.map +1 -0
  53. package/build/lazyLoad/techDetect/index.js +14 -254
  54. package/build/lazyLoad/techDetect/index.js.map +1 -1
  55. package/build/lazyLoad/vue/vue_RuntimeJs.js +122 -54
  56. package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
  57. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +4 -0
  58. package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
  59. package/build/lazyLoad/vue/vue_discoverJsFiles.js +68 -0
  60. package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -0
  61. package/build/lazyLoad/vue/vue_getClientSidePaths.js +122 -0
  62. package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -0
  63. package/build/lazyLoad/vue/vue_jsImports.js +40 -34
  64. package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
  65. package/build/lazyLoad/vue/vue_pageSrc.js +60 -0
  66. package/build/lazyLoad/vue/vue_pageSrc.js.map +1 -0
  67. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js +8 -0
  68. package/build/lazyLoad/vue/vue_reconstructSourceMaps.js.map +1 -1
  69. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js +136 -0
  70. package/build/lazyLoad/vue/vue_recursiveClientSidePathDownload.js.map +1 -0
  71. package/build/lazyLoad/vue/vue_severalJsFilesHome.js +5 -0
  72. package/build/lazyLoad/vue/vue_severalJsFilesHome.js.map +1 -1
  73. package/build/lazyLoad/vue/vue_viteMapDeps.js +89 -0
  74. package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -0
  75. package/build/map/index.js +19 -0
  76. package/build/map/index.js.map +1 -1
  77. package/build/map/next_js/getExports.js +3 -1
  78. package/build/map/next_js/getExports.js.map +1 -1
  79. package/build/map/next_js/getTurbopackConnections.js +255 -0
  80. package/build/map/next_js/getTurbopackConnections.js.map +1 -0
  81. package/build/map/next_js/getWebpackConnections.js +3 -4
  82. package/build/map/next_js/getWebpackConnections.js.map +1 -1
  83. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +14 -10
  84. package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
  85. package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
  86. package/build/map/next_js/resolveFetch.js +2 -1
  87. package/build/map/next_js/resolveFetch.js.map +1 -1
  88. package/build/map/next_js/utils.js.map +1 -1
  89. package/build/map/vue_js/getViteConnections.js +293 -0
  90. package/build/map/vue_js/getViteConnections.js.map +1 -0
  91. package/build/map/vue_js/interactive.js +39 -0
  92. package/build/map/vue_js/interactive.js.map +1 -0
  93. package/build/map/vue_js/interactive_helpers/commandHandler.js +285 -0
  94. package/build/map/vue_js/interactive_helpers/commandHandler.js.map +1 -0
  95. package/build/map/vue_js/interactive_helpers/commandHelpers.js +39 -0
  96. package/build/map/vue_js/interactive_helpers/commandHelpers.js.map +1 -0
  97. package/build/map/vue_js/interactive_helpers/helpMenu.js +11 -0
  98. package/build/map/vue_js/interactive_helpers/helpMenu.js.map +1 -0
  99. package/build/mcp/cli.js +381 -0
  100. package/build/mcp/cli.js.map +1 -0
  101. package/build/mcp/commands.js +147 -0
  102. package/build/mcp/commands.js.map +1 -0
  103. package/build/mcp/config.js +68 -0
  104. package/build/mcp/config.js.map +1 -0
  105. package/build/mcp/index.js +29 -0
  106. package/build/mcp/index.js.map +1 -0
  107. package/build/mcp/providers.js +153 -0
  108. package/build/mcp/providers.js.map +1 -0
  109. package/build/mcp/tools.js +185 -0
  110. package/build/mcp/tools.js.map +1 -0
  111. package/build/run/index.js +35 -16
  112. package/build/run/index.js.map +1 -1
  113. package/build/utility/makeReq.js +25 -55
  114. package/build/utility/makeReq.js.map +1 -1
  115. package/build/utility/puppeteerInstance.js +5 -0
  116. package/build/utility/puppeteerInstance.js.map +1 -0
  117. package/package.json +10 -3
@@ -0,0 +1,381 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import readline from "readline";
11
+ import chalk from "chalk";
12
+ import inquirer from "inquirer";
13
+ import { SessionUsage, createProvider, listModels, getDefaultModel } from "./providers.js";
14
+ import { resolveApiKey, saveConfig } from "./config.js";
15
+ import { processCommand, getCommandSuggestions } from "./commands.js";
16
+ import { runLazyload, runFullPipeline, summarizeLazyloadOutput, summarizeRunOutput } from "./tools.js";
17
+ const SYSTEM_PROMPT = `You are js-recon MCP, an AI assistant for JavaScript reconnaissance and security analysis.
18
+ You help users analyze websites by running js-recon modules against target URLs.
19
+
20
+ You have access to two main tools:
21
+ 1. **lazyload** - Downloads and extracts JavaScript files from a target website. Detects frameworks (Next.js, Vue, Nuxt, Svelte, Angular) and downloads their JS bundles.
22
+ 2. **run** - Runs the full js-recon pipeline (lazyload → strings → map → endpoints → analyze → report) against a target URL.
23
+
24
+ When the user asks you to scan/analyze/run against a website:
25
+ - If they want a quick JS file download, use lazyload.
26
+ - If they want a full analysis, use run.
27
+ - Always confirm the target URL before executing.
28
+
29
+ When the user asks to parse/summarize results:
30
+ - For lazyload results: provide a directory structure overview of downloaded files.
31
+ - For run results: read and summarize the output JSON files (endpoints, mapped functions, analysis, etc.).
32
+
33
+ Respond concisely and helpfully. When providing results, highlight security-relevant findings.`;
34
+ /**
35
+ * Detects intent from user message and decides whether to invoke a tool.
36
+ */
37
+ const detectIntent = (message) => {
38
+ const lower = message.toLowerCase();
39
+ // Detect "parse" / "summarize" intents
40
+ if (lower.includes("parse") ||
41
+ lower.includes("summarize") ||
42
+ lower.includes("summary") ||
43
+ lower.includes("overview") ||
44
+ lower.includes("show results") ||
45
+ lower.includes("what did you find")) {
46
+ if (lower.includes("lazyload") ||
47
+ lower.includes("lazy load") ||
48
+ lower.includes("directory") ||
49
+ lower.includes("files")) {
50
+ return { action: "parse_lazyload" };
51
+ }
52
+ return { action: "parse_run" };
53
+ }
54
+ // Detect run/scan intents
55
+ const urlMatch = message.match(/https?:\/\/[^\s]+/);
56
+ const url = urlMatch ? urlMatch[0] : undefined;
57
+ if (lower.includes("run against") ||
58
+ lower.includes("full scan") ||
59
+ lower.includes("full pipeline") ||
60
+ lower.includes("full analysis") ||
61
+ lower.includes("analyze")) {
62
+ return { action: "run", url };
63
+ }
64
+ if (lower.includes("lazyload") ||
65
+ lower.includes("lazy load") ||
66
+ lower.includes("download js") ||
67
+ lower.includes("download javascript") ||
68
+ lower.includes("grab js") ||
69
+ lower.includes("fetch js")) {
70
+ return { action: "lazyload", url };
71
+ }
72
+ // If a URL is present and they seem to want scanning
73
+ if (url && (lower.includes("scan") || lower.includes("run") || lower.includes("check") || lower.includes("test"))) {
74
+ return { action: "run", url };
75
+ }
76
+ return { action: "chat", url };
77
+ };
78
+ /**
79
+ * Handles tool execution based on detected intent.
80
+ */
81
+ const handleToolExecution = (session, action, url) => __awaiter(void 0, void 0, void 0, function* () {
82
+ const outputDir = session.config.default_output_dir;
83
+ const threads = session.config.default_threads;
84
+ switch (action) {
85
+ case "lazyload": {
86
+ if (!url)
87
+ return null;
88
+ const result = yield runLazyload(url, outputDir, threads);
89
+ session.lastOutputDir = result.outputDir || outputDir;
90
+ session.lastModule = "lazyload";
91
+ session.lastToolOutput = result.message;
92
+ return result.message;
93
+ }
94
+ case "run": {
95
+ if (!url)
96
+ return null;
97
+ const result = yield runFullPipeline(url, outputDir, threads);
98
+ session.lastOutputDir = result.outputDir || outputDir;
99
+ session.lastModule = "run";
100
+ session.lastToolOutput = result.message;
101
+ return result.message;
102
+ }
103
+ case "parse_lazyload": {
104
+ const dir = session.lastOutputDir || outputDir;
105
+ const summary = summarizeLazyloadOutput(dir);
106
+ session.lastToolOutput = summary;
107
+ return summary;
108
+ }
109
+ case "parse_run": {
110
+ const summary = summarizeRunOutput(".");
111
+ session.lastToolOutput = summary;
112
+ return summary;
113
+ }
114
+ default:
115
+ return null;
116
+ }
117
+ });
118
+ /**
119
+ * Prompts user to configure MCP settings interactively.
120
+ */
121
+ const promptConfiguration = () => __awaiter(void 0, void 0, void 0, function* () {
122
+ console.log(chalk.yellow("\n[!] No API key configured. Let's set up MCP.\n"));
123
+ const { provider } = yield inquirer.prompt([
124
+ {
125
+ type: "list",
126
+ name: "provider",
127
+ message: "Select LLM provider:",
128
+ choices: ["openai", "anthropic"],
129
+ },
130
+ ]);
131
+ const { apiKey } = yield inquirer.prompt([
132
+ {
133
+ type: "password",
134
+ name: "apiKey",
135
+ message: `Enter ${provider === "openai" ? "OpenAI" : "Anthropic"} API key:`,
136
+ mask: "*",
137
+ },
138
+ ]);
139
+ const availableModels = yield listModels(provider, apiKey);
140
+ const defaultModel = getDefaultModel(provider);
141
+ const { model } = yield inquirer.prompt([
142
+ {
143
+ type: "list",
144
+ name: "model",
145
+ message: "Select model:",
146
+ choices: availableModels,
147
+ default: defaultModel,
148
+ },
149
+ ]);
150
+ return { provider, apiKey, model };
151
+ });
152
+ /**
153
+ * Starts the interactive MCP CLI session.
154
+ */
155
+ export const startCli = (config, cliApiKey, cliModel, cliProvider) => __awaiter(void 0, void 0, void 0, function* () {
156
+ let providerName = (cliProvider || config.provider);
157
+ let model = cliModel || config.model;
158
+ let apiKey = resolveApiKey(providerName, cliApiKey, config);
159
+ // If no API key, prompt user to configure
160
+ if (!apiKey) {
161
+ const configured = yield promptConfiguration();
162
+ providerName = configured.provider;
163
+ apiKey = configured.apiKey;
164
+ model = configured.model;
165
+ // Update config and save
166
+ config.provider = providerName;
167
+ config.model = model;
168
+ if (providerName === "openai") {
169
+ config.openai_api_key = apiKey;
170
+ }
171
+ else {
172
+ config.anthropic_api_key = apiKey;
173
+ }
174
+ saveConfig(config);
175
+ console.log(chalk.green("\n[✓] Configuration saved to ~/.js-recon/mcp.yaml\n"));
176
+ }
177
+ else if (cliApiKey && !cliModel) {
178
+ // Auto-detect model from provider when API key is provided
179
+ model = getDefaultModel(providerName);
180
+ console.log(chalk.cyan(`[i] Auto-detected model: ${model}\n`));
181
+ }
182
+ const provider = createProvider(providerName, apiKey, model);
183
+ const usage = new SessionUsage(model);
184
+ const session = {
185
+ provider,
186
+ providerName,
187
+ model,
188
+ config,
189
+ usage,
190
+ history: [{ role: "system", content: SYSTEM_PROMPT }],
191
+ cliApiKey,
192
+ configChanged: false,
193
+ };
194
+ const rl = readline.createInterface({
195
+ input: process.stdin,
196
+ output: process.stdout,
197
+ completer: (line) => {
198
+ if (line.startsWith("/")) {
199
+ const suggestions = getCommandSuggestions(line);
200
+ return [suggestions, line];
201
+ }
202
+ return [[], line];
203
+ },
204
+ });
205
+ // Handle Ctrl-C to stop current process, not exit
206
+ let ctrlCCount = 0;
207
+ process.on("SIGINT", () => {
208
+ if (session.currentAbortController) {
209
+ console.log(chalk.yellow("\n\n[!] Stopping current process...\n"));
210
+ session.currentAbortController.abort();
211
+ session.currentAbortController = undefined;
212
+ ctrlCCount = 0;
213
+ prompt();
214
+ }
215
+ else {
216
+ ctrlCCount++;
217
+ if (ctrlCCount === 1) {
218
+ console.log(chalk.yellow("\n\n[!] Press Ctrl-C again to exit, or type /exit\n"));
219
+ setTimeout(() => {
220
+ ctrlCCount = 0;
221
+ }, 2000);
222
+ prompt();
223
+ }
224
+ else {
225
+ console.log(chalk.yellow("\nGoodbye!\n"));
226
+ if (session.configChanged) {
227
+ console.log(chalk.cyan("[i] Config changes were made. Use /save to persist them.\n"));
228
+ }
229
+ rl.close();
230
+ process.exit(0);
231
+ }
232
+ }
233
+ });
234
+ console.log(chalk.bold.cyan("\n ╔══════════════════════════════════════╗"));
235
+ console.log(chalk.bold.cyan(" ║ js-recon MCP CLI ║"));
236
+ console.log(chalk.bold.cyan(" ╚══════════════════════════════════════╝\n"));
237
+ console.log(chalk.gray(` Provider: ${providerName} | Model: ${model}`));
238
+ console.log(chalk.gray(` Type /help for commands, or chat naturally.\n`));
239
+ const prompt = () => {
240
+ rl.question(chalk.green("js-recon> "), (input) => __awaiter(void 0, void 0, void 0, function* () {
241
+ const trimmed = input.trim();
242
+ if (!trimmed) {
243
+ prompt();
244
+ return;
245
+ }
246
+ // Handle slash commands
247
+ const cmdCtx = {
248
+ usage,
249
+ config,
250
+ provider: session.providerName,
251
+ model: session.model,
252
+ conversationLength: session.history.length,
253
+ };
254
+ const cmdResult = processCommand(trimmed, cmdCtx);
255
+ if (cmdResult.handled) {
256
+ if (cmdResult.output) {
257
+ // Handle special output signals
258
+ if (cmdResult.output === "__LIST_MODELS__") {
259
+ const models = yield listModels(session.providerName, resolveApiKey(session.providerName, session.cliApiKey, config));
260
+ console.log(chalk.cyan(`\n Available models for ${session.providerName}:\n`));
261
+ models.forEach((m) => {
262
+ const marker = m === session.model ? chalk.green(" ← current") : "";
263
+ console.log(` ${m}${marker}`);
264
+ });
265
+ console.log("");
266
+ }
267
+ else if (cmdResult.output.startsWith("__SWITCH_MODEL__")) {
268
+ const newModel = cmdResult.output.replace("__SWITCH_MODEL__", "");
269
+ session.model = newModel;
270
+ session.provider = createProvider(session.providerName, resolveApiKey(session.providerName, session.cliApiKey, config), newModel);
271
+ session.usage = new SessionUsage(newModel);
272
+ session.config.model = newModel;
273
+ session.configChanged = true;
274
+ console.log(chalk.green(`\n[✓] Switched model to: ${newModel}\n`));
275
+ }
276
+ else if (cmdResult.output.startsWith("__SWITCH_PROVIDER__")) {
277
+ const newProvider = cmdResult.output.replace("__SWITCH_PROVIDER__", "");
278
+ const newKey = resolveApiKey(newProvider, session.cliApiKey, config);
279
+ if (!newKey) {
280
+ console.log(chalk.red(`\n[!] No API key configured for ${newProvider}.\n`));
281
+ }
282
+ else {
283
+ session.providerName = newProvider;
284
+ const autoModel = getDefaultModel(newProvider);
285
+ session.model = autoModel;
286
+ session.provider = createProvider(newProvider, newKey, autoModel);
287
+ session.usage = new SessionUsage(autoModel);
288
+ session.config.provider = newProvider;
289
+ session.config.model = autoModel;
290
+ session.configChanged = true;
291
+ console.log(chalk.green(`\n[✓] Switched provider to: ${newProvider}\n`));
292
+ console.log(chalk.cyan(`[i] Auto-selected model: ${autoModel}\n`));
293
+ }
294
+ }
295
+ else if (cmdResult.output === "__SAVE_CONFIG__") {
296
+ saveConfig(session.config);
297
+ session.configChanged = false;
298
+ console.log(chalk.green("\n[✓] Configuration saved to ~/.js-recon/mcp.yaml\n"));
299
+ }
300
+ else {
301
+ console.log(cmdResult.output);
302
+ }
303
+ }
304
+ // Handle /clear
305
+ if (trimmed.toLowerCase() === "/clear") {
306
+ session.history = [{ role: "system", content: SYSTEM_PROMPT }];
307
+ }
308
+ if (cmdResult.exit) {
309
+ if (session.configChanged) {
310
+ console.log(chalk.cyan("[i] Config changes were made. Use /save to persist them.\n"));
311
+ }
312
+ rl.close();
313
+ return;
314
+ }
315
+ prompt();
316
+ return;
317
+ }
318
+ // Detect intent and possibly run tools
319
+ const intent = detectIntent(trimmed);
320
+ let toolContext = "";
321
+ if (intent.action !== "chat") {
322
+ session.currentAbortController = new AbortController();
323
+ try {
324
+ const toolOutput = yield handleToolExecution(session, intent.action, intent.url);
325
+ if (toolOutput) {
326
+ toolContext = `\n\n[Tool Output - ${intent.action}]:\n${toolOutput}`;
327
+ }
328
+ else if ((intent.action === "lazyload" || intent.action === "run") && !intent.url) {
329
+ toolContext = "\n\n[System: No URL detected in the message. Ask the user for the target URL.]";
330
+ }
331
+ }
332
+ catch (err) {
333
+ if (err.name === "AbortError") {
334
+ toolContext = "\n\n[System: Process was stopped by user.]";
335
+ }
336
+ else {
337
+ throw err;
338
+ }
339
+ }
340
+ finally {
341
+ session.currentAbortController = undefined;
342
+ }
343
+ }
344
+ // Build user message with tool context
345
+ const userMessage = toolContext ? `${trimmed}${toolContext}` : trimmed;
346
+ session.history.push({ role: "user", content: userMessage });
347
+ // Trim history if too long
348
+ if (session.history.length > config.history_limit) {
349
+ const system = session.history[0];
350
+ session.history = [system, ...session.history.slice(-(config.history_limit - 1))];
351
+ }
352
+ try {
353
+ session.currentAbortController = new AbortController();
354
+ const spinner = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
355
+ let spinIdx = 0;
356
+ const spinnerInterval = setInterval(() => {
357
+ process.stdout.write(`\r${chalk.cyan(spinner[spinIdx++ % spinner.length])} Thinking...`);
358
+ }, 80);
359
+ const response = yield session.provider.chat(session.history);
360
+ clearInterval(spinnerInterval);
361
+ process.stdout.write("\r" + " ".repeat(20) + "\r");
362
+ session.currentAbortController = undefined;
363
+ usage.addUsage(response.promptTokens, response.completionTokens);
364
+ session.history.push({ role: "assistant", content: response.content });
365
+ console.log(chalk.white("\n" + response.content + "\n"));
366
+ }
367
+ catch (err) {
368
+ session.currentAbortController = undefined;
369
+ if (err.name !== "AbortError") {
370
+ console.log(chalk.red(`\n[!] ${err.message}\n`));
371
+ }
372
+ else {
373
+ console.log(chalk.yellow("\n[!] Response generation stopped.\n"));
374
+ }
375
+ }
376
+ prompt();
377
+ }));
378
+ };
379
+ prompt();
380
+ });
381
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/mcp/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,147 @@
1
+ import chalk from "chalk";
2
+ const commands = {
3
+ "/help": {
4
+ description: "Show available commands",
5
+ handler: (_args, _ctx) => {
6
+ const lines = [
7
+ chalk.bold.cyan("\n Available Commands:\n"),
8
+ ...Object.entries(commands).map(([name, def]) => ` ${chalk.green(name.padEnd(16))} ${def.description}`),
9
+ "",
10
+ ];
11
+ return { handled: true, output: lines.join("\n") };
12
+ },
13
+ },
14
+ "/exit": {
15
+ description: "Exit the MCP CLI",
16
+ handler: (_args, _ctx) => {
17
+ return { handled: true, exit: true, output: chalk.yellow("\nGoodbye!\n") };
18
+ },
19
+ },
20
+ "/cost": {
21
+ description: "Show token usage and estimated cost for this session",
22
+ handler: (_args, ctx) => {
23
+ return { handled: true, output: "\n" + ctx.usage.formatCost() + "\n" };
24
+ },
25
+ },
26
+ "/clear": {
27
+ description: "Clear conversation history (keeps system prompt)",
28
+ handler: (_args, _ctx) => {
29
+ return { handled: true, output: chalk.cyan("\n[i] Conversation history cleared.\n") };
30
+ },
31
+ },
32
+ "/model": {
33
+ description: "Show or switch the current model (e.g. /model gpt-4o)",
34
+ handler: (args, ctx) => {
35
+ if (!args.trim()) {
36
+ return {
37
+ handled: true,
38
+ output: `__LIST_MODELS__`,
39
+ };
40
+ }
41
+ return {
42
+ handled: true,
43
+ output: `__SWITCH_MODEL__${args.trim()}`,
44
+ };
45
+ },
46
+ },
47
+ "/provider": {
48
+ description: "Show or switch provider (e.g. /provider anthropic)",
49
+ handler: (args, ctx) => {
50
+ const val = args.trim().toLowerCase();
51
+ if (!val) {
52
+ return {
53
+ handled: true,
54
+ output: chalk.cyan(`\n Current provider: ${ctx.provider}\n`),
55
+ };
56
+ }
57
+ if (val !== "openai" && val !== "anthropic") {
58
+ return {
59
+ handled: true,
60
+ output: chalk.red(`\n[!] Invalid provider: ${val}. Use 'openai' or 'anthropic'.\n`),
61
+ };
62
+ }
63
+ return {
64
+ handled: true,
65
+ output: `__SWITCH_PROVIDER__${val}`,
66
+ };
67
+ },
68
+ },
69
+ "/status": {
70
+ description: "Show current session status",
71
+ handler: (_args, ctx) => {
72
+ const lines = [
73
+ chalk.bold.cyan("\n Session Status:\n"),
74
+ ` Provider: ${ctx.provider}`,
75
+ ` Model: ${ctx.model}`,
76
+ ` Conversation length: ${ctx.conversationLength} messages`,
77
+ ` Total tokens used: ${ctx.usage.getStats().totalTokens.toLocaleString()}`,
78
+ ` Estimated cost: $${ctx.usage.getStats().estimatedCost.toFixed(6)}`,
79
+ "",
80
+ ];
81
+ return { handled: true, output: lines.join("\n") };
82
+ },
83
+ },
84
+ "/config": {
85
+ description: "Show current configuration",
86
+ handler: (_args, ctx) => {
87
+ const lines = [
88
+ chalk.bold.cyan("\n MCP Configuration:\n"),
89
+ ` Provider: ${ctx.config.provider}`,
90
+ ` Model: ${ctx.config.model}`,
91
+ ` Output dir: ${ctx.config.default_output_dir}`,
92
+ ` Threads: ${ctx.config.default_threads}`,
93
+ ` History limit: ${ctx.config.history_limit}`,
94
+ ` OpenAI key: ${ctx.config.openai_api_key ? "***" + ctx.config.openai_api_key.slice(-4) : "(not set)"}`,
95
+ ` Anthropic key: ${ctx.config.anthropic_api_key ? "***" + ctx.config.anthropic_api_key.slice(-4) : "(not set)"}`,
96
+ "",
97
+ ];
98
+ return { handled: true, output: lines.join("\n") };
99
+ },
100
+ },
101
+ "/save": {
102
+ description: "Save current session config to ~/.js-recon/mcp.yaml",
103
+ handler: (_args, _ctx) => {
104
+ return { handled: true, output: "__SAVE_CONFIG__" };
105
+ },
106
+ },
107
+ "/models": {
108
+ description: "List available models for current provider",
109
+ handler: (_args, _ctx) => {
110
+ return { handled: true, output: "__LIST_MODELS__" };
111
+ },
112
+ },
113
+ };
114
+ /**
115
+ * Gets all available command names for autocomplete.
116
+ */
117
+ export const getCommandNames = () => {
118
+ return Object.keys(commands);
119
+ };
120
+ /**
121
+ * Gets command suggestions based on partial input.
122
+ */
123
+ export const getCommandSuggestions = (partial) => {
124
+ const lower = partial.toLowerCase();
125
+ return Object.keys(commands).filter((cmd) => cmd.startsWith(lower));
126
+ };
127
+ /**
128
+ * Processes a slash command. Returns a CommandResult indicating whether it was handled.
129
+ */
130
+ export const processCommand = (input, ctx) => {
131
+ const trimmed = input.trim();
132
+ if (!trimmed.startsWith("/")) {
133
+ return { handled: false };
134
+ }
135
+ const spaceIdx = trimmed.indexOf(" ");
136
+ const cmdName = spaceIdx === -1 ? trimmed : trimmed.substring(0, spaceIdx);
137
+ const args = spaceIdx === -1 ? "" : trimmed.substring(spaceIdx + 1);
138
+ const cmd = commands[cmdName.toLowerCase()];
139
+ if (!cmd) {
140
+ return {
141
+ handled: true,
142
+ output: chalk.red(`\n[!] Unknown command: ${cmdName}. Type /help for available commands.\n`),
143
+ };
144
+ }
145
+ return cmd.handler(args, ctx);
146
+ };
147
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/mcp/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import YAML from "yaml";
4
+ import chalk from "chalk";
5
+ const DEFAULT_CONFIG = {
6
+ provider: "openai",
7
+ model: "gpt-4o-mini",
8
+ openai_api_key: "",
9
+ anthropic_api_key: "",
10
+ default_output_dir: "output",
11
+ default_threads: 1,
12
+ history_limit: 50,
13
+ };
14
+ const CONFIG_DIR = path.join(process.env.HOME || "~", ".js-recon");
15
+ const CONFIG_FILE = path.join(CONFIG_DIR, "mcp.yaml");
16
+ /**
17
+ * Ensures the ~/.js-recon directory exists.
18
+ */
19
+ export const ensureConfigDir = () => {
20
+ if (!fs.existsSync(CONFIG_DIR)) {
21
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
22
+ console.log(chalk.cyan(`[i] Created config directory: ${CONFIG_DIR}`));
23
+ }
24
+ };
25
+ /**
26
+ * Loads MCP configuration from ~/.js-recon/mcp.yaml.
27
+ * Creates a default config file if one does not exist.
28
+ */
29
+ export const loadConfig = (configPath) => {
30
+ const filePath = configPath || CONFIG_FILE;
31
+ ensureConfigDir();
32
+ if (!fs.existsSync(filePath)) {
33
+ saveConfig(DEFAULT_CONFIG, filePath);
34
+ console.log(chalk.cyan(`[i] Created default MCP config at ${filePath}`));
35
+ return Object.assign({}, DEFAULT_CONFIG);
36
+ }
37
+ try {
38
+ const raw = fs.readFileSync(filePath, "utf-8");
39
+ const parsed = YAML.parse(raw);
40
+ return Object.assign(Object.assign({}, DEFAULT_CONFIG), parsed);
41
+ }
42
+ catch (err) {
43
+ console.log(chalk.yellow(`[!] Failed to parse config at ${filePath}. Using defaults.`));
44
+ return Object.assign({}, DEFAULT_CONFIG);
45
+ }
46
+ };
47
+ /**
48
+ * Saves MCP configuration to ~/.js-recon/mcp.yaml.
49
+ */
50
+ export const saveConfig = (config, configPath) => {
51
+ const filePath = configPath || CONFIG_FILE;
52
+ ensureConfigDir();
53
+ fs.writeFileSync(filePath, YAML.stringify(config), "utf-8");
54
+ };
55
+ /**
56
+ * Resolves the API key for a given provider, checking CLI flag, config, and env vars.
57
+ */
58
+ export const resolveApiKey = (provider, cliKey, config) => {
59
+ if (cliKey)
60
+ return cliKey;
61
+ if (provider === "openai") {
62
+ return config.openai_api_key || process.env.OPENAI_API_KEY || "";
63
+ }
64
+ return config.anthropic_api_key || process.env.ANTHROPIC_API_KEY || "";
65
+ };
66
+ export const getConfigDir = () => CONFIG_DIR;
67
+ export const getConfigFilePath = () => CONFIG_FILE;
68
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/mcp/config.ts"],"names":[],"mappings":"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"}