agent-recorder 0.0.1 → 0.0.8
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/package.json +2 -2
- package/vendor/node_modules/@agent-recorder/core/db/migrations.d.ts +2 -2
- package/vendor/node_modules/@agent-recorder/core/db/migrations.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/migrations.js +14 -6
- package/vendor/node_modules/@agent-recorder/core/db/migrations.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics 2.js +0 -205
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.d 2.ts +0 -50
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test 2.js +0 -253
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure 2.js +0 -144
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.d 2.ts +0 -17
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/configure.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/diagnose 2.js +0 -141
- package/vendor/node_modules/@agent-recorder/cli/commands/diagnose.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/cli/commands/diagnose.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/diagnose.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor 2.js +0 -253
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/doctor.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/export 2.js +0 -56
- package/vendor/node_modules/@agent-recorder/cli/commands/export.d 2.ts +0 -12
- package/vendor/node_modules/@agent-recorder/cli/commands/export.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/export.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/install 2.js +0 -77
- package/vendor/node_modules/@agent-recorder/cli/commands/install.d 2.ts +0 -13
- package/vendor/node_modules/@agent-recorder/cli/commands/install.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/install.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/logs 2.js +0 -40
- package/vendor/node_modules/@agent-recorder/cli/commands/logs.d 2.ts +0 -8
- package/vendor/node_modules/@agent-recorder/cli/commands/logs.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/logs.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/mock-mcp 2.js +0 -188
- package/vendor/node_modules/@agent-recorder/cli/commands/mock-mcp.d 2.ts +0 -10
- package/vendor/node_modules/@agent-recorder/cli/commands/mock-mcp.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/mock-mcp.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/restart 2.js +0 -67
- package/vendor/node_modules/@agent-recorder/cli/commands/restart.d 2.ts +0 -9
- package/vendor/node_modules/@agent-recorder/cli/commands/restart.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/restart.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/sessions 2.js +0 -333
- package/vendor/node_modules/@agent-recorder/cli/commands/sessions.d 2.ts +0 -52
- package/vendor/node_modules/@agent-recorder/cli/commands/sessions.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/start 2.js +0 -174
- package/vendor/node_modules/@agent-recorder/cli/commands/start.d 2.ts +0 -10
- package/vendor/node_modules/@agent-recorder/cli/commands/start.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/start.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/status 2.js +0 -104
- package/vendor/node_modules/@agent-recorder/cli/commands/status.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/cli/commands/status.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/status.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/stop 2.js +0 -89
- package/vendor/node_modules/@agent-recorder/cli/commands/stop.d 2.ts +0 -8
- package/vendor/node_modules/@agent-recorder/cli/commands/stop.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/stop.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/tui 2.js +0 -14
- package/vendor/node_modules/@agent-recorder/cli/commands/tui.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/cli/commands/tui.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/tui.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths 2.js +0 -117
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d 2.ts +0 -55
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test 2.js +0 -152
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/index 2.js +0 -194
- package/vendor/node_modules/@agent-recorder/cli/index.d 2.ts +0 -10
- package/vendor/node_modules/@agent-recorder/cli/index.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/package 2.json +0 -17
- package/vendor/node_modules/@agent-recorder/cli/tui/App 2.js +0 -84
- package/vendor/node_modules/@agent-recorder/cli/tui/App.d 2.ts +0 -6
- package/vendor/node_modules/@agent-recorder/cli/tui/App.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/App.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/api 2.js +0 -105
- package/vendor/node_modules/@agent-recorder/cli/tui/api.d 2.ts +0 -31
- package/vendor/node_modules/@agent-recorder/cli/tui/api.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/api.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel 2.js +0 -45
- package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.d 2.ts +0 -11
- package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Header 2.js +0 -13
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Header.d 2.ts +0 -17
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Header.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Header.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Spinner 2.js +0 -21
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Spinner.d 2.ts +0 -12
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Spinner.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Spinner.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/StatusBadge 2.js +0 -50
- package/vendor/node_modules/@agent-recorder/cli/tui/components/StatusBadge.d 2.ts +0 -16
- package/vendor/node_modules/@agent-recorder/cli/tui/components/StatusBadge.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/StatusBadge.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Table 2.js +0 -20
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Table.d 2.ts +0 -21
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Table.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/Table.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/index 2.js +0 -8
- package/vendor/node_modules/@agent-recorder/cli/tui/components/index.d 2.ts +0 -8
- package/vendor/node_modules/@agent-recorder/cli/tui/components/index.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/components/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/hooks/useEventStream 2.js +0 -75
- package/vendor/node_modules/@agent-recorder/cli/tui/hooks/useEventStream.d 2.ts +0 -22
- package/vendor/node_modules/@agent-recorder/cli/tui/hooks/useEventStream.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/hooks/useEventStream.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionDetailScreen 2.js +0 -190
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionDetailScreen.d 2.ts +0 -13
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionDetailScreen.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionDetailScreen.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionsScreen 2.js +0 -166
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionsScreen.d 2.ts +0 -10
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionsScreen.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/SessionsScreen.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/index 2.js +0 -6
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/index.d 2.ts +0 -6
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/index.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/cli/tui/screens/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/config 2.js +0 -44
- package/vendor/node_modules/@agent-recorder/core/config.d 2.ts +0 -25
- package/vendor/node_modules/@agent-recorder/core/config.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/db/connection.d 2.ts +0 -15
- package/vendor/node_modules/@agent-recorder/core/migrations/001_initial 2.sql +0 -40
- package/vendor/node_modules/@agent-recorder/core/migrations/002_session_sequences 2.sql +0 -8
- package/vendor/node_modules/@agent-recorder/core/migrations/003_add_tool_columns 2.sql +0 -9
- package/vendor/node_modules/@agent-recorder/core/migrations/004_add_cancelled_status 2.sql +0 -23
- package/vendor/node_modules/@agent-recorder/core/migrations/005_add_error_category 2.sql +0 -6
- package/vendor/node_modules/@agent-recorder/core/package 2.json +0 -18
- package/vendor/node_modules/@agent-recorder/core/types/events.d 2.ts +0 -69
- package/vendor/node_modules/@agent-recorder/core/types/index 2.js +0 -2
- package/vendor/node_modules/@agent-recorder/core/types/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/types/session 2.js +0 -6
- package/vendor/node_modules/@agent-recorder/core/types/session.d 2.ts +0 -22
- package/vendor/node_modules/@agent-recorder/core/types/session.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/types/session.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/error-category 2.js +0 -58
- package/vendor/node_modules/@agent-recorder/core/utils/error-category.d 2.ts +0 -22
- package/vendor/node_modules/@agent-recorder/core/utils/error-category.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/error-category.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/error-category.test.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/core/utils/error-category.test.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/error-category.test.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/index 2.js +0 -6
- package/vendor/node_modules/@agent-recorder/core/utils/index.d 2.ts +0 -6
- package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/redact.d 2.ts +0 -19
- package/vendor/node_modules/@agent-recorder/core/utils/redact.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/utils/redact.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/index 2.js +0 -128
- package/vendor/node_modules/@agent-recorder/service/index.d 2.ts +0 -36
- package/vendor/node_modules/@agent-recorder/service/index.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/index 2.js +0 -7
- package/vendor/node_modules/@agent-recorder/service/mcp/index.d 2.ts +0 -7
- package/vendor/node_modules/@agent-recorder/service/mcp/index.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/index.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy 2.js +0 -223
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d 2.ts +0 -26
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.test.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.test.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.test.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/recorder 2.js +0 -62
- package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d 2.ts +0 -31
- package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/types 2.js +0 -15
- package/vendor/node_modules/@agent-recorder/service/mcp/types.d 2.ts +0 -40
- package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/types.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/package 2.json +0 -15
- package/vendor/node_modules/@agent-recorder/service/routes/events 2.js +0 -71
- package/vendor/node_modules/@agent-recorder/service/routes/events.d 2.ts +0 -11
- package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/routes/events.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/routes/health 2.js +0 -18
- package/vendor/node_modules/@agent-recorder/service/routes/health.d 2.ts +0 -6
- package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/routes/health.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/routes/sessions 2.js +0 -80
- package/vendor/node_modules/@agent-recorder/service/routes/sessions.d 2.ts +0 -12
- package/vendor/node_modules/@agent-recorder/service/routes/sessions.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/routes/sessions.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/server 2.js +0 -36
- package/vendor/node_modules/@agent-recorder/service/server.d 2.ts +0 -19
- package/vendor/node_modules/@agent-recorder/service/server.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/server.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/server.test 2.js +0 -296
- package/vendor/node_modules/@agent-recorder/service/server.test.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/service/server.test.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/session-manager 2.js +0 -22
- package/vendor/node_modules/@agent-recorder/service/session-manager.d 2.ts +0 -16
- package/vendor/node_modules/@agent-recorder/service/session-manager.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/session-manager.js 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/session-manager.test 2.js +0 -61
- package/vendor/node_modules/@agent-recorder/service/session-manager.test.d 2.ts +0 -5
- package/vendor/node_modules/@agent-recorder/service/session-manager.test.d.ts 2.map +0 -1
- package/vendor/node_modules/@agent-recorder/service/session-manager.test.js 2.map +0 -1
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sessions commands - list, show, current, tail, view, stats, grep, summarize.
|
|
3
|
-
*/
|
|
4
|
-
import { loadConfig } from "@agent-recorder/core";
|
|
5
|
-
import { computeSessionSummary, formatStatsText, formatConciseSummary, } from "../analytics/session-analytics.js";
|
|
6
|
-
async function fetchJson(url) {
|
|
7
|
-
const response = await fetch(url);
|
|
8
|
-
if (!response.ok) {
|
|
9
|
-
throw new Error(`HTTP ${response.status}`);
|
|
10
|
-
}
|
|
11
|
-
return response.json();
|
|
12
|
-
}
|
|
13
|
-
async function getEventCount(baseUrl, sessionId) {
|
|
14
|
-
try {
|
|
15
|
-
const result = await fetchJson(`${baseUrl}/api/sessions/${sessionId}/events/count`);
|
|
16
|
-
return result.count;
|
|
17
|
-
}
|
|
18
|
-
catch {
|
|
19
|
-
return 0;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
function formatTable(sessions) {
|
|
23
|
-
if (sessions.length === 0) {
|
|
24
|
-
console.log("No sessions found.");
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
// Header
|
|
28
|
-
console.log("ID".padEnd(38) + "STATUS".padEnd(12) + "STARTED".padEnd(25) + "EVENTS");
|
|
29
|
-
console.log("-".repeat(80));
|
|
30
|
-
// Rows
|
|
31
|
-
for (const session of sessions) {
|
|
32
|
-
const id = session.id.padEnd(38);
|
|
33
|
-
const status = session.status.padEnd(12);
|
|
34
|
-
const started = session.startedAt.padEnd(25);
|
|
35
|
-
const events = String(session.eventCount);
|
|
36
|
-
console.log(`${id}${status}${started}${events}`);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
export async function sessionsListCommand(options) {
|
|
40
|
-
const config = loadConfig();
|
|
41
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
42
|
-
try {
|
|
43
|
-
// Fetch sessions
|
|
44
|
-
let url = `${baseUrl}/api/sessions`;
|
|
45
|
-
if (options.status) {
|
|
46
|
-
url += `?status=${options.status}`;
|
|
47
|
-
}
|
|
48
|
-
const sessions = await fetchJson(url);
|
|
49
|
-
// Fetch event counts for each session
|
|
50
|
-
const sessionsWithCounts = await Promise.all(sessions.map(async (session) => ({
|
|
51
|
-
...session,
|
|
52
|
-
eventCount: await getEventCount(baseUrl, session.id),
|
|
53
|
-
})));
|
|
54
|
-
formatTable(sessionsWithCounts);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
console.error("Failed to fetch sessions. Is the daemon running?");
|
|
58
|
-
process.exit(1);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
export async function sessionsShowCommand(id) {
|
|
62
|
-
const config = loadConfig();
|
|
63
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
64
|
-
try {
|
|
65
|
-
// Fetch session details
|
|
66
|
-
const session = await fetchJson(`${baseUrl}/api/sessions/${id}`);
|
|
67
|
-
// Fetch event count
|
|
68
|
-
const eventCount = await getEventCount(baseUrl, id);
|
|
69
|
-
console.log("Session Details");
|
|
70
|
-
console.log("===============");
|
|
71
|
-
console.log(`ID: ${session.id}`);
|
|
72
|
-
console.log(`Status: ${session.status}`);
|
|
73
|
-
console.log(`Started: ${session.startedAt}`);
|
|
74
|
-
console.log(`Ended: ${session.endedAt ?? "N/A"}`);
|
|
75
|
-
console.log(`Events: ${eventCount}`);
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
console.error(`Session not found: ${id}`);
|
|
79
|
-
process.exit(1);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Get the current active session ID.
|
|
84
|
-
*/
|
|
85
|
-
export async function sessionsCurrentCommand() {
|
|
86
|
-
const config = loadConfig();
|
|
87
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
88
|
-
try {
|
|
89
|
-
const current = await fetchJson(`${baseUrl}/api/sessions/current`);
|
|
90
|
-
console.log(current.id);
|
|
91
|
-
}
|
|
92
|
-
catch {
|
|
93
|
-
console.error("No active session (daemon may not be running)");
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Format and print a single event for tail output.
|
|
99
|
-
*/
|
|
100
|
-
function printEvent(event) {
|
|
101
|
-
const duration = event.endedAt && event.startedAt
|
|
102
|
-
? new Date(event.endedAt).getTime() - new Date(event.startedAt).getTime()
|
|
103
|
-
: null;
|
|
104
|
-
const durationStr = duration !== null ? `${duration}ms` : "...";
|
|
105
|
-
const name = event.toolName ?? event.skillName ?? "-";
|
|
106
|
-
console.log(`[${event.sequence}] ${event.eventType} ${name} ${event.status} ${durationStr}`);
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Tail session events (like tail -f).
|
|
110
|
-
* Runs indefinitely until Ctrl+C.
|
|
111
|
-
*/
|
|
112
|
-
export async function sessionsTailCommand(id, options) {
|
|
113
|
-
const config = loadConfig();
|
|
114
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
115
|
-
const intervalMs = parseInt(options.interval ?? "1000", 10);
|
|
116
|
-
const initialLimit = parseInt(options.n ?? "50", 10);
|
|
117
|
-
let lastSequence = 0;
|
|
118
|
-
console.log(`Tailing session ${id} (Ctrl+C to stop)...\n`);
|
|
119
|
-
/**
|
|
120
|
-
* Fetch events after lastSequence.
|
|
121
|
-
* For initial fetch, we get last N events by fetching all and slicing.
|
|
122
|
-
*/
|
|
123
|
-
const fetchEvents = async (after, limit) => {
|
|
124
|
-
const url = `${baseUrl}/api/sessions/${id}/events?after=${after}&limit=${limit}`;
|
|
125
|
-
try {
|
|
126
|
-
return await fetchJson(url);
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return [];
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
// Initial fetch: get last N events
|
|
133
|
-
const initialEvents = await fetchEvents(0, 1000); // Get up to 1000 events
|
|
134
|
-
const startIndex = Math.max(0, initialEvents.length - initialLimit);
|
|
135
|
-
const recentEvents = initialEvents.slice(startIndex);
|
|
136
|
-
for (const event of recentEvents) {
|
|
137
|
-
printEvent(event);
|
|
138
|
-
lastSequence = Math.max(lastSequence, event.sequence);
|
|
139
|
-
}
|
|
140
|
-
// Poll for new events
|
|
141
|
-
const poll = async () => {
|
|
142
|
-
const events = await fetchEvents(lastSequence, 200);
|
|
143
|
-
for (const event of events) {
|
|
144
|
-
printEvent(event);
|
|
145
|
-
lastSequence = Math.max(lastSequence, event.sequence);
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
const timer = setInterval(poll, intervalMs);
|
|
149
|
-
// Handle Ctrl+C
|
|
150
|
-
process.on("SIGINT", () => {
|
|
151
|
-
clearInterval(timer);
|
|
152
|
-
console.log("\nStopped tailing.");
|
|
153
|
-
process.exit(0);
|
|
154
|
-
});
|
|
155
|
-
// Keep process alive
|
|
156
|
-
await new Promise(() => {
|
|
157
|
-
// Never resolves - runs until SIGINT
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Print a detailed event row for view/grep output.
|
|
162
|
-
*/
|
|
163
|
-
function printEventDetailed(event) {
|
|
164
|
-
const duration = event.endedAt && event.startedAt
|
|
165
|
-
? new Date(event.endedAt).getTime() - new Date(event.startedAt).getTime()
|
|
166
|
-
: null;
|
|
167
|
-
const durationStr = duration !== null ? `${duration}ms` : "...";
|
|
168
|
-
const name = event.toolName ?? event.skillName ?? "-";
|
|
169
|
-
const errorInfo = event.errorCategory ? ` [${event.errorCategory}]` : "";
|
|
170
|
-
console.log(`[${String(event.sequence).padStart(4)}] ${event.eventType.padEnd(12)} ${name.padEnd(30)} ${event.status.padEnd(8)} ${durationStr.padEnd(10)}${errorInfo}`);
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* View session events with optional tail and follow mode.
|
|
174
|
-
*/
|
|
175
|
-
export async function sessionsViewCommand(id, options) {
|
|
176
|
-
const config = loadConfig();
|
|
177
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
178
|
-
const tailCount = options.tail ? parseInt(options.tail, 10) : 200;
|
|
179
|
-
const intervalMs = parseInt(options.interval ?? "1000", 10);
|
|
180
|
-
try {
|
|
181
|
-
// Fetch session info
|
|
182
|
-
const session = await fetchJson(`${baseUrl}/api/sessions/${id}`);
|
|
183
|
-
// Fetch all events
|
|
184
|
-
const events = await fetchJson(`${baseUrl}/api/sessions/${id}/events`);
|
|
185
|
-
// Compute summary for header
|
|
186
|
-
const summary = computeSessionSummary(events);
|
|
187
|
-
// Print header
|
|
188
|
-
console.log("Session View");
|
|
189
|
-
console.log("=".repeat(80));
|
|
190
|
-
console.log(`ID: ${session.id}`);
|
|
191
|
-
console.log(`Status: ${session.status}`);
|
|
192
|
-
console.log(`Started: ${session.startedAt}`);
|
|
193
|
-
console.log(`Ended: ${session.endedAt ?? "N/A"}`);
|
|
194
|
-
console.log("");
|
|
195
|
-
console.log(`Events: ${summary.totalEvents} | Success: ${summary.successCount} | Error: ${summary.errorCount} | Timeout: ${summary.timeoutCount}`);
|
|
196
|
-
console.log(`Top Tools: ${summary.topTools.map((t) => `${t.name}(${t.count})`).join(", ") || "none"}`);
|
|
197
|
-
console.log("=".repeat(80));
|
|
198
|
-
console.log("");
|
|
199
|
-
// Print column header
|
|
200
|
-
console.log(`${"SEQ".padStart(6)} ${"TYPE".padEnd(12)} ${"NAME".padEnd(30)} ${"STATUS".padEnd(8)} ${"DURATION".padEnd(10)} ERROR`);
|
|
201
|
-
console.log("-".repeat(80));
|
|
202
|
-
// Show tail events
|
|
203
|
-
const startIndex = Math.max(0, events.length - tailCount);
|
|
204
|
-
const displayEvents = events.slice(startIndex);
|
|
205
|
-
for (const event of displayEvents) {
|
|
206
|
-
printEventDetailed(event);
|
|
207
|
-
}
|
|
208
|
-
// If follow mode, poll for new events
|
|
209
|
-
if (options.follow) {
|
|
210
|
-
let lastSequence = events.length > 0 ? events[events.length - 1].sequence : 0;
|
|
211
|
-
console.log("\n-- Following new events (Ctrl+C to stop) --\n");
|
|
212
|
-
const poll = async () => {
|
|
213
|
-
try {
|
|
214
|
-
const newEvents = await fetchJson(`${baseUrl}/api/sessions/${id}/events?after=${lastSequence}&limit=200`);
|
|
215
|
-
for (const event of newEvents) {
|
|
216
|
-
printEventDetailed(event);
|
|
217
|
-
lastSequence = Math.max(lastSequence, event.sequence);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
catch {
|
|
221
|
-
// Silently ignore polling errors
|
|
222
|
-
}
|
|
223
|
-
};
|
|
224
|
-
const timer = setInterval(poll, intervalMs);
|
|
225
|
-
process.on("SIGINT", () => {
|
|
226
|
-
clearInterval(timer);
|
|
227
|
-
console.log("\nStopped following.");
|
|
228
|
-
process.exit(0);
|
|
229
|
-
});
|
|
230
|
-
await new Promise(() => { });
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
catch {
|
|
234
|
-
console.error(`Failed to view session: ${id}`);
|
|
235
|
-
process.exit(1);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
/**
|
|
239
|
-
* Show session statistics.
|
|
240
|
-
*/
|
|
241
|
-
export async function sessionsStatsCommand(id) {
|
|
242
|
-
const config = loadConfig();
|
|
243
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
244
|
-
try {
|
|
245
|
-
const events = await fetchJson(`${baseUrl}/api/sessions/${id}/events`);
|
|
246
|
-
if (events.length === 0) {
|
|
247
|
-
console.log("No events in this session.");
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
const summary = computeSessionSummary(events);
|
|
251
|
-
console.log(formatStatsText(summary));
|
|
252
|
-
}
|
|
253
|
-
catch {
|
|
254
|
-
console.error(`Failed to get stats for session: ${id}`);
|
|
255
|
-
process.exit(1);
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Search/filter session events.
|
|
260
|
-
*/
|
|
261
|
-
export async function sessionsGrepCommand(id, options) {
|
|
262
|
-
const config = loadConfig();
|
|
263
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
264
|
-
try {
|
|
265
|
-
// Fetch all events
|
|
266
|
-
const events = await fetchJson(`${baseUrl}/api/sessions/${id}/events`);
|
|
267
|
-
// Filter client-side (per spec: no new REST endpoints for grep)
|
|
268
|
-
let filtered = events;
|
|
269
|
-
if (options.tool) {
|
|
270
|
-
filtered = filtered.filter((e) => e.toolName === options.tool);
|
|
271
|
-
}
|
|
272
|
-
if (options.status) {
|
|
273
|
-
filtered = filtered.filter((e) => e.status === options.status);
|
|
274
|
-
}
|
|
275
|
-
if (options.error) {
|
|
276
|
-
filtered = filtered.filter((e) => e.errorCategory === options.error);
|
|
277
|
-
}
|
|
278
|
-
if (options.sinceSeq) {
|
|
279
|
-
const sinceSeq = parseInt(options.sinceSeq, 10);
|
|
280
|
-
filtered = filtered.filter((e) => e.sequence > sinceSeq);
|
|
281
|
-
}
|
|
282
|
-
if (options.json) {
|
|
283
|
-
console.log(JSON.stringify(filtered, null, 2));
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
if (filtered.length === 0) {
|
|
287
|
-
console.log("No matching events found.");
|
|
288
|
-
return;
|
|
289
|
-
}
|
|
290
|
-
// Print header
|
|
291
|
-
console.log(`${"SEQ".padStart(6)} ${"TYPE".padEnd(12)} ${"NAME".padEnd(30)} ${"STATUS".padEnd(8)} ${"DURATION".padEnd(10)} ERROR`);
|
|
292
|
-
console.log("-".repeat(80));
|
|
293
|
-
for (const event of filtered) {
|
|
294
|
-
printEventDetailed(event);
|
|
295
|
-
}
|
|
296
|
-
console.log("");
|
|
297
|
-
console.log(`Found ${filtered.length} matching event(s).`);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
catch {
|
|
301
|
-
console.error(`Failed to search session: ${id}`);
|
|
302
|
-
process.exit(1);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
/**
|
|
306
|
-
* Summarize session with safe metadata-only summary.
|
|
307
|
-
*/
|
|
308
|
-
export async function sessionsSummarizeCommand(id, options) {
|
|
309
|
-
const config = loadConfig();
|
|
310
|
-
const baseUrl = `http://127.0.0.1:${config.listenPort}`;
|
|
311
|
-
const format = options.format ?? "text";
|
|
312
|
-
try {
|
|
313
|
-
const session = await fetchJson(`${baseUrl}/api/sessions/${id}`);
|
|
314
|
-
const events = await fetchJson(`${baseUrl}/api/sessions/${id}/events`);
|
|
315
|
-
const summary = computeSessionSummary(events);
|
|
316
|
-
if (format === "json") {
|
|
317
|
-
console.log(JSON.stringify({ session, summary }, null, 2));
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
console.log(`Session: ${session.id}`);
|
|
321
|
-
console.log(`Status: ${session.status}`);
|
|
322
|
-
console.log(`Started: ${session.startedAt}`);
|
|
323
|
-
console.log(`Ended: ${session.endedAt ?? "N/A"}`);
|
|
324
|
-
console.log("");
|
|
325
|
-
console.log(formatConciseSummary(events, summary));
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
catch {
|
|
329
|
-
console.error(`Failed to summarize session: ${id}`);
|
|
330
|
-
process.exit(1);
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
//# sourceMappingURL=sessions.js.map
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sessions commands - list, show, current, tail, view, stats, grep, summarize.
|
|
3
|
-
*/
|
|
4
|
-
export declare function sessionsListCommand(options: {
|
|
5
|
-
status?: string;
|
|
6
|
-
}): Promise<void>;
|
|
7
|
-
export declare function sessionsShowCommand(id: string): Promise<void>;
|
|
8
|
-
/**
|
|
9
|
-
* Get the current active session ID.
|
|
10
|
-
*/
|
|
11
|
-
export declare function sessionsCurrentCommand(): Promise<void>;
|
|
12
|
-
export interface SessionsTailOptions {
|
|
13
|
-
interval?: string;
|
|
14
|
-
n?: string;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Tail session events (like tail -f).
|
|
18
|
-
* Runs indefinitely until Ctrl+C.
|
|
19
|
-
*/
|
|
20
|
-
export declare function sessionsTailCommand(id: string, options: SessionsTailOptions): Promise<void>;
|
|
21
|
-
export interface SessionsViewOptions {
|
|
22
|
-
tail?: string;
|
|
23
|
-
follow?: boolean;
|
|
24
|
-
interval?: string;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* View session events with optional tail and follow mode.
|
|
28
|
-
*/
|
|
29
|
-
export declare function sessionsViewCommand(id: string, options: SessionsViewOptions): Promise<void>;
|
|
30
|
-
/**
|
|
31
|
-
* Show session statistics.
|
|
32
|
-
*/
|
|
33
|
-
export declare function sessionsStatsCommand(id: string): Promise<void>;
|
|
34
|
-
export interface SessionsGrepOptions {
|
|
35
|
-
tool?: string;
|
|
36
|
-
status?: string;
|
|
37
|
-
error?: string;
|
|
38
|
-
sinceSeq?: string;
|
|
39
|
-
json?: boolean;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Search/filter session events.
|
|
43
|
-
*/
|
|
44
|
-
export declare function sessionsGrepCommand(id: string, options: SessionsGrepOptions): Promise<void>;
|
|
45
|
-
export interface SessionsSummarizeOptions {
|
|
46
|
-
format?: string;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Summarize session with safe metadata-only summary.
|
|
50
|
-
*/
|
|
51
|
-
export declare function sessionsSummarizeCommand(id: string, options: SessionsSummarizeOptions): Promise<void>;
|
|
52
|
-
//# sourceMappingURL=sessions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyDH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BhB;AAED,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBnE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAe5D;AAiBD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA0Df;AAmBD,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoFf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBpE;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoDf;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/commands/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Start command - runs the daemon in foreground or background.
|
|
3
|
-
*/
|
|
4
|
-
import { existsSync, readFileSync, openSync, constants } from "node:fs";
|
|
5
|
-
import { spawn } from "node:child_process";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { dirname, join } from "node:path";
|
|
8
|
-
import { loadConfig, getDaemonPaths, acquireLockWithCleanup, isProcessRunning, readPidFile, } from "@agent-recorder/core";
|
|
9
|
-
import { startDaemon } from "@agent-recorder/service";
|
|
10
|
-
/**
|
|
11
|
-
* Load environment variables from a file.
|
|
12
|
-
* Parses KEY=VALUE lines, ignoring comments and empty lines.
|
|
13
|
-
*/
|
|
14
|
-
function loadEnvFile(filePath) {
|
|
15
|
-
if (!existsSync(filePath)) {
|
|
16
|
-
console.error(`Env file not found: ${filePath}`);
|
|
17
|
-
process.exit(1);
|
|
18
|
-
}
|
|
19
|
-
const content = readFileSync(filePath, "utf-8");
|
|
20
|
-
const lines = content.split("\n");
|
|
21
|
-
for (const line of lines) {
|
|
22
|
-
const trimmed = line.trim();
|
|
23
|
-
// Skip empty lines and comments
|
|
24
|
-
if (!trimmed || trimmed.startsWith("#")) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
const eqIndex = trimmed.indexOf("=");
|
|
28
|
-
if (eqIndex > 0) {
|
|
29
|
-
const key = trimmed.slice(0, eqIndex).trim();
|
|
30
|
-
let value = trimmed.slice(eqIndex + 1).trim();
|
|
31
|
-
// Remove surrounding quotes if present
|
|
32
|
-
if ((value.startsWith('"') && value.endsWith('"')) ||
|
|
33
|
-
(value.startsWith("'") && value.endsWith("'"))) {
|
|
34
|
-
value = value.slice(1, -1);
|
|
35
|
-
}
|
|
36
|
-
// Only set if not already defined (preserve existing env)
|
|
37
|
-
if (process.env[key] === undefined) {
|
|
38
|
-
process.env[key] = value;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
function printStartupBanner(mcpProxyPort) {
|
|
44
|
-
console.log(`
|
|
45
|
-
Agent Recorder
|
|
46
|
-
==============
|
|
47
|
-
|
|
48
|
-
Claude Code v2 (recommended):
|
|
49
|
-
Add to ~/.claude/settings.json:
|
|
50
|
-
|
|
51
|
-
{
|
|
52
|
-
"mcpServers": {
|
|
53
|
-
"agent-recorder": {
|
|
54
|
-
"url": "http://127.0.0.1:${mcpProxyPort}/"
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
Legacy clients (~/.config/claude/mcp.json):
|
|
60
|
-
Same JSON structure, different location.
|
|
61
|
-
|
|
62
|
-
Then restart Claude Code.
|
|
63
|
-
`);
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Send SIGTERM to a process and wait for it to exit.
|
|
67
|
-
*/
|
|
68
|
-
async function stopProcess(pid, timeoutMs = 5000) {
|
|
69
|
-
try {
|
|
70
|
-
process.kill(pid, "SIGTERM");
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
// Process already dead
|
|
74
|
-
return true;
|
|
75
|
-
}
|
|
76
|
-
const startTime = Date.now();
|
|
77
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
78
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
79
|
-
if (!isProcessRunning(pid)) {
|
|
80
|
-
return true;
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
export async function startCommand(options = {}) {
|
|
86
|
-
// Load env file before anything else if specified
|
|
87
|
-
if (options.envFile) {
|
|
88
|
-
loadEnvFile(options.envFile);
|
|
89
|
-
}
|
|
90
|
-
const config = loadConfig();
|
|
91
|
-
const paths = getDaemonPaths();
|
|
92
|
-
// Check for existing daemon
|
|
93
|
-
const existingPid = readPidFile();
|
|
94
|
-
if (existingPid && isProcessRunning(existingPid)) {
|
|
95
|
-
if (options.force) {
|
|
96
|
-
console.log(`Stopping existing daemon (PID ${existingPid})...`);
|
|
97
|
-
const stopped = await stopProcess(existingPid);
|
|
98
|
-
if (!stopped) {
|
|
99
|
-
console.error("Failed to stop existing daemon. Try: agent-recorder stop --force");
|
|
100
|
-
process.exit(1);
|
|
101
|
-
}
|
|
102
|
-
console.log("Existing daemon stopped.");
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
console.error(`Daemon is already running (PID ${existingPid}).\n` +
|
|
106
|
-
"Use --force to restart, or run: agent-recorder stop");
|
|
107
|
-
process.exit(1);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Try to acquire lock
|
|
111
|
-
const lockResult = acquireLockWithCleanup(paths.lockFile, paths.pidFile);
|
|
112
|
-
if (!lockResult.acquired) {
|
|
113
|
-
if (lockResult.existingPid) {
|
|
114
|
-
console.error(`Another instance is running (PID ${lockResult.existingPid}).\n` +
|
|
115
|
-
"Use --force to restart, or run: agent-recorder stop");
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
console.error(`Failed to acquire lock: ${lockResult.error}`);
|
|
119
|
-
}
|
|
120
|
-
process.exit(1);
|
|
121
|
-
}
|
|
122
|
-
if (options.daemon) {
|
|
123
|
-
// Daemon mode: fork and exit parent
|
|
124
|
-
console.log("Starting daemon in background...");
|
|
125
|
-
// Find the service entry point
|
|
126
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
127
|
-
const __dirname = dirname(__filename);
|
|
128
|
-
const serviceEntry = join(__dirname, "..", "..", "..", "service", "dist", "index.js");
|
|
129
|
-
// Open log file for daemon output
|
|
130
|
-
const logFd = openSync(paths.logFile, constants.O_WRONLY | constants.O_CREAT | constants.O_APPEND);
|
|
131
|
-
// Build args for child process
|
|
132
|
-
const args = [serviceEntry, "--daemon"];
|
|
133
|
-
if (options.envFile) {
|
|
134
|
-
args.push("--env-file", options.envFile);
|
|
135
|
-
}
|
|
136
|
-
// Spawn detached child process
|
|
137
|
-
const child = spawn(process.execPath, args, {
|
|
138
|
-
detached: true,
|
|
139
|
-
stdio: ["ignore", logFd, logFd],
|
|
140
|
-
env: {
|
|
141
|
-
...process.env,
|
|
142
|
-
AR_DAEMON_MODE: "1",
|
|
143
|
-
},
|
|
144
|
-
});
|
|
145
|
-
child.unref();
|
|
146
|
-
// Wait for daemon to start (poll for PID file up to 5 seconds)
|
|
147
|
-
let newPid = null;
|
|
148
|
-
const maxAttempts = 10;
|
|
149
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
150
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
151
|
-
newPid = readPidFile();
|
|
152
|
-
if (newPid && isProcessRunning(newPid)) {
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
// Check if daemon started successfully
|
|
157
|
-
if (newPid && isProcessRunning(newPid)) {
|
|
158
|
-
console.log(`Daemon started (PID ${newPid})`);
|
|
159
|
-
console.log(`Log file: ${paths.logFile}`);
|
|
160
|
-
console.log(`\nRun 'agent-recorder status' to check status.`);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
console.error("Failed to start daemon. Check log file for details:");
|
|
164
|
-
console.error(` ${paths.logFile}`);
|
|
165
|
-
process.exit(1);
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
// Foreground mode: run directly
|
|
170
|
-
printStartupBanner(config.mcpProxyPort);
|
|
171
|
-
await startDaemon({ daemon: false });
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=start.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Start command - runs the daemon in foreground or background.
|
|
3
|
-
*/
|
|
4
|
-
export interface StartCommandOptions {
|
|
5
|
-
envFile?: string;
|
|
6
|
-
daemon?: boolean;
|
|
7
|
-
force?: boolean;
|
|
8
|
-
}
|
|
9
|
-
export declare function startCommand(options?: StartCommandOptions): Promise<void>;
|
|
10
|
-
//# sourceMappingURL=start.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA;;GAEG;AA6EH,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAuBD,wBAAsB,YAAY,CAChC,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,IAAI,CAAC,CAgHf"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|