hazmat-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.
Files changed (47) hide show
  1. package/README.md +39 -0
  2. package/dist/src/cli.d.ts +2 -0
  3. package/dist/src/cli.js +239 -0
  4. package/dist/src/cli.js.map +1 -0
  5. package/dist/src/codex.d.ts +3 -0
  6. package/dist/src/codex.js +135 -0
  7. package/dist/src/codex.js.map +1 -0
  8. package/dist/src/detectors.d.ts +20 -0
  9. package/dist/src/detectors.js +120 -0
  10. package/dist/src/detectors.js.map +1 -0
  11. package/dist/src/jsonl.d.ts +4 -0
  12. package/dist/src/jsonl.js +136 -0
  13. package/dist/src/jsonl.js.map +1 -0
  14. package/dist/src/publish.d.ts +16 -0
  15. package/dist/src/publish.js +121 -0
  16. package/dist/src/publish.js.map +1 -0
  17. package/dist/src/report.d.ts +6 -0
  18. package/dist/src/report.js +192 -0
  19. package/dist/src/report.js.map +1 -0
  20. package/dist/src/scanner.d.ts +15 -0
  21. package/dist/src/scanner.js +43 -0
  22. package/dist/src/scanner.js.map +1 -0
  23. package/dist/src/scoring.d.ts +4 -0
  24. package/dist/src/scoring.js +27 -0
  25. package/dist/src/scoring.js.map +1 -0
  26. package/dist/src/scrub.d.ts +8 -0
  27. package/dist/src/scrub.js +61 -0
  28. package/dist/src/scrub.js.map +1 -0
  29. package/dist/src/sources.d.ts +8 -0
  30. package/dist/src/sources.js +101 -0
  31. package/dist/src/sources.js.map +1 -0
  32. package/dist/src/sqlite.d.ts +2 -0
  33. package/dist/src/sqlite.js +104 -0
  34. package/dist/src/sqlite.js.map +1 -0
  35. package/dist/src/sqliteScrub.d.ts +9 -0
  36. package/dist/src/sqliteScrub.js +128 -0
  37. package/dist/src/sqliteScrub.js.map +1 -0
  38. package/dist/src/state.d.ts +5 -0
  39. package/dist/src/state.js +21 -0
  40. package/dist/src/state.js.map +1 -0
  41. package/dist/src/types.d.ts +63 -0
  42. package/dist/src/types.js +2 -0
  43. package/dist/src/types.js.map +1 -0
  44. package/dist/src/ui.d.ts +19 -0
  45. package/dist/src/ui.js +65 -0
  46. package/dist/src/ui.js.map +1 -0
  47. package/package.json +32 -0
