hackmyagent 0.14.1 → 0.15.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/dist/.integrity-manifest.json +1 -1
- package/dist/arp/engine/event-engine.d.ts.map +1 -1
- package/dist/arp/engine/event-engine.js +8 -6
- package/dist/arp/engine/event-engine.js.map +1 -1
- package/dist/arp/intelligence/coordinator.d.ts.map +1 -1
- package/dist/arp/intelligence/coordinator.js +17 -12
- package/dist/arp/intelligence/coordinator.js.map +1 -1
- package/dist/arp/intelligence/nanomind-l1.js +2 -2
- package/dist/arp/intelligence/nanomind-l1.js.map +1 -1
- package/dist/arp/interceptors/process.d.ts.map +1 -1
- package/dist/arp/interceptors/process.js +40 -5
- package/dist/arp/interceptors/process.js.map +1 -1
- package/dist/arp/proxy/server.d.ts +6 -0
- package/dist/arp/proxy/server.d.ts.map +1 -1
- package/dist/arp/proxy/server.js +40 -14
- package/dist/arp/proxy/server.js.map +1 -1
- package/dist/arp/telemetry/gtin.d.ts +1 -1
- package/dist/arp/telemetry/gtin.d.ts.map +1 -1
- package/dist/arp/telemetry/gtin.js +4 -0
- package/dist/arp/telemetry/gtin.js.map +1 -1
- package/dist/attack/payloads/index.d.ts +2 -1
- package/dist/attack/payloads/index.d.ts.map +1 -1
- package/dist/attack/payloads/index.js +5 -1
- package/dist/attack/payloads/index.js.map +1 -1
- package/dist/attack/payloads/policy-enforcement-integrity.d.ts +13 -0
- package/dist/attack/payloads/policy-enforcement-integrity.d.ts.map +1 -0
- package/dist/attack/payloads/policy-enforcement-integrity.js +217 -0
- package/dist/attack/payloads/policy-enforcement-integrity.js.map +1 -0
- package/dist/attack/scanner.d.ts.map +1 -1
- package/dist/attack/scanner.js +1 -0
- package/dist/attack/scanner.js.map +1 -1
- package/dist/attack/types.d.ts +1 -1
- package/dist/attack/types.d.ts.map +1 -1
- package/dist/attack/types.js +5 -0
- package/dist/attack/types.js.map +1 -1
- package/dist/attack-engine/types.d.ts +1 -1
- package/dist/attack-engine/types.d.ts.map +1 -1
- package/dist/attack-engine/types.js.map +1 -1
- package/dist/cli.js +279 -20
- package/dist/cli.js.map +1 -1
- package/dist/hardening/scanner.d.ts +18 -4
- package/dist/hardening/scanner.d.ts.map +1 -1
- package/dist/hardening/scanner.js +76 -18
- package/dist/hardening/scanner.js.map +1 -1
- package/dist/nanomind-core/inference/tme-classifier.d.ts.map +1 -1
- package/dist/nanomind-core/inference/tme-classifier.js +0 -1
- package/dist/nanomind-core/inference/tme-classifier.js.map +1 -1
- package/dist/nanomind-core/scanner-bridge.d.ts.map +1 -1
- package/dist/nanomind-core/scanner-bridge.js +8 -0
- package/dist/nanomind-core/scanner-bridge.js.map +1 -1
- package/package.json +1 -1
- package/dist/abgr/controls.d.ts +0 -35
- package/dist/abgr/controls.d.ts.map +0 -1
- package/dist/abgr/controls.js +0 -1058
- package/dist/abgr/controls.js.map +0 -1
- package/dist/abgr/detector.d.ts +0 -45
- package/dist/abgr/detector.d.ts.map +0 -1
- package/dist/abgr/detector.js +0 -175
- package/dist/abgr/detector.js.map +0 -1
- package/dist/abgr/index.d.ts +0 -24
- package/dist/abgr/index.d.ts.map +0 -1
- package/dist/abgr/index.js +0 -50
- package/dist/abgr/index.js.map +0 -1
- package/dist/abgr/scorer.d.ts +0 -36
- package/dist/abgr/scorer.d.ts.map +0 -1
- package/dist/abgr/scorer.js +0 -205
- package/dist/abgr/scorer.js.map +0 -1
- package/dist/abgr/templates.d.ts +0 -35
- package/dist/abgr/templates.d.ts.map +0 -1
- package/dist/abgr/templates.js +0 -668
- package/dist/abgr/templates.js.map +0 -1
- package/dist/abgr/tier.d.ts +0 -27
- package/dist/abgr/tier.d.ts.map +0 -1
- package/dist/abgr/tier.js +0 -115
- package/dist/abgr/tier.js.map +0 -1
- package/dist/abgr/types.d.ts +0 -59
- package/dist/abgr/types.d.ts.map +0 -1
- package/dist/abgr/types.js +0 -10
- package/dist/abgr/types.js.map +0 -1
- package/dist/agent-scan/checks.d.ts +0 -6
- package/dist/agent-scan/checks.d.ts.map +0 -1
- package/dist/agent-scan/checks.js +0 -93
- package/dist/agent-scan/checks.js.map +0 -1
- package/dist/agent-scan/index.d.ts +0 -10
- package/dist/agent-scan/index.d.ts.map +0 -1
- package/dist/agent-scan/index.js +0 -16
- package/dist/agent-scan/index.js.map +0 -1
- package/dist/agent-scan/scanner.d.ts +0 -31
- package/dist/agent-scan/scanner.d.ts.map +0 -1
- package/dist/agent-scan/scanner.js +0 -484
- package/dist/agent-scan/scanner.js.map +0 -1
- package/dist/agent-scan/types.d.ts +0 -63
- package/dist/agent-scan/types.d.ts.map +0 -1
- package/dist/agent-scan/types.js +0 -10
- package/dist/agent-scan/types.js.map +0 -1
- package/dist/hardening/llm-checks.d.ts +0 -18
- package/dist/hardening/llm-checks.d.ts.map +0 -1
- package/dist/hardening/llm-checks.js +0 -434
- package/dist/hardening/llm-checks.js.map +0 -1
- package/dist/hardening/mcp-tool-enum.d.ts +0 -45
- package/dist/hardening/mcp-tool-enum.d.ts.map +0 -1
- package/dist/hardening/mcp-tool-enum.js +0 -315
- package/dist/hardening/mcp-tool-enum.js.map +0 -1
- package/dist/hardening/shell-checks.d.ts +0 -21
- package/dist/hardening/shell-checks.d.ts.map +0 -1
- package/dist/hardening/shell-checks.js +0 -236
- package/dist/hardening/shell-checks.js.map +0 -1
- package/dist/nanomind-core/telemetry/auto-update.d.ts +0 -27
- package/dist/nanomind-core/telemetry/auto-update.d.ts.map +0 -1
- package/dist/nanomind-core/telemetry/auto-update.js +0 -129
- package/dist/nanomind-core/telemetry/auto-update.js.map +0 -1
- package/dist/nanomind-core/telemetry/client.d.ts +0 -66
- package/dist/nanomind-core/telemetry/client.d.ts.map +0 -1
- package/dist/nanomind-core/telemetry/client.js +0 -123
- package/dist/nanomind-core/telemetry/client.js.map +0 -1
- package/dist/nanomind-core/telemetry/config.d.ts +0 -33
- package/dist/nanomind-core/telemetry/config.d.ts.map +0 -1
- package/dist/nanomind-core/telemetry/config.js +0 -119
- package/dist/nanomind-core/telemetry/config.js.map +0 -1
- package/dist/nanomind-core/telemetry/index.d.ts +0 -15
- package/dist/nanomind-core/telemetry/index.d.ts.map +0 -1
- package/dist/nanomind-core/telemetry/index.js +0 -27
- package/dist/nanomind-core/telemetry/index.js.map +0 -1
- package/dist/registry/contribution.d.ts +0 -178
- package/dist/registry/contribution.d.ts.map +0 -1
- package/dist/registry/contribution.js +0 -272
- package/dist/registry/contribution.js.map +0 -1
|
@@ -1,315 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* MCP Tool Enumeration (MCPTOOL-001 to MCPTOOL-005)
|
|
4
|
-
*
|
|
5
|
-
* Connects to configured MCP servers, discovers their tools via JSON-RPC,
|
|
6
|
-
* and classifies dangerous capabilities. Only runs with --deep or --live-mcp flag.
|
|
7
|
-
*/
|
|
8
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
-
if (k2 === undefined) k2 = k;
|
|
10
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
-
}
|
|
14
|
-
Object.defineProperty(o, k2, desc);
|
|
15
|
-
}) : (function(o, m, k, k2) {
|
|
16
|
-
if (k2 === undefined) k2 = k;
|
|
17
|
-
o[k2] = m[k];
|
|
18
|
-
}));
|
|
19
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
-
}) : function(o, v) {
|
|
22
|
-
o["default"] = v;
|
|
23
|
-
});
|
|
24
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
-
var ownKeys = function(o) {
|
|
26
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
-
var ar = [];
|
|
28
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
-
return ar;
|
|
30
|
-
};
|
|
31
|
-
return ownKeys(o);
|
|
32
|
-
};
|
|
33
|
-
return function (mod) {
|
|
34
|
-
if (mod && mod.__esModule) return mod;
|
|
35
|
-
var result = {};
|
|
36
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
-
__setModuleDefault(result, mod);
|
|
38
|
-
return result;
|
|
39
|
-
};
|
|
40
|
-
})();
|
|
41
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
-
exports.discoverMcpConfigs = discoverMcpConfigs;
|
|
43
|
-
exports.enumerateStdioTools = enumerateStdioTools;
|
|
44
|
-
exports.classifyTools = classifyTools;
|
|
45
|
-
exports.checkMcpToolEnumeration = checkMcpToolEnumeration;
|
|
46
|
-
const child_process_1 = require("child_process");
|
|
47
|
-
const fs = __importStar(require("fs/promises"));
|
|
48
|
-
const path = __importStar(require("path"));
|
|
49
|
-
const os = __importStar(require("os"));
|
|
50
|
-
// Dangerous capability classification
|
|
51
|
-
const EXECUTION_TOOLS = new Set([
|
|
52
|
-
'execute_command', 'bash', 'shell', 'run_command', 'exec',
|
|
53
|
-
'run_script', 'terminal', 'execute', 'run', 'system',
|
|
54
|
-
'execute_shell', 'run_shell', 'subprocess',
|
|
55
|
-
]);
|
|
56
|
-
const FILESYSTEM_WRITE_TOOLS = new Set([
|
|
57
|
-
'write_file', 'create_file', 'delete_file', 'edit_file',
|
|
58
|
-
'write', 'remove_file', 'mkdir', 'rename_file', 'move_file',
|
|
59
|
-
'append_file', 'overwrite_file', 'file_write',
|
|
60
|
-
]);
|
|
61
|
-
const NETWORK_TOOLS = new Set([
|
|
62
|
-
'fetch', 'http_request', 'curl', 'wget', 'request',
|
|
63
|
-
'http_get', 'http_post', 'web_request', 'send_request',
|
|
64
|
-
'make_request', 'api_call',
|
|
65
|
-
]);
|
|
66
|
-
const CREDENTIAL_TOOLS = new Set([
|
|
67
|
-
'get_secret', 'read_env', 'get_credential', 'get_password',
|
|
68
|
-
'read_secret', 'fetch_secret', 'env_var', 'get_token',
|
|
69
|
-
'read_keychain', 'get_api_key',
|
|
70
|
-
]);
|
|
71
|
-
const SPAWN_TIMEOUT_MS = 5000;
|
|
72
|
-
const JSON_RPC_VERSION = '2.0';
|
|
73
|
-
/**
|
|
74
|
-
* Discover MCP server configurations from known config file locations.
|
|
75
|
-
*/
|
|
76
|
-
async function discoverMcpConfigs(targetDir) {
|
|
77
|
-
const configs = new Map();
|
|
78
|
-
const configPaths = [
|
|
79
|
-
path.join(targetDir, 'mcp.json'),
|
|
80
|
-
path.join(targetDir, '.cursor', 'mcp.json'),
|
|
81
|
-
path.join(targetDir, '.vscode', 'mcp.json'),
|
|
82
|
-
path.join(os.homedir(), '.claude', 'settings.json'),
|
|
83
|
-
];
|
|
84
|
-
for (const configPath of configPaths) {
|
|
85
|
-
try {
|
|
86
|
-
const content = await fs.readFile(configPath, 'utf-8');
|
|
87
|
-
const parsed = JSON.parse(content);
|
|
88
|
-
// Handle different config formats
|
|
89
|
-
const servers = parsed.mcpServers || parsed.servers || {};
|
|
90
|
-
for (const [name, serverConfig] of Object.entries(servers)) {
|
|
91
|
-
const config = serverConfig;
|
|
92
|
-
if (config.command || config.url) {
|
|
93
|
-
configs.set(name, {
|
|
94
|
-
config: {
|
|
95
|
-
command: config.command,
|
|
96
|
-
args: config.args,
|
|
97
|
-
env: config.env,
|
|
98
|
-
url: config.url,
|
|
99
|
-
},
|
|
100
|
-
configPath,
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch {
|
|
106
|
-
// Config file doesn't exist or is invalid, skip
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return configs;
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Connect to a stdio MCP server and enumerate its tools.
|
|
113
|
-
*/
|
|
114
|
-
async function enumerateStdioTools(serverName, config) {
|
|
115
|
-
return new Promise((resolve) => {
|
|
116
|
-
let child = null;
|
|
117
|
-
let buffer = '';
|
|
118
|
-
let resolved = false;
|
|
119
|
-
const cleanup = () => {
|
|
120
|
-
if (child && !child.killed) {
|
|
121
|
-
child.kill('SIGTERM');
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
const finish = (result) => {
|
|
125
|
-
if (!resolved) {
|
|
126
|
-
resolved = true;
|
|
127
|
-
cleanup();
|
|
128
|
-
resolve(result);
|
|
129
|
-
}
|
|
130
|
-
};
|
|
131
|
-
// Timeout
|
|
132
|
-
const timer = setTimeout(() => {
|
|
133
|
-
finish({ serverName, configPath: '', tools: [], error: 'Timeout after 5s' });
|
|
134
|
-
}, SPAWN_TIMEOUT_MS);
|
|
135
|
-
try {
|
|
136
|
-
child = (0, child_process_1.spawn)(config.command, config.args || [], {
|
|
137
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
138
|
-
env: { ...process.env, ...config.env },
|
|
139
|
-
});
|
|
140
|
-
child.on('error', (err) => {
|
|
141
|
-
clearTimeout(timer);
|
|
142
|
-
finish({ serverName, configPath: '', tools: [], error: err.message });
|
|
143
|
-
});
|
|
144
|
-
child.stdout?.on('data', (data) => {
|
|
145
|
-
buffer += data.toString();
|
|
146
|
-
// Try to parse JSON-RPC responses
|
|
147
|
-
const lines = buffer.split('\n');
|
|
148
|
-
for (const line of lines) {
|
|
149
|
-
const trimmed = line.trim();
|
|
150
|
-
if (!trimmed)
|
|
151
|
-
continue;
|
|
152
|
-
try {
|
|
153
|
-
const msg = JSON.parse(trimmed);
|
|
154
|
-
// Response to initialize
|
|
155
|
-
if (msg.id === 1 && msg.result) {
|
|
156
|
-
// Send tools/list
|
|
157
|
-
const toolsRequest = JSON.stringify({
|
|
158
|
-
jsonrpc: JSON_RPC_VERSION,
|
|
159
|
-
id: 2,
|
|
160
|
-
method: 'tools/list',
|
|
161
|
-
params: {},
|
|
162
|
-
}) + '\n';
|
|
163
|
-
child?.stdin?.write(toolsRequest);
|
|
164
|
-
}
|
|
165
|
-
// Response to tools/list
|
|
166
|
-
if (msg.id === 2 && msg.result) {
|
|
167
|
-
clearTimeout(timer);
|
|
168
|
-
const tools = (msg.result.tools || []).map((t) => ({
|
|
169
|
-
name: t.name,
|
|
170
|
-
description: t.description,
|
|
171
|
-
inputSchema: t.inputSchema,
|
|
172
|
-
}));
|
|
173
|
-
finish({ serverName, configPath: '', tools });
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
catch {
|
|
177
|
-
// Not valid JSON, skip
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
// Keep only the last incomplete line in buffer
|
|
181
|
-
buffer = lines[lines.length - 1] || '';
|
|
182
|
-
});
|
|
183
|
-
// Send initialize request
|
|
184
|
-
const initRequest = JSON.stringify({
|
|
185
|
-
jsonrpc: JSON_RPC_VERSION,
|
|
186
|
-
id: 1,
|
|
187
|
-
method: 'initialize',
|
|
188
|
-
params: {
|
|
189
|
-
protocolVersion: '2024-11-05',
|
|
190
|
-
capabilities: {},
|
|
191
|
-
clientInfo: { name: 'hackmyagent-scanner', version: '0.8.0' },
|
|
192
|
-
},
|
|
193
|
-
}) + '\n';
|
|
194
|
-
child.stdin?.write(initRequest);
|
|
195
|
-
}
|
|
196
|
-
catch (err) {
|
|
197
|
-
clearTimeout(timer);
|
|
198
|
-
finish({ serverName, configPath: '', tools: [], error: err.message });
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* Classify tool capabilities and generate security findings.
|
|
204
|
-
*/
|
|
205
|
-
function classifyTools(serverName, configPath, tools) {
|
|
206
|
-
const findings = [];
|
|
207
|
-
// MCPTOOL-001: Execution tools
|
|
208
|
-
const execTools = tools.filter((t) => EXECUTION_TOOLS.has(t.name.toLowerCase()));
|
|
209
|
-
if (execTools.length > 0) {
|
|
210
|
-
findings.push({
|
|
211
|
-
checkId: 'MCPTOOL-001',
|
|
212
|
-
name: 'MCP server exposes command execution',
|
|
213
|
-
description: `MCP server "${serverName}" provides tools that can execute arbitrary commands: ${execTools.map((t) => t.name).join(', ')}. This allows the AI to run any system command.`,
|
|
214
|
-
category: 'mcp-capability',
|
|
215
|
-
severity: 'critical',
|
|
216
|
-
passed: false,
|
|
217
|
-
message: `${serverName}: ${execTools.length} execution tool(s) exposed`,
|
|
218
|
-
fixable: false,
|
|
219
|
-
file: configPath,
|
|
220
|
-
fix: 'Restrict command execution tools or add an allowlist of permitted commands.',
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
// MCPTOOL-002: Filesystem write tools
|
|
224
|
-
const fsWriteTools = tools.filter((t) => FILESYSTEM_WRITE_TOOLS.has(t.name.toLowerCase()));
|
|
225
|
-
if (fsWriteTools.length > 0) {
|
|
226
|
-
findings.push({
|
|
227
|
-
checkId: 'MCPTOOL-002',
|
|
228
|
-
name: 'MCP server exposes filesystem write',
|
|
229
|
-
description: `MCP server "${serverName}" provides tools that can write/delete files: ${fsWriteTools.map((t) => t.name).join(', ')}. This allows modifying system files.`,
|
|
230
|
-
category: 'mcp-capability',
|
|
231
|
-
severity: 'high',
|
|
232
|
-
passed: false,
|
|
233
|
-
message: `${serverName}: ${fsWriteTools.length} filesystem write tool(s) exposed`,
|
|
234
|
-
fixable: false,
|
|
235
|
-
file: configPath,
|
|
236
|
-
fix: 'Add path restrictions to filesystem write tools.',
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
// MCPTOOL-003: Unrestricted network tools
|
|
240
|
-
const netTools = tools.filter((t) => NETWORK_TOOLS.has(t.name.toLowerCase()));
|
|
241
|
-
if (netTools.length > 0) {
|
|
242
|
-
findings.push({
|
|
243
|
-
checkId: 'MCPTOOL-003',
|
|
244
|
-
name: 'MCP server exposes unrestricted network access',
|
|
245
|
-
description: `MCP server "${serverName}" provides tools for network requests: ${netTools.map((t) => t.name).join(', ')}. This allows data exfiltration.`,
|
|
246
|
-
category: 'mcp-capability',
|
|
247
|
-
severity: 'high',
|
|
248
|
-
passed: false,
|
|
249
|
-
message: `${serverName}: ${netTools.length} network tool(s) exposed`,
|
|
250
|
-
fixable: false,
|
|
251
|
-
file: configPath,
|
|
252
|
-
fix: 'Restrict network access to specific domains or add an allowlist.',
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
// MCPTOOL-004: Credential-accessing tools
|
|
256
|
-
const credTools = tools.filter((t) => CREDENTIAL_TOOLS.has(t.name.toLowerCase()));
|
|
257
|
-
if (credTools.length > 0) {
|
|
258
|
-
findings.push({
|
|
259
|
-
checkId: 'MCPTOOL-004',
|
|
260
|
-
name: 'MCP server exposes credential access',
|
|
261
|
-
description: `MCP server "${serverName}" provides tools that access credentials: ${credTools.map((t) => t.name).join(', ')}.`,
|
|
262
|
-
category: 'mcp-capability',
|
|
263
|
-
severity: 'critical',
|
|
264
|
-
passed: false,
|
|
265
|
-
message: `${serverName}: ${credTools.length} credential-accessing tool(s) exposed`,
|
|
266
|
-
fixable: false,
|
|
267
|
-
file: configPath,
|
|
268
|
-
fix: 'Remove credential access tools or use secretless-ai broker for credential isolation.',
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
// MCPTOOL-005: Server with 10+ tools and no apparent access control
|
|
272
|
-
if (tools.length >= 10) {
|
|
273
|
-
findings.push({
|
|
274
|
-
checkId: 'MCPTOOL-005',
|
|
275
|
-
name: 'MCP server exposes excessive tools',
|
|
276
|
-
description: `MCP server "${serverName}" exposes ${tools.length} tools. Large tool surfaces increase the attack area for prompt injection.`,
|
|
277
|
-
category: 'mcp-capability',
|
|
278
|
-
severity: 'medium',
|
|
279
|
-
passed: false,
|
|
280
|
-
message: `${serverName}: ${tools.length} tools exposed (threshold: 10)`,
|
|
281
|
-
fixable: false,
|
|
282
|
-
file: configPath,
|
|
283
|
-
fix: 'Reduce the number of exposed tools or implement per-tool access controls.',
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
return findings;
|
|
287
|
-
}
|
|
288
|
-
/**
|
|
289
|
-
* Run full MCP tool enumeration scan.
|
|
290
|
-
* Discovers MCP configs, connects to each server, enumerates tools, classifies dangers.
|
|
291
|
-
*/
|
|
292
|
-
async function checkMcpToolEnumeration(targetDir, onProgress) {
|
|
293
|
-
const findings = [];
|
|
294
|
-
const configs = await discoverMcpConfigs(targetDir);
|
|
295
|
-
if (configs.size === 0)
|
|
296
|
-
return findings;
|
|
297
|
-
onProgress?.(`Found ${configs.size} MCP server(s), enumerating tools...`);
|
|
298
|
-
for (const [serverName, { config, configPath }] of configs) {
|
|
299
|
-
onProgress?.(`Scanning ${serverName}...`);
|
|
300
|
-
if (config.command) {
|
|
301
|
-
const result = await enumerateStdioTools(serverName, config);
|
|
302
|
-
if (result.error) {
|
|
303
|
-
// Non-fatal: server couldn't be reached
|
|
304
|
-
onProgress?.(` ${serverName}: ${result.error}`);
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
const serverFindings = classifyTools(serverName, configPath, result.tools);
|
|
308
|
-
findings.push(...serverFindings);
|
|
309
|
-
onProgress?.(` ${serverName}: ${result.tools.length} tools, ${serverFindings.length} findings`);
|
|
310
|
-
}
|
|
311
|
-
// SSE servers would go here (future)
|
|
312
|
-
}
|
|
313
|
-
return findings;
|
|
314
|
-
}
|
|
315
|
-
//# sourceMappingURL=mcp-tool-enum.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-tool-enum.js","sourceRoot":"","sources":["../../src/hardening/mcp-tool-enum.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shell environment and history scanning checks.
|
|
3
|
-
* Scans ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv for exported secrets
|
|
4
|
-
* and ~/.bash_history, ~/.zsh_history for credentials in command history.
|
|
5
|
-
*/
|
|
6
|
-
import type { SecurityFinding } from './security-check';
|
|
7
|
-
export declare const SHELL_CREDENTIAL_PATTERNS: {
|
|
8
|
-
name: string;
|
|
9
|
-
pattern: RegExp;
|
|
10
|
-
}[];
|
|
11
|
-
/**
|
|
12
|
-
* Scan shell environment config files for exported secrets.
|
|
13
|
-
* Checks ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv
|
|
14
|
-
*/
|
|
15
|
-
export declare function checkShellEnvironment(): Promise<SecurityFinding[]>;
|
|
16
|
-
/**
|
|
17
|
-
* Scan shell history files for credentials.
|
|
18
|
-
* Checks ~/.bash_history, ~/.zsh_history (last 10K lines)
|
|
19
|
-
*/
|
|
20
|
-
export declare function checkShellHistory(): Promise<SecurityFinding[]>;
|
|
21
|
-
//# sourceMappingURL=shell-checks.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shell-checks.d.ts","sourceRoot":"","sources":["../../src/hardening/shell-checks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,kBAAkB,CAAC;AAGlE,eAAO,MAAM,yBAAyB;;;GAerC,CAAC;AAiBF;;;GAGG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CA4DxE;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAiFpE"}
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Shell environment and history scanning checks.
|
|
4
|
-
* Scans ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv for exported secrets
|
|
5
|
-
* and ~/.bash_history, ~/.zsh_history for credentials in command history.
|
|
6
|
-
*/
|
|
7
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
-
if (k2 === undefined) k2 = k;
|
|
9
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
-
}
|
|
13
|
-
Object.defineProperty(o, k2, desc);
|
|
14
|
-
}) : (function(o, m, k, k2) {
|
|
15
|
-
if (k2 === undefined) k2 = k;
|
|
16
|
-
o[k2] = m[k];
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.SHELL_CREDENTIAL_PATTERNS = void 0;
|
|
42
|
-
exports.checkShellEnvironment = checkShellEnvironment;
|
|
43
|
-
exports.checkShellHistory = checkShellHistory;
|
|
44
|
-
const fs = __importStar(require("fs/promises"));
|
|
45
|
-
const path = __importStar(require("path"));
|
|
46
|
-
const os = __importStar(require("os"));
|
|
47
|
-
// Credential patterns to detect in shell files and LLM configs
|
|
48
|
-
exports.SHELL_CREDENTIAL_PATTERNS = [
|
|
49
|
-
{ name: 'ANTHROPIC_API_KEY', pattern: /sk-ant-api\d{2}-[a-zA-Z0-9_-]{20,}/ },
|
|
50
|
-
{ name: 'OPENAI_API_KEY', pattern: /sk-proj-[a-zA-Z0-9]{20,}/ },
|
|
51
|
-
{ name: 'OPENAI_API_KEY', pattern: /sk-[a-zA-Z0-9]{48,}/ },
|
|
52
|
-
{ name: 'AWS_ACCESS_KEY', pattern: /AKIA[0-9A-Z]{16}/ },
|
|
53
|
-
{ name: 'GITHUB_TOKEN', pattern: /ghp_[a-zA-Z0-9]{36}/ },
|
|
54
|
-
{ name: 'GITHUB_TOKEN', pattern: /github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}/ },
|
|
55
|
-
{ name: 'SLACK_TOKEN', pattern: /xox[baprs]-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}/ },
|
|
56
|
-
{ name: 'GOOGLE_API_KEY', pattern: /AIza[0-9A-Za-z_-]{35}/ },
|
|
57
|
-
{ name: 'STRIPE_KEY', pattern: /sk_live_[0-9a-zA-Z]{24,}/ },
|
|
58
|
-
{ name: 'SENDGRID_KEY', pattern: /SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43}/ },
|
|
59
|
-
{ name: 'OPENROUTER_KEY', pattern: /sk-or-v1-[a-zA-Z0-9]{48,}/ },
|
|
60
|
-
{ name: 'GROQ_KEY', pattern: /gsk_[a-zA-Z0-9]{20,}/ },
|
|
61
|
-
{ name: 'REPLICATE_TOKEN', pattern: /r8_[a-zA-Z0-9]{20,}/ },
|
|
62
|
-
{ name: 'HUGGINGFACE_TOKEN', pattern: /hf_[a-zA-Z0-9]{20,}/ },
|
|
63
|
-
];
|
|
64
|
-
// Command-line patterns that indicate credentials passed as arguments
|
|
65
|
-
const COMMAND_CREDENTIAL_PATTERNS = [
|
|
66
|
-
/curl\s+[^\n]*-H\s*["']Authorization:\s*Bearer\s+\S{20,}["']/i,
|
|
67
|
-
/curl\s+[^\n]*-H\s*["']x-api-key:\s*\S{20,}["']/i,
|
|
68
|
-
/--api[_-]?key[=\s]+\S{20,}/i,
|
|
69
|
-
/--token[=\s]+\S{20,}/i,
|
|
70
|
-
/--secret[=\s]+\S{20,}/i,
|
|
71
|
-
/--password[=\s]+\S{10,}/i,
|
|
72
|
-
];
|
|
73
|
-
const SHELL_CONFIG_FILES = ['.bashrc', '.zshrc', '.profile', '.zshenv'];
|
|
74
|
-
const HISTORY_FILES = ['.bash_history', '.zsh_history'];
|
|
75
|
-
const MAX_HISTORY_LINES = 10000;
|
|
76
|
-
const MAX_LINE_LENGTH = 10000;
|
|
77
|
-
/**
|
|
78
|
-
* Scan shell environment config files for exported secrets.
|
|
79
|
-
* Checks ~/.bashrc, ~/.zshrc, ~/.profile, ~/.zshenv
|
|
80
|
-
*/
|
|
81
|
-
async function checkShellEnvironment() {
|
|
82
|
-
const findings = [];
|
|
83
|
-
const homeDir = os.homedir();
|
|
84
|
-
for (const configFile of SHELL_CONFIG_FILES) {
|
|
85
|
-
const filePath = path.join(homeDir, configFile);
|
|
86
|
-
let content;
|
|
87
|
-
try {
|
|
88
|
-
content = await fs.readFile(filePath, 'utf-8');
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
continue; // File doesn't exist, skip
|
|
92
|
-
}
|
|
93
|
-
const lines = content.split('\n');
|
|
94
|
-
for (let i = 0; i < lines.length; i++) {
|
|
95
|
-
const line = lines[i];
|
|
96
|
-
// Skip empty lines and lines over max length
|
|
97
|
-
if (!line || line.length > MAX_LINE_LENGTH)
|
|
98
|
-
continue;
|
|
99
|
-
// Skip comment lines
|
|
100
|
-
if (/^\s*#/.test(line))
|
|
101
|
-
continue;
|
|
102
|
-
// Skip env var references (${VAR} or $VAR without a literal value)
|
|
103
|
-
if (/\$\{[A-Z_]+\}/.test(line) || /\$[A-Z_]+/.test(line)) {
|
|
104
|
-
// But only skip if there's no literal credential pattern
|
|
105
|
-
let hasCredential = false;
|
|
106
|
-
for (const { pattern } of exports.SHELL_CREDENTIAL_PATTERNS) {
|
|
107
|
-
if (pattern.test(line)) {
|
|
108
|
-
hasCredential = true;
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (!hasCredential)
|
|
113
|
-
continue;
|
|
114
|
-
}
|
|
115
|
-
for (const { name, pattern } of exports.SHELL_CREDENTIAL_PATTERNS) {
|
|
116
|
-
if (pattern.test(line)) {
|
|
117
|
-
const checkId = getShellCheckId(name);
|
|
118
|
-
findings.push({
|
|
119
|
-
checkId,
|
|
120
|
-
name: `Exposed ${name} in shell config`,
|
|
121
|
-
description: `Found ${name} hardcoded in ~/${configFile}. Credentials in shell config files are loaded into every terminal session and may be captured by AI coding assistants.`,
|
|
122
|
-
category: 'credential-exposure',
|
|
123
|
-
severity: 'critical',
|
|
124
|
-
passed: false,
|
|
125
|
-
message: `~/${configFile}:${i + 1} contains ${name}`,
|
|
126
|
-
fixable: false,
|
|
127
|
-
file: `~/${configFile}`,
|
|
128
|
-
line: i + 1,
|
|
129
|
-
fix: 'Move credentials to a secret manager. Run: npx secretless-ai doctor',
|
|
130
|
-
});
|
|
131
|
-
break; // One finding per line
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return findings;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Scan shell history files for credentials.
|
|
140
|
-
* Checks ~/.bash_history, ~/.zsh_history (last 10K lines)
|
|
141
|
-
*/
|
|
142
|
-
async function checkShellHistory() {
|
|
143
|
-
const findings = [];
|
|
144
|
-
const homeDir = os.homedir();
|
|
145
|
-
for (const histFile of HISTORY_FILES) {
|
|
146
|
-
const filePath = path.join(homeDir, histFile);
|
|
147
|
-
let content;
|
|
148
|
-
try {
|
|
149
|
-
content = await fs.readFile(filePath, 'utf-8');
|
|
150
|
-
}
|
|
151
|
-
catch {
|
|
152
|
-
continue; // File doesn't exist, skip
|
|
153
|
-
}
|
|
154
|
-
const allLines = content.split('\n');
|
|
155
|
-
// Only scan last MAX_HISTORY_LINES
|
|
156
|
-
const startIdx = Math.max(0, allLines.length - MAX_HISTORY_LINES);
|
|
157
|
-
const lines = allLines.slice(startIdx);
|
|
158
|
-
for (let i = 0; i < lines.length; i++) {
|
|
159
|
-
let line = lines[i];
|
|
160
|
-
// Skip empty lines and lines over max length
|
|
161
|
-
if (!line || line.length > MAX_LINE_LENGTH)
|
|
162
|
-
continue;
|
|
163
|
-
// Strip zsh extended history timestamp prefix: `: 1234567890:0;actual command`
|
|
164
|
-
const zshMatch = line.match(/^:\s*\d+:\d+;(.*)$/);
|
|
165
|
-
if (zshMatch) {
|
|
166
|
-
line = zshMatch[1];
|
|
167
|
-
}
|
|
168
|
-
const lineNum = startIdx + i + 1;
|
|
169
|
-
let foundOnLine = false;
|
|
170
|
-
// Check credential patterns in history (SHELLHIST-001/002)
|
|
171
|
-
for (const { name, pattern } of exports.SHELL_CREDENTIAL_PATTERNS) {
|
|
172
|
-
if (pattern.test(line)) {
|
|
173
|
-
findings.push({
|
|
174
|
-
checkId: getHistoryCheckId(name),
|
|
175
|
-
name: 'Credential in shell history',
|
|
176
|
-
description: `Found ${name} in ~/${histFile}. Credentials pasted into terminal are stored in history and accessible to any process running as your user.`,
|
|
177
|
-
category: 'credential-exposure',
|
|
178
|
-
severity: 'high',
|
|
179
|
-
passed: false,
|
|
180
|
-
message: `~/${histFile}:${lineNum} contains ${name}`,
|
|
181
|
-
fixable: false,
|
|
182
|
-
file: `~/${histFile}`,
|
|
183
|
-
line: lineNum,
|
|
184
|
-
fix: 'Clear history entry and use a secret manager. Run: npx secretless-ai scan-history',
|
|
185
|
-
});
|
|
186
|
-
foundOnLine = true;
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
// Check command-line credential patterns (SHELLHIST-003)
|
|
191
|
-
// Only if we haven't already found a credential pattern on this line
|
|
192
|
-
if (!foundOnLine) {
|
|
193
|
-
for (const pattern of COMMAND_CREDENTIAL_PATTERNS) {
|
|
194
|
-
if (pattern.test(line)) {
|
|
195
|
-
findings.push({
|
|
196
|
-
checkId: 'SHELLHIST-003',
|
|
197
|
-
name: 'Credential in command arguments',
|
|
198
|
-
description: `Found credential passed as command argument in ~/${histFile}. Command-line arguments are visible in process listings and stored in history.`,
|
|
199
|
-
category: 'credential-exposure',
|
|
200
|
-
severity: 'high',
|
|
201
|
-
passed: false,
|
|
202
|
-
message: `~/${histFile}:${lineNum} contains credential in command`,
|
|
203
|
-
fixable: false,
|
|
204
|
-
file: `~/${histFile}`,
|
|
205
|
-
line: lineNum,
|
|
206
|
-
fix: 'Use environment variables instead of command-line arguments for credentials.',
|
|
207
|
-
});
|
|
208
|
-
break;
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return findings;
|
|
215
|
-
}
|
|
216
|
-
function getShellCheckId(credName) {
|
|
217
|
-
switch (credName) {
|
|
218
|
-
case 'ANTHROPIC_API_KEY': return 'SHELL-001';
|
|
219
|
-
case 'OPENAI_API_KEY': return 'SHELL-002';
|
|
220
|
-
case 'AWS_ACCESS_KEY': return 'SHELL-003';
|
|
221
|
-
default: return 'SHELL-004';
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
function getHistoryCheckId(credName) {
|
|
225
|
-
switch (credName) {
|
|
226
|
-
case 'ANTHROPIC_API_KEY':
|
|
227
|
-
case 'OPENAI_API_KEY':
|
|
228
|
-
return 'SHELLHIST-001';
|
|
229
|
-
case 'AWS_ACCESS_KEY':
|
|
230
|
-
case 'GITHUB_TOKEN':
|
|
231
|
-
return 'SHELLHIST-002';
|
|
232
|
-
default:
|
|
233
|
-
return 'SHELLHIST-001';
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
//# sourceMappingURL=shell-checks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"shell-checks.js","sourceRoot":"","sources":["../../src/hardening/shell-checks.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CH,sDA4DC;AAMD,8CAiFC;AA7LD,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AAGzB,+DAA+D;AAClD,QAAA,yBAAyB,GAAG;IACvC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAC5E,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAC/D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,qBAAqB,EAAE;IAC1D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,kBAAkB,EAAE;IACvD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,qBAAqB,EAAE;IACxD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,4CAA4C,EAAE;IAC/E,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,sDAAsD,EAAE;IACxF,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,uBAAuB,EAAE;IAC5D,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE;IAC3D,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,0CAA0C,EAAE;IAC7E,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,2BAA2B,EAAE;IAChE,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE;IACrD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,qBAAqB,EAAE;IAC3D,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,qBAAqB,EAAE;CAC9D,CAAC;AAEF,sEAAsE;AACtE,MAAM,2BAA2B,GAAG;IAClC,8DAA8D;IAC9D,iDAAiD;IACjD,6BAA6B;IAC7B,uBAAuB;IACvB,wBAAwB;IACxB,0BAA0B;CAC3B,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AACxE,MAAM,aAAa,GAAG,CAAC,eAAe,EAAE,cAAc,CAAC,CAAC;AACxD,MAAM,iBAAiB,GAAG,KAAM,CAAC;AACjC,MAAM,eAAe,GAAG,KAAM,CAAC;AAE/B;;;GAGG;AACI,KAAK,UAAU,qBAAqB;IACzC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE7B,KAAK,MAAM,UAAU,IAAI,kBAAkB,EAAE,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAEhD,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,2BAA2B;QACvC,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,6CAA6C;YAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;gBAAE,SAAS;YAErD,qBAAqB;YACrB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEjC,mEAAmE;YACnE,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzD,yDAAyD;gBACzD,IAAI,aAAa,GAAG,KAAK,CAAC;gBAC1B,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,iCAAyB,EAAE,CAAC;oBACpD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,aAAa,GAAG,IAAI,CAAC;wBACrB,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,aAAa;oBAAE,SAAS;YAC/B,CAAC;YAED,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,iCAAyB,EAAE,CAAC;gBAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;oBACtC,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO;wBACP,IAAI,EAAE,WAAW,IAAI,kBAAkB;wBACvC,WAAW,EAAE,SAAS,IAAI,mBAAmB,UAAU,yHAAyH;wBAChL,QAAQ,EAAE,qBAAqB;wBAC/B,QAAQ,EAAE,UAAsB;wBAChC,MAAM,EAAE,KAAK;wBACb,OAAO,EAAE,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE;wBACpD,OAAO,EAAE,KAAK;wBACd,IAAI,EAAE,KAAK,UAAU,EAAE;wBACvB,IAAI,EAAE,CAAC,GAAG,CAAC;wBACX,GAAG,EAAE,qEAAqE;qBAC3E,CAAC,CAAC;oBACH,MAAM,CAAC,uBAAuB;gBAChC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iBAAiB;IACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;IAE7B,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE9C,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,2BAA2B;QACvC,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACrC,mCAAmC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,iBAAiB,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEpB,6CAA6C;YAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;gBAAE,SAAS;YAErD,+EAA+E;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACrB,CAAC;YAED,MAAM,OAAO,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC;YACjC,IAAI,WAAW,GAAG,KAAK,CAAC;YAExB,2DAA2D;YAC3D,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,iCAAyB,EAAE,CAAC;gBAC1D,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC;wBACZ,OAAO,EAAE,iBAAiB,CAAC,IAAI,CAAC;wBAChC,IAAI,EAAE,6BAA6B;wBACnC,WAAW,EAAE,SAAS,IAAI,SAAS,QAAQ,8GAA8G;wBACzJ,QAAQ,EAAE,qBAAqB;wBAC/B,QAAQ,EAAE,MAAkB;wBAC5B,MAAM,EAAE,KAAK;wBACb,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,aAAa,IAAI,EAAE;wBACpD,OAAO,EAAE,KAAK;wBACd,IAAI,EAAE,KAAK,QAAQ,EAAE;wBACrB,IAAI,EAAE,OAAO;wBACb,GAAG,EAAE,mFAAmF;qBACzF,CAAC,CAAC;oBACH,WAAW,GAAG,IAAI,CAAC;oBACnB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,yDAAyD;YACzD,qEAAqE;YACrE,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,KAAK,MAAM,OAAO,IAAI,2BAA2B,EAAE,CAAC;oBAClD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACvB,QAAQ,CAAC,IAAI,CAAC;4BACZ,OAAO,EAAE,eAAe;4BACxB,IAAI,EAAE,iCAAiC;4BACvC,WAAW,EAAE,oDAAoD,QAAQ,iFAAiF;4BAC1J,QAAQ,EAAE,qBAAqB;4BAC/B,QAAQ,EAAE,MAAkB;4BAC5B,MAAM,EAAE,KAAK;4BACb,OAAO,EAAE,KAAK,QAAQ,IAAI,OAAO,iCAAiC;4BAClE,OAAO,EAAE,KAAK;4BACd,IAAI,EAAE,KAAK,QAAQ,EAAE;4BACrB,IAAI,EAAE,OAAO;4BACb,GAAG,EAAE,8EAA8E;yBACpF,CAAC,CAAC;wBACH,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,mBAAmB,CAAC,CAAC,OAAO,WAAW,CAAC;QAC7C,KAAK,gBAAgB,CAAC,CAAC,OAAO,WAAW,CAAC;QAC1C,KAAK,gBAAgB,CAAC,CAAC,OAAO,WAAW,CAAC;QAC1C,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,mBAAmB,CAAC;QACzB,KAAK,gBAAgB;YACnB,OAAO,eAAe,CAAC;QACzB,KAAK,gBAAgB,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO,eAAe,CAAC;QACzB;YACE,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* NanoMind Auto-Update
|
|
3
|
-
*
|
|
4
|
-
* Checks the Registry for newer model versions on each run.
|
|
5
|
-
* Downloads and caches the latest model if available.
|
|
6
|
-
* Never blocks: if check/download fails, use the cached version.
|
|
7
|
-
*/
|
|
8
|
-
import { TelemetryConfig } from './config.js';
|
|
9
|
-
export interface ModelVersionInfo {
|
|
10
|
-
version: string;
|
|
11
|
-
sha256: string;
|
|
12
|
-
downloadUrl: string;
|
|
13
|
-
changelog: string;
|
|
14
|
-
publishedAt: string;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Check if a newer model version is available.
|
|
18
|
-
* Returns null if check fails or no update available.
|
|
19
|
-
* Respects CHECK_INTERVAL_MS to avoid hammering the registry.
|
|
20
|
-
*/
|
|
21
|
-
export declare function checkForUpdate(currentVersion: string, config?: TelemetryConfig): Promise<ModelVersionInfo | null>;
|
|
22
|
-
/**
|
|
23
|
-
* Download and cache a new model version.
|
|
24
|
-
* Returns the local path to the downloaded model, or null on failure.
|
|
25
|
-
*/
|
|
26
|
-
export declare function downloadModel(info: ModelVersionInfo): Promise<string | null>;
|
|
27
|
-
//# sourceMappingURL=auto-update.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"auto-update.d.ts","sourceRoot":"","sources":["../../../src/nanomind-core/telemetry/auto-update.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,eAAe,EAAc,MAAM,aAAa,CAAC;AAU1D,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,cAAc,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA4BlC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBlF"}
|