@greppleai/grip 0.1.5 → 0.1.6

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 (565) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +1 -1
  3. package/dist/bun/cli.d.ts.map +1 -1
  4. package/dist/bun/cli.js.map +1 -1
  5. package/dist/bun/embedded-assets.d.ts.map +1 -1
  6. package/dist/bun/embedded-assets.js.map +1 -1
  7. package/dist/bun/register-bedrock.d.ts.map +1 -1
  8. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  9. package/dist/bun/restore-sandbox-env.js.map +1 -1
  10. package/dist/cli/args.d.ts.map +1 -1
  11. package/dist/cli/args.js.map +1 -1
  12. package/dist/cli/config-selector.d.ts.map +1 -1
  13. package/dist/cli/config-selector.js.map +1 -1
  14. package/dist/cli/file-processor.d.ts.map +1 -1
  15. package/dist/cli/file-processor.js.map +1 -1
  16. package/dist/cli/initial-message.d.ts +1 -1
  17. package/dist/cli/initial-message.d.ts.map +1 -1
  18. package/dist/cli/initial-message.js.map +1 -1
  19. package/dist/cli/list-models.d.ts.map +1 -1
  20. package/dist/cli/list-models.js.map +1 -1
  21. package/dist/cli/session-picker.d.ts.map +1 -1
  22. package/dist/cli/session-picker.js.map +1 -1
  23. package/dist/cli.d.ts.map +1 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js.map +1 -1
  27. package/dist/core/agent-session.d.ts +27 -0
  28. package/dist/core/agent-session.d.ts.map +1 -1
  29. package/dist/core/agent-session.js +117 -152
  30. package/dist/core/agent-session.js.map +1 -1
  31. package/dist/core/auth-guidance.d.ts.map +1 -1
  32. package/dist/core/auth-guidance.js.map +1 -1
  33. package/dist/core/auth-storage.d.ts +4 -0
  34. package/dist/core/auth-storage.d.ts.map +1 -1
  35. package/dist/core/auth-storage.js +3 -10
  36. package/dist/core/auth-storage.js.map +1 -1
  37. package/dist/core/bash-executor.d.ts.map +1 -1
  38. package/dist/core/bash-executor.js +19 -23
  39. package/dist/core/bash-executor.js.map +1 -1
  40. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  41. package/dist/core/compaction/branch-summarization.js.map +1 -1
  42. package/dist/core/compaction/compaction.d.ts.map +1 -1
  43. package/dist/core/compaction/compaction.js.map +1 -1
  44. package/dist/core/compaction/compression-detection-ledger.d.ts.map +1 -1
  45. package/dist/core/compaction/compression-detection-ledger.js.map +1 -1
  46. package/dist/core/compaction/compression-detector.d.ts +1 -0
  47. package/dist/core/compaction/compression-detector.d.ts.map +1 -1
  48. package/dist/core/compaction/compression-detector.js +10 -21
  49. package/dist/core/compaction/compression-detector.js.map +1 -1
  50. package/dist/core/compaction/compression-economics.d.ts.map +1 -1
  51. package/dist/core/compaction/compression-economics.js.map +1 -1
  52. package/dist/core/compaction/utils.d.ts.map +1 -1
  53. package/dist/core/compaction/utils.js.map +1 -1
  54. package/dist/core/defaults.d.ts.map +1 -1
  55. package/dist/core/diagnostics.d.ts.map +1 -1
  56. package/dist/core/event-bus.d.ts.map +1 -1
  57. package/dist/core/event-bus.js.map +1 -1
  58. package/dist/core/exec.d.ts.map +1 -1
  59. package/dist/core/exec.js.map +1 -1
  60. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  61. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  62. package/dist/core/export-html/index.d.ts.map +1 -1
  63. package/dist/core/export-html/index.js.map +1 -1
  64. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  65. package/dist/core/export-html/tool-renderer.js.map +1 -1
  66. package/dist/core/extensions/loader.d.ts.map +1 -1
  67. package/dist/core/extensions/loader.js.map +1 -1
  68. package/dist/core/extensions/runner.d.ts.map +1 -1
  69. package/dist/core/extensions/runner.js +18 -30
  70. package/dist/core/extensions/runner.js.map +1 -1
  71. package/dist/core/extensions/types.d.ts.map +1 -1
  72. package/dist/core/extensions/types.js.map +1 -1
  73. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  74. package/dist/core/extensions/wrapper.js.map +1 -1
  75. package/dist/core/footer-data-provider.d.ts.map +1 -1
  76. package/dist/core/footer-data-provider.js +15 -16
  77. package/dist/core/footer-data-provider.js.map +1 -1
  78. package/dist/core/grip-agent.d.ts.map +1 -1
  79. package/dist/core/grip-agent.js +7 -21
  80. package/dist/core/grip-agent.js.map +1 -1
  81. package/dist/core/grip-manifest.d.ts.map +1 -1
  82. package/dist/core/grip-manifest.js.map +1 -1
  83. package/dist/core/hooks/aggregate.d.ts.map +1 -1
  84. package/dist/core/hooks/aggregate.js.map +1 -1
  85. package/dist/core/hooks/config.d.ts.map +1 -1
  86. package/dist/core/hooks/config.js.map +1 -1
  87. package/dist/core/hooks/executor.d.ts.map +1 -1
  88. package/dist/core/hooks/executor.js.map +1 -1
  89. package/dist/core/hooks/index.d.ts.map +1 -1
  90. package/dist/core/hooks/index.js.map +1 -1
  91. package/dist/core/hooks/matcher.d.ts.map +1 -1
  92. package/dist/core/hooks/matcher.js.map +1 -1
  93. package/dist/core/hooks/trust-store.d.ts.map +1 -1
  94. package/dist/core/hooks/trust-store.js +0 -3
  95. package/dist/core/hooks/trust-store.js.map +1 -1
  96. package/dist/core/hooks/types.d.ts.map +1 -1
  97. package/dist/core/hooks/types.js.map +1 -1
  98. package/dist/core/http-dispatcher.d.ts.map +1 -1
  99. package/dist/core/http-dispatcher.js.map +1 -1
  100. package/dist/core/instruction-resource-loader.d.ts.map +1 -1
  101. package/dist/core/instruction-resource-loader.js +0 -3
  102. package/dist/core/instruction-resource-loader.js.map +1 -1
  103. package/dist/core/keybindings.d.ts.map +1 -1
  104. package/dist/core/keybindings.js +0 -1
  105. package/dist/core/keybindings.js.map +1 -1
  106. package/dist/core/lsp/abort.d.ts.map +1 -1
  107. package/dist/core/lsp/abort.js.map +1 -1
  108. package/dist/core/lsp/client.d.ts.map +1 -1
  109. package/dist/core/lsp/client.js +8 -22
  110. package/dist/core/lsp/client.js.map +1 -1
  111. package/dist/core/lsp/config-loader.d.ts.map +1 -1
  112. package/dist/core/lsp/config-loader.js.map +1 -1
  113. package/dist/core/lsp/config.d.ts.map +1 -1
  114. package/dist/core/lsp/config.js.map +1 -1
  115. package/dist/core/lsp/diagnostics.d.ts.map +1 -1
  116. package/dist/core/lsp/diagnostics.js.map +1 -1
  117. package/dist/core/lsp/file-sync.d.ts.map +1 -1
  118. package/dist/core/lsp/file-sync.js +7 -9
  119. package/dist/core/lsp/file-sync.js.map +1 -1
  120. package/dist/core/lsp/integration.d.ts.map +1 -1
  121. package/dist/core/lsp/integration.js.map +1 -1
  122. package/dist/core/lsp/language-map.d.ts.map +1 -1
  123. package/dist/core/lsp/language-map.js +2 -7
  124. package/dist/core/lsp/language-map.js.map +1 -1
  125. package/dist/core/lsp/manager.d.ts.map +1 -1
  126. package/dist/core/lsp/manager.js +18 -29
  127. package/dist/core/lsp/manager.js.map +1 -1
  128. package/dist/core/lsp/navigation.d.ts.map +1 -1
  129. package/dist/core/lsp/navigation.js.map +1 -1
  130. package/dist/core/lsp/portable-path.d.ts.map +1 -1
  131. package/dist/core/lsp/portable-path.js.map +1 -1
  132. package/dist/core/lsp/refactor.d.ts.map +1 -1
  133. package/dist/core/lsp/refactor.js.map +1 -1
  134. package/dist/core/lsp/transport.d.ts.map +1 -1
  135. package/dist/core/lsp/transport.js.map +1 -1
  136. package/dist/core/messages.d.ts.map +1 -1
  137. package/dist/core/messages.js.map +1 -1
  138. package/dist/core/model-registry.d.ts.map +1 -1
  139. package/dist/core/model-registry.js +5 -7
  140. package/dist/core/model-registry.js.map +1 -1
  141. package/dist/core/model-resolver.d.ts.map +1 -1
  142. package/dist/core/model-resolver.js.map +1 -1
  143. package/dist/core/output-guard.d.ts.map +1 -1
  144. package/dist/core/output-guard.js.map +1 -1
  145. package/dist/core/package-manager.d.ts.map +1 -1
  146. package/dist/core/package-manager.js +0 -6
  147. package/dist/core/package-manager.js.map +1 -1
  148. package/dist/core/prompt-templates.d.ts.map +1 -1
  149. package/dist/core/prompt-templates.js.map +1 -1
  150. package/dist/core/provider-display-names.d.ts.map +1 -1
  151. package/dist/core/remote-workspace-protocol/contract.d.ts.map +1 -1
  152. package/dist/core/remote-workspace-protocol/contract.js +4 -2
  153. package/dist/core/remote-workspace-protocol/contract.js.map +1 -1
  154. package/dist/core/remote-workspace-protocol/guest-shared-client.d.ts.map +1 -1
  155. package/dist/core/remote-workspace-protocol/guest-shared-client.js +1 -5
  156. package/dist/core/remote-workspace-protocol/guest-shared-client.js.map +1 -1
  157. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.d.ts.map +1 -1
  158. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js +5 -10
  159. package/dist/core/remote-workspace-protocol/guest-shared-outbound-scheduler.js.map +1 -1
  160. package/dist/core/remote-workspace-protocol/guest-shared-uplink.d.ts.map +1 -1
  161. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js +2 -9
  162. package/dist/core/remote-workspace-protocol/guest-shared-uplink.js.map +1 -1
  163. package/dist/core/remote-workspace-protocol/lima-owner-directory.d.ts.map +1 -1
  164. package/dist/core/remote-workspace-protocol/lima-owner-directory.js.map +1 -1
  165. package/dist/core/remote-workspace-protocol/lima-owner-lock.d.ts.map +1 -1
  166. package/dist/core/remote-workspace-protocol/lima-owner-lock.js.map +1 -1
  167. package/dist/core/remote-workspace-protocol/session.d.ts.map +1 -1
  168. package/dist/core/remote-workspace-protocol/session.js +27 -65
  169. package/dist/core/remote-workspace-protocol/session.js.map +1 -1
  170. package/dist/core/remote-workspace-protocol/shared-transport.d.ts.map +1 -1
  171. package/dist/core/remote-workspace-protocol/shared-transport.js.map +1 -1
  172. package/dist/core/resolve-config-value.d.ts.map +1 -1
  173. package/dist/core/resolve-config-value.js.map +1 -1
  174. package/dist/core/resource-loader.d.ts.map +1 -1
  175. package/dist/core/resource-loader.js +0 -48
  176. package/dist/core/resource-loader.js.map +1 -1
  177. package/dist/core/rules.d.ts.map +1 -1
  178. package/dist/core/rules.js.map +1 -1
  179. package/dist/core/sandbox/command.d.ts.map +1 -1
  180. package/dist/core/sandbox/command.js.map +1 -1
  181. package/dist/core/sandbox/config.d.ts.map +1 -1
  182. package/dist/core/sandbox/config.js.map +1 -1
  183. package/dist/core/sandbox/lima-guest-binary.d.ts.map +1 -1
  184. package/dist/core/sandbox/lima-guest-binary.js.map +1 -1
  185. package/dist/core/sandbox/lima.d.ts +2 -0
  186. package/dist/core/sandbox/lima.d.ts.map +1 -1
  187. package/dist/core/sandbox/lima.js +3 -9
  188. package/dist/core/sandbox/lima.js.map +1 -1
  189. package/dist/core/sandbox/shared-lima-roots.d.ts.map +1 -1
  190. package/dist/core/sandbox/shared-lima-roots.js.map +1 -1
  191. package/dist/core/sandbox/update-shared-guest-binary.d.ts.map +1 -1
  192. package/dist/core/sandbox/update-shared-guest-binary.js.map +1 -1
  193. package/dist/core/session/constants.d.ts.map +1 -1
  194. package/dist/core/session/context-metadata.d.ts.map +1 -1
  195. package/dist/core/session/context-metadata.js.map +1 -1
  196. package/dist/core/session/context.d.ts.map +1 -1
  197. package/dist/core/session/context.js.map +1 -1
  198. package/dist/core/session/ids.d.ts.map +1 -1
  199. package/dist/core/session/ids.js.map +1 -1
  200. package/dist/core/session/in-memory-session-manager.d.ts.map +1 -1
  201. package/dist/core/session/in-memory-session-manager.js +0 -1
  202. package/dist/core/session/in-memory-session-manager.js.map +1 -1
  203. package/dist/core/session/in-memory-session.d.ts.map +1 -1
  204. package/dist/core/session/in-memory-session.js.map +1 -1
  205. package/dist/core/session/jsonl-errors.d.ts.map +1 -1
  206. package/dist/core/session/jsonl-errors.js +0 -11
  207. package/dist/core/session/jsonl-errors.js.map +1 -1
  208. package/dist/core/session/jsonl-helpers.d.ts.map +1 -1
  209. package/dist/core/session/jsonl-helpers.js.map +1 -1
  210. package/dist/core/session/local-session-manager.d.ts.map +1 -1
  211. package/dist/core/session/local-session-manager.js +4 -6
  212. package/dist/core/session/local-session-manager.js.map +1 -1
  213. package/dist/core/session/local-session.d.ts.map +1 -1
  214. package/dist/core/session/local-session.js.map +1 -1
  215. package/dist/core/session/migrations.d.ts.map +1 -1
  216. package/dist/core/session/migrations.js.map +1 -1
  217. package/dist/core/session/remote-session-client.d.ts.map +1 -1
  218. package/dist/core/session/remote-session-client.js +0 -6
  219. package/dist/core/session/remote-session-client.js.map +1 -1
  220. package/dist/core/session/remote-session-manager.d.ts.map +1 -1
  221. package/dist/core/session/remote-session-manager.js +0 -3
  222. package/dist/core/session/remote-session-manager.js.map +1 -1
  223. package/dist/core/session/remote-session.d.ts.map +1 -1
  224. package/dist/core/session/remote-session.js +0 -1
  225. package/dist/core/session/remote-session.js.map +1 -1
  226. package/dist/core/session/session-manager.d.ts.map +1 -1
  227. package/dist/core/session/session.d.ts.map +1 -1
  228. package/dist/core/session/session.js +1 -5
  229. package/dist/core/session/session.js.map +1 -1
  230. package/dist/core/session/stores/in-memory-session-store.d.ts.map +1 -1
  231. package/dist/core/session/stores/in-memory-session-store.js +7 -6
  232. package/dist/core/session/stores/in-memory-session-store.js.map +1 -1
  233. package/dist/core/session/stores/jsonl-session-store.d.ts.map +1 -1
  234. package/dist/core/session/stores/jsonl-session-store.js +6 -14
  235. package/dist/core/session/stores/jsonl-session-store.js.map +1 -1
  236. package/dist/core/session/stores/remote-session-store.d.ts.map +1 -1
  237. package/dist/core/session/stores/remote-session-store.js +3 -8
  238. package/dist/core/session/stores/remote-session-store.js.map +1 -1
  239. package/dist/core/session/stores/session-store.d.ts.map +1 -1
  240. package/dist/core/session/types.d.ts.map +1 -1
  241. package/dist/core/session/usage-ledger.d.ts.map +1 -1
  242. package/dist/core/session/usage-ledger.js.map +1 -1
  243. package/dist/core/session-cwd.d.ts.map +1 -1
  244. package/dist/core/session-cwd.js +0 -1
  245. package/dist/core/session-cwd.js.map +1 -1
  246. package/dist/core/settings-manager.d.ts.map +1 -1
  247. package/dist/core/settings-manager.js +9 -17
  248. package/dist/core/settings-manager.js.map +1 -1
  249. package/dist/core/skills.d.ts.map +1 -1
  250. package/dist/core/skills.js.map +1 -1
  251. package/dist/core/slash-commands.d.ts.map +1 -1
  252. package/dist/core/source-info.d.ts.map +1 -1
  253. package/dist/core/source-info.js.map +1 -1
  254. package/dist/core/system-prompt.d.ts.map +1 -1
  255. package/dist/core/system-prompt.js.map +1 -1
  256. package/dist/core/telemetry.d.ts.map +1 -1
  257. package/dist/core/telemetry.js.map +1 -1
  258. package/dist/core/timings.d.ts.map +1 -1
  259. package/dist/core/timings.js.map +1 -1
  260. package/dist/core/tools/bash.d.ts.map +1 -1
  261. package/dist/core/tools/bash.js +8 -5
  262. package/dist/core/tools/bash.js.map +1 -1
  263. package/dist/core/tools/compress-context.d.ts.map +1 -1
  264. package/dist/core/tools/compress-context.js.map +1 -1
  265. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  266. package/dist/core/tools/edit-diff.js.map +1 -1
  267. package/dist/core/tools/edit.d.ts.map +1 -1
  268. package/dist/core/tools/edit.js.map +1 -1
  269. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  270. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  271. package/dist/core/tools/find.d.ts.map +1 -1
  272. package/dist/core/tools/find.js.map +1 -1
  273. package/dist/core/tools/grep.d.ts.map +1 -1
  274. package/dist/core/tools/grep.js.map +1 -1
  275. package/dist/core/tools/hash-store.d.ts.map +1 -1
  276. package/dist/core/tools/hash-store.js.map +1 -1
  277. package/dist/core/tools/hashline/apply.d.ts.map +1 -1
  278. package/dist/core/tools/hashline/apply.js.map +1 -1
  279. package/dist/core/tools/hashline/hash.d.ts.map +1 -1
  280. package/dist/core/tools/hashline/hash.js.map +1 -1
  281. package/dist/core/tools/hashline/parse.d.ts.map +1 -1
  282. package/dist/core/tools/hashline/parse.js.map +1 -1
  283. package/dist/core/tools/hashline/resolve.d.ts.map +1 -1
  284. package/dist/core/tools/hashline/resolve.js.map +1 -1
  285. package/dist/core/tools/hashline-utils.d.ts.map +1 -1
  286. package/dist/core/tools/hashline-utils.js.map +1 -1
  287. package/dist/core/tools/index.d.ts.map +1 -1
  288. package/dist/core/tools/index.js.map +1 -1
  289. package/dist/core/tools/ls.d.ts.map +1 -1
  290. package/dist/core/tools/ls.js.map +1 -1
  291. package/dist/core/tools/operations.d.ts +5 -0
  292. package/dist/core/tools/operations.d.ts.map +1 -1
  293. package/dist/core/tools/operations.js +26 -24
  294. package/dist/core/tools/operations.js.map +1 -1
  295. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  296. package/dist/core/tools/output-accumulator.js +12 -18
  297. package/dist/core/tools/output-accumulator.js.map +1 -1
  298. package/dist/core/tools/path-utils.d.ts.map +1 -1
  299. package/dist/core/tools/path-utils.js.map +1 -1
  300. package/dist/core/tools/read.d.ts.map +1 -1
  301. package/dist/core/tools/read.js.map +1 -1
  302. package/dist/core/tools/render-utils.d.ts.map +1 -1
  303. package/dist/core/tools/render-utils.js.map +1 -1
  304. package/dist/core/tools/replace-diff.d.ts.map +1 -1
  305. package/dist/core/tools/replace-diff.js.map +1 -1
  306. package/dist/core/tools/replace-normalize.d.ts.map +1 -1
  307. package/dist/core/tools/replace-normalize.js.map +1 -1
  308. package/dist/core/tools/replace-render.d.ts +1 -1
  309. package/dist/core/tools/replace-render.d.ts.map +1 -1
  310. package/dist/core/tools/replace-render.js.map +1 -1
  311. package/dist/core/tools/runtime.d.ts.map +1 -1
  312. package/dist/core/tools/runtime.js.map +1 -1
  313. package/dist/core/tools/session-history.d.ts.map +1 -1
  314. package/dist/core/tools/session-history.js.map +1 -1
  315. package/dist/core/tools/subagent-agents.d.ts.map +1 -1
  316. package/dist/core/tools/subagent-agents.js.map +1 -1
  317. package/dist/core/tools/subagent.d.ts.map +1 -1
  318. package/dist/core/tools/subagent.js.map +1 -1
  319. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  320. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  321. package/dist/core/tools/truncate.d.ts.map +1 -1
  322. package/dist/core/tools/truncate.js.map +1 -1
  323. package/dist/core/tools/websearch.d.ts.map +1 -1
  324. package/dist/core/tools/websearch.js.map +1 -1
  325. package/dist/core/tools/workspace-tool-host.d.ts +1 -0
  326. package/dist/core/tools/workspace-tool-host.d.ts.map +1 -1
  327. package/dist/core/tools/workspace-tool-host.js +36 -22
  328. package/dist/core/tools/workspace-tool-host.js.map +1 -1
  329. package/dist/core/tools/write.d.ts.map +1 -1
  330. package/dist/core/tools/write.js +0 -1
  331. package/dist/core/tools/write.js.map +1 -1
  332. package/dist/core/workspace-identity.d.ts.map +1 -1
  333. package/dist/daemon/activity-budget.d.ts.map +1 -1
  334. package/dist/daemon/activity-budget.js +2 -3
  335. package/dist/daemon/activity-budget.js.map +1 -1
  336. package/dist/daemon/command.d.ts.map +1 -1
  337. package/dist/daemon/command.js.map +1 -1
  338. package/dist/daemon/config.d.ts +2 -0
  339. package/dist/daemon/config.d.ts.map +1 -1
  340. package/dist/daemon/config.js +4 -0
  341. package/dist/daemon/config.js.map +1 -1
  342. package/dist/daemon/help.d.ts.map +1 -1
  343. package/dist/daemon/help.js +4 -3
  344. package/dist/daemon/help.js.map +1 -1
  345. package/dist/daemon/lsp-config.d.ts.map +1 -1
  346. package/dist/daemon/lsp-config.js.map +1 -1
  347. package/dist/daemon/outbound-budget.d.ts.map +1 -1
  348. package/dist/daemon/outbound-budget.js +2 -4
  349. package/dist/daemon/outbound-budget.js.map +1 -1
  350. package/dist/daemon/security.d.ts.map +1 -1
  351. package/dist/daemon/security.js.map +1 -1
  352. package/dist/daemon/server.d.ts.map +1 -1
  353. package/dist/daemon/server.js.map +1 -1
  354. package/dist/daemon/shared-connection.d.ts.map +1 -1
  355. package/dist/daemon/shared-connection.js +10 -15
  356. package/dist/daemon/shared-connection.js.map +1 -1
  357. package/dist/daemon/shared-revision.d.ts.map +1 -1
  358. package/dist/daemon/shared-revision.js +2 -1
  359. package/dist/daemon/shared-revision.js.map +1 -1
  360. package/dist/daemon/shared-roots.d.ts.map +1 -1
  361. package/dist/daemon/shared-roots.js +0 -1
  362. package/dist/daemon/shared-roots.js.map +1 -1
  363. package/dist/daemon/workspace-runtime.d.ts +2 -0
  364. package/dist/daemon/workspace-runtime.d.ts.map +1 -1
  365. package/dist/daemon/workspace-runtime.js +43 -15
  366. package/dist/daemon/workspace-runtime.js.map +1 -1
  367. package/dist/index.d.ts.map +1 -1
  368. package/dist/main.d.ts.map +1 -1
  369. package/dist/main.js.map +1 -1
  370. package/dist/migrations.d.ts.map +1 -1
  371. package/dist/migrations.js.map +1 -1
  372. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/assistant-message.js +3 -10
  374. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  375. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  376. package/dist/modes/interactive/components/bash-execution.js +4 -9
  377. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  378. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  379. package/dist/modes/interactive/components/bordered-loader.js +0 -3
  380. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  381. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  382. package/dist/modes/interactive/components/branch-summary-message.js +1 -3
  383. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  384. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  385. package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
  386. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  387. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  388. package/dist/modes/interactive/components/config-selector.js +6 -16
  389. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  390. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  391. package/dist/modes/interactive/components/countdown-timer.js +0 -5
  392. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  393. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  394. package/dist/modes/interactive/components/custom-editor.js +1 -8
  395. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  396. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  397. package/dist/modes/interactive/components/custom-message.js +1 -6
  398. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  399. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  400. package/dist/modes/interactive/components/diff.js.map +1 -1
  401. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  402. package/dist/modes/interactive/components/dynamic-border.js +0 -1
  403. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  404. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  405. package/dist/modes/interactive/components/extension-editor.js +1 -7
  406. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  407. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  408. package/dist/modes/interactive/components/extension-input.js +2 -8
  409. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  410. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  411. package/dist/modes/interactive/components/extension-selector.js +1 -9
  412. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  413. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  414. package/dist/modes/interactive/components/footer.js +1 -3
  415. package/dist/modes/interactive/components/footer.js.map +1 -1
  416. package/dist/modes/interactive/components/hook-execution.d.ts.map +1 -1
  417. package/dist/modes/interactive/components/hook-execution.js +2 -5
  418. package/dist/modes/interactive/components/hook-execution.js.map +1 -1
  419. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  420. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  421. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  422. package/dist/modes/interactive/components/login-dialog.js +3 -9
  423. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  424. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  425. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  426. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  428. package/dist/modes/interactive/components/message-card.d.ts.map +1 -1
  429. package/dist/modes/interactive/components/message-card.js +0 -1
  430. package/dist/modes/interactive/components/message-card.js.map +1 -1
  431. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  432. package/dist/modes/interactive/components/model-selector.js +13 -28
  433. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  434. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  435. package/dist/modes/interactive/components/oauth-selector.js +3 -12
  436. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  437. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/scoped-models-selector.js +9 -13
  439. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  440. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  441. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  442. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  443. package/dist/modes/interactive/components/session-selector.js +33 -58
  444. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  445. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/settings-selector.js +0 -4
  447. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  448. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  449. package/dist/modes/interactive/components/show-images-selector.js +0 -1
  450. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  451. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  452. package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
  453. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  454. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  455. package/dist/modes/interactive/components/theme-selector.js +0 -2
  456. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  457. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  458. package/dist/modes/interactive/components/thinking-selector.js +0 -1
  459. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  460. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  461. package/dist/modes/interactive/components/tool-execution.js +9 -24
  462. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  463. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  464. package/dist/modes/interactive/components/tree-selector.js +18 -34
  465. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  466. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  467. package/dist/modes/interactive/components/user-message-selector.js +3 -6
  468. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  469. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  470. package/dist/modes/interactive/components/user-message.js +0 -4
  471. package/dist/modes/interactive/components/user-message.js.map +1 -1
  472. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  473. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  474. package/dist/modes/interactive/interactive-mode.d.ts +14 -0
  475. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  476. package/dist/modes/interactive/interactive-mode.js +159 -135
  477. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  478. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  479. package/dist/modes/interactive/theme/theme.js +0 -7
  480. package/dist/modes/interactive/theme/theme.js.map +1 -1
  481. package/dist/modes/json-event.d.ts.map +1 -1
  482. package/dist/modes/json-event.js.map +1 -1
  483. package/dist/modes/print-mode.d.ts.map +1 -1
  484. package/dist/modes/print-mode.js.map +1 -1
  485. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  486. package/dist/modes/rpc/jsonl.js.map +1 -1
  487. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  488. package/dist/modes/rpc/rpc-client.js +10 -11
  489. package/dist/modes/rpc/rpc-client.js.map +1 -1
  490. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  491. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  492. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  493. package/dist/package-manager-cli.d.ts.map +1 -1
  494. package/dist/package-manager-cli.js.map +1 -1
  495. package/dist/utils/ansi.d.ts.map +1 -1
  496. package/dist/utils/ansi.js.map +1 -1
  497. package/dist/utils/changelog.d.ts.map +1 -1
  498. package/dist/utils/changelog.js.map +1 -1
  499. package/dist/utils/child-process.d.ts.map +1 -1
  500. package/dist/utils/child-process.js.map +1 -1
  501. package/dist/utils/clipboard-image.d.ts.map +1 -1
  502. package/dist/utils/clipboard-image.js.map +1 -1
  503. package/dist/utils/clipboard-native.d.ts.map +1 -1
  504. package/dist/utils/clipboard-native.js.map +1 -1
  505. package/dist/utils/clipboard.d.ts.map +1 -1
  506. package/dist/utils/clipboard.js.map +1 -1
  507. package/dist/utils/deprecation.d.ts.map +1 -1
  508. package/dist/utils/deprecation.js.map +1 -1
  509. package/dist/utils/directory-completions.d.ts.map +1 -1
  510. package/dist/utils/directory-completions.js.map +1 -1
  511. package/dist/utils/exif-orientation.d.ts.map +1 -1
  512. package/dist/utils/exif-orientation.js.map +1 -1
  513. package/dist/utils/frontmatter.d.ts.map +1 -1
  514. package/dist/utils/frontmatter.js.map +1 -1
  515. package/dist/utils/fs-watch.d.ts.map +1 -1
  516. package/dist/utils/fs-watch.js.map +1 -1
  517. package/dist/utils/git.d.ts.map +1 -1
  518. package/dist/utils/git.js.map +1 -1
  519. package/dist/utils/grip-user-agent.d.ts.map +1 -1
  520. package/dist/utils/grip-user-agent.js.map +1 -1
  521. package/dist/utils/html.d.ts.map +1 -1
  522. package/dist/utils/html.js.map +1 -1
  523. package/dist/utils/image-convert.d.ts.map +1 -1
  524. package/dist/utils/image-convert.js.map +1 -1
  525. package/dist/utils/image-process.d.ts.map +1 -1
  526. package/dist/utils/image-process.js.map +1 -1
  527. package/dist/utils/image-resize-core.d.ts.map +1 -1
  528. package/dist/utils/image-resize-core.js.map +1 -1
  529. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  530. package/dist/utils/image-resize-worker.js.map +1 -1
  531. package/dist/utils/image-resize.d.ts.map +1 -1
  532. package/dist/utils/image-resize.js.map +1 -1
  533. package/dist/utils/json.d.ts.map +1 -1
  534. package/dist/utils/json.js.map +1 -1
  535. package/dist/utils/mime.d.ts.map +1 -1
  536. package/dist/utils/mime.js.map +1 -1
  537. package/dist/utils/open-browser.d.ts.map +1 -1
  538. package/dist/utils/open-browser.js.map +1 -1
  539. package/dist/utils/paths.d.ts.map +1 -1
  540. package/dist/utils/paths.js.map +1 -1
  541. package/dist/utils/photon.d.ts.map +1 -1
  542. package/dist/utils/photon.js +10 -5
  543. package/dist/utils/photon.js.map +1 -1
  544. package/dist/utils/shell.d.ts.map +1 -1
  545. package/dist/utils/shell.js.map +1 -1
  546. package/dist/utils/sleep.d.ts.map +1 -1
  547. package/dist/utils/sleep.js.map +1 -1
  548. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  549. package/dist/utils/syntax-highlight.js +1 -1
  550. package/dist/utils/syntax-highlight.js.map +1 -1
  551. package/dist/utils/tools-manager.d.ts.map +1 -1
  552. package/dist/utils/tools-manager.js.map +1 -1
  553. package/dist/utils/version-check.d.ts.map +1 -1
  554. package/dist/utils/version-check.js.map +1 -1
  555. package/dist/utils/windows-self-update.d.ts.map +1 -1
  556. package/dist/utils/windows-self-update.js.map +1 -1
  557. package/docs/sandbox.md +6 -0
  558. package/docs/sessions.md +1 -1
  559. package/docs/usage.md +2 -1
  560. package/examples/extensions/custom-provider-anthropic/package.json +2 -2
  561. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  562. package/examples/extensions/sandbox/package.json +2 -2
  563. package/examples/extensions/with-deps/package.json +1 -1
  564. package/npm-shrinkwrap.json +601 -833
  565. package/package.json +20 -21
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/core/hooks/executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { performance } from \"node:perf_hooks\";\nimport type { PortablePathFlavor } from \"../lsp/portable-path.ts\";\nimport { matchesHookIf, matchesHookInput } from \"./matcher.ts\";\nimport type {\n\tCommandHookHandler,\n\tHookDiagnostic,\n\tHookDiagnosticCode,\n\tHookExecutionResult,\n\tHookExecutionStatus,\n\tHookHandlerCommon,\n\tHookInput,\n\tHookOutputClassification,\n\tHookRunOptions,\n\tHookStructuredOutput,\n\tHttpHookHandler,\n\tLoadedHookHandler,\n} from \"./types.ts\";\n\nexport const DEFAULT_HOOK_TIMEOUT_SECONDS = 600;\nexport const DEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS = 30;\nexport const DEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS = 1.5;\nexport const MAX_SESSION_END_HOOK_TIMEOUT_SECONDS = 60;\nexport const DEFAULT_MAX_HOOK_OUTPUT_BYTES = 1024 * 1024;\n\ninterface CompletedCommandState {\n\tstdout: Buffer;\n\tstderr: Buffer;\n\tstdoutTruncated: boolean;\n\tstderrTruncated: boolean;\n\toutputLimitExceeded: boolean;\n\ttimedOut: boolean;\n\tcancelled: boolean;\n}\n\ninterface BoundedBufferAppendResult {\n\tvalue: Buffer;\n\ttruncated: boolean;\n}\n\ntype WindowsProcessTreeTerminator = (pid: number) => void;\n\nfunction forceTerminateChildProcess(\n\tchild: ChildProcessWithoutNullStreams,\n\tplatform: NodeJS.Platform,\n\tterminateWindowsTree: WindowsProcessTreeTerminator,\n): void {\n\tif (child.pid && platform === \"win32\") {\n\t\tterminateWindowsTree(child.pid);\n\t} else if (child.pid) {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, \"SIGKILL\");\n\t\t} catch {\n\t\t\tif (child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n\t\t}\n\t} else if (child.exitCode === null && child.signalCode === null) {\n\t\tchild.kill(\"SIGKILL\");\n\t}\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isStructuredOutput(value: unknown): value is HookStructuredOutput {\n\tif (!isObject(value)) return false;\n\treturn (\n\t\t(value.continue === undefined || typeof value.continue === \"boolean\") &&\n\t\t(value.stopReason === undefined || typeof value.stopReason === \"string\") &&\n\t\t(value.systemMessage === undefined || typeof value.systemMessage === \"string\") &&\n\t\t(value.decision === undefined || typeof value.decision === \"string\") &&\n\t\t(value.reason === undefined || typeof value.reason === \"string\") &&\n\t\t(value.hookSpecificOutput === undefined || isObject(value.hookSpecificOutput))\n\t);\n}\nexport function classifyHookOutput(stdout: string): HookOutputClassification {\n\tif (stdout.length === 0) return { kind: \"empty\" };\n\tif (!stdout.trimStart().startsWith(\"{\")) return { kind: \"text\", text: stdout, malformedJson: false };\n\ttry {\n\t\tconst value: unknown = JSON.parse(stdout);\n\t\treturn isStructuredOutput(value) ? { kind: \"json\", value } : { kind: \"text\", text: stdout, malformedJson: true };\n\t} catch {\n\t\treturn { kind: \"text\", text: stdout, malformedJson: true };\n\t}\n}\n\nexport function defaultHookTimeoutSeconds(input: HookInput): number {\n\tif (input.hook_event_name === \"SessionEnd\") return DEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS;\n\tif (input.hook_event_name === \"UserPromptSubmit\") return DEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS;\n\treturn DEFAULT_HOOK_TIMEOUT_SECONDS;\n}\n\nfunction hookTimeoutSeconds(handler: HookHandlerCommon, input: HookInput, options?: HookRunOptions): number {\n\tif (options?.timeoutSeconds !== undefined) return options.timeoutSeconds;\n\tconst timeout = handler.timeout ?? defaultHookTimeoutSeconds(input);\n\treturn input.hook_event_name === \"SessionEnd\" ? Math.min(timeout, MAX_SESSION_END_HOOK_TIMEOUT_SECONDS) : timeout;\n}\nexport function sanitizedHookEnvironment(source: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\n\tconst result: NodeJS.ProcessEnv = {};\n\tfor (const [key, value] of Object.entries(source)) {\n\t\tif (key.startsWith(\"OTEL_\")) continue;\n\t\tif (/^(?:GRIP|PI)_.*(?:TOKEN|CREDENTIAL|API_KEY|SECRET|PASSWORD)/i.test(key)) continue;\n\t\tresult[key] = value;\n\t}\n\treturn result;\n}\nfunction appendBounded(current: Buffer, chunk: Buffer, maximum: number): BoundedBufferAppendResult {\n\tif (current.length >= maximum) return { value: current, truncated: chunk.length > 0 };\n\tconst remaining = maximum - current.length;\n\treturn { value: Buffer.concat([current, chunk.subarray(0, remaining)]), truncated: chunk.length > remaining };\n}\nfunction exitTwoBlocks(input: HookInput): boolean {\n\treturn (\n\t\tinput.hook_event_name === \"PreToolUse\" ||\n\t\tinput.hook_event_name === \"UserPromptSubmit\" ||\n\t\tinput.hook_event_name === \"Stop\" ||\n\t\tinput.hook_event_name === \"PreCompact\"\n\t);\n}\nfunction structuredBlockingReason(output: HookOutputClassification, input: HookInput): string | undefined {\n\tif (output.kind !== \"json\") return undefined;\n\tif (output.value.continue === false && typeof output.value.stopReason === \"string\") return output.value.stopReason;\n\tif (input.hook_event_name === \"PreToolUse\") {\n\t\tconst specific = output.value.hookSpecificOutput;\n\t\tif (\n\t\t\tspecific?.hookEventName === input.hook_event_name &&\n\t\t\tspecific.permissionDecision === \"deny\" &&\n\t\t\ttypeof specific.permissionDecisionReason === \"string\"\n\t\t) {\n\t\t\treturn specific.permissionDecisionReason;\n\t\t}\n\t}\n\tif (output.value.decision === \"block\" && typeof output.value.reason === \"string\") return output.value.reason;\n\treturn undefined;\n}\nfunction diagnostic(hook: LoadedHookHandler, code: HookDiagnosticCode, message: string): HookDiagnostic {\n\treturn { level: \"warning\", code, message, source: hook.source, event: hook.event };\n}\nfunction resultBase(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tpartial: Partial<HookExecutionResult>,\n): HookExecutionResult {\n\treturn {\n\t\thook,\n\t\tstatus: \"error\",\n\t\texitCode: null,\n\t\tstdout: \"\",\n\t\tstderr: \"\",\n\t\tstdoutTruncated: false,\n\t\tstderrTruncated: false,\n\t\toutput: { kind: \"empty\" },\n\t\tblocking: false,\n\t\tdurationMs: performance.now() - started,\n\t\t...partial,\n\t};\n}\n\nfunction completedCommandStatus(state: CompletedCommandState): HookExecutionStatus {\n\tif (state.outputLimitExceeded) return \"error\";\n\tif (state.timedOut) return \"timeout\";\n\tif (state.cancelled) return \"cancelled\";\n\treturn \"completed\";\n}\n\nfunction completedCommandDiagnostic(\n\thook: LoadedHookHandler,\n\tstate: CompletedCommandState,\n\toutput: HookOutputClassification,\n): HookDiagnostic | undefined {\n\tif (state.outputLimitExceeded) {\n\t\treturn diagnostic(hook, \"execution\", \"Hook output exceeded the execution limit\");\n\t}\n\tif (output.kind !== \"text\" || !output.malformedJson) return undefined;\n\treturn diagnostic(hook, \"malformed-output\", \"Hook stdout looked like JSON but was malformed; output was ignored\");\n}\n\nfunction completedCommandResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tinput: HookInput,\n\texitCode: number | null,\n\tstate: CompletedCommandState,\n): HookExecutionResult {\n\tconst stdout = state.stdout.toString(\"utf8\");\n\tconst stderr = state.stderr.toString(\"utf8\");\n\tconst output = state.outputLimitExceeded ? { kind: \"empty\" as const } : classifyHookOutput(stdout);\n\tconst outputDiagnostic = completedCommandDiagnostic(hook, state, output);\n\tconst blocking =\n\t\t!state.timedOut && !state.cancelled && !state.outputLimitExceeded && exitCode === 2 && exitTwoBlocks(input);\n\treturn resultBase(hook, started, {\n\t\tstatus: completedCommandStatus(state),\n\t\texitCode,\n\t\tstdout,\n\t\tstderr,\n\t\tstdoutTruncated: state.stdoutTruncated,\n\t\tstderrTruncated: state.stderrTruncated,\n\t\toutput,\n\t\tdiagnostic: outputDiagnostic,\n\t\tblocking,\n\t\t...(blocking\n\t\t\t? { blockingReason: structuredBlockingReason(output, input) ?? (stderr.trim() || \"Hook blocked the action\") }\n\t\t\t: {}),\n\t});\n}\n\nfunction shellQuote(value: string): string {\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction projectHookUsesWorkspaceBackend(hook: LoadedHookHandler, options: HookRunOptions): boolean {\n\tif (hook.source.kind !== \"project\" && hook.source.kind !== \"local\") return false;\n\treturn options.toolOperations?.getBackendInfo?.()?.type !== \"local\";\n}\n\nconst WORKSPACE_HOOK_RUNNER = String.raw`\nconst { spawn } = require(\"node:child_process\");\nconst spec = JSON.parse(Buffer.from(process.argv[1], \"base64\").toString(\"utf8\"));\nconst env = { ...process.env };\nfor (const name of Object.keys(env)) {\n if (name.startsWith(\"OTEL_\") || /^(?:GRIP|PI)_.*(?:TOKEN|CREDENTIAL|API_KEY|SECRET|PASSWORD)/i.test(name)) delete env[name];\n}\nconst frame = (stream, data) => process.stdout.write(\"GRIPHOOK1 \" + stream + \" \" + Buffer.from(data).toString(\"base64\") + \"\\n\");\nlet failed = false;\nconst child = spawn(spec.file, spec.args, { cwd: spec.cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"], windowsHide: true });\nchild.stdout.on(\"data\", (data) => frame(\"stdout\", data));\nchild.stderr.on(\"data\", (data) => frame(\"stderr\", data));\nchild.on(\"error\", (error) => { failed = true; frame(\"stderr\", Buffer.from(String(error))); process.exitCode = 127; });\nchild.on(\"close\", (code) => { if (!failed) process.exitCode = code === null ? 1 : code; });\nchild.stdin.on(\"error\", () => {});\nchild.stdin.end(Buffer.from(spec.stdinBase64, \"base64\"));\n`;\n\ninterface WorkspaceHookPreparation {\n\tok: boolean;\n\tcommand?: string;\n\tinput: HookInput;\n}\n\ninterface WorkspaceHookOutputState {\n\tmaximum: number;\n\tstdout: Buffer;\n\tstderr: Buffer;\n\tstdoutTruncated: boolean;\n\tstderrTruncated: boolean;\n\tpending: string;\n\toutputLimitExceeded: boolean;\n\toutputController: AbortController;\n}\n\nfunction prepareWorkspaceHook(\n\thandler: CommandHookHandler,\n\tinput: HookInput,\n\tcwd: string,\n\tpathFlavor: PortablePathFlavor,\n): WorkspaceHookPreparation {\n\tconst workspaceInput = { ...input, cwd };\n\tconst stdin = Buffer.from(JSON.stringify(workspaceInput));\n\tif (stdin.byteLength > 256 * 1024) return { ok: false, input: workspaceInput };\n\tlet file = handler.command;\n\tlet args = handler.args ?? [];\n\tif (handler.args === undefined) {\n\t\tif (handler.shell === \"powershell\" || (handler.shell === undefined && pathFlavor === \"windows\")) {\n\t\t\tfile = pathFlavor === \"windows\" ? \"powershell.exe\" : \"pwsh\";\n\t\t\targs = [\"-NoProfile\", \"-Command\", handler.command];\n\t\t} else {\n\t\t\tfile = handler.shell === \"bash\" ? \"bash\" : \"/bin/sh\";\n\t\t\targs = [\"-c\", handler.command];\n\t\t}\n\t}\n\tconst spec = Buffer.from(JSON.stringify({ file, args, cwd, stdinBase64: stdin.toString(\"base64\") })).toString(\n\t\t\"base64\",\n\t);\n\treturn {\n\t\tok: true,\n\t\tcommand: `node -e ${shellQuote(WORKSPACE_HOOK_RUNNER)} ${shellQuote(spec)}`,\n\t\tinput: workspaceInput,\n\t};\n}\n\nfunction createWorkspaceHookOutputState(maximum: number): WorkspaceHookOutputState {\n\treturn {\n\t\tmaximum,\n\t\tstdout: Buffer.alloc(0),\n\t\tstderr: Buffer.alloc(0),\n\t\tstdoutTruncated: false,\n\t\tstderrTruncated: false,\n\t\tpending: \"\",\n\t\toutputLimitExceeded: false,\n\t\toutputController: new AbortController(),\n\t};\n}\n\nfunction exceedWorkspaceHookOutputLimit(state: WorkspaceHookOutputState): void {\n\tif (state.outputLimitExceeded) return;\n\tstate.outputLimitExceeded = true;\n\tstate.outputController.abort();\n}\n\nfunction consumeWorkspaceHookLine(state: WorkspaceHookOutputState, line: string): void {\n\tconst match = /^GRIPHOOK1 (stdout|stderr) ([A-Za-z0-9+/]*={0,2})$/.exec(line);\n\tif (!match) {\n\t\tconst next = appendBounded(state.stderr, Buffer.from(`${line}\\n`), state.maximum);\n\t\tstate.stderr = next.value;\n\t\tstate.stderrTruncated ||= next.truncated;\n\t\tif (next.truncated) exceedWorkspaceHookOutputLimit(state);\n\t\treturn;\n\t}\n\tconst chunk = Buffer.from(match[2], \"base64\");\n\tif (match[1] === \"stdout\") {\n\t\tconst next = appendBounded(state.stdout, chunk, state.maximum);\n\t\tstate.stdout = next.value;\n\t\tstate.stdoutTruncated ||= next.truncated;\n\t} else {\n\t\tconst next = appendBounded(state.stderr, chunk, state.maximum);\n\t\tstate.stderr = next.value;\n\t\tstate.stderrTruncated ||= next.truncated;\n\t}\n\tif (state.stdoutTruncated || state.stderrTruncated) exceedWorkspaceHookOutputLimit(state);\n}\n\nfunction consumeWorkspaceHookData(state: WorkspaceHookOutputState, data: Buffer): void {\n\tif (state.outputLimitExceeded) return;\n\tstate.pending += data.toString(\"utf8\");\n\tconst maximumFrameChars = Math.ceil((state.maximum * 4) / 3) + 1024;\n\tif (state.pending.length > maximumFrameChars) {\n\t\tstate.pending = state.pending.slice(0, maximumFrameChars);\n\t\tstate.stderrTruncated = true;\n\t\texceedWorkspaceHookOutputLimit(state);\n\t\treturn;\n\t}\n\tconst lines = state.pending.split(\"\\n\");\n\tstate.pending = lines.pop() ?? \"\";\n\tfor (const line of lines) consumeWorkspaceHookLine(state, line.replace(/\\r$/, \"\"));\n}\n\nfunction completeWorkspaceHookOutput(state: WorkspaceHookOutputState): void {\n\tif (state.pending) consumeWorkspaceHookLine(state, state.pending);\n}\n\nfunction completedWorkspaceHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tinput: HookInput,\n\tstate: WorkspaceHookOutputState,\n\texitCode: number | null,\n): HookExecutionResult {\n\tconst stdout = state.stdout.toString(\"utf8\");\n\tconst stderr = state.stderr.toString(\"utf8\");\n\tconst output = state.outputLimitExceeded ? { kind: \"empty\" as const } : classifyHookOutput(stdout);\n\tlet outputDiagnostic: HookDiagnostic | undefined;\n\tif (output.kind === \"text\" && output.malformedJson) {\n\t\toutputDiagnostic = diagnostic(\n\t\t\thook,\n\t\t\t\"malformed-output\",\n\t\t\t\"Hook stdout looked like JSON but was malformed; output was ignored\",\n\t\t);\n\t} else if (state.outputLimitExceeded) {\n\t\toutputDiagnostic = diagnostic(hook, \"execution\", \"Project hook output exceeded the workspace execution limit\");\n\t}\n\tconst blocking = !state.outputLimitExceeded && exitCode === 2 && exitTwoBlocks(input);\n\treturn resultBase(hook, started, {\n\t\tstatus: state.outputLimitExceeded ? \"error\" : \"completed\",\n\t\texitCode,\n\t\tstdout,\n\t\tstderr,\n\t\tstdoutTruncated: state.stdoutTruncated,\n\t\tstderrTruncated: state.stderrTruncated,\n\t\toutput,\n\t\tdiagnostic: outputDiagnostic,\n\t\tblocking,\n\t\t...(blocking\n\t\t\t? { blockingReason: structuredBlockingReason(output, input) ?? (stderr.trim() || \"Hook blocked the action\") }\n\t\t\t: {}),\n\t});\n}\n\nfunction failedWorkspaceHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\toptions: HookRunOptions,\n\tstate: WorkspaceHookOutputState,\n\terror: unknown,\n): HookExecutionResult {\n\tconst cancelled = !state.outputLimitExceeded && options.signal?.aborted === true;\n\treturn resultBase(hook, started, {\n\t\tstatus: cancelled ? \"cancelled\" : \"error\",\n\t\tstdout: state.stdout.toString(\"utf8\"),\n\t\tstderr: state.stderr.toString(\"utf8\"),\n\t\tstdoutTruncated: state.stdoutTruncated,\n\t\tstderrTruncated: state.stderrTruncated,\n\t\tdiagnostic: state.outputLimitExceeded\n\t\t\t? diagnostic(hook, \"execution\", \"Project hook output exceeded the workspace execution limit\")\n\t\t\t: cancelled\n\t\t\t\t? undefined\n\t\t\t\t: diagnostic(hook, \"execution\", `Workspace project hook failed: ${String(error)}`),\n\t});\n}\nasync function executeWorkspaceCommand(\n\thook: LoadedHookHandler,\n\thandler: CommandHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions,\n): Promise<HookExecutionResult> {\n\tconst started = performance.now();\n\tconst operations = options.toolOperations;\n\tconst backend = operations?.getBackendInfo?.();\n\tif (!operations || !backend || backend.type === \"local\" || (backend.type === \"remote\" && !backend.configured)) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(\n\t\t\t\thook,\n\t\t\t\t\"policy\",\n\t\t\t\t\"Project hook was not executed because the workspace backend is unavailable\",\n\t\t\t),\n\t\t});\n\t}\n\tconst pathFlavor = backend.type === \"remote\" && backend.configured ? backend.workspace.pathFlavor : \"posix\";\n\tconst preparation = prepareWorkspaceHook(handler, input, backend.cwd, pathFlavor);\n\tif (!preparation.ok || !preparation.command) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(hook, \"policy\", \"Project hook input exceeds the workspace execution limit\"),\n\t\t});\n\t}\n\tconst state = createWorkspaceHookOutputState(options.maxOutputBytes ?? DEFAULT_MAX_HOOK_OUTPUT_BYTES);\n\tconst signals = [options.signal, state.outputController.signal].filter(\n\t\t(signal): signal is AbortSignal => signal !== undefined,\n\t);\n\tconst signal = signals.length === 1 ? signals[0] : AbortSignal.any(signals);\n\ttry {\n\t\tconst result = await operations.exec(preparation.command, {\n\t\t\tcwd: backend.cwd,\n\t\t\tonData: (data) => consumeWorkspaceHookData(state, data),\n\t\t\tsignal,\n\t\t\ttimeout: hookTimeoutSeconds(handler, preparation.input, options),\n\t\t});\n\t\tcompleteWorkspaceHookOutput(state);\n\t\treturn completedWorkspaceHookResult(hook, started, preparation.input, state, result.exitCode);\n\t} catch (error) {\n\t\treturn failedWorkspaceHookResult(hook, started, options, state, error);\n\t}\n}\n\nasync function executeCommand(\n\thook: LoadedHookHandler,\n\thandler: CommandHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions,\n): Promise<HookExecutionResult> {\n\tif (projectHookUsesWorkspaceBackend(hook, options)) return executeWorkspaceCommand(hook, handler, input, options);\n\tconst started = performance.now();\n\tconst timeoutMs = hookTimeoutSeconds(handler, input, options) * 1000;\n\tconst maximum = options.maxOutputBytes ?? DEFAULT_MAX_HOOK_OUTPUT_BYTES;\n\tconst useExec = handler.args !== undefined;\n\tlet command = handler.command;\n\tlet args = handler.args ?? [];\n\tif (!useExec) {\n\t\tif (handler.shell === \"powershell\") {\n\t\t\tcommand = process.platform === \"win32\" ? \"powershell.exe\" : \"pwsh\";\n\t\t\targs = [\"-NoProfile\", \"-Command\", handler.command];\n\t\t} else if (handler.shell === \"bash\") {\n\t\t\tcommand = \"bash\";\n\t\t\targs = [\"-c\", handler.command];\n\t\t} else if (process.platform === \"win32\") {\n\t\t\tcommand = \"powershell.exe\";\n\t\t\targs = [\"-NoProfile\", \"-Command\", handler.command];\n\t\t} else {\n\t\t\tcommand = \"/bin/sh\";\n\t\t\targs = [\"-c\", handler.command];\n\t\t}\n\t}\n\treturn await new Promise((resolve) => {\n\t\tlet child: ChildProcessWithoutNullStreams;\n\t\ttry {\n\t\t\tchild = spawn(command, args, {\n\t\t\t\tcwd: input.cwd,\n\t\t\t\tenv: sanitizedHookEnvironment(options.env),\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve(resultBase(hook, started, { diagnostic: diagnostic(hook, \"execution\", String(error)) }));\n\t\t\treturn;\n\t\t}\n\t\tlet stdout: Buffer = Buffer.alloc(0);\n\t\tlet stderr: Buffer = Buffer.alloc(0);\n\t\tlet stdoutTruncated = false;\n\t\tlet stderrTruncated = false;\n\t\tlet outputLimitExceeded = false;\n\t\tlet settled = false;\n\t\tlet timedOut = false;\n\t\tlet cancelled = false;\n\t\tconst platform = options.platform ?? process.platform;\n\t\tlet windowsTerminationStarted = false;\n\t\tconst terminateWindowsTree = (pid: number) => {\n\t\t\tif (windowsTerminationStarted) return;\n\t\t\twindowsTerminationStarted = true;\n\t\t\tconst fallback = () => {\n\t\t\t\tif (child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n\t\t\t};\n\t\t\tif (options.terminateWindowsProcessTree) {\n\t\t\t\t// The abstraction is invoked before any direct-child fallback, matching taskkill ordering.\n\t\t\t\tif (!options.terminateWindowsProcessTree(pid)) fallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst killer = spawn(\"taskkill\", [\"/PID\", String(pid), \"/T\", \"/F\"], {\n\t\t\t\t\tstdio: \"ignore\",\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t});\n\t\t\t\tconst bound = setTimeout(() => {\n\t\t\t\t\tkiller.kill();\n\t\t\t\t\tfallback();\n\t\t\t\t}, 1000);\n\t\t\t\tbound.unref();\n\t\t\t\tkiller.once(\"close\", (code) => {\n\t\t\t\t\tclearTimeout(bound);\n\t\t\t\t\tif (code !== 0) fallback();\n\t\t\t\t});\n\t\t\t\tkiller.once(\"error\", () => {\n\t\t\t\t\tclearTimeout(bound);\n\t\t\t\t\tfallback();\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tfallback();\n\t\t\t}\n\t\t};\n\t\tconst terminate = () => {\n\t\t\tif (child.pid && platform === \"win32\") {\n\t\t\t\t// taskkill /T /F gets a bounded opportunity before direct-child fallback.\n\t\t\t\tterminateWindowsTree(child.pid);\n\t\t\t} else if (child.pid) {\n\t\t\t\ttry {\n\t\t\t\t\tprocess.kill(-child.pid, \"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\t}\n\t\t\t} else child.kill(\"SIGTERM\");\n\t\t\tsetTimeout(() => {\n\t\t\t\tforceTerminateChildProcess(child, platform, terminateWindowsTree);\n\t\t\t}, 250).unref();\n\t\t};\n\t\tconst onAbort = () => {\n\t\t\tcancelled = true;\n\t\t\tterminate();\n\t\t};\n\t\tif (options.signal?.aborted) onAbort();\n\t\telse options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tconst timer = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tterminate();\n\t\t}, timeoutMs);\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tconst next = appendBounded(stdout, data, maximum);\n\t\t\tstdout = next.value;\n\t\t\tstdoutTruncated ||= next.truncated;\n\t\t\tif (next.truncated && !outputLimitExceeded) {\n\t\t\t\toutputLimitExceeded = true;\n\t\t\t\tterminate();\n\t\t\t}\n\t\t});\n\t\tchild.stderr.on(\"data\", (data: Buffer) => {\n\t\t\tconst next = appendBounded(stderr, data, maximum);\n\t\t\tstderr = next.value;\n\t\t\tstderrTruncated ||= next.truncated;\n\t\t\tif (next.truncated && !outputLimitExceeded) {\n\t\t\t\toutputLimitExceeded = true;\n\t\t\t\tterminate();\n\t\t\t}\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(\n\t\t\t\tresultBase(hook, started, {\n\t\t\t\t\tstdout: stdout.toString(\"utf8\"),\n\t\t\t\t\tstderr: stderr.toString(\"utf8\"),\n\t\t\t\t\tstdoutTruncated,\n\t\t\t\t\tstderrTruncated,\n\t\t\t\t\tdiagnostic: diagnostic(hook, \"execution\", String(error)),\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(\n\t\t\t\tcompletedCommandResult(hook, started, input, code, {\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\tstdoutTruncated,\n\t\t\t\t\tstderrTruncated,\n\t\t\t\t\toutputLimitExceeded,\n\t\t\t\t\ttimedOut,\n\t\t\t\t\tcancelled,\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\tchild.stdin.on(\"error\", () => undefined);\n\t\tchild.stdin.end(JSON.stringify(input));\n\t});\n}\nfunction interpolateHeader(value: string, allowed: Set<string>, env: NodeJS.ProcessEnv): string {\n\treturn value.replace(\n\t\t/\\$(?:\\{([A-Za-z_][A-Za-z0-9_]*)\\}|([A-Za-z_][A-Za-z0-9_]*))/g,\n\t\t(_match, braced: string | undefined, bare: string | undefined) => {\n\t\t\tconst name = braced ?? bare ?? \"\";\n\t\t\treturn allowed.has(name) ? (env[name] ?? \"\") : \"\";\n\t\t},\n\t);\n}\nfunction httpHookTransportAllowed(value: string): boolean {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (url.protocol === \"https:\") return true;\n\tif (url.protocol !== \"http:\") return false;\n\tconst hostname = url.hostname.replace(/^\\[|\\]$/g, \"\").toLowerCase();\n\treturn (\n\t\thostname === \"localhost\" ||\n\t\thostname === \"::1\" ||\n\t\t/^127(?:\\.[0-9]{1,3}){3}$/.test(hostname) ||\n\t\t/^::ffff:127(?:\\.[0-9]{1,3}){3}$/.test(hostname)\n\t);\n}\n\ninterface HttpHookResponseBody {\n\tstdout: string;\n\ttruncated: boolean;\n}\n\nfunction createHttpHookHeaders(\n\thook: LoadedHookHandler,\n\thandler: HttpHookHandler,\n\toptions: HookRunOptions,\n\tenv: NodeJS.ProcessEnv,\n): Record<string, string> {\n\tconst settingsAllowed = new Set(hook.httpHookAllowedEnvVars ?? handler.allowedEnvVars ?? []);\n\tconst hostAllowed = options.httpHookAllowedEnvVars ? new Set(options.httpHookAllowedEnvVars) : undefined;\n\tconst allowed = new Set([...settingsAllowed].filter((name) => !hostAllowed || hostAllowed.has(name)));\n\tconst headers: Record<string, string> = { \"content-type\": \"application/json\" };\n\tfor (const [key, value] of Object.entries(handler.headers ?? {})) {\n\t\theaders[key] = interpolateHeader(value, allowed, env);\n\t}\n\treturn headers;\n}\n\nasync function readHttpHookResponseBody(response: Response, maximum: number): Promise<HttpHookResponseBody> {\n\tlet raw: Buffer = Buffer.alloc(0);\n\tlet truncated = false;\n\tif (!response.body) return { stdout: \"\", truncated };\n\n\tconst reader = response.body.getReader();\n\ttry {\n\t\twhile (true) {\n\t\t\tconst next = await reader.read();\n\t\t\tif (next.done) break;\n\t\t\tconst bounded = appendBounded(raw, Buffer.from(next.value), maximum);\n\t\t\traw = bounded.value;\n\t\t\ttruncated ||= bounded.truncated;\n\t\t\tif (!truncated) continue;\n\t\t\tawait reader.cancel();\n\t\t\tbreak;\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n\treturn { stdout: raw.toString(\"utf8\"), truncated };\n}\n\nfunction completedHttpHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tresponse: Response,\n\tbody: HttpHookResponseBody,\n): HookExecutionResult {\n\tlet output: HookOutputClassification = { kind: \"empty\" };\n\tlet responseDiagnostic: HookDiagnostic | undefined;\n\tif (body.truncated) {\n\t\tresponseDiagnostic = diagnostic(hook, \"execution\", \"HTTP hook output exceeded the execution limit\");\n\t} else if (response.status >= 300 && response.status < 400) {\n\t\tresponseDiagnostic = diagnostic(hook, \"policy\", \"HTTP hook redirects are rejected\");\n\t} else if (!response.ok) {\n\t\tresponseDiagnostic = diagnostic(hook, \"execution\", `HTTP hook returned ${response.status}`);\n\t} else {\n\t\tconst classified = classifyHookOutput(body.stdout);\n\t\tif (classified.kind === \"json\" || classified.kind === \"empty\") output = classified;\n\t\telse {\n\t\t\tresponseDiagnostic = diagnostic(\n\t\t\t\thook,\n\t\t\t\t\"malformed-output\",\n\t\t\t\t\"HTTP hook 2xx response was not structured JSON; response was ignored\",\n\t\t\t);\n\t\t}\n\t}\n\treturn resultBase(hook, started, {\n\t\tstatus: body.truncated ? \"error\" : \"completed\",\n\t\texitCode: response.ok && !body.truncated ? 0 : 1,\n\t\tstdout: body.stdout,\n\t\tstderr: \"\",\n\t\tstdoutTruncated: body.truncated,\n\t\toutput,\n\t\tdiagnostic: responseDiagnostic,\n\t});\n}\n\nfunction failedHttpHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\ttimedOut: boolean,\n\tcancelled: boolean,\n\terror: unknown,\n): HookExecutionResult {\n\treturn resultBase(hook, started, {\n\t\tstatus: timedOut ? \"timeout\" : cancelled ? \"cancelled\" : \"error\",\n\t\tdiagnostic:\n\t\t\ttimedOut || cancelled ? undefined : diagnostic(hook, \"execution\", `HTTP hook failed: ${String(error)}`),\n\t});\n}\n\nasync function executeHttp(\n\thook: LoadedHookHandler,\n\thandler: HttpHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions,\n): Promise<HookExecutionResult> {\n\tconst started = performance.now();\n\tif (!httpHookTransportAllowed(handler.url)) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(hook, \"policy\", `HTTP hook requires HTTPS unless it targets loopback: ${handler.url}`),\n\t\t});\n\t}\n\tif (projectHookUsesWorkspaceBackend(hook, options)) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(\n\t\t\t\thook,\n\t\t\t\t\"policy\",\n\t\t\t\t\"Project HTTP hooks are disabled on non-local workspace backends to prevent host-network escape\",\n\t\t\t),\n\t\t});\n\t}\n\n\tconst controller = new AbortController();\n\tconst timeoutMs = hookTimeoutSeconds(handler, input, options) * 1000;\n\tlet timedOut = false;\n\tlet cancelled = false;\n\tconst onAbort = () => {\n\t\tcancelled = true;\n\t\tcontroller.abort();\n\t};\n\tif (options.signal?.aborted) onAbort();\n\telse options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\tconst timer = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\n\ttry {\n\t\tconst env = sanitizedHookEnvironment(options.env);\n\t\tif (options.allowedHttpHookUrls && !urlAllowed(handler.url, options.allowedHttpHookUrls)) {\n\t\t\treturn resultBase(hook, started, {\n\t\t\t\tdiagnostic: diagnostic(hook, \"policy\", `HTTP hook URL is blocked by the host: ${handler.url}`),\n\t\t\t});\n\t\t}\n\t\tconst headers = createHttpHookHeaders(hook, handler, options, env);\n\t\tconst response = await (options.fetch ?? globalThis.fetch)(handler.url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(input),\n\t\t\tsignal: controller.signal,\n\t\t\tredirect: \"error\",\n\t\t});\n\t\tconst body = await readHttpHookResponseBody(response, options.maxOutputBytes ?? DEFAULT_MAX_HOOK_OUTPUT_BYTES);\n\t\treturn completedHttpHookResult(hook, started, response, body);\n\t} catch (error) {\n\t\treturn failedHttpHookResult(hook, started, timedOut, cancelled, error);\n\t} finally {\n\t\tclearTimeout(timer);\n\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\nfunction urlAllowed(url: string, allowlist: readonly string[]): boolean {\n\treturn allowlist.some((pattern) => {\n\t\tif (pattern === url) return true;\n\t\tconst expression = pattern\n\t\t\t.split(\"*\")\n\t\t\t.map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n\t\t\t.join(\".*\");\n\t\treturn new RegExp(`^${expression}$`).test(url);\n\t});\n}\n\nexport async function executeHook(\n\thook: LoadedHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookExecutionResult> {\n\tconst started = performance.now();\n\tif (options.signal?.aborted) return resultBase(hook, started, { status: \"cancelled\" });\n\tif (hook.handler.type === \"prompt\" || hook.handler.type === \"agent\" || hook.handler.type === \"mcp_tool\") {\n\t\treturn resultBase(hook, started, {\n\t\t\tstatus: \"unsupported\",\n\t\t\tdiagnostic: diagnostic(hook, \"unsupported-handler\", `${hook.handler.type} handlers are unsupported`),\n\t\t});\n\t}\n\tif (hook.handler.type === \"command\") return executeCommand(hook, hook.handler, input, options);\n\tif (hook.handler.type === \"http\") return executeHttp(hook, hook.handler, input, options);\n\treturn resultBase(hook, started, { status: \"unsupported\" });\n}\n\nexport async function executeMatchingHooks(\n\thooks: readonly LoadedHookHandler[],\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookExecutionResult[]> {\n\tconst matching = hooks.filter(\n\t\t(hook) =>\n\t\t\thook.event === input.hook_event_name &&\n\t\t\tmatchesHookInput(hook.matcher, input).matches &&\n\t\t\tmatchesHookIf(hook.handler.if, input).matches,\n\t);\n\tconst runOptions =\n\t\tinput.hook_event_name === \"SessionEnd\"\n\t\t\t? {\n\t\t\t\t\t...options,\n\t\t\t\t\ttimeoutSeconds: Math.min(\n\t\t\t\t\t\tMAX_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\tDEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\t\t\t\t\t\t\t...matching.map((hook) => hook.handler.timeout ?? DEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: options;\n\treturn Promise.all(matching.map((hook) => executeHook(hook, input, runOptions)));\n}\n"]}
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../src/core/hooks/executor.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ChildProcessWithoutNullStreams, spawn } from \"node:child_process\";\nimport { performance } from \"node:perf_hooks\";\nimport type { PortablePathFlavor } from \"../lsp/portable-path.ts\";\nimport { matchesHookIf, matchesHookInput } from \"./matcher.ts\";\nimport type {\n\tCommandHookHandler,\n\tHookDiagnostic,\n\tHookDiagnosticCode,\n\tHookExecutionResult,\n\tHookExecutionStatus,\n\tHookHandlerCommon,\n\tHookInput,\n\tHookOutputClassification,\n\tHookRunOptions,\n\tHookStructuredOutput,\n\tHttpHookHandler,\n\tLoadedHookHandler,\n} from \"./types.ts\";\n\nexport const DEFAULT_HOOK_TIMEOUT_SECONDS = 600;\nexport const DEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS = 30;\nexport const DEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS = 1.5;\nexport const MAX_SESSION_END_HOOK_TIMEOUT_SECONDS = 60;\nexport const DEFAULT_MAX_HOOK_OUTPUT_BYTES = 1024 * 1024;\n\ninterface CompletedCommandState {\n\tstdout: Buffer;\n\tstderr: Buffer;\n\tstdoutTruncated: boolean;\n\tstderrTruncated: boolean;\n\toutputLimitExceeded: boolean;\n\ttimedOut: boolean;\n\tcancelled: boolean;\n}\n\ninterface BoundedBufferAppendResult {\n\tvalue: Buffer;\n\ttruncated: boolean;\n}\n\ntype WindowsProcessTreeTerminator = (pid: number) => void;\n\nfunction forceTerminateChildProcess(\n\tchild: ChildProcessWithoutNullStreams,\n\tplatform: NodeJS.Platform,\n\tterminateWindowsTree: WindowsProcessTreeTerminator,\n): void {\n\tif (child.pid && platform === \"win32\") {\n\t\tterminateWindowsTree(child.pid);\n\t} else if (child.pid) {\n\t\ttry {\n\t\t\tprocess.kill(-child.pid, \"SIGKILL\");\n\t\t} catch {\n\t\t\tif (child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n\t\t}\n\t} else if (child.exitCode === null && child.signalCode === null) {\n\t\tchild.kill(\"SIGKILL\");\n\t}\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction isStructuredOutput(value: unknown): value is HookStructuredOutput {\n\tif (!isObject(value)) return false;\n\treturn (\n\t\t(value.continue === undefined || typeof value.continue === \"boolean\") &&\n\t\t(value.stopReason === undefined || typeof value.stopReason === \"string\") &&\n\t\t(value.systemMessage === undefined || typeof value.systemMessage === \"string\") &&\n\t\t(value.decision === undefined || typeof value.decision === \"string\") &&\n\t\t(value.reason === undefined || typeof value.reason === \"string\") &&\n\t\t(value.hookSpecificOutput === undefined || isObject(value.hookSpecificOutput))\n\t);\n}\nexport function classifyHookOutput(stdout: string): HookOutputClassification {\n\tif (stdout.length === 0) return { kind: \"empty\" };\n\tif (!stdout.trimStart().startsWith(\"{\")) return { kind: \"text\", text: stdout, malformedJson: false };\n\ttry {\n\t\tconst value: unknown = JSON.parse(stdout);\n\t\treturn isStructuredOutput(value) ? { kind: \"json\", value } : { kind: \"text\", text: stdout, malformedJson: true };\n\t} catch {\n\t\treturn { kind: \"text\", text: stdout, malformedJson: true };\n\t}\n}\n\nexport function defaultHookTimeoutSeconds(input: HookInput): number {\n\tif (input.hook_event_name === \"SessionEnd\") return DEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS;\n\tif (input.hook_event_name === \"UserPromptSubmit\") return DEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS;\n\treturn DEFAULT_HOOK_TIMEOUT_SECONDS;\n}\n\nfunction hookTimeoutSeconds(handler: HookHandlerCommon, input: HookInput, options?: HookRunOptions): number {\n\tif (options?.timeoutSeconds !== undefined) return options.timeoutSeconds;\n\tconst timeout = handler.timeout ?? defaultHookTimeoutSeconds(input);\n\treturn input.hook_event_name === \"SessionEnd\" ? Math.min(timeout, MAX_SESSION_END_HOOK_TIMEOUT_SECONDS) : timeout;\n}\nexport function sanitizedHookEnvironment(source: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {\n\tconst result: NodeJS.ProcessEnv = {};\n\tfor (const [key, value] of Object.entries(source)) {\n\t\tif (key.startsWith(\"OTEL_\")) continue;\n\t\tif (/^(?:GRIP|PI)_.*(?:TOKEN|CREDENTIAL|API_KEY|SECRET|PASSWORD)/i.test(key)) continue;\n\t\tresult[key] = value;\n\t}\n\treturn result;\n}\nfunction appendBounded(current: Buffer, chunk: Buffer, maximum: number): BoundedBufferAppendResult {\n\tif (current.length >= maximum) return { value: current, truncated: chunk.length > 0 };\n\tconst remaining = maximum - current.length;\n\treturn { value: Buffer.concat([current, chunk.subarray(0, remaining)]), truncated: chunk.length > remaining };\n}\nfunction exitTwoBlocks(input: HookInput): boolean {\n\treturn (\n\t\tinput.hook_event_name === \"PreToolUse\" ||\n\t\tinput.hook_event_name === \"UserPromptSubmit\" ||\n\t\tinput.hook_event_name === \"Stop\" ||\n\t\tinput.hook_event_name === \"PreCompact\"\n\t);\n}\nfunction structuredBlockingReason(output: HookOutputClassification, input: HookInput): string | undefined {\n\tif (output.kind !== \"json\") return undefined;\n\tif (output.value.continue === false && typeof output.value.stopReason === \"string\") return output.value.stopReason;\n\tif (input.hook_event_name === \"PreToolUse\") {\n\t\tconst specific = output.value.hookSpecificOutput;\n\t\tif (\n\t\t\tspecific?.hookEventName === input.hook_event_name &&\n\t\t\tspecific.permissionDecision === \"deny\" &&\n\t\t\ttypeof specific.permissionDecisionReason === \"string\"\n\t\t) {\n\t\t\treturn specific.permissionDecisionReason;\n\t\t}\n\t}\n\tif (output.value.decision === \"block\" && typeof output.value.reason === \"string\") return output.value.reason;\n\treturn undefined;\n}\nfunction diagnostic(hook: LoadedHookHandler, code: HookDiagnosticCode, message: string): HookDiagnostic {\n\treturn { level: \"warning\", code, message, source: hook.source, event: hook.event };\n}\nfunction resultBase(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tpartial: Partial<HookExecutionResult>,\n): HookExecutionResult {\n\treturn {\n\t\thook,\n\t\tstatus: \"error\",\n\t\texitCode: null,\n\t\tstdout: \"\",\n\t\tstderr: \"\",\n\t\tstdoutTruncated: false,\n\t\tstderrTruncated: false,\n\t\toutput: { kind: \"empty\" },\n\t\tblocking: false,\n\t\tdurationMs: performance.now() - started,\n\t\t...partial,\n\t};\n}\n\nfunction completedCommandStatus(state: CompletedCommandState): HookExecutionStatus {\n\tif (state.outputLimitExceeded) return \"error\";\n\tif (state.timedOut) return \"timeout\";\n\tif (state.cancelled) return \"cancelled\";\n\treturn \"completed\";\n}\n\nfunction completedCommandDiagnostic(\n\thook: LoadedHookHandler,\n\tstate: CompletedCommandState,\n\toutput: HookOutputClassification,\n): HookDiagnostic | undefined {\n\tif (state.outputLimitExceeded) {\n\t\treturn diagnostic(hook, \"execution\", \"Hook output exceeded the execution limit\");\n\t}\n\tif (output.kind !== \"text\" || !output.malformedJson) return undefined;\n\treturn diagnostic(hook, \"malformed-output\", \"Hook stdout looked like JSON but was malformed; output was ignored\");\n}\n\nfunction completedCommandResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tinput: HookInput,\n\texitCode: number | null,\n\tstate: CompletedCommandState,\n): HookExecutionResult {\n\tconst stdout = state.stdout.toString(\"utf8\");\n\tconst stderr = state.stderr.toString(\"utf8\");\n\tconst output = state.outputLimitExceeded ? { kind: \"empty\" as const } : classifyHookOutput(stdout);\n\tconst outputDiagnostic = completedCommandDiagnostic(hook, state, output);\n\tconst blocking =\n\t\t!state.timedOut && !state.cancelled && !state.outputLimitExceeded && exitCode === 2 && exitTwoBlocks(input);\n\treturn resultBase(hook, started, {\n\t\tstatus: completedCommandStatus(state),\n\t\texitCode,\n\t\tstdout,\n\t\tstderr,\n\t\tstdoutTruncated: state.stdoutTruncated,\n\t\tstderrTruncated: state.stderrTruncated,\n\t\toutput,\n\t\tdiagnostic: outputDiagnostic,\n\t\tblocking,\n\t\t...(blocking\n\t\t\t? { blockingReason: structuredBlockingReason(output, input) ?? (stderr.trim() || \"Hook blocked the action\") }\n\t\t\t: {}),\n\t});\n}\n\nfunction shellQuote(value: string): string {\n\treturn `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction projectHookUsesWorkspaceBackend(hook: LoadedHookHandler, options: HookRunOptions): boolean {\n\tif (hook.source.kind !== \"project\" && hook.source.kind !== \"local\") return false;\n\treturn options.toolOperations?.getBackendInfo?.()?.type !== \"local\";\n}\n\nconst WORKSPACE_HOOK_RUNNER = String.raw`\nconst { spawn } = require(\"node:child_process\");\nconst spec = JSON.parse(Buffer.from(process.argv[1], \"base64\").toString(\"utf8\"));\nconst env = { ...process.env };\nfor (const name of Object.keys(env)) {\n if (name.startsWith(\"OTEL_\") || /^(?:GRIP|PI)_.*(?:TOKEN|CREDENTIAL|API_KEY|SECRET|PASSWORD)/i.test(name)) delete env[name];\n}\nconst frame = (stream, data) => process.stdout.write(\"GRIPHOOK1 \" + stream + \" \" + Buffer.from(data).toString(\"base64\") + \"\\n\");\nlet failed = false;\nconst child = spawn(spec.file, spec.args, { cwd: spec.cwd, env, stdio: [\"pipe\", \"pipe\", \"pipe\"], windowsHide: true });\nchild.stdout.on(\"data\", (data) => frame(\"stdout\", data));\nchild.stderr.on(\"data\", (data) => frame(\"stderr\", data));\nchild.on(\"error\", (error) => { failed = true; frame(\"stderr\", Buffer.from(String(error))); process.exitCode = 127; });\nchild.on(\"close\", (code) => { if (!failed) process.exitCode = code === null ? 1 : code; });\nchild.stdin.on(\"error\", () => {});\nchild.stdin.end(Buffer.from(spec.stdinBase64, \"base64\"));\n`;\n\ninterface WorkspaceHookPreparation {\n\tok: boolean;\n\tcommand?: string;\n\tinput: HookInput;\n}\n\ninterface WorkspaceHookOutputState {\n\tmaximum: number;\n\tstdout: Buffer;\n\tstderr: Buffer;\n\tstdoutTruncated: boolean;\n\tstderrTruncated: boolean;\n\tpending: string;\n\toutputLimitExceeded: boolean;\n\toutputController: AbortController;\n}\n\nfunction prepareWorkspaceHook(\n\thandler: CommandHookHandler,\n\tinput: HookInput,\n\tcwd: string,\n\tpathFlavor: PortablePathFlavor,\n): WorkspaceHookPreparation {\n\tconst workspaceInput = { ...input, cwd };\n\tconst stdin = Buffer.from(JSON.stringify(workspaceInput));\n\tif (stdin.byteLength > 256 * 1024) return { ok: false, input: workspaceInput };\n\tlet file = handler.command;\n\tlet args = handler.args ?? [];\n\tif (handler.args === undefined) {\n\t\tif (handler.shell === \"powershell\" || (handler.shell === undefined && pathFlavor === \"windows\")) {\n\t\t\tfile = pathFlavor === \"windows\" ? \"powershell.exe\" : \"pwsh\";\n\t\t\targs = [\"-NoProfile\", \"-Command\", handler.command];\n\t\t} else {\n\t\t\tfile = handler.shell === \"bash\" ? \"bash\" : \"/bin/sh\";\n\t\t\targs = [\"-c\", handler.command];\n\t\t}\n\t}\n\tconst spec = Buffer.from(JSON.stringify({ file, args, cwd, stdinBase64: stdin.toString(\"base64\") })).toString(\n\t\t\"base64\",\n\t);\n\treturn {\n\t\tok: true,\n\t\tcommand: `node -e ${shellQuote(WORKSPACE_HOOK_RUNNER)} ${shellQuote(spec)}`,\n\t\tinput: workspaceInput,\n\t};\n}\n\nfunction createWorkspaceHookOutputState(maximum: number): WorkspaceHookOutputState {\n\treturn {\n\t\tmaximum,\n\t\tstdout: Buffer.alloc(0),\n\t\tstderr: Buffer.alloc(0),\n\t\tstdoutTruncated: false,\n\t\tstderrTruncated: false,\n\t\tpending: \"\",\n\t\toutputLimitExceeded: false,\n\t\toutputController: new AbortController(),\n\t};\n}\n\nfunction exceedWorkspaceHookOutputLimit(state: WorkspaceHookOutputState): void {\n\tif (state.outputLimitExceeded) return;\n\tstate.outputLimitExceeded = true;\n\tstate.outputController.abort();\n}\n\nfunction consumeWorkspaceHookLine(state: WorkspaceHookOutputState, line: string): void {\n\tconst match = /^GRIPHOOK1 (stdout|stderr) ([A-Za-z0-9+/]*={0,2})$/.exec(line);\n\tif (!match) {\n\t\tconst next = appendBounded(state.stderr, Buffer.from(`${line}\\n`), state.maximum);\n\t\tstate.stderr = next.value;\n\t\tstate.stderrTruncated ||= next.truncated;\n\t\tif (next.truncated) exceedWorkspaceHookOutputLimit(state);\n\t\treturn;\n\t}\n\tconst chunk = Buffer.from(match[2], \"base64\");\n\tif (match[1] === \"stdout\") {\n\t\tconst next = appendBounded(state.stdout, chunk, state.maximum);\n\t\tstate.stdout = next.value;\n\t\tstate.stdoutTruncated ||= next.truncated;\n\t} else {\n\t\tconst next = appendBounded(state.stderr, chunk, state.maximum);\n\t\tstate.stderr = next.value;\n\t\tstate.stderrTruncated ||= next.truncated;\n\t}\n\tif (state.stdoutTruncated || state.stderrTruncated) exceedWorkspaceHookOutputLimit(state);\n}\n\nfunction consumeWorkspaceHookData(state: WorkspaceHookOutputState, data: Buffer): void {\n\tif (state.outputLimitExceeded) return;\n\tstate.pending += data.toString(\"utf8\");\n\tconst maximumFrameChars = Math.ceil((state.maximum * 4) / 3) + 1024;\n\tif (state.pending.length > maximumFrameChars) {\n\t\tstate.pending = state.pending.slice(0, maximumFrameChars);\n\t\tstate.stderrTruncated = true;\n\t\texceedWorkspaceHookOutputLimit(state);\n\t\treturn;\n\t}\n\tconst lines = state.pending.split(\"\\n\");\n\tstate.pending = lines.pop() ?? \"\";\n\tfor (const line of lines) consumeWorkspaceHookLine(state, line.replace(/\\r$/, \"\"));\n}\n\nfunction completeWorkspaceHookOutput(state: WorkspaceHookOutputState): void {\n\tif (state.pending) consumeWorkspaceHookLine(state, state.pending);\n}\n\nfunction completedWorkspaceHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tinput: HookInput,\n\tstate: WorkspaceHookOutputState,\n\texitCode: number | null,\n): HookExecutionResult {\n\tconst stdout = state.stdout.toString(\"utf8\");\n\tconst stderr = state.stderr.toString(\"utf8\");\n\tconst output = state.outputLimitExceeded ? { kind: \"empty\" as const } : classifyHookOutput(stdout);\n\tlet outputDiagnostic: HookDiagnostic | undefined;\n\tif (output.kind === \"text\" && output.malformedJson) {\n\t\toutputDiagnostic = diagnostic(\n\t\t\thook,\n\t\t\t\"malformed-output\",\n\t\t\t\"Hook stdout looked like JSON but was malformed; output was ignored\",\n\t\t);\n\t} else if (state.outputLimitExceeded) {\n\t\toutputDiagnostic = diagnostic(hook, \"execution\", \"Project hook output exceeded the workspace execution limit\");\n\t}\n\tconst blocking = !state.outputLimitExceeded && exitCode === 2 && exitTwoBlocks(input);\n\treturn resultBase(hook, started, {\n\t\tstatus: state.outputLimitExceeded ? \"error\" : \"completed\",\n\t\texitCode,\n\t\tstdout,\n\t\tstderr,\n\t\tstdoutTruncated: state.stdoutTruncated,\n\t\tstderrTruncated: state.stderrTruncated,\n\t\toutput,\n\t\tdiagnostic: outputDiagnostic,\n\t\tblocking,\n\t\t...(blocking\n\t\t\t? { blockingReason: structuredBlockingReason(output, input) ?? (stderr.trim() || \"Hook blocked the action\") }\n\t\t\t: {}),\n\t});\n}\n\nfunction failedWorkspaceHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\toptions: HookRunOptions,\n\tstate: WorkspaceHookOutputState,\n\terror: unknown,\n): HookExecutionResult {\n\tconst cancelled = !state.outputLimitExceeded && options.signal?.aborted === true;\n\treturn resultBase(hook, started, {\n\t\tstatus: cancelled ? \"cancelled\" : \"error\",\n\t\tstdout: state.stdout.toString(\"utf8\"),\n\t\tstderr: state.stderr.toString(\"utf8\"),\n\t\tstdoutTruncated: state.stdoutTruncated,\n\t\tstderrTruncated: state.stderrTruncated,\n\t\tdiagnostic: state.outputLimitExceeded\n\t\t\t? diagnostic(hook, \"execution\", \"Project hook output exceeded the workspace execution limit\")\n\t\t\t: cancelled\n\t\t\t\t? undefined\n\t\t\t\t: diagnostic(hook, \"execution\", `Workspace project hook failed: ${String(error)}`),\n\t});\n}\nasync function executeWorkspaceCommand(\n\thook: LoadedHookHandler,\n\thandler: CommandHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions,\n): Promise<HookExecutionResult> {\n\tconst started = performance.now();\n\tconst operations = options.toolOperations;\n\tconst backend = operations?.getBackendInfo?.();\n\tif (!operations || !backend || backend.type === \"local\" || (backend.type === \"remote\" && !backend.configured)) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(\n\t\t\t\thook,\n\t\t\t\t\"policy\",\n\t\t\t\t\"Project hook was not executed because the workspace backend is unavailable\",\n\t\t\t),\n\t\t});\n\t}\n\tconst pathFlavor = backend.type === \"remote\" && backend.configured ? backend.workspace.pathFlavor : \"posix\";\n\tconst preparation = prepareWorkspaceHook(handler, input, backend.cwd, pathFlavor);\n\tif (!preparation.ok || !preparation.command) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(hook, \"policy\", \"Project hook input exceeds the workspace execution limit\"),\n\t\t});\n\t}\n\tconst state = createWorkspaceHookOutputState(options.maxOutputBytes ?? DEFAULT_MAX_HOOK_OUTPUT_BYTES);\n\tconst signals = [options.signal, state.outputController.signal].filter(\n\t\t(signal): signal is AbortSignal => signal !== undefined,\n\t);\n\tconst signal = signals.length === 1 ? signals[0] : AbortSignal.any(signals);\n\ttry {\n\t\tconst result = await operations.exec(preparation.command, {\n\t\t\tcwd: backend.cwd,\n\t\t\tonData: (data) => consumeWorkspaceHookData(state, data),\n\t\t\tsignal,\n\t\t\ttimeout: hookTimeoutSeconds(handler, preparation.input, options),\n\t\t});\n\t\tcompleteWorkspaceHookOutput(state);\n\t\treturn completedWorkspaceHookResult(hook, started, preparation.input, state, result.exitCode);\n\t} catch (error) {\n\t\treturn failedWorkspaceHookResult(hook, started, options, state, error);\n\t}\n}\n\nasync function executeCommand(\n\thook: LoadedHookHandler,\n\thandler: CommandHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions,\n): Promise<HookExecutionResult> {\n\tif (projectHookUsesWorkspaceBackend(hook, options)) return executeWorkspaceCommand(hook, handler, input, options);\n\tconst started = performance.now();\n\tconst timeoutMs = hookTimeoutSeconds(handler, input, options) * 1000;\n\tconst maximum = options.maxOutputBytes ?? DEFAULT_MAX_HOOK_OUTPUT_BYTES;\n\tconst useExec = handler.args !== undefined;\n\tlet command = handler.command;\n\tlet args = handler.args ?? [];\n\tif (!useExec) {\n\t\tif (handler.shell === \"powershell\") {\n\t\t\tcommand = process.platform === \"win32\" ? \"powershell.exe\" : \"pwsh\";\n\t\t\targs = [\"-NoProfile\", \"-Command\", handler.command];\n\t\t} else if (handler.shell === \"bash\") {\n\t\t\tcommand = \"bash\";\n\t\t\targs = [\"-c\", handler.command];\n\t\t} else if (process.platform === \"win32\") {\n\t\t\tcommand = \"powershell.exe\";\n\t\t\targs = [\"-NoProfile\", \"-Command\", handler.command];\n\t\t} else {\n\t\t\tcommand = \"/bin/sh\";\n\t\t\targs = [\"-c\", handler.command];\n\t\t}\n\t}\n\treturn await new Promise((resolve) => {\n\t\tlet child: ChildProcessWithoutNullStreams;\n\t\ttry {\n\t\t\tchild = spawn(command, args, {\n\t\t\t\tcwd: input.cwd,\n\t\t\t\tenv: sanitizedHookEnvironment(options.env),\n\t\t\t\tstdio: [\"pipe\", \"pipe\", \"pipe\"],\n\t\t\t\tdetached: process.platform !== \"win32\",\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tresolve(resultBase(hook, started, { diagnostic: diagnostic(hook, \"execution\", String(error)) }));\n\t\t\treturn;\n\t\t}\n\t\tlet stdout: Buffer = Buffer.alloc(0);\n\t\tlet stderr: Buffer = Buffer.alloc(0);\n\t\tlet stdoutTruncated = false;\n\t\tlet stderrTruncated = false;\n\t\tlet outputLimitExceeded = false;\n\t\tlet settled = false;\n\t\tlet timedOut = false;\n\t\tlet cancelled = false;\n\t\tconst platform = options.platform ?? process.platform;\n\t\tlet windowsTerminationStarted = false;\n\t\tconst terminateWindowsTree = (pid: number) => {\n\t\t\tif (windowsTerminationStarted) return;\n\t\t\twindowsTerminationStarted = true;\n\t\t\tconst fallback = () => {\n\t\t\t\tif (child.exitCode === null && child.signalCode === null) child.kill(\"SIGKILL\");\n\t\t\t};\n\t\t\tif (options.terminateWindowsProcessTree) {\n\t\t\t\t// The abstraction is invoked before any direct-child fallback, matching taskkill ordering.\n\t\t\t\tif (!options.terminateWindowsProcessTree(pid)) fallback();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tconst killer = spawn(\"taskkill\", [\"/PID\", String(pid), \"/T\", \"/F\"], {\n\t\t\t\t\tstdio: \"ignore\",\n\t\t\t\t\twindowsHide: true,\n\t\t\t\t});\n\t\t\t\tconst bound = setTimeout(() => {\n\t\t\t\t\tkiller.kill();\n\t\t\t\t\tfallback();\n\t\t\t\t}, 1000);\n\t\t\t\tbound.unref();\n\t\t\t\tkiller.once(\"close\", (code) => {\n\t\t\t\t\tclearTimeout(bound);\n\t\t\t\t\tif (code !== 0) fallback();\n\t\t\t\t});\n\t\t\t\tkiller.once(\"error\", () => {\n\t\t\t\t\tclearTimeout(bound);\n\t\t\t\t\tfallback();\n\t\t\t\t});\n\t\t\t} catch {\n\t\t\t\tfallback();\n\t\t\t}\n\t\t};\n\t\tconst terminate = () => {\n\t\t\tif (child.pid && platform === \"win32\") {\n\t\t\t\t// taskkill /T /F gets a bounded opportunity before direct-child fallback.\n\t\t\t\tterminateWindowsTree(child.pid);\n\t\t\t} else if (child.pid) {\n\t\t\t\ttry {\n\t\t\t\t\tprocess.kill(-child.pid, \"SIGTERM\");\n\t\t\t\t} catch {\n\t\t\t\t\tchild.kill(\"SIGTERM\");\n\t\t\t\t}\n\t\t\t} else child.kill(\"SIGTERM\");\n\t\t\tsetTimeout(() => {\n\t\t\t\tforceTerminateChildProcess(child, platform, terminateWindowsTree);\n\t\t\t}, 250).unref();\n\t\t};\n\t\tconst onAbort = () => {\n\t\t\tcancelled = true;\n\t\t\tterminate();\n\t\t};\n\t\tif (options.signal?.aborted) onAbort();\n\t\telse options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\t\tconst timer = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tterminate();\n\t\t}, timeoutMs);\n\t\tchild.stdout.on(\"data\", (data: Buffer) => {\n\t\t\tconst next = appendBounded(stdout, data, maximum);\n\t\t\tstdout = next.value;\n\t\t\tstdoutTruncated ||= next.truncated;\n\t\t\tif (next.truncated && !outputLimitExceeded) {\n\t\t\t\toutputLimitExceeded = true;\n\t\t\t\tterminate();\n\t\t\t}\n\t\t});\n\t\tchild.stderr.on(\"data\", (data: Buffer) => {\n\t\t\tconst next = appendBounded(stderr, data, maximum);\n\t\t\tstderr = next.value;\n\t\t\tstderrTruncated ||= next.truncated;\n\t\t\tif (next.truncated && !outputLimitExceeded) {\n\t\t\t\toutputLimitExceeded = true;\n\t\t\t\tterminate();\n\t\t\t}\n\t\t});\n\t\tchild.on(\"error\", (error) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(\n\t\t\t\tresultBase(hook, started, {\n\t\t\t\t\tstdout: stdout.toString(\"utf8\"),\n\t\t\t\t\tstderr: stderr.toString(\"utf8\"),\n\t\t\t\t\tstdoutTruncated,\n\t\t\t\t\tstderrTruncated,\n\t\t\t\t\tdiagnostic: diagnostic(hook, \"execution\", String(error)),\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\tchild.on(\"close\", (code) => {\n\t\t\tif (settled) return;\n\t\t\tsettled = true;\n\t\t\tclearTimeout(timer);\n\t\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t\t\tresolve(\n\t\t\t\tcompletedCommandResult(hook, started, input, code, {\n\t\t\t\t\tstdout,\n\t\t\t\t\tstderr,\n\t\t\t\t\tstdoutTruncated,\n\t\t\t\t\tstderrTruncated,\n\t\t\t\t\toutputLimitExceeded,\n\t\t\t\t\ttimedOut,\n\t\t\t\t\tcancelled,\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t\tchild.stdin.on(\"error\", () => undefined);\n\t\tchild.stdin.end(JSON.stringify(input));\n\t});\n}\nfunction interpolateHeader(value: string, allowed: Set<string>, env: NodeJS.ProcessEnv): string {\n\treturn value.replace(\n\t\t/\\$(?:\\{([A-Za-z_][A-Za-z0-9_]*)\\}|([A-Za-z_][A-Za-z0-9_]*))/g,\n\t\t(_match, braced: string | undefined, bare: string | undefined) => {\n\t\t\tconst name = braced ?? bare ?? \"\";\n\t\t\treturn allowed.has(name) ? (env[name] ?? \"\") : \"\";\n\t\t},\n\t);\n}\nfunction httpHookTransportAllowed(value: string): boolean {\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (url.protocol === \"https:\") return true;\n\tif (url.protocol !== \"http:\") return false;\n\tconst hostname = url.hostname.replace(/^\\[|\\]$/g, \"\").toLowerCase();\n\treturn (\n\t\thostname === \"localhost\" ||\n\t\thostname === \"::1\" ||\n\t\t/^127(?:\\.[0-9]{1,3}){3}$/.test(hostname) ||\n\t\t/^::ffff:127(?:\\.[0-9]{1,3}){3}$/.test(hostname)\n\t);\n}\n\ninterface HttpHookResponseBody {\n\tstdout: string;\n\ttruncated: boolean;\n}\n\nfunction createHttpHookHeaders(\n\thook: LoadedHookHandler,\n\thandler: HttpHookHandler,\n\toptions: HookRunOptions,\n\tenv: NodeJS.ProcessEnv,\n): Record<string, string> {\n\tconst settingsAllowed = new Set(hook.httpHookAllowedEnvVars ?? handler.allowedEnvVars ?? []);\n\tconst hostAllowed = options.httpHookAllowedEnvVars ? new Set(options.httpHookAllowedEnvVars) : undefined;\n\tconst allowed = new Set([...settingsAllowed].filter((name) => !hostAllowed || hostAllowed.has(name)));\n\tconst headers: Record<string, string> = { \"content-type\": \"application/json\" };\n\tfor (const [key, value] of Object.entries(handler.headers ?? {})) {\n\t\theaders[key] = interpolateHeader(value, allowed, env);\n\t}\n\treturn headers;\n}\n\nasync function readHttpHookResponseBody(response: Response, maximum: number): Promise<HttpHookResponseBody> {\n\tlet raw: Buffer = Buffer.alloc(0);\n\tlet truncated = false;\n\tif (!response.body) return { stdout: \"\", truncated };\n\n\tconst reader = response.body.getReader();\n\ttry {\n\t\twhile (true) {\n\t\t\tconst next = await reader.read();\n\t\t\tif (next.done) break;\n\t\t\tconst bounded = appendBounded(raw, Buffer.from(next.value), maximum);\n\t\t\traw = bounded.value;\n\t\t\ttruncated ||= bounded.truncated;\n\t\t\tif (!truncated) continue;\n\t\t\tawait reader.cancel();\n\t\t\tbreak;\n\t\t}\n\t} finally {\n\t\treader.releaseLock();\n\t}\n\treturn { stdout: raw.toString(\"utf8\"), truncated };\n}\n\nfunction completedHttpHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\tresponse: Response,\n\tbody: HttpHookResponseBody,\n): HookExecutionResult {\n\tlet output: HookOutputClassification = { kind: \"empty\" };\n\tlet responseDiagnostic: HookDiagnostic | undefined;\n\tif (body.truncated) {\n\t\tresponseDiagnostic = diagnostic(hook, \"execution\", \"HTTP hook output exceeded the execution limit\");\n\t} else if (response.status >= 300 && response.status < 400) {\n\t\tresponseDiagnostic = diagnostic(hook, \"policy\", \"HTTP hook redirects are rejected\");\n\t} else if (!response.ok) {\n\t\tresponseDiagnostic = diagnostic(hook, \"execution\", `HTTP hook returned ${response.status}`);\n\t} else {\n\t\tconst classified = classifyHookOutput(body.stdout);\n\t\tif (classified.kind === \"json\" || classified.kind === \"empty\") output = classified;\n\t\telse {\n\t\t\tresponseDiagnostic = diagnostic(\n\t\t\t\thook,\n\t\t\t\t\"malformed-output\",\n\t\t\t\t\"HTTP hook 2xx response was not structured JSON; response was ignored\",\n\t\t\t);\n\t\t}\n\t}\n\treturn resultBase(hook, started, {\n\t\tstatus: body.truncated ? \"error\" : \"completed\",\n\t\texitCode: response.ok && !body.truncated ? 0 : 1,\n\t\tstdout: body.stdout,\n\t\tstderr: \"\",\n\t\tstdoutTruncated: body.truncated,\n\t\toutput,\n\t\tdiagnostic: responseDiagnostic,\n\t});\n}\n\nfunction failedHttpHookResult(\n\thook: LoadedHookHandler,\n\tstarted: number,\n\ttimedOut: boolean,\n\tcancelled: boolean,\n\terror: unknown,\n): HookExecutionResult {\n\treturn resultBase(hook, started, {\n\t\tstatus: timedOut ? \"timeout\" : cancelled ? \"cancelled\" : \"error\",\n\t\tdiagnostic:\n\t\t\ttimedOut || cancelled ? undefined : diagnostic(hook, \"execution\", `HTTP hook failed: ${String(error)}`),\n\t});\n}\n\nasync function executeHttp(\n\thook: LoadedHookHandler,\n\thandler: HttpHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions,\n): Promise<HookExecutionResult> {\n\tconst started = performance.now();\n\tif (!httpHookTransportAllowed(handler.url)) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(hook, \"policy\", `HTTP hook requires HTTPS unless it targets loopback: ${handler.url}`),\n\t\t});\n\t}\n\tif (projectHookUsesWorkspaceBackend(hook, options)) {\n\t\treturn resultBase(hook, started, {\n\t\t\tdiagnostic: diagnostic(\n\t\t\t\thook,\n\t\t\t\t\"policy\",\n\t\t\t\t\"Project HTTP hooks are disabled on non-local workspace backends to prevent host-network escape\",\n\t\t\t),\n\t\t});\n\t}\n\n\tconst controller = new AbortController();\n\tconst timeoutMs = hookTimeoutSeconds(handler, input, options) * 1000;\n\tlet timedOut = false;\n\tlet cancelled = false;\n\tconst onAbort = () => {\n\t\tcancelled = true;\n\t\tcontroller.abort();\n\t};\n\tif (options.signal?.aborted) onAbort();\n\telse options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n\tconst timer = setTimeout(() => {\n\t\ttimedOut = true;\n\t\tcontroller.abort();\n\t}, timeoutMs);\n\n\ttry {\n\t\tconst env = sanitizedHookEnvironment(options.env);\n\t\tif (options.allowedHttpHookUrls && !urlAllowed(handler.url, options.allowedHttpHookUrls)) {\n\t\t\treturn resultBase(hook, started, {\n\t\t\t\tdiagnostic: diagnostic(hook, \"policy\", `HTTP hook URL is blocked by the host: ${handler.url}`),\n\t\t\t});\n\t\t}\n\t\tconst headers = createHttpHookHeaders(hook, handler, options, env);\n\t\tconst response = await (options.fetch ?? globalThis.fetch)(handler.url, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders,\n\t\t\tbody: JSON.stringify(input),\n\t\t\tsignal: controller.signal,\n\t\t\tredirect: \"error\",\n\t\t});\n\t\tconst body = await readHttpHookResponseBody(response, options.maxOutputBytes ?? DEFAULT_MAX_HOOK_OUTPUT_BYTES);\n\t\treturn completedHttpHookResult(hook, started, response, body);\n\t} catch (error) {\n\t\treturn failedHttpHookResult(hook, started, timedOut, cancelled, error);\n\t} finally {\n\t\tclearTimeout(timer);\n\t\toptions.signal?.removeEventListener(\"abort\", onAbort);\n\t}\n}\n\nfunction urlAllowed(url: string, allowlist: readonly string[]): boolean {\n\treturn allowlist.some((pattern) => {\n\t\tif (pattern === url) return true;\n\t\tconst expression = pattern\n\t\t\t.split(\"*\")\n\t\t\t.map((part) => part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n\t\t\t.join(\".*\");\n\t\treturn new RegExp(`^${expression}$`).test(url);\n\t});\n}\n\nexport async function executeHook(\n\thook: LoadedHookHandler,\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookExecutionResult> {\n\tconst started = performance.now();\n\tif (options.signal?.aborted) return resultBase(hook, started, { status: \"cancelled\" });\n\tif (hook.handler.type === \"prompt\" || hook.handler.type === \"agent\" || hook.handler.type === \"mcp_tool\") {\n\t\treturn resultBase(hook, started, {\n\t\t\tstatus: \"unsupported\",\n\t\t\tdiagnostic: diagnostic(hook, \"unsupported-handler\", `${hook.handler.type} handlers are unsupported`),\n\t\t});\n\t}\n\tif (hook.handler.type === \"command\") return executeCommand(hook, hook.handler, input, options);\n\tif (hook.handler.type === \"http\") return executeHttp(hook, hook.handler, input, options);\n\treturn resultBase(hook, started, { status: \"unsupported\" });\n}\n\nexport async function executeMatchingHooks(\n\thooks: readonly LoadedHookHandler[],\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookExecutionResult[]> {\n\tconst matching = hooks.filter(\n\t\t(hook) =>\n\t\t\thook.event === input.hook_event_name &&\n\t\t\tmatchesHookInput(hook.matcher, input).matches &&\n\t\t\tmatchesHookIf(hook.handler.if, input).matches,\n\t);\n\tconst runOptions =\n\t\tinput.hook_event_name === \"SessionEnd\"\n\t\t\t? {\n\t\t\t\t\t...options,\n\t\t\t\t\ttimeoutSeconds: Math.min(\n\t\t\t\t\t\tMAX_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\tDEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\t\t\t\t\t\t\t...matching.map((hook) => hook.handler.timeout ?? DEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t}\n\t\t\t: options;\n\treturn Promise.all(matching.map((hook) => executeHook(hook, input, runOptions)));\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,oBAAoB,EACpB,wBAAwB,EACxB,kCAAkC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EACN,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,wCAAwC,EACxC,wCAAwC,EACxC,yBAAyB,EACzB,WAAW,EACX,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,EACjC,gCAAgC,EAChC,KAAK,sBAAsB,EAC3B,qBAAqB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,cAAc,YAAY,CAAC;AAI3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9F,wBAAsB,QAAQ,CAC7B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAG9B","sourcesContent":["// biome-ignore-all lint/performance/noBarrelFile: This is the public hooks subpath entry point.\nexport {\n\taggregateHookResults,\n\tcapModelVisibleHookField,\n\tMAX_MODEL_VISIBLE_HOOK_FIELD_CHARS,\n} from \"./aggregate.ts\";\nexport { freezeLoadedHooks, hookSettingsSources, type LoadHooksOptions, loadHooks } from \"./config.ts\";\nexport {\n\tclassifyHookOutput,\n\tDEFAULT_HOOK_TIMEOUT_SECONDS,\n\tDEFAULT_MAX_HOOK_OUTPUT_BYTES,\n\tDEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\tDEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS,\n\tdefaultHookTimeoutSeconds,\n\texecuteHook,\n\texecuteMatchingHooks,\n\tsanitizedHookEnvironment,\n} from \"./executor.ts\";\nexport { hookMatcherValue, type MatcherResult, matchesHookIf, matchesHookInput, matchHookValue } from \"./matcher.ts\";\nexport {\n\tcanonicalProjectHookCwd,\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\tPROJECT_HOOK_TRUST_STORE_FILENAME,\n\tPROJECT_HOOK_TRUST_STORE_VERSION,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./trust-store.ts\";\nexport * from \"./types.ts\";\n\nimport { aggregateHookResults } from \"./aggregate.ts\";\nimport { executeMatchingHooks } from \"./executor.ts\";\nimport type { HookAggregateResult, HookInput, HookRunOptions, LoadedHooks } from \"./types.ts\";\n\nexport async function runHooks(\n\tloaded: LoadedHooks,\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookAggregateResult> {\n\tconst results = await executeMatchingHooks(loaded.handlers, input, options);\n\treturn aggregateHookResults(input, results);\n}\n"]}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EACN,oBAAoB,EACpB,wBAAwB,EACxB,kCAAkC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,KAAK,gBAAgB,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EACN,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,wCAAwC,EACxC,wCAAwC,EACxC,yBAAyB,EACzB,WAAW,EACX,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,EACjC,gCAAgC,EAChC,KAAK,sBAAsB,EAC3B,qBAAqB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,cAAc,YAAY,CAAC;AAI3B,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9F,wBAAsB,QAAQ,CAC7B,MAAM,EAAE,WAAW,EACnB,KAAK,EAAE,SAAS,EAChB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC,CAG9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,EACN,oBAAoB,EACpB,wBAAwB,EACxB,kCAAkC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAyB,SAAS,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EACN,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,wCAAwC,EACxC,wCAAwC,EACxC,yBAAyB,EACzB,WAAW,EACX,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAsB,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,EACjC,gCAAgC,EAEhC,qBAAqB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,MAAmB,EACnB,KAAgB,EAChB,OAAO,GAAmB,EAAE,EACG;IAC/B,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAAA,CAC5C","sourcesContent":["// biome-ignore-all lint/performance/noBarrelFile: This is the public hooks subpath entry point.\nexport {\n\taggregateHookResults,\n\tcapModelVisibleHookField,\n\tMAX_MODEL_VISIBLE_HOOK_FIELD_CHARS,\n} from \"./aggregate.ts\";\nexport { freezeLoadedHooks, hookSettingsSources, type LoadHooksOptions, loadHooks } from \"./config.ts\";\nexport {\n\tclassifyHookOutput,\n\tDEFAULT_HOOK_TIMEOUT_SECONDS,\n\tDEFAULT_MAX_HOOK_OUTPUT_BYTES,\n\tDEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\tDEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS,\n\tdefaultHookTimeoutSeconds,\n\texecuteHook,\n\texecuteMatchingHooks,\n\tsanitizedHookEnvironment,\n} from \"./executor.ts\";\nexport { hookMatcherValue, type MatcherResult, matchesHookIf, matchesHookInput, matchHookValue } from \"./matcher.ts\";\nexport {\n\tcanonicalProjectHookCwd,\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\tPROJECT_HOOK_TRUST_STORE_FILENAME,\n\tPROJECT_HOOK_TRUST_STORE_VERSION,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./trust-store.ts\";\nexport * from \"./types.ts\";\n\nimport { aggregateHookResults } from \"./aggregate.ts\";\nimport { executeMatchingHooks } from \"./executor.ts\";\nimport type { HookAggregateResult, HookInput, HookRunOptions, LoadedHooks } from \"./types.ts\";\n\nexport async function runHooks(\n\tloaded: LoadedHooks,\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookAggregateResult> {\n\tconst results = await executeMatchingHooks(loaded.handlers, input, options);\n\treturn aggregateHookResults(input, results);\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/hooks/index.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,EACN,oBAAoB,EACpB,wBAAwB,EACxB,kCAAkC,GAClC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAyB,SAAS,EAAE,MAAM,aAAa,CAAC;AACvG,OAAO,EACN,kBAAkB,EAClB,4BAA4B,EAC5B,6BAA6B,EAC7B,wCAAwC,EACxC,wCAAwC,EACxC,yBAAyB,EACzB,WAAW,EACX,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAsB,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EACN,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,iCAAiC,EACjC,gCAAgC,EAEhC,qBAAqB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC7B,MAAmB,EACnB,KAAgB,EAChB,OAAO,GAAmB,EAAE;IAE5B,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC5E,OAAO,oBAAoB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["// biome-ignore-all lint/performance/noBarrelFile: This is the public hooks subpath entry point.\nexport {\n\taggregateHookResults,\n\tcapModelVisibleHookField,\n\tMAX_MODEL_VISIBLE_HOOK_FIELD_CHARS,\n} from \"./aggregate.ts\";\nexport { freezeLoadedHooks, hookSettingsSources, type LoadHooksOptions, loadHooks } from \"./config.ts\";\nexport {\n\tclassifyHookOutput,\n\tDEFAULT_HOOK_TIMEOUT_SECONDS,\n\tDEFAULT_MAX_HOOK_OUTPUT_BYTES,\n\tDEFAULT_SESSION_END_HOOK_TIMEOUT_SECONDS,\n\tDEFAULT_USER_PROMPT_HOOK_TIMEOUT_SECONDS,\n\tdefaultHookTimeoutSeconds,\n\texecuteHook,\n\texecuteMatchingHooks,\n\tsanitizedHookEnvironment,\n} from \"./executor.ts\";\nexport { hookMatcherValue, type MatcherResult, matchesHookIf, matchesHookInput, matchHookValue } from \"./matcher.ts\";\nexport {\n\tcanonicalProjectHookCwd,\n\tcanonicalProjectHookIdentity,\n\thasProjectHookConfiguration,\n\tPROJECT_HOOK_TRUST_STORE_FILENAME,\n\tPROJECT_HOOK_TRUST_STORE_VERSION,\n\ttype ProjectHookTrustResult,\n\tProjectHookTrustStore,\n} from \"./trust-store.ts\";\nexport * from \"./types.ts\";\n\nimport { aggregateHookResults } from \"./aggregate.ts\";\nimport { executeMatchingHooks } from \"./executor.ts\";\nimport type { HookAggregateResult, HookInput, HookRunOptions, LoadedHooks } from \"./types.ts\";\n\nexport async function runHooks(\n\tloaded: LoadedHooks,\n\tinput: HookInput,\n\toptions: HookRunOptions = {},\n): Promise<HookAggregateResult> {\n\tconst results = await executeMatchingHooks(loaded.handlers, input, options);\n\treturn aggregateHookResults(input, results);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAUxF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBrE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CAI7F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CA2B1F","sourcesContent":["import type { HookInput } from \"./types.ts\";\n\nconst EXACT_MATCHER = /^[A-Za-z0-9_\\- ,|]+$/;\n\nexport interface MatcherResult {\n\tmatches: boolean;\n\terror?: string;\n}\n\nexport function matchHookValue(matcher: string | undefined, value: string): MatcherResult {\n\tif (matcher === undefined || matcher === \"\" || matcher === \"*\") return { matches: true };\n\tif (EXACT_MATCHER.test(matcher)) {\n\t\treturn { matches: matcher.split(/[|,]/).some((alternative) => alternative.trim() === value) };\n\t}\n\ttry {\n\t\treturn { matches: new RegExp(matcher).test(value) };\n\t} catch (error) {\n\t\treturn { matches: false, error: `Invalid hook matcher ${JSON.stringify(matcher)}: ${String(error)}` };\n\t}\n}\n\nexport function hookMatcherValue(input: HookInput): string | undefined {\n\tswitch (input.hook_event_name) {\n\t\tcase \"SessionStart\":\n\t\t\treturn input.source;\n\t\tcase \"PreToolUse\":\n\t\tcase \"PostToolUse\":\n\t\tcase \"PostToolUseFailure\":\n\t\t\treturn input.tool_name;\n\t\tcase \"StopFailure\":\n\t\t\treturn input.error;\n\t\tcase \"PreCompact\":\n\t\tcase \"PostCompact\":\n\t\t\treturn input.trigger;\n\t\tcase \"SessionEnd\":\n\t\t\treturn input.reason;\n\t\tcase \"UserPromptSubmit\":\n\t\tcase \"Stop\":\n\t\t\treturn undefined;\n\t}\n}\n\nexport function matchesHookInput(matcher: string | undefined, input: HookInput): MatcherResult {\n\tconst value = hookMatcherValue(input);\n\t// Claude ignores matcher fields on events without matcher support.\n\treturn value === undefined ? { matches: true } : matchHookValue(matcher, value);\n}\n\nexport function matchesHookIf(pattern: string | undefined, input: HookInput): MatcherResult {\n\tif (pattern === undefined) return { matches: true };\n\tif (\n\t\tinput.hook_event_name !== \"PreToolUse\" &&\n\t\tinput.hook_event_name !== \"PostToolUse\" &&\n\t\tinput.hook_event_name !== \"PostToolUseFailure\"\n\t) {\n\t\treturn { matches: false };\n\t}\n\tconst open = pattern.indexOf(\"(\");\n\tif (open < 1 || !pattern.endsWith(\")\")) return matchHookValue(pattern, input.tool_name);\n\tif (pattern.slice(0, open) !== input.tool_name) return { matches: false };\n\tconst argumentPattern = pattern.slice(open + 1, -1);\n\tconst candidate =\n\t\ttypeof input.tool_input.command === \"string\"\n\t\t\t? input.tool_input.command\n\t\t\t: typeof input.tool_input.file_path === \"string\"\n\t\t\t\t? input.tool_input.file_path\n\t\t\t\t: JSON.stringify(input.tool_input);\n\tif (argumentPattern === \"*\") return { matches: true };\n\t// Permission-rule globs are intentionally limited here to their common '*' form.\n\tconst escaped = argumentPattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replaceAll(\"*\", \".*\");\n\ttry {\n\t\treturn { matches: new RegExp(`^${escaped}$`).test(candidate) };\n\t} catch (error) {\n\t\treturn { matches: false, error: `Invalid hook if condition ${JSON.stringify(pattern)}: ${String(error)}` };\n\t}\n}\n"]}
1
+ {"version":3,"file":"matcher.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/matcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAI5C,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,CAUxF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAmBrE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CAI7F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,aAAa,CA2B1F"}
@@ -1 +1 @@
1
- {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../../src/core/hooks/matcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HookInput } from \"./types.ts\";\n\nconst EXACT_MATCHER = /^[A-Za-z0-9_\\- ,|]+$/;\n\nexport interface MatcherResult {\n\tmatches: boolean;\n\terror?: string;\n}\n\nexport function matchHookValue(matcher: string | undefined, value: string): MatcherResult {\n\tif (matcher === undefined || matcher === \"\" || matcher === \"*\") return { matches: true };\n\tif (EXACT_MATCHER.test(matcher)) {\n\t\treturn { matches: matcher.split(/[|,]/).some((alternative) => alternative.trim() === value) };\n\t}\n\ttry {\n\t\treturn { matches: new RegExp(matcher).test(value) };\n\t} catch (error) {\n\t\treturn { matches: false, error: `Invalid hook matcher ${JSON.stringify(matcher)}: ${String(error)}` };\n\t}\n}\n\nexport function hookMatcherValue(input: HookInput): string | undefined {\n\tswitch (input.hook_event_name) {\n\t\tcase \"SessionStart\":\n\t\t\treturn input.source;\n\t\tcase \"PreToolUse\":\n\t\tcase \"PostToolUse\":\n\t\tcase \"PostToolUseFailure\":\n\t\t\treturn input.tool_name;\n\t\tcase \"StopFailure\":\n\t\t\treturn input.error;\n\t\tcase \"PreCompact\":\n\t\tcase \"PostCompact\":\n\t\t\treturn input.trigger;\n\t\tcase \"SessionEnd\":\n\t\t\treturn input.reason;\n\t\tcase \"UserPromptSubmit\":\n\t\tcase \"Stop\":\n\t\t\treturn undefined;\n\t}\n}\n\nexport function matchesHookInput(matcher: string | undefined, input: HookInput): MatcherResult {\n\tconst value = hookMatcherValue(input);\n\t// Claude ignores matcher fields on events without matcher support.\n\treturn value === undefined ? { matches: true } : matchHookValue(matcher, value);\n}\n\nexport function matchesHookIf(pattern: string | undefined, input: HookInput): MatcherResult {\n\tif (pattern === undefined) return { matches: true };\n\tif (\n\t\tinput.hook_event_name !== \"PreToolUse\" &&\n\t\tinput.hook_event_name !== \"PostToolUse\" &&\n\t\tinput.hook_event_name !== \"PostToolUseFailure\"\n\t) {\n\t\treturn { matches: false };\n\t}\n\tconst open = pattern.indexOf(\"(\");\n\tif (open < 1 || !pattern.endsWith(\")\")) return matchHookValue(pattern, input.tool_name);\n\tif (pattern.slice(0, open) !== input.tool_name) return { matches: false };\n\tconst argumentPattern = pattern.slice(open + 1, -1);\n\tconst candidate =\n\t\ttypeof input.tool_input.command === \"string\"\n\t\t\t? input.tool_input.command\n\t\t\t: typeof input.tool_input.file_path === \"string\"\n\t\t\t\t? input.tool_input.file_path\n\t\t\t\t: JSON.stringify(input.tool_input);\n\tif (argumentPattern === \"*\") return { matches: true };\n\t// Permission-rule globs are intentionally limited here to their common '*' form.\n\tconst escaped = argumentPattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replaceAll(\"*\", \".*\");\n\ttry {\n\t\treturn { matches: new RegExp(`^${escaped}$`).test(candidate) };\n\t} catch (error) {\n\t\treturn { matches: false, error: `Invalid hook if condition ${JSON.stringify(pattern)}: ${String(error)}` };\n\t}\n}\n"]}
1
+ {"version":3,"file":"matcher.js","sourceRoot":"","sources":["../../../src/core/hooks/matcher.ts"],"names":[],"mappings":"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","sourcesContent":["import type { HookInput } from \"./types.ts\";\n\nconst EXACT_MATCHER = /^[A-Za-z0-9_\\- ,|]+$/;\n\nexport interface MatcherResult {\n\tmatches: boolean;\n\terror?: string;\n}\n\nexport function matchHookValue(matcher: string | undefined, value: string): MatcherResult {\n\tif (matcher === undefined || matcher === \"\" || matcher === \"*\") return { matches: true };\n\tif (EXACT_MATCHER.test(matcher)) {\n\t\treturn { matches: matcher.split(/[|,]/).some((alternative) => alternative.trim() === value) };\n\t}\n\ttry {\n\t\treturn { matches: new RegExp(matcher).test(value) };\n\t} catch (error) {\n\t\treturn { matches: false, error: `Invalid hook matcher ${JSON.stringify(matcher)}: ${String(error)}` };\n\t}\n}\n\nexport function hookMatcherValue(input: HookInput): string | undefined {\n\tswitch (input.hook_event_name) {\n\t\tcase \"SessionStart\":\n\t\t\treturn input.source;\n\t\tcase \"PreToolUse\":\n\t\tcase \"PostToolUse\":\n\t\tcase \"PostToolUseFailure\":\n\t\t\treturn input.tool_name;\n\t\tcase \"StopFailure\":\n\t\t\treturn input.error;\n\t\tcase \"PreCompact\":\n\t\tcase \"PostCompact\":\n\t\t\treturn input.trigger;\n\t\tcase \"SessionEnd\":\n\t\t\treturn input.reason;\n\t\tcase \"UserPromptSubmit\":\n\t\tcase \"Stop\":\n\t\t\treturn undefined;\n\t}\n}\n\nexport function matchesHookInput(matcher: string | undefined, input: HookInput): MatcherResult {\n\tconst value = hookMatcherValue(input);\n\t// Claude ignores matcher fields on events without matcher support.\n\treturn value === undefined ? { matches: true } : matchHookValue(matcher, value);\n}\n\nexport function matchesHookIf(pattern: string | undefined, input: HookInput): MatcherResult {\n\tif (pattern === undefined) return { matches: true };\n\tif (\n\t\tinput.hook_event_name !== \"PreToolUse\" &&\n\t\tinput.hook_event_name !== \"PostToolUse\" &&\n\t\tinput.hook_event_name !== \"PostToolUseFailure\"\n\t) {\n\t\treturn { matches: false };\n\t}\n\tconst open = pattern.indexOf(\"(\");\n\tif (open < 1 || !pattern.endsWith(\")\")) return matchHookValue(pattern, input.tool_name);\n\tif (pattern.slice(0, open) !== input.tool_name) return { matches: false };\n\tconst argumentPattern = pattern.slice(open + 1, -1);\n\tconst candidate =\n\t\ttypeof input.tool_input.command === \"string\"\n\t\t\t? input.tool_input.command\n\t\t\t: typeof input.tool_input.file_path === \"string\"\n\t\t\t\t? input.tool_input.file_path\n\t\t\t\t: JSON.stringify(input.tool_input);\n\tif (argumentPattern === \"*\") return { matches: true };\n\t// Permission-rule globs are intentionally limited here to their common '*' form.\n\tconst escaped = argumentPattern.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replaceAll(\"*\", \".*\");\n\ttry {\n\t\treturn { matches: new RegExp(`^${escaped}$`).test(candidate) };\n\t} catch (error) {\n\t\treturn { matches: false, error: `Invalid hook if condition ${JSON.stringify(pattern)}: ${String(error)}` };\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"trust-store.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/trust-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,oBAAoB,CAAC;AAErF,eAAO,MAAM,gCAAgC,GAAa,CAAC;AAC3D,eAAO,MAAM,iCAAiC,+BAA+B,CAAC;AAO9E,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAkCD,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAchE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAehE;AAED,gEAAgE;AAChE,qBAAa,qBAAqB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,YAAY,QAAQ,SAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB,EAKjE;IAED,OAAO,CAAC,iBAAiB;IAMzB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAW7C;IAED,wGAAwG;IACxG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAM/C;IAED,qFAAqF;IACrF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAiB5D;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAEzC;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAgB1C;CACD","sourcesContent":["import { chmodSync, existsSync, mkdirSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { dirname, join, parse, resolve } from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../config.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"../auth-storage.ts\";\n\nexport const PROJECT_HOOK_TRUST_STORE_VERSION = 1 as const;\nexport const PROJECT_HOOK_TRUST_STORE_FILENAME = \"trusted-project-hooks.json\";\n\ninterface ProjectHookTrustData {\n\tversion: typeof PROJECT_HOOK_TRUST_STORE_VERSION;\n\ttrustedProjects: Record<string, true>;\n}\n\nexport interface ProjectHookTrustResult {\n\ttrusted: boolean;\n\t/** Canonical repository root, or canonical cwd when cwd is not in a repository. */\n\tidentity?: string;\n\t/** A user-readable, nonfatal error. An error result always fails closed. */\n\terror?: string;\n}\n\nfunction emptyTrustData(): ProjectHookTrustData {\n\treturn { version: PROJECT_HOOK_TRUST_STORE_VERSION, trustedProjects: {} };\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMissingGitMarkerError(error: unknown): boolean {\n\tif (!isObject(error) || typeof error.code !== \"string\") return false;\n\treturn error.code === \"ENOENT\" || error.code === \"ENOTDIR\";\n}\n\nfunction parseTrustData(text: string | undefined): ProjectHookTrustData {\n\tif (text === undefined) return emptyTrustData();\n\tconst value: unknown = JSON.parse(text);\n\tif (!isObject(value) || value.version !== PROJECT_HOOK_TRUST_STORE_VERSION || !isObject(value.trustedProjects)) {\n\t\tthrow new Error(`expected version ${PROJECT_HOOK_TRUST_STORE_VERSION} trust-store JSON`);\n\t}\n\tconst trustedProjects: Record<string, true> = {};\n\tfor (const [identity, trusted] of Object.entries(value.trustedProjects)) {\n\t\tif (identity.length === 0 || trusted !== true) throw new Error(\"invalid trustedProjects entry\");\n\t\ttrustedProjects[identity] = true;\n\t}\n\treturn { version: PROJECT_HOOK_TRUST_STORE_VERSION, trustedProjects };\n}\n\nfunction readableError(action: string, error: unknown): string {\n\tconst detail = error instanceof Error ? error.message : String(error);\n\treturn `Unable to ${action} project hook trust: ${detail}`;\n}\n\n/** Return the physical cwd used to load approved project hook settings. */\nexport function canonicalProjectHookCwd(cwd: string): string {\n\treturn realpathSync.native(resolve(cwd));\n}\n\n/**\n * Return the physical repository root containing cwd. If no ancestor has a\n * .git file or directory, return the physical cwd instead.\n */\nexport function canonicalProjectHookIdentity(cwd: string): string {\n\tconst canonicalCwd = canonicalProjectHookCwd(cwd);\n\tlet candidate = canonicalCwd;\n\twhile (true) {\n\t\ttry {\n\t\t\tconst git = statSync(join(candidate, \".git\"));\n\t\t\tif (git.isDirectory() || git.isFile()) return candidate;\n\t\t} catch (error) {\n\t\t\tif (!isMissingGitMarkerError(error)) throw error;\n\t\t}\n\t\tconst parent = dirname(candidate);\n\t\tif (parent === candidate || candidate === parse(candidate).root) return canonicalCwd;\n\t\tcandidate = parent;\n\t}\n}\n\n/**\n * Detect project hook declarations without loading or executing them.\n * Malformed and unreadable settings files are ignored.\n */\nexport function hasProjectHookConfiguration(cwd: string): boolean {\n\tconst paths = [\n\t\tjoin(cwd, CONFIG_DIR_NAME, \"settings.json\"),\n\t\tjoin(cwd, \".claude\", \"settings.json\"),\n\t\tjoin(cwd, \".claude\", \"settings.local.json\"),\n\t];\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tconst value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n\t\t\tif (isObject(value) && Object.hasOwn(value, \"hooks\")) return true;\n\t\t} catch {\n\t\t\t// Discovery is best-effort and must never make settings executable.\n\t\t}\n\t}\n\treturn false;\n}\n\n/** Persistent, repository-scoped approval for project hooks. */\nexport class ProjectHookTrustStore {\n\treadonly path: string;\n\tprivate readonly agentDir: string;\n\tprivate readonly storage: AuthStorageBackend;\n\n\tconstructor(agentDir = getAgentDir(), storage?: AuthStorageBackend) {\n\t\tthis.agentDir = resolve(agentDir);\n\t\tthis.path = join(this.agentDir, PROJECT_HOOK_TRUST_STORE_FILENAME);\n\t\tconst initial = `${JSON.stringify(emptyTrustData(), null, 2)}\\n`;\n\t\tthis.storage = storage ?? new FileAuthStorageBackend(this.path, initial);\n\t}\n\n\tprivate secureStoragePath(): void {\n\t\tmkdirSync(this.agentDir, { recursive: true, mode: 0o700 });\n\t\tchmodSync(this.agentDir, 0o700);\n\t\tif (existsSync(this.path)) chmodSync(this.path, 0o600);\n\t}\n\n\tisTrusted(cwd: string): ProjectHookTrustResult {\n\t\tlet identity: string;\n\t\ttry {\n\t\t\tidentity = canonicalProjectHookIdentity(cwd);\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => ({\n\t\t\t\tresult: { trusted: parseTrustData(current).trustedProjects[identity] === true, identity },\n\t\t\t}));\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"read\", error) };\n\t\t}\n\t}\n\n\t/** Persist approval for this repository identity. Hook contents are intentionally not fingerprinted. */\n\ttrustAlways(cwd: string): ProjectHookTrustResult {\n\t\ttry {\n\t\t\treturn this.trustAlwaysIdentity(canonicalProjectHookIdentity(cwd));\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", error) };\n\t\t}\n\t}\n\n\t/** Persist an identity that was canonicalized and displayed before user approval. */\n\ttrustAlwaysIdentity(identity: string): ProjectHookTrustResult {\n\t\tif (identity.length === 0 || resolve(identity) !== identity) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", new Error(\"invalid canonical repository identity\")) };\n\t\t}\n\t\ttry {\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => {\n\t\t\t\tconst data = parseTrustData(current);\n\t\t\t\tdata.trustedProjects[identity] = true;\n\t\t\t\treturn {\n\t\t\t\t\tresult: { trusted: true, identity },\n\t\t\t\t\tnext: `${JSON.stringify(data, null, 2)}\\n`,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, identity, error: readableError(\"update\", error) };\n\t\t}\n\t}\n\n\ttrust(cwd: string): ProjectHookTrustResult {\n\t\treturn this.trustAlways(cwd);\n\t}\n\n\trevoke(cwd: string): ProjectHookTrustResult {\n\t\tlet identity: string;\n\t\ttry {\n\t\t\tidentity = canonicalProjectHookIdentity(cwd);\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => {\n\t\t\t\tconst data = parseTrustData(current);\n\t\t\t\tdelete data.trustedProjects[identity];\n\t\t\t\treturn {\n\t\t\t\t\tresult: { trusted: false, identity },\n\t\t\t\t\tnext: `${JSON.stringify(data, null, 2)}\\n`,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", error) };\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"trust-store.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/trust-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,kBAAkB,EAA0B,MAAM,oBAAoB,CAAC;AAErF,eAAO,MAAM,gCAAgC,EAAG,CAAU,CAAC;AAC3D,eAAO,MAAM,iCAAiC,+BAA+B,CAAC;AAO9E,MAAM,WAAW,sBAAsB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAkCD,2EAA2E;AAC3E,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAchE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAehE;AAED,gEAAgE;AAChE,qBAAa,qBAAqB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAE7C,YAAY,QAAQ,SAAgB,EAAE,OAAO,CAAC,EAAE,kBAAkB,EAKjE;IAED,OAAO,CAAC,iBAAiB;IAMzB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAW7C;IAED,wGAAwG;IACxG,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAM/C;IAED,qFAAqF;IACrF,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,sBAAsB,CAiB5D;IAED,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAEzC;IAED,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,sBAAsB,CAgB1C;CACD"}
@@ -85,9 +85,6 @@ export function hasProjectHookConfiguration(cwd) {
85
85
  }
