agent-recorder 2.0.12 → 2.0.14

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 (188) 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 +3 -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/commands/sessions.d.ts.map +1 -1
  15. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js +8 -5
  16. package/vendor/node_modules/@agent-recorder/cli/commands/sessions.js.map +1 -1
  17. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts +2 -51
  18. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.d.ts.map +1 -1
  19. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js +2 -113
  20. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.js.map +1 -1
  21. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js +1 -1
  22. package/vendor/node_modules/@agent-recorder/cli/config/claude-paths.test.js.map +1 -1
  23. package/vendor/node_modules/@agent-recorder/cli/index.js +10 -0
  24. package/vendor/node_modules/@agent-recorder/cli/index.js.map +1 -1
  25. package/vendor/node_modules/@agent-recorder/cli/package.json +1 -1
  26. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.d.ts.map +1 -1
  27. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js +1 -1
  28. package/vendor/node_modules/@agent-recorder/cli/tui/components/EventInspectPanel.js.map +1 -1
  29. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts +23 -0
  30. package/vendor/node_modules/@agent-recorder/core/claude-config.d.ts.map +1 -1
  31. package/vendor/node_modules/@agent-recorder/core/claude-config.js +50 -0
  32. package/vendor/node_modules/@agent-recorder/core/claude-config.js.map +1 -1
  33. package/vendor/node_modules/@agent-recorder/core/config.d.ts +10 -1
  34. package/vendor/node_modules/@agent-recorder/core/config.d.ts.map +1 -1
  35. package/vendor/node_modules/@agent-recorder/core/config.js +11 -1
  36. package/vendor/node_modules/@agent-recorder/core/config.js.map +1 -1
  37. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts +5 -0
  38. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.d.ts.map +1 -0
  39. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js +133 -0
  40. package/vendor/node_modules/@agent-recorder/core/db/events-complete.test.js.map +1 -0
  41. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts +23 -36
  42. package/vendor/node_modules/@agent-recorder/core/db/events.d.ts.map +1 -1
  43. package/vendor/node_modules/@agent-recorder/core/db/events.js +74 -3
  44. package/vendor/node_modules/@agent-recorder/core/db/events.js.map +1 -1
  45. package/vendor/node_modules/@agent-recorder/core/db/events.test.js +62 -1
  46. package/vendor/node_modules/@agent-recorder/core/db/events.test.js.map +1 -1
  47. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts +2 -1
  48. package/vendor/node_modules/@agent-recorder/core/db/index.d.ts.map +1 -1
  49. package/vendor/node_modules/@agent-recorder/core/db/index.js +2 -1
  50. package/vendor/node_modules/@agent-recorder/core/db/index.js.map +1 -1
  51. package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts +2 -5
  52. package/vendor/node_modules/@agent-recorder/core/db/sessions.d.ts.map +1 -1
  53. package/vendor/node_modules/@agent-recorder/core/db/sessions.js.map +1 -1
  54. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.d.ts +33 -0
  55. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.d.ts.map +1 -0
  56. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.js +88 -0
  57. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.js.map +1 -0
  58. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.d.ts +5 -0
  59. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.d.ts.map +1 -0
  60. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.js +167 -0
  61. package/vendor/node_modules/@agent-recorder/core/db/token-metrics.test.js.map +1 -0
  62. package/vendor/node_modules/@agent-recorder/core/index.d.ts +1 -1
  63. package/vendor/node_modules/@agent-recorder/core/index.d.ts.map +1 -1
  64. package/vendor/node_modules/@agent-recorder/core/index.js +1 -1
  65. package/vendor/node_modules/@agent-recorder/core/index.js.map +1 -1
  66. package/vendor/node_modules/@agent-recorder/core/migrations/007_add_correlation_id.sql +11 -0
  67. package/vendor/node_modules/@agent-recorder/core/migrations/007_add_token_columns.sql +19 -0
  68. package/vendor/node_modules/@agent-recorder/core/package.json +1 -1
  69. package/vendor/node_modules/@agent-recorder/core/types/index.d.ts +4 -2
  70. package/vendor/node_modules/@agent-recorder/core/types/index.d.ts.map +1 -1
  71. package/vendor/node_modules/@agent-recorder/core/types/index.js +3 -0
  72. package/vendor/node_modules/@agent-recorder/core/types/index.js.map +1 -1
  73. package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts +1 -0
  74. package/vendor/node_modules/@agent-recorder/core/utils/index.d.ts.map +1 -1
  75. package/vendor/node_modules/@agent-recorder/core/utils/index.js +1 -0
  76. package/vendor/node_modules/@agent-recorder/core/utils/index.js.map +1 -1
  77. package/vendor/node_modules/@agent-recorder/core/utils/redact.d.ts.map +1 -1
  78. package/vendor/node_modules/@agent-recorder/core/utils/redact.js +6 -3
  79. package/vendor/node_modules/@agent-recorder/core/utils/redact.js.map +1 -1
  80. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts +6 -0
  81. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.d.ts.map +1 -0
  82. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js +82 -0
  83. package/vendor/node_modules/@agent-recorder/core/utils/redact.test.js.map +1 -0
  84. package/vendor/node_modules/@agent-recorder/core/utils/tokens.d.ts +24 -0
  85. package/vendor/node_modules/@agent-recorder/core/utils/tokens.d.ts.map +1 -0
  86. package/vendor/node_modules/@agent-recorder/core/utils/tokens.js +31 -0
  87. package/vendor/node_modules/@agent-recorder/core/utils/tokens.js.map +1 -0
  88. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.d.ts +5 -0
  89. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.d.ts.map +1 -0
  90. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.js +80 -0
  91. package/vendor/node_modules/@agent-recorder/core/utils/tokens.test.js.map +1 -0
  92. package/vendor/node_modules/@agent-recorder/hooks/package.json +1 -1
  93. package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts +14 -0
  94. package/vendor/node_modules/@agent-recorder/service/daemon-context.d.ts.map +1 -0
  95. package/vendor/node_modules/@agent-recorder/service/daemon-context.js +15 -0
  96. package/vendor/node_modules/@agent-recorder/service/daemon-context.js.map +1 -0
  97. package/vendor/node_modules/@agent-recorder/service/index.d.ts +1 -8
  98. package/vendor/node_modules/@agent-recorder/service/index.d.ts.map +1 -1
  99. package/vendor/node_modules/@agent-recorder/service/index.js +15 -22
  100. package/vendor/node_modules/@agent-recorder/service/index.js.map +1 -1
  101. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts +27 -0
  102. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.d.ts.map +1 -1
  103. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js +141 -35
  104. package/vendor/node_modules/@agent-recorder/service/mcp/proxy.js.map +1 -1
  105. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts +4 -0
  106. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.d.ts.map +1 -1
  107. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js +56 -14
  108. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.js.map +1 -1
  109. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.d.ts +5 -0
  110. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.d.ts.map +1 -0
  111. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.js +143 -0
  112. package/vendor/node_modules/@agent-recorder/service/mcp/recorder.test.js.map +1 -0
  113. package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts +5 -31
  114. package/vendor/node_modules/@agent-recorder/service/mcp/types.d.ts.map +1 -1
  115. package/vendor/node_modules/@agent-recorder/service/mcp/types.js +3 -1
  116. package/vendor/node_modules/@agent-recorder/service/mcp/types.js.map +1 -1
  117. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts +5 -0
  118. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.d.ts.map +1 -0
  119. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js +66 -0
  120. package/vendor/node_modules/@agent-recorder/service/mcp/upstreams-cache.test.js.map +1 -0
  121. package/vendor/node_modules/@agent-recorder/service/package.json +1 -1
  122. package/vendor/node_modules/@agent-recorder/service/routes/events.d.ts.map +1 -1
  123. package/vendor/node_modules/@agent-recorder/service/routes/events.js +42 -1
  124. package/vendor/node_modules/@agent-recorder/service/routes/events.js.map +1 -1
  125. package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts +6 -1
  126. package/vendor/node_modules/@agent-recorder/service/routes/health.d.ts.map +1 -1
  127. package/vendor/node_modules/@agent-recorder/service/routes/health.js +5 -6
  128. package/vendor/node_modules/@agent-recorder/service/routes/health.js.map +1 -1
  129. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts +20 -0
  130. package/vendor/node_modules/@agent-recorder/service/routes/hooks.d.ts.map +1 -1
  131. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js +403 -49
  132. package/vendor/node_modules/@agent-recorder/service/routes/hooks.js.map +1 -1
  133. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts +9 -0
  134. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.d.ts.map +1 -0
  135. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js +406 -0
  136. package/vendor/node_modules/@agent-recorder/service/routes/hooks.test.js.map +1 -0
  137. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts +8 -0
  138. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.d.ts.map +1 -0
  139. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js +65 -0
  140. package/vendor/node_modules/@agent-recorder/service/routes/isToolResponseError.test.js.map +1 -0
  141. package/vendor/node_modules/@agent-recorder/service/routes/sessions.d.ts.map +1 -1
  142. package/vendor/node_modules/@agent-recorder/service/routes/sessions.js +19 -1
  143. package/vendor/node_modules/@agent-recorder/service/routes/sessions.js.map +1 -1
  144. package/vendor/node_modules/@agent-recorder/service/routes/stdio.d.ts.map +1 -1
  145. package/vendor/node_modules/@agent-recorder/service/routes/stdio.js +20 -1
  146. package/vendor/node_modules/@agent-recorder/service/routes/stdio.js.map +1 -1
  147. package/vendor/node_modules/@agent-recorder/service/routes/tokens.d.ts +12 -0
  148. package/vendor/node_modules/@agent-recorder/service/routes/tokens.d.ts.map +1 -0
  149. package/vendor/node_modules/@agent-recorder/service/routes/tokens.js +18 -0
  150. package/vendor/node_modules/@agent-recorder/service/routes/tokens.js.map +1 -0
  151. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.d.ts +5 -0
  152. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.d.ts.map +1 -0
  153. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.js +88 -0
  154. package/vendor/node_modules/@agent-recorder/service/routes/tokens.test.js.map +1 -0
  155. package/vendor/node_modules/@agent-recorder/service/server.d.ts +4 -0
  156. package/vendor/node_modules/@agent-recorder/service/server.d.ts.map +1 -1
  157. package/vendor/node_modules/@agent-recorder/service/server.js +33 -3
  158. package/vendor/node_modules/@agent-recorder/service/server.js.map +1 -1
  159. package/vendor/node_modules/@agent-recorder/stdio-proxy/package.json +1 -1
  160. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts +3 -19
  161. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.d.ts.map +1 -1
  162. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js +2 -1
  163. package/vendor/node_modules/@agent-recorder/stdio-proxy/types.js.map +1 -1
  164. package/vendor/node_modules/@agent-recorder/{core/types → types}/events.d.ts +9 -0
  165. package/vendor/node_modules/@agent-recorder/types/events.d.ts.map +1 -0
  166. package/vendor/node_modules/@agent-recorder/types/events.js +9 -0
  167. package/vendor/node_modules/@agent-recorder/types/events.js.map +1 -0
  168. package/vendor/node_modules/@agent-recorder/types/index.d.ts +12 -0
  169. package/vendor/node_modules/@agent-recorder/types/index.d.ts.map +1 -0
  170. package/vendor/node_modules/@agent-recorder/types/index.js +9 -0
  171. package/vendor/node_modules/@agent-recorder/types/index.js.map +1 -0
  172. package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts +35 -0
  173. package/vendor/node_modules/@agent-recorder/types/jsonrpc.d.ts.map +1 -0
  174. package/vendor/node_modules/@agent-recorder/types/jsonrpc.js +6 -0
  175. package/vendor/node_modules/@agent-recorder/types/jsonrpc.js.map +1 -0
  176. package/vendor/node_modules/@agent-recorder/types/package.json +12 -0
  177. package/vendor/node_modules/@agent-recorder/{core/types → types}/session.d.ts +6 -0
  178. package/vendor/node_modules/@agent-recorder/types/session.d.ts.map +1 -0
  179. package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js.map +1 -1
  180. package/vendor/node_modules/@agent-recorder/types/storage.d.ts +80 -0
  181. package/vendor/node_modules/@agent-recorder/types/storage.d.ts.map +1 -0
  182. package/vendor/node_modules/@agent-recorder/types/storage.js +9 -0
  183. package/vendor/node_modules/@agent-recorder/types/storage.js.map +1 -0
  184. package/vendor/node_modules/@agent-recorder/core/types/events.d.ts.map +0 -1
  185. package/vendor/node_modules/@agent-recorder/core/types/events.js +0 -6
  186. package/vendor/node_modules/@agent-recorder/core/types/events.js.map +0 -1
  187. package/vendor/node_modules/@agent-recorder/core/types/session.d.ts.map +0 -1
  188. /package/vendor/node_modules/@agent-recorder/{core/types → types}/session.js +0 -0
