@theone1345/smartrelay 0.2.0 → 0.3.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.
Files changed (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +127 -17
  3. package/config/runners/agents.yaml +14 -1
  4. package/dist/credentials.d.ts +94 -0
  5. package/dist/credentials.js +168 -0
  6. package/dist/credentials.js.map +1 -0
  7. package/dist/http-api.d.ts +1 -7
  8. package/dist/http-api.js +6 -169
  9. package/dist/http-api.js.map +1 -1
  10. package/dist/index.d.ts +3 -1
  11. package/dist/index.js +5 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/install.d.ts +57 -0
  14. package/dist/install.js +216 -0
  15. package/dist/install.js.map +1 -0
  16. package/dist/logger.d.ts +2 -0
  17. package/dist/logger.js +21 -1
  18. package/dist/logger.js.map +1 -1
  19. package/dist/profiles/review-profiles.d.ts +32 -0
  20. package/dist/profiles/review-profiles.js +348 -0
  21. package/dist/profiles/review-profiles.js.map +1 -0
  22. package/dist/router.js +18 -3
  23. package/dist/router.js.map +1 -1
  24. package/dist/runners/anthropic.js +2 -3
  25. package/dist/runners/anthropic.js.map +1 -1
  26. package/dist/runners/base.d.ts +8 -0
  27. package/dist/runners/base.js +13 -0
  28. package/dist/runners/base.js.map +1 -1
  29. package/dist/runners/openai.js +2 -3
  30. package/dist/runners/openai.js.map +1 -1
  31. package/dist/runners/registry.d.ts +2 -0
  32. package/dist/runners/registry.js +4 -0
  33. package/dist/runners/registry.js.map +1 -1
  34. package/dist/server.d.ts +1 -6
  35. package/dist/server.js +134 -66
  36. package/dist/server.js.map +1 -1
  37. package/dist/setup.d.ts +65 -0
  38. package/dist/setup.js +411 -0
  39. package/dist/setup.js.map +1 -0
  40. package/dist/tools/dispatch.d.ts +33 -0
  41. package/dist/tools/dispatch.js +222 -0
  42. package/dist/tools/dispatch.js.map +1 -0
  43. package/dist/tools/handlers.d.ts +8 -2
  44. package/dist/tools/handlers.js +119 -27
  45. package/dist/tools/handlers.js.map +1 -1
  46. package/dist/util.d.ts +37 -4
  47. package/dist/util.js +71 -15
  48. package/dist/util.js.map +1 -1
  49. package/package.json +28 -3
  50. package/prompts/code_review.md +26 -20
  51. package/prompts/security_audit.md +109 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Transport-agnostic tool dispatch.
3
+ *
4
+ * Extracted from `http-api.ts` so the HTTP API, the MCPHub plugin, and tests all
5
+ * route through one switch instead of three drifting copies. Adding a tool here
6
+ * reaches every surface at once.
7
+ *
8
+ * Deliberately does NOT call `loadDotEnv()` at module scope — only the two CLI
9
+ * entrypoints (`server.ts`, `http-api.ts`) do. If this module loaded `.env`
10
+ * files, an ambient `.env` sitting in whatever directory the host process
11
+ * happens to run from would silently override credentials the user configured
12
+ * explicitly (for example in the MCPHub settings UI).
13
+ */
14
+ import { BenchmarkEngine } from '../benchmark/engine.js';
15
+ import { getLogger } from '../logger.js';
16
+ import { TaskRouter } from '../router.js';
17
+ import { RunnerRegistry } from '../runners/registry.js';
18
+ import { askSubagent, auditFileSecurity, auditSecurity, benchmarkRun, createPlan, delegateTask, explainCode, explainFile, generateTests, getActiveModel, listRunners, pluginConfigure, pluginGetLogs, pluginHealthCheck, pluginRemove, pluginStatus, reviewCode, reviewFile, switchModel, testFile, } from './handlers.js';
19
+ const logger = getLogger('smartrelay.dispatch');
20
+ let registryInstance = null;
21
+ let engineInstance = null;
22
+ let routerInstance = null;
23
+ export function getRegistry(configPath) {
24
+ if (!registryInstance) {
25
+ try {
26
+ registryInstance = RunnerRegistry.fromYaml(configPath);
27
+ logger.info(`Loaded runners: [${registryInstance.registeredIds().join(', ')}]`);
28
+ }
29
+ catch (err) {
30
+ logger.warning(`Could not initialize registry on startup: ${err}`);
31
+ registryInstance = new RunnerRegistry(configPath ?? null);
32
+ }
33
+ }
34
+ else {
35
+ registryInstance.reloadIfModified();
36
+ }
37
+ return registryInstance;
38
+ }
39
+ export function getEngine() {
40
+ const reg = getRegistry();
41
+ if (!engineInstance || engineInstance.registry !== reg) {
42
+ const rawConcurrency = reg.serverConfig['max_concurrency'];
43
+ const maxConcurrency = typeof rawConcurrency === 'number' ? rawConcurrency : 5;
44
+ engineInstance = new BenchmarkEngine(reg, maxConcurrency);
45
+ }
46
+ return engineInstance;
47
+ }
48
+ export function getRouter() {
49
+ const reg = getRegistry();
50
+ if (!routerInstance || routerInstance.registry !== reg) {
51
+ routerInstance = new TaskRouter(reg);
52
+ }
53
+ return routerInstance;
54
+ }
55
+ /**
56
+ * Build a standalone context that does not share the module-level singletons.
57
+ *
58
+ * Used where the process hosts more than just SmartRelay (the MCPHub plugin) and
59
+ * by tests that need an isolated registry.
60
+ */
61
+ export function createDispatchContext(configPath) {
62
+ const registry = RunnerRegistry.fromYaml(configPath ?? null);
63
+ const rawConcurrency = registry.serverConfig['max_concurrency'];
64
+ const maxConcurrency = typeof rawConcurrency === 'number' ? rawConcurrency : 5;
65
+ return {
66
+ registry,
67
+ router: new TaskRouter(registry),
68
+ engine: new BenchmarkEngine(registry, maxConcurrency),
69
+ };
70
+ }
71
+ // =========================================================================
72
+ // DISPATCH TOOLS
73
+ // =========================================================================
74
+ export async function dispatchTool(toolName, args = {}, ctx) {
75
+ const router = ctx ? ctx.router : getRouter();
76
+ const registry = ctx ? ctx.registry : getRegistry();
77
+ const engine = ctx ? ctx.engine : getEngine();
78
+ // Normalize tool name (handle both smartrelay_* and plain tool names)
79
+ const norm = toolName.startsWith('smartrelay_') ? toolName : `smartrelay_${toolName}`;
80
+ switch (norm) {
81
+ // Plugin lifecycle
82
+ case 'smartrelay_configure':
83
+ return pluginConfigure(args);
84
+ case 'smartrelay_status':
85
+ return pluginStatus(registry);
86
+ case 'smartrelay_remove':
87
+ return pluginRemove();
88
+ case 'smartrelay_health_check':
89
+ return pluginHealthCheck(registry);
90
+ case 'smartrelay_get_logs':
91
+ return pluginGetLogs(args);
92
+ // Model switching
93
+ case 'smartrelay_switch_model': {
94
+ const model = typeof args['model'] === 'string' ? args['model'] : 'auto';
95
+ return switchModel(router, model);
96
+ }
97
+ case 'smartrelay_get_active_model':
98
+ return getActiveModel(router);
99
+ // Delegation tools
100
+ case 'smartrelay_create_plan': {
101
+ const goal = typeof args['goal'] === 'string' ? args['goal'] : '';
102
+ const context = typeof args['context'] === 'string' ? args['context'] : '';
103
+ if (!goal)
104
+ return { error: 'Missing required argument: goal' };
105
+ return createPlan(router, goal, context);
106
+ }
107
+ case 'smartrelay_review_code': {
108
+ const code = typeof args['code'] === 'string' ? args['code'] : '';
109
+ const focus = typeof args['focus'] === 'string'
110
+ ? args['focus']
111
+ : 'bugs, security, clean code, and performance';
112
+ const language = typeof args['language'] === 'string' ? args['language'] : 'auto';
113
+ if (!code)
114
+ return { error: 'Missing required argument: code' };
115
+ return reviewCode(router, code, focus, language);
116
+ }
117
+ case 'smartrelay_generate_tests': {
118
+ const code = typeof args['code'] === 'string' ? args['code'] : '';
119
+ const framework = typeof args['framework'] === 'string'
120
+ ? args['framework']
121
+ : 'standard unit test framework (pytest, flutter_test, etc.)';
122
+ if (!code)
123
+ return { error: 'Missing required argument: code' };
124
+ return generateTests(router, code, framework);
125
+ }
126
+ case 'smartrelay_ask_subagent': {
127
+ const prompt = typeof args['prompt'] === 'string' ? args['prompt'] : '';
128
+ const model = typeof args['model'] === 'string' ? args['model'] : 'auto';
129
+ if (!prompt)
130
+ return { error: 'Missing required argument: prompt' };
131
+ return askSubagent(router, prompt, model);
132
+ }
133
+ case 'smartrelay_review_file': {
134
+ const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
135
+ const focus = typeof args['focus'] === 'string'
136
+ ? args['focus']
137
+ : 'bugs, security, clean code, and performance';
138
+ const language = typeof args['language'] === 'string' ? args['language'] : 'auto';
139
+ if (!filePath)
140
+ return { error: 'Missing required argument: file_path' };
141
+ return reviewFile(router, filePath, focus, language);
142
+ }
143
+ case 'smartrelay_test_file': {
144
+ const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
145
+ const framework = typeof args['framework'] === 'string'
146
+ ? args['framework']
147
+ : 'standard unit test framework (pytest, flutter_test, etc.)';
148
+ if (!filePath)
149
+ return { error: 'Missing required argument: file_path' };
150
+ return testFile(router, filePath, framework);
151
+ }
152
+ case 'smartrelay_explain_code': {
153
+ const code = typeof args['code'] === 'string' ? args['code'] : '';
154
+ const audience = typeof args['audience'] === 'string' ? args['audience'] : 'mid-level engineer';
155
+ const language = typeof args['language'] === 'string' ? args['language'] : 'auto';
156
+ if (!code)
157
+ return { error: 'Missing required argument: code' };
158
+ return explainCode(router, code, audience, language);
159
+ }
160
+ case 'smartrelay_explain_file': {
161
+ const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
162
+ const audience = typeof args['audience'] === 'string' ? args['audience'] : 'mid-level engineer';
163
+ if (!filePath)
164
+ return { error: 'Missing required argument: file_path' };
165
+ return explainFile(router, filePath, audience);
166
+ }
167
+ case 'smartrelay_audit_security': {
168
+ const code = typeof args['code'] === 'string' ? args['code'] : '';
169
+ const focus = typeof args['focus'] === 'string'
170
+ ? args['focus']
171
+ : 'OWASP Top 10, CWE vulnerabilities, secrets, and auth flaws';
172
+ const language = typeof args['language'] === 'string' ? args['language'] : 'auto';
173
+ if (!code)
174
+ return { error: 'Missing required argument: code' };
175
+ return auditSecurity(router, code, focus, language);
176
+ }
177
+ case 'smartrelay_audit_file_security': {
178
+ const filePath = typeof args['file_path'] === 'string' ? args['file_path'] : '';
179
+ const focus = typeof args['focus'] === 'string'
180
+ ? args['focus']
181
+ : 'OWASP Top 10, CWE vulnerabilities, secrets, and auth flaws';
182
+ const language = typeof args['language'] === 'string' ? args['language'] : 'auto';
183
+ if (!filePath)
184
+ return { error: 'Missing required argument: file_path' };
185
+ return auditFileSecurity(router, filePath, focus, language);
186
+ }
187
+ case 'smartrelay_list_runners':
188
+ return listRunners(registry);
189
+ case 'smartrelay_delegate_task': {
190
+ const task = typeof args['task'] === 'string' ? args['task'] : '';
191
+ const runnerId = typeof args['runner_id'] === 'string' ? args['runner_id'] : 'auto';
192
+ const params = typeof args['params'] === 'object' && args['params'] !== null
193
+ ? args['params']
194
+ : undefined;
195
+ if (!task)
196
+ return { error: 'Missing required argument: task' };
197
+ return delegateTask(router, task, runnerId, params);
198
+ }
199
+ case 'smartrelay_benchmark_run': {
200
+ const task = typeof args['task'] === 'string' ? args['task'] : '';
201
+ if (!task)
202
+ return { error: 'Missing required argument: task' };
203
+ return benchmarkRun(registry, engine, {
204
+ task,
205
+ runner_ids: Array.isArray(args['runner_ids'])
206
+ ? args['runner_ids']
207
+ : undefined,
208
+ params: typeof args['params'] === 'object' && args['params'] !== null
209
+ ? args['params']
210
+ : undefined,
211
+ reference_answer: typeof args['reference_answer'] === 'string' ? args['reference_answer'] : undefined,
212
+ judge_runner_id: typeof args['judge_runner_id'] === 'string' ? args['judge_runner_id'] : undefined,
213
+ eval_criteria: typeof args['eval_criteria'] === 'object' && args['eval_criteria'] !== null
214
+ ? args['eval_criteria']
215
+ : undefined,
216
+ });
217
+ }
218
+ default:
219
+ throw new Error(`Unknown tool: ${toolName}`);
220
+ }
221
+ }
222
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/tools/dispatch.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,8 @@ import type { TaskRouter } from '../router.js';
4
4
  import type { RunnerRegistry } from '../runners/registry.js';
5
5
  /** Extract strictly the review report and remove any model reasoning or scratchpad text. */
6
6
  export declare function cleanReviewOutput(output: string): string;
7
+ /** Extract strictly the security audit report and remove any model reasoning or scratchpad text. */
8
+ export declare function cleanSecurityOutput(output: string): string;
7
9
  /** Read a file from disk, returning `{ content, error }`. */
8
10
  export declare function readFileFromDisk(filePath: string): {
9
11
  content: string | null;
@@ -16,19 +18,23 @@ export declare function getActiveModel(router: TaskRouter): string;
16
18
  /** Create a structured architectural implementation plan. */
17
19
  export declare function createPlan(router: TaskRouter, goal: string, context?: string): Promise<string>;
18
20
  /** Perform an in-depth, expert code review. */
19
- export declare function reviewCode(router: TaskRouter, code: string, focus?: string): Promise<string>;
21
+ export declare function reviewCode(router: TaskRouter, code: string, focus?: string, language?: string): Promise<string>;
20
22
  /** Generate production-ready unit and integration tests. */
21
23
  export declare function generateTests(router: TaskRouter, code: string, framework?: string): Promise<string>;
22
24
  /** Ask any question directly to an external sub-agent model. */
23
25
  export declare function askSubagent(router: TaskRouter, prompt: string, model?: string): Promise<string>;
24
26
  /** Review a source code file directly from disk — zero Claude token burn. */
25
- export declare function reviewFile(router: TaskRouter, filePath: string, focus?: string): Promise<string>;
27
+ export declare function reviewFile(router: TaskRouter, filePath: string, focus?: string, language?: string): Promise<string>;
26
28
  /** Generate tests for a source code file directly from disk. */
27
29
  export declare function testFile(router: TaskRouter, filePath: string, framework?: string): Promise<string>;
28
30
  /** Get a plain-English explanation of code. */
29
31
  export declare function explainCode(router: TaskRouter, code: string, audience?: string, language?: string): Promise<string>;
30
32
  /** Get a plain-English explanation of a source file directly from disk. */
31
33
  export declare function explainFile(router: TaskRouter, filePath: string, audience?: string): Promise<string>;
34
+ /** Perform an in-depth security audit and vulnerability assessment. */
35
+ export declare function auditSecurity(router: TaskRouter, code: string, focus?: string, language?: string): Promise<string>;
36
+ /** Audit a source code file for security vulnerabilities directly from disk — zero Claude token burn. */
37
+ export declare function auditFileSecurity(router: TaskRouter, filePath: string, focus?: string, language?: string): Promise<string>;
32
38
  /** List all registered runners and metadata. */
33
39
  export declare function listRunners(registry: RunnerRegistry): string;
34
40
  /** Delegate a task to an external runner or auto-route. */
@@ -2,9 +2,11 @@
2
2
  import { existsSync, readFileSync, statSync } from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { benchmarkResultToJson } from '../benchmark/engine.js';
5
- import { getLogger } from '../logger.js';
5
+ import { noProviderKeysConfigured, SETUP_HINT, summarizeCredentials } from '../credentials.js';
6
+ import { getLogger, recentLogs } from '../logger.js';
6
7
  import { makeRunnerResult, runnerResultToJson } from '../runners/base.js';
7
8
  import { describeError, resolveUserPath } from '../util.js';
9
+ import { buildReviewPrompt, detectLanguage, getReviewProfile } from '../profiles/review-profiles.js';
8
10
  const logger = getLogger('smartrelay.tools');
9
11
  /** Extract strictly the review report and remove any model reasoning or scratchpad text. */
10
12
  export function cleanReviewOutput(output) {
@@ -21,7 +23,28 @@ export function cleanReviewOutput(output) {
21
23
  '## 💡 Suggestions & Improvements',
22
24
  '## 💡 Suggestions',
23
25
  '✅ No issues found',
24
- '⚠️ This reviewer is scoped to Dart/Flutter',
26
+ ];
27
+ for (const marker of markers) {
28
+ const idx = output.indexOf(marker);
29
+ if (idx !== -1) {
30
+ return output.slice(idx).trim();
31
+ }
32
+ }
33
+ return output.trim();
34
+ }
35
+ /** Extract strictly the security audit report and remove any model reasoning or scratchpad text. */
36
+ export function cleanSecurityOutput(output) {
37
+ const markers = [
38
+ '# 🔒 Security Audit Report',
39
+ '# 🔒',
40
+ '## 📊 Summary of Vulnerabilities',
41
+ '## 🚨 Critical & High Vulnerabilities',
42
+ '## 🚨 Critical',
43
+ '## 🔴 High',
44
+ '## 🟡 Medium & Low Vulnerabilities',
45
+ '## 🟡 Medium',
46
+ '## 🛡️ Security Hardening & Best Practices',
47
+ '## 🛡️',
25
48
  ];
26
49
  for (const marker of markers) {
27
50
  const idx = output.indexOf(marker);
@@ -84,20 +107,16 @@ export async function createPlan(router, goal, context = '') {
84
107
  return `Plan creation failed: ${result.error_message}`;
85
108
  }
86
109
  /** Perform an in-depth, expert code review. */
87
- export async function reviewCode(router, code, focus = 'bugs, security, clean code, and performance') {
110
+ export async function reviewCode(router, code, focus = 'bugs, security, clean code, and performance', language = 'auto') {
88
111
  const runner = router.routeTask(`Review code with focus on ${focus}`);
89
112
  if (!runner) {
90
113
  return JSON.stringify({ error: 'No code review runner available. Check config.yaml' });
91
114
  }
92
- const taskPrompt = `Perform a comprehensive code review focusing on: ${focus}.\n\n` +
93
- 'Format the output strictly using the `# 🛡️ Code Review Report` template with Health Score, ' +
94
- 'Summary Table, 🚨 Blockers, ⚠️ Warnings, 💡 Suggestions, ✅ Commendations, and 🛠️ Verification Commands.\n\n' +
95
- 'STRICT RULES:\n' +
96
- '- Begin directly with `# 🛡️ Code Review Report`.\n' +
97
- '- NEVER output or rewrite the entire source code file.\n' +
98
- '- NEVER include internal thinking process, conversational greetings, or closing text.\n\n' +
99
- `\`\`\`\n${code}\n\`\`\``;
100
- const result = await runner.execute(taskPrompt);
115
+ const detectedLang = language.toLowerCase() === 'auto' ? detectLanguage(code) : language;
116
+ const profile = getReviewProfile(detectedLang);
117
+ logger.info(`review_code: Using profile '${profile.name}' (requested: '${language}', resolved: '${detectedLang}')`);
118
+ const { taskPrompt, systemPrompt } = buildReviewPrompt(profile, code, focus);
119
+ const result = await runner.execute(taskPrompt, { system_prompt: systemPrompt });
101
120
  if (result.success) {
102
121
  return cleanReviewOutput(result.output);
103
122
  }
@@ -136,7 +155,7 @@ export async function askSubagent(router, prompt, model = 'auto') {
136
155
  return `Execution error (${runner.id}): ${result.error_message}`;
137
156
  }
138
157
  /** Review a source code file directly from disk — zero Claude token burn. */
139
- export async function reviewFile(router, filePath, focus = 'bugs, security, clean code, and performance') {
158
+ export async function reviewFile(router, filePath, focus = 'bugs, security, clean code, and performance', language = 'auto') {
140
159
  const { content: code, error } = readFileFromDisk(filePath);
141
160
  if (error || code === null) {
142
161
  return error ?? '❌ Could not read file.';
@@ -147,15 +166,11 @@ export async function reviewFile(router, filePath, focus = 'bugs, security, clea
147
166
  if (!runner) {
148
167
  return JSON.stringify({ error: 'No code review runner available. Check config.yaml' });
149
168
  }
150
- const taskPrompt = `Perform a comprehensive code review of **\`${resolvedName}\`** focusing on: ${focus}.\n\n` +
151
- 'Format the output strictly using the `# 🛡️ Code Review Report` template with Health Score, ' +
152
- 'Summary Table, 🚨 Blockers, ⚠️ Warnings, 💡 Suggestions, Commendations, and 🛠️ Verification Commands.\n\n' +
153
- 'STRICT RULES:\n' +
154
- '- Begin directly with `# 🛡️ Code Review Report`.\n' +
155
- '- NEVER output or rewrite the entire source code file.\n' +
156
- '- NEVER include internal thinking process, conversational greetings, or closing text.\n\n' +
157
- `\`\`\`\n${code}\n\`\`\``;
158
- const result = await runner.execute(taskPrompt);
169
+ const detectedLang = language.toLowerCase() === 'auto' ? detectLanguage(code, filePath) : language;
170
+ const profile = getReviewProfile(detectedLang);
171
+ logger.info(`review_file: Using profile '${profile.name}' for ${resolvedName} (requested: '${language}', resolved: '${detectedLang}')`);
172
+ const { taskPrompt, systemPrompt } = buildReviewPrompt(profile, code, focus, resolvedName);
173
+ const result = await runner.execute(taskPrompt, { system_prompt: systemPrompt });
159
174
  if (result.success) {
160
175
  return cleanReviewOutput(result.output);
161
176
  }
@@ -218,6 +233,64 @@ export async function explainFile(router, filePath, audience = 'mid-level engine
218
233
  }
219
234
  return `Code explanation failed: ${result.error_message}`;
220
235
  }
236
+ /** Perform an in-depth security audit and vulnerability assessment. */
237
+ export async function auditSecurity(router, code, focus = 'OWASP Top 10, CWE vulnerabilities, secrets, and auth flaws', language = 'auto') {
238
+ const runner = router.routeTask(`Perform security audit focusing on ${focus}`);
239
+ if (!runner) {
240
+ return JSON.stringify({ error: 'No security agent runner available. Check config.yaml' });
241
+ }
242
+ const detectedLang = language.toLowerCase() === 'auto' ? detectLanguage(code) : language;
243
+ const profile = getReviewProfile(detectedLang);
244
+ logger.info(`audit_security: Using profile '${profile.name}' (requested: '${language}', resolved: '${detectedLang}')`);
245
+ const taskPrompt = `Perform a rigorous security audit and vulnerability assessment of the provided code focusing on: ${focus}.\n\n` +
246
+ `Language Profile: ${profile.name}\n\n` +
247
+ 'Format your entire response strictly using the `# 🔒 Security Audit Report` template with Security Posture Score, ' +
248
+ 'Summary of Vulnerabilities table, 🚨 Critical & High Vulnerabilities (with CWE IDs and diffs), 🟡 Medium & Low Vulnerabilities, ' +
249
+ '🛡️ Security Hardening & Best Practices, and 🛠️ Security Verification & SAST Commands.\n\n' +
250
+ 'STRICT RULES:\n' +
251
+ '- Begin directly with `# 🔒 Security Audit Report`.\n' +
252
+ '- NEVER output or rewrite the entire source code file.\n' +
253
+ '- Provide syntactically valid remediation diffs with 1-2 lines of surrounding unchanged context.\n' +
254
+ '- Cite CWE numbers where applicable.\n\n' +
255
+ `\`\`\`\n${code}\n\`\`\``;
256
+ const result = await runner.execute(taskPrompt);
257
+ if (result.success) {
258
+ return cleanSecurityOutput(result.output);
259
+ }
260
+ return `Security audit failed: ${result.error_message}`;
261
+ }
262
+ /** Audit a source code file for security vulnerabilities directly from disk — zero Claude token burn. */
263
+ export async function auditFileSecurity(router, filePath, focus = 'OWASP Top 10, CWE vulnerabilities, secrets, and auth flaws', language = 'auto') {
264
+ const { content: code, error } = readFileFromDisk(filePath);
265
+ if (error || code === null) {
266
+ return error ?? '❌ Could not read file.';
267
+ }
268
+ const resolvedName = path.basename(filePath);
269
+ logger.info(`audit_file_security: Read ${code.length} chars from ${resolvedName}`);
270
+ const runner = router.routeTask(`Perform security audit focusing on ${focus}`);
271
+ if (!runner) {
272
+ return JSON.stringify({ error: 'No security agent runner available. Check config.yaml' });
273
+ }
274
+ const detectedLang = language.toLowerCase() === 'auto' ? detectLanguage(code, filePath) : language;
275
+ const profile = getReviewProfile(detectedLang);
276
+ logger.info(`audit_file_security: Using profile '${profile.name}' for ${resolvedName} (requested: '${language}', resolved: '${detectedLang}')`);
277
+ const taskPrompt = `Perform a rigorous security audit and vulnerability assessment of **\`${resolvedName}\`** focusing on: ${focus}.\n\n` +
278
+ `Language Profile: ${profile.name}\n\n` +
279
+ 'Format your entire response strictly using the `# 🔒 Security Audit Report` template with Security Posture Score, ' +
280
+ 'Summary of Vulnerabilities table, 🚨 Critical & High Vulnerabilities (with CWE IDs and diffs), 🟡 Medium & Low Vulnerabilities, ' +
281
+ '🛡️ Security Hardening & Best Practices, and 🛠️ Security Verification & SAST Commands.\n\n' +
282
+ 'STRICT RULES:\n' +
283
+ '- Begin directly with `# 🔒 Security Audit Report`.\n' +
284
+ '- NEVER output or rewrite the entire source code file.\n' +
285
+ '- Provide syntactically valid remediation diffs with 1-2 lines of surrounding unchanged context.\n' +
286
+ '- Cite CWE numbers where applicable.\n\n' +
287
+ `\`\`\`\n${code}\n\`\`\``;
288
+ const result = await runner.execute(taskPrompt);
289
+ if (result.success) {
290
+ return cleanSecurityOutput(result.output);
291
+ }
292
+ return `Security audit failed: ${result.error_message}`;
293
+ }
221
294
  /** List all registered runners and metadata. */
222
295
  export function listRunners(registry) {
223
296
  const metadata = registry.getRunnersMetadata();
@@ -269,6 +342,9 @@ export async function benchmarkRun(registry, engine, options) {
269
342
  const metadata = registry.getRunnersMetadata();
270
343
  targetRunnerIds = metadata.filter((r) => r.is_authenticated).map((r) => r.runner_id);
271
344
  if (targetRunnerIds.length === 0) {
345
+ // Kept as a fallback rather than an error: keyless runners (Ollama) are
346
+ // legitimately usable, so refusing here would break local-only setups.
347
+ logger.warning(`No authenticated runners; falling back to all registered runners. ${SETUP_HINT}`);
272
348
  targetRunnerIds = registry.registeredIds();
273
349
  }
274
350
  }
@@ -291,10 +367,18 @@ export function pluginConfigure(_args) {
291
367
  }
292
368
  export function pluginStatus(registry) {
293
369
  try {
370
+ const summary = summarizeCredentials(registry.getRunnersMetadata());
371
+ // "Configured" means a hosted provider can actually be reached. The old
372
+ // hardcoded `true` reported healthy with no credentials at all, and keying
373
+ // off `ready > 0` would too, since keyless Ollama runners always count.
374
+ const configured = !noProviderKeysConfigured(summary);
294
375
  return {
295
- configured: true,
376
+ configured,
296
377
  runners_available: registry.registeredIds().length,
297
- status: 'healthy',
378
+ runners_ready: summary.ready,
379
+ missing_env_vars: summary.missingEnvVars,
380
+ status: configured ? 'healthy' : 'unhealthy',
381
+ ...(configured ? {} : { hint: SETUP_HINT, missing_required: summary.missingRequired }),
298
382
  };
299
383
  }
300
384
  catch (err) {
@@ -310,11 +394,17 @@ export function pluginRemove() {
310
394
  }
311
395
  export function pluginHealthCheck(registry) {
312
396
  try {
397
+ const summary = summarizeCredentials(registry.getRunnersMetadata());
398
+ const configured = !noProviderKeysConfigured(summary);
313
399
  return {
314
- status: 'healthy',
400
+ // Credentials are part of health: a registry that loaded 25 runners it
401
+ // cannot authenticate is not a working install.
402
+ status: configured ? 'healthy' : 'unhealthy',
315
403
  details: {
316
- service: 'smartrelay-http',
404
+ service: 'smartrelay',
317
405
  runners_loaded: registry.registeredIds().length,
406
+ runners_ready: summary.ready,
407
+ ...(configured ? {} : { missing_required: summary.missingRequired, hint: SETUP_HINT }),
318
408
  },
319
409
  };
320
410
  }
@@ -326,6 +416,8 @@ export function pluginHealthCheck(registry) {
326
416
  }
327
417
  }
328
418
  export function pluginGetLogs(args) {
329
- return { logs: [], limit: args?.['limit'] ?? 50 };
419
+ const requested = args?.['limit'];
420
+ const limit = typeof requested === 'number' && Number.isFinite(requested) ? requested : 50;
421
+ return { logs: recentLogs(limit), limit };
330
422
  }
331
423
  //# sourceMappingURL=handlers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handlers.js","sourceRoot":"","sources":["../../src/tools/handlers.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts CHANGED
@@ -20,13 +20,46 @@ export declare function resolveUserPath(filePath: string): string;
20
20
  */
21
21
  export declare function findProjectRoot(startDir?: string): string;
22
22
  /**
23
- * Load variables from the first `.env` found in the current directory or the
24
- * project root. Existing environment variables always win.
23
+ * Directory holding SmartRelay's user-level state, `~/.smartrelay` by default.
24
+ *
25
+ * `SMARTRELAY_HOME` overrides it so tests can redirect the credential file to a
26
+ * temp dir without ever touching the developer's real home directory.
27
+ */
28
+ export declare function smartrelayHome(override?: string): string;
29
+ /** The global credential file written by `smartrelay setup`. */
30
+ export declare function globalEnvPath(homeOverride?: string): string;
31
+ /**
32
+ * Parse `.env` text into ordered key/value pairs.
33
+ *
34
+ * A `Map` rather than a plain object: insertion order is preserved and a key
35
+ * literally named `__proto__` cannot poison a prototype.
25
36
  *
26
37
  * Deliberately hand-rolled rather than delegating to a dotenv package so the
27
- * quote-stripping and precedence behavior stays identical to the Python original.
38
+ * quote-stripping behavior stays identical to the Python original. The setup
39
+ * wizard reuses this so the writer and the loader can never disagree about it.
40
+ */
41
+ export declare function parseEnvText(text: string): Map<string, string>;
42
+ /**
43
+ * Populate `process.env` from the `.env` files SmartRelay knows about.
44
+ *
45
+ * Precedence, highest first:
46
+ * 1. variables already in `process.env`
47
+ * 2. `<cwd>/.env` — project-local
48
+ * 3. `<project root>/.env`
49
+ * 4. `~/.smartrelay/.env` — written by `smartrelay setup`
50
+ *
51
+ * Every candidate is read, not just the first that exists: the global file is a
52
+ * fallback for keys a project never defines. Since the assignment below only
53
+ * fills in names that are still unset, reading the list in order produces that
54
+ * precedence for free.
55
+ *
56
+ * `cwd`/`home` exist only so tests can point at temp directories — `process.chdir`
57
+ * is process-global and unsafe across parallel test files.
28
58
  */
29
- export declare function loadDotEnv(): void;
59
+ export declare function loadDotEnv(options?: {
60
+ cwd?: string;
61
+ home?: string;
62
+ }): void;
30
63
  /** Counting semaphore, replacing `asyncio.Semaphore`. */
31
64
  export declare class Semaphore {
32
65
  private available;