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.
Files changed (141) hide show
  1. package/dist/bundle.js +4 -0
  2. package/dist/bundle.js.map +1 -1
  3. package/dist/embed.d.ts +21 -0
  4. package/dist/embed.d.ts.map +1 -0
  5. package/dist/embed.js +22 -0
  6. package/dist/embed.js.map +1 -0
  7. package/package.json +8 -1
  8. package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js +1 -0
  9. package/vendor/node_modules/@agent-recorder/cli/analytics/session-analytics.test.js.map +1 -1
  10. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.d.ts +11 -0
  11. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.d.ts.map +1 -0
  12. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.js +442 -0
  13. package/vendor/node_modules/@agent-recorder/cli/commands/mcp-server.js.map +1 -0
  14. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts +2 -51
  15. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts.map +1 -1
  16. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js +2 -113
  17. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js.map +1 -1
  18. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js +1 -1
  19. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js.map +1 -1
  20. package/vendor/node_modules/@agent-recorder/cli/index.js +10 -0
  21. package/vendor/node_modules/@agent-recorder/cli/index.js.map +1 -1
  22. package/vendor/node_modules/@agent-recorder/cli/package.json +1 -1
  23. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts +23 -0
  24. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts.map +1 -1
  25. package/vendor/node_modules/@agent-recorder/core/claude-config.js +50 -0
  26. package/vendor/node_modules/@agent-recorder/core/claude-config.js.map +1 -1
  27. package/vendor/node_modules/@agent-recorder/core/config.d.ts +6 -1
  28. package/vendor/node_modules/@agent-recorder/core/config.d.ts.map +1 -1
  29. package/vendor/node_modules/@agent-recorder/core/config.js +4 -1
  30. package/vendor/node_modules/@agent-recorder/core/config.js.map +1 -1
  31. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts +5 -0
  32. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts.map +1 -0
  33. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js +133 -0
  34. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js.map +1 -0
  35. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts +23 -36
  36. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts.map +1 -1
  37. package/vendor/node_modules/@agent-recorder/core/db/events.js +70 -2
  38. package/vendor/node_modules/@agent-recorder/core/db/events.js.map +1 -1
  39. package/vendor/node_modules/@agent-recorder/core/db/events.test.js +62 -1
  40. package/vendor/node_modules/@agent-recorder/core/db/events.test.js.map +1 -1
  41. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts +1 -1
  42. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts.map +1 -1
  43. package/vendor/node_modules/@agent-recorder/core/db/index.js +1 -1
  44. package/vendor/node_modules/@agent-recorder/core/db/index.js.map +1 -1
  45. package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts +2 -5
  46. package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts.map +1 -1
  47. package/vendor/node_modules/@agent-recorder/core/db/sessions.js.map +1 -1
  48. package/vendor/node_modules/@agent-recorder/core/migrations/007_add_correlation_id.sql +11 -0
  49. package/vendor/node_modules/@agent-recorder/core/package.json +1 -1
  50. package/vendor/node_modules/@agent-recorder/core/types/index.d.ts +4 -2
  51. package/vendor/node_modules/@agent-recorder/core/types/index.d.ts.map +1 -1
  52. package/vendor/node_modules/@agent-recorder/core/types/index.js +3 -0
  53. package/vendor/node_modules/@agent-recorder/core/types/index.js.map +1 -1
  54. package/vendor/node_modules/@agent-recorder/core/utils/redact.d.ts.map +1 -1
  55. package/vendor/node_modules/@agent-recorder/core/utils/redact.js +6 -3
  56. package/vendor/node_modules/@agent-recorder/core/utils/redact.js.map +1 -1
  57. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts +6 -0
  58. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts.map +1 -0
  59. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js +82 -0
  60. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js.map +1 -0
  61. package/vendor/node_modules/@agent-recorder/hooks/package.json +1 -1
  62. package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts +14 -0
  63. package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts.map +1 -0
  64. package/vendor/node_modules/@agent-recorder/service/daemon-context.js +15 -0
  65. package/vendor/node_modules/@agent-recorder/service/daemon-context.js.map +1 -0
  66. package/vendor/node_modules/@agent-recorder/service/index.d.ts +1 -8
  67. package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
  68. package/vendor/node_modules/@agent-recorder/service/index.js +14 -22
  69. package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
  70. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts +27 -0
  71. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
  72. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +109 -34
  73. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
  74. package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts +5 -31
  75. package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts.map +1 -1
  76. package/vendor/node_modules/@agent-recorder/service/mcp/types.js +3 -1
  77. package/vendor/node_modules/@agent-recorder/service/mcp/types.js.map +1 -1
  78. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts +5 -0
  79. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts.map +1 -0
  80. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js +66 -0
  81. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js.map +1 -0
  82. package/vendor/node_modules/@agent-recorder/service/package.json +1 -1
  83. package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts.map +1 -1
  84. package/vendor/node_modules/@agent-recorder/service/routes/events.js +42 -1
  85. package/vendor/node_modules/@agent-recorder/service/routes/events.js.map +1 -1
  86. package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts +6 -1
  87. package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts.map +1 -1
  88. package/vendor/node_modules/@agent-recorder/service/routes/health.js +5 -6
  89. package/vendor/node_modules/@agent-recorder/service/routes/health.js.map +1 -1
  90. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts +20 -0
  91. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts.map +1 -1
  92. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js +391 -47
  93. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js.map +1 -1
  94. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts +9 -0
  95. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts.map +1 -0
  96. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js +340 -0
  97. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js.map +1 -0
  98. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts +8 -0
  99. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts.map +1 -0
  100. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js +65 -0
  101. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js.map +1 -0
  102. package/vendor/node_modules/@agent-recorder/service/routes/sessions.d.ts.map +1 -1
  103. package/vendor/node_modules/@agent-recorder/service/routes/sessions.js +19 -1
  104. package/vendor/node_modules/@agent-recorder/service/routes/sessions.js.map +1 -1
  105. package/vendor/node_modules/@agent-recorder/service/routes/stdio.d.ts.map +1 -1
  106. package/vendor/node_modules/@agent-recorder/service/routes/stdio.js +20 -1
  107. package/vendor/node_modules/@agent-recorder/service/routes/stdio.js.map +1 -1
  108. package/vendor/node_modules/@agent-recorder/service/server.d.ts +3 -0
  109. package/vendor/node_modules/@agent-recorder/service/server.d.ts.map +1 -1
  110. package/vendor/node_modules/@agent-recorder/service/server.js +27 -3
  111. package/vendor/node_modules/@agent-recorder/service/server.js.map +1 -1
  112. package/vendor/node_modules/@agent-recorder/stdio-proxy/package.json +1 -1
  113. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts +3 -19
  114. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts.map +1 -1
  115. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js +2 -1
  116. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js.map +1 -1
  117. package/vendor/node_modules/@agent-recorder/{core/types → types}/events.d.ts +5 -0
  118. package/vendor/node_modules/@agent-recorder/types/events.d.ts.map +1 -0
  119. package/vendor/node_modules/@agent-recorder/types/events.js +9 -0
  120. package/vendor/node_modules/@agent-recorder/types/events.js.map +1 -0
  121. package/vendor/node_modules/@agent-recorder/types/index.d.ts +12 -0
  122. package/vendor/node_modules/@agent-recorder/types/index.d.ts.map +1 -0
  123. package/vendor/node_modules/@agent-recorder/types/index.js +9 -0
  124. package/vendor/node_modules/@agent-recorder/types/index.js.map +1 -0
  125. package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts +35 -0
  126. package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts.map +1 -0
  127. package/vendor/node_modules/@agent-recorder/types/jsonrpc.js +6 -0
  128. package/vendor/node_modules/@agent-recorder/types/jsonrpc.js.map +1 -0
  129. package/vendor/node_modules/@agent-recorder/types/package.json +12 -0
  130. package/vendor/node_modules/@agent-recorder/{core/types → types}/session.d.ts +6 -0
  131. package/vendor/node_modules/@agent-recorder/types/session.d.ts.map +1 -0
  132. package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js.map +1 -1
  133. package/vendor/node_modules/@agent-recorder/types/storage.d.ts +78 -0
  134. package/vendor/node_modules/@agent-recorder/types/storage.d.ts.map +1 -0
  135. package/vendor/node_modules/@agent-recorder/types/storage.js +9 -0
  136. package/vendor/node_modules/@agent-recorder/types/storage.js.map +1 -0
  137. package/vendor/node_modules/@agent-recorder/core/types/events.d.ts.map +0 -1
  138. package/vendor/node_modules/@agent-recorder/core/types/events.js +0 -6
  139. package/vendor/node_modules/@agent-recorder/core/types/events.js.map +0 -1
  140. package/vendor/node_modules/@agent-recorder/core/types/session.d.ts.map +0 -1
  141. /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,8 @@
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
+ export {};
8
+ //# sourceMappingURL=isToolResponseError.test.d.ts.map
@@ -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,CAyFf"}
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":"AAAA;;GAEG;AAIH,OAAO,EACL,aAAa,EACb,UAAU,EACV,cAAc,EACd,wBAAwB,GAEzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAOzC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAoB,EACpB,OAA8B;IAE9B,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAEzC,gDAAgD;IAChD,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACxD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,uBAAuB;IACvB,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;YACjD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YAClD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG;QACvB,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,QAAQ,EAAE,CAAC,IAAI,CAAC;YAChB,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE;YAC/C,oBAAoB,EAAE,KAAK;SAC5B;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAiB;oBACvB,IAAI,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC;iBAC1C;aACF;YACD,oBAAoB,EAAE,KAAK;SAC5B;KACF,CAAC;IAEF,gBAAgB;IAChB,GAAG,CAAC,IAAI,CACN,uBAAuB,EACvB,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAC5B,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,UAAU,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,IAAI,WAAW,CAAC,CAAC;YAEnE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CACF,CAAC;IAEF,mCAAmC;IACnC,GAAG,CAAC,GAAG,CACL,eAAe,EACf,KAAK,EAAE,OAAO,EAAE,EAAE;QAChB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;YACjC,OAAO,wBAAwB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,GAAG,CAAC,GAAG,CACL,mBAAmB,EACnB,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,cAAc,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;QAClE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -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,CAsEf"}
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":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAyB9B,oCAAoC;AACpC,SAAS,kBAAkB,CAAC,EAAqB,EAAE,SAAiB;IAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,2CAA2C;AAC3C,SAAS,eAAe,CACtB,GAAW,EACX,MAAe;IAEf,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAE5B,CAAC;QACF,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YACnD,OAAO;gBACL,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;gBAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;aAC/B,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAoB,EACpB,OAA2B;IAE3B,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtC,qCAAqC;IACrC,GAAG,CAAC,IAAI,CACN,YAAY,EACZ,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAE7B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CACT,oBAAoB,OAAO,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,IAAI,UAAU,EAAE,CACzE,CAAC;YACJ,CAAC;YAED,+CAA+C;YAC/C,IACE,OAAO,CAAC,SAAS,KAAK,SAAS;gBAC/B,OAAO,CAAC,MAAM,KAAK,YAAY,EAC/B,CAAC;gBACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,QAAQ,GAAG,UAAU,EAAE,CAAC;gBAC/D,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;gBAClD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;gBAElD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,eAAe,CACzC,OAAO,CAAC,GAAG,EACX,OAAO,CAAC,MAAM,CACf,CAAC;gBAEF,MAAM,UAAU,GAAqB;oBACnC,EAAE,EAAE,UAAU,EAAE;oBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;oBACrB,aAAa,EAAE,IAAI;oBACnB,QAAQ;oBACR,SAAS,EAAE,WAAW;oBACtB,SAAS,EAAE,MAAM;oBACjB,SAAS,EAAE,YAAY;oBACvB,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,OAAO,CAAC,MAAM;oBACzB,WAAW,EAAE,OAAO;oBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,SAAS;oBACjB,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;oBAC/C,UAAU,EAAE,IAAI;iBACjB,CAAC;gBAEF,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;gBAE5B,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC;YAED,sEAAsE;YAEtE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC5D,oCAAoC;YACpC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CACF,CAAC;IAEF,kCAAkC;IAClC,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,KAAK,IAAI,EAAE;QACtC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC"}
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,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAO3C,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,eAAe,CAAC,CAkB1B;AAwCD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,eAAe,EACpB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
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, { db, debug: debug ?? false });
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":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-recorder/stdio-proxy",
3
- "version": "2.0.8",
3
+ "version": "2.0.13",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {