agent-recorder 2.0.12 → 2.0.13
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/dist/bundle.js +4 -0
- package/dist/bundle.js.map +1 -1
- package/dist/embed.d.ts +21 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/embed.js +22 -0
- package/dist/embed.js.map +1 -0
- package/package.json +8 -1
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js +1 -0
- package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.d.ts +11 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.js +442 -0
- package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts +2 -51
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js +2 -113
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js +1 -1
- package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/index.js +10 -0
- package/vendor/node_modules/@agent-recorder/cli/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/cli/package.json +1 -1
- package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts +23 -0
- package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/claude-config.js +50 -0
- package/vendor/node_modules/@agent-recorder/core/claude-config.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/config.d.ts +6 -1
- package/vendor/node_modules/@agent-recorder/core/config.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/config.js +4 -1
- package/vendor/node_modules/@agent-recorder/core/config.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js +133 -0
- package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/db/events.d.ts +23 -36
- package/vendor/node_modules/@agent-recorder/core/db/events.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/events.js +70 -2
- package/vendor/node_modules/@agent-recorder/core/db/events.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/events.test.js +62 -1
- package/vendor/node_modules/@agent-recorder/core/db/events.test.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/index.d.ts +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/index.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/index.js +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts +2 -5
- package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/db/sessions.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/migrations/007_add_correlation_id.sql +11 -0
- package/vendor/node_modules/@agent-recorder/core/package.json +1 -1
- package/vendor/node_modules/@agent-recorder/core/types/index.d.ts +4 -2
- package/vendor/node_modules/@agent-recorder/core/types/index.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/types/index.js +3 -0
- package/vendor/node_modules/@agent-recorder/core/types/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/utils/redact.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/utils/redact.js +6 -3
- package/vendor/node_modules/@agent-recorder/core/utils/redact.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts +6 -0
- package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js +82 -0
- package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/hooks/package.json +1 -1
- package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts +14 -0
- package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/daemon-context.js +15 -0
- package/vendor/node_modules/@agent-recorder/service/daemon-context.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/index.d.ts +1 -8
- package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/index.js +14 -22
- package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts +27 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +109 -34
- package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts +5 -31
- package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/types.js +3 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/types.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js +66 -0
- package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/package.json +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/events.js +42 -1
- package/vendor/node_modules/@agent-recorder/service/routes/events.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts +6 -1
- package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/health.js +5 -6
- package/vendor/node_modules/@agent-recorder/service/routes/health.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts +20 -0
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.js +391 -47
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts +9 -0
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js +340 -0
- package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts +8 -0
- package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js +65 -0
- package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/service/routes/sessions.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/sessions.js +19 -1
- package/vendor/node_modules/@agent-recorder/service/routes/sessions.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/stdio.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/routes/stdio.js +20 -1
- package/vendor/node_modules/@agent-recorder/service/routes/stdio.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/server.d.ts +3 -0
- package/vendor/node_modules/@agent-recorder/service/server.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/service/server.js +27 -3
- package/vendor/node_modules/@agent-recorder/service/server.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/stdio-proxy/package.json +1 -1
- package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts +3 -19
- package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts.map +1 -1
- package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js +2 -1
- package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/{core/types → types}/events.d.ts +5 -0
- package/vendor/node_modules/@agent-recorder/types/events.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/events.js +9 -0
- package/vendor/node_modules/@agent-recorder/types/events.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/index.d.ts +12 -0
- package/vendor/node_modules/@agent-recorder/types/index.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/index.js +9 -0
- package/vendor/node_modules/@agent-recorder/types/index.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts +35 -0
- package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/jsonrpc.js +6 -0
- package/vendor/node_modules/@agent-recorder/types/jsonrpc.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/package.json +12 -0
- package/vendor/node_modules/@agent-recorder/{core/types → types}/session.d.ts +6 -0
- package/vendor/node_modules/@agent-recorder/types/session.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js.map +1 -1
- package/vendor/node_modules/@agent-recorder/types/storage.d.ts +78 -0
- package/vendor/node_modules/@agent-recorder/types/storage.d.ts.map +1 -0
- package/vendor/node_modules/@agent-recorder/types/storage.js +9 -0
- package/vendor/node_modules/@agent-recorder/types/storage.js.map +1 -0
- package/vendor/node_modules/@agent-recorder/core/types/events.d.ts.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/types/events.js +0 -6
- package/vendor/node_modules/@agent-recorder/core/types/events.js.map +0 -1
- package/vendor/node_modules/@agent-recorder/core/types/session.d.ts.map +0 -1
- /package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js +0 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for the hooks API endpoint.
|
|
3
|
+
*
|
|
4
|
+
* Tests the full lifecycle: SessionStart → PreToolUse → PostToolUse → SessionEnd,
|
|
5
|
+
* subagent handling, and isToolResponseError edge cases (tested indirectly via
|
|
6
|
+
* PostToolUse status derivation).
|
|
7
|
+
*/
|
|
8
|
+
import { describe, it, expect, beforeAll, afterAll } from "vitest";
|
|
9
|
+
import { openMemoryDatabase, runMigrations, getEventsBySession, getEventById, getSessionById, } from "@agent-recorder/core";
|
|
10
|
+
import { createServer } from "../server.js";
|
|
11
|
+
import { join, dirname } from "node:path";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
|
+
import { randomUUID } from "node:crypto";
|
|
14
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
function migrationsDir() {
|
|
16
|
+
return join(__dirname, "..", "..", "..", "core", "migrations");
|
|
17
|
+
}
|
|
18
|
+
/** Send a hook event to the test server */
|
|
19
|
+
async function sendHook(app, payload) {
|
|
20
|
+
return app.inject({
|
|
21
|
+
method: "POST",
|
|
22
|
+
url: "/api/hooks",
|
|
23
|
+
payload,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
describe("Hooks API — SessionStart → SessionEnd lifecycle", () => {
|
|
27
|
+
let app;
|
|
28
|
+
let db;
|
|
29
|
+
beforeAll(async () => {
|
|
30
|
+
db = openMemoryDatabase();
|
|
31
|
+
runMigrations(db, migrationsDir());
|
|
32
|
+
app = await createServer({ db });
|
|
33
|
+
await app.ready();
|
|
34
|
+
});
|
|
35
|
+
afterAll(async () => {
|
|
36
|
+
await app.close();
|
|
37
|
+
db.close();
|
|
38
|
+
});
|
|
39
|
+
it("creates agent_call on SessionStart and completes on SessionEnd", async () => {
|
|
40
|
+
const sessionId = randomUUID();
|
|
41
|
+
// SessionStart
|
|
42
|
+
const startRes = await sendHook(app, {
|
|
43
|
+
hook_type: "SessionStart",
|
|
44
|
+
session_id: sessionId,
|
|
45
|
+
start_source: "cli",
|
|
46
|
+
});
|
|
47
|
+
expect(startRes.statusCode).toBe(200);
|
|
48
|
+
// Check that agent_call event was created
|
|
49
|
+
const events = getEventsBySession(db, sessionId);
|
|
50
|
+
expect(events).toHaveLength(1);
|
|
51
|
+
expect(events[0].eventType).toBe("agent_call");
|
|
52
|
+
expect(events[0].status).toBe("running");
|
|
53
|
+
// SessionEnd
|
|
54
|
+
const endRes = await sendHook(app, {
|
|
55
|
+
hook_type: "SessionEnd",
|
|
56
|
+
session_id: sessionId,
|
|
57
|
+
end_reason: "completed",
|
|
58
|
+
});
|
|
59
|
+
expect(endRes.statusCode).toBe(200);
|
|
60
|
+
// Agent call should be completed
|
|
61
|
+
const afterEnd = getEventById(db, events[0].id);
|
|
62
|
+
expect(afterEnd.status).toBe("success");
|
|
63
|
+
expect(afterEnd.endedAt).toBeTruthy();
|
|
64
|
+
// Session should be completed
|
|
65
|
+
const session = getSessionById(db, sessionId);
|
|
66
|
+
expect(session.status).toBe("completed");
|
|
67
|
+
});
|
|
68
|
+
it("marks agent_call as error when end_reason is error", async () => {
|
|
69
|
+
const sessionId = randomUUID();
|
|
70
|
+
await sendHook(app, {
|
|
71
|
+
hook_type: "SessionStart",
|
|
72
|
+
session_id: sessionId,
|
|
73
|
+
});
|
|
74
|
+
const events = getEventsBySession(db, sessionId);
|
|
75
|
+
await sendHook(app, {
|
|
76
|
+
hook_type: "SessionEnd",
|
|
77
|
+
session_id: sessionId,
|
|
78
|
+
end_reason: "error",
|
|
79
|
+
});
|
|
80
|
+
const afterEnd = getEventById(db, events[0].id);
|
|
81
|
+
expect(afterEnd.status).toBe("error");
|
|
82
|
+
const session = getSessionById(db, sessionId);
|
|
83
|
+
expect(session.status).toBe("error");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe("Hooks API — PreToolUse → PostToolUse pairing", () => {
|
|
87
|
+
let app;
|
|
88
|
+
let db;
|
|
89
|
+
beforeAll(async () => {
|
|
90
|
+
db = openMemoryDatabase();
|
|
91
|
+
runMigrations(db, migrationsDir());
|
|
92
|
+
app = await createServer({ db });
|
|
93
|
+
await app.ready();
|
|
94
|
+
});
|
|
95
|
+
afterAll(async () => {
|
|
96
|
+
await app.close();
|
|
97
|
+
db.close();
|
|
98
|
+
});
|
|
99
|
+
it("PreToolUse creates running event, PostToolUse completes it", async () => {
|
|
100
|
+
const sessionId = randomUUID();
|
|
101
|
+
await sendHook(app, {
|
|
102
|
+
hook_type: "SessionStart",
|
|
103
|
+
session_id: sessionId,
|
|
104
|
+
});
|
|
105
|
+
// PreToolUse
|
|
106
|
+
await sendHook(app, {
|
|
107
|
+
hook_type: "PreToolUse",
|
|
108
|
+
session_id: sessionId,
|
|
109
|
+
tool_name: "Read",
|
|
110
|
+
tool_input: { file_path: "/tmp/test.txt" },
|
|
111
|
+
});
|
|
112
|
+
let events = getEventsBySession(db, sessionId);
|
|
113
|
+
const toolEvent = events.find((e) => e.toolName === "Read");
|
|
114
|
+
expect(toolEvent).toBeDefined();
|
|
115
|
+
expect(toolEvent.status).toBe("running");
|
|
116
|
+
// PostToolUse
|
|
117
|
+
await sendHook(app, {
|
|
118
|
+
hook_type: "PostToolUse",
|
|
119
|
+
session_id: sessionId,
|
|
120
|
+
tool_name: "Read",
|
|
121
|
+
tool_response: { content: "file contents" },
|
|
122
|
+
});
|
|
123
|
+
const completed = getEventById(db, toolEvent.id);
|
|
124
|
+
expect(completed.status).toBe("success");
|
|
125
|
+
expect(completed.endedAt).toBeTruthy();
|
|
126
|
+
expect(completed.outputJson).toBeTruthy();
|
|
127
|
+
});
|
|
128
|
+
it("PostToolUse without PreToolUse creates standalone event", async () => {
|
|
129
|
+
const sessionId = randomUUID();
|
|
130
|
+
await sendHook(app, {
|
|
131
|
+
hook_type: "SessionStart",
|
|
132
|
+
session_id: sessionId,
|
|
133
|
+
});
|
|
134
|
+
// PostToolUse without prior PreToolUse
|
|
135
|
+
await sendHook(app, {
|
|
136
|
+
hook_type: "PostToolUse",
|
|
137
|
+
session_id: sessionId,
|
|
138
|
+
tool_name: "Bash",
|
|
139
|
+
tool_response: { output: "done" },
|
|
140
|
+
});
|
|
141
|
+
const events = getEventsBySession(db, sessionId);
|
|
142
|
+
const bashEvent = events.find((e) => e.toolName === "Bash");
|
|
143
|
+
expect(bashEvent).toBeDefined();
|
|
144
|
+
expect(bashEvent.status).toBe("success");
|
|
145
|
+
expect(bashEvent.endedAt).toBeTruthy();
|
|
146
|
+
});
|
|
147
|
+
it("returns 400 when PreToolUse has no tool_name", async () => {
|
|
148
|
+
const sessionId = randomUUID();
|
|
149
|
+
await sendHook(app, {
|
|
150
|
+
hook_type: "SessionStart",
|
|
151
|
+
session_id: sessionId,
|
|
152
|
+
});
|
|
153
|
+
const res = await sendHook(app, {
|
|
154
|
+
hook_type: "PreToolUse",
|
|
155
|
+
session_id: sessionId,
|
|
156
|
+
});
|
|
157
|
+
// Fail-open: returns 200 with warning instead of 400 to never block Claude
|
|
158
|
+
expect(res.statusCode).toBe(200);
|
|
159
|
+
expect(res.json()).toMatchObject({
|
|
160
|
+
ok: true,
|
|
161
|
+
warning: "missing_tool_name",
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
it("returns 200 with warning when PostToolUse has no tool_name", async () => {
|
|
165
|
+
const sessionId = randomUUID();
|
|
166
|
+
await sendHook(app, {
|
|
167
|
+
hook_type: "SessionStart",
|
|
168
|
+
session_id: sessionId,
|
|
169
|
+
});
|
|
170
|
+
const res = await sendHook(app, {
|
|
171
|
+
hook_type: "PostToolUse",
|
|
172
|
+
session_id: sessionId,
|
|
173
|
+
});
|
|
174
|
+
// Fail-open: returns 200 with warning instead of 400 to never block Claude
|
|
175
|
+
expect(res.statusCode).toBe(200);
|
|
176
|
+
expect(res.json()).toMatchObject({
|
|
177
|
+
ok: true,
|
|
178
|
+
warning: "missing_tool_name",
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
describe("Hooks API — isToolResponseError (via PostToolUse status)", () => {
|
|
183
|
+
let app;
|
|
184
|
+
let db;
|
|
185
|
+
beforeAll(async () => {
|
|
186
|
+
db = openMemoryDatabase();
|
|
187
|
+
runMigrations(db, migrationsDir());
|
|
188
|
+
app = await createServer({ db });
|
|
189
|
+
await app.ready();
|
|
190
|
+
});
|
|
191
|
+
afterAll(async () => {
|
|
192
|
+
await app.close();
|
|
193
|
+
db.close();
|
|
194
|
+
});
|
|
195
|
+
async function postToolAndGetStatus(toolResponse) {
|
|
196
|
+
const sessionId = randomUUID();
|
|
197
|
+
await sendHook(app, {
|
|
198
|
+
hook_type: "SessionStart",
|
|
199
|
+
session_id: sessionId,
|
|
200
|
+
});
|
|
201
|
+
await sendHook(app, {
|
|
202
|
+
hook_type: "PostToolUse",
|
|
203
|
+
session_id: sessionId,
|
|
204
|
+
tool_name: "TestTool",
|
|
205
|
+
tool_response: toolResponse,
|
|
206
|
+
});
|
|
207
|
+
const events = getEventsBySession(db, sessionId);
|
|
208
|
+
const toolEvent = events.find((e) => e.toolName === "TestTool");
|
|
209
|
+
return toolEvent.status;
|
|
210
|
+
}
|
|
211
|
+
it("treats { isError: true } as error", async () => {
|
|
212
|
+
const status = await postToolAndGetStatus({ isError: true });
|
|
213
|
+
expect(status).toBe("error");
|
|
214
|
+
});
|
|
215
|
+
it("treats { isError: false } as success", async () => {
|
|
216
|
+
const status = await postToolAndGetStatus({ isError: false, result: "ok" });
|
|
217
|
+
expect(status).toBe("success");
|
|
218
|
+
});
|
|
219
|
+
it("treats { error: 'something' } as success (error field is metadata only)", async () => {
|
|
220
|
+
const status = await postToolAndGetStatus({
|
|
221
|
+
error: "something went wrong",
|
|
222
|
+
});
|
|
223
|
+
expect(status).toBe("success");
|
|
224
|
+
});
|
|
225
|
+
it("treats { error: '' } (empty string) as success", async () => {
|
|
226
|
+
const status = await postToolAndGetStatus({ error: "" });
|
|
227
|
+
expect(status).toBe("success");
|
|
228
|
+
});
|
|
229
|
+
it("treats { error: null } as success", async () => {
|
|
230
|
+
const status = await postToolAndGetStatus({ error: null });
|
|
231
|
+
expect(status).toBe("success");
|
|
232
|
+
});
|
|
233
|
+
it("treats { error: { code: 123 } } as success (error field is metadata only)", async () => {
|
|
234
|
+
const status = await postToolAndGetStatus({
|
|
235
|
+
error: { code: 123, message: "fail" },
|
|
236
|
+
});
|
|
237
|
+
expect(status).toBe("success");
|
|
238
|
+
});
|
|
239
|
+
it("treats null response as success", async () => {
|
|
240
|
+
const status = await postToolAndGetStatus(null);
|
|
241
|
+
expect(status).toBe("success");
|
|
242
|
+
});
|
|
243
|
+
it("treats plain string response as success", async () => {
|
|
244
|
+
const status = await postToolAndGetStatus("just a string");
|
|
245
|
+
expect(status).toBe("success");
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe("Hooks API — SubagentStop + PostToolUse deduplication", () => {
|
|
249
|
+
let app;
|
|
250
|
+
let db;
|
|
251
|
+
beforeAll(async () => {
|
|
252
|
+
db = openMemoryDatabase();
|
|
253
|
+
runMigrations(db, migrationsDir());
|
|
254
|
+
app = await createServer({ db });
|
|
255
|
+
await app.ready();
|
|
256
|
+
});
|
|
257
|
+
afterAll(async () => {
|
|
258
|
+
await app.close();
|
|
259
|
+
db.close();
|
|
260
|
+
});
|
|
261
|
+
it("SubagentStop + PostToolUse does not create duplicate events", async () => {
|
|
262
|
+
const sessionId = randomUUID();
|
|
263
|
+
await sendHook(app, {
|
|
264
|
+
hook_type: "SessionStart",
|
|
265
|
+
session_id: sessionId,
|
|
266
|
+
});
|
|
267
|
+
// PreToolUse for Agent
|
|
268
|
+
await sendHook(app, {
|
|
269
|
+
hook_type: "PreToolUse",
|
|
270
|
+
session_id: sessionId,
|
|
271
|
+
tool_name: "Agent",
|
|
272
|
+
tool_input: { prompt: "do something" },
|
|
273
|
+
});
|
|
274
|
+
// SubagentStop fires — should only pop parent stack, not complete
|
|
275
|
+
await sendHook(app, {
|
|
276
|
+
hook_type: "SubagentStop",
|
|
277
|
+
session_id: sessionId,
|
|
278
|
+
tool_name: "Agent",
|
|
279
|
+
subagent_type: "general-purpose",
|
|
280
|
+
});
|
|
281
|
+
// PostToolUse fires — should find the running event and complete it
|
|
282
|
+
await sendHook(app, {
|
|
283
|
+
hook_type: "PostToolUse",
|
|
284
|
+
session_id: sessionId,
|
|
285
|
+
tool_name: "Agent",
|
|
286
|
+
tool_response: { result: "done" },
|
|
287
|
+
});
|
|
288
|
+
// Should only have 2 events: agent_call root + one subagent_call (no duplicate)
|
|
289
|
+
const events = getEventsBySession(db, sessionId);
|
|
290
|
+
const subagentEvents = events.filter((e) => e.eventType === "subagent_call");
|
|
291
|
+
expect(subagentEvents).toHaveLength(1);
|
|
292
|
+
expect(subagentEvents[0].status).toBe("success");
|
|
293
|
+
expect(subagentEvents[0].outputJson).toBeTruthy();
|
|
294
|
+
});
|
|
295
|
+
it("Stop hook defers to SessionEnd for agent_call completion", async () => {
|
|
296
|
+
const sessionId = randomUUID();
|
|
297
|
+
await sendHook(app, {
|
|
298
|
+
hook_type: "SessionStart",
|
|
299
|
+
session_id: sessionId,
|
|
300
|
+
});
|
|
301
|
+
const events = getEventsBySession(db, sessionId);
|
|
302
|
+
const agentCallId = events[0].id;
|
|
303
|
+
// Stop fires
|
|
304
|
+
await sendHook(app, {
|
|
305
|
+
hook_type: "Stop",
|
|
306
|
+
session_id: sessionId,
|
|
307
|
+
});
|
|
308
|
+
// Agent call should still be running (Stop defers to SessionEnd)
|
|
309
|
+
const afterStop = getEventById(db, agentCallId);
|
|
310
|
+
expect(afterStop.status).toBe("running");
|
|
311
|
+
// SessionEnd fires with success
|
|
312
|
+
await sendHook(app, {
|
|
313
|
+
hook_type: "SessionEnd",
|
|
314
|
+
session_id: sessionId,
|
|
315
|
+
end_reason: "completed",
|
|
316
|
+
});
|
|
317
|
+
// Now agent call should be success
|
|
318
|
+
const afterEnd = getEventById(db, agentCallId);
|
|
319
|
+
expect(afterEnd.status).toBe("success");
|
|
320
|
+
});
|
|
321
|
+
it("marks session and agent_call as cancelled when end_reason is cancelled", async () => {
|
|
322
|
+
const sessionId = randomUUID();
|
|
323
|
+
await sendHook(app, {
|
|
324
|
+
hook_type: "SessionStart",
|
|
325
|
+
session_id: sessionId,
|
|
326
|
+
});
|
|
327
|
+
const events = getEventsBySession(db, sessionId);
|
|
328
|
+
const agentCallId = events[0].id;
|
|
329
|
+
await sendHook(app, {
|
|
330
|
+
hook_type: "SessionEnd",
|
|
331
|
+
session_id: sessionId,
|
|
332
|
+
end_reason: "cancelled",
|
|
333
|
+
});
|
|
334
|
+
const afterEnd = getEventById(db, agentCallId);
|
|
335
|
+
expect(afterEnd.status).toBe("cancelled");
|
|
336
|
+
const session = getSessionById(db, sessionId);
|
|
337
|
+
expect(session.status).toBe("cancelled");
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
//# sourceMappingURL=hooks.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.test.js","sourceRoot":"","sources":["../../src/routes/hooks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isToolResponseError.test.d.ts","sourceRoot":"","sources":["../../src/routes/isToolResponseError.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Direct unit tests for isToolResponseError.
|
|
3
|
+
*
|
|
4
|
+
* Complements the integration tests in hooks.test.ts which test this
|
|
5
|
+
* function indirectly via PostToolUse status derivation.
|
|
6
|
+
*/
|
|
7
|
+
import { describe, it, expect } from "vitest";
|
|
8
|
+
import { isToolResponseError } from "./hooks.js";
|
|
9
|
+
describe("isToolResponseError", () => {
|
|
10
|
+
// --- MCP isError field (primary signal) ---
|
|
11
|
+
it("returns true for { isError: true }", () => {
|
|
12
|
+
expect(isToolResponseError({ isError: true })).toBe(true);
|
|
13
|
+
});
|
|
14
|
+
it("returns false for { isError: false }", () => {
|
|
15
|
+
expect(isToolResponseError({ isError: false })).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
it("returns false for { isError: 'true' } (string, not boolean)", () => {
|
|
18
|
+
expect(isToolResponseError({ isError: "true" })).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it("returns true for { isError: true, error: '' } (isError takes precedence)", () => {
|
|
21
|
+
expect(isToolResponseError({ isError: true, error: "" })).toBe(true);
|
|
22
|
+
});
|
|
23
|
+
// --- Top-level error field (treated as metadata only, not status signal) ---
|
|
24
|
+
it("returns false for { error: 'something went wrong' } (error field is metadata only)", () => {
|
|
25
|
+
expect(isToolResponseError({ error: "something went wrong" })).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
it("returns false for { error: '' } (empty string)", () => {
|
|
28
|
+
expect(isToolResponseError({ error: "" })).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
it("returns false for { error: null }", () => {
|
|
31
|
+
expect(isToolResponseError({ error: null })).toBe(false);
|
|
32
|
+
});
|
|
33
|
+
it("returns false for { error: { code: 123, message: 'fail' } } (error field is metadata only)", () => {
|
|
34
|
+
expect(isToolResponseError({ error: { code: 123, message: "fail" } })).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
it("returns false for { error: 42 } (number, not string or object)", () => {
|
|
37
|
+
expect(isToolResponseError({ error: 42 })).toBe(false);
|
|
38
|
+
});
|
|
39
|
+
it("returns false for { error: true } (boolean, not string or object)", () => {
|
|
40
|
+
expect(isToolResponseError({ error: true })).toBe(false);
|
|
41
|
+
});
|
|
42
|
+
// --- Non-error responses ---
|
|
43
|
+
it("returns false for null", () => {
|
|
44
|
+
expect(isToolResponseError(null)).toBe(false);
|
|
45
|
+
});
|
|
46
|
+
it("returns false for undefined", () => {
|
|
47
|
+
expect(isToolResponseError(undefined)).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it("returns false for a plain string", () => {
|
|
50
|
+
expect(isToolResponseError("just a string")).toBe(false);
|
|
51
|
+
});
|
|
52
|
+
it("returns false for a number", () => {
|
|
53
|
+
expect(isToolResponseError(42)).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
it("returns false for an array", () => {
|
|
56
|
+
expect(isToolResponseError([{ error: "nested" }])).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it("returns false for an empty object", () => {
|
|
59
|
+
expect(isToolResponseError({})).toBe(false);
|
|
60
|
+
});
|
|
61
|
+
it("returns false for { result: 'ok' } (no error indicators)", () => {
|
|
62
|
+
expect(isToolResponseError({ result: "ok" })).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=isToolResponseError.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isToolResponseError.test.js","sourceRoot":"","sources":["../../src/routes/isToolResponseError.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,UAAU,qBAAqB;IAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,UAAU,qBAAqB;IAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CA6Gf"}
|
|
@@ -33,8 +33,26 @@ export async function registerSessionsRoutes(app, options) {
|
|
|
33
33
|
return reply.code(500).send({ error: "Failed to create session" });
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
|
+
const endSessionSchema = {
|
|
37
|
+
params: {
|
|
38
|
+
type: "object",
|
|
39
|
+
required: ["id"],
|
|
40
|
+
properties: { id: { type: "string" } },
|
|
41
|
+
additionalProperties: false,
|
|
42
|
+
},
|
|
43
|
+
body: {
|
|
44
|
+
type: "object",
|
|
45
|
+
properties: {
|
|
46
|
+
status: {
|
|
47
|
+
type: "string",
|
|
48
|
+
enum: ["completed", "error", "cancelled"],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
additionalProperties: false,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
36
54
|
// End a session
|
|
37
|
-
app.post("/api/sessions/:id/end", async (request, reply) => {
|
|
55
|
+
app.post("/api/sessions/:id/end", { schema: endSessionSchema }, async (request, reply) => {
|
|
38
56
|
try {
|
|
39
57
|
const { id } = request.params;
|
|
40
58
|
const { status } = request.body ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/routes/stdio.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,UAAU,kBAAkB;IAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmDD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/routes/stdio.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAU3C,UAAU,kBAAkB;IAC1B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAmDD,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA2Ff"}
|
|
@@ -32,8 +32,27 @@ function extractToolInfo(raw, method) {
|
|
|
32
32
|
}
|
|
33
33
|
export async function registerStdioRoutes(app, options) {
|
|
34
34
|
const { db, debug = false } = options;
|
|
35
|
+
const stdioTelemetrySchema = {
|
|
36
|
+
body: {
|
|
37
|
+
type: "object",
|
|
38
|
+
required: ["timestamp", "direction", "raw"],
|
|
39
|
+
properties: {
|
|
40
|
+
timestamp: { type: "string" },
|
|
41
|
+
direction: {
|
|
42
|
+
type: "string",
|
|
43
|
+
enum: ["request", "response"],
|
|
44
|
+
},
|
|
45
|
+
raw: { type: "string" },
|
|
46
|
+
method: { type: "string" },
|
|
47
|
+
id: {},
|
|
48
|
+
isError: { type: "boolean" },
|
|
49
|
+
sessionId: { type: "string" },
|
|
50
|
+
},
|
|
51
|
+
additionalProperties: false,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
35
54
|
// Receive telemetry from STDIO proxy
|
|
36
|
-
app.post("/api/stdio", async (request, reply) => {
|
|
55
|
+
app.post("/api/stdio", { schema: stdioTelemetrySchema }, async (request, reply) => {
|
|
37
56
|
try {
|
|
38
57
|
const payload = request.body;
|
|
39
58
|
if (debug) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/routes/stdio.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/routes/stdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { type FastifyInstance } from "fastify";
|
|
6
6
|
import type Database from "better-sqlite3";
|
|
7
|
+
import type { DaemonContext } from "./daemon-context.js";
|
|
7
8
|
export interface CreateServerOptions {
|
|
8
9
|
db: Database.Database;
|
|
9
10
|
currentSessionId?: string | null;
|
|
10
11
|
debug?: boolean;
|
|
12
|
+
daemonContext?: DaemonContext;
|
|
13
|
+
redactKeys?: string[];
|
|
11
14
|
}
|
|
12
15
|
/**
|
|
13
16
|
* Create a configured Fastify server instance.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAgB,EAAE,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAgB,EAAE,KAAK,eAAe,EAAqB,MAAM,SAAS,CAAC;AAC3E,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAM3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CA6C1B;AAwCD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,eAAe,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
|
|
@@ -13,18 +13,42 @@ import { registerStdioRoutes } from "./routes/stdio.js";
|
|
|
13
13
|
* Create a configured Fastify server instance.
|
|
14
14
|
*/
|
|
15
15
|
export async function createServer(options) {
|
|
16
|
-
const { db, currentSessionId, debug } = options;
|
|
16
|
+
const { db, currentSessionId, debug, daemonContext, redactKeys } = options;
|
|
17
17
|
const app = Fastify({
|
|
18
18
|
logger: true,
|
|
19
19
|
});
|
|
20
|
+
// Custom error handler: fail-open for hooks/stdio validation errors
|
|
21
|
+
app.setErrorHandler(async (error, request, reply) => {
|
|
22
|
+
if (error.validation) {
|
|
23
|
+
const url = request.url;
|
|
24
|
+
// Fail-open for hooks and stdio — validation errors should not block Claude
|
|
25
|
+
if (url.startsWith("/api/hooks") || url.startsWith("/api/stdio")) {
|
|
26
|
+
console.error(`[validation] ${url}: ${error.message} (fail-open, returning 200)`);
|
|
27
|
+
return reply.code(200).send({ ok: true, error: "validation" });
|
|
28
|
+
}
|
|
29
|
+
// Standard validation error for other routes
|
|
30
|
+
return reply.code(400).send({
|
|
31
|
+
error: "Validation error",
|
|
32
|
+
message: error.message,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
// Re-throw non-validation errors
|
|
36
|
+
return reply.code(error.statusCode ?? 500).send({
|
|
37
|
+
error: error.message,
|
|
38
|
+
});
|
|
39
|
+
});
|
|
20
40
|
// Register routes
|
|
21
|
-
await registerHealthRoutes(app);
|
|
41
|
+
await registerHealthRoutes(app, { daemonContext });
|
|
22
42
|
await registerSessionsRoutes(app, {
|
|
23
43
|
db,
|
|
24
44
|
currentSessionId: currentSessionId ?? null,
|
|
25
45
|
});
|
|
26
46
|
await registerEventsRoutes(app, { db });
|
|
27
|
-
await registerHooksRoutes(app, {
|
|
47
|
+
await registerHooksRoutes(app, {
|
|
48
|
+
db,
|
|
49
|
+
debug: debug ?? false,
|
|
50
|
+
redactKeys: redactKeys ?? [],
|
|
51
|
+
});
|
|
28
52
|
await registerStdioRoutes(app, { db, debug: debug ?? false });
|
|
29
53
|
return app;
|
|
30
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|