@viewportai/daemon 0.1.0

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 (350) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +157 -0
  3. package/bin/vpd.js +3 -0
  4. package/dist/adapters/claude.d.ts +119 -0
  5. package/dist/adapters/claude.d.ts.map +1 -0
  6. package/dist/adapters/claude.js +621 -0
  7. package/dist/adapters/claude.js.map +1 -0
  8. package/dist/adapters/codex-event-normalizers.d.ts +10 -0
  9. package/dist/adapters/codex-event-normalizers.d.ts.map +1 -0
  10. package/dist/adapters/codex-event-normalizers.js +208 -0
  11. package/dist/adapters/codex-event-normalizers.js.map +1 -0
  12. package/dist/adapters/codex-sdk-loader.d.ts +47 -0
  13. package/dist/adapters/codex-sdk-loader.d.ts.map +1 -0
  14. package/dist/adapters/codex-sdk-loader.js +19 -0
  15. package/dist/adapters/codex-sdk-loader.js.map +1 -0
  16. package/dist/adapters/codex.d.ts +56 -0
  17. package/dist/adapters/codex.d.ts.map +1 -0
  18. package/dist/adapters/codex.js +267 -0
  19. package/dist/adapters/codex.js.map +1 -0
  20. package/dist/adapters/gemini-cli.d.ts +49 -0
  21. package/dist/adapters/gemini-cli.d.ts.map +1 -0
  22. package/dist/adapters/gemini-cli.js +181 -0
  23. package/dist/adapters/gemini-cli.js.map +1 -0
  24. package/dist/adapters/pty.d.ts +56 -0
  25. package/dist/adapters/pty.d.ts.map +1 -0
  26. package/dist/adapters/pty.js +223 -0
  27. package/dist/adapters/pty.js.map +1 -0
  28. package/dist/agents/aider.d.ts +9 -0
  29. package/dist/agents/aider.d.ts.map +1 -0
  30. package/dist/agents/aider.js +37 -0
  31. package/dist/agents/aider.js.map +1 -0
  32. package/dist/agents/built-in.d.ts +4 -0
  33. package/dist/agents/built-in.d.ts.map +1 -0
  34. package/dist/agents/built-in.js +6 -0
  35. package/dist/agents/built-in.js.map +1 -0
  36. package/dist/agents/claude.d.ts +12 -0
  37. package/dist/agents/claude.d.ts.map +1 -0
  38. package/dist/agents/claude.js +93 -0
  39. package/dist/agents/claude.js.map +1 -0
  40. package/dist/agents/codex.d.ts +6 -0
  41. package/dist/agents/codex.d.ts.map +1 -0
  42. package/dist/agents/codex.js +64 -0
  43. package/dist/agents/codex.js.map +1 -0
  44. package/dist/agents/command-detection.d.ts +6 -0
  45. package/dist/agents/command-detection.d.ts.map +1 -0
  46. package/dist/agents/command-detection.js +12 -0
  47. package/dist/agents/command-detection.js.map +1 -0
  48. package/dist/agents/gemini.d.ts +6 -0
  49. package/dist/agents/gemini.d.ts.map +1 -0
  50. package/dist/agents/gemini.js +36 -0
  51. package/dist/agents/gemini.js.map +1 -0
  52. package/dist/cli/agent-commands.d.ts +2 -0
  53. package/dist/cli/agent-commands.d.ts.map +1 -0
  54. package/dist/cli/agent-commands.js +87 -0
  55. package/dist/cli/agent-commands.js.map +1 -0
  56. package/dist/cli/args.d.ts +9 -0
  57. package/dist/cli/args.d.ts.map +1 -0
  58. package/dist/cli/args.js +34 -0
  59. package/dist/cli/args.js.map +1 -0
  60. package/dist/cli/command-shared.d.ts +53 -0
  61. package/dist/cli/command-shared.d.ts.map +1 -0
  62. package/dist/cli/command-shared.js +239 -0
  63. package/dist/cli/command-shared.js.map +1 -0
  64. package/dist/cli/commands.d.ts +20 -0
  65. package/dist/cli/commands.d.ts.map +1 -0
  66. package/dist/cli/commands.js +20 -0
  67. package/dist/cli/commands.js.map +1 -0
  68. package/dist/cli/daemon-client.d.ts +30 -0
  69. package/dist/cli/daemon-client.d.ts.map +1 -0
  70. package/dist/cli/daemon-client.js +161 -0
  71. package/dist/cli/daemon-client.js.map +1 -0
  72. package/dist/cli/daemon-lifecycle.d.ts +47 -0
  73. package/dist/cli/daemon-lifecycle.d.ts.map +1 -0
  74. package/dist/cli/daemon-lifecycle.js +262 -0
  75. package/dist/cli/daemon-lifecycle.js.map +1 -0
  76. package/dist/cli/daemon-settings.d.ts +9 -0
  77. package/dist/cli/daemon-settings.d.ts.map +1 -0
  78. package/dist/cli/daemon-settings.js +168 -0
  79. package/dist/cli/daemon-settings.js.map +1 -0
  80. package/dist/cli/directory-commands.d.ts +4 -0
  81. package/dist/cli/directory-commands.d.ts.map +1 -0
  82. package/dist/cli/directory-commands.js +190 -0
  83. package/dist/cli/directory-commands.js.map +1 -0
  84. package/dist/cli/hook-command.d.ts +14 -0
  85. package/dist/cli/hook-command.d.ts.map +1 -0
  86. package/dist/cli/hook-command.js +96 -0
  87. package/dist/cli/hook-command.js.map +1 -0
  88. package/dist/cli/install-command.d.ts +2 -0
  89. package/dist/cli/install-command.d.ts.map +1 -0
  90. package/dist/cli/install-command.js +91 -0
  91. package/dist/cli/install-command.js.map +1 -0
  92. package/dist/cli/lifecycle-commands.d.ts +10 -0
  93. package/dist/cli/lifecycle-commands.d.ts.map +1 -0
  94. package/dist/cli/lifecycle-commands.js +524 -0
  95. package/dist/cli/lifecycle-commands.js.map +1 -0
  96. package/dist/cli/listen-target.d.ts +13 -0
  97. package/dist/cli/listen-target.d.ts.map +1 -0
  98. package/dist/cli/listen-target.js +102 -0
  99. package/dist/cli/listen-target.js.map +1 -0
  100. package/dist/cli/orchestration-commands.d.ts +8 -0
  101. package/dist/cli/orchestration-commands.d.ts.map +1 -0
  102. package/dist/cli/orchestration-commands.js +340 -0
  103. package/dist/cli/orchestration-commands.js.map +1 -0
  104. package/dist/cli/permission-commands.d.ts +2 -0
  105. package/dist/cli/permission-commands.d.ts.map +1 -0
  106. package/dist/cli/permission-commands.js +138 -0
  107. package/dist/cli/permission-commands.js.map +1 -0
  108. package/dist/cli/runtime-toolchain.d.ts +35 -0
  109. package/dist/cli/runtime-toolchain.d.ts.map +1 -0
  110. package/dist/cli/runtime-toolchain.js +184 -0
  111. package/dist/cli/runtime-toolchain.js.map +1 -0
  112. package/dist/cli/service-commands.d.ts +19 -0
  113. package/dist/cli/service-commands.d.ts.map +1 -0
  114. package/dist/cli/service-commands.js +273 -0
  115. package/dist/cli/service-commands.js.map +1 -0
  116. package/dist/cli/session-commands.d.ts +3 -0
  117. package/dist/cli/session-commands.d.ts.map +1 -0
  118. package/dist/cli/session-commands.js +146 -0
  119. package/dist/cli/session-commands.js.map +1 -0
  120. package/dist/cli/setup-command.d.ts +12 -0
  121. package/dist/cli/setup-command.d.ts.map +1 -0
  122. package/dist/cli/setup-command.js +223 -0
  123. package/dist/cli/setup-command.js.map +1 -0
  124. package/dist/cli/supervisor-protocol.d.ts +20 -0
  125. package/dist/cli/supervisor-protocol.d.ts.map +1 -0
  126. package/dist/cli/supervisor-protocol.js +5 -0
  127. package/dist/cli/supervisor-protocol.js.map +1 -0
  128. package/dist/cli/supervisor.d.ts +10 -0
  129. package/dist/cli/supervisor.d.ts.map +1 -0
  130. package/dist/cli/supervisor.js +218 -0
  131. package/dist/cli/supervisor.js.map +1 -0
  132. package/dist/cli/worktree-commands.d.ts +2 -0
  133. package/dist/cli/worktree-commands.d.ts.map +1 -0
  134. package/dist/cli/worktree-commands.js +250 -0
  135. package/dist/cli/worktree-commands.js.map +1 -0
  136. package/dist/cli/ws-client.d.ts +20 -0
  137. package/dist/cli/ws-client.d.ts.map +1 -0
  138. package/dist/cli/ws-client.js +103 -0
  139. package/dist/cli/ws-client.js.map +1 -0
  140. package/dist/core/agent-registry.d.ts +128 -0
  141. package/dist/core/agent-registry.d.ts.map +1 -0
  142. package/dist/core/agent-registry.js +131 -0
  143. package/dist/core/agent-registry.js.map +1 -0
  144. package/dist/core/config-schema.d.ts +77 -0
  145. package/dist/core/config-schema.d.ts.map +1 -0
  146. package/dist/core/config-schema.js +66 -0
  147. package/dist/core/config-schema.js.map +1 -0
  148. package/dist/core/config.d.ts +111 -0
  149. package/dist/core/config.d.ts.map +1 -0
  150. package/dist/core/config.js +244 -0
  151. package/dist/core/config.js.map +1 -0
  152. package/dist/core/daemon.d.ts +113 -0
  153. package/dist/core/daemon.d.ts.map +1 -0
  154. package/dist/core/daemon.js +197 -0
  155. package/dist/core/daemon.js.map +1 -0
  156. package/dist/core/discovered-sessions.d.ts +7 -0
  157. package/dist/core/discovered-sessions.d.ts.map +1 -0
  158. package/dist/core/discovered-sessions.js +39 -0
  159. package/dist/core/discovered-sessions.js.map +1 -0
  160. package/dist/core/error-codes.d.ts +31 -0
  161. package/dist/core/error-codes.d.ts.map +1 -0
  162. package/dist/core/error-codes.js +30 -0
  163. package/dist/core/error-codes.js.map +1 -0
  164. package/dist/core/errors.d.ts +16 -0
  165. package/dist/core/errors.d.ts.map +1 -0
  166. package/dist/core/errors.js +43 -0
  167. package/dist/core/errors.js.map +1 -0
  168. package/dist/core/events.d.ts +183 -0
  169. package/dist/core/events.d.ts.map +1 -0
  170. package/dist/core/events.js +61 -0
  171. package/dist/core/events.js.map +1 -0
  172. package/dist/core/interfaces.d.ts +115 -0
  173. package/dist/core/interfaces.d.ts.map +1 -0
  174. package/dist/core/interfaces.js +9 -0
  175. package/dist/core/interfaces.js.map +1 -0
  176. package/dist/core/logger.d.ts +11 -0
  177. package/dist/core/logger.d.ts.map +1 -0
  178. package/dist/core/logger.js +17 -0
  179. package/dist/core/logger.js.map +1 -0
  180. package/dist/core/metrics.d.ts +24 -0
  181. package/dist/core/metrics.d.ts.map +1 -0
  182. package/dist/core/metrics.js +32 -0
  183. package/dist/core/metrics.js.map +1 -0
  184. package/dist/core/output.d.ts +13 -0
  185. package/dist/core/output.d.ts.map +1 -0
  186. package/dist/core/output.js +22 -0
  187. package/dist/core/output.js.map +1 -0
  188. package/dist/core/permission-coordinator.d.ts +67 -0
  189. package/dist/core/permission-coordinator.d.ts.map +1 -0
  190. package/dist/core/permission-coordinator.js +209 -0
  191. package/dist/core/permission-coordinator.js.map +1 -0
  192. package/dist/core/session-manager.d.ts +121 -0
  193. package/dist/core/session-manager.d.ts.map +1 -0
  194. package/dist/core/session-manager.js +354 -0
  195. package/dist/core/session-manager.js.map +1 -0
  196. package/dist/core/session-state-file.d.ts +20 -0
  197. package/dist/core/session-state-file.d.ts.map +1 -0
  198. package/dist/core/session-state-file.js +49 -0
  199. package/dist/core/session-state-file.js.map +1 -0
  200. package/dist/core/types.d.ts +250 -0
  201. package/dist/core/types.d.ts.map +1 -0
  202. package/dist/core/types.js +88 -0
  203. package/dist/core/types.js.map +1 -0
  204. package/dist/directories/manager.d.ts +32 -0
  205. package/dist/directories/manager.d.ts.map +1 -0
  206. package/dist/directories/manager.js +86 -0
  207. package/dist/directories/manager.js.map +1 -0
  208. package/dist/discovery/claude.d.ts +29 -0
  209. package/dist/discovery/claude.d.ts.map +1 -0
  210. package/dist/discovery/claude.js +55 -0
  211. package/dist/discovery/claude.js.map +1 -0
  212. package/dist/discovery/codex.d.ts +11 -0
  213. package/dist/discovery/codex.d.ts.map +1 -0
  214. package/dist/discovery/codex.js +365 -0
  215. package/dist/discovery/codex.js.map +1 -0
  216. package/dist/discovery/gemini.d.ts +15 -0
  217. package/dist/discovery/gemini.d.ts.map +1 -0
  218. package/dist/discovery/gemini.js +151 -0
  219. package/dist/discovery/gemini.js.map +1 -0
  220. package/dist/discovery/jsonl-reader.d.ts +122 -0
  221. package/dist/discovery/jsonl-reader.d.ts.map +1 -0
  222. package/dist/discovery/jsonl-reader.js +622 -0
  223. package/dist/discovery/jsonl-reader.js.map +1 -0
  224. package/dist/discovery/watcher.d.ts +29 -0
  225. package/dist/discovery/watcher.d.ts.map +1 -0
  226. package/dist/discovery/watcher.js +383 -0
  227. package/dist/discovery/watcher.js.map +1 -0
  228. package/dist/hooks/index.d.ts +10 -0
  229. package/dist/hooks/index.d.ts.map +1 -0
  230. package/dist/hooks/index.js +8 -0
  231. package/dist/hooks/index.js.map +1 -0
  232. package/dist/hooks/installers/base.d.ts +27 -0
  233. package/dist/hooks/installers/base.d.ts.map +1 -0
  234. package/dist/hooks/installers/base.js +9 -0
  235. package/dist/hooks/installers/base.js.map +1 -0
  236. package/dist/hooks/installers/claude.d.ts +18 -0
  237. package/dist/hooks/installers/claude.d.ts.map +1 -0
  238. package/dist/hooks/installers/claude.js +120 -0
  239. package/dist/hooks/installers/claude.js.map +1 -0
  240. package/dist/hooks/router.d.ts +63 -0
  241. package/dist/hooks/router.d.ts.map +1 -0
  242. package/dist/hooks/router.js +259 -0
  243. package/dist/hooks/router.js.map +1 -0
  244. package/dist/hooks/supervision.d.ts +27 -0
  245. package/dist/hooks/supervision.d.ts.map +1 -0
  246. package/dist/hooks/supervision.js +67 -0
  247. package/dist/hooks/supervision.js.map +1 -0
  248. package/dist/hooks/types.d.ts +171 -0
  249. package/dist/hooks/types.d.ts.map +1 -0
  250. package/dist/hooks/types.js +148 -0
  251. package/dist/hooks/types.js.map +1 -0
  252. package/dist/index.d.ts +17 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +117 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/permissions/engine.d.ts +23 -0
  257. package/dist/permissions/engine.d.ts.map +1 -0
  258. package/dist/permissions/engine.js +43 -0
  259. package/dist/permissions/engine.js.map +1 -0
  260. package/dist/plugins/loader.d.ts +44 -0
  261. package/dist/plugins/loader.d.ts.map +1 -0
  262. package/dist/plugins/loader.js +177 -0
  263. package/dist/plugins/loader.js.map +1 -0
  264. package/dist/server/auth.d.ts +32 -0
  265. package/dist/server/auth.d.ts.map +1 -0
  266. package/dist/server/auth.js +78 -0
  267. package/dist/server/auth.js.map +1 -0
  268. package/dist/server/discovered-watch-key.d.ts +5 -0
  269. package/dist/server/discovered-watch-key.d.ts.map +1 -0
  270. package/dist/server/discovered-watch-key.js +31 -0
  271. package/dist/server/discovered-watch-key.js.map +1 -0
  272. package/dist/server/hello-builder.d.ts +17 -0
  273. package/dist/server/hello-builder.d.ts.map +1 -0
  274. package/dist/server/hello-builder.js +71 -0
  275. package/dist/server/hello-builder.js.map +1 -0
  276. package/dist/server/http-server.d.ts +30 -0
  277. package/dist/server/http-server.d.ts.map +1 -0
  278. package/dist/server/http-server.js +561 -0
  279. package/dist/server/http-server.js.map +1 -0
  280. package/dist/server/message-normalizers.d.ts +11 -0
  281. package/dist/server/message-normalizers.d.ts.map +1 -0
  282. package/dist/server/message-normalizers.js +104 -0
  283. package/dist/server/message-normalizers.js.map +1 -0
  284. package/dist/server/pairing-offers.d.ts +78 -0
  285. package/dist/server/pairing-offers.d.ts.map +1 -0
  286. package/dist/server/pairing-offers.js +502 -0
  287. package/dist/server/pairing-offers.js.map +1 -0
  288. package/dist/server/rate-limiter.d.ts +21 -0
  289. package/dist/server/rate-limiter.d.ts.map +1 -0
  290. package/dist/server/rate-limiter.js +61 -0
  291. package/dist/server/rate-limiter.js.map +1 -0
  292. package/dist/server/ring-buffer.d.ts +34 -0
  293. package/dist/server/ring-buffer.d.ts.map +1 -0
  294. package/dist/server/ring-buffer.js +73 -0
  295. package/dist/server/ring-buffer.js.map +1 -0
  296. package/dist/server/security.d.ts +22 -0
  297. package/dist/server/security.d.ts.map +1 -0
  298. package/dist/server/security.js +123 -0
  299. package/dist/server/security.js.map +1 -0
  300. package/dist/server/ws-command-handlers.d.ts +25 -0
  301. package/dist/server/ws-command-handlers.d.ts.map +1 -0
  302. package/dist/server/ws-command-handlers.js +218 -0
  303. package/dist/server/ws-command-handlers.js.map +1 -0
  304. package/dist/server/ws-daemon-event-bridge.d.ts +22 -0
  305. package/dist/server/ws-daemon-event-bridge.d.ts.map +1 -0
  306. package/dist/server/ws-daemon-event-bridge.js +321 -0
  307. package/dist/server/ws-daemon-event-bridge.js.map +1 -0
  308. package/dist/server/ws-limits.d.ts +2 -0
  309. package/dist/server/ws-limits.d.ts.map +1 -0
  310. package/dist/server/ws-limits.js +12 -0
  311. package/dist/server/ws-limits.js.map +1 -0
  312. package/dist/server/ws-protocol.d.ts +248 -0
  313. package/dist/server/ws-protocol.d.ts.map +1 -0
  314. package/dist/server/ws-protocol.js +157 -0
  315. package/dist/server/ws-protocol.js.map +1 -0
  316. package/dist/server/ws-server.d.ts +26 -0
  317. package/dist/server/ws-server.d.ts.map +1 -0
  318. package/dist/server/ws-server.js +290 -0
  319. package/dist/server/ws-server.js.map +1 -0
  320. package/dist/startup-agents.d.ts +6 -0
  321. package/dist/startup-agents.d.ts.map +1 -0
  322. package/dist/startup-agents.js +97 -0
  323. package/dist/startup-agents.js.map +1 -0
  324. package/dist/startup-prereqs.d.ts +29 -0
  325. package/dist/startup-prereqs.d.ts.map +1 -0
  326. package/dist/startup-prereqs.js +209 -0
  327. package/dist/startup-prereqs.js.map +1 -0
  328. package/dist/startup-watchers.d.ts +7 -0
  329. package/dist/startup-watchers.d.ts.map +1 -0
  330. package/dist/startup-watchers.js +196 -0
  331. package/dist/startup-watchers.js.map +1 -0
  332. package/dist/startup.d.ts +20 -0
  333. package/dist/startup.d.ts.map +1 -0
  334. package/dist/startup.js +335 -0
  335. package/dist/startup.js.map +1 -0
  336. package/dist/tracking/git-tracker.d.ts +52 -0
  337. package/dist/tracking/git-tracker.d.ts.map +1 -0
  338. package/dist/tracking/git-tracker.js +277 -0
  339. package/dist/tracking/git-tracker.js.map +1 -0
  340. package/dist/tracking/noop-tracker.d.ts +27 -0
  341. package/dist/tracking/noop-tracker.d.ts.map +1 -0
  342. package/dist/tracking/noop-tracker.js +42 -0
  343. package/dist/tracking/noop-tracker.js.map +1 -0
  344. package/docs/configuration.md +75 -0
  345. package/docs/developer-workflows.md +107 -0
  346. package/docs/protocol-matrix.json +155 -0
  347. package/docs/releasing.md +65 -0
  348. package/docs/security.md +48 -0
  349. package/docs/testing.md +112 -0
  350. package/package.json +84 -0