@@ -3,9 +3,54 @@
3
3
  *
4
4
  * This endpoint is called by the agent-recorder-hook handler script
5
5
  * which is configured in Claude Code's .claude/settings.json.
6
+ *
7
+ * Implements hierarchical event tracking:
8
+ * - SessionStart → creates agent_call event (root of the tree)
9
+ * - PreToolUse → creates event with status "running" (captures start time)
10
+ * - PostToolUse → completes the running event with output and end time
11
+ * - SessionEnd → ends the agent_call event
6
12
  */
7
13
  import { randomUUID } from "node:crypto";
8
- import { insertEvent, createSession, getSessionById, allocateSequence, } from "@agent-recorder/core";
14
+ import { insertEvent, completeEvent, findRunningEvent, endSession, createSession, getSessionById, allocateSequence, redactAndTruncate, redactJson, deriveErrorCategory, estimateSerializedTokens, } from "@agent-recorder/core";
15
+ /** Max age for session contexts before TTL eviction (1 hour) */
16
+ const SESSION_CONTEXT_TTL_MS = 60 * 60 * 1000;
17
+ /** Maximum number of tracked sessions to prevent unbounded growth */
18
+ const SESSION_CONTEXT_MAX_SIZE = 500;
19
+ /** Fastify JSON schema for hook event validation (module-level constant) */
20
+ const hookEventSchema = {
21
+ body: {
22
+ type: "object",
23
+ required: ["hook_type", "session_id"],
24
+ properties: {
25
+ hook_type: { type: "string" },
26
+ session_id: { type: "string" },
27
+ transcript_path: { type: "string" },
28
+ tool_name: { type: "string" },
29
+ tool_input: { type: "object" },
30
+ // Empty schema: tool responses are arbitrary (strings, objects, arrays, etc.)
31
+ // so we intentionally accept any JSON value here.
32
+ tool_response: {},
33
+ subagent_type: { type: "string" },
34
+ message: { type: "string" },
35
+ start_source: { type: "string" },
36
+ end_reason: { type: "string" },
37
+ statistics: { type: "object" },
38
+ },
39
+ // No additionalProperties: false here — hook payloads must be forward-
40
+ // compatible. If Claude Code ships new fields (e.g. correlation_id),
41
+ // rejecting them would silently drop the entire payload via the
42
+ // fail-open error handler, with no recording and no warning.
43
+ // The required-fields check (["hook_type", "session_id"]) provides
44
+ // the meaningful validation.
45
+ },
46
+ };
47
+ /** Get the current parent event ID from the context stack */
48
+ function getCurrentParentId(ctx) {
49
+ if (ctx.parentStack.length > 0) {
50
+ return ctx.parentStack[ctx.parentStack.length - 1].id;
51
+ }
52
+ return ctx.agentCallEventId;
53
+ }
9
54
  /** Truncate a string for logging */
