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 @@
|
|
|
1
|
+
{"version":3,"file":"intent-map.js","sourceRoot":"","sources":["../../src/natural/intent-map.ts"],"names":[],"mappings":";;AAuJA,kCAcC;AA/JD,MAAM,eAAe,GAAoB;IACvC,mBAAmB;IACnB;QACE,QAAQ,EAAE;YACR,0EAA0E;YAC1E,gHAAgH;YAChH,+DAA+D;YAC/D,sDAAsD;YACtD,wBAAwB;YACxB,8CAA8C;SAC/C;QACD,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,0BAA0B;KACxC;IAED,yBAAyB;IACzB;QACE,QAAQ,EAAE;YACR,uFAAuF;YACvF,4DAA4D;YAC5D,mCAAmC;SACpC;QACD,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,yBAAyB;KACvC;IAED,gCAAgC;IAChC;QACE,QAAQ,EAAE;YACR,gHAAgH;YAChH,uFAAuF;YACvF,kFAAkF;YAClF,gDAAgD;YAChD,4DAA4D;SAC7D;QACD,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,wCAAwC;KACtD;IAED,6BAA6B;IAC7B;QACE,QAAQ,EAAE;YACR,sGAAsG;YACtG,iBAAiB;SAClB;QACD,OAAO,EAAE,sBAAsB;QAC/B,WAAW,EAAE,6CAA6C;KAC3D;IAED,6BAA6B;IAC7B;QACE,QAAQ,EAAE;YACR,uFAAuF;YACvF,8CAA8C;YAC9C,2DAA2D;SAC5D;QACD,OAAO,EAAE,uBAAuB;QAChC,WAAW,EAAE,0BAA0B;KACxC;IAED,oBAAoB;IACpB;QACE,QAAQ,EAAE;YACR,kGAAkG;YAClG,WAAW;YACX,2CAA2C;SAC5C;QACD,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,6BAA6B;KAC3C;IAED,yBAAyB;IACzB;QACE,QAAQ,EAAE;YACR,kEAAkE;YAClE,0CAA0C;YAC1C,6CAA6C;YAC7C,sCAAsC;SACvC;QACD,OAAO,EAAE,wBAAwB;QACjC,WAAW,EAAE,gDAAgD;KAC9D;IAED,mBAAmB;IACnB;QACE,QAAQ,EAAE;YACR,oFAAoF;YACpF,WAAW;YACX,mDAAmD;SACpD;QACD,OAAO,EAAE,eAAe;QACxB,WAAW,EAAE,kCAAkC;KAChD;IAED,yBAAyB;IACzB;QACE,QAAQ,EAAE;YACR,2EAA2E;YAC3E,sDAAsD;YACtD,8CAA8C;YAC9C,wCAAwC;SACzC;QACD,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,oDAAoD;KAClE;IAED,mBAAmB;IACnB;QACE,QAAQ,EAAE;YACR,sEAAsE;YACtE,uBAAuB;YACvB,UAAU;SACX;QACD,OAAO,EAAE,kBAAkB;QAC3B,WAAW,EAAE,+BAA+B;KAC7C;IAED,0BAA0B;IAC1B;QACE,QAAQ,EAAE;YACR,oFAAoF;YACpF,sCAAsC;SACvC;QACD,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,8BAA8B;KAC5C;IAED,qBAAqB;IACrB;QACE,QAAQ,EAAE;YACR,+DAA+D;YAC/D,uCAAuC;YACvC,oBAAoB;SACrB;QACD,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,6CAA6C;KAC3D;CACF,CAAC;AAQF,SAAgB,WAAW,CAAC,KAAa;IACvC,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACvC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,UAAU,EAAE,MAAM;iBACnB,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
interface LLMSuggestion {
|
|
2
|
+
command: string;
|
|
3
|
+
reason: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function llmFallback(input: string): Promise<LLMSuggestion | null>;
|
|
6
|
+
export declare function handleNaturalLanguage(input: string): Promise<string | null>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=llm-fallback.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-fallback.d.ts","sourceRoot":"","sources":["../../src/natural/llm-fallback.ts"],"names":[],"mappings":"AAwBA,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAyDD,wBAAsB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CA+C9E;AAED,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BjF"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.llmFallback = llmFallback;
|
|
4
|
+
exports.handleNaturalLanguage = handleNaturalLanguage;
|
|
5
|
+
const colors_js_1 = require("../util/colors.js");
|
|
6
|
+
const SYSTEM_PROMPT = `You are OpenA2A CLI, an AI agent security platform. Given a user's natural language query, suggest the most appropriate CLI command.
|
|
7
|
+
|
|
8
|
+
Available commands:
|
|
9
|
+
- opena2a scan secure -- Full security scan (150+ checks)
|
|
10
|
+
- opena2a scan attack -- Attack mode (adversarial testing)
|
|
11
|
+
- opena2a protect -- Detect and migrate credentials to vault
|
|
12
|
+
- opena2a secrets init -- Set up credential protection
|
|
13
|
+
- opena2a secrets scan -- Find hardcoded credentials
|
|
14
|
+
- opena2a runtime start -- Runtime monitoring (process/network/filesystem)
|
|
15
|
+
- opena2a benchmark -- OASB security benchmark (222 scenarios)
|
|
16
|
+
- opena2a registry check <pkg> -- Trust registry lookup
|
|
17
|
+
- opena2a research <target> -- Autonomous security research
|
|
18
|
+
- opena2a hunt <target> -- Autonomous vulnerability hunter
|
|
19
|
+
- opena2a train -- Launch DVAA training environment
|
|
20
|
+
- opena2a crypto scan -- Cryptographic inventory / PQC readiness
|
|
21
|
+
- opena2a identity -- Agent identity management
|
|
22
|
+
- opena2a broker start -- Start credential broker daemon
|
|
23
|
+
- opena2a init -- Project initialization
|
|
24
|
+
- opena2a status -- Security status overview
|
|
25
|
+
|
|
26
|
+
Respond with ONLY a JSON object: {"command":"<command>","reason":"<one-sentence reason>"}`;
|
|
27
|
+
/**
|
|
28
|
+
* Check if LLM features have been consented to. If not, prompt for consent
|
|
29
|
+
* on first encounter (TTY only). Returns true if LLM calls are allowed.
|
|
30
|
+
*/
|
|
31
|
+
async function ensureLlmConsent() {
|
|
32
|
+
// Non-TTY or CI: no consent possible
|
|
33
|
+
if (!process.stdin.isTTY || process.env.CI) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// Check existing consent
|
|
37
|
+
try {
|
|
38
|
+
const shared = await import('@opena2a/shared');
|
|
39
|
+
const mod = 'default' in shared ? shared.default : shared;
|
|
40
|
+
if (mod.isLlmEnabled()) {
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
// First encounter: explain and ask
|
|
44
|
+
process.stdout.write('\n' + (0, colors_js_1.bold)('LLM-assisted command matching') + '\n\n');
|
|
45
|
+
process.stdout.write('When your input does not match any known command, OpenA2A can\n' +
|
|
46
|
+
'use Claude Haiku to suggest the best match.\n\n');
|
|
47
|
+
process.stdout.write((0, colors_js_1.dim)('Model: ') + 'Claude Haiku (claude-haiku-4-5)\n');
|
|
48
|
+
process.stdout.write((0, colors_js_1.dim)('Estimated cost: ') + '~150 tokens, ~$0.0002 per call\n');
|
|
49
|
+
process.stdout.write((0, colors_js_1.dim)('Data: ') + 'Uses your ANTHROPIC_API_KEY. No data is stored or shared.\n\n');
|
|
50
|
+
try {
|
|
51
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
52
|
+
const enabled = await confirm({
|
|
53
|
+
message: 'Enable LLM-assisted command matching?',
|
|
54
|
+
default: false,
|
|
55
|
+
});
|
|
56
|
+
mod.setLlmEnabled(enabled);
|
|
57
|
+
if (enabled) {
|
|
58
|
+
process.stdout.write((0, colors_js_1.green)('LLM features enabled.') + '\n\n');
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
process.stdout.write((0, colors_js_1.dim)('LLM features disabled. ') +
|
|
63
|
+
'You can enable later: ' + (0, colors_js_1.cyan)('opena2a config llm on') + '\n\n');
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// shared not available, allow LLM (backward compat)
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async function llmFallback(input) {
|
|
77
|
+
const apiKey = process.env.ANTHROPIC_API_KEY;
|
|
78
|
+
if (!apiKey) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
// Check consent before making API call
|
|
82
|
+
const consented = await ensureLlmConsent();
|
|
83
|
+
if (!consented) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
try {
|
|
87
|
+
const response = await fetch('https://api.anthropic.com/v1/messages', {
|
|
88
|
+
method: 'POST',
|
|
89
|
+
headers: {
|
|
90
|
+
'x-api-key': apiKey,
|
|
91
|
+
'anthropic-version': '2023-06-01',
|
|
92
|
+
'content-type': 'application/json',
|
|
93
|
+
},
|
|
94
|
+
body: JSON.stringify({
|
|
95
|
+
model: 'claude-haiku-4-5-20251001',
|
|
96
|
+
max_tokens: 150,
|
|
97
|
+
system: SYSTEM_PROMPT,
|
|
98
|
+
messages: [{ role: 'user', content: input }],
|
|
99
|
+
}),
|
|
100
|
+
signal: AbortSignal.timeout(5000),
|
|
101
|
+
});
|
|
102
|
+
if (!response.ok)
|
|
103
|
+
return null;
|
|
104
|
+
const data = await response.json();
|
|
105
|
+
const text = data.content?.[0]?.text;
|
|
106
|
+
if (!text)
|
|
107
|
+
return null;
|
|
108
|
+
const parsed = JSON.parse(text);
|
|
109
|
+
if (parsed.command && parsed.reason) {
|
|
110
|
+
return parsed;
|
|
111
|
+
}
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async function handleNaturalLanguage(input) {
|
|
119
|
+
// First try static intent matching
|
|
120
|
+
const { matchIntent } = await import('./intent-map.js');
|
|
121
|
+
const staticMatch = matchIntent(input);
|
|
122
|
+
if (staticMatch) {
|
|
123
|
+
process.stdout.write(`\n${(0, colors_js_1.bold)('Matched:')} ${(0, colors_js_1.cyan)(staticMatch.command)}\n`);
|
|
124
|
+
process.stdout.write(`${(0, colors_js_1.gray)(staticMatch.description)}\n\n`);
|
|
125
|
+
process.stdout.write(`${(0, colors_js_1.gray)('Run this command? [Y/n]')} `);
|
|
126
|
+
return staticMatch.command;
|
|
127
|
+
}
|
|
128
|
+
// Try LLM fallback
|
|
129
|
+
process.stderr.write(`${(0, colors_js_1.gray)('Analyzing...')}\n`);
|
|
130
|
+
const llmResult = await llmFallback(input);
|
|
131
|
+
if (llmResult) {
|
|
132
|
+
process.stdout.write(`\n${(0, colors_js_1.bold)('Suggested:')} ${(0, colors_js_1.cyan)(llmResult.command)}\n`);
|
|
133
|
+
process.stdout.write(`${(0, colors_js_1.gray)(llmResult.reason)}\n\n`);
|
|
134
|
+
process.stdout.write(`${(0, colors_js_1.yellow)('Note:')} This suggestion was generated by AI.\n`);
|
|
135
|
+
process.stdout.write(`${(0, colors_js_1.gray)('Run this command? [Y/n]')} `);
|
|
136
|
+
return llmResult.command;
|
|
137
|
+
}
|
|
138
|
+
process.stdout.write(`Could not understand: "${input}"\n`);
|
|
139
|
+
process.stdout.write(`Try: opena2a ~${input.split(' ')[0]} (semantic search)\n`);
|
|
140
|
+
process.stdout.write(` opena2a --help (list all commands)\n`);
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=llm-fallback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-fallback.js","sourceRoot":"","sources":["../../src/natural/llm-fallback.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive HTML report generator (ScoutSuite-style).
|
|
3
|
+
*
|
|
4
|
+
* Generates a self-contained HTML file with:
|
|
5
|
+
* - Dark theme matching HMA website design language
|
|
6
|
+
* - Embedded JSON data (no external dependencies)
|
|
7
|
+
* - Hash-based SPA navigation (#dashboard, #findings, #finding-CRED-001)
|
|
8
|
+
* - Severity filtering and text search
|
|
9
|
+
* - Audience toggle (Executive / Engineering)
|
|
10
|
+
* - SVG donut chart for severity breakdown
|
|
11
|
+
*
|
|
12
|
+
* Design tokens from hackmyagent-web:
|
|
13
|
+
* Background: #0a0a0a, Card: #171717, Border: #262626
|
|
14
|
+
* Primary: #14b8a6 (teal), Muted: #a3a3a3
|
|
15
|
+
* Critical: #ef4444, High: #f97316, Medium: #eab308, Low: #3b82f6
|
|
16
|
+
* Font: system monospace (JetBrains Mono fallback)
|
|
17
|
+
*/
|
|
18
|
+
export interface InteractiveReportFinding {
|
|
19
|
+
id: string;
|
|
20
|
+
severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
|
|
21
|
+
title: string;
|
|
22
|
+
description: string;
|
|
23
|
+
explanation?: string;
|
|
24
|
+
businessImpact?: string;
|
|
25
|
+
category: string;
|
|
26
|
+
file?: string;
|
|
27
|
+
line?: number;
|
|
28
|
+
fix?: string;
|
|
29
|
+
passed: boolean;
|
|
30
|
+
evidence?: string;
|
|
31
|
+
}
|
|
32
|
+
export interface InteractiveReportData {
|
|
33
|
+
metadata: {
|
|
34
|
+
generatedAt: string;
|
|
35
|
+
toolVersion: string;
|
|
36
|
+
targetName: string;
|
|
37
|
+
scanType: string;
|
|
38
|
+
};
|
|
39
|
+
summary: {
|
|
40
|
+
totalFindings: number;
|
|
41
|
+
bySeverity: Record<string, number>;
|
|
42
|
+
score?: number;
|
|
43
|
+
grade?: string;
|
|
44
|
+
};
|
|
45
|
+
findings: InteractiveReportFinding[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Generate a self-contained interactive HTML report.
|
|
49
|
+
*/
|
|
50
|
+
export declare function generateInteractiveHtml(data: InteractiveReportData): string;
|
|
51
|
+
//# sourceMappingURL=interactive-html.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactive-html.d.ts","sourceRoot":"","sources":["../../src/report/interactive-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,wBAAwB,EAAE,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAoD3E"}
|