opena2a-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/docker.d.ts +8 -0
- package/dist/adapters/docker.d.ts.map +1 -0
- package/dist/adapters/docker.js +60 -0
- package/dist/adapters/docker.js.map +1 -0
- package/dist/adapters/import.d.ts +12 -0
- package/dist/adapters/import.d.ts.map +1 -0
- package/dist/adapters/import.js +76 -0
- package/dist/adapters/import.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +40 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/python.d.ts +9 -0
- package/dist/adapters/python.d.ts.map +1 -0
- package/dist/adapters/python.js +73 -0
- package/dist/adapters/python.js.map +1 -0
- package/dist/adapters/registry.d.ts +6 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +86 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/spawn.d.ts +9 -0
- package/dist/adapters/spawn.d.ts.map +1 -0
- package/dist/adapters/spawn.js +63 -0
- package/dist/adapters/spawn.js.map +1 -0
- package/dist/adapters/types.d.ts +35 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/branding.d.ts +3 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +21 -0
- package/dist/branding.js.map +1 -0
- package/dist/commands/baselines.d.ts +14 -0
- package/dist/commands/baselines.d.ts.map +1 -0
- package/dist/commands/baselines.js +269 -0
- package/dist/commands/baselines.js.map +1 -0
- package/dist/commands/guard.d.ts +38 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +307 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +356 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/onepassword-migration.d.ts +23 -0
- package/dist/commands/onepassword-migration.d.ts.map +1 -0
- package/dist/commands/onepassword-migration.js +179 -0
- package/dist/commands/onepassword-migration.js.map +1 -0
- package/dist/commands/protect.d.ts +34 -0
- package/dist/commands/protect.d.ts.map +1 -0
- package/dist/commands/protect.js +642 -0
- package/dist/commands/protect.js.map +1 -0
- package/dist/commands/runtime.d.ts +28 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +309 -0
- package/dist/commands/runtime.js.map +1 -0
- package/dist/commands/self-register.d.ts +39 -0
- package/dist/commands/self-register.d.ts.map +1 -0
- package/dist/commands/self-register.js +528 -0
- package/dist/commands/self-register.js.map +1 -0
- package/dist/commands/verify.d.ts +25 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +300 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/contextual/advisor.d.ts +12 -0
- package/dist/contextual/advisor.d.ts.map +1 -0
- package/dist/contextual/advisor.js +94 -0
- package/dist/contextual/advisor.js.map +1 -0
- package/dist/contextual/index.d.ts +3 -0
- package/dist/contextual/index.d.ts.map +1 -0
- package/dist/contextual/index.js +7 -0
- package/dist/contextual/index.js.map +1 -0
- package/dist/guided/attack-walkthrough.d.ts +13 -0
- package/dist/guided/attack-walkthrough.d.ts.map +1 -0
- package/dist/guided/attack-walkthrough.js +113 -0
- package/dist/guided/attack-walkthrough.js.map +1 -0
- package/dist/guided/wizard.d.ts +2 -0
- package/dist/guided/wizard.d.ts.map +1 -0
- package/dist/guided/wizard.js +108 -0
- package/dist/guided/wizard.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +326 -0
- package/dist/index.js.map +1 -0
- package/dist/natural/index.d.ts +4 -0
- package/dist/natural/index.d.ts.map +1 -0
- package/dist/natural/index.js +9 -0
- package/dist/natural/index.js.map +1 -0
- package/dist/natural/intent-map.d.ts +7 -0
- package/dist/natural/intent-map.d.ts.map +1 -0
- package/dist/natural/intent-map.js +145 -0
- package/dist/natural/intent-map.js.map +1 -0
- package/dist/natural/llm-fallback.d.ts +8 -0
- package/dist/natural/llm-fallback.d.ts.map +1 -0
- package/dist/natural/llm-fallback.js +143 -0
- package/dist/natural/llm-fallback.js.map +1 -0
- package/dist/report/interactive-html.d.ts +51 -0
- package/dist/report/interactive-html.d.ts.map +1 -0
- package/dist/report/interactive-html.js +508 -0
- package/dist/report/interactive-html.js.map +1 -0
- package/dist/router.d.ts +23 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +132 -0
- package/dist/router.js.map +1 -0
- package/dist/semantic/command-index.json +182 -0
- package/dist/semantic/index.d.ts +3 -0
- package/dist/semantic/index.d.ts.map +1 -0
- package/dist/semantic/index.js +28 -0
- package/dist/semantic/index.js.map +1 -0
- package/dist/semantic/search.d.ts +17 -0
- package/dist/semantic/search.d.ts.map +1 -0
- package/dist/semantic/search.js +123 -0
- package/dist/semantic/search.js.map +1 -0
- package/dist/util/action-prompt.d.ts +29 -0
- package/dist/util/action-prompt.d.ts.map +1 -0
- package/dist/util/action-prompt.js +126 -0
- package/dist/util/action-prompt.js.map +1 -0
- package/dist/util/advisories.d.ts +43 -0
- package/dist/util/advisories.d.ts.map +1 -0
- package/dist/util/advisories.js +229 -0
- package/dist/util/advisories.js.map +1 -0
- package/dist/util/colors.d.ts +9 -0
- package/dist/util/colors.d.ts.map +1 -0
- package/dist/util/colors.js +18 -0
- package/dist/util/colors.js.map +1 -0
- package/dist/util/credential-patterns.d.ts +38 -0
- package/dist/util/credential-patterns.d.ts.map +1 -0
- package/dist/util/credential-patterns.js +203 -0
- package/dist/util/credential-patterns.js.map +1 -0
- package/dist/util/detect.d.ts +11 -0
- package/dist/util/detect.d.ts.map +1 -0
- package/dist/util/detect.js +49 -0
- package/dist/util/detect.js.map +1 -0
- package/dist/util/format.d.ts +6 -0
- package/dist/util/format.d.ts.map +1 -0
- package/dist/util/format.js +49 -0
- package/dist/util/format.js.map +1 -0
- package/dist/util/report-submission.d.ts +64 -0
- package/dist/util/report-submission.d.ts.map +1 -0
- package/dist/util/report-submission.js +109 -0
- package/dist/util/report-submission.js.map +1 -0
- package/dist/util/spinner.d.ts +10 -0
- package/dist/util/spinner.d.ts.map +1 -0
- package/dist/util/spinner.js +38 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/version.d.ts +5 -0
- package/dist/util/version.d.ts.map +1 -0
- package/dist/util/version.js +24 -0
- package/dist/util/version.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* opena2a verify -- Verify binary integrity of installed packages.
|
|
4
|
+
* Computes SHA-256 hashes of local artifacts and compares against
|
|
5
|
+
* registry-published hashes for tamper detection.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports._internals = void 0;
|
|
9
|
+
exports.verify = verify;
|
|
10
|
+
const node_crypto_1 = require("node:crypto");
|
|
11
|
+
const node_fs_1 = require("node:fs");
|
|
12
|
+
const colors_js_1 = require("../util/colors.js");
|
|
13
|
+
const spinner_js_1 = require("../util/spinner.js");
|
|
14
|
+
// --- Constants ---
|
|
15
|
+
const VERIFIABLE_PACKAGES = [
|
|
16
|
+
'hackmyagent', 'secretless-ai', 'hma-researcher', 'hma-hunter',
|
|
17
|
+
'@opena2a/arp', '@opena2a/oasb', 'aibrowserguard', 'ai-trust',
|
|
18
|
+
];
|
|
19
|
+
// --- Testable internals ---
|
|
20
|
+
/**
|
|
21
|
+
* Exported for testing. Internal code calls these through the object reference
|
|
22
|
+
* so tests can replace individual functions via vi.spyOn.
|
|
23
|
+
*/
|
|
24
|
+
exports._internals = {
|
|
25
|
+
resolvePackagePath(packageName) {
|
|
26
|
+
const resolved = require.resolve(packageName);
|
|
27
|
+
const path = require('node:path');
|
|
28
|
+
const fs = require('node:fs');
|
|
29
|
+
let dir = path.dirname(resolved);
|
|
30
|
+
const root = path.parse(dir).root;
|
|
31
|
+
while (dir !== root) {
|
|
32
|
+
const pkgJsonPath = path.join(dir, 'package.json');
|
|
33
|
+
if (fs.existsSync(pkgJsonPath)) {
|
|
34
|
+
const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
35
|
+
if (pkgJson.name === packageName) {
|
|
36
|
+
return {
|
|
37
|
+
mainFile: resolved,
|
|
38
|
+
version: pkgJson.version ?? 'unknown',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
dir = path.dirname(dir);
|
|
43
|
+
}
|
|
44
|
+
return { mainFile: resolved, version: 'unknown' };
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
// --- Core ---
|
|
48
|
+
async function verify(options) {
|
|
49
|
+
const registryUrl = await resolveRegistryUrl(options.registryUrl);
|
|
50
|
+
const packages = options.packageName ? [options.packageName] : VERIFIABLE_PACKAGES;
|
|
51
|
+
const isJson = options.format === 'json';
|
|
52
|
+
const isCi = options.ci ?? false;
|
|
53
|
+
if (!isJson && !isCi) {
|
|
54
|
+
process.stdout.write((0, colors_js_1.bold)('Verifying binary integrity of OpenA2A packages') + '\n\n');
|
|
55
|
+
}
|
|
56
|
+
const results = [];
|
|
57
|
+
const spinner = new spinner_js_1.Spinner('');
|
|
58
|
+
for (const pkg of packages) {
|
|
59
|
+
if (!isCi && !isJson) {
|
|
60
|
+
spinner.update(`Verifying ${pkg}...`);
|
|
61
|
+
spinner.start();
|
|
62
|
+
}
|
|
63
|
+
const result = await verifyPackage(pkg, registryUrl, options);
|
|
64
|
+
results.push(result);
|
|
65
|
+
if (!isCi && !isJson) {
|
|
66
|
+
spinner.stop();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Output
|
|
70
|
+
if (isJson) {
|
|
71
|
+
const report = {
|
|
72
|
+
registryUrl,
|
|
73
|
+
timestamp: new Date().toISOString(),
|
|
74
|
+
total: results.length,
|
|
75
|
+
verified: results.filter(r => r.registryStatus === 'verified').length,
|
|
76
|
+
tamperDetected: results.filter(r => r.registryStatus === 'tamper_detected').length,
|
|
77
|
+
noData: results.filter(r => r.registryStatus === 'no_data').length,
|
|
78
|
+
notInstalled: results.filter(r => r.registryStatus === 'not_installed').length,
|
|
79
|
+
packages: results.map(r => ({
|
|
80
|
+
...r,
|
|
81
|
+
trustScore: r.trustScore,
|
|
82
|
+
trustVerdict: r.trustVerdict,
|
|
83
|
+
oracleVerdict: r.oracleVerdict,
|
|
84
|
+
oracleSignatureValid: r.oracleSignatureValid,
|
|
85
|
+
dependencyRiskCount: r.dependencyRiskCount,
|
|
86
|
+
lastScannedAt: r.lastScannedAt,
|
|
87
|
+
})),
|
|
88
|
+
};
|
|
89
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
printResults(results, registryUrl);
|
|
93
|
+
}
|
|
94
|
+
const tampered = results.filter(r => r.registryStatus === 'tamper_detected');
|
|
95
|
+
return tampered.length > 0 ? 1 : 0;
|
|
96
|
+
}
|
|
97
|
+
async function queryTrustProfile(registryUrl, name, type) {
|
|
98
|
+
try {
|
|
99
|
+
const params = new URLSearchParams({ name, includeProfile: 'true', includeDeps: 'true' });
|
|
100
|
+
if (type)
|
|
101
|
+
params.set('type', type);
|
|
102
|
+
const url = `${registryUrl}/api/v1/trust/query?${params}`;
|
|
103
|
+
const response = await fetch(url, {
|
|
104
|
+
method: 'GET',
|
|
105
|
+
headers: { 'Accept': 'application/json' },
|
|
106
|
+
signal: AbortSignal.timeout(10_000),
|
|
107
|
+
});
|
|
108
|
+
if (!response.ok)
|
|
109
|
+
return null;
|
|
110
|
+
const data = await response.json();
|
|
111
|
+
return {
|
|
112
|
+
trustScore: data.trustProfile?.trustScore ?? data.trustScore ?? 0,
|
|
113
|
+
verdict: data.trustProfile?.verdict ?? data.verdict ?? 'unknown',
|
|
114
|
+
lastScannedAt: data.trustProfile?.lastScannedAt ?? data.lastScannedAt ?? null,
|
|
115
|
+
dependencyRiskCount: data.dependencies?.riskCount ?? 0,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function queryOracleVerdict(registryUrl, component) {
|
|
123
|
+
try {
|
|
124
|
+
const url = `${registryUrl}/api/v1/oracle/${encodeURIComponent(component)}`;
|
|
125
|
+
const response = await fetch(url, {
|
|
126
|
+
method: 'GET',
|
|
127
|
+
headers: { 'Accept': 'application/json' },
|
|
128
|
+
signal: AbortSignal.timeout(10_000),
|
|
129
|
+
});
|
|
130
|
+
if (!response.ok)
|
|
131
|
+
return null;
|
|
132
|
+
const data = await response.json();
|
|
133
|
+
return {
|
|
134
|
+
verdict: data.verdict ?? 'unknown',
|
|
135
|
+
signatureValid: data.signatureValid ?? data.signature?.valid ?? false,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// --- Per-package verification ---
|
|
143
|
+
async function verifyPackage(packageName, registryUrl, options) {
|
|
144
|
+
const emptyTrust = {
|
|
145
|
+
trustScore: null,
|
|
146
|
+
trustVerdict: null,
|
|
147
|
+
oracleVerdict: null,
|
|
148
|
+
oracleSignatureValid: null,
|
|
149
|
+
dependencyRiskCount: null,
|
|
150
|
+
lastScannedAt: null,
|
|
151
|
+
};
|
|
152
|
+
// Step 1: Find local installation
|
|
153
|
+
let mainFilePath;
|
|
154
|
+
let pkgVersion;
|
|
155
|
+
try {
|
|
156
|
+
const resolved = exports._internals.resolvePackagePath(packageName);
|
|
157
|
+
mainFilePath = resolved.mainFile;
|
|
158
|
+
pkgVersion = resolved.version;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
if (options.verbose) {
|
|
162
|
+
process.stderr.write((0, colors_js_1.dim)(` ${packageName}: not installed locally\n`));
|
|
163
|
+
}
|
|
164
|
+
return {
|
|
165
|
+
packageName,
|
|
166
|
+
version: 'N/A',
|
|
167
|
+
localHash: 'N/A',
|
|
168
|
+
registryStatus: 'not_installed',
|
|
169
|
+
...emptyTrust,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
// Step 2: Compute SHA-256
|
|
173
|
+
const localHash = computeSha256(mainFilePath);
|
|
174
|
+
// Step 3: Query registry for hash verification
|
|
175
|
+
let registryStatus = 'no_data';
|
|
176
|
+
let error;
|
|
177
|
+
try {
|
|
178
|
+
const url = `${registryUrl}/api/v1/trust/query?name=${encodeURIComponent(packageName)}&hash=${localHash}`;
|
|
179
|
+
const response = await fetch(url, {
|
|
180
|
+
method: 'GET',
|
|
181
|
+
headers: { 'Accept': 'application/json' },
|
|
182
|
+
signal: AbortSignal.timeout(10_000),
|
|
183
|
+
});
|
|
184
|
+
if (response.ok) {
|
|
185
|
+
const data = await response.json();
|
|
186
|
+
const status = data.contentVerification?.status;
|
|
187
|
+
if (status === 'verified')
|
|
188
|
+
registryStatus = 'verified';
|
|
189
|
+
else if (status === 'tamper_detected')
|
|
190
|
+
registryStatus = 'tamper_detected';
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
registryStatus = 'error';
|
|
195
|
+
error = err instanceof Error ? err.message : String(err);
|
|
196
|
+
}
|
|
197
|
+
// Step 4: Query trust profile and oracle verdict (parallel, non-blocking)
|
|
198
|
+
const type = packageName.startsWith('@') ? 'mcp_server' : 'ai_tool';
|
|
199
|
+
const [trustProfile, oracle] = await Promise.all([
|
|
200
|
+
queryTrustProfile(registryUrl, packageName, type),
|
|
201
|
+
queryOracleVerdict(registryUrl, packageName),
|
|
202
|
+
]);
|
|
203
|
+
return {
|
|
204
|
+
packageName,
|
|
205
|
+
version: pkgVersion,
|
|
206
|
+
localHash,
|
|
207
|
+
registryStatus,
|
|
208
|
+
trustScore: trustProfile?.trustScore ?? null,
|
|
209
|
+
trustVerdict: trustProfile?.verdict ?? null,
|
|
210
|
+
oracleVerdict: oracle?.verdict ?? null,
|
|
211
|
+
oracleSignatureValid: oracle?.signatureValid ?? null,
|
|
212
|
+
dependencyRiskCount: trustProfile?.dependencyRiskCount ?? null,
|
|
213
|
+
lastScannedAt: trustProfile?.lastScannedAt ?? null,
|
|
214
|
+
error,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// --- Helpers ---
|
|
218
|
+
function computeSha256(filePath) {
|
|
219
|
+
const content = (0, node_fs_1.readFileSync)(filePath);
|
|
220
|
+
return (0, node_crypto_1.createHash)('sha256').update(content).digest('hex');
|
|
221
|
+
}
|
|
222
|
+
async function resolveRegistryUrl(override) {
|
|
223
|
+
if (override)
|
|
224
|
+
return override.replace(/\/$/, '');
|
|
225
|
+
try {
|
|
226
|
+
const shared = await Function('return import("@opena2a/shared")')();
|
|
227
|
+
const mod = 'default' in shared ? shared.default : shared;
|
|
228
|
+
const config = mod.loadUserConfig();
|
|
229
|
+
return config.registry.url;
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
return 'https://registry.opena2a.org';
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// --- Output ---
|
|
236
|
+
function printResults(results, registryUrl) {
|
|
237
|
+
// Detailed per-package output
|
|
238
|
+
for (const r of results) {
|
|
239
|
+
if (r.registryStatus === 'not_installed') {
|
|
240
|
+
process.stdout.write((0, colors_js_1.dim)(` ${r.packageName}: not installed\n`));
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const statusLabel = r.registryStatus === 'verified' ? (0, colors_js_1.green)('PASS')
|
|
244
|
+
: r.registryStatus === 'tamper_detected' ? (0, colors_js_1.red)('TAMPER DETECTED')
|
|
245
|
+
: r.registryStatus === 'error' ? (0, colors_js_1.red)('error')
|
|
246
|
+
: (0, colors_js_1.yellow)('no data');
|
|
247
|
+
const hashDisplay = r.localHash.slice(0, 16) + '...';
|
|
248
|
+
process.stdout.write('\n');
|
|
249
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Package')} ${(0, colors_js_1.bold)(r.packageName)}\n`);
|
|
250
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Version')} ${r.version}\n`);
|
|
251
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Hash Check')} ${statusLabel} ${(0, colors_js_1.dim)('(SHA-256 ' + hashDisplay + ')')}\n`);
|
|
252
|
+
if (r.trustScore !== null) {
|
|
253
|
+
const scoreColor = r.trustScore >= 80 ? colors_js_1.green : r.trustScore >= 60 ? colors_js_1.yellow : colors_js_1.red;
|
|
254
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Trust Score')} ${scoreColor(`${r.trustScore} / 100`)}\n`);
|
|
255
|
+
}
|
|
256
|
+
if (r.trustVerdict !== null) {
|
|
257
|
+
const verdictColor = r.trustVerdict === 'trusted' ? colors_js_1.green
|
|
258
|
+
: r.trustVerdict === 'caution' ? colors_js_1.yellow
|
|
259
|
+
: r.trustVerdict === 'untrusted' ? colors_js_1.red
|
|
260
|
+
: colors_js_1.dim;
|
|
261
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Trust Verdict')} ${verdictColor(r.trustVerdict)}\n`);
|
|
262
|
+
}
|
|
263
|
+
if (r.oracleVerdict !== null) {
|
|
264
|
+
const oracleLabel = r.oracleSignatureValid ? (0, colors_js_1.green)('verified (Ed25519)') : (0, colors_js_1.yellow)(r.oracleVerdict);
|
|
265
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Oracle Signed')} ${oracleLabel}\n`);
|
|
266
|
+
}
|
|
267
|
+
if (r.lastScannedAt) {
|
|
268
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Last Scanned')} ${(0, colors_js_1.dim)(r.lastScannedAt)}\n`);
|
|
269
|
+
}
|
|
270
|
+
if (r.dependencyRiskCount !== null) {
|
|
271
|
+
const depLabel = r.dependencyRiskCount === 0
|
|
272
|
+
? (0, colors_js_1.green)('0 risks')
|
|
273
|
+
: (0, colors_js_1.yellow)(`${r.dependencyRiskCount} risk${r.dependencyRiskCount === 1 ? '' : 's'}`);
|
|
274
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Dependencies')} ${depLabel}\n`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
process.stdout.write('\n');
|
|
278
|
+
// Summary
|
|
279
|
+
const verified = results.filter(r => r.registryStatus === 'verified').length;
|
|
280
|
+
const tampered = results.filter(r => r.registryStatus === 'tamper_detected').length;
|
|
281
|
+
const noData = results.filter(r => r.registryStatus === 'no_data' || r.registryStatus === 'error').length;
|
|
282
|
+
const notInstalled = results.filter(r => r.registryStatus === 'not_installed').length;
|
|
283
|
+
process.stdout.write((0, colors_js_1.bold)('Summary: '));
|
|
284
|
+
const parts = [];
|
|
285
|
+
if (verified > 0)
|
|
286
|
+
parts.push((0, colors_js_1.green)(`${verified} verified`));
|
|
287
|
+
if (tampered > 0)
|
|
288
|
+
parts.push((0, colors_js_1.red)(`${tampered} tampered`));
|
|
289
|
+
if (noData > 0)
|
|
290
|
+
parts.push((0, colors_js_1.yellow)(`${noData} no data`));
|
|
291
|
+
if (notInstalled > 0)
|
|
292
|
+
parts.push((0, colors_js_1.dim)(`${notInstalled} not installed`));
|
|
293
|
+
process.stdout.write(parts.join(', ') + '\n');
|
|
294
|
+
process.stdout.write((0, colors_js_1.dim)(`Registry: ${registryUrl}\n`));
|
|
295
|
+
if (tampered > 0) {
|
|
296
|
+
process.stdout.write('\n' + (0, colors_js_1.red)((0, colors_js_1.bold)('WARNING: Tamper detected in one or more packages.')) + '\n');
|
|
297
|
+
process.stdout.write((0, colors_js_1.red)('Reinstall affected packages from a trusted source.\n'));
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Suggestion {
|
|
2
|
+
command: string;
|
|
3
|
+
reason: string;
|
|
4
|
+
priority: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Contextual advisor: reads project state, scan history, and config
|
|
8
|
+
* to suggest the most relevant next command. No LLM call -- pure rules engine.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getContextualSuggestions(targetDir?: string): Suggestion[];
|
|
11
|
+
export declare function handleContext(query: string): void;
|
|
12
|
+
//# sourceMappingURL=advisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor.d.ts","sourceRoot":"","sources":["../../src/contextual/advisor.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAyEzE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAiBjD"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getContextualSuggestions = getContextualSuggestions;
|
|
4
|
+
exports.handleContext = handleContext;
|
|
5
|
+
const shared_1 = require("@opena2a/shared");
|
|
6
|
+
const shared_2 = require("@opena2a/shared");
|
|
7
|
+
const detect_js_1 = require("../util/detect.js");
|
|
8
|
+
const colors_js_1 = require("../util/colors.js");
|
|
9
|
+
/**
|
|
10
|
+
* Contextual advisor: reads project state, scan history, and config
|
|
11
|
+
* to suggest the most relevant next command. No LLM call -- pure rules engine.
|
|
12
|
+
*/
|
|
13
|
+
function getContextualSuggestions(targetDir) {
|
|
14
|
+
const suggestions = [];
|
|
15
|
+
const dir = targetDir ?? process.cwd();
|
|
16
|
+
const project = (0, detect_js_1.detectProject)(dir);
|
|
17
|
+
const config = (0, shared_1.loadUserConfig)();
|
|
18
|
+
const lastScan = (0, shared_2.getLastScan)();
|
|
19
|
+
// Never scanned? Suggest scan first
|
|
20
|
+
if (!lastScan) {
|
|
21
|
+
suggestions.push({
|
|
22
|
+
command: 'opena2a scan secure',
|
|
23
|
+
reason: 'No scan history found -- run a security scan first',
|
|
24
|
+
priority: 100,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Scanned with critical findings but no attack test
|
|
28
|
+
if (lastScan && lastScan.findings.critical > 0) {
|
|
29
|
+
suggestions.push({
|
|
30
|
+
command: 'opena2a scan attack',
|
|
31
|
+
reason: `Last scan found ${lastScan.findings.critical} critical findings -- test with attack mode`,
|
|
32
|
+
priority: 90,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// Has .env but no protection
|
|
36
|
+
if (project.hasEnv) {
|
|
37
|
+
suggestions.push({
|
|
38
|
+
command: 'opena2a protect',
|
|
39
|
+
reason: '.env file detected -- migrate credentials to encrypted vault',
|
|
40
|
+
priority: 85,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
// MCP project without secrets protection
|
|
44
|
+
if (project.hasMcp) {
|
|
45
|
+
suggestions.push({
|
|
46
|
+
command: 'opena2a secrets init',
|
|
47
|
+
reason: 'MCP configuration detected -- protect credentials from AI tools',
|
|
48
|
+
priority: 80,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Not contributing to registry
|
|
52
|
+
if (!config.contribute.enabled && lastScan) {
|
|
53
|
+
suggestions.push({
|
|
54
|
+
command: 'opena2a config contribute on',
|
|
55
|
+
reason: 'Help the community -- share anonymized scan summaries',
|
|
56
|
+
priority: 30,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Suggest benchmark after successful scan
|
|
60
|
+
if (lastScan && lastScan.findings.critical === 0 && lastScan.findings.high === 0) {
|
|
61
|
+
suggestions.push({
|
|
62
|
+
command: 'opena2a benchmark',
|
|
63
|
+
reason: 'Clean scan results -- run a full security benchmark',
|
|
64
|
+
priority: 50,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
// Suggest runtime monitoring for agent projects
|
|
68
|
+
if (project.type === 'node' || project.hasMcp) {
|
|
69
|
+
suggestions.push({
|
|
70
|
+
command: 'opena2a runtime start',
|
|
71
|
+
reason: 'Enable runtime monitoring for process, network, and filesystem activity',
|
|
72
|
+
priority: 40,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// Sort by priority descending
|
|
76
|
+
suggestions.sort((a, b) => b.priority - a.priority);
|
|
77
|
+
return suggestions;
|
|
78
|
+
}
|
|
79
|
+
function handleContext(query) {
|
|
80
|
+
const suggestions = getContextualSuggestions();
|
|
81
|
+
if (suggestions.length === 0) {
|
|
82
|
+
process.stdout.write('No contextual suggestions available.\n');
|
|
83
|
+
process.stdout.write('Run: opena2a --help\n');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
process.stdout.write('\nSuggested next steps:\n\n');
|
|
87
|
+
const limit = query ? suggestions.length : 3;
|
|
88
|
+
for (let i = 0; i < Math.min(limit, suggestions.length); i++) {
|
|
89
|
+
const s = suggestions[i];
|
|
90
|
+
process.stdout.write(` ${(0, colors_js_1.bold)(`${i + 1}.`)} ${(0, colors_js_1.cyan)(s.command)}\n`);
|
|
91
|
+
process.stdout.write(` ${(0, colors_js_1.gray)(s.reason)}\n\n`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=advisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisor.js","sourceRoot":"","sources":["../../src/contextual/advisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contextual/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleContext = exports.getContextualSuggestions = void 0;
|
|
4
|
+
var advisor_js_1 = require("./advisor.js");
|
|
5
|
+
Object.defineProperty(exports, "getContextualSuggestions", { enumerable: true, get: function () { return advisor_js_1.getContextualSuggestions; } });
|
|
6
|
+
Object.defineProperty(exports, "handleContext", { enumerable: true, get: function () { return advisor_js_1.handleContext; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contextual/index.ts"],"names":[],"mappings":";;;AAAA,2CAAuE;AAA9D,sHAAA,wBAAwB,OAAA;AAAE,2GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guided attack walkthrough for novice users.
|
|
3
|
+
*
|
|
4
|
+
* Instead of immediately dispatching `opena2a scan attack`, walk users
|
|
5
|
+
* through what attack testing is, what agent type they have, and what
|
|
6
|
+
* phases the test will run. Returns the fully-formed command string.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Run the interactive attack walkthrough. Returns the command string
|
|
10
|
+
* to execute, or null if the user cancels.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runAttackWalkthrough(): Promise<string | null>;
|
|
13
|
+
//# sourceMappingURL=attack-walkthrough.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attack-walkthrough.d.ts","sourceRoot":"","sources":["../../src/guided/attack-walkthrough.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA6CH;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2EnE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Guided attack walkthrough for novice users.
|
|
4
|
+
*
|
|
5
|
+
* Instead of immediately dispatching `opena2a scan attack`, walk users
|
|
6
|
+
* through what attack testing is, what agent type they have, and what
|
|
7
|
+
* phases the test will run. Returns the fully-formed command string.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.runAttackWalkthrough = runAttackWalkthrough;
|
|
11
|
+
const colors_js_1 = require("../util/colors.js");
|
|
12
|
+
const ATTACK_PHASES = [
|
|
13
|
+
{
|
|
14
|
+
name: 'Prompt Injection Testing',
|
|
15
|
+
description: 'Tests whether your agent follows malicious instructions\n' +
|
|
16
|
+
' hidden in user input or tool responses.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
name: 'Data Exfiltration',
|
|
20
|
+
description: 'Attempts to extract sensitive information like system\n' +
|
|
21
|
+
' prompts, environment variables, or user data.',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'Tool Abuse',
|
|
25
|
+
description: 'Tests if your agent can be tricked into calling\n' +
|
|
26
|
+
' dangerous tools or exceeding its intended permissions.',
|
|
27
|
+
},
|
|
28
|
+
];
|
|
29
|
+
const AGENT_TYPES = [
|
|
30
|
+
{
|
|
31
|
+
label: 'MCP Server (tool-calling agent)',
|
|
32
|
+
value: 'mcp',
|
|
33
|
+
targetPrompt: 'MCP server URL (e.g., http://localhost:3010):',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
label: 'API Agent (HTTP endpoint)',
|
|
37
|
+
value: 'api',
|
|
38
|
+
targetPrompt: 'API endpoint URL (e.g., http://localhost:8080/api):',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: 'Chat Agent (system prompt based)',
|
|
42
|
+
value: 'chat',
|
|
43
|
+
targetPrompt: 'System prompt file path (optional, press Enter to skip):',
|
|
44
|
+
},
|
|
45
|
+
];
|
|
46
|
+
/**
|
|
47
|
+
* Run the interactive attack walkthrough. Returns the command string
|
|
48
|
+
* to execute, or null if the user cancels.
|
|
49
|
+
*/
|
|
50
|
+
async function runAttackWalkthrough() {
|
|
51
|
+
if (!process.stdin.isTTY) {
|
|
52
|
+
process.stdout.write('Attack walkthrough requires a TTY.\n');
|
|
53
|
+
process.stdout.write('Direct usage: opena2a scan attack <target-url>\n');
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const { select, input, confirm } = await import('@inquirer/prompts');
|
|
58
|
+
// Step 1: Explain
|
|
59
|
+
process.stdout.write('\n' + (0, colors_js_1.bold)('Attack Simulation') + '\n\n');
|
|
60
|
+
process.stdout.write('Attack testing probes your AI agent with crafted adversarial inputs\n' +
|
|
61
|
+
'to find security weaknesses before real attackers do.\n\n');
|
|
62
|
+
process.stdout.write((0, colors_js_1.dim)(' - Nothing is permanently modified\n'));
|
|
63
|
+
process.stdout.write((0, colors_js_1.dim)(' - Tests run against your local/staging agent\n'));
|
|
64
|
+
process.stdout.write((0, colors_js_1.dim)(' - Results are not shared externally\n'));
|
|
65
|
+
process.stdout.write('\n');
|
|
66
|
+
// Step 2: Agent type
|
|
67
|
+
const agentType = await select({
|
|
68
|
+
message: 'What type of agent are you testing?',
|
|
69
|
+
choices: AGENT_TYPES.map(t => ({
|
|
70
|
+
name: t.label,
|
|
71
|
+
value: t.value,
|
|
72
|
+
})),
|
|
73
|
+
});
|
|
74
|
+
const typeConfig = AGENT_TYPES.find(t => t.value === agentType);
|
|
75
|
+
// Step 3: Target details
|
|
76
|
+
const target = await input({
|
|
77
|
+
message: typeConfig.targetPrompt,
|
|
78
|
+
});
|
|
79
|
+
if (!target && agentType !== 'chat') {
|
|
80
|
+
process.stdout.write((0, colors_js_1.yellow)('A target URL is required for this agent type.') + '\n');
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
// Step 4: Show phases
|
|
84
|
+
process.stdout.write('\n' + (0, colors_js_1.bold)('Test Phases') + '\n\n');
|
|
85
|
+
for (let i = 0; i < ATTACK_PHASES.length; i++) {
|
|
86
|
+
const phase = ATTACK_PHASES[i];
|
|
87
|
+
process.stdout.write(` ${(0, colors_js_1.cyan)(`Phase ${i + 1}`)} - ${(0, colors_js_1.bold)(phase.name)}\n`);
|
|
88
|
+
process.stdout.write(` ${phase.description}\n\n`);
|
|
89
|
+
}
|
|
90
|
+
// Step 5: Confirm
|
|
91
|
+
const proceed = await confirm({
|
|
92
|
+
message: 'Start attack simulation?',
|
|
93
|
+
default: true,
|
|
94
|
+
});
|
|
95
|
+
if (!proceed) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
// Step 6: Build and return command
|
|
99
|
+
const targetArg = target || '.';
|
|
100
|
+
const command = `opena2a scan attack ${targetArg} --target-type ${agentType}`;
|
|
101
|
+
process.stdout.write('\n' + (0, colors_js_1.gray)('Command: ') + (0, colors_js_1.cyan)(command) + '\n\n');
|
|
102
|
+
return command;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if (err instanceof Error && err.message.includes('User force closed')) {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// Fallback: show manual usage
|
|
109
|
+
process.stdout.write('\nUsage: opena2a scan attack <target-url> --target-type mcp|api|chat\n');
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=attack-walkthrough.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attack-walkthrough.js","sourceRoot":"","sources":["../../src/guided/attack-walkthrough.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../../src/guided/wizard.ts"],"names":[],"mappings":"AAwDA,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxD"}
|