10
55
  function truncateForLog(value, maxLength = 100) {
11
56
  if (value === null || value === undefined)
@@ -15,24 +60,52 @@ function truncateForLog(value, maxLength = 100) {
15
60
  return str;
16
61
  return str.slice(0, maxLength) + "...";
17
62
  }
18
- /** Format tool call for logging */
19
- function formatToolCallLog(toolName, upstreamKey, input, output) {
63
+ /** Format tool call for logging, with redaction applied to prevent
64
+ * sensitive keys from appearing in daemon logs. */
65
+ function formatToolCallLog(toolName, upstreamKey, input, output, redactKeys) {
20
66
  const server = upstreamKey ?? "builtin";
21
- const inputSummary = input ? truncateForLog(input, 150) : "(no input)";
22
- const outputSummary = output ? truncateForLog(output, 150) : "(no output)";
67
+ // Use redactJson (returns object) instead of redactAndTruncate (returns string)
68
+ // to avoid double-serialization when truncateForLog calls JSON.stringify.
69
+ const inputSummary = input
70
+ ? truncateForLog(redactKeys.length > 0 ? redactJson(input, redactKeys) : input, 150)
71
+ : "(no input)";
72
+ const outputSummary = output
73
+ ? truncateForLog(redactKeys.length > 0 ? redactJson(output, redactKeys) : output, 150)
74
+ : "(no output)";
23
75
  return `[${server}] ${toolName}\n Input: ${inputSummary}\n Output: ${outputSummary}`;
24
76
  }
25
77
  /** Get or create a session by ID */
26
78
  function getOrCreateSession(db, sessionId) {
27
- // Check if session exists
28
79
  const existing = getSessionById(db, sessionId);
29
80
  if (existing) {
30
81
  return existing;
31
82
  }
32
- // Create new session with the provided ID
33
83
  const now = new Date().toISOString();
34
84
  return createSession(db, sessionId, now);
35
85
  }
86
+ /**
87
+ * Detect if a tool response indicates an error.
88
+ * Only uses the MCP-standard `isError: true` field for status decisions.
89
+ *
90
+ * Previous versions also checked for a top-level `error` field (JSON-RPC
91
+ * style), but this produced false positives for tools that use `error` as
92
+ * a regular output field (e.g. `{ error: "none" }`). The `error` field is
93
+ * now treated as informational metadata only — it is still captured in
94
+ * outputJson for display but does not flip event status to "error".
95
+ *
96
+ * @internal Exported for unit testing only.
97
+ */
98
+ export function isToolResponseError(response) {
99
+ if (response === null || response === undefined)
100
+ return false;
101
+ if (typeof response !== "object" || Array.isArray(response))
102
+ return false;
103
+ const obj = response;
104
+ // MCP tool result: { isError: true } — the only reliable signal
105
+ if (obj.isError === true)
106
+ return true;
107
+ return false;
108
+ }
36
109
  /** Map Claude Code tool names to our event model */
37
110
  function parseToolName(toolName) {
38
111
  // MCP tool names are prefixed with "mcp__<server>__<tool>"
@@ -48,8 +121,8 @@ function parseToolName(toolName) {
48
121
  };
49
122
  }
50
123
  }
51
- // Task tool = subagent call
52
- if (toolName === "Task") {
124
+ // Agent tool = subagent call
125
+ if (toolName === "Task" || toolName === "Agent") {
53
126
  return {
54
127
  eventType: "subagent_call",
55
128
  cleanName: toolName,
@@ -72,9 +145,90 @@ function parseToolName(toolName) {
72
145
  };
73
146
  }
74
147
  export async function registerHooksRoutes(app, options) {
75
- const { db, debug = false } = options;
148
+ const { db, debug = false, redactKeys = [] } = options;
149
+ // Session contexts are scoped to this registration — not a module-level global.
150
+ // Each call to registerHooksRoutes gets its own isolated map.
151
+ //
152
+ // Note: restart recovery is not supported. If the daemon restarts while a
153
+ // session is active, the in-memory context is lost. Subsequent hooks for
154
+ // the same session_id will create a fresh context with no parent chain,
155
+ // and tool events will appear as disconnected root events. The "before
156
+ // SessionStart" warning below covers this case.
157
+ const sessionContexts = new Map();
158
+ /**
159
+ * Complete orphaned running events when a session context is evicted.
160
+ * If SessionEnd never fires (process killed, crash), running events
161
+ * would remain in "running" status indefinitely. This sweeps them
162
+ * with status "error" so the timeline reflects the abnormal termination.
163
+ */
164
+ function completeOrphanedEvents(ctx) {
165
+ const now = new Date().toISOString();
166
+ // Complete any events remaining on the parent stack
167
+ for (const entry of ctx.parentStack) {
168
+ completeEvent(db, entry.id, "error", now);
169
+ }
170
+ // Complete the root agent_call
171
+ if (ctx.agentCallEventId) {
172
+ completeEvent(db, ctx.agentCallEventId, "error", now);
173
+ }
174
+ }
175
+ /** Evict stale session contexts that exceed TTL.
176
+ * Called periodically via setInterval to prevent stale entries from
177
+ * accumulating during idle periods. Orphaned running events in the DB
178
+ * are completed with "error" status before the context is discarded. */
179
+ function evictStaleContexts() {
180
+ const now = Date.now();
181
+ for (const [id, ctx] of sessionContexts) {
182
+ if (now - ctx.lastActivityAt > SESSION_CONTEXT_TTL_MS) {
183
+ completeOrphanedEvents(ctx);
184
+ sessionContexts.delete(id);
185
+ }
186
+ }
187
+ // Hard cap: if still over max, remove oldest entries
188
+ if (sessionContexts.size > SESSION_CONTEXT_MAX_SIZE) {
189
+ const entries = [...sessionContexts.entries()].sort((a, b) => a[1].lastActivityAt - b[1].lastActivityAt);
190
+ const toRemove = entries.length - SESSION_CONTEXT_MAX_SIZE;
191
+ for (let i = 0; i < toRemove; i++) {
192
+ const entry = entries[i];
193
+ completeOrphanedEvents(entry[1]);
194
+ sessionContexts.delete(entry[0]);
195
+ }
196
+ }
197
+ }
198
+ function getSessionContext(sessionId) {
199
+ let ctx = sessionContexts.get(sessionId);
200
+ if (!ctx) {
201
+ ctx = {
202
+ agentCallEventId: null,
203
+ parentStack: [],
204
+ lastActivityAt: Date.now(),
205
+ };
206
+ sessionContexts.set(sessionId, ctx);
207
+ // Evict if cap exceeded — prevents unbounded growth between
208
+ // periodic interval ticks under high session creation rates.
209
+ if (sessionContexts.size > SESSION_CONTEXT_MAX_SIZE) {
210
+ evictStaleContexts();
211
+ }
212
+ }
213
+ else {
214
+ ctx.lastActivityAt = Date.now();
215
+ }
216
+ return ctx;
217
+ }
218
+ // Periodic eviction prevents stale contexts from accumulating when
219
+ // the daemon is idle (no new sessions triggering on-demand eviction).
220
+ const evictionInterval = setInterval(evictStaleContexts, SESSION_CONTEXT_TTL_MS / 2);
221
+ app.addHook("onClose", () => {
222
+ clearInterval(evictionInterval);
223
+ // On graceful shutdown, complete any orphaned running events so they
224
+ // don't remain in "running" status permanently in the DB.
225
+ for (const ctx of sessionContexts.values()) {
226
+ completeOrphanedEvents(ctx);
227
+ }
228
+ sessionContexts.clear();
229
+ });
76
230
  // Receive hook events from Claude Code
77
- app.post("/api/hooks", async (request, reply) => {
231
+ app.post("/api/hooks", { schema: hookEventSchema }, async (request, reply) => {
78
232
  const startTime = Date.now();
79
233
  try {
80
234
  const payload = request.body;
@@ -83,87 +237,287 @@ export async function registerHooksRoutes(app, options) {
83
237
  }
84
238
  // Ensure session exists
85
239
  const session = getOrCreateSession(db, payload.session_id);
240
+ const ctx = getSessionContext(payload.session_id);
241
+ // Warn if a tool/end hook arrives before SessionStart.
242
+ // The session row exists (getOrCreateSession handles that) but
243
+ // ctx.agentCallEventId will be null, so tool events will have no
244
+ // parent and appear as disconnected root events.
245
+ if (!ctx.agentCallEventId &&
246
+ payload.hook_type !== "SessionStart" &&
247
+ payload.hook_type !== "Stop") {
248
+ console.warn(`[hooks] ${payload.hook_type} received for session ${payload.session_id} before SessionStart — tool events will lack parent context`);
249
+ }
86
250
  // Handle different hook types
87
251
  switch (payload.hook_type) {
88
- case "PreToolUse": {
89
- // We record on PostToolUse to get the response, but we could
90
- // optionally record PreToolUse for "started" events
252
+ case "SessionStart": {
253
+ // If context already has an agent_call (double SessionStart, e.g.
254
+ // daemon restart where old context wasn't evicted), complete the
255
+ // old event so it doesn't stay "running" indefinitely in the DB.
256
+ if (ctx.agentCallEventId) {
257
+ completeOrphanedEvents(ctx);
258
+ ctx.parentStack = [];
259
+ if (debug) {
260
+ console.warn(`[hooks] SessionStart: completing orphaned agent_call ${ctx.agentCallEventId} from previous session start`);
261
+ }
262
+ }
263
+ // Create root agent_call event for this session
264
+ const sequence = allocateSequence(db, session.id);
265
+ const now = new Date().toISOString();
266
+ const agentCallId = randomUUID();
267
+ const eventInput = {
268
+ id: agentCallId,
269
+ sessionId: session.id,
270
+ parentEventId: null,
271
+ sequence,
272
+ eventType: "agent_call",
273
+ agentRole: "main",
274
+ agentName: "claude-code",
275
+ startedAt: now,
276
+ status: "running",
277
+ inputJson: payload.start_source
278
+ ? JSON.stringify({ source: payload.start_source })
279
+ : null,
280
+ };
281
+ insertEvent(db, eventInput);
282
+ ctx.agentCallEventId = agentCallId;
91
283
  if (debug) {
92
- console.log(`[hooks] PreToolUse: ${payload.tool_name} (not recording yet)`);
284
+ console.log(`[hooks] SessionStart: created agent_call ${agentCallId} (${payload.start_source ?? "unknown"})`);
93
285
  }
94
286
  break;
95
287
  }
96
- case "PostToolUse": {
288
+ case "PreToolUse": {
97
289
  if (!payload.tool_name) {
98
- return reply.code(400).send({ error: "Missing tool_name" });
290
+ // Fail open never block Claude with a 400
291
+ console.warn(`[hooks] PreToolUse missing tool_name for session ${payload.session_id}`);
292
+ return reply
293
+ .code(200)
294
+ .send({ ok: true, warning: "missing_tool_name" });
99
295
  }
100
296
  const { eventType, cleanName, upstreamKey } = parseToolName(payload.tool_name);
101
297
  const now = new Date().toISOString();
102
298
  const sequence = allocateSequence(db, session.id);
299
+ const eventId = randomUUID();
103
300
  // Determine MCP method from tool input if available
104
301
  let mcpMethod = "tools/call";
105
302
  if (payload.tool_input?.method) {
106
303
  mcpMethod = String(payload.tool_input.method);
107
304
  }
305
+ const parentId = getCurrentParentId(ctx);
306
+ const inputJson = payload.tool_input
307
+ ? redactAndTruncate(payload.tool_input, redactKeys)
308
+ : null;
108
309
  const eventInput = {
109
- id: randomUUID(),
310
+ id: eventId,
110
311
  sessionId: session.id,
111
- parentEventId: null,
312
+ parentEventId: parentId,
112
313
  sequence,
113
314
  eventType,
114
315
  agentRole: "main",
115
316
  agentName: "claude-code",
116
317
  toolName: cleanName,
117
318
  mcpMethod,
118
- upstreamKey: upstreamKey,
319
+ upstreamKey,
320
+ // correlationId: not yet populated — Claude Code's hook API
321
+ // does not expose a correlation ID. The DB column (migration 007)
322
+ // and findRunningEvent support are ready; set this field once
323
+ // the hook payload includes a correlation identifier.
119
324
  startedAt: now,
120
- endedAt: now,
121
- status: "success", // PostToolUse only fires on success
122
- inputJson: payload.tool_input
123
- ? JSON.stringify(payload.tool_input)
124
- : null,
125
- outputJson: payload.tool_response
126
- ? JSON.stringify(payload.tool_response)
127
- : null,
325
+ status: "running",
326
+ inputJson,
327
+ inputTokens: inputJson != null ? estimateSerializedTokens(inputJson) : null,
128
328
  };
129
- const event = insertEvent(db, eventInput);
130
- // Always log tool calls with details (useful for debugging)
131
- const isMcpTool = upstreamKey && upstreamKey !== "builtin";
132
- if (isMcpTool || debug) {
133
- console.log(`[hooks] ${formatToolCallLog(cleanName, upstreamKey, payload.tool_input, payload.tool_response)}`);
329
+ insertEvent(db, eventInput);
330
+ // Push subagent/skill calls onto the parent stack
331
+ if (eventType === "subagent_call" || eventType === "skill_call") {
332
+ ctx.parentStack.push({ id: eventId, toolName: cleanName });
134
333
  }
135
334
  if (debug) {
136
- console.log(`[hooks] Recorded ${eventType}: ${cleanName} (event ${event.id})`);
335
+ console.log(`[hooks] PreToolUse: created ${eventType} ${cleanName} (${eventId}, parent: ${parentId ?? "root"})`);
137
336
  }
138
337
  break;
139
338
  }
140
- case "Stop": {
141
- // Agent finished - could record session end metadata
142
- if (debug) {
143
- console.log(`[hooks] Stop: session ${payload.session_id}`);
339
+ case "PostToolUse": {
340
+ if (!payload.tool_name) {
341
+ // Fail open — never block Claude with a 400
342
+ console.warn(`[hooks] PostToolUse missing tool_name for session ${payload.session_id}`);
343
+ return reply
344
+ .code(200)
345
+ .send({ ok: true, warning: "missing_tool_name" });
346
+ }
347
+ const { eventType, cleanName, upstreamKey } = parseToolName(payload.tool_name);
348
+ const now = new Date().toISOString();
349
+ // Determine status from tool response
350
+ const responseIsError = isToolResponseError(payload.tool_response);
351
+ const eventStatus = responseIsError
352
+ ? "error"
353
+ : "success";
354
+ const outputJsonStr = payload.tool_response
355
+ ? redactAndTruncate(payload.tool_response, redactKeys)
356
+ : null;
357
+ const errorCategory = responseIsError
358
+ ? deriveErrorCategory(eventStatus, outputJsonStr)
359
+ : null;
360
+ // Try to find the matching "running" event from PreToolUse.
361
+ // Invariant: both PreToolUse and PostToolUse receive the same
362
+ // payload.tool_name, so parseToolName produces the same cleanName
363
+ // in both hooks. This holds for MCP namespaced tools too
364
+ // (e.g. "mcp__fs__read_file" → cleanName "read_file").
365
+ // Note: findRunningEvent returns the most recent match by toolName,
366
+ // which may be incorrect if parallel tools share the same name.
367
+ // See packages/core/src/db/events.ts for the caveat documentation.
368
+ const runningEvent = findRunningEvent(db, session.id, cleanName);
369
+ const outputTokens = outputJsonStr != null
370
+ ? estimateSerializedTokens(outputJsonStr)
371
+ : null;
372
+ if (runningEvent) {
373
+ // Complete the existing running event
374
+ const completed = completeEvent(db, runningEvent.id, eventStatus, now, outputJsonStr, errorCategory, outputTokens);
375
+ if (!completed && debug) {
376
+ console.warn(`[hooks] PostToolUse: completeEvent returned null for ${runningEvent.id} — already completed?`);
377
+ }
378
+ // Pop from parent stack if still present. SubagentStop may
379
+ // have already removed this entry; the splice is a safe no-op
380
+ // if the entry is not found.
381
+ if (eventType === "subagent_call" || eventType === "skill_call") {
382
+ for (let i = ctx.parentStack.length - 1; i >= 0; i--) {
383
+ if (ctx.parentStack[i].id === runningEvent.id) {
384
+ ctx.parentStack.splice(i, 1);
385
+ break;
386
+ }
387
+ }
388
+ }
389
+ if (debug) {
390
+ console.log(`[hooks] PostToolUse: completed ${eventType} ${cleanName} (${runningEvent.id}, status: ${eventStatus})`);
391
+ }
392
+ }
393
+ else {
394
+ // No matching PreToolUse — create a standalone completed event (backwards compat)
395
+ const sequence = allocateSequence(db, session.id);
396
+ const parentId = getCurrentParentId(ctx);
397
+ let mcpMethod = "tools/call";
398
+ if (payload.tool_input?.method) {
399
+ mcpMethod = String(payload.tool_input.method);
400
+ }
401
+ const standaloneInputJson = payload.tool_input
402
+ ? redactAndTruncate(payload.tool_input, redactKeys)
403
+ : null;
404
+ const eventInput = {
405
+ id: randomUUID(),
406
+ sessionId: session.id,
407
+ parentEventId: parentId,
408
+ sequence,
409
+ eventType,
410
+ agentRole: "main",
411
+ agentName: "claude-code",
412
+ toolName: cleanName,
413
+ mcpMethod,
414
+ upstreamKey,
415
+ startedAt: now,
416
+ endedAt: now,
417
+ status: eventStatus,
418
+ inputJson: standaloneInputJson,
419
+ outputJson: outputJsonStr,
420
+ errorCategory,
421
+ inputTokens: standaloneInputJson != null
422
+ ? estimateSerializedTokens(standaloneInputJson)
423
+ : null,
424
+ outputTokens,
425
+ };
426
+ insertEvent(db, eventInput);
427
+ if (debug) {
428
+ console.log(`[hooks] PostToolUse: standalone ${eventType} ${cleanName} (no matching PreToolUse, status: ${eventStatus})`);
429
+ }
430
+ }
431
+ // Always log MCP tool calls with details
432
+ const isMcpTool = upstreamKey && upstreamKey !== "builtin";
433
+ if (isMcpTool || debug) {
434
+ console.log(`[hooks] ${formatToolCallLog(cleanName, upstreamKey, payload.tool_input, payload.tool_response, redactKeys)}`);
144
435
  }
145
436
  break;
146
437
  }
147
- case "SubagentStop": {
148
- // Subagent finished - could update parent event
149
- if (debug) {
150
- console.log(`[hooks] SubagentStop: ${payload.subagent_type ?? "unknown"}`);
438
+ case "Stop": {
439
+ // Stop fires for both normal completions and user cancellations.
440
+ // It does not carry an end_reason, so we cannot determine the
441
+ // actual outcome here. SessionEnd always follows Stop and has the
442
+ // authoritative end_reason, so we defer agent_call completion to
443
+ // SessionEnd to avoid status inconsistency (e.g. "cancelled"
444
+ // agent_call with "completed" session).
445
+ //
446
+ // If SessionEnd never fires (e.g. Claude Code crash), running
447
+ // events and parent stack entries remain until TTL eviction,
448
+ // at which point completeOrphanedEvents() closes them with
449
+ // status "error". SessionEnd is the authoritative cleanup path.
450
+ if (debug && ctx.agentCallEventId) {
451
+ console.log(`[hooks] Stop: agent_call ${ctx.agentCallEventId} completion deferred to SessionEnd`);
151
452
  }
152
453
  break;
153
454
  }
154
- case "SessionStart": {
155
- if (debug) {
156
- console.log(`[hooks] SessionStart: ${payload.session_id} (${payload.start_source ?? "unknown"})`);
455
+ case "SubagentStop": {
456
+ // Pop the matching subagent from the parent stack so that
457
+ // subsequent tool calls are no longer nested under it.
458
+ // Does NOT complete the event — PostToolUse handles completion
459
+ // with the actual output and error status from the tool response.
460
+ //
461
+ // Known limitation: matching is by tool name (e.g. "Agent").
462
+ // If two nested subagents share the same name, this pops the
463
+ // most-recent match, which may be the inner one when the outer
464
+ // one's SubagentStop fires first. Claude Code's hook API does
465
+ // not expose a correlation ID, so full correctness for this
466
+ // edge case is not achievable. See also the findRunningEvent
467
+ // caveat in packages/core/src/db/events.ts.
468
+ if (ctx.parentStack.length > 0) {
469
+ let matchIdx = ctx.parentStack.length - 1;
470
+ if (payload.tool_name) {
471
+ const { cleanName } = parseToolName(payload.tool_name);
472
+ for (let i = ctx.parentStack.length - 1; i >= 0; i--) {
473
+ if (ctx.parentStack[i].toolName === cleanName) {
474
+ matchIdx = i;
475
+ break;
476
+ }
477
+ }
478
+ }
479
+ const matchedEntry = ctx.parentStack[matchIdx];
480
+ ctx.parentStack.splice(matchIdx, 1);
481
+ if (debug) {
482
+ console.log(`[hooks] SubagentStop: popped ${matchedEntry.id} from parent stack (${payload.subagent_type ?? "unknown"}), completion deferred to PostToolUse`);
483
+ }
157
484
  }
158
485
  break;
159
486
  }
160
487
  case "SessionEnd": {
161
- if (debug) {
162
- console.log(`[hooks] SessionEnd: ${payload.session_id} (${payload.end_reason ?? "unknown"})`);
163
- if (payload.statistics) {
164
- console.log(`[hooks] Statistics:`, payload.statistics);
488
+ const now = new Date().toISOString();
489
+ // Map end_reason to event and session status.
490
+ // Claude Code may send "completed", "error", or "cancelled" (Ctrl-C).
491
+ const eventStatus = payload.end_reason === "error"
492
+ ? "error"
493
+ : payload.end_reason === "cancelled"
494
+ ? "cancelled"
495
+ : "success";
496
+ const sessionStatus = payload.end_reason === "error"
497
+ ? "error"
498
+ : payload.end_reason === "cancelled"
499
+ ? "cancelled"
500
+ : "completed";
501
+ // Complete any events still on the parent stack (interrupted
502
+ // subagents/skills that never received PostToolUse).
503
+ for (const entry of ctx.parentStack) {
504
+ completeEvent(db, entry.id, eventStatus, now);
505
+ }
506
+ ctx.parentStack.length = 0;
507
+ // End the root agent_call and clean up
508
+ if (ctx.agentCallEventId) {
509
+ completeEvent(db, ctx.agentCallEventId, eventStatus, now);
510
+ if (debug) {
511
+ console.log(`[hooks] SessionEnd: ${payload.session_id} (${payload.end_reason ?? "unknown"})`);
512
+ if (payload.statistics) {
513
+ console.log(`[hooks] Statistics:`, payload.statistics);
514
+ }
165
515
  }
166
516
  }
517
+ // End the session in the database
518
+ endSession(db, session.id, now, sessionStatus);
519
+ // Clean up context
520
+ sessionContexts.delete(payload.session_id);
167
521
  break;
168
522
  }
169
523
  default: {
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/routes/hooks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EACL,WAAW,EACX,aAAa,EACb,cAAc,EACd,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AA0B9B,oCAAoC;AACpC,SAAS,cAAc,CAAC,KAAc,EAAE,SAAS,GAAG,GAAG;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtE,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;AACzC,CAAC;AAED,mCAAmC;AACnC,SAAS,iBAAiB,CACxB,QAAgB,EAChB,WAA0B,EAC1B,KAA0C,EAC1C,MAA2B;IAE3B,MAAM,MAAM,GAAG,WAAW,IAAI,SAAS,CAAC;IACxC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;IACvE,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IAE3E,OAAO,IAAI,MAAM,KAAK,QAAQ,eAAe,YAAY,eAAe,aAAa,EAAE,CAAC;AAC1F,CAAC;AAED,oCAAoC;AACpC,SAAS,kBAAkB,CAAC,EAAqB,EAAE,SAAiB;IAClE,0BAA0B;IAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAC/C,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,0CAA0C;IAC1C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,aAAa,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,oDAAoD;AACpD,SAAS,aAAa,CAAC,QAAgB;IAKrC,2DAA2D;IAC3D,IAAI,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,SAAS,EAAE,WAAW,IAAI,QAAQ;gBAClC,WAAW,EAAE,SAAS,IAAI,IAAI;aAC/B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,OAAO;YACL,SAAS,EAAE,eAAe;YAC1B,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,IAAI;SAClB,CAAC;IACJ,CAAC;IAED,6DAA6D;IAC7D,OAAO;QACL,SAAS,EAAE,WAAW;QACtB,SAAS,EAAE,QAAQ;QACnB,WAAW,EAAE,SAAS;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAoB,EACpB,OAA2B;IAE3B,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IAEtC,uCAAuC;IACvC,GAAG,CAAC,IAAI,CAA6B,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAE7B,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CACT,oBAAoB,OAAO,CAAC,SAAS,gBAAgB,OAAO,CAAC,UAAU,EAAE,CAC1E,CAAC;YACJ,CAAC;YAED,wBAAwB;YACxB,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAE3D,8BAA8B;YAC9B,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC1B,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,6DAA6D;oBAC7D,oDAAoD;oBACpD,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CACT,uBAAuB,OAAO,CAAC,SAAS,sBAAsB,CAC/D,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,aAAa,CAAC,CAAC,CAAC;oBACnB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;wBACvB,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;oBAC9D,CAAC;oBAED,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,aAAa,CACzD,OAAO,CAAC,SAAS,CAClB,CAAC;oBACF,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;oBACrC,MAAM,QAAQ,GAAG,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;oBAElD,oDAAoD;oBACpD,IAAI,SAAS,GAAG,YAAY,CAAC;oBAC7B,IAAI,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;wBAC/B,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;oBAChD,CAAC;oBAED,MAAM,UAAU,GAAqB;wBACnC,EAAE,EAAE,UAAU,EAAE;wBAChB,SAAS,EAAE,OAAO,CAAC,EAAE;wBACrB,aAAa,EAAE,IAAI;wBACnB,QAAQ;wBACR,SAAS;wBACT,SAAS,EAAE,MAAM;wBACjB,SAAS,EAAE,aAAa;wBACxB,QAAQ,EAAE,SAAS;wBACnB,SAAS;wBACT,WAAW,EAAE,WAAW;wBACxB,SAAS,EAAE,GAAG;wBACd,OAAO,EAAE,GAAG;wBACZ,MAAM,EAAE,SAAS,EAAE,oCAAoC;wBACvD,SAAS,EAAE,OAAO,CAAC,UAAU;4BAC3B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC;4BACpC,CAAC,CAAC,IAAI;wBACR,UAAU,EAAE,OAAO,CAAC,aAAa;4BAC/B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;4BACvC,CAAC,CAAC,IAAI;qBACT,CAAC;oBAEF,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;oBAE1C,4DAA4D;oBAC5D,MAAM,SAAS,GAAG,WAAW,IAAI,WAAW,KAAK,SAAS,CAAC;oBAC3D,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;wBACvB,OAAO,CAAC,GAAG,CACT,WAAW,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE,CAClG,CAAC;oBACJ,CAAC;oBAED,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CACT,oBAAoB,SAAS,KAAK,SAAS,WAAW,KAAK,CAAC,EAAE,GAAG,CAClE,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,MAAM,CAAC,CAAC,CAAC;oBACZ,qDAAqD;oBACrD,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC7D,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,gDAAgD;oBAChD,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CACT,yBAAyB,OAAO,CAAC,aAAa,IAAI,SAAS,EAAE,CAC9D,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,cAAc,CAAC,CAAC,CAAC;oBACpB,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CACT,yBAAyB,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,YAAY,IAAI,SAAS,GAAG,CACrF,CAAC;oBACJ,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,KAAK,YAAY,CAAC,CAAC,CAAC;oBAClB,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CACT,uBAAuB,OAAO,CAAC,UAAU,KAAK,OAAO,CAAC,UAAU,IAAI,SAAS,GAAG,CACjF,CAAC;wBACF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;4BACvB,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;wBACzD,CAAC;oBACH,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,CAAC,GAAG,CAAC,8BAA8B,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;oBACjE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACvC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,IAAI,CAAC,CAAC;YACnD,CAAC;YAED,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,sCAAsC,EAAE,KAAK,CAAC,CAAC;YAC7D,6CAA6C;YAC7C,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,CAAC,CAAC;IAEH,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":"hooks.js","sourceRoot":"","sources":["../../src/routes/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
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
+ export {};
9
+ //# sourceMappingURL=hooks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.test.d.ts","sourceRoot":"","sources":["../../src/routes/hooks.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}