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,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":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Trailhound CLI
4
+ * Sniff out what your AI agent is doing
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=cli.d.ts.map
@@ -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
@@ -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"}