@@ -0,0 +1,136 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { access, readdir, stat } from "node:fs/promises";
3
+ import { createInterface } from "node:readline";
4
+ import { homedir } from "node:os";
5
+ import path from "node:path";
6
+ import { hasDetectorHint } from "./detectors.js";
7
+ import { buildSourceReport, createFindingState, scanCandidateText } from "./scanner.js";
8
+ const SCANNABLE_EXTENSIONS = new Set([".jsonl", ".json", ".log", ".txt", ".md"]);
9
+ export async function discoverFiles(roots) {
10
+ const files = new Set();
11
+ for (const rootInput of roots) {
12
+ const root = expandHome(rootInput);
13
+ if (!(await exists(root)))
14
+ continue;
15
+ const rootStat = await stat(root);
16
+ if (rootStat.isDirectory()) {
17
+ for await (const file of walk(root))
18
+ if (isScannable(file))
19
+ files.add(file);
20
+ }
21
+ else if (rootStat.isFile() && isScannable(root))
22
+ files.add(root);
23
+ }
24
+ return [...files].sort();
25
+ }
26
+ export async function scanGenericTranscriptFile(filePath, harness) {
27
+ const state = createFindingState();
28
+ let linesScanned = 0;
29
+ let projectPath;
30
+ let sessionId;
31
+ const rl = createInterface({ input: createReadStream(filePath, { encoding: "utf8" }), crlfDelay: Infinity });
32
+ for await (const line of rl) {
33
+ linesScanned += 1;
34
+ for (const text of extractGenericScanTexts(line))
35
+ scanCandidateText(text, state);
36
+ if (!projectPath || !sessionId) {
37
+ const meta = extractMetadata(line);
38
+ projectPath ||= meta.projectPath;
39
+ sessionId ||= meta.sessionId;
40
+ }
41
+ }
42
+ return buildSourceReport({ harness, path: filePath, linesScanned, state, projectPath, sessionId });
43
+ }
44
+ function extractGenericScanTexts(line) {
45
+ if (!hasDetectorHint(line))
46
+ return [];
47
+ try {
48
+ const parsed = JSON.parse(line);
49
+ return extractLikelyText(parsed);
50
+ }
51
+ catch {
52
+ return [line];
53
+ }
54
+ }
55
+ function extractLikelyText(value, depth = 0) {
56
+ if (depth > 7)
57
+ return [];
58
+ if (typeof value === "string")
59
+ return hasDetectorHint(value) ? [value] : [];
60
+ if (Array.isArray(value))
61
+ return value.flatMap((item) => extractLikelyText(item, depth + 1));
62
+ if (!isObject(value))
63
+ return [];
64
+ const out = [];
65
+ for (const [key, nested] of Object.entries(value)) {
66
+ if (shouldSkipKey(key))
67
+ continue;
68
+ if (typeof nested === "string") {
69
+ if (hasDetectorHint(nested))
70
+ out.push(nested);
71
+ continue;
72
+ }
73
+ out.push(...extractLikelyText(nested, depth + 1));
74
+ }
75
+ return out;
76
+ }
77
+ function extractMetadata(line) {
78
+ try {
79
+ const parsed = JSON.parse(line);
80
+ if (!isObject(parsed))
81
+ return {};
82
+ const payload = isObject(parsed.payload) ? parsed.payload : parsed;
83
+ return {
84
+ projectPath: firstString(payload.cwd, payload.projectPath, payload.project_path, payload.directory),
85
+ sessionId: firstString(payload.session_id, payload.sessionId, payload.id, parsed.sessionId, parsed.session_id),
86
+ };
87
+ }
88
+ catch {
89
+ return {};
90
+ }
91
+ }
92
+ function shouldSkipKey(key) {
93
+ return [
94
+ "timestamp",
95
+ "created_at",
96
+ "updated_at",
97
+ "uuid",
98
+ "id",
99
+ "parent_id",
100
+ "session_id",
101
+ "encrypted_content",
102
+ "rate_limits",
103
+ "usage",
104
+ "tokens",
105
+ "embedding",
106
+ ].includes(key);
107
+ }
108
+ async function* walk(dir) {
109
+ const entries = await readdir(dir, { withFileTypes: true });
110
+ for (const entry of entries) {
111
+ const fullPath = path.join(dir, entry.name);
112
+ if (entry.isDirectory())
113
+ yield* walk(fullPath);
114
+ else if (entry.isFile())
115
+ yield fullPath;
116
+ }
117
+ }
118
+ function firstString(...values) {
119
+ for (const value of values)
120
+ if (typeof value === "string" && value.length > 0)
121
+ return value;
122
+ return undefined;
123
+ }
124
+ function isObject(value) { return typeof value === "object" && value !== null; }
125
+ function isScannable(filePath) { return SCANNABLE_EXTENSIONS.has(path.extname(filePath).toLowerCase()); }
126
+ export function expandHome(input) { if (input === "~")
127
+ return homedir(); if (input.startsWith("~/"))
128
+ return path.join(homedir(), input.slice(2)); return path.resolve(input); }
129
+ async function exists(filePath) { try {
130
+ await access(filePath);
131
+ return true;
132
+ }
133
+ catch {
134
+ return false;
135
+ } }
136
+ //# sourceMappingURL=jsonl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl.js","sourceRoot":"","sources":["../../src/jsonl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { SharePayload } from "./types.js";
2
+ export type PublishResult = {
3
+ url: string;
4
+ id: string;
5
+ owner: string;
6
+ };
7
+ type AuthState = {
8
+ githubAccessToken?: string;
9
+ githubLogin?: string;
10
+ };
11
+ export declare function apiBaseUrl(): string;
12
+ export declare function githubClientId(): string;
13
+ export declare function loginWithGithubDeviceFlow(): Promise<AuthState>;
14
+ export declare function publishPayload(payload: SharePayload): Promise<PublishResult>;
15
+ export declare function loadAuthState(): Promise<AuthState>;
16
+ export {};
@@ -0,0 +1,121 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { homedir } from "node:os";
4
+ const DEFAULT_API_URL = "https://hazmat-beta.vercel.app";
5
+ const DEFAULT_GITHUB_CLIENT_ID = "Ov23liWdPNynna949jms";
6
+ const GITHUB_DEVICE_CODE_URL = "https://github.com/login/device/code";
7
+ const GITHUB_ACCESS_TOKEN_URL = "https://github.com/login/oauth/access_token";
8
+ export function apiBaseUrl() {
9
+ return trimTrailingSlash(process.env.HAZMAT_API_URL || DEFAULT_API_URL);
10
+ }
11
+ export function githubClientId() {
12
+ return process.env.HAZMAT_GITHUB_CLIENT_ID || process.env.NEXT_PUBLIC_GITHUB_CLIENT_ID || DEFAULT_GITHUB_CLIENT_ID;
13
+ }
14
+ export async function loginWithGithubDeviceFlow() {
15
+ const clientId = githubClientId();
16
+ const device = await requestDeviceCode(clientId);
17
+ console.log("GitHub login required.");
18
+ console.log(`Open: ${device.verification_uri}`);
19
+ console.log(`Code: ${device.user_code}`);
20
+ console.log("");
21
+ console.log("Waiting for authorization...");
22
+ const token = await pollForAccessToken(clientId, device);
23
+ const user = await fetchGithubUser(token);
24
+ const state = { githubAccessToken: token, githubLogin: user.login };
25
+ await saveAuthState(state);
26
+ console.log(`Logged in as ${user.login}.`);
27
+ return state;
28
+ }
29
+ export async function publishPayload(payload) {
30
+ const auth = await loadAuthState();
31
+ const token = auth.githubAccessToken ?? (await loginWithGithubDeviceFlow()).githubAccessToken;
32
+ if (!token)
33
+ throw new Error("GitHub login failed.");
34
+ const response = await fetch(`${apiBaseUrl()}/api/reports`, {
35
+ method: "POST",
36
+ headers: {
37
+ "content-type": "application/json",
38
+ authorization: `Bearer ${token}`,
39
+ },
40
+ body: JSON.stringify(payload),
41
+ });
42
+ const body = await response.json().catch(() => null);
43
+ if (!response.ok)
44
+ throw new Error(body?.error || `Publish failed with HTTP ${response.status}`);
45
+ if (!body?.url || !body.id || !body.owner)
46
+ throw new Error("Publish response was missing report metadata.");
47
+ return { url: body.url, id: body.id, owner: body.owner };
48
+ }
49
+ export async function loadAuthState() {
50
+ try {
51
+ const raw = await readFile(authPath(), "utf8");
52
+ return JSON.parse(raw);
53
+ }
54
+ catch {
55
+ return {};
56
+ }
57
+ }
58
+ async function saveAuthState(state) {
59
+ await mkdir(path.dirname(authPath()), { recursive: true, mode: 0o700 });
60
+ await writeFile(authPath(), `${JSON.stringify(state, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
61
+ }
62
+ function authPath() {
63
+ return path.join(homedir(), ".hazmat", "auth.json");
64
+ }
65
+ async function requestDeviceCode(clientId) {
66
+ const response = await fetch(GITHUB_DEVICE_CODE_URL, {
67
+ method: "POST",
68
+ headers: { accept: "application/json", "content-type": "application/json" },
69
+ body: JSON.stringify({ client_id: clientId, scope: "read:user" }),
70
+ });
71
+ const body = await response.json();
72
+ if (!response.ok || body.error) {
73
+ const detail = body.error_description || body.error || `HTTP ${response.status}`;
74
+ throw new Error(`Failed to start GitHub device login (${detail}). ` +
75
+ "Check that the Hazmat GitHub OAuth App has Device Flow enabled and the Client ID is correct.");
76
+ }
77
+ return body;
78
+ }
79
+ async function pollForAccessToken(clientId, device) {
80
+ let intervalMs = Math.max(1, device.interval ?? 5) * 1000;
81
+ const deadline = Date.now() + device.expires_in * 1000;
82
+ while (Date.now() < deadline) {
83
+ await sleep(intervalMs);
84
+ const response = await fetch(GITHUB_ACCESS_TOKEN_URL, {
85
+ method: "POST",
86
+ headers: { accept: "application/json", "content-type": "application/json" },
87
+ body: JSON.stringify({
88
+ client_id: clientId,
89
+ device_code: device.device_code,
90
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
91
+ }),
92
+ });
93
+ const body = await response.json();
94
+ if (body.access_token)
95
+ return body.access_token;
96
+ if (body.error === "authorization_pending")
97
+ continue;
98
+ if (body.error === "slow_down") {
99
+ intervalMs += 5000;
100
+ continue;
101
+ }
102
+ throw new Error(body.error_description || body.error || `GitHub token exchange failed with HTTP ${response.status}`);
103
+ }
104
+ throw new Error("GitHub device login expired. Run `hazmat login` again.");
105
+ }
106
+ async function fetchGithubUser(token) {
107
+ const response = await fetch("https://api.github.com/user", {
108
+ headers: { accept: "application/vnd.github+json", authorization: `Bearer ${token}`, "user-agent": "hazmat-cli" },
109
+ });
110
+ const body = await response.json().catch(() => null);
111
+ if (!response.ok || !body?.login)
112
+ throw new Error(body?.message || "Failed to fetch GitHub user.");
113
+ return { login: body.login };
114
+ }
115
+ function sleep(ms) {
116
+ return new Promise((resolve) => setTimeout(resolve, ms));
117
+ }
118
+ function trimTrailingSlash(value) {
119
+ return value.replace(/\/$/, "");
120
+ }
121
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ScanReport, SourceReport, SharePayload } from "./types.js";
2
+ export declare function buildScanReport(sources: SourceReport[]): ScanReport;
3
+ export declare function formatReport(report: ScanReport, options?: {
4
+ verbose?: boolean;
5
+ }): string;
6
+ export declare function buildSharePayload(report: ScanReport): SharePayload;
@@ -0,0 +1,192 @@
1
+ import { homedir } from "node:os";
2
+ import { calculateScore, scoreLabel } from "./scoring.js";
3
+ import { c, formatScore, riskColor } from "./ui.js";
4
+ export function buildScanReport(sources) {
5
+ const sensitiveSources = sources.filter((source) => source.risk !== "low");
6
+ return {
7
+ version: 1,
8
+ generatedAt: new Date().toISOString(),
9
+ sources,
10
+ summary: {
11
+ filesScanned: sources.length,
12
+ linesScanned: sum(sources.map((source) => source.linesScanned)),
13
+ sensitiveFiles: sensitiveSources.length,
14
+ highRiskFiles: sources.filter((source) => source.risk === "high").length,
15
+ mediumRiskFiles: sources.filter((source) => source.risk === "medium").length,
16
+ secretFindings: sum(sources.flatMap((source) => source.secrets.map((finding) => finding.count))),
17
+ fileReferenceFindings: sum(sources.flatMap((source) => source.fileReferences.map((finding) => finding.count))),
18
+ score: calculateScore(sources),
19
+ },
20
+ };
21
+ }
22
+ export function formatReport(report, options = {}) {
23
+ return options.verbose ? formatVerboseReport(report) : formatSummaryReport(report);
24
+ }
25
+ function formatSummaryReport(report) {
26
+ const lines = [];
27
+ const secretClasses = aggregateSecretClasses(report);
28
+ const fileRefGroups = aggregateFileReferenceGroups(report);
29
+ const topSources = report.sources
30
+ .filter((source) => source.risk !== "low")
31
+ .map((source) => ({
32
+ source,
33
+ secrets: sum(source.secrets.map((finding) => finding.count)),
34
+ refs: sum(source.fileReferences.map((finding) => finding.count)),
35
+ }))
36
+ .sort((a, b) => b.secrets - a.secrets || b.refs - a.refs)
37
+ .slice(0, 10);
38
+ lines.push(c.heading("Exposure Report"));
39
+ lines.push(c.muted("───────────────"));
40
+ lines.push(`${c.heading("Generated:")} ${c.muted(report.generatedAt)}`);
41
+ lines.push("");
42
+ lines.push(c.heading("Summary"));
43
+ lines.push(c.muted("───────"));
44
+ lines.push(`${c.muted("Scanned")} ${c.value(String(report.summary.filesScanned))} sources, ${c.value(String(report.summary.linesScanned))} records/lines`);
45
+ lines.push(`${c.muted("Score")} ${formatScore(getScore(report))} ${c.muted(`(${scoreLabel(getScore(report))})`)}`);
46
+ lines.push(`${c.muted("Sensitive")} ${c.value(String(report.summary.sensitiveFiles))} files ${c.muted(`(${report.summary.highRiskFiles} high, ${report.summary.mediumRiskFiles} medium)`)}`);
47
+ lines.push(`${c.muted("Secret-like values")} ${c.value(String(report.summary.secretFindings))}`);
48
+ lines.push(`${c.muted("Sensitive file/path refs")} ${c.value(String(report.summary.fileReferenceFindings))}`);
49
+ if (report.summary.sensitiveFiles === 0) {
50
+ lines.push("");
51
+ lines.push("No sensitive transcript findings detected.");
52
+ return lines.join("\n");
53
+ }
54
+ lines.push("");
55
+ lines.push(c.heading("Secret classes"));
56
+ lines.push(c.muted("──────────────"));
57
+ for (const item of secretClasses) {
58
+ lines.push(`- ${c.accent(item.label)}: ${c.value(String(item.count))} occurrences, ${c.value(String(item.unique))} unique fingerprints`);
59
+ }
60
+ lines.push("");
61
+ lines.push(c.heading("Sensitive file/path refs"));
62
+ lines.push(c.muted("────────────────────────"));
63
+ for (const item of fileRefGroups.slice(0, 10)) {
64
+ lines.push(`- ${c.accent(item.label)}: ${c.value(String(item.count))} refs, ${c.value(String(item.unique))} unique paths`);
65
+ }
66
+ lines.push("");
67
+ lines.push(c.heading("Top risky sessions"));
68
+ lines.push(c.muted("──────────────────"));
69
+ for (const item of topSources) {
70
+ lines.push(`- ${riskColor(item.source.risk)(item.source.risk.toUpperCase())} ${c.accent(item.source.harness)} ${c.muted(prettyPath(item.source.path))}`);
71
+ lines.push(` ${c.value(String(item.secrets))} secret-like findings, ${c.value(String(item.refs))} sensitive refs`);
72
+ }
73
+ lines.push("");
74
+ lines.push(c.muted("Note: raw secret values are not printed. Fingerprints are short SHA-256 hashes."));
75
+ lines.push(c.muted("Run `hazmat report --verbose` for per-session fingerprints and paths."));
76
+ return lines.join("\n");
77
+ }
78
+ function formatVerboseReport(report) {
79
+ const lines = [];
80
+ lines.push("Hazmat Exposure Report");
81
+ lines.push("======================");
82
+ lines.push(`Generated: ${report.generatedAt}`);
83
+ lines.push(`Scanned sources: ${report.summary.filesScanned}`);
84
+ lines.push(`Scanned records/lines: ${report.summary.linesScanned}`);
85
+ lines.push(`Score: ${getScore(report)}/100 (${scoreLabel(getScore(report))})`);
86
+ lines.push(`Sensitive files: ${report.summary.sensitiveFiles}`);
87
+ lines.push(`High risk files: ${report.summary.highRiskFiles}`);
88
+ lines.push(`Medium risk files: ${report.summary.mediumRiskFiles}`);
89
+ lines.push(`Secret findings: ${report.summary.secretFindings}`);
90
+ lines.push(`Sensitive file references: ${report.summary.fileReferenceFindings}`);
91
+ const sensitiveSources = report.sources.filter((source) => source.risk !== "low");
92
+ if (sensitiveSources.length === 0) {
93
+ lines.push("");
94
+ lines.push("No sensitive transcript findings detected.");
95
+ return lines.join("\n");
96
+ }
97
+ lines.push("");
98
+ lines.push("Findings");
99
+ lines.push("--------");
100
+ for (const source of sensitiveSources) {
101
+ lines.push("");
102
+ lines.push(`${source.risk.toUpperCase()} ${source.harness} ${prettyPath(source.path)}`);
103
+ lines.push(`Lines scanned: ${source.linesScanned}`);
104
+ if (source.secrets.length > 0) {
105
+ lines.push("Secrets:");
106
+ for (const finding of source.secrets) {
107
+ lines.push(`- ${finding.label}:${finding.fingerprint} (${finding.count})`);
108
+ }
109
+ }
110
+ if (source.fileReferences.length > 0) {
111
+ lines.push("Sensitive file refs:");
112
+ for (const finding of source.fileReferences.slice(0, 20)) {
113
+ lines.push(`- ${finding.value} (${finding.count})`);
114
+ }
115
+ if (source.fileReferences.length > 20) {
116
+ lines.push(`- ...and ${source.fileReferences.length - 20} more`);
117
+ }
118
+ }
119
+ }
120
+ return lines.join("\n");
121
+ }
122
+ export function buildSharePayload(report) {
123
+ return {
124
+ version: 1,
125
+ generatedAt: report.generatedAt,
126
+ score: getScore(report),
127
+ sources: [...new Set(report.sources.map((source) => source.harness))].sort(),
128
+ totals: {
129
+ filesScanned: report.summary.filesScanned,
130
+ sensitiveFiles: report.summary.sensitiveFiles,
131
+ highRiskFiles: report.summary.highRiskFiles,
132
+ mediumRiskFiles: report.summary.mediumRiskFiles,
133
+ secretFindings: report.summary.secretFindings,
134
+ fileReferenceFindings: report.summary.fileReferenceFindings,
135
+ },
136
+ secretClasses: aggregateSecretClasses(report),
137
+ fileReferenceGroups: aggregateFileReferenceGroups(report),
138
+ };
139
+ }
140
+ function aggregateSecretClasses(report) {
141
+ const map = new Map();
142
+ for (const source of report.sources) {
143
+ for (const finding of source.secrets) {
144
+ const current = map.get(finding.label) ?? { label: finding.label, count: 0, fingerprints: new Set() };
145
+ current.count += finding.count;
146
+ current.fingerprints.add(finding.fingerprint);
147
+ map.set(finding.label, current);
148
+ }
149
+ }
150
+ return [...map.values()]
151
+ .map((item) => ({ label: item.label, count: item.count, unique: item.fingerprints.size }))
152
+ .sort((a, b) => b.count - a.count || a.label.localeCompare(b.label));
153
+ }
154
+ function aggregateFileReferenceGroups(report) {
155
+ const map = new Map();
156
+ for (const source of report.sources) {
157
+ for (const finding of source.fileReferences) {
158
+ const label = fileReferenceGroup(finding);
159
+ const current = map.get(label) ?? { count: 0, values: new Set() };
160
+ current.count += finding.count;
161
+ current.values.add(finding.value);
162
+ map.set(label, current);
163
+ }
164
+ }
165
+ return [...map.entries()]
166
+ .map(([label, item]) => ({ label, count: item.count, unique: item.values.size }))
167
+ .sort((a, b) => b.count - a.count || a.label.localeCompare(b.label));
168
+ }
169
+ function fileReferenceGroup(finding) {
170
+ const value = finding.value;
171
+ const envMatch = value.match(/\.env(?:\.[A-Za-z0-9_-]+)?/);
172
+ if (envMatch)
173
+ return envMatch[0];
174
+ if (/wallet/i.test(value))
175
+ return "wallet JSON paths";
176
+ if (/keypair/i.test(value))
177
+ return "keypair JSON paths";
178
+ if (/\.pem|\.p12|\.pfx|id_rsa|id_ed25519/.test(value))
179
+ return "private key/cert paths";
180
+ return "other sensitive paths";
181
+ }
182
+ function getScore(report) {
183
+ return typeof report.summary.score === "number" ? report.summary.score : calculateScore(report.sources);
184
+ }
185
+ function sum(values) {
186
+ return values.reduce((total, value) => total + value, 0);
187
+ }
188
+ function prettyPath(filePath) {
189
+ const home = homedir();
190
+ return filePath.startsWith(home) ? `~${filePath.slice(home.length)}` : filePath;
191
+ }
192
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { FileRefFinding, Harness, SourceReport, SecretFinding } from "./types.js";
2
+ export type FindingState = {
3
+ secrets: Map<string, SecretFinding>;
4
+ fileReferences: Map<string, FileRefFinding>;
5
+ };
6
+ export declare function createFindingState(): FindingState;
7
+ export declare function scanCandidateText(text: string, state: FindingState): void;
8
+ export declare function buildSourceReport(input: {
9
+ harness: Harness;
10
+ path: string;
11
+ linesScanned: number;
12
+ state: FindingState;
13
+ projectPath?: string;
14
+ sessionId?: string;
15
+ }): SourceReport;
@@ -0,0 +1,43 @@
1
+ import { addFileRefFinding, addSecretFinding, detectFileReferences, detectSecrets, hasDetectorHint, } from "./detectors.js";
2
+ export function createFindingState() {
3
+ return { secrets: new Map(), fileReferences: new Map() };
4
+ }
5
+ export function scanCandidateText(text, state) {
6
+ if (!hasDetectorHint(text))
7
+ return;
8
+ for (const chunk of scanChunks(text)) {
9
+ for (const match of detectSecrets(chunk))
10
+ addSecretFinding(state.secrets, match);
11
+ for (const match of detectFileReferences(chunk))
12
+ addFileRefFinding(state.fileReferences, match);
13
+ }
14
+ }
15
+ export function buildSourceReport(input) {
16
+ const secretList = [...input.state.secrets.values()].sort(byLabelThenFingerprint);
17
+ const fileRefList = [...input.state.fileReferences.values()].sort((a, b) => a.value.localeCompare(b.value));
18
+ const risk = secretList.length > 0 ? "high" : fileRefList.length > 0 ? "medium" : "low";
19
+ return {
20
+ harness: input.harness,
21
+ path: input.path,
22
+ linesScanned: input.linesScanned,
23
+ risk,
24
+ secrets: secretList,
25
+ fileReferences: fileRefList,
26
+ ...(input.projectPath ? { projectPath: input.projectPath } : {}),
27
+ ...(input.sessionId ? { sessionId: input.sessionId } : {}),
28
+ };
29
+ }
30
+ function* scanChunks(text) {
31
+ const chunkSize = 256 * 1024;
32
+ const overlap = 2048;
33
+ if (text.length <= chunkSize) {
34
+ yield text;
35
+ return;
36
+ }
37
+ for (let start = 0; start < text.length; start += chunkSize - overlap)
38
+ yield text.slice(start, start + chunkSize);
39
+ }
40
+ function byLabelThenFingerprint(a, b) {
41
+ return a.label.localeCompare(b.label) || a.fingerprint.localeCompare(b.fingerprint);
42
+ }
43
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAQxB,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAmB;IACjE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QAAE,OAAO;IACnC,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,KAAK,MAAM,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjF,KAAK,MAAM,KAAK,IAAI,oBAAoB,CAAC,KAAK,CAAC;YAAE,iBAAiB,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAClG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAOjC;IACC,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAClF,MAAM,WAAW,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAyB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAC9G,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,IAAI;QACJ,OAAO,EAAE,UAAU;QACnB,cAAc,EAAE,WAAW;QAC3B,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,CAAC,UAAU,CAAC,IAAY;IAC/B,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;IAC7B,MAAM,OAAO,GAAG,IAAI,CAAC;IACrB,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC;QACX,OAAO;IACT,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,SAAS,GAAG,OAAO;QAAE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;AACpH,CAAC;AAED,SAAS,sBAAsB,CAAC,CAAgB,EAAE,CAAgB;IAChE,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ScanReport, SourceReport } from "./types.js";
2
+ export declare function calculateScore(sources: SourceReport[]): number;
3
+ export declare function scoreLabel(score: number): string;
4
+ export declare function reportScoreLabel(report: ScanReport): string;
@@ -0,0 +1,27 @@
1
+ export function calculateScore(sources) {
2
+ const secretCount = sources.flatMap((source) => source.secrets).reduce((total, finding) => total + finding.count, 0);
3
+ const refCount = sources.flatMap((source) => source.fileReferences).reduce((total, finding) => total + finding.count, 0);
4
+ const highRiskFiles = sources.filter((source) => source.risk === "high").length;
5
+ const mediumRiskFiles = sources.filter((source) => source.risk === "medium").length;
6
+ const privateKeyCount = sources.flatMap((source) => source.secrets).filter((finding) => finding.label === "private-key").reduce((total, finding) => total + finding.count, 0);
7
+ const secretPenalty = Math.min(70, Math.log10(secretCount + 1) * 25);
8
+ const refPenalty = Math.min(18, Math.log10(refCount + 1) * 5);
9
+ const filePenalty = Math.min(12, highRiskFiles * 1.2 + mediumRiskFiles * 0.4);
10
+ const privateKeyPenalty = Math.min(20, privateKeyCount * 8);
11
+ return Math.max(0, Math.round(100 - secretPenalty - refPenalty - filePenalty - privateKeyPenalty));
12
+ }
13
+ export function scoreLabel(score) {
14
+ if (score >= 90)
15
+ return "Clean";
16
+ if (score >= 70)
17
+ return "Mostly clean";
18
+ if (score >= 40)
19
+ return "Exposed";
20
+ if (score >= 15)
21
+ return "High exposure";
22
+ return "Critical exposure";
23
+ }
24
+ export function reportScoreLabel(report) {
25
+ return scoreLabel(report.summary.score);
26
+ }
27
+ //# sourceMappingURL=scoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.js","sourceRoot":"","sources":["../../src/scoring.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,OAAuB;IACpD,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACrH,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACzH,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAChF,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACpF,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE9K,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,aAAa,GAAG,GAAG,GAAG,eAAe,GAAG,GAAG,CAAC,CAAC;IAC9E,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,eAAe,GAAG,CAAC,CAAC,CAAC;IAE5D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC;AACrG,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC;IAChC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,cAAc,CAAC;IACvC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,eAAe,CAAC;IACxC,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAkB;IACjD,OAAO,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,8 @@
1
+ export type ScrubResult = {
2
+ path: string;
3
+ linesScanned: number;
4
+ linesChanged: number;
5
+ redactions: number;
6
+ };
7
+ export declare function dryRunScrubTextFile(filePath: string): Promise<ScrubResult>;
8
+ export declare function scrubTextFileInPlace(filePath: string): Promise<ScrubResult>;