@@ -0,0 +1,63 @@
1
+ /**
2
+ * HookRouter — central dispatcher for agent hook events.
3
+ *
4
+ * Receives events from the HTTP endpoint (posted by `vpd hook notify`),
5
+ * validates them, emits typed events on the daemon bus, and handles
6
+ * blocking hooks like PermissionRequest by holding the HTTP response
7
+ * until a supervising client responds.
8
+ *
9
+ * Design:
10
+ * - Event definitions are data (HookEventDefinition), not code.
11
+ * - Adding a new hook = adding a schema + definition. No switch statements.
12
+ * - The router doesn't know about specific agents — it's adapter-agnostic.
13
+ * - Blocking logic is isolated to handleBlockingEvent().
14
+ */
15
+ import type { TypedEventEmitter } from '../core/events.js';
16
+ import type { DaemonEvents } from '../core/events.js';
17
+ import type { SupervisionManager } from './supervision.js';
18
+ import { type HookEventDefinition, type HookResponse } from './types.js';
19
+ export interface PendingPermission {
20
+ hookRequestId: string;
21
+ sessionId: string;
22
+ adapter: string;
23
+ toolName: string;
24
+ toolInput: unknown;
25
+ cwd?: string;
26
+ createdAt: number;
27
+ timeoutMs: number;
28
+ resolve: (response: HookResponse) => void;
29
+ timer: ReturnType<typeof setTimeout>;
30
+ }
31
+ export declare class HookRouter {
32
+ private readonly eventBus;
33
+ private readonly supervision;
34
+ private readonly definitions;
35
+ private readonly pending;
36
+ private hookRequestCounter;
37
+ constructor(eventBus: TypedEventEmitter<DaemonEvents>, supervision: SupervisionManager);
38
+ /**
39
+ * Handle an incoming hook event from an agent.
40
+ *
41
+ * For non-blocking events: emits on the event bus and returns immediately.
42
+ * For blocking events (PermissionRequest): holds if supervised, or returns
43
+ * passthrough if nobody is watching.
44
+ */
45
+ handleEvent(input: Record<string, unknown>, adapter?: string): Promise<HookResponse>;
46
+ /** Register or override an event definition. */
47
+ registerDefinition(def: HookEventDefinition): void;
48
+ /** Resolve a pending permission request (called by WS handler). */
49
+ resolvePermission(hookRequestId: string, decision: {
50
+ behavior: 'allow' | 'deny';
51
+ message?: string;
52
+ }): boolean;
53
+ /** Get all pending permission requests (for UI state). */
54
+ getPendingPermissions(): ReadonlyMap<string, PendingPermission>;
55
+ /** Clean up all pending requests for a session (e.g., session ended). */
56
+ releaseSession(sessionId: string): void;
57
+ /** Clean up on shutdown. */
58
+ shutdown(): void;
59
+ private handleBlockingEvent;
60
+ private holdPermissionRequest;
61
+ private emitSpecificEvent;
62
+ }
63
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/hooks/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,YAAY,EAIlB,MAAM,YAAY,CAAC;AASpB,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;CACtC;AAMD,qBAAa,UAAU;IAMnB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAN9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAC7E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,kBAAkB,CAAK;gBAGZ,QAAQ,EAAE,iBAAiB,CAAC,YAAY,CAAC,EACzC,WAAW,EAAE,kBAAkB;IAgBlD;;;;;;OAMG;IACG,WAAW,CACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,MAAiB,GACzB,OAAO,CAAC,YAAY,CAAC;IAuDxB,gDAAgD;IAChD,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IAIlD,mEAAmE;IACnE,iBAAiB,CACf,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE;QAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACzD,OAAO;IAgBV,0DAA0D;IAC1D,qBAAqB,IAAI,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAI/D,yEAAyE;IACzE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAUvC,4BAA4B;IAC5B,QAAQ,IAAI,IAAI;YAYF,mBAAmB;IAuBjC,OAAO,CAAC,qBAAqB;IAwC7B,OAAO,CAAC,iBAAiB;CAgF1B"}
@@ -0,0 +1,259 @@
1
+ /**
2
+ * HookRouter — central dispatcher for agent hook events.
3
+ *
4
+ * Receives events from the HTTP endpoint (posted by `vpd hook notify`),
5
+ * validates them, emits typed events on the daemon bus, and handles
6
+ * blocking hooks like PermissionRequest by holding the HTTP response
7
+ * until a supervising client responds.
8
+ *
9
+ * Design:
10
+ * - Event definitions are data (HookEventDefinition), not code.
11
+ * - Adding a new hook = adding a schema + definition. No switch statements.
12
+ * - The router doesn't know about specific agents — it's adapter-agnostic.
13
+ * - Blocking logic is isolated to handleBlockingEvent().
14
+ */
15
+ import { HOOK_INPUT_SCHEMAS, DEFAULT_EVENT_DEFINITIONS, HookBaseInputSchema, } from './types.js';
16
+ import { logger } from '../core/logger.js';
17
+ const log = logger.child({ module: 'hook-router' });
18
+ // ---------------------------------------------------------------------------
19
+ // HookRouter
20
+ // ---------------------------------------------------------------------------
21
+ export class HookRouter {
22
+ eventBus;
23
+ supervision;
24
+ definitions = new Map();
25
+ pending = new Map();
26
+ hookRequestCounter = 0;
27
+ constructor(eventBus, supervision) {
28
+ this.eventBus = eventBus;
29
+ this.supervision = supervision;
30
+ for (const def of DEFAULT_EVENT_DEFINITIONS) {
31
+ this.definitions.set(def.kind, def);
32
+ }
33
+ // Listen for permission responses from WS clients
34
+ this.eventBus.on('hook:permission-response', ({ hookRequestId, decision }) => {
35
+ this.resolvePermission(hookRequestId, decision);
36
+ });
37
+ }
38
+ // -------------------------------------------------------------------------
39
+ // Public API
40
+ // -------------------------------------------------------------------------
41
+ /**
42
+ * Handle an incoming hook event from an agent.
43
+ *
44
+ * For non-blocking events: emits on the event bus and returns immediately.
45
+ * For blocking events (PermissionRequest): holds if supervised, or returns
46
+ * passthrough if nobody is watching.
47
+ */
48
+ async handleEvent(input, adapter = 'claude') {
49
+ // Validate base fields
50
+ const baseResult = HookBaseInputSchema.safeParse(input);
51
+ if (!baseResult.success) {
52
+ log.warn({ input, error: baseResult.error.message }, 'Invalid hook input — missing base fields');
53
+ return { passthrough: true };
54
+ }
55
+ const kind = baseResult.data.hook_event_name;
56
+ const schema = HOOK_INPUT_SCHEMAS[kind];
57
+ if (!schema) {
58
+ log.debug({ kind }, 'Unknown hook event kind — passthrough');
59
+ return { passthrough: true };
60
+ }
61
+ const parsed = schema.safeParse(input);
62
+ if (!parsed.success) {
63
+ log.warn({ kind, error: parsed.error.message }, 'Hook input validation failed');
64
+ return { passthrough: true };
65
+ }
66
+ const sessionId = baseResult.data.session_id;
67
+ const cwd = baseResult.data.cwd;
68
+ // Emit the generic hook:event for any listeners
69
+ this.eventBus.emit('hook:event', {
70
+ kind,
71
+ sessionId,
72
+ adapter,
73
+ cwd,
74
+ payload: parsed.data,
75
+ });
76
+ // Dispatch to specific event handler
77
+ const def = this.definitions.get(kind);
78
+ if (def?.blocking) {
79
+ return this.handleBlockingEvent(kind, parsed.data, {
80
+ sessionId,
81
+ adapter,
82
+ cwd,
83
+ timeoutMs: def.defaultTimeoutMs,
84
+ });
85
+ }
86
+ // Non-blocking: emit specific event and return immediately
87
+ this.emitSpecificEvent(kind, parsed.data, {
88
+ sessionId,
89
+ adapter,
90
+ });
91
+ return { passthrough: false };
92
+ }
93
+ /** Register or override an event definition. */
94
+ registerDefinition(def) {
95
+ this.definitions.set(def.kind, def);
96
+ }
97
+ /** Resolve a pending permission request (called by WS handler). */
98
+ resolvePermission(hookRequestId, decision) {
99
+ const pending = this.pending.get(hookRequestId);
100
+ if (!pending)
101
+ return false;
102
+ clearTimeout(pending.timer);
103
+ this.pending.delete(hookRequestId);
104
+ log.info({ hookRequestId, sessionId: pending.sessionId, decision: decision.behavior }, 'Permission resolved by supervisor');
105
+ pending.resolve({ passthrough: false, decision });
106
+ return true;
107
+ }
108
+ /** Get all pending permission requests (for UI state). */
109
+ getPendingPermissions() {
110
+ return this.pending;
111
+ }
112
+ /** Clean up all pending requests for a session (e.g., session ended). */
113
+ releaseSession(sessionId) {
114
+ for (const [id, pending] of this.pending) {
115
+ if (pending.sessionId === sessionId) {
116
+ clearTimeout(pending.timer);
117
+ this.pending.delete(id);
118
+ pending.resolve({ passthrough: true });
119
+ }
120
+ }
121
+ }
122
+ /** Clean up on shutdown. */
123
+ shutdown() {
124
+ for (const [, pending] of this.pending) {
125
+ clearTimeout(pending.timer);
126
+ pending.resolve({ passthrough: true });
127
+ }
128
+ this.pending.clear();
129
+ }
130
+ // -------------------------------------------------------------------------
131
+ // Private
132
+ // -------------------------------------------------------------------------
133
+ async handleBlockingEvent(kind, data, ctx) {
134
+ // If not supervised, fall through immediately
135
+ if (!this.supervision.isSupervised(ctx.sessionId)) {
136
+ log.debug({ kind, sessionId: ctx.sessionId }, 'Not supervised — passthrough');
137
+ // Still emit the event for visibility (non-blocking listeners)
138
+ this.emitSpecificEvent(kind, data, ctx);
139
+ return { passthrough: true };
140
+ }
141
+ // For PermissionRequest: hold and wait for supervisor response
142
+ if (kind === 'PermissionRequest') {
143
+ return this.holdPermissionRequest(data, ctx);
144
+ }
145
+ // Other blocking events: emit and passthrough for now
146
+ this.emitSpecificEvent(kind, data, ctx);
147
+ return { passthrough: true };
148
+ }
149
+ holdPermissionRequest(data, ctx) {
150
+ const hookRequestId = `hk-${++this.hookRequestCounter}-${Date.now()}`;
151
+ const toolName = data.tool_name ?? 'unknown';
152
+ const toolInput = data.tool_input;
153
+ // Emit the permission request event so WS server can broadcast
154
+ this.eventBus.emit('hook:permission-request', {
155
+ sessionId: ctx.sessionId,
156
+ adapter: ctx.adapter,
157
+ hookRequestId,
158
+ toolName,
159
+ toolInput,
160
+ cwd: ctx.cwd,
161
+ });
162
+ return new Promise((resolve) => {
163
+ const timer = setTimeout(() => {
164
+ this.pending.delete(hookRequestId);
165
+ log.info({ hookRequestId, sessionId: ctx.sessionId }, 'Permission request timed out');
166
+ resolve({ passthrough: true });
167
+ }, ctx.timeoutMs);
168
+ this.pending.set(hookRequestId, {
169
+ hookRequestId,
170
+ sessionId: ctx.sessionId,
171
+ adapter: ctx.adapter,
172
+ toolName,
173
+ toolInput,
174
+ cwd: ctx.cwd,
175
+ createdAt: Date.now(),
176
+ timeoutMs: ctx.timeoutMs,
177
+ resolve,
178
+ timer,
179
+ });
180
+ });
181
+ }
182
+ emitSpecificEvent(kind, data, ctx) {
183
+ switch (kind) {
184
+ case 'SessionStart':
185
+ this.eventBus.emit('hook:session-start', {
186
+ sessionId: ctx.sessionId,
187
+ adapter: ctx.adapter,
188
+ cwd: data.cwd,
189
+ source: data.source,
190
+ agentType: data.agent_type,
191
+ model: data.model,
192
+ });
193
+ break;
194
+ case 'SessionEnd':
195
+ this.eventBus.emit('hook:session-end', {
196
+ sessionId: ctx.sessionId,
197
+ adapter: ctx.adapter,
198
+ reason: data.reason,
199
+ });
200
+ break;
201
+ case 'Notification':
202
+ this.eventBus.emit('hook:notification', {
203
+ sessionId: ctx.sessionId,
204
+ adapter: ctx.adapter,
205
+ message: data.message ?? '',
206
+ title: data.title,
207
+ notificationType: data.notification_type,
208
+ });
209
+ break;
210
+ case 'PostToolUse':
211
+ this.eventBus.emit('hook:tool-completed', {
212
+ sessionId: ctx.sessionId,
213
+ adapter: ctx.adapter,
214
+ toolName: data.tool_name ?? '',
215
+ toolInput: data.tool_input,
216
+ toolResponse: data.tool_response,
217
+ });
218
+ break;
219
+ case 'PostToolUseFailure':
220
+ this.eventBus.emit('hook:tool-failed', {
221
+ sessionId: ctx.sessionId,
222
+ adapter: ctx.adapter,
223
+ toolName: data.tool_name ?? '',
224
+ error: data.error,
225
+ isInterrupt: data.is_interrupt,
226
+ });
227
+ break;
228
+ case 'Stop':
229
+ this.eventBus.emit('hook:stop', {
230
+ sessionId: ctx.sessionId,
231
+ adapter: ctx.adapter,
232
+ lastMessage: data.last_assistant_message,
233
+ });
234
+ break;
235
+ case 'SubagentStart':
236
+ this.eventBus.emit('hook:subagent-start', {
237
+ sessionId: ctx.sessionId,
238
+ adapter: ctx.adapter,
239
+ agentId: data.agent_id,
240
+ agentType: data.agent_type,
241
+ });
242
+ break;
243
+ case 'SubagentStop':
244
+ this.eventBus.emit('hook:subagent-stop', {
245
+ sessionId: ctx.sessionId,
246
+ adapter: ctx.adapter,
247
+ agentId: data.agent_id,
248
+ agentType: data.agent_type,
249
+ lastMessage: data.last_assistant_message,
250
+ });
251
+ break;
252
+ default:
253
+ // Generic events (UserPromptSubmit, TaskCompleted, PreToolUse, PermissionRequest)
254
+ // are already emitted via hook:event — no specific event needed yet
255
+ break;
256
+ }
257
+ }
258
+ }
259
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/hooks/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAIL,kBAAkB,EAClB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAmBpD,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,OAAO,UAAU;IAMF;IACA;IANF,WAAW,GAAG,IAAI,GAAG,EAAsC,CAAC;IAC5D,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IACxD,kBAAkB,GAAG,CAAC,CAAC;IAE/B,YACmB,QAAyC,EACzC,WAA+B;QAD/B,aAAQ,GAAR,QAAQ,CAAiC;QACzC,gBAAW,GAAX,WAAW,CAAoB;QAEhD,KAAK,MAAM,GAAG,IAAI,yBAAyB,EAAE,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,kDAAkD;QAClD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,0BAA0B,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC3E,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,aAAa;IACb,4EAA4E;IAE5E;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,CACf,KAA8B,EAC9B,UAAkB,QAAQ;QAE1B,uBAAuB;QACvB,MAAM,UAAU,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CACN,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,EAC1C,0CAA0C,CAC3C,CAAC;YACF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,eAAgC,CAAC;QAC9D,MAAM,MAAM,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,EAAE,uCAAuC,CAAC,CAAC;YAC7D,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,8BAA8B,CAAC,CAAC;YAChF,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC;QAC7C,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;QAEhC,gDAAgD;QAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE;YAC/B,IAAI;YACJ,SAAS;YACT,OAAO;YACP,GAAG;YACH,OAAO,EAAE,MAAM,CAAC,IAA+B;SAChD,CAAC,CAAC;QAEH,qCAAqC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,GAAG,EAAE,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,IAA+B,EAAE;gBAC5E,SAAS;gBACT,OAAO;gBACP,GAAG;gBACH,SAAS,EAAE,GAAG,CAAC,gBAAgB;aAChC,CAAC,CAAC;QACL,CAAC;QAED,2DAA2D;QAC3D,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,IAA+B,EAAE;YACnE,SAAS;YACT,OAAO;SACR,CAAC,CAAC;QACH,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,gDAAgD;IAChD,kBAAkB,CAAC,GAAwB;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,mEAAmE;IACnE,iBAAiB,CACf,aAAqB,EACrB,QAA0D;QAE1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QAE3B,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAEnC,GAAG,CAAC,IAAI,CACN,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAC5E,mCAAmC,CACpC,CAAC;QAEF,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0DAA0D;IAC1D,qBAAqB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,yEAAyE;IACzE,cAAc,CAAC,SAAiB;QAC9B,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACpC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxB,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,QAAQ;QACN,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,4EAA4E;IAC5E,UAAU;IACV,4EAA4E;IAEpE,KAAK,CAAC,mBAAmB,CAC/B,IAAmB,EACnB,IAA6B,EAC7B,GAA4E;QAE5E,8CAA8C;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,8BAA8B,CAAC,CAAC;YAC9E,+DAA+D;YAC/D,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;YACxC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;QAED,+DAA+D;QAC/D,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/B,CAAC;IAEO,qBAAqB,CAC3B,IAA6B,EAC7B,GAA4E;QAE5E,MAAM,aAAa,GAAG,MAAM,EAAE,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACtE,MAAM,QAAQ,GAAI,IAAI,CAAC,SAAoB,IAAI,SAAS,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC;QAElC,+DAA+D;QAC/D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAAyB,EAAE;YAC5C,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,aAAa;YACb,QAAQ;YACR,SAAS;YACT,GAAG,EAAE,GAAG,CAAC,GAAG;SACb,CAAC,CAAC;QAEH,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;gBACnC,GAAG,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,EAAE,8BAA8B,CAAC,CAAC;gBACtF,OAAO,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YACjC,CAAC,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAElB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;gBAC9B,aAAa;gBACb,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,QAAQ;gBACR,SAAS;gBACT,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;gBACrB,SAAS,EAAE,GAAG,CAAC,SAAS;gBACxB,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CACvB,IAAmB,EACnB,IAA6B,EAC7B,GAA2C;QAE3C,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc;gBACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBACvC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,GAAG,EAAE,IAAI,CAAC,GAAyB;oBACnC,MAAM,EAAE,IAAI,CAAC,MAA4B;oBACzC,SAAS,EAAE,IAAI,CAAC,UAAgC;oBAChD,KAAK,EAAE,IAAI,CAAC,KAA2B;iBACxC,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBACrC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,MAAM,EAAE,IAAI,CAAC,MAA4B;iBAC1C,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,EAAE;oBACtC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,OAAO,EAAG,IAAI,CAAC,OAAkB,IAAI,EAAE;oBACvC,KAAK,EAAE,IAAI,CAAC,KAA2B;oBACvC,gBAAgB,EAAE,IAAI,CAAC,iBAAuC;iBAC/D,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,aAAa;gBAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBACxC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAG,IAAI,CAAC,SAAoB,IAAI,EAAE;oBAC1C,SAAS,EAAE,IAAI,CAAC,UAAU;oBAC1B,YAAY,EAAE,IAAI,CAAC,aAAa;iBACjC,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,oBAAoB;gBACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,EAAE;oBACrC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,QAAQ,EAAG,IAAI,CAAC,SAAoB,IAAI,EAAE;oBAC1C,KAAK,EAAE,IAAI,CAAC,KAA2B;oBACvC,WAAW,EAAE,IAAI,CAAC,YAAmC;iBACtD,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,MAAM;gBACT,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE;oBAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,WAAW,EAAE,IAAI,CAAC,sBAA4C;iBAC/D,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,EAAE;oBACxC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,OAAO,EAAE,IAAI,CAAC,QAA8B;oBAC5C,SAAS,EAAE,IAAI,CAAC,UAAgC;iBACjD,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,cAAc;gBACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBACvC,SAAS,EAAE,GAAG,CAAC,SAAS;oBACxB,OAAO,EAAE,GAAG,CAAC,OAAO;oBACpB,OAAO,EAAE,IAAI,CAAC,QAA8B;oBAC5C,SAAS,EAAE,IAAI,CAAC,UAAgC;oBAChD,WAAW,EAAE,IAAI,CAAC,sBAA4C;iBAC/D,CAAC,CAAC;gBACH,MAAM;YACR;gBACE,kFAAkF;gBAClF,oEAAoE;gBACpE,MAAM;QACV,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * SupervisionManager — tracks which sessions are being supervised by remote clients.
3
+ *
4
+ * When a session is supervised, blocking hooks (like PermissionRequest) will hold
5
+ * and relay the request to the supervising clients instead of falling through to
6
+ * the agent's local UI (e.g., the terminal prompt).
7
+ *
8
+ * When no clients are supervising, hooks fall through so the local UX is unaffected.
9
+ */
10
+ import type { ConnectedClient } from '../server/hello-builder.js';
11
+ export declare class SupervisionManager {
12
+ /** sessionId → set of supervising clients */
13
+ private readonly supervisors;
14
+ /** Start supervising a session. */
15
+ supervise(sessionId: string, client: ConnectedClient): void;
16
+ /** Stop supervising a session. */
17
+ unsupervise(sessionId: string, client: ConnectedClient): void;
18
+ /** Check if any client is supervising this session. */
19
+ isSupervised(sessionId: string): boolean;
20
+ /** Get all supervising clients for a session. */
21
+ getSupervisors(sessionId: string): ReadonlySet<ConnectedClient>;
22
+ /** Remove a client from all sessions (call on disconnect). */
23
+ removeClient(client: ConnectedClient): string[];
24
+ /** Get all supervised session IDs. */
25
+ getSupervisedSessions(): string[];
26
+ }
27
+ //# sourceMappingURL=supervision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.d.ts","sourceRoot":"","sources":["../../src/hooks/supervision.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAKlE,qBAAa,kBAAkB;IAC7B,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA2C;IAEvE,mCAAmC;IACnC,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAU3D,kCAAkC;IAClC,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,IAAI;IAU7D,uDAAuD;IACvD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAKxC,iDAAiD;IACjD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC;IAI/D,8DAA8D;IAC9D,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,EAAE;IAiB/C,sCAAsC;IACtC,qBAAqB,IAAI,MAAM,EAAE;CAGlC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * SupervisionManager — tracks which sessions are being supervised by remote clients.
3
+ *
4
+ * When a session is supervised, blocking hooks (like PermissionRequest) will hold
5
+ * and relay the request to the supervising clients instead of falling through to
6
+ * the agent's local UI (e.g., the terminal prompt).
7
+ *
8
+ * When no clients are supervising, hooks fall through so the local UX is unaffected.
9
+ */
10
+ import { logger } from '../core/logger.js';
11
+ const log = logger.child({ module: 'supervision' });
12
+ export class SupervisionManager {
13
+ /** sessionId → set of supervising clients */
14
+ supervisors = new Map();
15
+ /** Start supervising a session. */
16
+ supervise(sessionId, client) {
17
+ let clients = this.supervisors.get(sessionId);
18
+ if (!clients) {
19
+ clients = new Set();
20
+ this.supervisors.set(sessionId, clients);
21
+ }
22
+ clients.add(client);
23
+ log.info({ sessionId, supervisorCount: clients.size }, 'Client started supervising');
24
+ }
25
+ /** Stop supervising a session. */
26
+ unsupervise(sessionId, client) {
27
+ const clients = this.supervisors.get(sessionId);
28
+ if (!clients)
29
+ return;
30
+ clients.delete(client);
31
+ if (clients.size === 0) {
32
+ this.supervisors.delete(sessionId);
33
+ }
34
+ log.info({ sessionId, supervisorCount: clients?.size ?? 0 }, 'Client stopped supervising');
35
+ }
36
+ /** Check if any client is supervising this session. */
37
+ isSupervised(sessionId) {
38
+ const clients = this.supervisors.get(sessionId);
39
+ return clients !== undefined && clients.size > 0;
40
+ }
41
+ /** Get all supervising clients for a session. */
42
+ getSupervisors(sessionId) {
43
+ return this.supervisors.get(sessionId) ?? new Set();
44
+ }
45
+ /** Remove a client from all sessions (call on disconnect). */
46
+ removeClient(client) {
47
+ const released = [];
48
+ for (const [sessionId, clients] of this.supervisors) {
49
+ if (clients.has(client)) {
50
+ clients.delete(client);
51
+ if (clients.size === 0) {
52
+ this.supervisors.delete(sessionId);
53
+ released.push(sessionId);
54
+ }
55
+ }
56
+ }
57
+ if (released.length > 0) {
58
+ log.info({ released }, 'Client disconnected — released supervision');
59
+ }
60
+ return released;
61
+ }
62
+ /** Get all supervised session IDs. */
63
+ getSupervisedSessions() {
64
+ return [...this.supervisors.keys()];
65
+ }
66
+ }
67
+ //# sourceMappingURL=supervision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervision.js","sourceRoot":"","sources":["../../src/hooks/supervision.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAEpD,MAAM,OAAO,kBAAkB;IAC7B,6CAA6C;IAC5B,WAAW,GAAG,IAAI,GAAG,EAAgC,CAAC;IAEvE,mCAAmC;IACnC,SAAS,CAAC,SAAiB,EAAE,MAAuB;QAClD,IAAI,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,4BAA4B,CAAC,CAAC;IACvF,CAAC;IAED,kCAAkC;IAClC,WAAW,CAAC,SAAiB,EAAE,MAAuB;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,EAAE,EAAE,4BAA4B,CAAC,CAAC;IAC7F,CAAC;IAED,uDAAuD;IACvD,YAAY,CAAC,SAAiB;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,OAAO,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IACnD,CAAC;IAED,iDAAiD;IACjD,cAAc,CAAC,SAAiB;QAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;IACtD,CAAC;IAED,8DAA8D;IAC9D,YAAY,CAAC,MAAuB;QAClC,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACvB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACvB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACnC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,4CAA4C,CAAC,CAAC;QACvE,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,sCAAsC;IACtC,qBAAqB;QACnB,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Hook system types — adapter-agnostic event definitions for agent lifecycle hooks.
3
+ *
4
+ * The hook system allows the daemon to receive events from any agent (Claude Code,
5
+ * Gemini, Cursor, etc.) via lightweight CLI commands that POST to the daemon.
6
+ * Each hook event has a typed input schema and metadata about how it should be handled.
7
+ *
8
+ * Design:
9
+ * - HookEventKind: all supported event names (extensible enum-like union)
10
+ * - HookInput<K>: typed input for each event kind
11
+ * - HookEventDefinition: registry entry with schema, blocking flag, handler
12
+ * - HookResponse: what the daemon returns to the hook command
13
+ */
14
+ import { z } from 'zod';
15
+ export declare const HOOK_EVENT_KINDS: readonly ["SessionStart", "SessionEnd", "PermissionRequest", "Notification", "Stop", "PreToolUse", "PostToolUse", "PostToolUseFailure", "SubagentStart", "SubagentStop", "UserPromptSubmit", "TaskCompleted"];
16
+ export type HookEventKind = (typeof HOOK_EVENT_KINDS)[number];
17
+ export declare const HookBaseInputSchema: z.ZodObject<{
18
+ hook_event_name: z.ZodString;
19
+ session_id: z.ZodString;
20
+ transcript_path: z.ZodOptional<z.ZodString>;
21
+ cwd: z.ZodOptional<z.ZodString>;
22
+ permission_mode: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>;
24
+ export type HookBaseInput = z.infer<typeof HookBaseInputSchema>;
25
+ export declare const SessionStartInputSchema: z.ZodObject<{
26
+ session_id: z.ZodString;
27
+ transcript_path: z.ZodOptional<z.ZodString>;
28
+ cwd: z.ZodOptional<z.ZodString>;
29
+ permission_mode: z.ZodOptional<z.ZodString>;
30
+ hook_event_name: z.ZodLiteral<"SessionStart">;
31
+ source: z.ZodOptional<z.ZodEnum<{
32
+ resume: "resume";
33
+ startup: "startup";
34
+ clear: "clear";
35
+ compact: "compact";
36
+ }>>;
37
+ agent_type: z.ZodOptional<z.ZodString>;
38
+ model: z.ZodOptional<z.ZodString>;
39
+ }, z.core.$strip>;
40
+ export declare const SessionEndInputSchema: z.ZodObject<{
41
+ session_id: z.ZodString;
42
+ transcript_path: z.ZodOptional<z.ZodString>;
43
+ cwd: z.ZodOptional<z.ZodString>;
44
+ permission_mode: z.ZodOptional<z.ZodString>;
45
+ hook_event_name: z.ZodLiteral<"SessionEnd">;
46
+ reason: z.ZodOptional<z.ZodString>;
47
+ }, z.core.$strip>;
48
+ export declare const PermissionRequestInputSchema: z.ZodObject<{
49
+ session_id: z.ZodString;
50
+ transcript_path: z.ZodOptional<z.ZodString>;
51
+ cwd: z.ZodOptional<z.ZodString>;
52
+ permission_mode: z.ZodOptional<z.ZodString>;
53
+ hook_event_name: z.ZodLiteral<"PermissionRequest">;
54
+ tool_name: z.ZodString;
55
+ tool_input: z.ZodOptional<z.ZodUnknown>;
56
+ }, z.core.$strip>;
57
+ export declare const NotificationInputSchema: z.ZodObject<{
58
+ session_id: z.ZodString;
59
+ transcript_path: z.ZodOptional<z.ZodString>;
60
+ cwd: z.ZodOptional<z.ZodString>;
61
+ permission_mode: z.ZodOptional<z.ZodString>;
62
+ hook_event_name: z.ZodLiteral<"Notification">;
63
+ message: z.ZodString;
64
+ title: z.ZodOptional<z.ZodString>;
65
+ notification_type: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$strip>;
67
+ export declare const StopInputSchema: z.ZodObject<{
68
+ session_id: z.ZodString;
69
+ transcript_path: z.ZodOptional<z.ZodString>;
70
+ cwd: z.ZodOptional<z.ZodString>;
71
+ permission_mode: z.ZodOptional<z.ZodString>;
72
+ hook_event_name: z.ZodLiteral<"Stop">;
73
+ stop_hook_active: z.ZodOptional<z.ZodBoolean>;
74
+ last_assistant_message: z.ZodOptional<z.ZodString>;
75
+ }, z.core.$strip>;
76
+ export declare const PreToolUseInputSchema: z.ZodObject<{
77
+ session_id: z.ZodString;
78
+ transcript_path: z.ZodOptional<z.ZodString>;
79
+ cwd: z.ZodOptional<z.ZodString>;
80
+ permission_mode: z.ZodOptional<z.ZodString>;
81
+ hook_event_name: z.ZodLiteral<"PreToolUse">;
82
+ tool_name: z.ZodString;
83
+ tool_input: z.ZodOptional<z.ZodUnknown>;
84
+ tool_use_id: z.ZodOptional<z.ZodString>;
85
+ }, z.core.$strip>;
86
+ export declare const PostToolUseInputSchema: z.ZodObject<{
87
+ session_id: z.ZodString;
88
+ transcript_path: z.ZodOptional<z.ZodString>;
89
+ cwd: z.ZodOptional<z.ZodString>;
90
+ permission_mode: z.ZodOptional<z.ZodString>;
91
+ hook_event_name: z.ZodLiteral<"PostToolUse">;
92
+ tool_name: z.ZodString;
93
+ tool_input: z.ZodOptional<z.ZodUnknown>;
94
+ tool_response: z.ZodOptional<z.ZodUnknown>;
95
+ tool_use_id: z.ZodOptional<z.ZodString>;
96
+ }, z.core.$strip>;
97
+ export declare const PostToolUseFailureInputSchema: z.ZodObject<{
98
+ session_id: z.ZodString;
99
+ transcript_path: z.ZodOptional<z.ZodString>;
100
+ cwd: z.ZodOptional<z.ZodString>;
101
+ permission_mode: z.ZodOptional<z.ZodString>;
102
+ hook_event_name: z.ZodLiteral<"PostToolUseFailure">;
103
+ tool_name: z.ZodString;
104
+ tool_input: z.ZodOptional<z.ZodUnknown>;
105
+ tool_use_id: z.ZodOptional<z.ZodString>;
106
+ error: z.ZodOptional<z.ZodString>;
107
+ is_interrupt: z.ZodOptional<z.ZodBoolean>;
108
+ }, z.core.$strip>;
109
+ export declare const SubagentStartInputSchema: z.ZodObject<{
110
+ session_id: z.ZodString;
111
+ transcript_path: z.ZodOptional<z.ZodString>;
112
+ cwd: z.ZodOptional<z.ZodString>;
113
+ permission_mode: z.ZodOptional<z.ZodString>;
114
+ hook_event_name: z.ZodLiteral<"SubagentStart">;
115
+ agent_id: z.ZodOptional<z.ZodString>;
116
+ agent_type: z.ZodOptional<z.ZodString>;
117
+ }, z.core.$strip>;
118
+ export declare const SubagentStopInputSchema: z.ZodObject<{
119
+ session_id: z.ZodString;
120
+ transcript_path: z.ZodOptional<z.ZodString>;
121
+ cwd: z.ZodOptional<z.ZodString>;
122
+ permission_mode: z.ZodOptional<z.ZodString>;
123
+ hook_event_name: z.ZodLiteral<"SubagentStop">;
124
+ agent_id: z.ZodOptional<z.ZodString>;
125
+ agent_type: z.ZodOptional<z.ZodString>;
126
+ agent_transcript_path: z.ZodOptional<z.ZodString>;
127
+ last_assistant_message: z.ZodOptional<z.ZodString>;
128
+ }, z.core.$strip>;
129
+ export declare const UserPromptSubmitInputSchema: z.ZodObject<{
130
+ session_id: z.ZodString;
131
+ transcript_path: z.ZodOptional<z.ZodString>;
132
+ cwd: z.ZodOptional<z.ZodString>;
133
+ permission_mode: z.ZodOptional<z.ZodString>;
134
+ hook_event_name: z.ZodLiteral<"UserPromptSubmit">;
135
+ prompt: z.ZodOptional<z.ZodString>;
136
+ }, z.core.$strip>;
137
+ export declare const TaskCompletedInputSchema: z.ZodObject<{
138
+ session_id: z.ZodString;
139
+ transcript_path: z.ZodOptional<z.ZodString>;
140
+ cwd: z.ZodOptional<z.ZodString>;
141
+ permission_mode: z.ZodOptional<z.ZodString>;
142
+ hook_event_name: z.ZodLiteral<"TaskCompleted">;
143
+ task_id: z.ZodOptional<z.ZodString>;
144
+ task_subject: z.ZodOptional<z.ZodString>;
145
+ task_description: z.ZodOptional<z.ZodString>;
146
+ }, z.core.$strip>;
147
+ export declare const HOOK_INPUT_SCHEMAS: Record<HookEventKind, z.ZodType>;
148
+ /** Returned to the hook CLI command. */
149
+ export interface HookResponse {
150
+ /** If true, the hook should exit non-zero so the agent falls through to its own UI. */
151
+ passthrough: boolean;
152
+ /** Permission decision (only for PermissionRequest). */
153
+ decision?: {
154
+ behavior: 'allow' | 'deny';
155
+ message?: string;
156
+ };
157
+ }
158
+ export interface HookContext {
159
+ /** The adapter/agent that sent this event (e.g., 'claude', 'gemini'). */
160
+ adapter: string;
161
+ }
162
+ export interface HookEventDefinition {
163
+ /** The event kind this definition handles. */
164
+ kind: HookEventKind;
165
+ /** Whether the hook should block and wait for a response (e.g., PermissionRequest). */
166
+ blocking: boolean;
167
+ /** Default timeout in ms for blocking hooks. */
168
+ defaultTimeoutMs: number;
169
+ }
170
+ export declare const DEFAULT_EVENT_DEFINITIONS: HookEventDefinition[];
171
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/hooks/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,gBAAgB,+MAanB,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAM9D,eAAO,MAAM,mBAAmB;;;;;;iBAM9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAMhE,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;iBAKlC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;;;;iBAIvC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;iBAKlC,CAAC;AAEH,eAAO,MAAM,eAAe;;;;;;;;iBAI1B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;iBAKhC,CAAC;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;iBAMjC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;iBAOxC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;iBAInC,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;iBAMlC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;iBAGtC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;iBAKnC,CAAC;AAMH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAa/D,CAAC;AAMF,wCAAwC;AACxC,MAAM,WAAW,YAAY;IAC3B,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7D;AAMD,MAAM,WAAW,WAAW;IAC1B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,uFAAuF;IACvF,QAAQ,EAAE,OAAO,CAAC;IAClB,gDAAgD;IAChD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAMD,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,EAa1D,CAAC"}