clawhatch 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 (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +348 -0
  3. package/dist/checks/cloud-sync.d.ts +10 -0
  4. package/dist/checks/cloud-sync.d.ts.map +1 -0
  5. package/dist/checks/cloud-sync.js +62 -0
  6. package/dist/checks/cloud-sync.js.map +1 -0
  7. package/dist/checks/data-protection.d.ts +9 -0
  8. package/dist/checks/data-protection.d.ts.map +1 -0
  9. package/dist/checks/data-protection.js +197 -0
  10. package/dist/checks/data-protection.js.map +1 -0
  11. package/dist/checks/identity.d.ts +14 -0
  12. package/dist/checks/identity.d.ts.map +1 -0
  13. package/dist/checks/identity.js +327 -0
  14. package/dist/checks/identity.js.map +1 -0
  15. package/dist/checks/model.d.ts +10 -0
  16. package/dist/checks/model.d.ts.map +1 -0
  17. package/dist/checks/model.js +337 -0
  18. package/dist/checks/model.js.map +1 -0
  19. package/dist/checks/network.d.ts +9 -0
  20. package/dist/checks/network.d.ts.map +1 -0
  21. package/dist/checks/network.js +177 -0
  22. package/dist/checks/network.js.map +1 -0
  23. package/dist/checks/operational.d.ts +9 -0
  24. package/dist/checks/operational.d.ts.map +1 -0
  25. package/dist/checks/operational.js +158 -0
  26. package/dist/checks/operational.js.map +1 -0
  27. package/dist/checks/sandbox.d.ts +9 -0
  28. package/dist/checks/sandbox.d.ts.map +1 -0
  29. package/dist/checks/sandbox.js +135 -0
  30. package/dist/checks/sandbox.js.map +1 -0
  31. package/dist/checks/secrets.d.ts +9 -0
  32. package/dist/checks/secrets.d.ts.map +1 -0
  33. package/dist/checks/secrets.js +816 -0
  34. package/dist/checks/secrets.js.map +1 -0
  35. package/dist/checks/skills.d.ts +9 -0
  36. package/dist/checks/skills.d.ts.map +1 -0
  37. package/dist/checks/skills.js +303 -0
  38. package/dist/checks/skills.js.map +1 -0
  39. package/dist/checks/tools.d.ts +9 -0
  40. package/dist/checks/tools.d.ts.map +1 -0
  41. package/dist/checks/tools.js +397 -0
  42. package/dist/checks/tools.js.map +1 -0
  43. package/dist/discover.d.ts +22 -0
  44. package/dist/discover.d.ts.map +1 -0
  45. package/dist/discover.js +281 -0
  46. package/dist/discover.js.map +1 -0
  47. package/dist/fixer.d.ts +16 -0
  48. package/dist/fixer.d.ts.map +1 -0
  49. package/dist/fixer.js +361 -0
  50. package/dist/fixer.js.map +1 -0
  51. package/dist/index.d.ts +16 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +230 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/init.d.ts +14 -0
  56. package/dist/init.d.ts.map +1 -0
  57. package/dist/init.js +108 -0
  58. package/dist/init.js.map +1 -0
  59. package/dist/notify.d.ts +28 -0
  60. package/dist/notify.d.ts.map +1 -0
  61. package/dist/notify.js +217 -0
  62. package/dist/notify.js.map +1 -0
  63. package/dist/parsers/config.d.ts +16 -0
  64. package/dist/parsers/config.d.ts.map +1 -0
  65. package/dist/parsers/config.js +54 -0
  66. package/dist/parsers/config.js.map +1 -0
  67. package/dist/parsers/env.d.ts +6 -0
  68. package/dist/parsers/env.d.ts.map +1 -0
  69. package/dist/parsers/env.js +35 -0
  70. package/dist/parsers/env.js.map +1 -0
  71. package/dist/parsers/jsonl.d.ts +12 -0
  72. package/dist/parsers/jsonl.d.ts.map +1 -0
  73. package/dist/parsers/jsonl.js +61 -0
  74. package/dist/parsers/jsonl.js.map +1 -0
  75. package/dist/parsers/markdown.d.ts +17 -0
  76. package/dist/parsers/markdown.d.ts.map +1 -0
  77. package/dist/parsers/markdown.js +57 -0
  78. package/dist/parsers/markdown.js.map +1 -0
  79. package/dist/reporter-html.d.ts +9 -0
  80. package/dist/reporter-html.d.ts.map +1 -0
  81. package/dist/reporter-html.js +581 -0
  82. package/dist/reporter-html.js.map +1 -0
  83. package/dist/reporter.d.ts +10 -0
  84. package/dist/reporter.d.ts.map +1 -0
  85. package/dist/reporter.js +133 -0
  86. package/dist/reporter.js.map +1 -0
  87. package/dist/sanitize.d.ts +17 -0
  88. package/dist/sanitize.d.ts.map +1 -0
  89. package/dist/sanitize.js +83 -0
  90. package/dist/sanitize.js.map +1 -0
  91. package/dist/scanner.d.ts +18 -0
  92. package/dist/scanner.d.ts.map +1 -0
  93. package/dist/scanner.js +236 -0
  94. package/dist/scanner.js.map +1 -0
  95. package/dist/scoring.d.ts +17 -0
  96. package/dist/scoring.d.ts.map +1 -0
  97. package/dist/scoring.js +47 -0
  98. package/dist/scoring.js.map +1 -0
  99. package/dist/telemetry.d.ts +16 -0
  100. package/dist/telemetry.d.ts.map +1 -0
  101. package/dist/telemetry.js +52 -0
  102. package/dist/telemetry.js.map +1 -0
  103. package/dist/threat-feed.d.ts +14 -0
  104. package/dist/threat-feed.d.ts.map +1 -0
  105. package/dist/threat-feed.js +133 -0
  106. package/dist/threat-feed.js.map +1 -0
  107. package/dist/types.d.ts +221 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/dist/types.js +11 -0
  110. package/dist/types.js.map +1 -0
  111. package/dist/utils.d.ts +12 -0
  112. package/dist/utils.d.ts.map +1 -0
  113. package/dist/utils.js +34 -0
  114. package/dist/utils.js.map +1 -0
  115. package/package.json +71 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Telemetry module — anonymizes scan results and uploads threat reports.
3
+ * Only shares check IDs, severities, and categories. Never sends file paths,
4
+ * descriptions, or remediation text.
5
+ */
6
+ import { createHash } from "node:crypto";
7
+ import { hostname, userInfo } from "node:os";
8
+ /** Stable per-machine identifier (first 16 hex chars of SHA-256 of hostname:username). */
9
+ export function getInstanceId() {
10
+ const raw = `${hostname()}:${userInfo().username}`;
11
+ return createHash("sha256").update(raw).digest("hex").slice(0, 16);
12
+ }
13
+ /** Strip a ScanResult down to only safe-to-share metadata. */
14
+ export function anonymizeScanResult(result) {
15
+ return {
16
+ version: "0.1.0",
17
+ timestamp: result.timestamp,
18
+ instanceId: getInstanceId(),
19
+ platform: result.platform,
20
+ score: result.score,
21
+ checksRun: result.checksRun,
22
+ findingCount: result.findings.length,
23
+ findings: result.findings.map((f) => ({
24
+ id: f.id,
25
+ severity: f.severity,
26
+ category: f.category,
27
+ })),
28
+ };
29
+ }
30
+ /** POST a ThreatReport to the community API. Never throws. */
31
+ export async function uploadThreatReport(report, apiUrl) {
32
+ try {
33
+ const controller = new AbortController();
34
+ const timer = setTimeout(() => controller.abort(), 5000);
35
+ const res = await fetch(`${apiUrl}/v1/reports`, {
36
+ method: "POST",
37
+ headers: { "Content-Type": "application/json" },
38
+ body: JSON.stringify(report),
39
+ signal: controller.signal,
40
+ });
41
+ clearTimeout(timer);
42
+ if (res.ok) {
43
+ return { success: true };
44
+ }
45
+ return { success: false, error: `HTTP ${res.status}: ${res.statusText}` };
46
+ }
47
+ catch (err) {
48
+ const message = err instanceof Error ? err.message : String(err);
49
+ return { success: false, error: message };
50
+ }
51
+ }
52
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../src/telemetry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG7C,0FAA0F;AAC1F,MAAM,UAAU,aAAa;IAC3B,MAAM,GAAG,GAAG,GAAG,QAAQ,EAAE,IAAI,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;IACnD,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,mBAAmB,CAAC,MAAkB;IACpD,OAAO;QACL,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,UAAU,EAAE,aAAa,EAAE;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;QACpC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;SACrB,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAoB,EACpB,MAAc;IAEd,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QAEzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,aAAa,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;YAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,YAAY,CAAC,KAAK,CAAC,CAAC;QAEpB,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;YACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Threat feed client — fetches community threat intelligence and formats
3
+ * it for terminal display. Cross-references local scan results against
4
+ * community-wide trends.
5
+ */
6
+ import type { ScanResult, ThreatFeed } from "./types.js";
7
+ export declare const DEFAULT_API_URL = "https://api.clawhatch.com";
8
+ /** Fetch the community threat feed. Returns null on any failure. */
9
+ export declare function fetchThreatFeed(apiUrl: string): Promise<ThreatFeed | null>;
10
+ /** Format a ThreatFeed as a chalk-colored terminal string. */
11
+ export declare function formatThreatFeed(feed: ThreatFeed): string;
12
+ /** Cross-reference local scan findings against the community feed. */
13
+ export declare function checkAgainstFeed(result: ScanResult, feed: ThreatFeed): string[];
14
+ //# sourceMappingURL=threat-feed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threat-feed.d.ts","sourceRoot":"","sources":["../src/threat-feed.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAC;AAE1E,eAAO,MAAM,eAAe,8BAA8B,CAAC;AAE3D,oEAAoE;AACpE,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAgB5B;AA2CD,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA4DzD;AAED,sEAAsE;AACtE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,UAAU,GACf,MAAM,EAAE,CAwBV"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Threat feed client — fetches community threat intelligence and formats
3
+ * it for terminal display. Cross-references local scan results against
4
+ * community-wide trends.
5
+ */
6
+ import chalk from "chalk";
7
+ export const DEFAULT_API_URL = "https://api.clawhatch.com";
8
+ /** Fetch the community threat feed. Returns null on any failure. */
9
+ export async function fetchThreatFeed(apiUrl) {
10
+ try {
11
+ const controller = new AbortController();
12
+ const timer = setTimeout(() => controller.abort(), 5000);
13
+ const res = await fetch(`${apiUrl}/v1/feed`, {
14
+ signal: controller.signal,
15
+ });
16
+ clearTimeout(timer);
17
+ if (!res.ok)
18
+ return null;
19
+ return (await res.json());
20
+ }
21
+ catch {
22
+ return null;
23
+ }
24
+ }
25
+ /** Format a number with commas (e.g. 1234 -> "1,234"). */
26
+ function formatNumber(n) {
27
+ return n.toLocaleString("en-US");
28
+ }
29
+ /** Colorize a severity label with chalk. */
30
+ function colorSeverity(severity) {
31
+ const s = severity.toUpperCase();
32
+ switch (s) {
33
+ case "CRITICAL":
34
+ return chalk.red.bold(s.padEnd(8));
35
+ case "HIGH":
36
+ return chalk.yellow.bold(s.padEnd(8));
37
+ case "MEDIUM":
38
+ return chalk.cyan(s.padEnd(8));
39
+ case "LOW":
40
+ return chalk.dim(s.padEnd(8));
41
+ default:
42
+ return s.padEnd(8);
43
+ }
44
+ }
45
+ /** Render a frequency bar like "######----" (10 chars wide). */
46
+ function frequencyBar(frequency) {
47
+ const width = 10;
48
+ const filled = Math.round(frequency * width);
49
+ const empty = width - filled;
50
+ return "#".repeat(filled) + "-".repeat(empty);
51
+ }
52
+ /** How long ago a timestamp was in human terms. */
53
+ function timeAgo(isoDate) {
54
+ const diff = Date.now() - new Date(isoDate).getTime();
55
+ const minutes = Math.floor(diff / 60_000);
56
+ if (minutes < 60)
57
+ return `${minutes}m ago`;
58
+ const hours = Math.floor(minutes / 60);
59
+ if (hours < 24)
60
+ return `${hours}h ago`;
61
+ const days = Math.floor(hours / 24);
62
+ return `${days}d ago`;
63
+ }
64
+ /** Format a ThreatFeed as a chalk-colored terminal string. */
65
+ export function formatThreatFeed(feed) {
66
+ const lines = [];
67
+ lines.push("");
68
+ lines.push(chalk.bold.cyan("Clawhatch Community Threat Intelligence"));
69
+ lines.push(chalk.cyan("========================================"));
70
+ lines.push("");
71
+ // Community Stats
72
+ lines.push(chalk.bold("Community Stats"));
73
+ lines.push(` Total Scans: ${formatNumber(feed.totalScans)}`);
74
+ lines.push(` Active Instances: ${formatNumber(feed.totalInstances)}`);
75
+ lines.push(` Average Score: ${feed.communityScore}/100`);
76
+ lines.push("");
77
+ // Top Threats
78
+ if (feed.topThreats.length > 0) {
79
+ lines.push(chalk.bold("Top Threats"));
80
+ for (const t of feed.topThreats) {
81
+ const pct = Math.round(t.frequency * 100);
82
+ const bar = frequencyBar(t.frequency);
83
+ const trending = t.trending
84
+ ? " " + chalk.red("trending")
85
+ : "";
86
+ lines.push(` ${colorSeverity(t.severity)} ${t.id.padEnd(14)} ${t.title.padEnd(24)} ${bar} ${String(pct).padStart(3)}%${trending}`);
87
+ }
88
+ lines.push("");
89
+ }
90
+ // New Threats (last 24h)
91
+ if (feed.newThreats.length > 0) {
92
+ lines.push(chalk.bold("New Threats (last 24h)"));
93
+ for (const t of feed.newThreats) {
94
+ const ago = timeAgo(t.firstSeen);
95
+ lines.push(` ${colorSeverity(t.severity)} ${t.id.padEnd(14)} ${t.title} ${chalk.dim(`First seen: ${ago}`)}`);
96
+ }
97
+ lines.push("");
98
+ }
99
+ // Advisories
100
+ if (feed.advisories.length > 0) {
101
+ lines.push(chalk.bold("Advisories"));
102
+ for (const a of feed.advisories) {
103
+ lines.push(` ${chalk.yellow("!")} [${a.id}] ${a.title}`);
104
+ if (a.affectedChecks.length > 0) {
105
+ lines.push(` ${chalk.dim("Affects: " + a.affectedChecks.join(", "))}`);
106
+ }
107
+ }
108
+ lines.push("");
109
+ }
110
+ return lines.join("\n");
111
+ }
112
+ /** Cross-reference local scan findings against the community feed. */
113
+ export function checkAgainstFeed(result, feed) {
114
+ const warnings = [];
115
+ const threatMap = new Map();
116
+ for (const t of feed.topThreats) {
117
+ threatMap.set(t.id, t);
118
+ }
119
+ for (const finding of result.findings) {
120
+ const threat = threatMap.get(finding.id);
121
+ if (!threat)
122
+ continue;
123
+ const pct = Math.round(threat.frequency * 100);
124
+ if (threat.trending) {
125
+ warnings.push(`${finding.id} is trending - affects ${pct}% of the community`);
126
+ }
127
+ else if (threat.frequency > 0.3) {
128
+ warnings.push(`${finding.id} affects ${pct}% of the community`);
129
+ }
130
+ }
131
+ return warnings;
132
+ }
133
+ //# sourceMappingURL=threat-feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threat-feed.js","sourceRoot":"","sources":["../src/threat-feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Core types for Clawhatch security scanner.
3
+ */
4
+ export declare enum Severity {
5
+ Critical = "CRITICAL",
6
+ High = "HIGH",
7
+ Medium = "MEDIUM",
8
+ Low = "LOW"
9
+ }
10
+ export type Confidence = "high" | "medium" | "low";
11
+ export type FixType = "safe" | "behavioral";
12
+ export interface Finding {
13
+ id: string;
14
+ severity: Severity;
15
+ confidence: Confidence;
16
+ category: string;
17
+ title: string;
18
+ description: string;
19
+ risk: string;
20
+ remediation: string;
21
+ autoFixable: boolean;
22
+ fixType?: FixType;
23
+ references?: string[];
24
+ /** File path where the issue was found */
25
+ file?: string;
26
+ /** Line number in the file */
27
+ line?: number;
28
+ }
29
+ export interface ScanOptions {
30
+ openclawPath: string;
31
+ workspacePath?: string;
32
+ autoFix: boolean;
33
+ deep: boolean;
34
+ json: boolean;
35
+ upload: boolean;
36
+ }
37
+ export interface ScanResult {
38
+ timestamp: string;
39
+ openclawVersion: string | null;
40
+ score: number;
41
+ findings: Finding[];
42
+ suggestions: Finding[];
43
+ filesScanned: number;
44
+ checksRun: number;
45
+ checksPassed: number;
46
+ duration: number;
47
+ platform: NodeJS.Platform;
48
+ }
49
+ export interface FixResult {
50
+ finding: Finding;
51
+ applied: boolean;
52
+ backupPath?: string;
53
+ description: string;
54
+ skippedReason?: string;
55
+ }
56
+ /** Parsed OpenClaw config (openclaw.json). Loosely typed since the format may vary. */
57
+ export interface OpenClawConfig {
58
+ [key: string]: unknown;
59
+ gateway?: {
60
+ bind?: string;
61
+ port?: number;
62
+ auth?: {
63
+ mode?: string;
64
+ token?: string;
65
+ };
66
+ trustedProxies?: string[];
67
+ allowInsecureAuth?: boolean;
68
+ dangerouslyDisableDeviceAuth?: boolean;
69
+ };
70
+ channels?: Record<string, {
71
+ dmPolicy?: string;
72
+ allowFrom?: string[];
73
+ groupPolicy?: string;
74
+ groupAllowFrom?: string[];
75
+ requireMention?: boolean;
76
+ mentionPatterns?: string[];
77
+ dmScope?: string;
78
+ accounts?: Record<string, unknown>[];
79
+ }>;
80
+ sandbox?: {
81
+ mode?: string;
82
+ scope?: string;
83
+ workspaceAccess?: string;
84
+ docker?: {
85
+ network?: string;
86
+ socketMounted?: boolean;
87
+ };
88
+ browser?: {
89
+ allowHostControl?: boolean;
90
+ };
91
+ };
92
+ tools?: {
93
+ elevated?: string[];
94
+ useAccessGroups?: boolean;
95
+ allowlist?: string[];
96
+ timeout?: number;
97
+ rateLimit?: number;
98
+ auditLog?: boolean;
99
+ };
100
+ retention?: {
101
+ sessionLogTTL?: number;
102
+ encryptAtRest?: boolean;
103
+ logRotation?: boolean;
104
+ };
105
+ monitoring?: {
106
+ enabled?: boolean;
107
+ provider?: string;
108
+ };
109
+ skills?: {
110
+ autoUpdate?: boolean;
111
+ verifySignatures?: boolean;
112
+ sandboxed?: boolean;
113
+ };
114
+ pairing?: {
115
+ storeTTL?: number;
116
+ };
117
+ model?: {
118
+ default?: string;
119
+ fallbackOrder?: string[];
120
+ };
121
+ reasoning?: {
122
+ enabled?: boolean;
123
+ };
124
+ verbose?: {
125
+ enabled?: boolean;
126
+ };
127
+ identityLinks?: unknown[];
128
+ commands?: {
129
+ useAccessGroups?: boolean;
130
+ };
131
+ agents?: Record<string, unknown>[];
132
+ }
133
+ /** Parsed .env file as key-value pairs */
134
+ export type EnvVars = Record<string, string>;
135
+ /** A single JSONL session entry */
136
+ export interface SessionEntry {
137
+ role?: string;
138
+ content?: string;
139
+ tool?: string;
140
+ timestamp?: string;
141
+ [key: string]: unknown;
142
+ }
143
+ /** Clawhatch-specific config (clawhatch.json, separate from openclaw.json) */
144
+ export interface ClawhatchConfig {
145
+ apiUrl?: string;
146
+ notify?: {
147
+ webhookUrl?: string;
148
+ email?: string;
149
+ threshold?: string;
150
+ };
151
+ }
152
+ /** Anonymized threat report for community sharing */
153
+ export interface ThreatReport {
154
+ version: string;
155
+ timestamp: string;
156
+ instanceId: string;
157
+ platform: NodeJS.Platform;
158
+ score: number;
159
+ checksRun: number;
160
+ findingCount: number;
161
+ findings: ThreatSignature[];
162
+ }
163
+ /** Anonymized finding — no file paths or secrets, just check metadata */
164
+ export interface ThreatSignature {
165
+ id: string;
166
+ severity: string;
167
+ category: string;
168
+ }
169
+ /** Community threat feed */
170
+ export interface ThreatFeed {
171
+ lastUpdated: string;
172
+ totalScans: number;
173
+ totalInstances: number;
174
+ communityScore: number;
175
+ topThreats: ThreatFeedEntry[];
176
+ newThreats: ThreatFeedEntry[];
177
+ advisories: Advisory[];
178
+ }
179
+ export interface ThreatFeedEntry {
180
+ id: string;
181
+ severity: string;
182
+ category: string;
183
+ title: string;
184
+ frequency: number;
185
+ firstSeen: string;
186
+ lastSeen: string;
187
+ trending: boolean;
188
+ }
189
+ export interface Advisory {
190
+ id: string;
191
+ severity: string;
192
+ title: string;
193
+ description: string;
194
+ affectedChecks: string[];
195
+ publishedAt: string;
196
+ }
197
+ export interface WebhookAlert {
198
+ checkId: string;
199
+ severity: string;
200
+ title: string;
201
+ description: string;
202
+ communityFrequency?: number;
203
+ trending?: boolean;
204
+ }
205
+ /** Discovered files to scan */
206
+ export interface DiscoveredFiles {
207
+ configPath: string | null;
208
+ envPath: string | null;
209
+ credentialFiles: string[];
210
+ authProfileFiles: string[];
211
+ sessionLogFiles: string[];
212
+ workspaceMarkdownFiles: string[];
213
+ skillFiles: string[];
214
+ customCommandFiles: string[];
215
+ skillPackageFiles: string[];
216
+ privateKeyFiles: string[];
217
+ sshKeyFiles: string[];
218
+ openclawDir: string;
219
+ workspaceDir: string | null;
220
+ }
221
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Core types for Clawhatch security scanner.
3
+ */
4
+ export var Severity;
5
+ (function (Severity) {
6
+ Severity["Critical"] = "CRITICAL";
7
+ Severity["High"] = "HIGH";
8
+ Severity["Medium"] = "MEDIUM";
9
+ Severity["Low"] = "LOW";
10
+ })(Severity || (Severity = {}));
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAN,IAAY,QAKX;AALD,WAAY,QAAQ;IAClB,iCAAqB,CAAA;IACrB,yBAAa,CAAA;IACb,6BAAiB,CAAA;IACjB,uBAAW,CAAA;AACb,CAAC,EALW,QAAQ,KAAR,QAAQ,QAKnB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Shared utility functions for the Clawhatch scanner.
3
+ */
4
+ /**
5
+ * Read at most `maxBytes` from a file without loading the entire file into memory.
6
+ * Prevents OOM on huge session logs (which can be hundreds of MB).
7
+ *
8
+ * If the file is smaller than maxBytes, reads it entirely.
9
+ * Otherwise, streams up to maxBytes and returns a truncated string.
10
+ */
11
+ export declare function readFileCapped(filePath: string, maxBytes: number): Promise<string>;
12
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBxF"}
package/dist/utils.js ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Shared utility functions for the Clawhatch scanner.
3
+ */
4
+ import { stat, readFile } from "node:fs/promises";
5
+ import { createReadStream } from "node:fs";
6
+ /**
7
+ * Read at most `maxBytes` from a file without loading the entire file into memory.
8
+ * Prevents OOM on huge session logs (which can be hundreds of MB).
9
+ *
10
+ * If the file is smaller than maxBytes, reads it entirely.
11
+ * Otherwise, streams up to maxBytes and returns a truncated string.
12
+ */
13
+ export async function readFileCapped(filePath, maxBytes) {
14
+ const fileStat = await stat(filePath);
15
+ if (fileStat.size <= maxBytes) {
16
+ return readFile(filePath, "utf-8");
17
+ }
18
+ return new Promise((resolve, reject) => {
19
+ const chunks = [];
20
+ let bytesRead = 0;
21
+ const stream = createReadStream(filePath, { highWaterMark: 64 * 1024 });
22
+ stream.on("data", (chunk) => {
23
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
24
+ bytesRead += buf.length;
25
+ chunks.push(buf);
26
+ if (bytesRead >= maxBytes) {
27
+ stream.destroy();
28
+ }
29
+ });
30
+ stream.on("close", () => resolve(Buffer.concat(chunks).toString("utf-8")));
31
+ stream.on("error", reject);
32
+ });
33
+ }
34
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB,EAAE,QAAgB;IACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC9B,OAAO,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAsB,EAAE,EAAE;YAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChE,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACjB,IAAI,SAAS,IAAI,QAAQ,EAAE,CAAC;gBAC1B,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "clawhatch",
3
+ "version": "0.1.0",
4
+ "description": "Security scanner for OpenClaw AI agents — 100-point audit with auto-fix",
5
+ "type": "module",
6
+ "bin": {
7
+ "clawhatch": "./dist/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "types": "./dist/index.d.ts",
11
+ "files": [
12
+ "dist",
13
+ "!dist/__tests__",
14
+ "README.md",
15
+ "LICENSE"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsx src/index.ts",
20
+ "start": "node dist/index.js",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "tsc && node --test dist/__tests__/*.test.js",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "security",
27
+ "ai",
28
+ "agent",
29
+ "openclaw",
30
+ "scanner",
31
+ "audit",
32
+ "ai-agent",
33
+ "ai-agent-security",
34
+ "cli",
35
+ "security-audit",
36
+ "configuration-scanner",
37
+ "devops",
38
+ "devsecops",
39
+ "infosec",
40
+ "secret-scanning",
41
+ "hardening",
42
+ "compliance",
43
+ "claude",
44
+ "openai",
45
+ "llm-security"
46
+ ],
47
+ "repository": {
48
+ "type": "git",
49
+ "url": "git+https://github.com/wlshlad85/clawhatch.git"
50
+ },
51
+ "homepage": "https://github.com/wlshlad85/clawhatch#readme",
52
+ "bugs": {
53
+ "url": "https://github.com/wlshlad85/clawhatch/issues"
54
+ },
55
+ "author": "Clawhatch <security@clawhatch.com>",
56
+ "license": "MIT",
57
+ "engines": {
58
+ "node": ">=18.0.0"
59
+ },
60
+ "dependencies": {
61
+ "chalk": "5.4.1",
62
+ "commander": "13.1.0",
63
+ "glob": "11.1.0",
64
+ "json5": "2.2.3"
65
+ },
66
+ "devDependencies": {
67
+ "@types/node": "22.13.1",
68
+ "tsx": "4.21.0",
69
+ "typescript": "5.7.3"
70
+ }
71
+ }