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,91 @@
1
+ "use strict";
2
+ /**
3
+ * Trace Writer
4
+ * Manages writing events to the trace store
5
+ *
6
+ * Trailhound uses .trailhound/ directory for all traces
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.TraceWriter = void 0;
43
+ const fs = __importStar(require("fs/promises"));
44
+ const path = __importStar(require("path"));
45
+ class TraceWriter {
46
+ workspacePath;
47
+ eventsPath;
48
+ manifestPath;
49
+ writeQueue = [];
50
+ flushInterval;
51
+ closed = false;
52
+ constructor(workspacePath) {
53
+ this.workspacePath = workspacePath;
54
+ this.eventsPath = path.join(workspacePath, "events.jsonl");
55
+ this.manifestPath = path.join(workspacePath, "manifest.json");
56
+ }
57
+ async initialize() {
58
+ // Touch the events file
59
+ await fs.writeFile(this.eventsPath, "", { flag: "a" });
60
+ // Start background flush
61
+ this.flushInterval = setInterval(() => this.flush(), 100);
62
+ }
63
+ async writeEvent(event) {
64
+ if (this.closed)
65
+ return;
66
+ this.writeQueue.push(event);
67
+ }
68
+ async writeManifest(manifest) {
69
+ await fs.writeFile(this.manifestPath, JSON.stringify(manifest, null, 2));
70
+ }
71
+ async close() {
72
+ this.closed = true;
73
+ if (this.flushInterval) {
74
+ clearInterval(this.flushInterval);
75
+ }
76
+ // Final flush
77
+ await this.flush();
78
+ }
79
+ async flush() {
80
+ if (this.writeQueue.length === 0)
81
+ return;
82
+ const events = [...this.writeQueue];
83
+ this.writeQueue = [];
84
+ const lines = events
85
+ .map(e => JSON.stringify(e))
86
+ .join("\n") + "\n";
87
+ await fs.appendFile(this.eventsPath, lines);
88
+ }
89
+ }
90
+ exports.TraceWriter = TraceWriter;
91
+ //# sourceMappingURL=trace-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-writer.js","sourceRoot":"","sources":["../../src/core/trace-writer.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAClC,2CAA6B;AAG7B,MAAa,WAAW;IAOF;IANZ,UAAU,CAAS;IACnB,YAAY,CAAS;IACrB,UAAU,GAAiB,EAAE,CAAC;IAC9B,aAAa,CAAkB;IAC/B,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAoB,aAAqB;QAArB,kBAAa,GAAb,aAAa,CAAQ;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAC3D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,wBAAwB;QACxB,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAEvD,yBAAyB;QACzB,IAAI,CAAC,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAiB;QAChC,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAqB;QACvC,MAAM,EAAE,CAAC,SAAS,CAChB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,CAAC;QAED,cAAc;QACd,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAEO,KAAK,CAAC,KAAK;QACjB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEzC,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,MAAM,KAAK,GAAG,MAAM;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;aAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAErB,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;CACF;AAvDD,kCAuDC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Trailhound Core
3
+ * Main orchestrator for tracking agent sessions
4
+ */
5
+ import { EventEmitter } from "events";
6
+ import { TrailhoundOptions, RunResult } from "../types/index.js";
7
+ export interface TrailhoundConfig extends TrailhoundOptions {
8
+ workspacePath: string;
9
+ runId: string;
10
+ startTime: Date;
11
+ }
12
+ export declare class Trailhound extends EventEmitter {
13
+ private config;
14
+ private processWrapper;
15
+ private filesystemMonitor;
16
+ private networkMonitor;
17
+ private secretDetector;
18
+ private policyEngine;
19
+ private traceWriter;
20
+ private events;
21
+ private openclawAdapter?;
22
+ private warnings;
23
+ private commands;
24
+ private filesModified;
25
+ private secretsAccessed;
26
+ private networkConnections;
27
+ constructor(options: TrailhoundOptions);
28
+ run(agentCommand: string): Promise<RunResult>;
29
+ private initialize;
30
+ private startRecording;
31
+ private executeAgent;
32
+ private stopRecording;
33
+ private finalize;
34
+ private handleFilesystemEvent;
35
+ private calculateRiskScore;
36
+ private captureGitBefore;
37
+ private captureGitAfter;
38
+ private getGitInfo;
39
+ private cleanup;
40
+ private generateRunId;
41
+ }
42
+ //# sourceMappingURL=trailhound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailhound.d.ts","sourceRoot":"","sources":["../../src/core/trailhound.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,EAAe,iBAAiB,EAAE,SAAS,EAAyB,MAAM,mBAAmB,CAAC;AAErG,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB;IACzD,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,iBAAiB,CAAoB;IAC7C,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAA8C;IAC9D,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,OAAO,EAAE,iBAAiB;IA0BhC,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;YAuBrC,UAAU;YAgBV,cAAc;YA+Cd,YAAY;YAWZ,aAAa;YAcb,QAAQ;IAuFtB,OAAO,CAAC,qBAAqB;IAkC7B,OAAO,CAAC,kBAAkB;YAsBZ,gBAAgB;YAYhB,eAAe;YAYf,UAAU;YAsBV,OAAO;IAUrB,OAAO,CAAC,aAAa;CAMtB"}
@@ -0,0 +1,351 @@
1
+ "use strict";
2
+ /**
3
+ * Trailhound Core
4
+ * Main orchestrator for tracking agent 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.Trailhound = void 0;
41
+ const events_1 = require("events");
42
+ const fs = __importStar(require("fs/promises"));
43
+ const path = __importStar(require("path"));
44
+ const nanoid_1 = require("nanoid");
45
+ const process_wrapper_js_1 = require("../recorders/process-wrapper.js");
46
+ const filesystem_monitor_js_1 = require("../recorders/filesystem-monitor.js");
47
+ const secret_detector_js_1 = require("../recorders/secret-detector.js");
48
+ const network_proxy_js_1 = require("../recorders/network-proxy.js");
49
+ const policy_engine_js_1 = require("../policies/policy-engine.js");
50
+ const trace_writer_js_1 = require("./trace-writer.js");
51
+ const openclaw_js_1 = require("../adapters/openclaw.js");
52
+ class Trailhound extends events_1.EventEmitter {
53
+ config;
54
+ processWrapper;
55
+ filesystemMonitor;
56
+ networkMonitor;
57
+ secretDetector;
58
+ policyEngine;
59
+ traceWriter;
60
+ events = [];
61
+ openclawAdapter;
62
+ warnings = [];
63
+ commands = [];
64
+ filesModified = 0;
65
+ secretsAccessed = 0;
66
+ networkConnections = 0;
67
+ constructor(options) {
68
+ super();
69
+ const runId = this.generateRunId();
70
+ const workspacePath = path.join(process.cwd(), ".trailhound", "runs", runId);
71
+ this.config = {
72
+ ...options,
73
+ runId,
74
+ workspacePath,
75
+ startTime: new Date(),
76
+ };
77
+ this.traceWriter = new trace_writer_js_1.TraceWriter(workspacePath);
78
+ this.processWrapper = new process_wrapper_js_1.ProcessWrapper(workspacePath);
79
+ this.filesystemMonitor = new filesystem_monitor_js_1.FilesystemMonitor();
80
+ this.networkMonitor = new network_proxy_js_1.PassiveNetworkMonitor();
81
+ this.secretDetector = new secret_detector_js_1.SecretDetector();
82
+ this.policyEngine = new policy_engine_js_1.PolicyEngine();
83
+ // Initialize OpenClaw adapter if needed
84
+ if (options.agent === "openclaw") {
85
+ this.openclawAdapter = new openclaw_js_1.OpenClawAdapter();
86
+ }
87
+ }
88
+ async run(agentCommand) {
89
+ await this.initialize();
90
+ try {
91
+ // Start recording
92
+ await this.startRecording();
93
+ // Run the agent
94
+ const exitCode = await this.executeAgent(agentCommand);
95
+ // Stop recording
96
+ await this.stopRecording();
97
+ // Generate manifest
98
+ const result = await this.finalize(exitCode);
99
+ return result;
100
+ }
101
+ catch (error) {
102
+ await this.cleanup();
103
+ throw error;
104
+ }
105
+ }
106
+ async initialize() {
107
+ // Create workspace
108
+ await fs.mkdir(this.config.workspacePath, { recursive: true });
109
+ // Initialize trace writer
110
+ await this.traceWriter.initialize();
111
+ // Capture initial git state
112
+ await this.captureGitBefore();
113
+ // Load policy
114
+ await this.policyEngine.load();
115
+ this.emit("initialized", { runId: this.config.runId });
116
+ }
117
+ async startRecording() {
118
+ // Start filesystem monitoring
119
+ await this.filesystemMonitor.start(process.cwd(), this.config.runId, (event) => this.handleFilesystemEvent(event));
120
+ // Start network monitoring
121
+ await this.networkMonitor.start(this.config.runId, (event) => {
122
+ this.networkConnections++;
123
+ this.events.push(event);
124
+ this.traceWriter.writeEvent(event);
125
+ });
126
+ // Setup process wrapper event handlers
127
+ this.processWrapper.on("spawn", (data) => {
128
+ this.commands.push({
129
+ ts: new Date().toISOString(),
130
+ command: `${data.command} ${data.args?.join(" ") || ""}`
131
+ });
132
+ });
133
+ // Parse OpenClaw output if applicable
134
+ if (this.openclawAdapter) {
135
+ this.processWrapper.on("stdout", (data) => {
136
+ for (const line of data.split("\n")) {
137
+ const event = this.openclawAdapter.parseOutput(line);
138
+ if (event) {
139
+ this.events.push(event);
140
+ this.traceWriter.writeEvent(event);
141
+ // Log delegation events
142
+ if (event.action === "delegate") {
143
+ this.warnings.push(`OpenClaw delegated to ${event.childAgent}`);
144
+ }
145
+ }
146
+ }
147
+ });
148
+ }
149
+ this.emit("recording-started", { runId: this.config.runId });
150
+ }
151
+ async executeAgent(agentCommand) {
152
+ const parts = agentCommand.trim().split(/\s+/);
153
+ const command = parts[0];
154
+ const args = parts.slice(1);
155
+ return await this.processWrapper.spawn(command, args, {
156
+ cwd: process.cwd(),
157
+ shell: true,
158
+ });
159
+ }
160
+ async stopRecording() {
161
+ // Stop all monitors
162
+ await this.filesystemMonitor.stop();
163
+ await this.networkMonitor.stop();
164
+ // Close trace writer
165
+ await this.traceWriter.close();
166
+ // Capture final git state
167
+ await this.captureGitAfter();
168
+ this.emit("recording-stopped", { runId: this.config.runId });
169
+ }
170
+ async finalize(exitCode) {
171
+ const endTime = new Date();
172
+ const durationMs = endTime.getTime() - this.config.startTime.getTime();
173
+ // Get git info
174
+ const gitInfo = await this.getGitInfo();
175
+ // Calculate risk score
176
+ const riskScore = this.calculateRiskScore();
177
+ // Generate summary
178
+ const summary = {
179
+ filesModified: this.filesModified,
180
+ commandsRun: this.commands.length,
181
+ networkConnections: this.networkConnections,
182
+ secretsAccessed: this.secretsAccessed,
183
+ riskScore: riskScore.score,
184
+ riskLevel: riskScore.level,
185
+ };
186
+ // Generate manifest
187
+ const manifest = {
188
+ schema: "trailhound.manifest.v1",
189
+ run: {
190
+ id: this.config.runId,
191
+ name: this.config.name,
192
+ timestamp: this.config.startTime.toISOString(),
193
+ durationMs,
194
+ exitCode,
195
+ },
196
+ agent: {
197
+ name: this.config.agent || "unknown",
198
+ command: (this.commands[0]?.command || "").split(" "),
199
+ },
200
+ repo: {
201
+ root: process.cwd(),
202
+ git: gitInfo,
203
+ },
204
+ summary,
205
+ warnings: this.warnings,
206
+ };
207
+ // OpenClaw-specific enrichment
208
+ if (this.openclawAdapter) {
209
+ manifest.agentMetadata = {
210
+ openclaw: this.openclawAdapter.getDelegationTree(),
211
+ tree: this.openclawAdapter.formatTree(),
212
+ };
213
+ // Add formatted tree to warnings for display
214
+ const tree = this.openclawAdapter.formatTree();
215
+ this.warnings.unshift(tree);
216
+ }
217
+ // Write manifest
218
+ await this.traceWriter.writeManifest(manifest);
219
+ // Generate report
220
+ const { ReportGenerator } = await import("../reports/report-generator.js");
221
+ const generator = new ReportGenerator(manifest);
222
+ await generator.generateMarkdownReport();
223
+ await generator.generateHtml();
224
+ // Print summary
225
+ console.log("\n" + "=".repeat(50));
226
+ console.log("📊 Trailhound Summary");
227
+ console.log("=".repeat(50));
228
+ console.log(`Files Modified: ${summary.filesModified}`);
229
+ console.log(`Commands Run: ${summary.commandsRun}`);
230
+ console.log(`Network Connections: ${summary.networkConnections}`);
231
+ console.log(`Secrets Accessed: ${summary.secretsAccessed}`);
232
+ console.log(`Risk Score: ${summary.riskScore} (${summary.riskLevel})`);
233
+ console.log("=".repeat(50));
234
+ if (this.warnings.length > 0) {
235
+ console.log("\n⚠️ Warnings:");
236
+ this.warnings.forEach(w => console.log(` - ${w}`));
237
+ }
238
+ return {
239
+ runId: this.config.runId,
240
+ durationMs,
241
+ exitCode,
242
+ warnings: this.warnings,
243
+ };
244
+ }
245
+ handleFilesystemEvent(event) {
246
+ if (event.type === "file.write" || event.type === "file.delete") {
247
+ this.filesModified++;
248
+ }
249
+ // Check for secret access
250
+ if (event.path && this.secretDetector.isSecretPath(event.path)) {
251
+ this.secretsAccessed++;
252
+ this.warnings.push(`Secret file touched: ${event.path}`);
253
+ const secretEvent = {
254
+ ts: event.ts,
255
+ type: "secret.access",
256
+ runId: this.config.runId,
257
+ path: event.path,
258
+ category: this.secretDetector.getSecretCategory(event.path) || "other",
259
+ redacted: true,
260
+ };
261
+ this.traceWriter.writeEvent(secretEvent);
262
+ }
263
+ // Check policy
264
+ if (event.type === "file.write") {
265
+ const decision = this.policyEngine.evaluateFilesystem(event);
266
+ if (decision.action !== "allow") {
267
+ this.warnings.push(`Policy ${decision.action}: ${decision.reason}`);
268
+ }
269
+ }
270
+ this.events.push(event);
271
+ this.traceWriter.writeEvent(event);
272
+ }
273
+ calculateRiskScore() {
274
+ let score = 0;
275
+ // Risk factors
276
+ score += this.filesModified * 1;
277
+ score += this.commands.length * 0.5;
278
+ score += this.networkConnections * 2;
279
+ score += this.secretsAccessed * 10;
280
+ score += this.warnings.length * 3;
281
+ // Determine level
282
+ let level = "Low 🟢";
283
+ if (score >= 10) {
284
+ level = "Medium 🟡";
285
+ }
286
+ if (score >= 25) {
287
+ level = "High 🔴";
288
+ }
289
+ return { score, level };
290
+ }
291
+ async captureGitBefore() {
292
+ try {
293
+ const { execAsync } = await import("../utils/exec.js");
294
+ const patchPath = path.join(this.config.workspacePath, "git-before.patch");
295
+ const { stdout } = await execAsync("git diff 2>/dev/null || echo ''", { cwd: process.cwd() });
296
+ await fs.writeFile(patchPath, stdout);
297
+ }
298
+ catch {
299
+ // Not a git repo
300
+ }
301
+ }
302
+ async captureGitAfter() {
303
+ try {
304
+ const { execAsync } = await import("../utils/exec.js");
305
+ const patchPath = path.join(this.config.workspacePath, "git-after.patch");
306
+ const { stdout } = await execAsync("git diff 2>/dev/null || echo ''", { cwd: process.cwd() });
307
+ await fs.writeFile(patchPath, stdout);
308
+ }
309
+ catch {
310
+ // Not a git repo
311
+ }
312
+ }
313
+ async getGitInfo() {
314
+ try {
315
+ const { execAsync } = await import("../utils/exec.js");
316
+ const [{ stdout: branch }, { stdout: commit }, { stdout: status }] = await Promise.all([
317
+ execAsync("git branch --show-current 2>/dev/null || echo 'unknown'", { cwd: process.cwd() }),
318
+ execAsync("git rev-parse HEAD 2>/dev/null || echo 'unknown'", { cwd: process.cwd() }),
319
+ execAsync("git status --porcelain 2>/dev/null || echo ''", { cwd: process.cwd() }),
320
+ ]);
321
+ return {
322
+ isRepo: true,
323
+ branch: branch.trim(),
324
+ // Truncate commit to 8 characters
325
+ commit: commit.trim().slice(0, 8),
326
+ dirty: status.trim().length > 0,
327
+ };
328
+ }
329
+ catch {
330
+ return { isRepo: false };
331
+ }
332
+ }
333
+ async cleanup() {
334
+ try {
335
+ await this.filesystemMonitor.stop();
336
+ await this.networkMonitor.stop();
337
+ await this.traceWriter.close();
338
+ }
339
+ catch {
340
+ // Ignore cleanup errors
341
+ }
342
+ }
343
+ generateRunId() {
344
+ const now = new Date();
345
+ const timestamp = now.toISOString().replace(/[:.]/g, "-").slice(0, -5);
346
+ const shortId = (0, nanoid_1.nanoid)(6);
347
+ return `${timestamp}_${shortId}`;
348
+ }
349
+ }
350
+ exports.Trailhound = Trailhound;
351
+ //# sourceMappingURL=trailhound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailhound.js","sourceRoot":"","sources":["../../src/core/trailhound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Policy Engine
3
+ * Evaluates events against policies and makes decisions
4
+ */
5
+ import { PolicyDecision, FileEvent, ProcessEvent, NetworkEvent } from "../types/index.js";
6
+ export declare class PolicyEngine {
7
+ private policy;
8
+ load(): Promise<void>;
9
+ evaluateFilesystem(event: FileEvent): PolicyDecision;
10
+ evaluateCommand(event: ProcessEvent): PolicyDecision;
11
+ evaluateNetwork(event: NetworkEvent): PolicyDecision;
12
+ private matchPattern;
13
+ private matchGlobs;
14
+ }
15
+ //# sourceMappingURL=policy-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy-engine.d.ts","sourceRoot":"","sources":["../../src/policies/policy-engine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAEL,cAAc,EAEd,SAAS,EACT,YAAY,EACZ,YAAY,EACb,MAAM,mBAAmB,CAAC;AAwB3B,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA0B;IAElC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,kBAAkB,CAAC,KAAK,EAAE,SAAS,GAAG,cAAc;IAuCpD,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc;IA0DpD,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,cAAc;IAyCpD,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,UAAU;CAQnB"}