trailhound 0.2.1

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 (75) hide show
  1. package/LICENSE +118 -0
  2. package/README.md +325 -0
  3. package/dist/adapters/claude-code.d.ts +25 -0
  4. package/dist/adapters/claude-code.d.ts.map +1 -0
  5. package/dist/adapters/claude-code.js +88 -0
  6. package/dist/adapters/claude-code.js.map +1 -0
  7. package/dist/adapters/codex.d.ts +25 -0
  8. package/dist/adapters/codex.d.ts.map +1 -0
  9. package/dist/adapters/codex.js +72 -0
  10. package/dist/adapters/codex.js.map +1 -0
  11. package/dist/adapters/openclaw.d.ts +49 -0
  12. package/dist/adapters/openclaw.d.ts.map +1 -0
  13. package/dist/adapters/openclaw.js +180 -0
  14. package/dist/adapters/openclaw.js.map +1 -0
  15. package/dist/cli.d.ts +7 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +226 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/core/run-store.d.ts +15 -0
  20. package/dist/core/run-store.d.ts.map +1 -0
  21. package/dist/core/run-store.js +88 -0
  22. package/dist/core/run-store.js.map +1 -0
  23. package/dist/core/trace-writer.d.ts +22 -0
  24. package/dist/core/trace-writer.d.ts.map +1 -0
  25. package/dist/core/trace-writer.js +91 -0
  26. package/dist/core/trace-writer.js.map +1 -0
  27. package/dist/core/trailhound.d.ts +42 -0
  28. package/dist/core/trailhound.d.ts.map +1 -0
  29. package/dist/core/trailhound.js +351 -0
  30. package/dist/core/trailhound.js.map +1 -0
  31. package/dist/policies/policy-engine.d.ts +15 -0
  32. package/dist/policies/policy-engine.d.ts.map +1 -0
  33. package/dist/policies/policy-engine.js +205 -0
  34. package/dist/policies/policy-engine.js.map +1 -0
  35. package/dist/recorders/filesystem-monitor.d.ts +33 -0
  36. package/dist/recorders/filesystem-monitor.d.ts.map +1 -0
  37. package/dist/recorders/filesystem-monitor.js +262 -0
  38. package/dist/recorders/filesystem-monitor.js.map +1 -0
  39. package/dist/recorders/git-snapshotter.d.ts +17 -0
  40. package/dist/recorders/git-snapshotter.d.ts.map +1 -0
  41. package/dist/recorders/git-snapshotter.js +116 -0
  42. package/dist/recorders/git-snapshotter.js.map +1 -0
  43. package/dist/recorders/network-monitor.d.ts +18 -0
  44. package/dist/recorders/network-monitor.d.ts.map +1 -0
  45. package/dist/recorders/network-monitor.js +67 -0
  46. package/dist/recorders/network-monitor.js.map +1 -0
  47. package/dist/recorders/network-proxy.d.ts +31 -0
  48. package/dist/recorders/network-proxy.d.ts.map +1 -0
  49. package/dist/recorders/network-proxy.js +163 -0
  50. package/dist/recorders/network-proxy.js.map +1 -0
  51. package/dist/recorders/process-monitor.d.ts +14 -0
  52. package/dist/recorders/process-monitor.d.ts.map +1 -0
  53. package/dist/recorders/process-monitor.js +47 -0
  54. package/dist/recorders/process-monitor.js.map +1 -0
  55. package/dist/recorders/process-wrapper.d.ts +37 -0
  56. package/dist/recorders/process-wrapper.d.ts.map +1 -0
  57. package/dist/recorders/process-wrapper.js +152 -0
  58. package/dist/recorders/process-wrapper.js.map +1 -0
  59. package/dist/recorders/secret-detector.d.ts +26 -0
  60. package/dist/recorders/secret-detector.d.ts.map +1 -0
  61. package/dist/recorders/secret-detector.js +148 -0
  62. package/dist/recorders/secret-detector.js.map +1 -0
  63. package/dist/reports/report-generator.d.ts +19 -0
  64. package/dist/reports/report-generator.d.ts.map +1 -0
  65. package/dist/reports/report-generator.js +274 -0
  66. package/dist/reports/report-generator.js.map +1 -0
  67. package/dist/types/index.d.ts +132 -0
  68. package/dist/types/index.d.ts.map +1 -0
  69. package/dist/types/index.js +7 -0
  70. package/dist/types/index.js.map +1 -0
  71. package/dist/utils/exec.d.ts +6 -0
  72. package/dist/utils/exec.d.ts.map +1 -0
  73. package/dist/utils/exec.js +10 -0
  74. package/dist/utils/exec.js.map +1 -0
  75. package/package.json +73 -0
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ /**
3
+ * Secret Detector
4
+ * Detects access to sensitive files and locations
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.SecretDetector = void 0;
41
+ const path = __importStar(require("path"));
42
+ // Known secret paths and patterns
43
+ const SECRET_PATTERNS = [
44
+ { pattern: /\.env$/i, category: "env" },
45
+ { pattern: /\.env\.local$/i, category: "env" },
46
+ { pattern: /\.env\..+$/i, category: "env" },
47
+ { pattern: /id_rsa$/i, category: "ssh" },
48
+ { pattern: /id_ed25519$/i, category: "ssh" },
49
+ { pattern: /id_ecdsa$/i, category: "ssh" },
50
+ { pattern: /\.ssh\/config$/i, category: "ssh" },
51
+ { pattern: /\.aws\/credentials$/i, category: "aws" },
52
+ { pattern: /\.aws\/config$/i, category: "aws" },
53
+ { pattern: /application_default_credentials\.json$/i, category: "gcp" },
54
+ { pattern: /\.azure\/msal_token_cache\.json$/i, category: "azure" },
55
+ { pattern: /\.terraform\/.*\.tfstate$/i, category: "token" },
56
+ { pattern: /\.npmrc$/i, category: "token" },
57
+ { pattern: /\.pypirc$/i, category: "token" },
58
+ { pattern: /\.netrc$/i, category: "token" },
59
+ { pattern: /\.gh\/hosts\.yml$/i, category: "token" },
60
+ { pattern: /token$/i, category: "token" },
61
+ { pattern: /api[_-]?key/i, category: "key" },
62
+ { pattern: /secret/i, category: "key" },
63
+ { pattern: /\.pem$/i, category: "key" },
64
+ { pattern: /\.key$/i, category: "key" },
65
+ { pattern: /\.p12$/i, category: "key" },
66
+ { pattern: /\.pfx$/i, category: "key" },
67
+ ];
68
+ // Known sensitive directories
69
+ const SENSITIVE_DIRS = [
70
+ "~/.ssh",
71
+ "~/.aws",
72
+ "~/.gcp",
73
+ "~/.azure",
74
+ "~/.config/gh",
75
+ "~/.npm",
76
+ ];
77
+ class SecretDetector {
78
+ /**
79
+ * Check if a path contains sensitive information
80
+ */
81
+ isSecretPath(filePath) {
82
+ const normalizedPath = path.normalize(filePath);
83
+ // Check patterns
84
+ for (const { pattern } of SECRET_PATTERNS) {
85
+ if (pattern.test(normalizedPath)) {
86
+ return true;
87
+ }
88
+ }
89
+ // Check sensitive directories
90
+ for (const dir of SENSITIVE_DIRS) {
91
+ const expandedDir = dir.replace(/^~/, process.env.HOME || "");
92
+ if (normalizedPath.startsWith(expandedDir)) {
93
+ return true;
94
+ }
95
+ }
96
+ return false;
97
+ }
98
+ /**
99
+ * Get the category of a secret
100
+ */
101
+ getSecretCategory(filePath) {
102
+ const normalizedPath = path.normalize(filePath);
103
+ for (const { pattern, category } of SECRET_PATTERNS) {
104
+ if (pattern.test(normalizedPath)) {
105
+ return category;
106
+ }
107
+ }
108
+ return null;
109
+ }
110
+ /**
111
+ * Detect high-entropy strings in text (potential secrets in output)
112
+ */
113
+ detectHighEntropyStrings(text) {
114
+ // Simple entropy detection
115
+ // Would use more sophisticated methods in production
116
+ const potentialSecrets = [];
117
+ // Look for common secret patterns
118
+ const patterns = [
119
+ /[a-zA-Z0-9]{32,}/g, // Long alphanumeric strings
120
+ /sk-[a-zA-Z0-9]{20,}/g, // OpenAI-style keys
121
+ /gh[pousr]_[a-zA-Z0-9]{20,}/g, // GitHub tokens
122
+ /AKIA[0-9A-Z]{16}/g, // AWS access keys
123
+ ];
124
+ for (const pattern of patterns) {
125
+ const matches = text.match(pattern);
126
+ if (matches) {
127
+ potentialSecrets.push(...matches);
128
+ }
129
+ }
130
+ return potentialSecrets;
131
+ }
132
+ /**
133
+ * Redact sensitive content from text
134
+ */
135
+ redactIfSensitive(text) {
136
+ const secrets = this.detectHighEntropyStrings(text);
137
+ if (secrets.length === 0) {
138
+ return { text, redacted: false };
139
+ }
140
+ let redactedText = text;
141
+ for (const secret of secrets) {
142
+ redactedText = redactedText.replace(secret, "[REDACTED]");
143
+ }
144
+ return { text: redactedText, redacted: true };
145
+ }
146
+ }
147
+ exports.SecretDetector = SecretDetector;
148
+ //# sourceMappingURL=secret-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret-detector.js","sourceRoot":"","sources":["../../src/recorders/secret-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Report Generator
3
+ * Generates human-readable reports from recorded sessions
4
+ */
5
+ import { RunManifest } from "../types/index.js";
6
+ export declare class ReportGenerator {
7
+ private manifest;
8
+ constructor(manifest: RunManifest);
9
+ generateMarkdown(): string;
10
+ generateMarkdownReport(): Promise<string>;
11
+ generateHtml(): Promise<string>;
12
+ private calculateRiskLevel;
13
+ private generateRiskHtml;
14
+ private generateWarningsHtml;
15
+ private formatDuration;
16
+ private escapeHtml;
17
+ private getRunDir;
18
+ }
19
+ //# sourceMappingURL=report-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.d.ts","sourceRoot":"","sources":["../../src/reports/report-generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,WAAW,EAAc,MAAM,mBAAmB,CAAC;AAE5D,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,WAAW;IAEzC,gBAAgB,IAAI,MAAM;IAuDpB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC;IAazC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAgGrC,OAAO,CAAC,kBAAkB;IAuC1B,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ /**
3
+ * Report Generator
4
+ * Generates human-readable reports from recorded sessions
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.ReportGenerator = void 0;
41
+ const fs = __importStar(require("fs/promises"));
42
+ const path = __importStar(require("path"));
43
+ class ReportGenerator {
44
+ manifest;
45
+ constructor(manifest) {
46
+ this.manifest = manifest;
47
+ }
48
+ generateMarkdown() {
49
+ const lines = [];
50
+ // Header
51
+ lines.push("# Trailhound Report\n");
52
+ lines.push(`**Run:** ${this.manifest.run.id}`);
53
+ lines.push(`**Agent:** ${this.manifest.agent.name}`);
54
+ lines.push(`**Started:** ${new Date(this.manifest.run.timestamp).toLocaleString()}`);
55
+ lines.push(`**Duration:** ${this.formatDuration(this.manifest.run.durationMs)}`);
56
+ lines.push(`**Exit Code:** ${this.manifest.run.exitCode}`);
57
+ lines.push("");
58
+ // Risk badge
59
+ const riskLevel = this.calculateRiskLevel();
60
+ lines.push(`## Risk Score: ${riskLevel.level}`);
61
+ if (riskLevel.points > 0) {
62
+ lines.push(`**${riskLevel.points} points** - ${riskLevel.reasons.join(", ")}`);
63
+ }
64
+ lines.push("");
65
+ // Summary
66
+ lines.push("## Summary");
67
+ lines.push(`- **Files Modified:** ${this.manifest.summary.filesModified}`);
68
+ lines.push(`- **Commands Run:** ${this.manifest.summary.commandsRun}`);
69
+ lines.push(`- **Network Connections:** ${this.manifest.summary.networkConnections}`);
70
+ lines.push(`- **Secrets Accessed:** ${this.manifest.summary.secretsAccessed}`);
71
+ lines.push("");
72
+ // Warnings
73
+ if (this.manifest.warnings.length > 0) {
74
+ lines.push("## Warnings");
75
+ this.manifest.warnings.forEach(w => {
76
+ lines.push(`- ⚠️ ${w}`);
77
+ });
78
+ lines.push("");
79
+ }
80
+ // Repository info
81
+ if (this.manifest.repo.git.isRepo) {
82
+ lines.push("## Repository");
83
+ lines.push(`- **Branch:** ${this.manifest.repo.git.branch || "unknown"}`);
84
+ lines.push(`- **Commit:** ${this.manifest.repo.git.commit?.slice(0, 8) || "unknown"}`);
85
+ if (this.manifest.repo.git.dirty) {
86
+ lines.push("- **Status:** ⚠️ Uncommitted changes");
87
+ }
88
+ lines.push("");
89
+ }
90
+ // Footer
91
+ lines.push("---");
92
+ lines.push(`*Generated by Trailhound v0.1.0*\n`);
93
+ return lines.join("\n");
94
+ }
95
+ async generateMarkdownReport() {
96
+ const report = this.generateMarkdown();
97
+ const reportPath = path.join(process.cwd(), ".trailhound", "runs", this.manifest.run.id, "report.md");
98
+ await fs.writeFile(reportPath, report);
99
+ return reportPath;
100
+ }
101
+ async generateHtml() {
102
+ const html = `
103
+ <!DOCTYPE html>
104
+ <html lang="en">
105
+ <head>
106
+ <meta charset="UTF-8">
107
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
108
+ <title>Trailhound Report - ${this.manifest.run.id}</title>
109
+ <style>
110
+ * { box-sizing: border-box; margin: 0; padding: 0; }
111
+ body {
112
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
113
+ background: #0d1117;
114
+ color: #c9d1d9;
115
+ line-height: 1.6;
116
+ padding: 2rem;
117
+ }
118
+ .container { max-width: 1000px; margin: 0 auto; }
119
+ h1 { color: #58a6ff; margin-bottom: 1rem; }
120
+ h2 { color: #79c0ff; margin-top: 2rem; margin-bottom: 1rem; border-bottom: 1px solid #30363d; padding-bottom: 0.5rem; }
121
+ .meta { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin: 1rem 0; }
122
+ .meta-item { background: #161b22; padding: 1rem; border-radius: 8px; border: 1px solid #30363d; }
123
+ .meta-label { color: #8b949e; font-size: 0.85rem; text-transform: uppercase; }
124
+ .meta-value { color: #c9d1d9; font-size: 1.1rem; font-weight: 500; }
125
+ .risk { margin: 1rem 0; padding: 1rem; border-radius: 8px; }
126
+ .risk-low { background: #238636; color: white; }
127
+ .risk-medium { background: #d29922; color: #0d1117; }
128
+ .risk-high { background: #da3633; color: white; }
129
+ .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 1rem; margin: 1rem 0; }
130
+ .summary-item { background: #161b22; padding: 1.5rem; text-align: center; border-radius: 8px; border: 1px solid #30363d; }
131
+ .summary-value { font-size: 2rem; font-weight: bold; color: #58a6ff; }
132
+ .summary-label { color: #8b949e; font-size: 0.9rem; }
133
+ .warning { background: #341a00; border-left: 4px solid #d29922; padding: 1rem; margin: 0.5rem 0; border-radius: 0 4px 4px 0; }
134
+ .footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid #30363d; color: #8b949e; font-size: 0.85rem; }
135
+ </style>
136
+ </head>
137
+ <body>
138
+ <div class="container">
139
+ <h1>🐕 Trailhound Report</h1>
140
+
141
+ <div class="meta">
142
+ <div class="meta-item">
143
+ <div class="meta-label">Run ID</div>
144
+ <div class="meta-value">${this.manifest.run.id}</div>
145
+ </div>
146
+ <div class="meta-item">
147
+ <div class="meta-label">Agent</div>
148
+ <div class="meta-value">${this.manifest.agent.name}</div>
149
+ </div>
150
+ <div class="meta-item">
151
+ <div class="meta-label">Duration</div>
152
+ <div class="meta-value">${this.formatDuration(this.manifest.run.durationMs)}</div>
153
+ </div>
154
+ <div class="meta-item">
155
+ <div class="meta-label">Exit Code</div>
156
+ <div class="meta-value">${this.manifest.run.exitCode}</div>
157
+ </div>
158
+ </div>
159
+
160
+ ${this.generateRiskHtml()}
161
+
162
+ <h2>Summary</h2>
163
+ <div class="summary">
164
+ <div class="summary-item">
165
+ <div class="summary-value">${this.manifest.summary.filesModified}</div>
166
+ <div class="summary-label">Files Modified</div>
167
+ </div>
168
+ <div class="summary-item">
169
+ <div class="summary-value">${this.manifest.summary.commandsRun}</div>
170
+ <div class="summary-label">Commands Run</div>
171
+ </div>
172
+ <div class="summary-item">
173
+ <div class="summary-value">${this.manifest.summary.networkConnections}</div>
174
+ <div class="summary-label">Network Connections</div>
175
+ </div>
176
+ <div class="summary-item">
177
+ <div class="summary-value">${this.manifest.summary.secretsAccessed}</div>
178
+ <div class="summary-label">Secrets Accessed</div>
179
+ </div>
180
+ </div>
181
+
182
+ ${this.generateWarningsHtml()}
183
+
184
+ <div class="footer">
185
+ Generated by Trailhound v0.1.0
186
+ </div>
187
+ </div>
188
+ </body>
189
+ </html>
190
+ `;
191
+ const htmlPath = path.join(this.getRunDir(), "report.html");
192
+ await fs.writeFile(htmlPath, html);
193
+ return htmlPath;
194
+ }
195
+ calculateRiskLevel() {
196
+ let points = 0;
197
+ const reasons = [];
198
+ const summary = this.manifest.summary;
199
+ // Files modified
200
+ points += summary.filesModified * 1;
201
+ // Commands run
202
+ points += summary.commandsRun * 1;
203
+ // Network connections
204
+ if (summary.networkConnections > 0) {
205
+ points += 4;
206
+ reasons.push("external network activity");
207
+ }
208
+ // Secrets accessed - major risk
209
+ if (summary.secretsAccessed > 0) {
210
+ points += summary.secretsAccessed * 10;
211
+ reasons.push("secret file access");
212
+ }
213
+ // Warnings
214
+ points += this.manifest.warnings.length * 2;
215
+ // Determine level
216
+ let level = "Low 🟢";
217
+ if (points >= 10) {
218
+ level = "Medium 🟡";
219
+ }
220
+ if (points >= 20) {
221
+ level = "High 🔴";
222
+ }
223
+ return { level, points, reasons };
224
+ }
225
+ generateRiskHtml() {
226
+ const risk = this.calculateRiskLevel();
227
+ const riskClass = risk.points >= 20 ? "risk-high" :
228
+ risk.points >= 10 ? "risk-medium" : "risk-low";
229
+ return `
230
+ <div class="risk ${riskClass}">
231
+ <strong>Risk Score: ${risk.level}</strong>
232
+ ${risk.points > 0 ? `<br>${risk.points} points - ${risk.reasons.join(", ")}` : ""}
233
+ </div>
234
+ `;
235
+ }
236
+ generateWarningsHtml() {
237
+ if (this.manifest.warnings.length === 0)
238
+ return "";
239
+ const warnings = this.manifest.warnings
240
+ .map(w => `<div class="warning">⚠️ ${this.escapeHtml(w)}</div>`)
241
+ .join("");
242
+ return `
243
+ <h2>Warnings</h2>
244
+ ${warnings}
245
+ `;
246
+ }
247
+ formatDuration(ms) {
248
+ const seconds = Math.floor(ms / 1000);
249
+ const minutes = Math.floor(seconds / 60);
250
+ const hours = Math.floor(minutes / 60);
251
+ if (hours > 0) {
252
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
253
+ }
254
+ if (minutes > 0) {
255
+ return `${minutes}m ${seconds % 60}s`;
256
+ }
257
+ return `${seconds}s`;
258
+ }
259
+ escapeHtml(text) {
260
+ const map = {
261
+ '&': '&amp;',
262
+ '<': '&lt;',
263
+ '>': '&gt;',
264
+ '"': '&quot;',
265
+ "'": '&#039;',
266
+ };
267
+ return text.replace(/[&<>"']/g, m => map[m]);
268
+ }
269
+ getRunDir() {
270
+ return path.join(process.cwd(), ".trailhound", "runs", this.manifest.run.id);
271
+ }
272
+ }
273
+ exports.ReportGenerator = ReportGenerator;
274
+ //# sourceMappingURL=report-generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-generator.js","sourceRoot":"","sources":["../../src/reports/report-generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * Trailhound Types
3
+ * Core type definitions for the Trailhound system
4
+ */
5
+ export interface TrailhoundOptions {
6
+ name?: string;
7
+ agent?: string;
8
+ mode?: "record" | "warn" | "enforce";
9
+ netMode?: "observe" | "proxy" | "off";
10
+ }
11
+ export interface RunResult {
12
+ runId: string;
13
+ durationMs: number;
14
+ exitCode: number;
15
+ warnings: string[];
16
+ }
17
+ export interface RunManifest {
18
+ schema: string;
19
+ run: {
20
+ id: string;
21
+ name?: string;
22
+ timestamp: string;
23
+ durationMs: number;
24
+ exitCode: number;
25
+ };
26
+ agent: {
27
+ name: string;
28
+ command: string[];
29
+ };
30
+ repo: {
31
+ root: string;
32
+ git: GitInfo;
33
+ };
34
+ summary: RunSummary;
35
+ warnings: string[];
36
+ agentMetadata?: Record<string, unknown>;
37
+ }
38
+ export interface GitInfo {
39
+ isRepo: boolean;
40
+ branch?: string;
41
+ commit?: string;
42
+ dirty?: boolean;
43
+ remoteUrl?: string;
44
+ }
45
+ export interface RunSummary {
46
+ filesModified: number;
47
+ commandsRun: number;
48
+ networkConnections: number;
49
+ secretsAccessed: number;
50
+ }
51
+ export type EventType = "session.start" | "session.end" | "file.read" | "file.write" | "file.delete" | "file.chmod" | "process.exec" | "process.spawn" | "process.exit" | "network.connect" | "network.dns" | "network.http" | "package.install" | "package.remove" | "secret.access" | "terminal.output" | "terminal.input" | "git.commit" | "git.branch" | "policy.violation";
52
+ export interface AgentEvent {
53
+ ts: string;
54
+ type: EventType;
55
+ runId: string;
56
+ [key: string]: unknown;
57
+ }
58
+ export interface FileEvent extends AgentEvent {
59
+ type: "file.read" | "file.write" | "file.delete";
60
+ path: string;
61
+ size?: number;
62
+ hash?: string;
63
+ }
64
+ export interface ProcessEvent extends AgentEvent {
65
+ type: "process.exec";
66
+ pid: number;
67
+ ppid: number;
68
+ cwd: string;
69
+ argv: string[];
70
+ exitCode?: number;
71
+ }
72
+ export interface NetworkEvent extends AgentEvent {
73
+ type: "network.connect" | "network.dns" | "network.http";
74
+ protocol: string;
75
+ host?: string;
76
+ ip?: string;
77
+ port?: number;
78
+ method?: string;
79
+ path?: string;
80
+ }
81
+ export interface SecretEvent extends AgentEvent {
82
+ type: "secret.access";
83
+ path: string;
84
+ category: "env" | "ssh" | "aws" | "gcp" | "azure" | "token" | "key" | "other";
85
+ redacted: boolean;
86
+ }
87
+ export interface TerminalEvent extends AgentEvent {
88
+ type: "terminal.output" | "terminal.input";
89
+ data: string;
90
+ }
91
+ export interface Policy {
92
+ mode: "off" | "record" | "warn" | "enforce";
93
+ allowedPaths?: string[];
94
+ blockedPaths?: string[];
95
+ network?: NetworkPolicy;
96
+ packages?: PackagePolicy;
97
+ commands?: CommandPolicy;
98
+ secrets?: SecretPolicy;
99
+ }
100
+ export interface NetworkPolicy {
101
+ default: "allow" | "warn" | "block";
102
+ allow?: string[];
103
+ block?: string[];
104
+ unknownDomains?: "allow" | "warn" | "block";
105
+ }
106
+ export interface PackagePolicy {
107
+ requireApproval?: boolean;
108
+ blockLatest?: boolean;
109
+ allow?: string[];
110
+ block?: string[];
111
+ }
112
+ export interface CommandPolicy {
113
+ requireApproval?: string[];
114
+ block?: string[];
115
+ }
116
+ export interface SecretPolicy {
117
+ warn?: boolean;
118
+ block?: boolean;
119
+ }
120
+ export interface PolicyDecision {
121
+ action: "allow" | "warn" | "block" | "require_approval";
122
+ reason?: string;
123
+ rule?: string;
124
+ }
125
+ export interface RunEntry {
126
+ id: string;
127
+ name?: string;
128
+ timestamp: string;
129
+ agent?: string;
130
+ summary: RunSummary;
131
+ }
132
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Trailhound Types
4
+ * Core type definitions for the Trailhound system
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Async exec utility
3
+ */
4
+ import { exec } from "child_process";
5
+ export declare const execAsync: typeof exec.__promisify__;
6
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAGrC,eAAO,MAAM,SAAS,2BAAkB,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * Async exec utility
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.execAsync = void 0;
7
+ const child_process_1 = require("child_process");
8
+ const util_1 = require("util");
9
+ exports.execAsync = (0, util_1.promisify)(child_process_1.exec);
10
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/utils/exec.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iDAAqC;AACrC,+BAAiC;AAEpB,QAAA,SAAS,GAAG,IAAA,gBAAS,EAAC,oBAAI,CAAC,CAAC"}