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,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Monitor
|
|
3
|
+
* Observes network connections and DNS resolutions
|
|
4
|
+
*/
|
|
5
|
+
import { AgentEvent } from "../types/index.js";
|
|
6
|
+
export declare class NetworkMonitor {
|
|
7
|
+
private eventHandler?;
|
|
8
|
+
private mode;
|
|
9
|
+
private proxyServer?;
|
|
10
|
+
constructor(mode?: "observe" | "proxy" | "off");
|
|
11
|
+
start(onEvent: (event: AgentEvent) => void): Promise<void>;
|
|
12
|
+
stop(): Promise<void>;
|
|
13
|
+
private startProxy;
|
|
14
|
+
private startObservation;
|
|
15
|
+
recordConnection(protocol: string, host: string, port: number): void;
|
|
16
|
+
recordDns(hostname: string, ips: string[]): void;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=network-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.d.ts","sourceRoot":"","sources":["../../src/recorders/network-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAgB,MAAM,mBAAmB,CAAC;AAE7D,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAC,CAA8B;IACnD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,WAAW,CAAC,CAAM;gBAEd,IAAI,GAAE,SAAS,GAAG,OAAO,GAAG,KAAiB;IAInD,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAMb,UAAU;YAKV,gBAAgB;IAQ9B,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAapE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI;CAWjD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Network Monitor
|
|
4
|
+
* Observes network connections and DNS resolutions
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.NetworkMonitor = void 0;
|
|
8
|
+
class NetworkMonitor {
|
|
9
|
+
eventHandler;
|
|
10
|
+
mode;
|
|
11
|
+
proxyServer; // Would be actual proxy server
|
|
12
|
+
constructor(mode = "observe") {
|
|
13
|
+
this.mode = mode;
|
|
14
|
+
}
|
|
15
|
+
async start(onEvent) {
|
|
16
|
+
if (this.mode === "off")
|
|
17
|
+
return;
|
|
18
|
+
this.eventHandler = onEvent;
|
|
19
|
+
if (this.mode === "proxy") {
|
|
20
|
+
// Start proxy server
|
|
21
|
+
await this.startProxy();
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
// Use passive observation (monitor via platform APIs)
|
|
25
|
+
await this.startObservation();
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async stop() {
|
|
29
|
+
if (this.proxyServer) {
|
|
30
|
+
await this.proxyServer.close();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async startProxy() {
|
|
34
|
+
// Would start an HTTP/HTTPS proxy
|
|
35
|
+
// This is a simplified placeholder
|
|
36
|
+
}
|
|
37
|
+
async startObservation() {
|
|
38
|
+
// Platform-specific network observation
|
|
39
|
+
// macOS: netstat, lsof
|
|
40
|
+
// Linux: ss, netstat
|
|
41
|
+
// Windows: netstat
|
|
42
|
+
}
|
|
43
|
+
// Called when connections are detected
|
|
44
|
+
recordConnection(protocol, host, port) {
|
|
45
|
+
const event = {
|
|
46
|
+
ts: new Date().toISOString(),
|
|
47
|
+
type: "network.connect",
|
|
48
|
+
runId: "",
|
|
49
|
+
protocol,
|
|
50
|
+
host,
|
|
51
|
+
port,
|
|
52
|
+
};
|
|
53
|
+
this.eventHandler?.(event);
|
|
54
|
+
}
|
|
55
|
+
recordDns(hostname, ips) {
|
|
56
|
+
const event = {
|
|
57
|
+
ts: new Date().toISOString(),
|
|
58
|
+
type: "network.dns",
|
|
59
|
+
runId: "",
|
|
60
|
+
protocol: "dns",
|
|
61
|
+
host: hostname,
|
|
62
|
+
};
|
|
63
|
+
this.eventHandler?.(event);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.NetworkMonitor = NetworkMonitor;
|
|
67
|
+
//# sourceMappingURL=network-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.js","sourceRoot":"","sources":["../../src/recorders/network-monitor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAa,cAAc;IACjB,YAAY,CAA+B;IAC3C,IAAI,CAA8B;IAClC,WAAW,CAAO,CAAC,+BAA+B;IAE1D,YAAY,OAAoC,SAAS;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAoC;QAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO;QAEhC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAE5B,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,qBAAqB;YACrB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,sDAAsD;YACtD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,kCAAkC;QAClC,mCAAmC;IACrC,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,wCAAwC;QACxC,uBAAuB;QACvB,qBAAqB;QACrB,mBAAmB;IACrB,CAAC;IAED,uCAAuC;IACvC,gBAAgB,CAAC,QAAgB,EAAE,IAAY,EAAE,IAAY;QAC3D,MAAM,KAAK,GAAiB;YAC1B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,iBAAiB;YACvB,KAAK,EAAE,EAAE;YACT,QAAQ;YACR,IAAI;YACJ,IAAI;SACL,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,GAAa;QACvC,MAAM,KAAK,GAAiB;YAC1B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,aAAa;YACnB,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,QAAQ;SACf,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAlED,wCAkEC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Proxy
|
|
3
|
+
* Simple HTTP proxy for capturing network requests
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from "events";
|
|
6
|
+
import { AgentEvent } from "../types/index.js";
|
|
7
|
+
export declare class NetworkProxy extends EventEmitter {
|
|
8
|
+
private proxy?;
|
|
9
|
+
private runId;
|
|
10
|
+
private port;
|
|
11
|
+
private eventHandler?;
|
|
12
|
+
start(runId: string, onEvent: (event: AgentEvent) => void): Promise<{
|
|
13
|
+
port: number;
|
|
14
|
+
url: string;
|
|
15
|
+
}>;
|
|
16
|
+
stop(): Promise<void>;
|
|
17
|
+
getProxyUrl(): string;
|
|
18
|
+
private handleRequest;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Passive network monitor using lsof/netstat
|
|
22
|
+
*/
|
|
23
|
+
export declare class PassiveNetworkMonitor extends EventEmitter {
|
|
24
|
+
private interval?;
|
|
25
|
+
private runId;
|
|
26
|
+
private seenConnections;
|
|
27
|
+
start(runId: string, onEvent: (event: AgentEvent) => void): Promise<void>;
|
|
28
|
+
stop(): Promise<void>;
|
|
29
|
+
private getConnections;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=network-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-proxy.d.ts","sourceRoot":"","sources":["../../src/recorders/network-proxy.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAgB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE7D,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,YAAY,CAAC,CAA8B;IAE7C,KAAK,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GACnC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IA6BnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,aAAa;CA8CtB;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,YAAY;IACrD,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAClC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,eAAe,CAAqB;IAEtC,KAAK,CACT,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GACnC,OAAO,CAAC,IAAI,CAAC;IAkCV,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAOb,cAAc;CAwB7B"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Network Proxy
|
|
4
|
+
* Simple HTTP proxy for capturing network requests
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.PassiveNetworkMonitor = exports.NetworkProxy = void 0;
|
|
11
|
+
const http_1 = __importDefault(require("http"));
|
|
12
|
+
const https_1 = __importDefault(require("https"));
|
|
13
|
+
const events_1 = require("events");
|
|
14
|
+
class NetworkProxy extends events_1.EventEmitter {
|
|
15
|
+
proxy;
|
|
16
|
+
runId = "";
|
|
17
|
+
port = 0;
|
|
18
|
+
eventHandler;
|
|
19
|
+
async start(runId, onEvent) {
|
|
20
|
+
this.runId = runId;
|
|
21
|
+
this.eventHandler = onEvent;
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
this.proxy = http_1.default.createServer((req, res) => {
|
|
24
|
+
this.handleRequest(req, res);
|
|
25
|
+
});
|
|
26
|
+
// Find available port
|
|
27
|
+
this.proxy.listen(0, "127.0.0.1", () => {
|
|
28
|
+
const address = this.proxy?.address();
|
|
29
|
+
if (address && typeof address === "object") {
|
|
30
|
+
this.port = address.port;
|
|
31
|
+
resolve({
|
|
32
|
+
port: this.port,
|
|
33
|
+
url: `http://127.0.0.1:${this.port}`,
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
reject(new Error("Failed to get proxy address"));
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
this.proxy.on("error", (err) => {
|
|
41
|
+
reject(err);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async stop() {
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
this.proxy?.close(() => resolve());
|
|
48
|
+
setTimeout(resolve, 100);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
getProxyUrl() {
|
|
52
|
+
return `http://127.0.0.1:${this.port}`;
|
|
53
|
+
}
|
|
54
|
+
handleRequest(req, res) {
|
|
55
|
+
const targetUrl = req.url || "";
|
|
56
|
+
const parsedUrl = new URL(targetUrl.startsWith("http") ? targetUrl : `http://${targetUrl}`);
|
|
57
|
+
// Log the request
|
|
58
|
+
const event = {
|
|
59
|
+
ts: new Date().toISOString(),
|
|
60
|
+
type: "network.http",
|
|
61
|
+
runId: this.runId,
|
|
62
|
+
protocol: parsedUrl.protocol,
|
|
63
|
+
host: parsedUrl.hostname,
|
|
64
|
+
ip: undefined,
|
|
65
|
+
port: parseInt(parsedUrl.port) || (parsedUrl.protocol === "https:" ? 443 : 80),
|
|
66
|
+
method: req.method || "GET",
|
|
67
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
68
|
+
};
|
|
69
|
+
this.eventHandler?.(event);
|
|
70
|
+
this.emit("request", event);
|
|
71
|
+
// Forward the request
|
|
72
|
+
const options = {
|
|
73
|
+
hostname: parsedUrl.hostname,
|
|
74
|
+
port: parsedUrl.port || (parsedUrl.protocol === "https:" ? 443 : 80),
|
|
75
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
76
|
+
method: req.method,
|
|
77
|
+
headers: {
|
|
78
|
+
...req.headers,
|
|
79
|
+
host: parsedUrl.hostname,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const protocol = parsedUrl.protocol === "https:" ? https_1.default : http_1.default;
|
|
83
|
+
const proxyReq = protocol.request(options, (proxyRes) => {
|
|
84
|
+
res.writeHead(proxyRes.statusCode || 200, proxyRes.headers);
|
|
85
|
+
proxyRes.pipe(res);
|
|
86
|
+
});
|
|
87
|
+
proxyReq.on("error", (err) => {
|
|
88
|
+
res.writeHead(502);
|
|
89
|
+
res.end(`Proxy Error: ${err.message}`);
|
|
90
|
+
});
|
|
91
|
+
req.pipe(proxyReq);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.NetworkProxy = NetworkProxy;
|
|
95
|
+
/**
|
|
96
|
+
* Passive network monitor using lsof/netstat
|
|
97
|
+
*/
|
|
98
|
+
class PassiveNetworkMonitor extends events_1.EventEmitter {
|
|
99
|
+
interval;
|
|
100
|
+
runId = "";
|
|
101
|
+
seenConnections = new Set();
|
|
102
|
+
async start(runId, onEvent) {
|
|
103
|
+
this.runId = runId;
|
|
104
|
+
// Poll for new connections every 2 seconds
|
|
105
|
+
this.interval = setInterval(async () => {
|
|
106
|
+
try {
|
|
107
|
+
const connections = await this.getConnections();
|
|
108
|
+
for (const conn of connections) {
|
|
109
|
+
const key = `${conn.host}:${conn.port}`;
|
|
110
|
+
if (!this.seenConnections.has(key)) {
|
|
111
|
+
this.seenConnections.add(key);
|
|
112
|
+
const event = {
|
|
113
|
+
ts: new Date().toISOString(),
|
|
114
|
+
type: "network.http",
|
|
115
|
+
runId,
|
|
116
|
+
protocol: "tcp",
|
|
117
|
+
host: conn.host,
|
|
118
|
+
ip: undefined,
|
|
119
|
+
port: conn.port,
|
|
120
|
+
method: "CONNECT",
|
|
121
|
+
path: "/",
|
|
122
|
+
};
|
|
123
|
+
onEvent(event);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// Ignore errors
|
|
129
|
+
}
|
|
130
|
+
}, 2000);
|
|
131
|
+
}
|
|
132
|
+
async stop() {
|
|
133
|
+
if (this.interval) {
|
|
134
|
+
clearInterval(this.interval);
|
|
135
|
+
}
|
|
136
|
+
this.seenConnections.clear();
|
|
137
|
+
}
|
|
138
|
+
async getConnections() {
|
|
139
|
+
const connections = [];
|
|
140
|
+
try {
|
|
141
|
+
const { execAsync } = await import("../utils/exec.js");
|
|
142
|
+
// Try lsof (macOS/Linux)
|
|
143
|
+
try {
|
|
144
|
+
const { stdout } = await execAsync("lsof -iTCP -n -P 2>/dev/null | grep ESTABLISHED | awk '{print $9}'");
|
|
145
|
+
for (const line of stdout.split("\n")) {
|
|
146
|
+
const match = line.match(/->([\d.]+):(\d+)/);
|
|
147
|
+
if (match) {
|
|
148
|
+
connections.push({ host: match[1], port: parseInt(match[2]) });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// lsof failed
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Can't load utils
|
|
158
|
+
}
|
|
159
|
+
return connections;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
exports.PassiveNetworkMonitor = PassiveNetworkMonitor;
|
|
163
|
+
//# sourceMappingURL=network-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-proxy.js","sourceRoot":"","sources":["../../src/recorders/network-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Monitor
|
|
3
|
+
* Tracks spawned processes
|
|
4
|
+
*/
|
|
5
|
+
import { AgentEvent } from "../types/index.js";
|
|
6
|
+
export declare class ProcessMonitor {
|
|
7
|
+
private eventHandler?;
|
|
8
|
+
private processes;
|
|
9
|
+
start(onEvent: (event: AgentEvent) => void): void;
|
|
10
|
+
stop(): void;
|
|
11
|
+
trackProcess(pid: number, ppid: number, cwd: string, argv: string[]): void;
|
|
12
|
+
recordExit(pid: number, exitCode: number): void;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=process-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-monitor.d.ts","sourceRoot":"","sources":["../../src/recorders/process-monitor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAgB,MAAM,mBAAmB,CAAC;AAE7D,qBAAa,cAAc;IACzB,OAAO,CAAC,YAAY,CAAC,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAkC;IAEnD,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,GAAG,IAAI;IAQjD,IAAI,IAAI,IAAI;IAKZ,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI;IAgB1E,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;CAYhD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Process Monitor
|
|
4
|
+
* Tracks spawned processes
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ProcessMonitor = void 0;
|
|
8
|
+
class ProcessMonitor {
|
|
9
|
+
eventHandler;
|
|
10
|
+
processes = new Map();
|
|
11
|
+
start(onEvent) {
|
|
12
|
+
this.eventHandler = onEvent;
|
|
13
|
+
// In a real implementation, this would hook into
|
|
14
|
+
// process creation via platform-specific APIs (eBPF, ETW, etc.)
|
|
15
|
+
// For MVP, we rely on shell tracing and manual instrumentation
|
|
16
|
+
}
|
|
17
|
+
stop() {
|
|
18
|
+
// Cleanup
|
|
19
|
+
}
|
|
20
|
+
// This would be called by the PTY recorder when spawning processes
|
|
21
|
+
trackProcess(pid, ppid, cwd, argv) {
|
|
22
|
+
this.processes.set(pid, { pid, ppid, cwd, argv });
|
|
23
|
+
const event = {
|
|
24
|
+
ts: new Date().toISOString(),
|
|
25
|
+
type: "process.exec",
|
|
26
|
+
runId: "", // Set by Trailhound
|
|
27
|
+
pid,
|
|
28
|
+
ppid,
|
|
29
|
+
cwd,
|
|
30
|
+
argv,
|
|
31
|
+
};
|
|
32
|
+
this.eventHandler?.(event);
|
|
33
|
+
}
|
|
34
|
+
recordExit(pid, exitCode) {
|
|
35
|
+
const event = {
|
|
36
|
+
ts: new Date().toISOString(),
|
|
37
|
+
type: "process.exit",
|
|
38
|
+
runId: "",
|
|
39
|
+
pid,
|
|
40
|
+
exitCode,
|
|
41
|
+
};
|
|
42
|
+
this.eventHandler?.(event);
|
|
43
|
+
this.processes.delete(pid);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.ProcessMonitor = ProcessMonitor;
|
|
47
|
+
//# sourceMappingURL=process-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-monitor.js","sourceRoot":"","sources":["../../src/recorders/process-monitor.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAa,cAAc;IACjB,YAAY,CAA+B;IAC3C,SAAS,GAAG,IAAI,GAAG,EAAuB,CAAC;IAEnD,KAAK,CAAC,OAAoC;QACxC,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC;QAE5B,iDAAiD;QACjD,gEAAgE;QAChE,+DAA+D;IACjE,CAAC;IAED,IAAI;QACF,UAAU;IACZ,CAAC;IAED,mEAAmE;IACnE,YAAY,CAAC,GAAW,EAAE,IAAY,EAAE,GAAW,EAAE,IAAc;QACjE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;QAElD,MAAM,KAAK,GAAiB;YAC1B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,EAAE,EAAE,oBAAoB;YAC/B,GAAG;YACH,IAAI;YACJ,GAAG;YACH,IAAI;SACL,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU,CAAC,GAAW,EAAE,QAAgB;QACtC,MAAM,KAAK,GAAe;YACxB,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,EAAE;YACT,GAAG;YACH,QAAQ;SACT,CAAC;QAEF,IAAI,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;CACF;AA7CD,wCA6CC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process Wrapper
|
|
3
|
+
* Wraps agent commands and captures comprehensive output
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from "events";
|
|
6
|
+
interface ProcessWrapperOptions {
|
|
7
|
+
cwd?: string;
|
|
8
|
+
env?: NodeJS.ProcessEnv;
|
|
9
|
+
shell?: boolean;
|
|
10
|
+
}
|
|
11
|
+
interface ProcessEvent {
|
|
12
|
+
command: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
cwd: string;
|
|
15
|
+
timestamp: number;
|
|
16
|
+
}
|
|
17
|
+
export declare class ProcessWrapper extends EventEmitter {
|
|
18
|
+
private workspacePath;
|
|
19
|
+
private child?;
|
|
20
|
+
private startTime?;
|
|
21
|
+
private outputPath;
|
|
22
|
+
private stdoutData;
|
|
23
|
+
private stderrData;
|
|
24
|
+
private commands;
|
|
25
|
+
constructor(workspacePath: string);
|
|
26
|
+
spawn(command: string, args?: string[], options?: ProcessWrapperOptions): Promise<number>;
|
|
27
|
+
kill(signal?: NodeJS.Signals): void;
|
|
28
|
+
private saveOutput;
|
|
29
|
+
getOutput(): {
|
|
30
|
+
stdout: string;
|
|
31
|
+
stderr: string;
|
|
32
|
+
commands: ProcessEvent[];
|
|
33
|
+
};
|
|
34
|
+
isRunning(): boolean;
|
|
35
|
+
}
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=process-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-wrapper.d.ts","sourceRoot":"","sources":["../../src/recorders/process-wrapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAItC,UAAU,qBAAqB;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,cAAe,SAAQ,YAAY;IAQlC,OAAO,CAAC,aAAa;IAPjC,OAAO,CAAC,KAAK,CAAC,CAAe;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAsB;gBAElB,aAAa,EAAE,MAAM;IAKnC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,EAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAwEvG,IAAI,CAAC,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,IAAI;YAIhC,UAAU;IAoBxB,SAAS,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,EAAE,CAAA;KAAE;IAQzE,SAAS,IAAI,OAAO;CAGrB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Process Wrapper
|
|
4
|
+
* Wraps agent commands and captures comprehensive output
|
|
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.ProcessWrapper = void 0;
|
|
41
|
+
const child_process_1 = require("child_process");
|
|
42
|
+
const events_1 = require("events");
|
|
43
|
+
const fs = __importStar(require("fs/promises"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
class ProcessWrapper extends events_1.EventEmitter {
|
|
46
|
+
workspacePath;
|
|
47
|
+
child;
|
|
48
|
+
startTime;
|
|
49
|
+
outputPath;
|
|
50
|
+
stdoutData = "";
|
|
51
|
+
stderrData = "";
|
|
52
|
+
commands = [];
|
|
53
|
+
constructor(workspacePath) {
|
|
54
|
+
super();
|
|
55
|
+
this.workspacePath = workspacePath;
|
|
56
|
+
this.outputPath = path.join(workspacePath, "output.log");
|
|
57
|
+
}
|
|
58
|
+
async spawn(command, args = [], options = {}) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
this.startTime = Date.now();
|
|
61
|
+
const cwd = options.cwd || process.cwd();
|
|
62
|
+
// Record the command
|
|
63
|
+
const event = {
|
|
64
|
+
command,
|
|
65
|
+
args,
|
|
66
|
+
cwd,
|
|
67
|
+
timestamp: this.startTime,
|
|
68
|
+
};
|
|
69
|
+
this.commands.push(event);
|
|
70
|
+
this.emit("spawn", event);
|
|
71
|
+
const spawnOptions = {
|
|
72
|
+
cwd,
|
|
73
|
+
env: { ...process.env, ...options.env, FORCE_COLOR: "1" },
|
|
74
|
+
shell: options.shell ?? true,
|
|
75
|
+
stdio: ["inherit", "pipe", "pipe"],
|
|
76
|
+
};
|
|
77
|
+
// Handle command with spaces
|
|
78
|
+
const finalCommand = command;
|
|
79
|
+
const finalArgs = args;
|
|
80
|
+
if (args.length === 0 && command.includes(" ")) {
|
|
81
|
+
spawnOptions.shell = true;
|
|
82
|
+
}
|
|
83
|
+
this.child = (0, child_process_1.spawn)(finalCommand, finalArgs, spawnOptions);
|
|
84
|
+
// Capture stdout
|
|
85
|
+
this.child.stdout?.on("data", (data) => {
|
|
86
|
+
const str = data.toString();
|
|
87
|
+
this.stdoutData += str;
|
|
88
|
+
this.emit("stdout", str);
|
|
89
|
+
process.stdout.write(str);
|
|
90
|
+
});
|
|
91
|
+
// Capture stderr
|
|
92
|
+
this.child.stderr?.on("data", (data) => {
|
|
93
|
+
const str = data.toString();
|
|
94
|
+
this.stderrData += str;
|
|
95
|
+
this.emit("stderr", str);
|
|
96
|
+
process.stderr.write(str);
|
|
97
|
+
});
|
|
98
|
+
// Handle exit
|
|
99
|
+
this.child.on("exit", async (code, signal) => {
|
|
100
|
+
const duration = Date.now() - this.startTime;
|
|
101
|
+
await this.saveOutput();
|
|
102
|
+
this.emit("exit", {
|
|
103
|
+
code: code ?? (signal ? 1 : 0),
|
|
104
|
+
signal,
|
|
105
|
+
duration,
|
|
106
|
+
stdout: this.stdoutData,
|
|
107
|
+
stderr: this.stderrData,
|
|
108
|
+
commands: this.commands,
|
|
109
|
+
});
|
|
110
|
+
resolve(code ?? (signal ? 1 : 0));
|
|
111
|
+
});
|
|
112
|
+
this.child.on("error", (err) => {
|
|
113
|
+
this.emit("error", err);
|
|
114
|
+
reject(err);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
kill(signal = "SIGTERM") {
|
|
119
|
+
this.child?.kill(signal);
|
|
120
|
+
}
|
|
121
|
+
async saveOutput() {
|
|
122
|
+
const output = [
|
|
123
|
+
"=== STDOUT ===",
|
|
124
|
+
this.stdoutData,
|
|
125
|
+
"",
|
|
126
|
+
"=== STDERR ===",
|
|
127
|
+
this.stderrData,
|
|
128
|
+
"",
|
|
129
|
+
"=== SUMMARY ===",
|
|
130
|
+
`Commands run: ${this.commands.length}`,
|
|
131
|
+
`Duration: ${this.startTime ? Date.now() - this.startTime : 0}ms`,
|
|
132
|
+
].join("\n");
|
|
133
|
+
try {
|
|
134
|
+
await fs.writeFile(this.outputPath, output);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
// Ignore write errors
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
getOutput() {
|
|
141
|
+
return {
|
|
142
|
+
stdout: this.stdoutData,
|
|
143
|
+
stderr: this.stderrData,
|
|
144
|
+
commands: this.commands,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
isRunning() {
|
|
148
|
+
return this.child ? !this.child.killed : false;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
exports.ProcessWrapper = ProcessWrapper;
|
|
152
|
+
//# sourceMappingURL=process-wrapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-wrapper.js","sourceRoot":"","sources":["../../src/recorders/process-wrapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secret Detector
|
|
3
|
+
* Detects access to sensitive files and locations
|
|
4
|
+
*/
|
|
5
|
+
export declare class SecretDetector {
|
|
6
|
+
/**
|
|
7
|
+
* Check if a path contains sensitive information
|
|
8
|
+
*/
|
|
9
|
+
isSecretPath(filePath: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Get the category of a secret
|
|
12
|
+
*/
|
|
13
|
+
getSecretCategory(filePath: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Detect high-entropy strings in text (potential secrets in output)
|
|
16
|
+
*/
|
|
17
|
+
detectHighEntropyStrings(text: string): string[];
|
|
18
|
+
/**
|
|
19
|
+
* Redact sensitive content from text
|
|
20
|
+
*/
|
|
21
|
+
redactIfSensitive(text: string): {
|
|
22
|
+
text: string;
|
|
23
|
+
redacted: boolean;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=secret-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secret-detector.d.ts","sourceRoot":"","sources":["../../src/recorders/secret-detector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA0CH,qBAAa,cAAc;IACzB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAqBvC;;OAEG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYlD;;OAEG;IACH,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAuBhD;;OAEG;IACH,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE;CAcrE"}
|