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,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenClaw Adapter
|
|
3
|
+
* Specific handling for OpenClaw sessions
|
|
4
|
+
*/
|
|
5
|
+
import { AgentEvent } from "../types/index.js";
|
|
6
|
+
export interface OpenClawSession {
|
|
7
|
+
sessionKey?: string;
|
|
8
|
+
taskId?: string;
|
|
9
|
+
parentAgent?: string;
|
|
10
|
+
childAgents: Array<{
|
|
11
|
+
agent: string;
|
|
12
|
+
taskId: string;
|
|
13
|
+
}>;
|
|
14
|
+
chatSource?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* OpenClaw can delegate to coding agents and has structured task metadata.
|
|
18
|
+
* We track:
|
|
19
|
+
* - Main OpenClaw session
|
|
20
|
+
* - Delegated coding-agent subprocesses
|
|
21
|
+
* - Chat source (Discord, Telegram, Signal, WebChat)
|
|
22
|
+
* - Cross-domain actions (repo + email + calendar)
|
|
23
|
+
*/
|
|
24
|
+
export declare class OpenClawAdapter {
|
|
25
|
+
private session;
|
|
26
|
+
private eventLog;
|
|
27
|
+
/**
|
|
28
|
+
* Parse OpenClaw output for session metadata
|
|
29
|
+
*/
|
|
30
|
+
parseOutput(line: string): AgentEvent | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get the delegation tree for reporting
|
|
33
|
+
*/
|
|
34
|
+
getDelegationTree(): OpenClawSession;
|
|
35
|
+
/**
|
|
36
|
+
* Get all logged events
|
|
37
|
+
*/
|
|
38
|
+
getEvents(): AgentEvent[];
|
|
39
|
+
/**
|
|
40
|
+
* Enrich metadata with OpenClaw-specific info
|
|
41
|
+
*/
|
|
42
|
+
enrichMetadata(metadata: Record<string, unknown>): Record<string, unknown>;
|
|
43
|
+
/**
|
|
44
|
+
* Format delegation tree for display
|
|
45
|
+
*/
|
|
46
|
+
formatTree(): string;
|
|
47
|
+
}
|
|
48
|
+
export default OpenClawAdapter;
|
|
49
|
+
//# sourceMappingURL=openclaw.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAEb;IACF,OAAO,CAAC,QAAQ,CAAoB;IAEpC;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAsH5C;;OAEG;IACH,iBAAiB,IAAI,eAAe;IAIpC;;OAEG;IACH,SAAS,IAAI,UAAU,EAAE;IAIzB;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAY1E;;OAEG;IACH,UAAU,IAAI,MAAM;CAqBrB;AAED,eAAe,eAAe,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* OpenClaw Adapter
|
|
4
|
+
* Specific handling for OpenClaw sessions
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.OpenClawAdapter = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* OpenClaw can delegate to coding agents and has structured task metadata.
|
|
10
|
+
* We track:
|
|
11
|
+
* - Main OpenClaw session
|
|
12
|
+
* - Delegated coding-agent subprocesses
|
|
13
|
+
* - Chat source (Discord, Telegram, Signal, WebChat)
|
|
14
|
+
* - Cross-domain actions (repo + email + calendar)
|
|
15
|
+
*/
|
|
16
|
+
class OpenClawAdapter {
|
|
17
|
+
session = {
|
|
18
|
+
childAgents: [],
|
|
19
|
+
};
|
|
20
|
+
eventLog = [];
|
|
21
|
+
/**
|
|
22
|
+
* Parse OpenClaw output for session metadata
|
|
23
|
+
*/
|
|
24
|
+
parseOutput(line) {
|
|
25
|
+
// Detect OpenClaw session start
|
|
26
|
+
const sessionMatch = line.match(/OpenClaw.*Session[:\s]+([a-zA-Z0-9-_]+)/i);
|
|
27
|
+
if (sessionMatch) {
|
|
28
|
+
this.session.sessionKey = sessionMatch[1];
|
|
29
|
+
return {
|
|
30
|
+
ts: new Date().toISOString(),
|
|
31
|
+
type: "session.start",
|
|
32
|
+
runId: "",
|
|
33
|
+
sessionId: sessionMatch[1],
|
|
34
|
+
agent: "openclaw",
|
|
35
|
+
source: "openclaw",
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
// Detect chat source
|
|
39
|
+
const chatSourceMatch = line.match(/Source:\s*(discord|telegram|signal|webchat|slack)/i);
|
|
40
|
+
if (chatSourceMatch) {
|
|
41
|
+
this.session.chatSource = chatSourceMatch[1].toLowerCase();
|
|
42
|
+
return {
|
|
43
|
+
ts: new Date().toISOString(),
|
|
44
|
+
type: "process.exec",
|
|
45
|
+
runId: "",
|
|
46
|
+
action: "chat-received",
|
|
47
|
+
platform: chatSourceMatch[1].toLowerCase(),
|
|
48
|
+
agent: "openclaw",
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
// Detect coding-agent delegation
|
|
52
|
+
const delegateMatch = line.match(/(coding-agent|coding_agent|code-agent|code_agent).*?using\s+(codex|claude|claude-code|opencode)/i);
|
|
53
|
+
if (delegateMatch) {
|
|
54
|
+
const subAgent = delegateMatch[2] || delegateMatch[1];
|
|
55
|
+
const delegatedTaskId = `openclaw-${Date.now()}`;
|
|
56
|
+
this.session.childAgents.push({
|
|
57
|
+
agent: subAgent.toLowerCase(),
|
|
58
|
+
taskId: delegatedTaskId,
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
ts: new Date().toISOString(),
|
|
62
|
+
type: "process.exec",
|
|
63
|
+
runId: "",
|
|
64
|
+
action: "delegate",
|
|
65
|
+
parentAgent: "openclaw",
|
|
66
|
+
childAgent: subAgent.toLowerCase(),
|
|
67
|
+
taskId: delegatedTaskId,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// Detect Pi planning
|
|
71
|
+
const piMatch = line.match(/Pi\s+(?:planned|planning|thinks|analyzing|selected plan)/i);
|
|
72
|
+
if (piMatch) {
|
|
73
|
+
return {
|
|
74
|
+
ts: new Date().toISOString(),
|
|
75
|
+
type: "process.exec",
|
|
76
|
+
runId: "",
|
|
77
|
+
toolName: "pi-plan",
|
|
78
|
+
agent: "pi",
|
|
79
|
+
parent: "openclaw",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// Detect tool calls
|
|
83
|
+
const toolCallMatch = line.match(/\[Tool:\s*(\w+)\]/i);
|
|
84
|
+
if (toolCallMatch) {
|
|
85
|
+
return {
|
|
86
|
+
ts: new Date().toISOString(),
|
|
87
|
+
type: "process.exec",
|
|
88
|
+
runId: "",
|
|
89
|
+
toolName: toolCallMatch[1],
|
|
90
|
+
agent: "openclaw",
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
// Detect web operations
|
|
94
|
+
const webMatch = line.match(/(web_search|browser_use|web_fetch|fetch_page)\s*[:-]?\s*(.+)?/i);
|
|
95
|
+
if (webMatch) {
|
|
96
|
+
return {
|
|
97
|
+
ts: new Date().toISOString(),
|
|
98
|
+
type: "network.http",
|
|
99
|
+
runId: "",
|
|
100
|
+
protocol: "https",
|
|
101
|
+
action: webMatch[1],
|
|
102
|
+
query: webMatch[2]?.trim(),
|
|
103
|
+
agent: "openclaw",
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
// Detect email/calendar operations
|
|
107
|
+
const crossDomainMatch = line.match(/(send_email|schedule_meeting|calendar_check|inbox_check)/i);
|
|
108
|
+
if (crossDomainMatch) {
|
|
109
|
+
return {
|
|
110
|
+
ts: new Date().toISOString(),
|
|
111
|
+
type: "process.exec",
|
|
112
|
+
runId: "",
|
|
113
|
+
action: crossDomainMatch[1],
|
|
114
|
+
crossDomain: true,
|
|
115
|
+
agent: "openclaw",
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Detect session end
|
|
119
|
+
const sessionEndMatch = line.match(/OpenClaw.*session.*(ended|complete|finished)/i);
|
|
120
|
+
if (sessionEndMatch) {
|
|
121
|
+
return {
|
|
122
|
+
ts: new Date().toISOString(),
|
|
123
|
+
type: "session.end",
|
|
124
|
+
runId: "",
|
|
125
|
+
sessionId: this.session.sessionKey,
|
|
126
|
+
agent: "openclaw",
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get the delegation tree for reporting
|
|
133
|
+
*/
|
|
134
|
+
getDelegationTree() {
|
|
135
|
+
return { ...this.session };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get all logged events
|
|
139
|
+
*/
|
|
140
|
+
getEvents() {
|
|
141
|
+
return [...this.eventLog];
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Enrich metadata with OpenClaw-specific info
|
|
145
|
+
*/
|
|
146
|
+
enrichMetadata(metadata) {
|
|
147
|
+
return {
|
|
148
|
+
...metadata,
|
|
149
|
+
openclaw: {
|
|
150
|
+
sessionKey: this.session.sessionKey,
|
|
151
|
+
chatSource: this.session.chatSource,
|
|
152
|
+
childAgents: this.session.childAgents,
|
|
153
|
+
delegationTree: this.session,
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Format delegation tree for display
|
|
159
|
+
*/
|
|
160
|
+
formatTree() {
|
|
161
|
+
const lines = [];
|
|
162
|
+
lines.push("OpenClaw Session");
|
|
163
|
+
if (this.session.chatSource) {
|
|
164
|
+
lines.push(` 📱 Source: ${this.session.chatSource}`);
|
|
165
|
+
}
|
|
166
|
+
if (this.session.sessionKey) {
|
|
167
|
+
lines.push(` 🔑 Session: ${this.session.sessionKey}`);
|
|
168
|
+
}
|
|
169
|
+
if (this.session.childAgents.length > 0) {
|
|
170
|
+
lines.push(" 🔄 Delegated to:");
|
|
171
|
+
for (const child of this.session.childAgents) {
|
|
172
|
+
lines.push(` - ${child.agent} (${child.taskId})`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return lines.join("\n");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.OpenClawAdapter = OpenClawAdapter;
|
|
179
|
+
exports.default = OpenClawAdapter;
|
|
180
|
+
//# sourceMappingURL=openclaw.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../src/adapters/openclaw.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAYH;;;;;;;GAOG;AACH,MAAa,eAAe;IAClB,OAAO,GAAoB;QACjC,WAAW,EAAE,EAAE;KAChB,CAAC;IACM,QAAQ,GAAiB,EAAE,CAAC;IAEpC;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,gCAAgC;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC5E,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,eAAe;gBACrB,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;gBAC1B,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,UAAU;aACnB,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACzF,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,eAAe;gBACvB,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;gBAC1C,KAAK,EAAE,UAAU;aAClB,CAAC;QACJ,CAAC;QAED,iCAAiC;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,kGAAkG,CAAC,CAAC;QACrI,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC;YACtD,MAAM,eAAe,GAAG,YAAY,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEjD,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,QAAQ,CAAC,WAAW,EAAE;gBAC7B,MAAM,EAAE,eAAe;aACxB,CAAC,CAAC;YAEH,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,UAAU;gBAClB,WAAW,EAAE,UAAU;gBACvB,UAAU,EAAE,QAAQ,CAAC,WAAW,EAAE;gBAClC,MAAM,EAAE,eAAe;aACxB,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACxF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,SAAS;gBACnB,KAAK,EAAE,IAAI;gBACX,MAAM,EAAE,UAAU;aACnB,CAAC;QACJ,CAAC;QAED,oBAAoB;QACpB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACvD,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;gBAC1B,KAAK,EAAE,UAAU;aAClB,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAC9F,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACnB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;gBAC1B,KAAK,EAAE,UAAU;aAClB,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QACjG,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,cAAc;gBACpB,KAAK,EAAE,EAAE;gBACT,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;gBAC3B,WAAW,EAAE,IAAI;gBACjB,KAAK,EAAE,UAAU;aAClB,CAAC;QACJ,CAAC;QAED,qBAAqB;QACrB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACpF,IAAI,eAAe,EAAE,CAAC;YACpB,OAAO;gBACL,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBAC5B,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,EAAE;gBACT,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBAClC,KAAK,EAAE,UAAU;aAClB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,QAAiC;QAC9C,OAAO;YACL,GAAG,QAAQ;YACX,QAAQ,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;gBACnC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;gBACrC,cAAc,EAAE,IAAI,CAAC,OAAO;aAC7B;SACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAE/B,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;gBAC7C,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YACvD,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AApLD,0CAoLC;AAED,kBAAe,eAAe,CAAC"}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;GAGG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Trailhound CLI
|
|
5
|
+
* Sniff out what your AI agent is doing
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
+
}) : function(o, v) {
|
|
21
|
+
o["default"] = v;
|
|
22
|
+
});
|
|
23
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
+
var ownKeys = function(o) {
|
|
25
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
+
var ar = [];
|
|
27
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
+
return ar;
|
|
29
|
+
};
|
|
30
|
+
return ownKeys(o);
|
|
31
|
+
};
|
|
32
|
+
return function (mod) {
|
|
33
|
+
if (mod && mod.__esModule) return mod;
|
|
34
|
+
var result = {};
|
|
35
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
+
__setModuleDefault(result, mod);
|
|
37
|
+
return result;
|
|
38
|
+
};
|
|
39
|
+
})();
|
|
40
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
41
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
42
|
+
};
|
|
43
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
44
|
+
const commander_1 = require("commander");
|
|
45
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
46
|
+
const fs = __importStar(require("fs/promises"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const trailhound_js_1 = require("./core/trailhound.js");
|
|
49
|
+
const run_store_js_1 = require("./core/run-store.js");
|
|
50
|
+
const report_generator_js_1 = require("./reports/report-generator.js");
|
|
51
|
+
const program = new commander_1.Command();
|
|
52
|
+
program
|
|
53
|
+
.name("trailhound")
|
|
54
|
+
.description("Sniff out what your AI agent is doing")
|
|
55
|
+
.version("0.1.0");
|
|
56
|
+
program
|
|
57
|
+
.command("run")
|
|
58
|
+
.description("Record an agent session")
|
|
59
|
+
.option("-n, --name <name>", "Assign a name to this run")
|
|
60
|
+
.option("-a, --agent <agent>", "Specify agent type (codex, claude, opencode, openclaw)")
|
|
61
|
+
.option("-m, --mode <mode>", "Recording mode (record, warn, enforce)", "record")
|
|
62
|
+
.argument("<command...>", "Agent command to run")
|
|
63
|
+
.action(async (args, options) => {
|
|
64
|
+
const agentCommand = args.join(" ").trim();
|
|
65
|
+
if (!agentCommand) {
|
|
66
|
+
console.error(chalk_1.default.red("Error: No agent command specified"));
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
console.log(chalk_1.default.blue("🐕 Trailhound"), "- Sniffing out agent behavior...\n");
|
|
70
|
+
const trailhound = new trailhound_js_1.Trailhound({
|
|
71
|
+
name: options.name,
|
|
72
|
+
agent: options.agent,
|
|
73
|
+
mode: options.mode,
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
const result = await trailhound.run(agentCommand);
|
|
77
|
+
console.log("\n" + chalk_1.default.green("✅ Recording complete!"));
|
|
78
|
+
console.log(chalk_1.default.gray(`Run ID: ${result.runId}`));
|
|
79
|
+
console.log(chalk_1.default.gray(`Duration: ${formatDuration(result.durationMs)}`));
|
|
80
|
+
console.log(chalk_1.default.gray(`View report: trailhound report ${result.runId}`));
|
|
81
|
+
if (result.warnings.length > 0) {
|
|
82
|
+
console.log("\n" + chalk_1.default.yellow("⚠️ Warnings:"));
|
|
83
|
+
result.warnings.forEach(w => console.log(chalk_1.default.yellow(` - ${w}`)));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
console.error(chalk_1.default.red("\n❌ Recording failed:"), error.message || error);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
program
|
|
92
|
+
.command("report")
|
|
93
|
+
.description("Generate a report from a recorded session")
|
|
94
|
+
.argument("[run-id]", "Run ID (defaults to latest)")
|
|
95
|
+
.option("--html", "Generate HTML report")
|
|
96
|
+
.option("--json", "Output as JSON")
|
|
97
|
+
.action(async (runId, options) => {
|
|
98
|
+
const store = new run_store_js_1.RunStore();
|
|
99
|
+
const targetRunId = runId || await getLatestRunId();
|
|
100
|
+
if (!targetRunId) {
|
|
101
|
+
console.error(chalk_1.default.red("No runs found. Run 'trailhound run' first."));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
const manifestPath = path.join(process.cwd(), ".trailhound", "runs", targetRunId, "manifest.json");
|
|
105
|
+
let manifest;
|
|
106
|
+
try {
|
|
107
|
+
const data = await fs.readFile(manifestPath, "utf-8");
|
|
108
|
+
manifest = JSON.parse(data);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error(chalk_1.default.red(`Run not found: ${targetRunId}`));
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
const generator = new report_generator_js_1.ReportGenerator(manifest);
|
|
115
|
+
if (options.json) {
|
|
116
|
+
console.log(JSON.stringify(manifest, null, 2));
|
|
117
|
+
}
|
|
118
|
+
else if (options.html) {
|
|
119
|
+
const htmlPath = await generator.generateHtml();
|
|
120
|
+
console.log(chalk_1.default.green(`HTML report: ${htmlPath}`));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const report = generator.generateMarkdown();
|
|
124
|
+
console.log(report);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
program
|
|
128
|
+
.command("list")
|
|
129
|
+
.description("List recorded sessions")
|
|
130
|
+
.option("--json", "Output as JSON")
|
|
131
|
+
.action(async (options) => {
|
|
132
|
+
const runs = await listRuns();
|
|
133
|
+
if (options.json) {
|
|
134
|
+
console.log(JSON.stringify(runs, null, 2));
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (runs.length === 0) {
|
|
138
|
+
console.log(chalk_1.default.gray("No recorded runs found."));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
console.log(chalk_1.default.bold("\nRecorded Sessions:\n"));
|
|
142
|
+
runs.forEach((run, i) => {
|
|
143
|
+
const indicator = i === 0 ? chalk_1.default.cyan("→ ") : " ";
|
|
144
|
+
const date = new Date(run.timestamp).toLocaleString();
|
|
145
|
+
const agentName = run.agent ? chalk_1.default.gray(`[${run.agent}]`) : "";
|
|
146
|
+
console.log(`${indicator}${chalk_1.default.white(run.id)} ${chalk_1.default.gray(date)} ${agentName}`);
|
|
147
|
+
if (run.name) {
|
|
148
|
+
console.log(` ${chalk_1.default.gray(run.name)}`);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
console.log();
|
|
152
|
+
});
|
|
153
|
+
program
|
|
154
|
+
.command("replay")
|
|
155
|
+
.description("Replay a recorded session")
|
|
156
|
+
.argument("<run-id>", "Run ID to replay")
|
|
157
|
+
.action(async (runId) => {
|
|
158
|
+
console.log(chalk_1.default.blue("Replaying session...") + chalk_1.default.gray(` (${runId})`));
|
|
159
|
+
console.log(chalk_1.default.gray("Replay feature coming soon!"));
|
|
160
|
+
});
|
|
161
|
+
program
|
|
162
|
+
.command("compare")
|
|
163
|
+
.description("Compare two recorded sessions")
|
|
164
|
+
.argument("<run-id-1>", "First run ID")
|
|
165
|
+
.argument("<run-id-2>", "Second run ID")
|
|
166
|
+
.action(async (runId1, runId2) => {
|
|
167
|
+
console.log(chalk_1.default.blue("Comparing sessions..."));
|
|
168
|
+
console.log(chalk_1.default.gray("Comparison feature coming soon!"));
|
|
169
|
+
});
|
|
170
|
+
async function getLatestRunId() {
|
|
171
|
+
try {
|
|
172
|
+
const runsPath = path.join(process.cwd(), ".trailhound", "runs");
|
|
173
|
+
const entries = await fs.readdir(runsPath);
|
|
174
|
+
const runs = entries
|
|
175
|
+
.filter(e => !e.startsWith("."))
|
|
176
|
+
.sort()
|
|
177
|
+
.reverse();
|
|
178
|
+
return runs[0] || null;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async function listRuns() {
|
|
185
|
+
try {
|
|
186
|
+
const runsPath = path.join(process.cwd(), ".trailhound", "runs");
|
|
187
|
+
const entries = await fs.readdir(runsPath);
|
|
188
|
+
const runs = [];
|
|
189
|
+
for (const entry of entries) {
|
|
190
|
+
if (entry.startsWith("."))
|
|
191
|
+
continue;
|
|
192
|
+
const manifestPath = path.join(runsPath, entry, "manifest.json");
|
|
193
|
+
try {
|
|
194
|
+
const data = await fs.readFile(manifestPath, "utf-8");
|
|
195
|
+
const manifest = JSON.parse(data);
|
|
196
|
+
runs.push({
|
|
197
|
+
id: manifest.run.id,
|
|
198
|
+
name: manifest.run.name,
|
|
199
|
+
timestamp: manifest.run.timestamp,
|
|
200
|
+
agent: manifest.agent.name,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// Skip invalid manifests
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return runs.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
return [];
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
function formatDuration(ms) {
|
|
214
|
+
const seconds = Math.floor(ms / 1000);
|
|
215
|
+
const minutes = Math.floor(seconds / 60);
|
|
216
|
+
const remainingSeconds = seconds % 60;
|
|
217
|
+
return minutes > 0
|
|
218
|
+
? `${minutes}m ${remainingSeconds}s`
|
|
219
|
+
: `${seconds}s`;
|
|
220
|
+
}
|
|
221
|
+
// Handle unhandled arguments
|
|
222
|
+
if (process.argv.length <= 2) {
|
|
223
|
+
program.help();
|
|
224
|
+
}
|
|
225
|
+
program.parse();
|
|
226
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run Store
|
|
3
|
+
* Manages storage and retrieval of run metadata
|
|
4
|
+
*
|
|
5
|
+
* Trailhound stores runs in .trailhound/runs/
|
|
6
|
+
*/
|
|
7
|
+
import { RunEntry, RunManifest } from "../types/index.js";
|
|
8
|
+
export declare class RunStore {
|
|
9
|
+
private runsPath;
|
|
10
|
+
constructor();
|
|
11
|
+
listRuns(): Promise<RunEntry[]>;
|
|
12
|
+
getLatestRunId(): string | null;
|
|
13
|
+
getRun(runId: string): RunManifest | null;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=run-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store.d.ts","sourceRoot":"","sources":["../../src/core/run-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE1D,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAS;;IAMnB,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA+BrC,cAAc,IAAI,MAAM,GAAG,IAAI;IAK/B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;CAI1C"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Run Store
|
|
4
|
+
* Manages storage and retrieval of run metadata
|
|
5
|
+
*
|
|
6
|
+
* Trailhound stores runs in .trailhound/runs/
|
|
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.RunStore = void 0;
|
|
43
|
+
const fs = __importStar(require("fs/promises"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
class RunStore {
|
|
46
|
+
runsPath;
|
|
47
|
+
constructor() {
|
|
48
|
+
this.runsPath = path.join(process.cwd(), ".trailhound", "runs");
|
|
49
|
+
}
|
|
50
|
+
async listRuns() {
|
|
51
|
+
try {
|
|
52
|
+
const entries = await fs.readdir(this.runsPath);
|
|
53
|
+
const runs = [];
|
|
54
|
+
for (const entry of entries) {
|
|
55
|
+
const manifestPath = path.join(this.runsPath, entry, "manifest.json");
|
|
56
|
+
try {
|
|
57
|
+
const manifestData = await fs.readFile(manifestPath, "utf-8");
|
|
58
|
+
const manifest = JSON.parse(manifestData);
|
|
59
|
+
runs.push({
|
|
60
|
+
id: manifest.run.id,
|
|
61
|
+
name: manifest.run.name,
|
|
62
|
+
timestamp: manifest.run.timestamp,
|
|
63
|
+
agent: manifest.agent.name,
|
|
64
|
+
summary: manifest.summary,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Skip entries without valid manifests
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Sort by timestamp descending
|
|
72
|
+
return runs.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
getLatestRunId() {
|
|
79
|
+
// This needs async, simplified for now
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
getRun(runId) {
|
|
83
|
+
// This needs async, simplified for now
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
exports.RunStore = RunStore;
|
|
88
|
+
//# sourceMappingURL=run-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-store.js","sourceRoot":"","sources":["../../src/core/run-store.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAClC,2CAA6B;AAG7B,MAAa,QAAQ;IACX,QAAQ,CAAS;IAEzB;QACE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,IAAI,GAAe,EAAE,CAAC;YAE5B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;gBACtE,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;oBAC9D,MAAM,QAAQ,GAAgB,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;oBACvD,IAAI,CAAC,IAAI,CAAC;wBACR,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE;wBACnB,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI;wBACvB,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS;wBACjC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;wBAC1B,OAAO,EAAE,QAAQ,CAAC,OAAO;qBAC1B,CAAC,CAAC;gBACL,CAAC;gBAAC,MAAM,CAAC;oBACP,uCAAuC;gBACzC,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACxB,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAClE,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,cAAc;QACZ,uCAAuC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,uCAAuC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AA/CD,4BA+CC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace Writer
|
|
3
|
+
* Manages writing events to the trace store
|
|
4
|
+
*
|
|
5
|
+
* Trailhound uses .trailhound/ directory for all traces
|
|
6
|
+
*/
|
|
7
|
+
import { AgentEvent, RunManifest } from "../types/index.js";
|
|
8
|
+
export declare class TraceWriter {
|
|
9
|
+
private workspacePath;
|
|
10
|
+
private eventsPath;
|
|
11
|
+
private manifestPath;
|
|
12
|
+
private writeQueue;
|
|
13
|
+
private flushInterval?;
|
|
14
|
+
private closed;
|
|
15
|
+
constructor(workspacePath: string);
|
|
16
|
+
initialize(): Promise<void>;
|
|
17
|
+
writeEvent(event: AgentEvent): Promise<void>;
|
|
18
|
+
writeManifest(manifest: RunManifest): Promise<void>;
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
private flush;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=trace-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-writer.d.ts","sourceRoot":"","sources":["../../src/core/trace-writer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE5D,qBAAa,WAAW;IAOV,OAAO,CAAC,aAAa;IANjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,aAAa,CAAC,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAS;gBAEH,aAAa,EAAE,MAAM;IAKnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,aAAa,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAWd,KAAK;CAYpB"}
|