@certscore/mcp 0.2.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/LICENSE +5 -0
- package/README.md +261 -0
- package/dist/certscore-mcp.mjs +23023 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +129 -0
- package/dist/server.d.ts +8 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +148 -0
- package/dist/tools.d.ts +77 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +329 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/package.json +65 -0
- package/server.json +37 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { createCertScoreMcpServer } from "./server.js";
|
|
2
|
+
export { explainFinding, exportFindings, findingsFromReport } from "./tools.js";
|
|
3
|
+
export { CERTSCORE_MCP_VERSION } from "./version.js";
|
|
4
|
+
export interface CertScoreMcpDoctorOptions {
|
|
5
|
+
env?: Record<string, string | undefined>;
|
|
6
|
+
fetch?: typeof fetch;
|
|
7
|
+
nodeVersion?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function getCertScoreMcpDoctorReport(options?: CertScoreMcpDoctorOptions): Promise<{
|
|
10
|
+
exitCode: number;
|
|
11
|
+
lines: string[];
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAMrD,MAAM,WAAW,yBAAyB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA+CD,wBAAsB,2BAA2B,CAAC,OAAO,GAAE,yBAA8B;;;GA0DxF"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { createCertScoreMcpServer } from "./server.js";
|
|
5
|
+
import { CERTSCORE_MCP_VERSION } from "./version.js";
|
|
6
|
+
export { createCertScoreMcpServer } from "./server.js";
|
|
7
|
+
export { explainFinding, exportFindings, findingsFromReport } from "./tools.js";
|
|
8
|
+
export { CERTSCORE_MCP_VERSION } from "./version.js";
|
|
9
|
+
const DEFAULT_CERTSCORE_BASE_URL = "https://certscore.ai";
|
|
10
|
+
const MIN_NODE_MAJOR = 20;
|
|
11
|
+
const MAX_NODE_MAJOR_EXCLUSIVE = 25;
|
|
12
|
+
function parseTimeout(value) {
|
|
13
|
+
if (!value) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
const timeout = Number(value);
|
|
17
|
+
return Number.isFinite(timeout) && timeout > 0 ? timeout : undefined;
|
|
18
|
+
}
|
|
19
|
+
async function main() {
|
|
20
|
+
if (process.argv.includes("--version")) {
|
|
21
|
+
console.log(CERTSCORE_MCP_VERSION);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (process.argv.includes("--help") || process.argv.includes("-h")) {
|
|
25
|
+
console.log([
|
|
26
|
+
"certscore-mcp",
|
|
27
|
+
"",
|
|
28
|
+
"CertScore MCP stdio server.",
|
|
29
|
+
"",
|
|
30
|
+
"Environment:",
|
|
31
|
+
" CERTSCORE_API_KEY CertScore API token.",
|
|
32
|
+
" CERTSCORE_BASE_URL Optional API base URL. Defaults to https://certscore.ai.",
|
|
33
|
+
" CERTSCORE_REQUEST_TIMEOUT_MS Optional request timeout.",
|
|
34
|
+
"",
|
|
35
|
+
"Usage:",
|
|
36
|
+
" certscore-mcp",
|
|
37
|
+
" certscore-mcp doctor"
|
|
38
|
+
].join("\n"));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (process.argv.includes("doctor")) {
|
|
42
|
+
const result = await getCertScoreMcpDoctorReport();
|
|
43
|
+
console.log(result.lines.join("\n"));
|
|
44
|
+
process.exitCode = result.exitCode;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const server = createCertScoreMcpServer({
|
|
48
|
+
apiKey: process.env.CERTSCORE_API_KEY,
|
|
49
|
+
baseUrl: process.env.CERTSCORE_BASE_URL,
|
|
50
|
+
timeout: parseTimeout(process.env.CERTSCORE_REQUEST_TIMEOUT_MS)
|
|
51
|
+
});
|
|
52
|
+
await server.connect(new StdioServerTransport());
|
|
53
|
+
}
|
|
54
|
+
export async function getCertScoreMcpDoctorReport(options = {}) {
|
|
55
|
+
const env = options.env ?? process.env;
|
|
56
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
57
|
+
const nodeVersion = options.nodeVersion ?? process.versions.node;
|
|
58
|
+
const lines = ["CertScore MCP doctor"];
|
|
59
|
+
let exitCode = 0;
|
|
60
|
+
lines.push(`[ok] version ${CERTSCORE_MCP_VERSION}`);
|
|
61
|
+
const nodeMajor = Number(nodeVersion.split(".")[0]);
|
|
62
|
+
if (Number.isInteger(nodeMajor) && nodeMajor >= MIN_NODE_MAJOR && nodeMajor < MAX_NODE_MAJOR_EXCLUSIVE) {
|
|
63
|
+
lines.push(`[ok] Node.js ${nodeVersion} is compatible`);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
lines.push(`[error] Node.js ${nodeVersion || "unknown"} is not compatible; use Node.js >=20 <25`);
|
|
67
|
+
exitCode = 1;
|
|
68
|
+
}
|
|
69
|
+
const baseUrlInput = env.CERTSCORE_BASE_URL?.trim() || DEFAULT_CERTSCORE_BASE_URL;
|
|
70
|
+
let healthUrl = null;
|
|
71
|
+
try {
|
|
72
|
+
const baseUrl = new URL(baseUrlInput);
|
|
73
|
+
healthUrl = new URL("/api/v2/health", baseUrl);
|
|
74
|
+
lines.push(`[ok] base URL ${baseUrl.origin}`);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
lines.push(`[error] CERTSCORE_BASE_URL is not a valid URL`);
|
|
78
|
+
exitCode = 1;
|
|
79
|
+
}
|
|
80
|
+
if (healthUrl) {
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetchImpl(healthUrl, {
|
|
83
|
+
headers: { accept: "application/json" },
|
|
84
|
+
signal: AbortSignal.timeout(10_000)
|
|
85
|
+
});
|
|
86
|
+
if (response.ok) {
|
|
87
|
+
lines.push(`[ok] API health reachable at ${healthUrl.href}`);
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
lines.push(`[error] API health returned HTTP ${response.status} at ${healthUrl.href}`);
|
|
91
|
+
exitCode = 1;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
const message = error instanceof Error && error.message ? error.message : "request failed";
|
|
96
|
+
lines.push(`[error] API health unreachable at ${healthUrl.href}: ${message}`);
|
|
97
|
+
exitCode = 1;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (env.CERTSCORE_API_KEY?.trim()) {
|
|
101
|
+
lines.push("[ok] CERTSCORE_API_KEY is present");
|
|
102
|
+
lines.push("[info] No dedicated auth-check endpoint is exposed; verify credentials with a real MCP tool call such as scan_site.");
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
lines.push("[warn] CERTSCORE_API_KEY is not set");
|
|
106
|
+
lines.push("[info] Set CERTSCORE_API_KEY before connecting an MCP client or calling authenticated tools.");
|
|
107
|
+
}
|
|
108
|
+
lines.push("CertScore outputs are automated public-web observations for review, not legal advice, certification, or a compliance determination.");
|
|
109
|
+
return { exitCode, lines };
|
|
110
|
+
}
|
|
111
|
+
function isMainModule() {
|
|
112
|
+
const entrypoint = process.argv[1];
|
|
113
|
+
if (!entrypoint) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
try {
|
|
117
|
+
return realpathSync(fileURLToPath(import.meta.url)) === realpathSync(entrypoint);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return import.meta.url === `file://${entrypoint}`;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (isMainModule()) {
|
|
124
|
+
main().catch((error) => {
|
|
125
|
+
const message = error instanceof Error ? error.stack ?? error.message : String(error);
|
|
126
|
+
console.error(message);
|
|
127
|
+
process.exitCode = 1;
|
|
128
|
+
});
|
|
129
|
+
}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
export interface CertScoreMcpOptions {
|
|
3
|
+
apiKey?: string;
|
|
4
|
+
baseUrl?: string;
|
|
5
|
+
timeout?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare function createCertScoreMcpServer(options?: CertScoreMcpOptions): McpServer;
|
|
8
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmCD,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,mBAAwB,aAkLzE"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { CertScoreClient } from "@certscore/sdk";
|
|
2
|
+
import { certScoreMcpToolContracts } from "@certscore/api-contracts";
|
|
3
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
|
+
import { CERTSCORE_MCP_VERSION } from "./version.js";
|
|
5
|
+
import { boundEvidencePacket, exportFindings, limitPreConsentRows, normalizeDetail, normalizeFormat, paginateFindingList, scanIdFromStatus, toToolError, toToolResult } from "./tools.js";
|
|
6
|
+
function toolContract(name) {
|
|
7
|
+
const contract = certScoreMcpToolContracts.find((candidate) => candidate.name === name);
|
|
8
|
+
if (!contract) {
|
|
9
|
+
throw new Error(`Missing CertScore MCP tool contract: ${name}`);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
title: contract.title,
|
|
13
|
+
description: contract.description,
|
|
14
|
+
inputSchema: contract.inputSchema,
|
|
15
|
+
outputSchema: contract.outputSchema,
|
|
16
|
+
annotations: contract.annotations
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function createCertScoreMcpServer(options = {}) {
|
|
20
|
+
const client = new CertScoreClient({
|
|
21
|
+
apiKey: options.apiKey,
|
|
22
|
+
baseUrl: options.baseUrl,
|
|
23
|
+
timeout: options.timeout
|
|
24
|
+
});
|
|
25
|
+
const server = new McpServer({
|
|
26
|
+
name: "certscore",
|
|
27
|
+
version: CERTSCORE_MCP_VERSION
|
|
28
|
+
});
|
|
29
|
+
const registerTool = server.registerTool.bind(server);
|
|
30
|
+
registerTool("scan_site", toolContract("scan_site"), async (input) => {
|
|
31
|
+
try {
|
|
32
|
+
return toToolResult(await client.scans.create(input.url, {
|
|
33
|
+
freshness: input.freshness ?? "latest",
|
|
34
|
+
scanFrom: input.scanFrom
|
|
35
|
+
}));
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
return toToolError(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
registerTool("get_scan", toolContract("get_scan"), async ({ scanId }) => {
|
|
42
|
+
try {
|
|
43
|
+
return toToolResult(await client.scans.get(scanId));
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return toToolError(error);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
registerTool("get_scan_status", toolContract("get_scan_status"), async ({ jobId, scanId }) => {
|
|
50
|
+
try {
|
|
51
|
+
if (scanId) {
|
|
52
|
+
return toToolResult(await client.scans.status(scanId));
|
|
53
|
+
}
|
|
54
|
+
if (!jobId) {
|
|
55
|
+
return toToolResult({
|
|
56
|
+
error: {
|
|
57
|
+
name: "InvalidToolInput",
|
|
58
|
+
message: "Provide either scanId for API v2 scan status or jobId for Pulse job status."
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const status = await client.getJobStatus(jobId);
|
|
63
|
+
return toToolResult({
|
|
64
|
+
...status,
|
|
65
|
+
scanId: scanIdFromStatus(status)
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
return toToolError(error);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
registerTool("get_report", toolContract("get_report"), async ({ scanId, detail, format }) => {
|
|
73
|
+
try {
|
|
74
|
+
const normalizedFormat = normalizeFormat(format);
|
|
75
|
+
const result = normalizedFormat === "markdown"
|
|
76
|
+
? await client.getScan(scanId, {
|
|
77
|
+
detail: normalizeDetail(detail),
|
|
78
|
+
format: "markdown"
|
|
79
|
+
})
|
|
80
|
+
: await client.getScan(scanId, {
|
|
81
|
+
detail: normalizeDetail(detail),
|
|
82
|
+
format: "json"
|
|
83
|
+
});
|
|
84
|
+
return toToolResult(result);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
return toToolError(error);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
registerTool("get_evidence", toolContract("get_evidence"), async ({ scanId }) => {
|
|
91
|
+
try {
|
|
92
|
+
return toToolResult(boundEvidencePacket(await client.getScan(scanId, { detail: "evidence", format: "json" })));
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return toToolError(error);
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
registerTool("export_findings", toolContract("export_findings"), async ({ scanId }) => {
|
|
99
|
+
try {
|
|
100
|
+
const report = await client.getScan(scanId, { detail: "full", format: "json" });
|
|
101
|
+
return toToolResult(exportFindings(report));
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
return toToolError(error);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
registerTool("list_findings", toolContract("list_findings"), async ({ limit, offset, scanId }) => {
|
|
108
|
+
try {
|
|
109
|
+
return toToolResult(paginateFindingList(await client.findings.list(scanId), { limit, offset }));
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
return toToolError(error);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
registerTool("get_pre_consent_cookies_trackers", toolContract("get_pre_consent_cookies_trackers"), async ({ maxRows, scanId }) => {
|
|
116
|
+
try {
|
|
117
|
+
return toToolResult(limitPreConsentRows(await client.scans.preConsentCookiesTrackers(scanId), { maxRows }));
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
return toToolError(error);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
registerTool("explain_finding", toolContract("explain_finding"), async ({ scanId, findingId }) => {
|
|
124
|
+
try {
|
|
125
|
+
return toToolResult(await client.findings.explain(scanId, findingId));
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
return toToolError(error);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
registerTool("get_latest_domain_scan", toolContract("get_latest_domain_scan"), async ({ domain, scanFrom }) => {
|
|
132
|
+
try {
|
|
133
|
+
return toToolResult(await client.domains.latest(domain, { scanFrom }));
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return toToolError(error);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
registerTool("get_latest_domain_pre_consent_cookies_trackers", toolContract("get_latest_domain_pre_consent_cookies_trackers"), async ({ domain, maxRows, scanFrom }) => {
|
|
140
|
+
try {
|
|
141
|
+
return toToolResult(limitPreConsentRows(await client.domains.latestPreConsentCookiesTrackers(domain, { scanFrom }), { maxRows }));
|
|
142
|
+
}
|
|
143
|
+
catch (error) {
|
|
144
|
+
return toToolError(error);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
return server;
|
|
148
|
+
}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import { type JobStatus, type PulseDetail, type PulseFormat, type PulseResult, type TopFinding } from "@certscore/sdk";
|
|
3
|
+
export declare const MAX_EVIDENCE_PACKET_CHARS = 250000;
|
|
4
|
+
export declare function toToolResult(payload: unknown): CallToolResult;
|
|
5
|
+
export declare function toToolError(error: unknown): CallToolResult;
|
|
6
|
+
export declare function boundEvidencePacket<T>(payload: T, maxSerializedChars?: number): T | Record<string, unknown>;
|
|
7
|
+
export declare function normalizeDetail(detail: PulseDetail | undefined): PulseDetail;
|
|
8
|
+
export declare function normalizeFormat(format: PulseFormat | undefined): PulseFormat;
|
|
9
|
+
export declare function scanIdFromStatus(status: JobStatus): string | null;
|
|
10
|
+
export declare function scanIdFromPulse(report: PulseResult): string | null;
|
|
11
|
+
export declare function findingsFromReport(report: PulseResult): TopFinding[];
|
|
12
|
+
export declare function exportFindings(report: PulseResult): {
|
|
13
|
+
type: string;
|
|
14
|
+
scanId: string | null;
|
|
15
|
+
domain: string | null;
|
|
16
|
+
summary: import("packages/certscore-sdk/dist/types.js").PulseSummary | null;
|
|
17
|
+
findings: {
|
|
18
|
+
id: string;
|
|
19
|
+
label: string | null;
|
|
20
|
+
criticality: string | null;
|
|
21
|
+
confidence: string | null;
|
|
22
|
+
plainEnglish: string | null;
|
|
23
|
+
evidenceDigest: import("@certscore/sdk").EvidenceDigest | null;
|
|
24
|
+
evidenceSummary: string | null;
|
|
25
|
+
reviewLenses: string[];
|
|
26
|
+
anchorUrl: string | null;
|
|
27
|
+
nextStep: string | null;
|
|
28
|
+
}[];
|
|
29
|
+
disclaimer: string | null;
|
|
30
|
+
};
|
|
31
|
+
export declare function paginateFindingList<T extends Record<string, unknown>>(payload: T, options?: {
|
|
32
|
+
limit?: number;
|
|
33
|
+
offset?: number;
|
|
34
|
+
}): T;
|
|
35
|
+
export declare function limitPreConsentRows<T extends Record<string, unknown>>(payload: T, options?: {
|
|
36
|
+
maxRows?: number;
|
|
37
|
+
}): T;
|
|
38
|
+
export declare function explainFinding(report: PulseResult, findingId: string): {
|
|
39
|
+
type: string;
|
|
40
|
+
scanId: string | null;
|
|
41
|
+
findingId: string;
|
|
42
|
+
found: boolean;
|
|
43
|
+
message: string;
|
|
44
|
+
availableFindingIds: string[];
|
|
45
|
+
disclaimer: string | null;
|
|
46
|
+
label?: undefined;
|
|
47
|
+
criticality?: undefined;
|
|
48
|
+
confidence?: undefined;
|
|
49
|
+
plainEnglish?: undefined;
|
|
50
|
+
evidenceSummary?: undefined;
|
|
51
|
+
evidenceDigest?: undefined;
|
|
52
|
+
exampleEvents?: undefined;
|
|
53
|
+
reviewLenses?: undefined;
|
|
54
|
+
anchorUrl?: undefined;
|
|
55
|
+
nextStep?: undefined;
|
|
56
|
+
caveats?: undefined;
|
|
57
|
+
} | {
|
|
58
|
+
type: string;
|
|
59
|
+
scanId: string | null;
|
|
60
|
+
findingId: string;
|
|
61
|
+
found: boolean;
|
|
62
|
+
label: string;
|
|
63
|
+
criticality: string | null;
|
|
64
|
+
confidence: string | null;
|
|
65
|
+
plainEnglish: string | null;
|
|
66
|
+
evidenceSummary: string | null;
|
|
67
|
+
evidenceDigest: import("@certscore/sdk").EvidenceDigest | null;
|
|
68
|
+
exampleEvents: Record<string, unknown>[];
|
|
69
|
+
reviewLenses: string[];
|
|
70
|
+
anchorUrl: string | null;
|
|
71
|
+
nextStep: string | null;
|
|
72
|
+
caveats: string[];
|
|
73
|
+
disclaimer: string | null;
|
|
74
|
+
message?: undefined;
|
|
75
|
+
availableFindingIds?: undefined;
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAkB,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAGvI,eAAO,MAAM,yBAAyB,SAAU,CAAC;AAKjD,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,cAAc,CAa7D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAyB1D;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,kBAAkB,SAA4B,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0C9H;AA6ID,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAE5E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,CAE5E;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,iBAEjD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,iBAGlD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,UAAU,EAAE,CAQpE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;EAoBjD;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,OAAO,EAAE,CAAC,EACV,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,CAAC,CAoBH;AAED,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnE,OAAO,EAAE,CAAC,EACV,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,CAAC,CAiBH;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BpE"}
|