commandmate 0.22.2 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +108 -108
  3. package/.next/app-path-routes-manifest.json +21 -21
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/app/update-check/route.js +1 -1
  10. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  12. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  13. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  16. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/messages/route.js +1 -1
  18. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  19. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/session/route.js +1 -1
  21. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  22. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/assistant/start/route.js +1 -1
  24. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  25. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/assistant/terminal/route.js +3 -3
  27. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  28. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/assistant/tools/route.js +1 -1
  30. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  31. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/daily-summary/route.js +1 -1
  36. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  37. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  39. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  40. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  42. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  43. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  45. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  46. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/external-apps/route.js +1 -1
  48. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  49. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/fs/browse/route.js +1 -1
  51. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  52. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  54. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  55. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  57. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  58. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  60. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  61. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  63. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  64. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/metrics/vibe/route.js +1 -1
  66. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  67. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  70. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  71. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/push/vapid/route.js +1 -1
  73. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  74. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  76. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  79. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  82. package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
  83. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  85. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  86. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/repositories/clone/route.js +1 -1
  88. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  89. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  91. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  92. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/repositories/restore/route.js +1 -1
  94. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  95. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/repositories/route.js +1 -1
  97. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  98. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/repositories/scan/route.js +1 -1
  100. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  101. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/repositories/sync/route.js +1 -1
  103. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  104. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  106. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  107. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  109. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  110. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/skills/installations/route.js +1 -1
  113. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  114. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/skills/operations/route.js +1 -1
  116. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  117. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/skills/reindex/route.js +1 -1
  119. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  120. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -4
  124. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  125. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/tasks/[taskId]/route.js +1 -4
  127. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  128. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/templates/[id]/route.js +1 -1
  130. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  131. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/templates/route.js +1 -1
  133. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  134. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/todos/route.js +1 -1
  136. package/.next/server/app/api/todos/route.js.nft.json +1 -1
  137. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  139. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  140. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/verification/runs/route.js +1 -1
  142. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  143. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  149. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  152. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  154. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  155. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  158. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  163. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  239. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  242. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  248. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  250. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  251. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  254. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  257. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  260. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  263. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  266. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  269. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  271. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  272. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  275. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  277. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  278. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  280. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  281. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  283. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  284. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  286. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  287. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  289. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  290. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  291. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  293. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  295. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  296. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  298. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  299. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  301. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  302. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  304. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  305. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  307. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  308. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  310. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  311. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  313. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  314. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  316. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  317. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  319. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  320. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  322. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  323. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  325. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  326. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  327. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  328. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  329. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  331. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  332. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  333. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  334. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  335. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  337. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  338. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  340. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  341. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  342. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  343. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  344. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -4
  346. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  347. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  349. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  350. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  352. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  353. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  354. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  355. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  356. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  357. package/.next/server/app/api/worktrees/route.js +1 -1
  358. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  359. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  360. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  361. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  362. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  363. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  364. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  365. package/.next/server/app/page_client-reference-manifest.js +1 -1
  366. package/.next/server/app/proxy/[...path]/route.js +1 -1
  367. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  368. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  369. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  370. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  371. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  372. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  373. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  374. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  375. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  376. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  377. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  378. package/.next/server/app/worktrees/[id]/page.js +2 -2
  379. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  380. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  381. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  382. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  383. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  384. package/.next/server/app-paths-manifest.json +21 -21
  385. package/.next/server/chunks/1029.js +1 -1
  386. package/.next/server/chunks/1068.js +1 -1
  387. package/.next/server/chunks/2119.js +1 -1
  388. package/.next/server/chunks/2404.js +1 -1
  389. package/.next/server/chunks/2445.js +1 -1
  390. package/.next/server/chunks/2546.js +1 -1
  391. package/.next/server/chunks/3241.js +1 -0
  392. package/.next/server/chunks/3417.js +1 -1
  393. package/.next/server/chunks/406.js +10 -6
  394. package/.next/server/chunks/4444.js +1 -1
  395. package/.next/server/chunks/5959.js +4 -5
  396. package/.next/server/chunks/5998.js +1 -12
  397. package/.next/server/chunks/6130.js +1 -1
  398. package/.next/server/chunks/6274.js +3 -3
  399. package/.next/server/chunks/6401.js +1 -1
  400. package/.next/server/chunks/6781.js +1 -0
  401. package/.next/server/chunks/7458.js +6 -0
  402. package/.next/server/chunks/{3753.js → 7970.js} +57 -32
  403. package/.next/server/chunks/8536.js +1 -1
  404. package/.next/server/chunks/8807.js +180 -127
  405. package/.next/server/chunks/9058.js +1 -1
  406. package/.next/server/chunks/9067.js +1 -1
  407. package/.next/server/chunks/9360.js +1 -1
  408. package/.next/server/chunks/9687.js +2 -2
  409. package/.next/server/middleware-manifest.json +5 -5
  410. package/.next/server/pages/500.html +1 -1
  411. package/.next/server/server-reference-manifest.json +1 -1
  412. package/.next/server/src/middleware.js.map +1 -1
  413. package/.next/static/chunks/{6488-53a3e1d78e4fe8f7.js → 6488-95ba9d24a76f0cc5.js} +1 -1
  414. package/.next/static/chunks/app/worktrees/[id]/{page-6dc0b8c4e808ea3e.js → page-966a451ae7b0903a.js} +1 -1
  415. package/.next/trace +12 -12
  416. package/dist/server/src/config/log-config.js +10 -1
  417. package/dist/server/src/config/safe-directory.js +103 -0
  418. package/dist/server/src/config/system-directories.js +74 -9
  419. package/dist/server/src/lib/cli-tools/antigravity.js +19 -2
  420. package/dist/server/src/lib/cli-tools/codex.js +95 -1
  421. package/dist/server/src/lib/cli-tools/copilot.js +30 -1
  422. package/dist/server/src/lib/cli-tools/gemini.js +28 -2
  423. package/dist/server/src/lib/cli-tools/opencode.js +51 -2
  424. package/dist/server/src/lib/git/git-default-branch.js +59 -0
  425. package/dist/server/src/lib/hooks/agent-event-service.js +205 -0
  426. package/dist/server/src/lib/hooks/agent-event-types.js +7 -86
  427. package/dist/server/src/lib/hooks/hook-settings-generator.js +26 -11
  428. package/dist/server/src/lib/hooks/permission-decision-service.js +269 -0
  429. package/dist/server/src/lib/hooks/sources/abstain.js +78 -0
  430. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +372 -0
  431. package/dist/server/src/lib/hooks/sources/antigravity/source.js +225 -0
  432. package/dist/server/src/lib/hooks/sources/antigravity/tool-id.js +16 -0
  433. package/dist/server/src/lib/hooks/sources/claude/source.js +143 -0
  434. package/dist/server/src/lib/hooks/sources/claude/tool-id.js +18 -0
  435. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +465 -0
  436. package/dist/server/src/lib/hooks/sources/codex/source.js +138 -0
  437. package/dist/server/src/lib/hooks/sources/codex/tool-id.js +15 -0
  438. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +473 -0
  439. package/dist/server/src/lib/hooks/sources/copilot/source.js +210 -0
  440. package/dist/server/src/lib/hooks/sources/copilot/tool-id.js +15 -0
  441. package/dist/server/src/lib/hooks/sources/define-source.js +169 -0
  442. package/dist/server/src/lib/hooks/sources/event-mapper.js +157 -0
  443. package/dist/server/src/lib/hooks/sources/gemini/event-vocabulary.js +102 -0
  444. package/dist/server/src/lib/hooks/sources/gemini/settings-generator.js +315 -0
  445. package/dist/server/src/lib/hooks/sources/gemini/shared-config-tree.js +103 -0
  446. package/dist/server/src/lib/hooks/sources/gemini/source.js +151 -0
  447. package/dist/server/src/lib/hooks/sources/gemini/tool-id.js +17 -0
  448. package/dist/server/src/lib/hooks/sources/hook-event-vocabulary.js +111 -0
  449. package/dist/server/src/lib/hooks/sources/index.js +62 -0
  450. package/dist/server/src/lib/hooks/sources/legacy-relay.js +84 -0
  451. package/dist/server/src/lib/hooks/sources/opencode/client.js +299 -0
  452. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +261 -0
  453. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +154 -0
  454. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +189 -0
  455. package/dist/server/src/lib/hooks/sources/opencode/ports.js +295 -0
  456. package/dist/server/src/lib/hooks/sources/opencode/runtime.js +159 -0
  457. package/dist/server/src/lib/hooks/sources/opencode/source.js +250 -0
  458. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +422 -0
  459. package/dist/server/src/lib/hooks/sources/opencode/tool-id.js +14 -0
  460. package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +193 -0
  461. package/dist/server/src/lib/hooks/sources/pending-decisions.js +127 -0
  462. package/dist/server/src/lib/hooks/sources/registry.js +111 -0
  463. package/dist/server/src/lib/hooks/sources/types.js +46 -0
  464. package/dist/server/src/lib/session/agent-session-lifecycle.js +82 -0
  465. package/dist/server/src/lib/session/claude-session.js +10 -3
  466. package/dist/server/src/lib/tasks/contract-message.js +175 -0
  467. package/dist/server/src/lib/verification/env-clean-gate.js +320 -0
  468. package/dist/server/src/lib/verification/env-snapshot.js +474 -0
  469. package/dist/server/src/lib/verification/gate-runner.js +802 -0
  470. package/dist/server/src/lib/verification/scope-gate.js +402 -0
  471. package/dist/server/src/lib/verification/verify-config.js +281 -0
  472. package/package.json +1 -1
  473. package/scripts/hooks/cmate-agent-event.sh +73 -3
  474. package/.next/server/chunks/8856.js +0 -4
  475. /package/.next/static/{XpKfn5x6H-mtTaXI9yNmb → wH6K6QNPHSdATFkVoIcy3}/_buildManifest.js +0 -0
  476. /package/.next/static/{XpKfn5x6H-mtTaXI9yNmb → wH6K6QNPHSdATFkVoIcy3}/_ssgManifest.js +0 -0
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * Repository default-branch resolution (origin/HEAD).
4
+ * Issue #921: extracted from git-utils.ts (god-module split, P1-a).
5
+ *
6
+ * Shared by reset / deleteBranch / push protection (Issue #783, DR1-001).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DEFAULT_BRANCH_UNRESOLVED = void 0;
10
+ exports.getDefaultBranch = getDefaultBranch;
11
+ exports.resolveDefaultBranchName = resolveDefaultBranchName;
12
+ const git_exec_1 = require("./git-exec");
13
+ /**
14
+ * Sentinel returned by getDefaultBranch when origin/HEAD is UNRESOLVED (the
15
+ * `symbolic-ref` read returned null). DISTINCT from `null` (which means
16
+ * symbolic-ref resolved to a value that is NOT an `origin/` ref). Issue #783,
17
+ * DR1-002: callers must distinguish "unresolved" from "resolved-but-non-origin/"
18
+ * so the reset fallback only fires on TRUE unresolution.
19
+ */
20
+ exports.DEFAULT_BRANCH_UNRESOLVED = Symbol('default-branch-unresolved');
21
+ /**
22
+ * Resolve the repository default branch name via origin/HEAD (Issue #783,
23
+ * shared by reset / deleteBranch / push protection — DR1-001).
24
+ *
25
+ * Returns THREE distinguishable outcomes (DR1-002 — required for reset's
26
+ * byte-invariance):
27
+ * - string : origin/<name> resolved; returns <name> (e.g. "main")
28
+ * - DEFAULT_BRANCH_UNRESOLVED : symbolic-ref returned null (origin/HEAD unresolved)
29
+ * - null : symbolic-ref returned a value that is NOT an
30
+ * `origin/` ref (unexpected value)
31
+ *
32
+ * Keeping "unresolved" and "resolved-but-non-origin/" separate lets
33
+ * isDefaultBranchForReset's main/master fallback fire ONLY when truly unresolved,
34
+ * preserving the original behavior (a naive `startsWith ? slice : null` would
35
+ * collapse the non-origin/ case into null and wrongly trigger the fallback).
36
+ */
37
+ async function getDefaultBranch(worktreePath) {
38
+ // DR2-006: execGitCommand returns an already-trimmed string on success / null
39
+ // on failure, so out is trimmed; the out.trim() below is an idempotent (harmless)
40
+ // double-trim. The "trimmed string / null" pair maps cleanly onto the 3 values:
41
+ // UNRESOLVED (out===null) / resolved name (startsWith 'origin/') / non-origin/ (else -> null).
42
+ // Empty-string edge: if symbolic-ref returned '' (non-null), v='' -> startsWith
43
+ // false -> null, matching the original isDefaultBranchForReset behavior.
44
+ const out = await (0, git_exec_1.execGitCommand)(['symbolic-ref', 'refs/remotes/origin/HEAD', '--short'], worktreePath);
45
+ if (out === null)
46
+ return exports.DEFAULT_BRANCH_UNRESOLVED;
47
+ const v = out.trim();
48
+ return v.startsWith('origin/') ? v.slice('origin/'.length) : null;
49
+ }
50
+ /**
51
+ * Thin wrapper for callers that only want "the resolved default name, or null
52
+ * when unknown" (Issue #783, DR1-001). Collapses both DEFAULT_BRANCH_UNRESOLVED
53
+ * and the non-origin/ `null` into `null` (= default name unknown). Used by
54
+ * deleteBranch (no fallback) and push protection (null = unprotected).
55
+ */
56
+ async function resolveDefaultBranchName(worktreePath) {
57
+ const r = await getDefaultBranch(worktreePath);
58
+ return typeof r === 'string' ? r : null;
59
+ }
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ /**
3
+ * Effects of a structured agent event (Issue #1549, Phase 3-2).
4
+ *
5
+ * The agent CLI is the only party that knows for certain that it finished a
6
+ * turn. Everything else in this codebase infers it by reading the terminal
7
+ * frame. This module is the first-class path: an event the agent itself sent,
8
+ * turned into a `task_events` row and — when the contract asks for it — a
9
+ * verification run.
10
+ *
11
+ * It does not replace the string analysis. `detectSessionStatus` keeps running
12
+ * and keeps deciding, because a hook only exists when a human wired one up and
13
+ * a completion mechanism that silently does nothing on an unconfigured machine
14
+ * is worse than one that is merely imprecise everywhere.
15
+ *
16
+ * Server-only: touches the filesystem (realpath) and the database.
17
+ *
18
+ * @module lib/hooks/agent-event-service
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.MAX_CWD_LENGTH = exports.isAgentEventType = exports.AGENT_EVENT_TYPES = void 0;
22
+ exports.validateHookCwd = validateHookCwd;
23
+ exports.resolveWorktreeByCwd = resolveWorktreeByCwd;
24
+ exports.applyAgentStopEvent = applyAgentStopEvent;
25
+ const fs_1 = require("fs");
26
+ const path_1 = require("path");
27
+ const db_1 = require("../../lib/db");
28
+ const tasks_db_1 = require("../../lib/db/tasks-db");
29
+ const path_validator_1 = require("../../lib/security/path-validator");
30
+ const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
31
+ const gate_runner_1 = require("../../lib/verification/gate-runner");
32
+ const agent_event_state_1 = require("../../lib/session/agent-event-state");
33
+ const logger_1 = require("../../lib/logger");
34
+ const logger = (0, logger_1.createLogger)('lib/hooks/agent-event-service');
35
+ /**
36
+ * The event vocabulary lives in `agent-event-types` (Issue #1722) so the
37
+ * settings generator and the in-memory state can use it without importing this
38
+ * module's database and verification dependencies. Re-exported here because
39
+ * this is where callers have always found it.
40
+ *
41
+ * The Claude-specific mapping helpers that used to be re-exported alongside
42
+ * them are gone (Issue #1759): a tool's spellings now belong to that tool's
43
+ * `AgentEventSource`, and re-exporting one tool's from the generic service
44
+ * would have made this module the next place a Phase 4-x implementer reached
45
+ * for. Ask `getAgentEventSource(cliToolId).normalizeEvent()` instead.
46
+ *
47
+ * Every kind but `stop` is accepted, recorded and exposed without changing any
48
+ * state: the receiver has to exist before agents can be told to send them, and
49
+ * rejecting them would make every hook config a two-step rollout.
50
+ */
51
+ var agent_event_types_1 = require("../../lib/hooks/agent-event-types");
52
+ Object.defineProperty(exports, "AGENT_EVENT_TYPES", { enumerable: true, get: function () { return agent_event_types_1.AGENT_EVENT_TYPES; } });
53
+ Object.defineProperty(exports, "isAgentEventType", { enumerable: true, get: function () { return agent_event_types_1.isAgentEventType; } });
54
+ /** Bound on the accepted `cwd`, comfortably above PATH_MAX on every supported platform. */
55
+ exports.MAX_CWD_LENGTH = 4096;
56
+ /**
57
+ * Reject a `cwd` that cannot be a legitimate agent working directory.
58
+ *
59
+ * A hook posts the directory the agent is running in, so the only shapes worth
60
+ * accepting are absolute, traversal-free paths. `..` is refused rather than
61
+ * normalised away: `resolve()` would happily turn `/repos/a/../../etc` into a
62
+ * path that looks nothing like what the caller sent, and a value that changes
63
+ * meaning between validation and use is exactly how traversal checks get
64
+ * defeated. Percent-encoding is decoded first, so `%2e%2e%2f` cannot smuggle a
65
+ * `..` past a raw string scan.
66
+ */
67
+ function validateHookCwd(raw) {
68
+ if (typeof raw !== 'string' || raw.trim() === '') {
69
+ return { ok: false, reason: 'empty' };
70
+ }
71
+ if (raw.length > exports.MAX_CWD_LENGTH) {
72
+ return { ok: false, reason: 'too_long' };
73
+ }
74
+ let decoded = raw;
75
+ try {
76
+ decoded = decodeURIComponent(raw);
77
+ }
78
+ catch {
79
+ // Not valid percent-encoding; the raw string is the only interpretation.
80
+ decoded = raw;
81
+ }
82
+ if (raw.includes('\0') || decoded.includes('\0')) {
83
+ return { ok: false, reason: 'nul_byte' };
84
+ }
85
+ if (!(0, path_1.isAbsolute)(raw)) {
86
+ return { ok: false, reason: 'not_absolute' };
87
+ }
88
+ if (hasTraversalSegment(raw) || hasTraversalSegment(decoded)) {
89
+ return { ok: false, reason: 'traversal' };
90
+ }
91
+ return { ok: true, cwd: raw };
92
+ }
93
+ /** True when any path segment is `..`, under either separator convention. */
94
+ function hasTraversalSegment(value) {
95
+ return value
96
+ .split(path_1.sep === '\\' ? /[\\/]/ : '/')
97
+ .some((segment) => segment === '..');
98
+ }
99
+ /**
100
+ * The registered worktree an agent's `cwd` belongs to, or null.
101
+ *
102
+ * Both sides are resolved through `realpath` before comparison because the two
103
+ * ends disagree routinely and harmlessly: macOS hands agents `/var/...` for a
104
+ * worktree stored as `/private/var/...`, and worktree roots are often symlinked.
105
+ *
106
+ * A descendant matches its worktree — agents commonly run from a subdirectory —
107
+ * and the longest match wins, so a worktree nested inside another resolves to
108
+ * the inner one rather than to whichever row the database returned first.
109
+ *
110
+ * @param cwd - Already through {@link validateHookCwd}
111
+ * @returns null when the path does not exist or belongs to no worktree; the
112
+ * caller must not distinguish those two cases to the client
113
+ */
114
+ function resolveWorktreeByCwd(db, cwd) {
115
+ const resolvedCwd = safeRealpath(cwd);
116
+ if (resolvedCwd === null) {
117
+ return null;
118
+ }
119
+ let best = null;
120
+ let bestLength = -1;
121
+ for (const worktree of (0, db_1.getWorktrees)(db)) {
122
+ const resolvedWorktree = safeRealpath(worktree.path);
123
+ if (resolvedWorktree === null)
124
+ continue;
125
+ if (!(0, path_validator_1.isWithinRoot)(resolvedCwd, resolvedWorktree))
126
+ continue;
127
+ if (resolvedWorktree.length > bestLength) {
128
+ best = worktree;
129
+ bestLength = resolvedWorktree.length;
130
+ }
131
+ }
132
+ return best;
133
+ }
134
+ /** realpath, or null when the path does not exist / is unreadable. */
135
+ function safeRealpath(target) {
136
+ try {
137
+ return (0, fs_1.realpathSync)(target);
138
+ }
139
+ catch {
140
+ return null;
141
+ }
142
+ }
143
+ /**
144
+ * Apply a `stop` event to whatever the worktree is currently doing.
145
+ *
146
+ * The no-op is the load-bearing case. Sessions with no contract, and therefore
147
+ * no task, are the overwhelming majority; for them this records the timestamp
148
+ * and returns. Nothing about the existing completion path changes.
149
+ *
150
+ * Never throws. A hook is fire-and-forget from a CLI's stop handler, and a
151
+ * failure here must not become the agent's problem.
152
+ */
153
+ async function applyAgentStopEvent(db, worktree, cliToolId, instanceId) {
154
+ (0, agent_event_state_1.recordAgentStopEvent)(worktree.id, cliToolId, instanceId);
155
+ let task;
156
+ try {
157
+ task = (0, tasks_db_1.getActiveTaskForInstance)(db, worktree.id, cliToolId, instanceId);
158
+ }
159
+ catch (error) {
160
+ logger.warn('agent-stop-task-lookup-failed', {
161
+ worktreeId: worktree.id,
162
+ error: error instanceof Error ? error.message : String(error),
163
+ });
164
+ return { taskId: null, taskEventApplied: false, verificationRunId: null };
165
+ }
166
+ if (!task) {
167
+ return { taskId: null, taskEventApplied: false, verificationRunId: null };
168
+ }
169
+ let taskEventApplied = false;
170
+ try {
171
+ const result = (0, task_transition_service_1.applyTaskEvent)(db, task.id, 'agent_idle', { source: 'hook' });
172
+ taskEventApplied = result !== null && result.toStatus !== null;
173
+ }
174
+ catch (error) {
175
+ logger.warn('agent-stop-event-failed', {
176
+ taskId: task.id,
177
+ error: error instanceof Error ? error.message : String(error),
178
+ });
179
+ }
180
+ if (!task.contract.success.autoVerifyOnStop) {
181
+ return { taskId: task.id, taskEventApplied, verificationRunId: null };
182
+ }
183
+ let verificationRunId = null;
184
+ try {
185
+ const { runId } = await (0, gate_runner_1.startVerification)({
186
+ worktreeId: worktree.id,
187
+ worktreePath: worktree.path,
188
+ instanceId,
189
+ taskId: task.id,
190
+ trigger: 'task',
191
+ });
192
+ verificationRunId = runId;
193
+ }
194
+ catch (error) {
195
+ // A run already in flight is the expected collision, not a fault: the agent
196
+ // stopping twice while gates execute is ordinary.
197
+ if (!(error instanceof gate_runner_1.VerificationConflictError)) {
198
+ logger.error('agent-stop-auto-verify-failed', {
199
+ taskId: task.id,
200
+ error: error instanceof Error ? error.message : String(error),
201
+ });
202
+ }
203
+ }
204
+ return { taskId: task.id, taskEventApplied, verificationRunId };
205
+ }
@@ -9,19 +9,18 @@
9
9
  * runner. `agent-event-service` re-exports everything here, so existing
10
10
  * importers are unaffected.
11
11
  *
12
- * The mapping below is not derived from Claude Code's documentation. It is
13
- * derived from the payloads in `tests/fixtures/hooks/claude/`, captured from a
14
- * live v2.1.223 session in Issue #1721 and written up in
15
- * `docs/design/agent-hooks-live-verification.md`. Where the two disagree, the
16
- * fixtures win.
12
+ * **Nothing here names a tool.** It used to: `CLAUDE_HOOK_EVENT_NAMES` and
13
+ * `extractClaudeEventDetail` lived beside the words until Issue #1759 moved
14
+ * them to `lib/hooks/sources/hook-event-vocabulary`, where a source *selects*
15
+ * them. One tool's spellings sitting in the module every tool-agnostic consumer
16
+ * imports is how the next tool ends up appended to the same table instead of
17
+ * bringing its own — the copy-paste Epic #1720 exists to stop.
17
18
  *
18
19
  * @module lib/hooks/agent-event-types
19
20
  */
20
21
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.MAX_EVENT_DETAIL_LENGTH = exports.CLAUDE_HOOK_EVENT_NAMES = exports.AGENT_EVENT_TYPES = void 0;
22
+ exports.MAX_EVENT_DETAIL_LENGTH = exports.AGENT_EVENT_TYPES = void 0;
22
23
  exports.isAgentEventType = isAgentEventType;
23
- exports.mapClaudeHookEventName = mapClaudeHookEventName;
24
- exports.extractClaudeEventDetail = extractClaudeEventDetail;
25
24
  /**
26
25
  * Event kinds accepted by `POST /api/hooks/agent-event`.
27
26
  *
@@ -49,83 +48,5 @@ exports.AGENT_EVENT_TYPES = [
49
48
  function isAgentEventType(value) {
50
49
  return typeof value === 'string' && exports.AGENT_EVENT_TYPES.includes(value);
51
50
  }
52
- /**
53
- * Claude Code's own `hook_event_name` values, mapped onto the vocabulary above.
54
- *
55
- * An injected `type: "http"` hook posts Claude's payload verbatim — there is no
56
- * way to shape the body — so the receiver has to read Claude's spelling. Only
57
- * the events CommandMate injects are listed, and an unmapped name is refused
58
- * rather than silently filed under something else.
59
- *
60
- * `PermissionRequest` is absent because it has its own receiver: its response
61
- * body is a decision the agent obeys, which is the opposite contract to this
62
- * fire-and-forget route (#1724).
63
- *
64
- * `PostToolUse` **is** mapped, on the strength of a measurement taken for Issue
65
- * #1726 rather than of the #1721 spike, which recorded it as unobserved. Driving
66
- * a live v2.1.223 session on 2026-08-06 with a `PostToolUse` hook registered:
67
- *
68
- * ```
69
- * 15:36:04.112 PreToolUse AskUserQuestion (picker drawn)
70
- * 15:36:10.127 Notification permission_prompt (picker still up)
71
- * 15:36:28.643 PostToolUse AskUserQuestion (the human answered)
72
- * 15:36:29.992 Stop
73
- * ```
74
- *
75
- * It fires, and it is the precise signal — "this tool call is over" — where
76
- * `Stop` is "the turn is over" and can be minutes later if the agent keeps
77
- * working after the answer. Both are wired up; see `agent-event-state`.
78
- */
79
- exports.CLAUDE_HOOK_EVENT_NAMES = {
80
- Stop: 'stop',
81
- SubagentStop: 'stop',
82
- Notification: 'notification',
83
- SessionStart: 'session_start',
84
- SessionEnd: 'session_end',
85
- UserPromptSubmit: 'user_prompt_submit',
86
- // Issue #1726. Injected with matcher `AskUserQuestion`, so in practice these
87
- // only ever arrive for that tool — but the receiver re-reads `tool_name`
88
- // rather than trusting the matcher, because a user's own settings.json is
89
- // concatenated with the injected one and may register a wider matcher.
90
- PreToolUse: 'pre_tool_use',
91
- PostToolUse: 'post_tool_use',
92
- };
93
- /** @returns The event this `hook_event_name` maps to, or null when unmapped. */
94
- function mapClaudeHookEventName(value) {
95
- if (typeof value !== 'string')
96
- return null;
97
- return exports.CLAUDE_HOOK_EVENT_NAMES[value] ?? null;
98
- }
99
51
  /** Bound on the stored `detail`; every observed value is a short enum-ish word. */
100
52
  exports.MAX_EVENT_DETAIL_LENGTH = 128;
101
- /**
102
- * The event's subtype, as a single short string, or null when it has none.
103
- *
104
- * Each event spells this differently and none of them share a field:
105
- *
106
- * - `Notification` → `notification_type` (`permission_prompt` / `idle_prompt`).
107
- * This is also what a `Notification` matcher is tested against — **not**
108
- * `message`, which is English prose for a human (D3).
109
- * - `SessionEnd` → `reason` (`clear` / `prompt_input_exit` / …)
110
- * - `SessionStart` → `source` (`startup` / `clear` / …)
111
- * - `PreToolUse` / `PostToolUse` → `tool_name` (`AskUserQuestion`), Issue #1726
112
- *
113
- * `Stop` and `UserPromptSubmit` have no subtype, so they answer null.
114
- */
115
- function extractClaudeEventDetail(event, payload) {
116
- const field = event === 'notification'
117
- ? 'notification_type'
118
- : event === 'session_end'
119
- ? 'reason'
120
- : event === 'session_start'
121
- ? 'source'
122
- : event === 'pre_tool_use' || event === 'post_tool_use'
123
- ? 'tool_name'
124
- : null;
125
- if (field === null)
126
- return null;
127
- const value = payload[field];
128
- if (typeof value !== 'string' || value === '')
129
- return null;
130
- return value.slice(0, exports.MAX_EVENT_DETAIL_LENGTH);
131
- }
@@ -28,6 +28,12 @@
28
28
  * - **Every hook failure is fail-open.** A refused connection or a timeout
29
29
  * costs the event, never the session.
30
30
  *
31
+ * Issue #1759 made this module *Claude's* config serialiser rather than *the*
32
+ * config serialiser: it is reached through `claudeAgentEventSource.prepareLaunch`
33
+ * (seams S3/S4/S5), and the four other hook tools each bring their own — their
34
+ * files live in different places, nest differently, and cannot use `type:"http"`
35
+ * at all. Nothing here changed; only who calls it did.
36
+ *
31
37
  * The generated file is written rather than passed inline. `--settings` does
32
38
  * accept a JSON string (D2), but the launch command travels to the CLI through
33
39
  * `tmux send-keys` as a single line, and a ~1 KB argument of braces, quotes and
@@ -55,8 +61,10 @@ const crypto_1 = require("crypto");
55
61
  const fs_1 = require("fs");
56
62
  const os_1 = require("os");
57
63
  const path_1 = require("path");
64
+ const safe_directory_1 = require("../../config/safe-directory");
58
65
  const env_1 = require("../../lib/env");
59
66
  const types_1 = require("../../lib/cli-tools/types");
67
+ const tool_id_1 = require("../../lib/hooks/sources/claude/tool-id");
60
68
  const permission_request_payload_1 = require("../../lib/hooks/permission-request-payload");
61
69
  const logger_1 = require("../../lib/logger");
62
70
  const logger = (0, logger_1.createLogger)('lib/hooks/hook-settings-generator');
@@ -178,18 +186,25 @@ function isHookInjectionEnabled() {
178
186
  function isAuthTokenExpected() {
179
187
  return Boolean(process.env[exports.AUTH_TOKEN_ENV_VAR] || process.env.CM_AUTH_TOKEN_HASH);
180
188
  }
181
- /** Directory the generated settings files live in. */
189
+ /**
190
+ * Directory the generated settings files live in.
191
+ *
192
+ * Issue #1774: `writeAgentHookSettings` calls `mkdirSync(…, {recursive:true})`
193
+ * on the result, so a value inside `/proc`, `/sys` or `/dev` would spin the
194
+ * event loop forever rather than throw — the fail-open `try/catch` below is
195
+ * never reached, because the call never returns. Such a value is refused here
196
+ * and the default is used.
197
+ */
182
198
  function getHookSettingsDirectory(options = {}) {
183
- if (options.directory)
184
- return options.directory;
185
- const override = process.env.CM_AGENT_HOOKS_DIR;
186
- if (override)
187
- return override;
188
- return (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'hooks');
199
+ const fallback = (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'hooks');
200
+ if (options.directory) {
201
+ return (0, safe_directory_1.resolveSafeDirectory)(options.directory, fallback, 'HookSettingsOptions.directory');
202
+ }
203
+ return (0, safe_directory_1.resolveSafeDirectory)(process.env.CM_AGENT_HOOKS_DIR, fallback, 'CM_AGENT_HOOKS_DIR');
189
204
  }
190
205
  /** The instance this settings file speaks for; primary when unspecified. */
191
206
  function resolveTargetInstanceId(target) {
192
- const cliToolId = target.cliToolId ?? 'claude';
207
+ const cliToolId = target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID;
193
208
  const instanceId = target.instanceId ?? cliToolId;
194
209
  return instanceId;
195
210
  }
@@ -202,7 +217,7 @@ function resolveTargetInstanceId(target) {
202
217
  * restart overwrites rather than accumulates.
203
218
  */
204
219
  function getHookSettingsPath(target, options = {}) {
205
- const cliToolId = target.cliToolId ?? 'claude';
220
+ const cliToolId = target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID;
206
221
  const instanceId = resolveTargetInstanceId(target);
207
222
  const slug = `${cliToolId}-${target.worktreeId}-${instanceId}`.replace(/[^a-zA-Z0-9_-]/g, '_');
208
223
  const digest = (0, crypto_1.createHash)('sha256')
@@ -236,7 +251,7 @@ function buildPermissionRequestUrl(target, options = {}) {
236
251
  return buildReceiverUrl(exports.PERMISSION_REQUEST_PATH, target, options);
237
252
  }
238
253
  function buildReceiverUrl(path, target, options) {
239
- const cliToolId = target.cliToolId ?? 'claude';
254
+ const cliToolId = target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID;
240
255
  const port = options.port ?? (0, env_1.getServerPort)();
241
256
  const params = new URLSearchParams({
242
257
  tool: cliToolId,
@@ -285,7 +300,7 @@ function buildSessionStartCommand(target, options = {}) {
285
300
  return [
286
301
  shellQuote(relay),
287
302
  '--tool',
288
- shellQuote(target.cliToolId ?? 'claude'),
303
+ shellQuote(target.cliToolId ?? tool_id_1.CLAUDE_CLI_TOOL_ID),
289
304
  '--event',
290
305
  'session_start',
291
306
  '--worktree-id',