86
86
  /** Persistent, repository-scoped approval for project hooks. */
87
87
  export class ProjectHookTrustStore {
88
- path;
89
- agentDir;
90
- storage;
91
88
  constructor(agentDir = getAgentDir(), storage) {
92
89
  this.agentDir = resolve(agentDir);
93
90
  this.path = join(this.agentDir, PROJECT_HOOK_TRUST_STORE_FILENAME);
@@ -1 +1 @@
1
- {"version":3,"file":"trust-store.js","sourceRoot":"","sources":["../../../src/core/hooks/trust-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, existsSync, mkdirSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { dirname, join, parse, resolve } from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../config.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"../auth-storage.ts\";\n\nexport const PROJECT_HOOK_TRUST_STORE_VERSION = 1 as const;\nexport const PROJECT_HOOK_TRUST_STORE_FILENAME = \"trusted-project-hooks.json\";\n\ninterface ProjectHookTrustData {\n\tversion: typeof PROJECT_HOOK_TRUST_STORE_VERSION;\n\ttrustedProjects: Record<string, true>;\n}\n\nexport interface ProjectHookTrustResult {\n\ttrusted: boolean;\n\t/** Canonical repository root, or canonical cwd when cwd is not in a repository. */\n\tidentity?: string;\n\t/** A user-readable, nonfatal error. An error result always fails closed. */\n\terror?: string;\n}\n\nfunction emptyTrustData(): ProjectHookTrustData {\n\treturn { version: PROJECT_HOOK_TRUST_STORE_VERSION, trustedProjects: {} };\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMissingGitMarkerError(error: unknown): boolean {\n\tif (!isObject(error) || typeof error.code !== \"string\") return false;\n\treturn error.code === \"ENOENT\" || error.code === \"ENOTDIR\";\n}\n\nfunction parseTrustData(text: string | undefined): ProjectHookTrustData {\n\tif (text === undefined) return emptyTrustData();\n\tconst value: unknown = JSON.parse(text);\n\tif (!isObject(value) || value.version !== PROJECT_HOOK_TRUST_STORE_VERSION || !isObject(value.trustedProjects)) {\n\t\tthrow new Error(`expected version ${PROJECT_HOOK_TRUST_STORE_VERSION} trust-store JSON`);\n\t}\n\tconst trustedProjects: Record<string, true> = {};\n\tfor (const [identity, trusted] of Object.entries(value.trustedProjects)) {\n\t\tif (identity.length === 0 || trusted !== true) throw new Error(\"invalid trustedProjects entry\");\n\t\ttrustedProjects[identity] = true;\n\t}\n\treturn { version: PROJECT_HOOK_TRUST_STORE_VERSION, trustedProjects };\n}\n\nfunction readableError(action: string, error: unknown): string {\n\tconst detail = error instanceof Error ? error.message : String(error);\n\treturn `Unable to ${action} project hook trust: ${detail}`;\n}\n\n/** Return the physical cwd used to load approved project hook settings. */\nexport function canonicalProjectHookCwd(cwd: string): string {\n\treturn realpathSync.native(resolve(cwd));\n}\n\n/**\n * Return the physical repository root containing cwd. If no ancestor has a\n * .git file or directory, return the physical cwd instead.\n */\nexport function canonicalProjectHookIdentity(cwd: string): string {\n\tconst canonicalCwd = canonicalProjectHookCwd(cwd);\n\tlet candidate = canonicalCwd;\n\twhile (true) {\n\t\ttry {\n\t\t\tconst git = statSync(join(candidate, \".git\"));\n\t\t\tif (git.isDirectory() || git.isFile()) return candidate;\n\t\t} catch (error) {\n\t\t\tif (!isMissingGitMarkerError(error)) throw error;\n\t\t}\n\t\tconst parent = dirname(candidate);\n\t\tif (parent === candidate || candidate === parse(candidate).root) return canonicalCwd;\n\t\tcandidate = parent;\n\t}\n}\n\n/**\n * Detect project hook declarations without loading or executing them.\n * Malformed and unreadable settings files are ignored.\n */\nexport function hasProjectHookConfiguration(cwd: string): boolean {\n\tconst paths = [\n\t\tjoin(cwd, CONFIG_DIR_NAME, \"settings.json\"),\n\t\tjoin(cwd, \".claude\", \"settings.json\"),\n\t\tjoin(cwd, \".claude\", \"settings.local.json\"),\n\t];\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tconst value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n\t\t\tif (isObject(value) && Object.hasOwn(value, \"hooks\")) return true;\n\t\t} catch {\n\t\t\t// Discovery is best-effort and must never make settings executable.\n\t\t}\n\t}\n\treturn false;\n}\n\n/** Persistent, repository-scoped approval for project hooks. */\nexport class ProjectHookTrustStore {\n\treadonly path: string;\n\tprivate readonly agentDir: string;\n\tprivate readonly storage: AuthStorageBackend;\n\n\tconstructor(agentDir = getAgentDir(), storage?: AuthStorageBackend) {\n\t\tthis.agentDir = resolve(agentDir);\n\t\tthis.path = join(this.agentDir, PROJECT_HOOK_TRUST_STORE_FILENAME);\n\t\tconst initial = `${JSON.stringify(emptyTrustData(), null, 2)}\\n`;\n\t\tthis.storage = storage ?? new FileAuthStorageBackend(this.path, initial);\n\t}\n\n\tprivate secureStoragePath(): void {\n\t\tmkdirSync(this.agentDir, { recursive: true, mode: 0o700 });\n\t\tchmodSync(this.agentDir, 0o700);\n\t\tif (existsSync(this.path)) chmodSync(this.path, 0o600);\n\t}\n\n\tisTrusted(cwd: string): ProjectHookTrustResult {\n\t\tlet identity: string;\n\t\ttry {\n\t\t\tidentity = canonicalProjectHookIdentity(cwd);\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => ({\n\t\t\t\tresult: { trusted: parseTrustData(current).trustedProjects[identity] === true, identity },\n\t\t\t}));\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"read\", error) };\n\t\t}\n\t}\n\n\t/** Persist approval for this repository identity. Hook contents are intentionally not fingerprinted. */\n\ttrustAlways(cwd: string): ProjectHookTrustResult {\n\t\ttry {\n\t\t\treturn this.trustAlwaysIdentity(canonicalProjectHookIdentity(cwd));\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", error) };\n\t\t}\n\t}\n\n\t/** Persist an identity that was canonicalized and displayed before user approval. */\n\ttrustAlwaysIdentity(identity: string): ProjectHookTrustResult {\n\t\tif (identity.length === 0 || resolve(identity) !== identity) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", new Error(\"invalid canonical repository identity\")) };\n\t\t}\n\t\ttry {\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => {\n\t\t\t\tconst data = parseTrustData(current);\n\t\t\t\tdata.trustedProjects[identity] = true;\n\t\t\t\treturn {\n\t\t\t\t\tresult: { trusted: true, identity },\n\t\t\t\t\tnext: `${JSON.stringify(data, null, 2)}\\n`,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, identity, error: readableError(\"update\", error) };\n\t\t}\n\t}\n\n\ttrust(cwd: string): ProjectHookTrustResult {\n\t\treturn this.trustAlways(cwd);\n\t}\n\n\trevoke(cwd: string): ProjectHookTrustResult {\n\t\tlet identity: string;\n\t\ttry {\n\t\t\tidentity = canonicalProjectHookIdentity(cwd);\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => {\n\t\t\t\tconst data = parseTrustData(current);\n\t\t\t\tdelete data.trustedProjects[identity];\n\t\t\t\treturn {\n\t\t\t\t\tresult: { trusted: false, identity },\n\t\t\t\t\tnext: `${JSON.stringify(data, null, 2)}\\n`,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", error) };\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"trust-store.js","sourceRoot":"","sources":["../../../src/core/hooks/trust-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { chmodSync, existsSync, mkdirSync, readFileSync, realpathSync, statSync } from \"node:fs\";\nimport { dirname, join, parse, resolve } from \"node:path\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../config.ts\";\nimport { type AuthStorageBackend, FileAuthStorageBackend } from \"../auth-storage.ts\";\n\nexport const PROJECT_HOOK_TRUST_STORE_VERSION = 1 as const;\nexport const PROJECT_HOOK_TRUST_STORE_FILENAME = \"trusted-project-hooks.json\";\n\ninterface ProjectHookTrustData {\n\tversion: typeof PROJECT_HOOK_TRUST_STORE_VERSION;\n\ttrustedProjects: Record<string, true>;\n}\n\nexport interface ProjectHookTrustResult {\n\ttrusted: boolean;\n\t/** Canonical repository root, or canonical cwd when cwd is not in a repository. */\n\tidentity?: string;\n\t/** A user-readable, nonfatal error. An error result always fails closed. */\n\terror?: string;\n}\n\nfunction emptyTrustData(): ProjectHookTrustData {\n\treturn { version: PROJECT_HOOK_TRUST_STORE_VERSION, trustedProjects: {} };\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isMissingGitMarkerError(error: unknown): boolean {\n\tif (!isObject(error) || typeof error.code !== \"string\") return false;\n\treturn error.code === \"ENOENT\" || error.code === \"ENOTDIR\";\n}\n\nfunction parseTrustData(text: string | undefined): ProjectHookTrustData {\n\tif (text === undefined) return emptyTrustData();\n\tconst value: unknown = JSON.parse(text);\n\tif (!isObject(value) || value.version !== PROJECT_HOOK_TRUST_STORE_VERSION || !isObject(value.trustedProjects)) {\n\t\tthrow new Error(`expected version ${PROJECT_HOOK_TRUST_STORE_VERSION} trust-store JSON`);\n\t}\n\tconst trustedProjects: Record<string, true> = {};\n\tfor (const [identity, trusted] of Object.entries(value.trustedProjects)) {\n\t\tif (identity.length === 0 || trusted !== true) throw new Error(\"invalid trustedProjects entry\");\n\t\ttrustedProjects[identity] = true;\n\t}\n\treturn { version: PROJECT_HOOK_TRUST_STORE_VERSION, trustedProjects };\n}\n\nfunction readableError(action: string, error: unknown): string {\n\tconst detail = error instanceof Error ? error.message : String(error);\n\treturn `Unable to ${action} project hook trust: ${detail}`;\n}\n\n/** Return the physical cwd used to load approved project hook settings. */\nexport function canonicalProjectHookCwd(cwd: string): string {\n\treturn realpathSync.native(resolve(cwd));\n}\n\n/**\n * Return the physical repository root containing cwd. If no ancestor has a\n * .git file or directory, return the physical cwd instead.\n */\nexport function canonicalProjectHookIdentity(cwd: string): string {\n\tconst canonicalCwd = canonicalProjectHookCwd(cwd);\n\tlet candidate = canonicalCwd;\n\twhile (true) {\n\t\ttry {\n\t\t\tconst git = statSync(join(candidate, \".git\"));\n\t\t\tif (git.isDirectory() || git.isFile()) return candidate;\n\t\t} catch (error) {\n\t\t\tif (!isMissingGitMarkerError(error)) throw error;\n\t\t}\n\t\tconst parent = dirname(candidate);\n\t\tif (parent === candidate || candidate === parse(candidate).root) return canonicalCwd;\n\t\tcandidate = parent;\n\t}\n}\n\n/**\n * Detect project hook declarations without loading or executing them.\n * Malformed and unreadable settings files are ignored.\n */\nexport function hasProjectHookConfiguration(cwd: string): boolean {\n\tconst paths = [\n\t\tjoin(cwd, CONFIG_DIR_NAME, \"settings.json\"),\n\t\tjoin(cwd, \".claude\", \"settings.json\"),\n\t\tjoin(cwd, \".claude\", \"settings.local.json\"),\n\t];\n\tfor (const path of paths) {\n\t\ttry {\n\t\t\tconst value: unknown = JSON.parse(readFileSync(path, \"utf8\"));\n\t\t\tif (isObject(value) && Object.hasOwn(value, \"hooks\")) return true;\n\t\t} catch {\n\t\t\t// Discovery is best-effort and must never make settings executable.\n\t\t}\n\t}\n\treturn false;\n}\n\n/** Persistent, repository-scoped approval for project hooks. */\nexport class ProjectHookTrustStore {\n\treadonly path: string;\n\tprivate readonly agentDir: string;\n\tprivate readonly storage: AuthStorageBackend;\n\n\tconstructor(agentDir = getAgentDir(), storage?: AuthStorageBackend) {\n\t\tthis.agentDir = resolve(agentDir);\n\t\tthis.path = join(this.agentDir, PROJECT_HOOK_TRUST_STORE_FILENAME);\n\t\tconst initial = `${JSON.stringify(emptyTrustData(), null, 2)}\\n`;\n\t\tthis.storage = storage ?? new FileAuthStorageBackend(this.path, initial);\n\t}\n\n\tprivate secureStoragePath(): void {\n\t\tmkdirSync(this.agentDir, { recursive: true, mode: 0o700 });\n\t\tchmodSync(this.agentDir, 0o700);\n\t\tif (existsSync(this.path)) chmodSync(this.path, 0o600);\n\t}\n\n\tisTrusted(cwd: string): ProjectHookTrustResult {\n\t\tlet identity: string;\n\t\ttry {\n\t\t\tidentity = canonicalProjectHookIdentity(cwd);\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => ({\n\t\t\t\tresult: { trusted: parseTrustData(current).trustedProjects[identity] === true, identity },\n\t\t\t}));\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"read\", error) };\n\t\t}\n\t}\n\n\t/** Persist approval for this repository identity. Hook contents are intentionally not fingerprinted. */\n\ttrustAlways(cwd: string): ProjectHookTrustResult {\n\t\ttry {\n\t\t\treturn this.trustAlwaysIdentity(canonicalProjectHookIdentity(cwd));\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", error) };\n\t\t}\n\t}\n\n\t/** Persist an identity that was canonicalized and displayed before user approval. */\n\ttrustAlwaysIdentity(identity: string): ProjectHookTrustResult {\n\t\tif (identity.length === 0 || resolve(identity) !== identity) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", new Error(\"invalid canonical repository identity\")) };\n\t\t}\n\t\ttry {\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => {\n\t\t\t\tconst data = parseTrustData(current);\n\t\t\t\tdata.trustedProjects[identity] = true;\n\t\t\t\treturn {\n\t\t\t\t\tresult: { trusted: true, identity },\n\t\t\t\t\tnext: `${JSON.stringify(data, null, 2)}\\n`,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, identity, error: readableError(\"update\", error) };\n\t\t}\n\t}\n\n\ttrust(cwd: string): ProjectHookTrustResult {\n\t\treturn this.trustAlways(cwd);\n\t}\n\n\trevoke(cwd: string): ProjectHookTrustResult {\n\t\tlet identity: string;\n\t\ttry {\n\t\t\tidentity = canonicalProjectHookIdentity(cwd);\n\t\t\tthis.secureStoragePath();\n\t\t\treturn this.storage.withLock((current) => {\n\t\t\t\tconst data = parseTrustData(current);\n\t\t\t\tdelete data.trustedProjects[identity];\n\t\t\t\treturn {\n\t\t\t\t\tresult: { trusted: false, identity },\n\t\t\t\t\tnext: `${JSON.stringify(data, null, 2)}\\n`,\n\t\t\t\t};\n\t\t\t});\n\t\t} catch (error) {\n\t\t\treturn { trusted: false, error: readableError(\"update\", error) };\n\t\t}\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ToolOperations } from \"../tools/operations.ts\";\n\nexport const HOOK_EVENT_NAMES = [\n\t\"SessionStart\",\n\t\"UserPromptSubmit\",\n\t\"PreToolUse\",\n\t\"PostToolUse\",\n\t\"PostToolUseFailure\",\n\t\"Stop\",\n\t\"StopFailure\",\n\t\"PreCompact\",\n\t\"PostCompact\",\n\t\"SessionEnd\",\n] as const;\nexport const HOOK_EXECUTION_CUSTOM_TYPE = \"hook_execution\";\n\nexport type HookEventName = (typeof HOOK_EVENT_NAMES)[number];\nexport type JsonPrimitive = string | number | boolean | null;\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };\nexport type JsonObject = { [key: string]: JsonValue };\n\nexport type PermissionMode = \"default\" | \"plan\" | \"acceptEdits\" | \"auto\" | \"dontAsk\" | \"bypassPermissions\";\nexport type HookEffortLevel = \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\";\n\nexport interface HookEffort {\n\tlevel: HookEffortLevel;\n}\nexport type SessionStartHookSource = \"startup\" | \"resume\" | \"clear\" | \"compact\" | \"fork\";\nexport type CompactionHookTrigger = \"manual\" | \"auto\";\n\nexport interface HookInputCommon {\n\tsession_id: string;\n\ttranscript_path: string;\n\tcwd: string;\n\thook_event_name: HookEventName;\n\tprompt_id?: string;\n\tpermission_mode?: PermissionMode;\n\tagent_id?: string;\n\tagent_type?: string;\n\teffort?: HookEffort;\n}\n\nexport interface SessionStartHookInput extends HookInputCommon {\n\thook_event_name: \"SessionStart\";\n\tsource: SessionStartHookSource;\n\tmodel?: string;\n\tsession_title?: string;\n}\nexport interface UserPromptSubmitHookInput extends HookInputCommon {\n\thook_event_name: \"UserPromptSubmit\";\n\tprompt: string;\n}\nexport interface ToolHookInput extends HookInputCommon {\n\ttool_name: string;\n\ttool_input: JsonObject;\n\ttool_use_id: string;\n}\nexport interface PreToolUseHookInput extends ToolHookInput {\n\thook_event_name: \"PreToolUse\";\n}\nexport interface PostToolUseHookInput extends ToolHookInput {\n\thook_event_name: \"PostToolUse\";\n\ttool_response: JsonValue;\n\tduration_ms?: number;\n}\nexport interface PostToolUseFailureHookInput extends ToolHookInput {\n\thook_event_name: \"PostToolUseFailure\";\n\terror: string;\n\tis_interrupt?: boolean;\n\tduration_ms?: number;\n}\nexport interface StopHookInput extends HookInputCommon {\n\thook_event_name: \"Stop\";\n\tstop_hook_active: boolean;\n\tlast_assistant_message: string;\n\tbackground_tasks?: JsonObject[];\n\tsession_crons?: JsonObject[];\n}\nexport interface StopFailureHookInput extends HookInputCommon {\n\thook_event_name: \"StopFailure\";\n\terror: string;\n\terror_details?: string;\n\tlast_assistant_message?: string;\n}\nexport interface PreCompactHookInput extends HookInputCommon {\n\thook_event_name: \"PreCompact\";\n\ttrigger: CompactionHookTrigger;\n\tcustom_instructions: string;\n}\nexport interface PostCompactHookInput extends HookInputCommon {\n\thook_event_name: \"PostCompact\";\n\ttrigger: CompactionHookTrigger;\n\tcompact_summary: string;\n}\nexport type SessionEndReason = \"clear\" | \"resume\" | \"logout\" | \"prompt_input_exit\" | \"other\";\n\nexport interface SessionEndHookInput extends HookInputCommon {\n\thook_event_name: \"SessionEnd\";\n\treason: SessionEndReason;\n}\nexport type HookInput =\n\t| SessionStartHookInput\n\t| UserPromptSubmitHookInput\n\t| PreToolUseHookInput\n\t| PostToolUseHookInput\n\t| PostToolUseFailureHookInput\n\t| StopHookInput\n\t| StopFailureHookInput\n\t| PreCompactHookInput\n\t| PostCompactHookInput\n\t| SessionEndHookInput;\n\nexport type HookCommandShell = \"bash\" | \"powershell\";\nexport type UnsupportedHookHandlerType = \"prompt\" | \"agent\" | \"mcp_tool\";\n\nexport interface HookHandlerCommon {\n\ttimeout?: number;\n\tif?: string;\n\tstatusMessage?: string;\n}\nexport interface CommandHookHandler extends HookHandlerCommon {\n\ttype: \"command\";\n\tcommand: string;\n\targs?: string[];\n\tshell?: HookCommandShell;\n}\nexport interface HttpHookHandler extends HookHandlerCommon {\n\ttype: \"http\";\n\turl: string;\n\theaders?: Record<string, string>;\n\tallowedEnvVars?: string[];\n}\nexport interface UnsupportedHookHandler extends HookHandlerCommon {\n\ttype: UnsupportedHookHandlerType;\n}\nexport type HookHandler = CommandHookHandler | HttpHookHandler | UnsupportedHookHandler;\nexport interface HookGroup {\n\tmatcher?: string;\n\thooks: HookHandler[];\n}\nexport type HookConfiguration = Partial<Record<HookEventName, HookGroup[]>>;\n\nexport type HookSettingsSourceKind = \"user\" | \"project\" | \"local\" | \"host\";\nexport interface HookSettingsSource {\n\tkind: HookSettingsSourceKind;\n\tpath: string;\n}\nexport type HookDiagnosticCode =\n\t| \"read\"\n\t| \"parse\"\n\t| \"schema\"\n\t| \"unsupported-handler\"\n\t| \"invalid-regex\"\n\t| \"execution\"\n\t| \"policy\"\n\t| \"malformed-output\"\n\t| \"system-message\"\n\t| \"unsupported-update\"\n\t| \"continuation-cap\";\n\nexport type HookDiagnosticLevel = \"warning\" | \"error\";\n\nexport interface HookDiagnostic {\n\tlevel: HookDiagnosticLevel;\n\tcode: HookDiagnosticCode;\n\tmessage: string;\n\tsource?: HookSettingsSource;\n\tevent?: HookEventName;\n}\nexport interface LoadedHookHandler {\n\tevent: HookEventName;\n\tmatcher?: string;\n\thandler: HookHandler;\n\tsource: HookSettingsSource;\n\torder: number;\n\t/** Effective settings-policy environment allowlist for this HTTP hook. */\n\thttpHookAllowedEnvVars?: readonly string[];\n}\nexport interface LoadedHooks {\n\treadonly handlers: readonly LoadedHookHandler[];\n\treadonly diagnostics: readonly HookDiagnostic[];\n\treadonly sources: readonly HookSettingsSource[];\n}\n\nexport interface HookStructuredOutput {\n\tcontinue?: boolean;\n\tstopReason?: string;\n\tsuppressOutput?: boolean;\n\tsystemMessage?: string;\n\tterminalSequence?: string;\n\tdecision?: string;\n\treason?: string;\n\thookSpecificOutput?: JsonObject;\n}\nexport type HookOutputClassification =\n\t| { kind: \"empty\" }\n\t| { kind: \"text\"; text: string; malformedJson: boolean }\n\t| { kind: \"json\"; value: HookStructuredOutput };\nexport type HookExecutionStatus = \"completed\" | \"timeout\" | \"cancelled\" | \"error\" | \"unsupported\";\n\nexport interface HookExecutionResult {\n\thook: LoadedHookHandler;\n\tstatus: HookExecutionStatus;\n\texitCode: number | null;\n\tstdout: string;\n\tstderr: string;\n\tstdoutTruncated: boolean;\n\tstderrTruncated: boolean;\n\toutput: HookOutputClassification;\n\tblocking: boolean;\n\tblockingReason?: string;\n\tdurationMs: number;\n\tdiagnostic?: HookDiagnostic;\n}\n\nexport interface HookRunOptions {\n\t/** Active workspace backend used for project/local hook isolation. */\n\ttoolOperations?: Pick<ToolOperations, \"cwd\" | \"exec\" | \"getBackendInfo\">;\n\tsignal?: AbortSignal;\n\tenv?: NodeJS.ProcessEnv;\n\tmaxOutputBytes?: number;\n\tfetch?: typeof globalThis.fetch;\n\t/** Internal/test platform override for process-tree termination behavior. */\n\tplatform?: NodeJS.Platform;\n\t/** Internal/test override for Windows process-tree termination. Return false to request direct-child fallback. */\n\tterminateWindowsProcessTree?: (pid: number) => boolean;\n\t/** Shared timeout override (used for SessionEnd matching handlers). */\n\ttimeoutSeconds?: number;\n\t/** Host ceiling for HTTP destinations. Omitted means no additional host restriction. */\n\tallowedHttpHookUrls?: readonly string[];\n\t/** Host ceiling for HTTP header environment interpolation. */\n\thttpHookAllowedEnvVars?: readonly string[];\n}\nexport type HookPermissionDecision = \"allow\" | \"ask\" | \"defer\" | \"deny\";\n\nexport interface HookAggregateResult {\n\tcontinue: boolean;\n\tblocked: boolean;\n\treason?: string;\n\tadditionalContext: string[];\n\tsystemMessages: string[];\n\tplainText: string[];\n\tpermissionDecision?: HookPermissionDecision;\n\tupdatedInput?: JsonObject;\n\tupdatedToolOutput?: JsonValue;\n\tsessionTitle?: string;\n\tinitialUserMessage?: string;\n\t/** Aggregate remaining-work metric reported by Stop hooks. Lower values indicate progress. */\n\tstopContinuationProgress?: number;\n\treloadSkills?: boolean;\n\tresults: HookExecutionResult[];\n}\n\n/** Sanitized completed handler call for host UI rendering. */\nexport interface HookExecutionCallNotice {\n\ttype: HookHandler[\"type\"];\n\tlabel: string;\n\tsource: HookSettingsSource;\n\tstatus: HookExecutionStatus;\n\texitCode: number | null;\n\tdurationMs: number;\n}\n\n/** One completed hook event execution persisted as audit-only session data and exposed to host UI observers. */\nexport interface HookExecutionNotice {\n\tevent: HookEventName;\n\tsubject?: string;\n\tcalls: HookExecutionCallNotice[];\n\treturnedPrompts: string[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null;\n}\n\nexport function parseHookExecutionNotice(value: unknown): HookExecutionNotice | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(value);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!isRecord(parsed) || typeof parsed.event !== \"string\") return undefined;\n\tif (!HOOK_EVENT_NAMES.includes(parsed.event as HookEventName)) return undefined;\n\tif (parsed.subject !== undefined && typeof parsed.subject !== \"string\") return undefined;\n\tif (\n\t\t!Array.isArray(parsed.returnedPrompts) ||\n\t\t!parsed.returnedPrompts.every((prompt) => typeof prompt === \"string\")\n\t) {\n\t\treturn undefined;\n\t}\n\tif (!Array.isArray(parsed.calls) || !parsed.calls.every(isHookExecutionCallNotice)) return undefined;\n\treturn parsed as unknown as HookExecutionNotice;\n}\n\nfunction isHookExecutionCallNotice(value: unknown): value is HookExecutionCallNotice {\n\tif (!isRecord(value) || !isRecord(value.source)) return false;\n\treturn (\n\t\ttypeof value.type === \"string\" &&\n\t\ttypeof value.label === \"string\" &&\n\t\ttypeof value.source.kind === \"string\" &&\n\t\ttypeof value.source.path === \"string\" &&\n\t\ttypeof value.status === \"string\" &&\n\t\t(value.exitCode === null || typeof value.exitCode === \"number\") &&\n\t\ttypeof value.durationMs === \"number\"\n\t);\n}\n\nexport type HookExecutionListener = (notice: HookExecutionNotice) => void;\nexport type HookExecutionActivityListener = (active: boolean) => void;\n"]}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/hooks/types.ts"],"names":[],"mappings":"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"}