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,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Advisory check utility -- fetches security advisories from the OpenA2A Registry
|
|
4
|
+
* and warns users about flagged tools in their project.
|
|
5
|
+
*
|
|
6
|
+
* Called during `opena2a init` and `opena2a scan` to surface intelligence from
|
|
7
|
+
* community scan reports.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.checkAdvisories = checkAdvisories;
|
|
44
|
+
exports.printAdvisoryWarnings = printAdvisoryWarnings;
|
|
45
|
+
const fs = __importStar(require("node:fs"));
|
|
46
|
+
const path = __importStar(require("node:path"));
|
|
47
|
+
const colors_js_1 = require("./colors.js");
|
|
48
|
+
// --- Cache ---
|
|
49
|
+
const CACHE_DIR = '.opena2a/cache';
|
|
50
|
+
const CACHE_FILE = 'advisories.json';
|
|
51
|
+
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
52
|
+
function getCachePath(dir) {
|
|
53
|
+
return path.join(dir, CACHE_DIR, CACHE_FILE);
|
|
54
|
+
}
|
|
55
|
+
function readCache(dir) {
|
|
56
|
+
const cachePath = getCachePath(dir);
|
|
57
|
+
if (!fs.existsSync(cachePath))
|
|
58
|
+
return null;
|
|
59
|
+
try {
|
|
60
|
+
const raw = fs.readFileSync(cachePath, 'utf-8');
|
|
61
|
+
const cached = JSON.parse(raw);
|
|
62
|
+
if (Date.now() - cached.fetchedAt < CACHE_TTL_MS) {
|
|
63
|
+
return cached;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Corrupted cache
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function writeCache(dir, data) {
|
|
72
|
+
const cachePath = getCachePath(dir);
|
|
73
|
+
const cacheDir = path.dirname(cachePath);
|
|
74
|
+
try {
|
|
75
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
76
|
+
fs.writeFileSync(cachePath, JSON.stringify({
|
|
77
|
+
fetchedAt: Date.now(),
|
|
78
|
+
data,
|
|
79
|
+
}), 'utf-8');
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
// Cache write failure is non-critical
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// --- Fetch ---
|
|
86
|
+
async function fetchAdvisories(registryUrl) {
|
|
87
|
+
try {
|
|
88
|
+
// Fetch advisories from the last 30 days
|
|
89
|
+
const since = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
90
|
+
const url = `${registryUrl}/api/v1/trust/advisories?since=${since}&limit=100`;
|
|
91
|
+
const response = await fetch(url, {
|
|
92
|
+
method: 'GET',
|
|
93
|
+
headers: { 'Accept': 'application/json' },
|
|
94
|
+
signal: AbortSignal.timeout(5_000),
|
|
95
|
+
});
|
|
96
|
+
if (!response.ok)
|
|
97
|
+
return null;
|
|
98
|
+
return await response.json();
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// --- Package detection ---
|
|
105
|
+
function detectProjectPackages(dir) {
|
|
106
|
+
const packages = [];
|
|
107
|
+
// Read package.json dependencies
|
|
108
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
109
|
+
if (fs.existsSync(pkgPath)) {
|
|
110
|
+
try {
|
|
111
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
112
|
+
const deps = {
|
|
113
|
+
...pkg.dependencies,
|
|
114
|
+
...pkg.devDependencies,
|
|
115
|
+
...pkg.optionalDependencies,
|
|
116
|
+
};
|
|
117
|
+
packages.push(...Object.keys(deps ?? {}));
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Invalid package.json
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Read go.mod dependencies
|
|
124
|
+
const goModPath = path.join(dir, 'go.mod');
|
|
125
|
+
if (fs.existsSync(goModPath)) {
|
|
126
|
+
try {
|
|
127
|
+
const content = fs.readFileSync(goModPath, 'utf-8');
|
|
128
|
+
const requireBlock = content.match(/require\s*\(([\s\S]*?)\)/);
|
|
129
|
+
if (requireBlock) {
|
|
130
|
+
const lines = requireBlock[1].split('\n');
|
|
131
|
+
for (const line of lines) {
|
|
132
|
+
const match = line.trim().match(/^(\S+)\s/);
|
|
133
|
+
if (match)
|
|
134
|
+
packages.push(match[1]);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Invalid go.mod
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Read requirements.txt
|
|
143
|
+
const reqPath = path.join(dir, 'requirements.txt');
|
|
144
|
+
if (fs.existsSync(reqPath)) {
|
|
145
|
+
try {
|
|
146
|
+
const content = fs.readFileSync(reqPath, 'utf-8');
|
|
147
|
+
for (const line of content.split('\n')) {
|
|
148
|
+
const trimmed = line.trim();
|
|
149
|
+
if (trimmed && !trimmed.startsWith('#')) {
|
|
150
|
+
const name = trimmed.split(/[=<>!~]/)[0].trim();
|
|
151
|
+
if (name)
|
|
152
|
+
packages.push(name);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Invalid requirements.txt
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return packages;
|
|
161
|
+
}
|
|
162
|
+
// --- Main check ---
|
|
163
|
+
async function checkAdvisories(dir, registryUrl) {
|
|
164
|
+
const url = registryUrl ?? 'https://registry.opena2a.org';
|
|
165
|
+
// Check cache first
|
|
166
|
+
const cached = readCache(dir);
|
|
167
|
+
let data;
|
|
168
|
+
let fromCache = false;
|
|
169
|
+
if (cached) {
|
|
170
|
+
data = cached.data;
|
|
171
|
+
fromCache = true;
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
const fetched = await fetchAdvisories(url);
|
|
175
|
+
if (!fetched) {
|
|
176
|
+
return { advisories: [], matchedPackages: [], total: 0, fromCache: false };
|
|
177
|
+
}
|
|
178
|
+
data = fetched;
|
|
179
|
+
writeCache(dir, data);
|
|
180
|
+
}
|
|
181
|
+
if (data.advisories.length === 0) {
|
|
182
|
+
return { advisories: [], matchedPackages: [], total: 0, fromCache };
|
|
183
|
+
}
|
|
184
|
+
// Match advisories against project packages
|
|
185
|
+
const projectPackages = new Set(detectProjectPackages(dir));
|
|
186
|
+
const matched = [];
|
|
187
|
+
const matchedNames = [];
|
|
188
|
+
for (const advisory of data.advisories) {
|
|
189
|
+
for (const affected of advisory.affected ?? []) {
|
|
190
|
+
const pkgName = affected.package?.name;
|
|
191
|
+
if (pkgName && projectPackages.has(pkgName)) {
|
|
192
|
+
matched.push(advisory);
|
|
193
|
+
if (!matchedNames.includes(pkgName)) {
|
|
194
|
+
matchedNames.push(pkgName);
|
|
195
|
+
}
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
advisories: matched,
|
|
202
|
+
matchedPackages: matchedNames,
|
|
203
|
+
total: data.total,
|
|
204
|
+
fromCache,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
// --- Output ---
|
|
208
|
+
function printAdvisoryWarnings(check) {
|
|
209
|
+
if (check.advisories.length === 0)
|
|
210
|
+
return;
|
|
211
|
+
process.stdout.write('\n');
|
|
212
|
+
process.stdout.write((0, colors_js_1.red)((0, colors_js_1.bold)(' Security Advisories')) + '\n');
|
|
213
|
+
process.stdout.write((0, colors_js_1.dim)(' ' + '-'.repeat(47)) + '\n');
|
|
214
|
+
for (const advisory of check.advisories) {
|
|
215
|
+
const severity = advisory.severity?.[0]?.score ?? 'UNKNOWN';
|
|
216
|
+
const severityColor = severity === 'CRITICAL' ? colors_js_1.red
|
|
217
|
+
: severity === 'HIGH' ? colors_js_1.red
|
|
218
|
+
: severity === 'MODERATE' ? colors_js_1.yellow
|
|
219
|
+
: colors_js_1.dim;
|
|
220
|
+
const packages = (advisory.affected ?? []).map(a => a.package?.name).filter(Boolean);
|
|
221
|
+
process.stdout.write(` ${severityColor(`[${severity}]`.padEnd(12))} ${advisory.summary}\n`);
|
|
222
|
+
process.stdout.write(` ${' '.repeat(12)} ${(0, colors_js_1.dim)(`ID: ${advisory.id} Packages: ${packages.join(', ')}`)}\n`);
|
|
223
|
+
}
|
|
224
|
+
process.stdout.write((0, colors_js_1.dim)(' ' + '-'.repeat(47)) + '\n');
|
|
225
|
+
process.stdout.write(` ${(0, colors_js_1.yellow)(`${check.advisories.length} advisory(ies)`)} affecting ${(0, colors_js_1.cyan)(check.matchedPackages.join(', '))}\n`);
|
|
226
|
+
process.stdout.write((0, colors_js_1.dim)(` Run: opena2a verify --package <name> for details\n`));
|
|
227
|
+
process.stdout.write('\n');
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=advisories.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisories.js","sourceRoot":"","sources":["../../src/util/advisories.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const bold: (text: string) => string;
|
|
2
|
+
export declare const dim: (text: string) => string;
|
|
3
|
+
export declare const red: (text: string) => string;
|
|
4
|
+
export declare const green: (text: string) => string;
|
|
5
|
+
export declare const yellow: (text: string) => string;
|
|
6
|
+
export declare const blue: (text: string) => string;
|
|
7
|
+
export declare const cyan: (text: string) => string;
|
|
8
|
+
export declare const gray: (text: string) => string;
|
|
9
|
+
//# sourceMappingURL=colors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.d.ts","sourceRoot":"","sources":["../../src/util/colors.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,IAAI,SALsC,MAAM,KAAK,MAKnC,CAAC;AAChC,eAAO,MAAM,GAAG,SANuC,MAAM,KAAK,MAMpC,CAAC;AAC/B,eAAO,MAAM,GAAG,SAPuC,MAAM,KAAK,MAOnC,CAAC;AAChC,eAAO,MAAM,KAAK,SARqC,MAAM,KAAK,MAQjC,CAAC;AAClC,eAAO,MAAM,MAAM,SAToC,MAAM,KAAK,MAShC,CAAC;AACnC,eAAO,MAAM,IAAI,SAVsC,MAAM,KAAK,MAUlC,CAAC;AACjC,eAAO,MAAM,IAAI,SAXsC,MAAM,KAAK,MAWlC,CAAC;AACjC,eAAO,MAAM,IAAI,SAZsC,MAAM,KAAK,MAYlC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.gray = exports.cyan = exports.blue = exports.yellow = exports.green = exports.red = exports.dim = exports.bold = void 0;
|
|
4
|
+
const enabled = process.env.NO_COLOR === undefined && process.stdout.isTTY;
|
|
5
|
+
function wrap(code, resetCode) {
|
|
6
|
+
if (!enabled)
|
|
7
|
+
return (text) => text;
|
|
8
|
+
return (text) => `\x1b[${code}m${text}\x1b[${resetCode}m`;
|
|
9
|
+
}
|
|
10
|
+
exports.bold = wrap(1, 22);
|
|
11
|
+
exports.dim = wrap(2, 22);
|
|
12
|
+
exports.red = wrap(31, 39);
|
|
13
|
+
exports.green = wrap(32, 39);
|
|
14
|
+
exports.yellow = wrap(33, 39);
|
|
15
|
+
exports.blue = wrap(34, 39);
|
|
16
|
+
exports.cyan = wrap(36, 39);
|
|
17
|
+
exports.gray = wrap(90, 39);
|
|
18
|
+
//# sourceMappingURL=colors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/util/colors.ts"],"names":[],"mappings":";;;AAAA,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AAE3E,SAAS,IAAI,CAAC,IAAY,EAAE,SAAiB;IAC3C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC;IAC5C,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI,IAAI,QAAQ,SAAS,GAAG,CAAC;AACpE,CAAC;AAEY,QAAA,IAAI,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACnB,QAAA,GAAG,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,QAAA,GAAG,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACnB,QAAA,KAAK,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACrB,QAAA,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACtB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACpB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACpB,QAAA,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared credential detection patterns used by protect and init commands.
|
|
3
|
+
*/
|
|
4
|
+
export interface CredentialPattern {
|
|
5
|
+
id: string;
|
|
6
|
+
title: string;
|
|
7
|
+
pattern: RegExp;
|
|
8
|
+
envVarPrefix: string;
|
|
9
|
+
severity: string;
|
|
10
|
+
explanation: string;
|
|
11
|
+
businessImpact: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CredentialMatch {
|
|
14
|
+
/** Original matched value (e.g., "sk-ant-api03-...") */
|
|
15
|
+
value: string;
|
|
16
|
+
/** File where the credential was found */
|
|
17
|
+
filePath: string;
|
|
18
|
+
/** Line number in the file */
|
|
19
|
+
line: number;
|
|
20
|
+
/** Finding ID (e.g., "CRED-001", "DRIFT-001") */
|
|
21
|
+
findingId: string;
|
|
22
|
+
/** Suggested environment variable name */
|
|
23
|
+
envVar: string;
|
|
24
|
+
/** Severity from the scanner */
|
|
25
|
+
severity: string;
|
|
26
|
+
/** Human-readable title */
|
|
27
|
+
title: string;
|
|
28
|
+
/** Plain-language explanation of the risk */
|
|
29
|
+
explanation?: string;
|
|
30
|
+
/** Business impact description */
|
|
31
|
+
businessImpact?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare const CREDENTIAL_PATTERNS: CredentialPattern[];
|
|
34
|
+
export declare const SKIP_DIRS: Set<string>;
|
|
35
|
+
export declare const SKIP_EXTENSIONS: Set<string>;
|
|
36
|
+
export declare function walkFiles(dir: string, callback: (filePath: string) => void): void;
|
|
37
|
+
export declare function quickCredentialScan(targetDir: string): CredentialMatch[];
|
|
38
|
+
//# sourceMappingURL=credential-patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-patterns.d.ts","sourceRoot":"","sources":["../../src/util/credential-patterns.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAID,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAuDlD,CAAC;AAGF,eAAO,MAAM,SAAS,aAIpB,CAAC;AAEH,eAAO,MAAM,eAAe,aAQ1B,CAAC;AAIH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CA8BjF;AAID,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,EAAE,CAsDxE"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared credential detection patterns used by protect and init commands.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SKIP_EXTENSIONS = exports.SKIP_DIRS = exports.CREDENTIAL_PATTERNS = void 0;
|
|
40
|
+
exports.walkFiles = walkFiles;
|
|
41
|
+
exports.quickCredentialScan = quickCredentialScan;
|
|
42
|
+
const fs = __importStar(require("node:fs"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
44
|
+
// --- Patterns ---
|
|
45
|
+
exports.CREDENTIAL_PATTERNS = [
|
|
46
|
+
{
|
|
47
|
+
id: 'CRED-001',
|
|
48
|
+
title: 'Anthropic API Key',
|
|
49
|
+
pattern: /sk-ant-api\d{2}-[A-Za-z0-9_-]{80,}/g,
|
|
50
|
+
envVarPrefix: 'ANTHROPIC_API_KEY',
|
|
51
|
+
severity: 'critical',
|
|
52
|
+
explanation: 'Anthropic API key hardcoded in source. Anyone who reads this file can use your Anthropic account and access Claude models.',
|
|
53
|
+
businessImpact: 'Thousands in unauthorized API charges within hours. Bots actively scan for exposed keys in public repos.',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: 'CRED-002',
|
|
57
|
+
title: 'OpenAI API Key',
|
|
58
|
+
pattern: /sk-(?:proj-|test-|svcacct-|live-)?[A-Za-z0-9_-]{20,}/g,
|
|
59
|
+
envVarPrefix: 'OPENAI_API_KEY',
|
|
60
|
+
severity: 'critical',
|
|
61
|
+
explanation: 'OpenAI API key hardcoded in source. Grants full API access to anyone with the source code.',
|
|
62
|
+
businessImpact: 'Unauthorized model usage, data extraction, and billing abuse. Exposed keys are exploited within minutes.',
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 'DRIFT-001',
|
|
66
|
+
title: 'Google API Key (Gemini drift risk)',
|
|
67
|
+
pattern: /AIza[0-9A-Za-z_-]{35,}/g,
|
|
68
|
+
envVarPrefix: 'GOOGLE_API_KEY',
|
|
69
|
+
severity: 'high',
|
|
70
|
+
explanation: 'Google API key may have been provisioned for Maps but also grants Gemini AI access. Scope drift means the key can do more than intended.',
|
|
71
|
+
businessImpact: 'Attacker could run AI workloads billed to your account. Cross-service scope drift means you pay for services you did not authorize.',
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: 'DRIFT-002',
|
|
75
|
+
title: 'AWS Access Key (Bedrock drift risk)',
|
|
76
|
+
pattern: /AKIA[0-9A-Z]{16}/g,
|
|
77
|
+
envVarPrefix: 'AWS_ACCESS_KEY_ID',
|
|
78
|
+
severity: 'high',
|
|
79
|
+
explanation: 'AWS access key may grant Bedrock LLM access beyond its intended S3/EC2 scope. IAM policies often over-provision.',
|
|
80
|
+
businessImpact: 'Cross-service privilege escalation. AI model invocations billed to your account. Potential data exfiltration via Bedrock.',
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'CRED-003',
|
|
84
|
+
title: 'GitHub Token',
|
|
85
|
+
pattern: /gh[ps]_[A-Za-z0-9_]{36,}/g,
|
|
86
|
+
envVarPrefix: 'GITHUB_TOKEN',
|
|
87
|
+
severity: 'high',
|
|
88
|
+
explanation: 'GitHub token hardcoded in source. Grants repository access, potentially including private repos and org resources.',
|
|
89
|
+
businessImpact: 'Code theft, supply chain injection via unauthorized commits, and access to private repositories.',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: 'CRED-004',
|
|
93
|
+
title: 'Generic API Key in Assignment',
|
|
94
|
+
pattern: /(?:api[_-]?key|apikey|secret[_-]?key)\s*[:=]\s*['"]([A-Za-z0-9_\-/.]{20,})['"]/gi,
|
|
95
|
+
envVarPrefix: 'API_KEY',
|
|
96
|
+
severity: 'medium',
|
|
97
|
+
explanation: 'Generic API key found in a variable assignment. The pattern suggests a secret intended for environment variables, not source code.',
|
|
98
|
+
businessImpact: 'Depends on the service -- could expose billing, data, or administrative access. Rotate immediately.',
|
|
99
|
+
},
|
|
100
|
+
];
|
|
101
|
+
// Files/dirs to skip during scanning
|
|
102
|
+
exports.SKIP_DIRS = new Set([
|
|
103
|
+
'node_modules', '.git', 'dist', 'build', 'coverage',
|
|
104
|
+
'.next', '.nuxt', '__pycache__', '.venv', 'venv',
|
|
105
|
+
'.tox', '.mypy_cache', '.pytest_cache',
|
|
106
|
+
]);
|
|
107
|
+
exports.SKIP_EXTENSIONS = new Set([
|
|
108
|
+
'.png', '.jpg', '.jpeg', '.gif', '.ico', '.svg', '.webp',
|
|
109
|
+
'.woff', '.woff2', '.ttf', '.eot', '.otf',
|
|
110
|
+
'.zip', '.tar', '.gz', '.bz2', '.7z',
|
|
111
|
+
'.mp3', '.mp4', '.avi', '.mov', '.wav',
|
|
112
|
+
'.pdf', '.doc', '.docx', '.xls', '.xlsx',
|
|
113
|
+
'.exe', '.dll', '.so', '.dylib', '.o',
|
|
114
|
+
'.lock', '.map',
|
|
115
|
+
]);
|
|
116
|
+
// --- File walker ---
|
|
117
|
+
function walkFiles(dir, callback) {
|
|
118
|
+
let entries;
|
|
119
|
+
try {
|
|
120
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Dot-files to scan (credential sources)
|
|
126
|
+
const SCAN_DOTFILES = new Set(['.env', '.env.example', '.env.local', '.env.development', '.env.production', '.env.staging', '.env.test']);
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
if (entry.name.startsWith('.') && !SCAN_DOTFILES.has(entry.name))
|
|
129
|
+
continue;
|
|
130
|
+
if (entry.isDirectory()) {
|
|
131
|
+
if (exports.SKIP_DIRS.has(entry.name))
|
|
132
|
+
continue;
|
|
133
|
+
walkFiles(path.join(dir, entry.name), callback);
|
|
134
|
+
}
|
|
135
|
+
else if (entry.isFile()) {
|
|
136
|
+
const ext = path.extname(entry.name).toLowerCase();
|
|
137
|
+
if (exports.SKIP_EXTENSIONS.has(ext))
|
|
138
|
+
continue;
|
|
139
|
+
// Skip large files (>1MB)
|
|
140
|
+
try {
|
|
141
|
+
const stat = fs.statSync(path.join(dir, entry.name));
|
|
142
|
+
if (stat.size > 1_048_576)
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
callback(path.join(dir, entry.name));
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// --- Quick scan (used by init) ---
|
|
153
|
+
function quickCredentialScan(targetDir) {
|
|
154
|
+
const matches = [];
|
|
155
|
+
const seen = new Set();
|
|
156
|
+
walkFiles(targetDir, (filePath) => {
|
|
157
|
+
let content;
|
|
158
|
+
try {
|
|
159
|
+
content = fs.readFileSync(filePath, 'utf-8');
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
const lines = content.split('\n');
|
|
165
|
+
for (const pattern of exports.CREDENTIAL_PATTERNS) {
|
|
166
|
+
for (let i = 0; i < lines.length; i++) {
|
|
167
|
+
const line = lines[i];
|
|
168
|
+
const re = new RegExp(pattern.pattern.source, pattern.pattern.flags);
|
|
169
|
+
let match;
|
|
170
|
+
while ((match = re.exec(line)) !== null) {
|
|
171
|
+
const value = match[1] ?? match[0];
|
|
172
|
+
const dedupKey = `${value}:${filePath}`;
|
|
173
|
+
if (seen.has(dedupKey))
|
|
174
|
+
continue;
|
|
175
|
+
seen.add(dedupKey);
|
|
176
|
+
// Skip if it looks like an env var reference already
|
|
177
|
+
const before = line.slice(0, match.index);
|
|
178
|
+
if (/process\.env\.\w*$/.test(before) ||
|
|
179
|
+
/\$\{?\w*$/.test(before) ||
|
|
180
|
+
/os\.environ\[['"]?\w*$/.test(before) ||
|
|
181
|
+
/getenv\(['"]?\w*$/.test(before))
|
|
182
|
+
continue;
|
|
183
|
+
const base = pattern.envVarPrefix;
|
|
184
|
+
const existing = matches.filter(m => m.envVar.startsWith(base));
|
|
185
|
+
const envVar = existing.length === 0 ? base : `${base}_${existing.length + 1}`;
|
|
186
|
+
matches.push({
|
|
187
|
+
value,
|
|
188
|
+
filePath,
|
|
189
|
+
line: i + 1,
|
|
190
|
+
findingId: pattern.id,
|
|
191
|
+
envVar,
|
|
192
|
+
severity: pattern.severity,
|
|
193
|
+
title: pattern.title,
|
|
194
|
+
explanation: pattern.explanation,
|
|
195
|
+
businessImpact: pattern.businessImpact,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
return matches;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=credential-patterns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credential-patterns.js","sourceRoot":"","sources":["../../src/util/credential-patterns.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type ProjectType = 'node' | 'go' | 'python' | 'unknown';
|
|
2
|
+
export interface ProjectInfo {
|
|
3
|
+
type: ProjectType;
|
|
4
|
+
name: string | null;
|
|
5
|
+
version: string | null;
|
|
6
|
+
hasMcp: boolean;
|
|
7
|
+
hasEnv: boolean;
|
|
8
|
+
hasGit: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function detectProject(dir: string): ProjectInfo;
|
|
11
|
+
//# sourceMappingURL=detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../src/util/detect.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAiDtD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectProject = detectProject;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
function detectProject(dir) {
|
|
7
|
+
const info = {
|
|
8
|
+
type: 'unknown',
|
|
9
|
+
name: null,
|
|
10
|
+
version: null,
|
|
11
|
+
hasMcp: false,
|
|
12
|
+
hasEnv: false,
|
|
13
|
+
hasGit: (0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.git')),
|
|
14
|
+
};
|
|
15
|
+
// Check for Node.js project
|
|
16
|
+
const pkgPath = (0, node_path_1.resolve)(dir, 'package.json');
|
|
17
|
+
if ((0, node_fs_1.existsSync)(pkgPath)) {
|
|
18
|
+
info.type = 'node';
|
|
19
|
+
try {
|
|
20
|
+
const { readFileSync } = require('node:fs');
|
|
21
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
22
|
+
info.name = pkg.name ?? null;
|
|
23
|
+
info.version = pkg.version ?? null;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Ignore parse errors
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
// Check for Go project
|
|
30
|
+
if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'go.mod'))) {
|
|
31
|
+
info.type = 'go';
|
|
32
|
+
}
|
|
33
|
+
// Check for Python project
|
|
34
|
+
if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'pyproject.toml')) ||
|
|
35
|
+
(0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'setup.py')) ||
|
|
36
|
+
(0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'requirements.txt'))) {
|
|
37
|
+
info.type = 'python';
|
|
38
|
+
}
|
|
39
|
+
// Check for MCP configuration
|
|
40
|
+
info.hasMcp =
|
|
41
|
+
(0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, 'mcp.json')) ||
|
|
42
|
+
(0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.mcp.json'));
|
|
43
|
+
// Check for environment files
|
|
44
|
+
info.hasEnv =
|
|
45
|
+
(0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.env')) ||
|
|
46
|
+
(0, node_fs_1.existsSync)((0, node_path_1.resolve)(dir, '.env.local'));
|
|
47
|
+
return info;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/util/detect.ts"],"names":[],"mappings":";;AAcA,sCAiDC;AA/DD,qCAAqC;AACrC,yCAAoC;AAapC,SAAgB,aAAa,CAAC,GAAW;IACvC,MAAM,IAAI,GAAgB;QACxB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;KACzC,CAAC;IAEF,4BAA4B;IAC5B,MAAM,OAAO,GAAG,IAAA,mBAAO,EAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC7C,IAAI,IAAA,oBAAU,EAAC,OAAO,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;YAC7B,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,2BAA2B;IAC3B,IACE,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC1C,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACpC,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,EAC5C,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;IACvB,CAAC;IAED,8BAA8B;IAC9B,IAAI,CAAC,MAAM;QACT,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YACpC,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;IAExC,8BAA8B;IAC9B,IAAI,CAAC,MAAM;QACT,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAChC,IAAA,oBAAU,EAAC,IAAA,mBAAO,EAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAEzC,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function severityColor(severity: string): (text: string) => string;
|
|
2
|
+
export declare function severityLabel(severity: string): string;
|
|
3
|
+
export declare function formatCount(count: number, label: string): string;
|
|
4
|
+
export declare function formatDuration(ms: number): string;
|
|
5
|
+
export declare function table(rows: string[][], headers?: string[]): string;
|
|
6
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/util/format.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAQxE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAMjD;AAED,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAiBlE"}
|