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.
- package/LICENSE +118 -0
- package/README.md +325 -0
- package/dist/adapters/claude-code.d.ts +25 -0
- package/dist/adapters/claude-code.d.ts.map +1 -0
- package/dist/adapters/claude-code.js +88 -0
- package/dist/adapters/claude-code.js.map +1 -0
- package/dist/adapters/codex.d.ts +25 -0
- package/dist/adapters/codex.d.ts.map +1 -0
- package/dist/adapters/codex.js +72 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +49 -0
- package/dist/adapters/openclaw.d.ts.map +1 -0
- package/dist/adapters/openclaw.js +180 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +226 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/run-store.d.ts +15 -0
- package/dist/core/run-store.d.ts.map +1 -0
- package/dist/core/run-store.js +88 -0
- package/dist/core/run-store.js.map +1 -0
- package/dist/core/trace-writer.d.ts +22 -0
- package/dist/core/trace-writer.d.ts.map +1 -0
- package/dist/core/trace-writer.js +91 -0
- package/dist/core/trace-writer.js.map +1 -0
- package/dist/core/trailhound.d.ts +42 -0
- package/dist/core/trailhound.d.ts.map +1 -0
- package/dist/core/trailhound.js +351 -0
- package/dist/core/trailhound.js.map +1 -0
- package/dist/policies/policy-engine.d.ts +15 -0
- package/dist/policies/policy-engine.d.ts.map +1 -0
- package/dist/policies/policy-engine.js +205 -0
- package/dist/policies/policy-engine.js.map +1 -0
- package/dist/recorders/filesystem-monitor.d.ts +33 -0
- package/dist/recorders/filesystem-monitor.d.ts.map +1 -0
- package/dist/recorders/filesystem-monitor.js +262 -0
- package/dist/recorders/filesystem-monitor.js.map +1 -0
- package/dist/recorders/git-snapshotter.d.ts +17 -0
- package/dist/recorders/git-snapshotter.d.ts.map +1 -0
- package/dist/recorders/git-snapshotter.js +116 -0
- package/dist/recorders/git-snapshotter.js.map +1 -0
- package/dist/recorders/network-monitor.d.ts +18 -0
- package/dist/recorders/network-monitor.d.ts.map +1 -0
- package/dist/recorders/network-monitor.js +67 -0
- package/dist/recorders/network-monitor.js.map +1 -0
- package/dist/recorders/network-proxy.d.ts +31 -0
- package/dist/recorders/network-proxy.d.ts.map +1 -0
- package/dist/recorders/network-proxy.js +163 -0
- package/dist/recorders/network-proxy.js.map +1 -0
- package/dist/recorders/process-monitor.d.ts +14 -0
- package/dist/recorders/process-monitor.d.ts.map +1 -0
- package/dist/recorders/process-monitor.js +47 -0
- package/dist/recorders/process-monitor.js.map +1 -0
- package/dist/recorders/process-wrapper.d.ts +37 -0
- package/dist/recorders/process-wrapper.d.ts.map +1 -0
- package/dist/recorders/process-wrapper.js +152 -0
- package/dist/recorders/process-wrapper.js.map +1 -0
- package/dist/recorders/secret-detector.d.ts +26 -0
- package/dist/recorders/secret-detector.d.ts.map +1 -0
- package/dist/recorders/secret-detector.js +148 -0
- package/dist/recorders/secret-detector.js.map +1 -0
- package/dist/reports/report-generator.d.ts +19 -0
- package/dist/reports/report-generator.d.ts.map +1 -0
- package/dist/reports/report-generator.js +274 -0
- package/dist/reports/report-generator.js.map +1 -0
- package/dist/types/index.d.ts +132 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/exec.d.ts +6 -0
- package/dist/utils/exec.d.ts.map +1 -0
- package/dist/utils/exec.js +10 -0
- package/dist/utils/exec.js.map +1 -0
- 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"}
|