@inkog-io/mcp 1.0.0 → 1.0.2
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/dist/api/client.d.ts +7 -6
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +28 -23
- package/dist/api/client.js.map +1 -1
- package/dist/api/types.d.ts +278 -135
- package/dist/api/types.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +22 -3
- package/dist/config.js.map +1 -1
- package/dist/tools/audit-a2a.d.ts.map +1 -1
- package/dist/tools/audit-a2a.js +219 -123
- package/dist/tools/audit-a2a.js.map +1 -1
- package/dist/tools/audit-mcp.d.ts.map +1 -1
- package/dist/tools/audit-mcp.js +114 -68
- package/dist/tools/audit-mcp.js.map +1 -1
- package/dist/tools/compliance.d.ts.map +1 -1
- package/dist/tools/compliance.js +199 -38
- package/dist/tools/compliance.js.map +1 -1
- package/dist/tools/explain.d.ts.map +1 -1
- package/dist/tools/explain.js +67 -42
- package/dist/tools/explain.js.map +1 -1
- package/dist/tools/governance.d.ts.map +1 -1
- package/dist/tools/governance.js +174 -39
- package/dist/tools/governance.js.map +1 -1
- package/dist/tools/mlbom.d.ts.map +1 -1
- package/dist/tools/mlbom.js +162 -142
- package/dist/tools/mlbom.js.map +1 -1
- package/dist/tools/scan.d.ts.map +1 -1
- package/dist/tools/scan.js +63 -10
- package/dist/tools/scan.js.map +1 -1
- package/package.json +1 -1
package/dist/tools/mlbom.js
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* Gartner-recommended capability for AI supply chain visibility.
|
|
15
15
|
*/
|
|
16
16
|
import { z } from 'zod';
|
|
17
|
-
import { getClient, InkogAuthError, InkogNetworkError } from '../api/client.js';
|
|
17
|
+
import { getClient, InkogApiError, InkogAuthError, InkogNetworkError, InkogRateLimitError, } from '../api/client.js';
|
|
18
18
|
import { getRelativePaths, readDirectory } from '../utils/file-reader.js';
|
|
19
19
|
// =============================================================================
|
|
20
20
|
// Schema
|
|
@@ -32,9 +32,6 @@ const MlbomArgsSchema = z.object({
|
|
|
32
32
|
.default(true)
|
|
33
33
|
.describe('Include known vulnerabilities for detected components'),
|
|
34
34
|
});
|
|
35
|
-
// =============================================================================
|
|
36
|
-
// Helpers
|
|
37
|
-
// =============================================================================
|
|
38
35
|
function formatComponentType(type) {
|
|
39
36
|
switch (type) {
|
|
40
37
|
case 'model':
|
|
@@ -48,71 +45,56 @@ function formatComponentType(type) {
|
|
|
48
45
|
case 'dependency':
|
|
49
46
|
return '📚 Dependency';
|
|
50
47
|
default:
|
|
51
|
-
return type
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
function formatSeverityIcon(severity) {
|
|
55
|
-
switch (severity) {
|
|
56
|
-
case 'CRITICAL':
|
|
57
|
-
return '🔴';
|
|
58
|
-
case 'HIGH':
|
|
59
|
-
return '🟠';
|
|
60
|
-
case 'MEDIUM':
|
|
61
|
-
return '🟡';
|
|
62
|
-
case 'LOW':
|
|
63
|
-
return '🟢';
|
|
64
|
-
default:
|
|
65
|
-
return '⚪';
|
|
48
|
+
return `📋 ${type}`;
|
|
66
49
|
}
|
|
67
50
|
}
|
|
68
|
-
function
|
|
69
|
-
|
|
70
|
-
|
|
51
|
+
function formatSummaryScore(summary) {
|
|
52
|
+
const total = summary.total_components;
|
|
53
|
+
if (total === 0) {
|
|
54
|
+
return '⚪ No components detected';
|
|
71
55
|
}
|
|
72
|
-
|
|
73
|
-
return
|
|
56
|
+
if (total <= 5) {
|
|
57
|
+
return `✅ ${total} components (minimal footprint)`;
|
|
74
58
|
}
|
|
75
|
-
|
|
76
|
-
return
|
|
59
|
+
if (total <= 15) {
|
|
60
|
+
return `🟢 ${total} components (moderate complexity)`;
|
|
77
61
|
}
|
|
78
|
-
|
|
79
|
-
return
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
return `🔴 ${score}/100 (Critical Risk)`;
|
|
62
|
+
if (total <= 30) {
|
|
63
|
+
return `🟡 ${total} components (elevated complexity)`;
|
|
83
64
|
}
|
|
65
|
+
return `🟠 ${total} components (high complexity)`;
|
|
84
66
|
}
|
|
85
67
|
function formatComponent(component, detailed) {
|
|
86
68
|
const typeLabel = formatComponentType(component.type);
|
|
87
69
|
let output = `${typeLabel}: ${component.name}`;
|
|
88
|
-
if (component.version
|
|
70
|
+
if (component.version) {
|
|
89
71
|
output += ` v${component.version}`;
|
|
90
72
|
}
|
|
91
73
|
output += '\n';
|
|
92
|
-
if (
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (component.line !== undefined) {
|
|
100
|
-
output += `:${component.line}`;
|
|
101
|
-
}
|
|
102
|
-
output += '\n';
|
|
103
|
-
if (detailed && component.properties !== undefined && Object.keys(component.properties).length > 0) {
|
|
104
|
-
output += ' Properties:\n';
|
|
105
|
-
for (const [key, value] of Object.entries(component.properties)) {
|
|
106
|
-
output += ` • ${key}: ${value}\n`;
|
|
74
|
+
if (detailed) {
|
|
75
|
+
if (component.supplier) {
|
|
76
|
+
output += ` Supplier: ${component.supplier.name}`;
|
|
77
|
+
if (component.supplier.url) {
|
|
78
|
+
output += ` (${component.supplier.url})`;
|
|
79
|
+
}
|
|
80
|
+
output += '\n';
|
|
107
81
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
82
|
+
if (component.licenses && component.licenses.length > 0) {
|
|
83
|
+
output += ` License: ${component.licenses.join(', ')}\n`;
|
|
84
|
+
}
|
|
85
|
+
if (component.description) {
|
|
86
|
+
output += ` Description: ${component.description}\n`;
|
|
87
|
+
}
|
|
88
|
+
if (component.properties && Object.keys(component.properties).length > 0) {
|
|
89
|
+
output += ' Properties:\n';
|
|
90
|
+
for (const [key, value] of Object.entries(component.properties)) {
|
|
91
|
+
output += ` • ${key}: ${value}\n`;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (component.external_refs && component.external_refs.length > 0) {
|
|
95
|
+
output += ' References:\n';
|
|
96
|
+
for (const ref of component.external_refs) {
|
|
97
|
+
output += ` • ${ref.type}: ${ref.url}\n`;
|
|
116
98
|
}
|
|
117
99
|
}
|
|
118
100
|
}
|
|
@@ -131,6 +113,14 @@ function groupComponentsByType(components) {
|
|
|
131
113
|
}
|
|
132
114
|
return groups;
|
|
133
115
|
}
|
|
116
|
+
function formatCompleteness(completeness) {
|
|
117
|
+
let output = '📊 Data Sources:\n';
|
|
118
|
+
output += ` From topology analysis: ${completeness.from_topology}\n`;
|
|
119
|
+
output += ` From findings analysis: ${completeness.from_findings}\n`;
|
|
120
|
+
output += ` Topology nodes scanned: ${completeness.topology_nodes}\n`;
|
|
121
|
+
output += ` Security findings: ${completeness.findings_count}\n`;
|
|
122
|
+
return output;
|
|
123
|
+
}
|
|
134
124
|
// =============================================================================
|
|
135
125
|
// Handler
|
|
136
126
|
// =============================================================================
|
|
@@ -165,114 +155,113 @@ async function mlbomHandler(rawArgs) {
|
|
|
165
155
|
}
|
|
166
156
|
// Get relative paths
|
|
167
157
|
const files = getRelativePaths(readResult.files, args.path);
|
|
168
|
-
// Call Inkog API
|
|
158
|
+
// Call Inkog API - first scan, then generate MLBOM
|
|
169
159
|
const client = getClient();
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
});
|
|
174
|
-
// If format is CycloneDX or SPDX, return the pre-formatted content
|
|
175
|
-
if (args.format !== 'json' && response.bomContent !== undefined) {
|
|
176
|
-
let output = '╔══════════════════════════════════════════════════════╗\n';
|
|
177
|
-
output += '║ 📋 ML Bill of Materials (MLBOM) ║\n';
|
|
178
|
-
output += '╚══════════════════════════════════════════════════════╝\n\n';
|
|
179
|
-
output += `📦 Format: ${args.format.toUpperCase()}\n`;
|
|
180
|
-
output += `📅 Generated: ${response.generatedAt}\n`;
|
|
181
|
-
output += `📊 Components: ${response.components.length}\n`;
|
|
182
|
-
output += `⚠️ Vulnerabilities: ${response.vulnerabilityCount}\n`;
|
|
183
|
-
output += `🔒 Risk Score: ${formatRiskScore(response.riskScore)}\n\n`;
|
|
184
|
-
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
185
|
-
output += `${args.format.toUpperCase()} Output:\n\n`;
|
|
186
|
-
output += '```' + (args.format === 'cyclonedx' ? 'json' : 'xml') + '\n';
|
|
187
|
-
output += response.bomContent + '\n';
|
|
188
|
-
output += '```\n';
|
|
160
|
+
// Step 1: Run a scan to get a scan_id
|
|
161
|
+
const scanResponse = await client.scan(files, { policy: 'balanced' });
|
|
162
|
+
if (!scanResponse.success || !scanResponse.scan_id) {
|
|
189
163
|
return {
|
|
190
164
|
content: [
|
|
191
165
|
{
|
|
192
166
|
type: 'text',
|
|
193
|
-
text:
|
|
167
|
+
text: 'Scan failed: Unable to analyze files',
|
|
194
168
|
},
|
|
195
169
|
],
|
|
170
|
+
isError: true,
|
|
196
171
|
};
|
|
197
172
|
}
|
|
198
|
-
//
|
|
173
|
+
// Step 2: Use scan_id to generate MLBOM
|
|
174
|
+
const response = await client.generateMlbom([], {
|
|
175
|
+
format: args.format,
|
|
176
|
+
includeVulnerabilities: args.include_vulnerabilities,
|
|
177
|
+
scanId: scanResponse.scan_id,
|
|
178
|
+
});
|
|
179
|
+
// Build header
|
|
199
180
|
let output = '╔══════════════════════════════════════════════════════╗\n';
|
|
200
181
|
output += '║ 📋 ML Bill of Materials (MLBOM) ║\n';
|
|
201
182
|
output += '╚══════════════════════════════════════════════════════╝\n\n';
|
|
202
|
-
output += `📦
|
|
203
|
-
output += `📅 Generated: ${response.
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
183
|
+
output += `📦 Format: ${response.format.toUpperCase()}\n`;
|
|
184
|
+
output += `📅 Generated: ${response.generated_at}\n`;
|
|
185
|
+
if (response.report_id) {
|
|
186
|
+
output += `🔗 Report ID: ${response.report_id}\n`;
|
|
187
|
+
}
|
|
188
|
+
// Summary statistics
|
|
189
|
+
output += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
210
190
|
output += '📊 COMPONENT SUMMARY\n\n';
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
output += `${formatComponentType(type)}: ${components.length}\n`;
|
|
191
|
+
output += formatSummaryScore(response.summary) + '\n\n';
|
|
192
|
+
if (response.summary.total_components > 0) {
|
|
193
|
+
if (response.summary.models > 0) {
|
|
194
|
+
output += ` 🧠 Models: ${response.summary.models}\n`;
|
|
216
195
|
}
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
// Detailed component list
|
|
220
|
-
if (response.components.length > 0) {
|
|
221
|
-
// Models first (most important)
|
|
222
|
-
if (groups.model !== undefined && groups.model.length > 0) {
|
|
223
|
-
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
224
|
-
output += '🧠 MODELS\n\n';
|
|
225
|
-
for (const component of groups.model) {
|
|
226
|
-
output += formatComponent(component, true) + '\n';
|
|
227
|
-
}
|
|
196
|
+
if (response.summary.frameworks > 0) {
|
|
197
|
+
output += ` 📦 Frameworks: ${response.summary.frameworks}\n`;
|
|
228
198
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
232
|
-
output += '🔧 TOOLS\n\n';
|
|
233
|
-
for (const component of groups.tool) {
|
|
234
|
-
output += formatComponent(component, true) + '\n';
|
|
235
|
-
}
|
|
199
|
+
if (response.summary.tools > 0) {
|
|
200
|
+
output += ` 🔧 Tools: ${response.summary.tools}\n`;
|
|
236
201
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
240
|
-
output += '💾 DATA SOURCES\n\n';
|
|
241
|
-
for (const component of groups['data-source']) {
|
|
242
|
-
output += formatComponent(component, true) + '\n';
|
|
243
|
-
}
|
|
202
|
+
if (response.summary.data_sources > 0) {
|
|
203
|
+
output += ` 💾 Data Sources: ${response.summary.data_sources}\n`;
|
|
244
204
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
248
|
-
output += '📦 FRAMEWORKS\n\n';
|
|
249
|
-
for (const component of groups.framework) {
|
|
250
|
-
output += formatComponent(component, false) + '\n';
|
|
251
|
-
}
|
|
205
|
+
if (response.summary.dependencies > 0) {
|
|
206
|
+
output += ` 📚 Dependencies: ${response.summary.dependencies}\n`;
|
|
252
207
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
208
|
+
}
|
|
209
|
+
// Warning if applicable
|
|
210
|
+
if (response.warning) {
|
|
211
|
+
output += '\n⚠️ WARNING: ' + response.warning + '\n';
|
|
212
|
+
}
|
|
213
|
+
// Completeness metrics if available
|
|
214
|
+
if (response.completeness) {
|
|
215
|
+
output += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
216
|
+
output += formatCompleteness(response.completeness);
|
|
217
|
+
}
|
|
218
|
+
// Handle different output formats
|
|
219
|
+
if (args.format !== 'json' && response.bom) {
|
|
220
|
+
// CycloneDX or SPDX format - show the structured BOM
|
|
221
|
+
output += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
222
|
+
output += `${args.format.toUpperCase()} Output:\n\n`;
|
|
223
|
+
output += '```json\n';
|
|
224
|
+
output += typeof response.bom === 'string'
|
|
225
|
+
? response.bom
|
|
226
|
+
: JSON.stringify(response.bom, null, 2);
|
|
227
|
+
output += '\n```\n';
|
|
228
|
+
}
|
|
229
|
+
else if (response.components && response.components.length > 0) {
|
|
230
|
+
// JSON format with detailed component list
|
|
231
|
+
const groups = groupComponentsByType(response.components);
|
|
232
|
+
const typeOrder = ['model', 'tool', 'data-source', 'framework', 'dependency'];
|
|
233
|
+
for (const type of typeOrder) {
|
|
234
|
+
const components = groups[type];
|
|
235
|
+
if (components && components.length > 0) {
|
|
236
|
+
output += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
237
|
+
switch (type) {
|
|
238
|
+
case 'model':
|
|
239
|
+
output += '🧠 MODELS\n\n';
|
|
240
|
+
break;
|
|
241
|
+
case 'tool':
|
|
242
|
+
output += '🔧 TOOLS\n\n';
|
|
243
|
+
break;
|
|
244
|
+
case 'data-source':
|
|
245
|
+
output += '💾 DATA SOURCES\n\n';
|
|
246
|
+
break;
|
|
247
|
+
case 'framework':
|
|
248
|
+
output += '📦 FRAMEWORKS\n\n';
|
|
249
|
+
break;
|
|
250
|
+
case 'dependency':
|
|
251
|
+
output += '📚 DEPENDENCIES\n\n';
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
// Show detailed info for models/tools, compact for dependencies
|
|
255
|
+
const showDetailed = type === 'model' || type === 'tool' || type === 'data-source';
|
|
256
|
+
for (const component of components) {
|
|
257
|
+
output += formatComponent(component, showDetailed) + '\n';
|
|
264
258
|
}
|
|
265
|
-
}
|
|
266
|
-
if (safeDeps.length > 0) {
|
|
267
|
-
output += 'Other Dependencies: ';
|
|
268
|
-
output += safeDeps.map((d) => `${d.name}${d.version !== undefined ? `@${d.version}` : ''}`).join(', ');
|
|
269
|
-
output += '\n';
|
|
270
259
|
}
|
|
271
260
|
}
|
|
272
261
|
}
|
|
273
|
-
// Footer
|
|
262
|
+
// Footer
|
|
274
263
|
output += '\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n';
|
|
275
|
-
output += '💡 TIP: Use format="cyclonedx"
|
|
264
|
+
output += '💡 TIP: Use format="cyclonedx" for SBOM compliance tooling\n';
|
|
276
265
|
output += 'MLBOM generation powered by Inkog AI Security Platform\n';
|
|
277
266
|
output += 'Learn more: https://inkog.io/mlbom\n';
|
|
278
267
|
return {
|
|
@@ -296,6 +285,17 @@ async function mlbomHandler(rawArgs) {
|
|
|
296
285
|
isError: true,
|
|
297
286
|
};
|
|
298
287
|
}
|
|
288
|
+
if (error instanceof InkogRateLimitError) {
|
|
289
|
+
return {
|
|
290
|
+
content: [
|
|
291
|
+
{
|
|
292
|
+
type: 'text',
|
|
293
|
+
text: `⏱️ Rate Limited\n\nToo many requests. Please retry after ${error.retryAfter} seconds.`,
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
isError: true,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
299
|
if (error instanceof InkogNetworkError) {
|
|
300
300
|
return {
|
|
301
301
|
content: [
|
|
@@ -307,7 +307,27 @@ async function mlbomHandler(rawArgs) {
|
|
|
307
307
|
isError: true,
|
|
308
308
|
};
|
|
309
309
|
}
|
|
310
|
-
|
|
310
|
+
if (error instanceof InkogApiError) {
|
|
311
|
+
return {
|
|
312
|
+
content: [
|
|
313
|
+
{
|
|
314
|
+
type: 'text',
|
|
315
|
+
text: `API error: ${error.message}${error.details ? `\n\nDetails: ${JSON.stringify(error.details)}` : ''}`,
|
|
316
|
+
},
|
|
317
|
+
],
|
|
318
|
+
isError: true,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
const message = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
322
|
+
return {
|
|
323
|
+
content: [
|
|
324
|
+
{
|
|
325
|
+
type: 'text',
|
|
326
|
+
text: `Error: ${message}`,
|
|
327
|
+
},
|
|
328
|
+
],
|
|
329
|
+
isError: true,
|
|
330
|
+
};
|
|
311
331
|
}
|
|
312
332
|
}
|
|
313
333
|
// =============================================================================
|
|
@@ -316,7 +336,7 @@ async function mlbomHandler(rawArgs) {
|
|
|
316
336
|
export const mlbomTool = {
|
|
317
337
|
tool: {
|
|
318
338
|
name: 'inkog_generate_mlbom',
|
|
319
|
-
description: 'Generate a Machine Learning Bill of Materials (MLBOM) for AI agents. Lists all models, tools, data sources, frameworks, and dependencies
|
|
339
|
+
description: 'Generate a Machine Learning Bill of Materials (MLBOM) for AI agents. Lists all models, tools, data sources, frameworks, and dependencies. Supports CycloneDX and SPDX formats for supply chain compliance.',
|
|
320
340
|
inputSchema: {
|
|
321
341
|
type: 'object',
|
|
322
342
|
properties: {
|
package/dist/tools/mlbom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mlbom.js","sourceRoot":"","sources":["../../src/tools/mlbom.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,
|
|
1
|
+
{"version":3,"file":"mlbom.js","sourceRoot":"","sources":["../../src/tools/mlbom.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/scan.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/tools/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/tools/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,YAAY,CAAC;AAmV7D,eAAO,MAAM,QAAQ,EAAE,cA+BtB,CAAC"}
|
package/dist/tools/scan.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - Missing governance controls
|
|
12
12
|
*/
|
|
13
13
|
import { z } from 'zod';
|
|
14
|
-
import { getClient, InkogAuthError, InkogNetworkError } from '../api/client.js';
|
|
14
|
+
import { getClient, InkogApiError, InkogAuthError, InkogNetworkError, InkogRateLimitError, } from '../api/client.js';
|
|
15
15
|
import { getRelativePaths, readDirectory } from '../utils/file-reader.js';
|
|
16
16
|
// =============================================================================
|
|
17
17
|
// Schema
|
|
@@ -58,6 +58,18 @@ function formatRiskTier(tier) {
|
|
|
58
58
|
return tier;
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
+
function formatGovernanceStatus(status) {
|
|
62
|
+
switch (status.toLowerCase()) {
|
|
63
|
+
case 'valid':
|
|
64
|
+
return '✅ Valid';
|
|
65
|
+
case 'invalid':
|
|
66
|
+
return '❌ Invalid';
|
|
67
|
+
case 'partial':
|
|
68
|
+
return '⚠️ Partial';
|
|
69
|
+
default:
|
|
70
|
+
return status;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
61
73
|
function formatFinding(finding, detailed) {
|
|
62
74
|
const icon = formatSeverityIcon(finding.severity);
|
|
63
75
|
const tierLabel = formatRiskTier(finding.riskTier);
|
|
@@ -166,14 +178,15 @@ async function scanHandler(rawArgs) {
|
|
|
166
178
|
};
|
|
167
179
|
}
|
|
168
180
|
// Build human-readable output
|
|
169
|
-
|
|
181
|
+
const findings = response.findings ?? [];
|
|
182
|
+
let output = formatSummary(findings, response.risk_score, response.files_scanned, args.policy);
|
|
170
183
|
// Add findings
|
|
171
|
-
if (
|
|
184
|
+
if (findings.length > 0) {
|
|
172
185
|
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
173
186
|
// Group by tier
|
|
174
|
-
const vulnerabilities =
|
|
175
|
-
const riskPatterns =
|
|
176
|
-
const hardening =
|
|
187
|
+
const vulnerabilities = findings.filter((f) => f.riskTier === 'vulnerability');
|
|
188
|
+
const riskPatterns = findings.filter((f) => f.riskTier === 'risk_pattern');
|
|
189
|
+
const hardening = findings.filter((f) => f.riskTier === 'hardening');
|
|
177
190
|
if (vulnerabilities.length > 0) {
|
|
178
191
|
output += '🔴 EXPLOITABLE VULNERABILITIES:\n\n';
|
|
179
192
|
for (const finding of vulnerabilities) {
|
|
@@ -194,11 +207,20 @@ async function scanHandler(rawArgs) {
|
|
|
194
207
|
}
|
|
195
208
|
}
|
|
196
209
|
// Add governance summary if available
|
|
197
|
-
|
|
210
|
+
const governance = response.governance;
|
|
211
|
+
if (governance) {
|
|
198
212
|
output += '━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n';
|
|
199
213
|
output += '🏛️ GOVERNANCE STATUS\n\n';
|
|
200
|
-
output += ` Governance Score: ${
|
|
201
|
-
output += `
|
|
214
|
+
output += ` Governance Score: ${governance.score}/100\n`;
|
|
215
|
+
output += ` Overall Status: ${formatGovernanceStatus(governance.overall_status)}\n`;
|
|
216
|
+
if (governance.declared_capabilities && governance.declared_capabilities.length > 0) {
|
|
217
|
+
const valid = governance.declared_capabilities.filter((c) => c.status === 'valid').length;
|
|
218
|
+
const violated = governance.declared_capabilities.filter((c) => c.status === 'violated').length;
|
|
219
|
+
output += ` Capabilities: ${valid} valid, ${violated} violated\n`;
|
|
220
|
+
}
|
|
221
|
+
if (governance.mismatches && governance.mismatches.length > 0) {
|
|
222
|
+
output += ` ⚠️ Mismatches detected: ${governance.mismatches.length}\n`;
|
|
223
|
+
}
|
|
202
224
|
}
|
|
203
225
|
return {
|
|
204
226
|
content: [
|
|
@@ -221,6 +243,17 @@ async function scanHandler(rawArgs) {
|
|
|
221
243
|
isError: true,
|
|
222
244
|
};
|
|
223
245
|
}
|
|
246
|
+
if (error instanceof InkogRateLimitError) {
|
|
247
|
+
return {
|
|
248
|
+
content: [
|
|
249
|
+
{
|
|
250
|
+
type: 'text',
|
|
251
|
+
text: `⏱️ Rate Limited\n\nToo many requests. Please retry after ${error.retryAfter} seconds.`,
|
|
252
|
+
},
|
|
253
|
+
],
|
|
254
|
+
isError: true,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
224
257
|
if (error instanceof InkogNetworkError) {
|
|
225
258
|
return {
|
|
226
259
|
content: [
|
|
@@ -232,7 +265,27 @@ async function scanHandler(rawArgs) {
|
|
|
232
265
|
isError: true,
|
|
233
266
|
};
|
|
234
267
|
}
|
|
235
|
-
|
|
268
|
+
if (error instanceof InkogApiError) {
|
|
269
|
+
return {
|
|
270
|
+
content: [
|
|
271
|
+
{
|
|
272
|
+
type: 'text',
|
|
273
|
+
text: `API error: ${error.message}${error.details ? `\n\nDetails: ${JSON.stringify(error.details)}` : ''}`,
|
|
274
|
+
},
|
|
275
|
+
],
|
|
276
|
+
isError: true,
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
const message = error instanceof Error ? error.message : 'Unknown error occurred';
|
|
280
|
+
return {
|
|
281
|
+
content: [
|
|
282
|
+
{
|
|
283
|
+
type: 'text',
|
|
284
|
+
text: `Error: ${message}`,
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
isError: true,
|
|
288
|
+
};
|
|
236
289
|
}
|
|
237
290
|
}
|
|
238
291
|
// =============================================================================
|
package/dist/tools/scan.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/tools/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/tools/scan.ts"],"names":[],"mappings":"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"}
|