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,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"}