commandmate 0.22.2 → 0.24.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 (841) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +383 -374
  3. package/.next/app-path-routes-manifest.json +16 -15
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +1 -1
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update-check/route.js +1 -1
  11. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  13. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  14. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  17. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/messages/route.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  20. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/assistant/session/route.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  23. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/assistant/start/route.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  26. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/assistant/terminal/route.js +3 -3
  28. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  29. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/assistant/tools/route.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  32. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/daily-summary/route.js +1 -1
  37. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  38. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  40. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  41. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  43. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  44. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  46. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  47. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/external-apps/route.js +1 -1
  49. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  50. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/fs/browse/route.js +1 -1
  52. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  53. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  55. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  56. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  58. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  59. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  61. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  62. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  64. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  65. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/metrics/vibe/route.js +1 -1
  67. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  68. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/push/escalation/route.js +1 -0
  71. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -0
  72. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -0
  73. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  74. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  75. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/push/vapid/route.js +1 -1
  77. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  78. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  80. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  81. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  83. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
  84. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  86. package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
  87. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  89. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  90. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/repositories/clone/route.js +1 -1
  92. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  93. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  95. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  96. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/repositories/restore/route.js +1 -1
  98. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  99. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/repositories/route.js +1 -1
  101. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  102. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/repositories/scan/route.js +1 -1
  104. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  105. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/repositories/sync/route.js +1 -1
  107. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  108. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  110. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  111. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  113. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  114. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/skills/installations/route.js +1 -1
  117. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  118. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/skills/operations/route.js +1 -1
  120. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  121. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/skills/reindex/route.js +1 -1
  123. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  124. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -4
  128. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  129. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/tasks/[taskId]/route.js +1 -4
  131. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  132. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/templates/[id]/route.js +1 -1
  134. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  135. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/templates/route.js +1 -1
  137. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  138. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/todos/route.js +1 -1
  140. package/.next/server/app/api/todos/route.js.nft.json +1 -1
  141. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  143. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  144. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/verification/runs/route.js +1 -1
  146. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  147. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  150. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  158. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  159. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  162. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  165. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  167. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  243. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  246. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +6 -6
  254. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  258. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  264. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  267. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  270. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  273. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  275. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  276. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  277. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  279. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  280. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  281. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  282. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  283. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  285. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  288. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  289. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  291. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  294. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  297. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  298. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  300. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  301. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  303. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  304. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  306. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  307. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  309. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  310. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  312. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  313. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  314. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  315. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  316. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  318. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  319. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  321. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  322. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  323. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  324. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  325. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  326. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  327. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  328. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  329. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  330. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  331. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  332. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  333. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  334. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  335. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  336. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  337. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  338. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  339. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  340. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  341. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  342. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  343. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  344. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  345. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  346. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  347. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  348. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  349. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -4
  350. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  351. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  352. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  353. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  354. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  355. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  356. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  357. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  358. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  359. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  360. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  361. package/.next/server/app/api/worktrees/route.js +1 -1
  362. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  363. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  364. package/.next/server/app/chat/page.js +2 -2
  365. package/.next/server/app/chat/page.js.nft.json +1 -1
  366. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  367. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  368. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  369. package/.next/server/app/more/page.js +2 -2
  370. package/.next/server/app/more/page.js.nft.json +1 -1
  371. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  372. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  373. package/.next/server/app/page.js +1 -1
  374. package/.next/server/app/page.js.nft.json +1 -1
  375. package/.next/server/app/page_client-reference-manifest.js +1 -1
  376. package/.next/server/app/proxy/[...path]/route.js +1 -1
  377. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  378. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  379. package/.next/server/app/repositories/page.js +2 -2
  380. package/.next/server/app/repositories/page.js.nft.json +1 -1
  381. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  382. package/.next/server/app/review/page.js +1 -1
  383. package/.next/server/app/review/page.js.nft.json +1 -1
  384. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  385. package/.next/server/app/sessions/page.js +1 -1
  386. package/.next/server/app/sessions/page.js.nft.json +1 -1
  387. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  388. package/.next/server/app/skills/[skillId]/page.js +2 -2
  389. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  390. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  391. package/.next/server/app/skills/installed/page.js +2 -2
  392. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  393. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  394. package/.next/server/app/skills/page.js +1 -1
  395. package/.next/server/app/skills/page.js.nft.json +1 -1
  396. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  397. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  398. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  399. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  400. package/.next/server/app/worktrees/[id]/page.js +6 -6
  401. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  402. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  403. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  404. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  405. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  406. package/.next/server/app-paths-manifest.json +16 -15
  407. package/.next/server/chunks/1029.js +1 -1
  408. package/.next/server/chunks/1068.js +1 -1
  409. package/.next/server/chunks/1296.js +1 -1
  410. package/.next/server/chunks/1366.js +1 -1
  411. package/.next/server/chunks/1601.js +7 -0
  412. package/.next/server/chunks/1825.js +1 -1
  413. package/.next/server/chunks/2119.js +1 -1
  414. package/.next/server/chunks/2404.js +1 -1
  415. package/.next/server/chunks/2445.js +1 -1
  416. package/.next/server/chunks/2546.js +1 -1
  417. package/.next/server/chunks/3241.js +1 -0
  418. package/.next/server/chunks/3417.js +1 -1
  419. package/.next/server/chunks/3451.js +1 -1
  420. package/.next/server/chunks/3480.js +1 -1
  421. package/.next/server/chunks/3543.js +1 -1
  422. package/.next/server/chunks/3945.js +1 -1
  423. package/.next/server/chunks/406.js +10 -6
  424. package/.next/server/chunks/4393.js +1 -0
  425. package/.next/server/chunks/4444.js +1 -1
  426. package/.next/server/chunks/4455.js +1 -0
  427. package/.next/server/chunks/5164.js +1 -0
  428. package/.next/server/chunks/5959.js +5 -6
  429. package/.next/server/chunks/5998.js +2 -13
  430. package/.next/server/chunks/6130.js +1 -1
  431. package/.next/server/chunks/6159.js +1 -1
  432. package/.next/server/chunks/6274.js +3 -3
  433. package/.next/server/chunks/6401.js +1 -1
  434. package/.next/server/chunks/6781.js +1 -0
  435. package/.next/server/chunks/7458.js +6 -0
  436. package/.next/server/chunks/{3753.js → 7970.js} +57 -32
  437. package/.next/server/chunks/8536.js +1 -1
  438. package/.next/server/chunks/880.js +21 -0
  439. package/.next/server/chunks/8807.js +250 -192
  440. package/.next/server/chunks/9058.js +1 -1
  441. package/.next/server/chunks/9067.js +1 -1
  442. package/.next/server/chunks/9123.js +8 -8
  443. package/.next/server/chunks/9358.js +1 -1
  444. package/.next/server/chunks/9360.js +1 -1
  445. package/.next/server/chunks/9373.js +3 -3
  446. package/.next/server/chunks/9687.js +2 -2
  447. package/.next/server/middleware-build-manifest.js +1 -1
  448. package/.next/server/middleware-manifest.json +5 -5
  449. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  450. package/.next/server/pages/500.html +1 -1
  451. package/.next/server/server-reference-manifest.json +1 -1
  452. package/.next/server/src/middleware.js.map +1 -1
  453. package/.next/static/chunks/4322-dfd5a7119b5ba4fc.js +1 -0
  454. package/.next/static/chunks/{4974-eaf66770bfa9dea0.js → 4974-35592ec312322124.js} +1 -1
  455. package/.next/static/chunks/5229-0610b4e3288e777d.js +1 -0
  456. package/.next/static/chunks/6381-18a6a02a94d00d76.js +1 -0
  457. package/.next/static/chunks/7229.7f0f5a7032b612b4.js +1 -0
  458. package/.next/static/chunks/{744-fa8c0ae444c8338c.js → 744-3ad06d8c8ca482fc.js} +1 -1
  459. package/.next/static/chunks/app/api/app/update/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  460. package/.next/static/chunks/app/api/app/update-check/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  461. package/.next/static/chunks/app/api/assistant/conversation/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  462. package/.next/static/chunks/app/api/assistant/current-output/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  463. package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +1 -0
  464. package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +1 -0
  465. package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +1 -0
  466. package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +1 -0
  467. package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +1 -0
  468. package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +1 -0
  469. package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +1 -0
  470. package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +1 -0
  471. package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +1 -0
  472. package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +1 -0
  473. package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +1 -0
  474. package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +1 -0
  475. package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +1 -0
  476. package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +1 -0
  477. package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +1 -0
  478. package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +1 -0
  479. package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +1 -0
  480. package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +1 -0
  481. package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +1 -0
  482. package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +1 -0
  483. package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +1 -0
  484. package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +1 -0
  485. package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +1 -0
  486. package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +1 -0
  487. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
  488. package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
  489. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +1 -0
  490. package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +1 -0
  491. package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +1 -0
  492. package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +1 -0
  493. package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +1 -0
  494. package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +1 -0
  495. package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +1 -0
  496. package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +1 -0
  497. package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +1 -0
  498. package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +1 -0
  499. package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +1 -0
  500. package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +1 -0
  501. package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +1 -0
  502. package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +1 -0
  503. package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
  504. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +1 -0
  505. package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +1 -0
  506. package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +1 -0
  507. package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +1 -0
  508. package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +1 -0
  509. package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
  510. package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +1 -0
  511. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +1 -0
  512. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +1 -0
  513. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +1 -0
  514. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +1 -0
  515. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +1 -0
  516. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +1 -0
  517. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +1 -0
  518. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  519. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +1 -0
  520. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +1 -0
  521. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +1 -0
  522. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +1 -0
  523. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +1 -0
  524. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +1 -0
  525. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +1 -0
  526. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +1 -0
  527. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +1 -0
  528. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +1 -0
  529. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +1 -0
  530. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +1 -0
  531. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +1 -0
  532. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +1 -0
  533. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +1 -0
  534. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +1 -0
  535. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +1 -0
  536. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +1 -0
  537. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +1 -0
  538. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +1 -0
  539. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +1 -0
  540. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +1 -0
  541. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +1 -0
  542. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +1 -0
  543. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +1 -0
  544. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +1 -0
  545. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +1 -0
  546. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +1 -0
  547. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +1 -0
  548. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +1 -0
  549. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +1 -0
  550. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +1 -0
  551. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +1 -0
  552. package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +1 -0
  553. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +1 -0
  554. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +1 -0
  555. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +1 -0
  556. package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +1 -0
  557. package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +1 -0
  558. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +1 -0
  559. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +1 -0
  560. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +1 -0
  561. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +1 -0
  562. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +1 -0
  563. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +1 -0
  564. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +1 -0
  565. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +1 -0
  566. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
  567. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +1 -0
  568. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +1 -0
  569. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +1 -0
  570. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +1 -0
  571. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +1 -0
  572. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +1 -0
  573. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
  574. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
  575. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  576. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +1 -0
  577. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  578. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +1 -0
  579. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
  580. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +1 -0
  581. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +1 -0
  582. package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +1 -0
  583. package/.next/static/chunks/app/chat/page-15d13fc024d78f5d.js +1 -0
  584. package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +1 -0
  585. package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +1 -0
  586. package/.next/static/chunks/app/more/page-b8ba537baeac8d5b.js +1 -0
  587. package/.next/static/chunks/app/page-afc64708362f31e5.js +1 -0
  588. package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  589. package/.next/static/chunks/app/repositories/page-3469dacb6be7842f.js +1 -0
  590. package/.next/static/chunks/app/review/page-2d9cb7e068f8f35a.js +1 -0
  591. package/.next/static/chunks/app/sessions/page-7470c2bfd89e0df9.js +1 -0
  592. package/.next/static/chunks/app/skills/[skillId]/page-5e24481162f7ea78.js +1 -0
  593. package/.next/static/chunks/app/skills/installed/page-efd2d710a27f9735.js +1 -0
  594. package/.next/static/chunks/app/skills/page-0498adfc6e48684b.js +1 -0
  595. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9ddcb224594f620f.js +1 -0
  596. package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +1 -0
  597. package/.next/static/chunks/app/worktrees/[id]/page-e611d30e47989e5d.js +1 -0
  598. package/.next/static/chunks/{webpack-180bebdee221b6f4.js → webpack-3534d858912a6c92.js} +1 -1
  599. package/.next/static/css/3ac44cfc082d02ad.css +1 -0
  600. package/.next/static/smu4mnL7qMf8w38n9dQJE/_buildManifest.js +1 -0
  601. package/.next/trace +12 -12
  602. package/.next/types/app/api/push/escalation/route.ts +347 -0
  603. package/.next/types/routes.d.ts +2 -1
  604. package/.next/types/validator.ts +9 -0
  605. package/dist/cli/commands/capture.d.ts.map +1 -1
  606. package/dist/cli/commands/capture.js +6 -0
  607. package/dist/cli/commands/instances.d.ts.map +1 -1
  608. package/dist/cli/commands/instances.js +19 -1
  609. package/dist/cli/commands/task.d.ts.map +1 -1
  610. package/dist/cli/commands/task.js +6 -0
  611. package/dist/cli/commands/verify.js +6 -1
  612. package/dist/cli/types/api-responses.d.ts +46 -0
  613. package/dist/cli/types/api-responses.d.ts.map +1 -1
  614. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  615. package/dist/cli/utils/verify-runner.js +17 -1
  616. package/dist/server/locales/en/notifications.json +20 -1
  617. package/dist/server/locales/ja/notifications.json +20 -1
  618. package/dist/server/server.js +23 -0
  619. package/dist/server/src/config/log-config.js +10 -1
  620. package/dist/server/src/config/safe-directory.js +103 -0
  621. package/dist/server/src/config/system-directories.js +74 -9
  622. package/dist/server/src/lib/cli-tools/antigravity.js +19 -2
  623. package/dist/server/src/lib/cli-tools/codex.js +95 -1
  624. package/dist/server/src/lib/cli-tools/copilot.js +30 -1
  625. package/dist/server/src/lib/cli-tools/gemini.js +28 -2
  626. package/dist/server/src/lib/cli-tools/opencode.js +51 -2
  627. package/dist/server/src/lib/db/db.js +2 -1
  628. package/dist/server/src/lib/db/migrations/index.js +2 -0
  629. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  630. package/dist/server/src/lib/db/migrations/v56-gate-result-source.js +58 -0
  631. package/dist/server/src/lib/db/verification-db.js +26 -6
  632. package/dist/server/src/lib/detection/model-info-extractor.js +384 -0
  633. package/dist/server/src/lib/git/git-default-branch.js +59 -0
  634. package/dist/server/src/lib/hooks/agent-event-service.js +205 -0
  635. package/dist/server/src/lib/hooks/agent-event-types.js +7 -86
  636. package/dist/server/src/lib/hooks/hook-settings-generator.js +26 -11
  637. package/dist/server/src/lib/hooks/permission-decision-service.js +269 -0
  638. package/dist/server/src/lib/hooks/sources/abstain.js +78 -0
  639. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +372 -0
  640. package/dist/server/src/lib/hooks/sources/antigravity/source.js +229 -0
  641. package/dist/server/src/lib/hooks/sources/antigravity/tool-id.js +16 -0
  642. package/dist/server/src/lib/hooks/sources/claude/source.js +150 -0
  643. package/dist/server/src/lib/hooks/sources/claude/tool-id.js +18 -0
  644. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +465 -0
  645. package/dist/server/src/lib/hooks/sources/codex/source.js +143 -0
  646. package/dist/server/src/lib/hooks/sources/codex/tool-id.js +15 -0
  647. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +473 -0
  648. package/dist/server/src/lib/hooks/sources/copilot/source.js +210 -0
  649. package/dist/server/src/lib/hooks/sources/copilot/tool-id.js +15 -0
  650. package/dist/server/src/lib/hooks/sources/define-source.js +177 -0
  651. package/dist/server/src/lib/hooks/sources/event-mapper.js +177 -0
  652. package/dist/server/src/lib/hooks/sources/gemini/event-vocabulary.js +102 -0
  653. package/dist/server/src/lib/hooks/sources/gemini/settings-generator.js +315 -0
  654. package/dist/server/src/lib/hooks/sources/gemini/shared-config-tree.js +103 -0
  655. package/dist/server/src/lib/hooks/sources/gemini/source.js +151 -0
  656. package/dist/server/src/lib/hooks/sources/gemini/tool-id.js +17 -0
  657. package/dist/server/src/lib/hooks/sources/hook-event-vocabulary.js +111 -0
  658. package/dist/server/src/lib/hooks/sources/index.js +62 -0
  659. package/dist/server/src/lib/hooks/sources/legacy-relay.js +84 -0
  660. package/dist/server/src/lib/hooks/sources/opencode/client.js +299 -0
  661. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +267 -0
  662. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +176 -0
  663. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +189 -0
  664. package/dist/server/src/lib/hooks/sources/opencode/ports.js +295 -0
  665. package/dist/server/src/lib/hooks/sources/opencode/runtime.js +159 -0
  666. package/dist/server/src/lib/hooks/sources/opencode/source.js +253 -0
  667. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +422 -0
  668. package/dist/server/src/lib/hooks/sources/opencode/tool-id.js +14 -0
  669. package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +193 -0
  670. package/dist/server/src/lib/hooks/sources/pending-decisions.js +127 -0
  671. package/dist/server/src/lib/hooks/sources/registry.js +111 -0
  672. package/dist/server/src/lib/hooks/sources/types.js +46 -0
  673. package/dist/server/src/lib/polling/response-checker.js +47 -0
  674. package/dist/server/src/lib/push/escalation-settings.js +114 -0
  675. package/dist/server/src/lib/push/index.js +21 -1
  676. package/dist/server/src/lib/push/notification-dedup.js +35 -0
  677. package/dist/server/src/lib/push/push-sender.js +66 -7
  678. package/dist/server/src/lib/push/waiting-push-notifier.js +231 -0
  679. package/dist/server/src/lib/realtime/waiting-broadcast.js +93 -0
  680. package/dist/server/src/lib/session/agent-event-state.js +260 -0
  681. package/dist/server/src/lib/session/agent-session-lifecycle.js +82 -0
  682. package/dist/server/src/lib/session/claude-session.js +10 -3
  683. package/dist/server/src/lib/session/current-output-builder.js +24 -0
  684. package/dist/server/src/lib/session/next-action-helper.js +93 -0
  685. package/dist/server/src/lib/session/prompt-waiting-composition.js +38 -0
  686. package/dist/server/src/lib/session/waiting-episode-state.js +136 -0
  687. package/dist/server/src/lib/session/waiting-kind.js +59 -0
  688. package/dist/server/src/lib/tasks/contract-message.js +218 -0
  689. package/dist/server/src/lib/tasks/contract-parser.js +58 -12
  690. package/dist/server/src/lib/verification/env-clean-gate.js +320 -0
  691. package/dist/server/src/lib/verification/env-snapshot.js +474 -0
  692. package/dist/server/src/lib/verification/gate-runner.js +844 -0
  693. package/dist/server/src/lib/verification/scope-gate.js +402 -0
  694. package/dist/server/src/lib/verification/verify-config.js +314 -0
  695. package/dist/server/src/lib/ws-server.js +9 -0
  696. package/dist/server/src/types/sidebar.js +68 -0
  697. package/package.json +1 -1
  698. package/scripts/hooks/cmate-agent-event.sh +73 -3
  699. package/.next/server/chunks/6283.js +0 -1
  700. package/.next/server/chunks/646.js +0 -21
  701. package/.next/server/chunks/8856.js +0 -4
  702. package/.next/static/XpKfn5x6H-mtTaXI9yNmb/_buildManifest.js +0 -1
  703. package/.next/static/chunks/4560-0917ae2e6a0e5400.js +0 -1
  704. package/.next/static/chunks/6488-53a3e1d78e4fe8f7.js +0 -1
  705. package/.next/static/chunks/7229.edb331fb9fbafa27.js +0 -1
  706. package/.next/static/chunks/app/api/assistant/messages/route-973ec48531555712.js +0 -1
  707. package/.next/static/chunks/app/api/assistant/session/route-973ec48531555712.js +0 -1
  708. package/.next/static/chunks/app/api/assistant/start/route-973ec48531555712.js +0 -1
  709. package/.next/static/chunks/app/api/assistant/terminal/route-973ec48531555712.js +0 -1
  710. package/.next/static/chunks/app/api/assistant/tools/route-973ec48531555712.js +0 -1
  711. package/.next/static/chunks/app/api/auth/login/route-973ec48531555712.js +0 -1
  712. package/.next/static/chunks/app/api/auth/logout/route-973ec48531555712.js +0 -1
  713. package/.next/static/chunks/app/api/auth/status/route-973ec48531555712.js +0 -1
  714. package/.next/static/chunks/app/api/daily-summary/route-973ec48531555712.js +0 -1
  715. package/.next/static/chunks/app/api/daily-summary/status/route-973ec48531555712.js +0 -1
  716. package/.next/static/chunks/app/api/external-apps/[id]/health/route-973ec48531555712.js +0 -1
  717. package/.next/static/chunks/app/api/external-apps/[id]/route-973ec48531555712.js +0 -1
  718. package/.next/static/chunks/app/api/external-apps/route-973ec48531555712.js +0 -1
  719. package/.next/static/chunks/app/api/fs/browse/route-973ec48531555712.js +0 -1
  720. package/.next/static/chunks/app/api/fs/recent-paths/route-973ec48531555712.js +0 -1
  721. package/.next/static/chunks/app/api/hooks/agent-event/route-973ec48531555712.js +0 -1
  722. package/.next/static/chunks/app/api/hooks/claude-done/route-973ec48531555712.js +0 -1
  723. package/.next/static/chunks/app/api/hooks/permission-request/route-973ec48531555712.js +0 -1
  724. package/.next/static/chunks/app/api/metrics/vibe/route-973ec48531555712.js +0 -1
  725. package/.next/static/chunks/app/api/ollama/models/route-973ec48531555712.js +0 -1
  726. package/.next/static/chunks/app/api/push/subscriptions/route-973ec48531555712.js +0 -1
  727. package/.next/static/chunks/app/api/push/vapid/route-973ec48531555712.js +0 -1
  728. package/.next/static/chunks/app/api/repositories/[id]/route-973ec48531555712.js +0 -1
  729. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
  730. package/.next/static/chunks/app/api/repositories/[id]/todos/route-973ec48531555712.js +0 -1
  731. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-973ec48531555712.js +0 -1
  732. package/.next/static/chunks/app/api/repositories/clone/route-973ec48531555712.js +0 -1
  733. package/.next/static/chunks/app/api/repositories/excluded/route-973ec48531555712.js +0 -1
  734. package/.next/static/chunks/app/api/repositories/restore/route-973ec48531555712.js +0 -1
  735. package/.next/static/chunks/app/api/repositories/route-973ec48531555712.js +0 -1
  736. package/.next/static/chunks/app/api/repositories/scan/route-973ec48531555712.js +0 -1
  737. package/.next/static/chunks/app/api/repositories/sync/route-973ec48531555712.js +0 -1
  738. package/.next/static/chunks/app/api/repositories/validate-path/route-973ec48531555712.js +0 -1
  739. package/.next/static/chunks/app/api/sidebar/group-order/route-973ec48531555712.js +0 -1
  740. package/.next/static/chunks/app/api/skills/[id]/route-973ec48531555712.js +0 -1
  741. package/.next/static/chunks/app/api/skills/installations/route-973ec48531555712.js +0 -1
  742. package/.next/static/chunks/app/api/skills/operations/route-973ec48531555712.js +0 -1
  743. package/.next/static/chunks/app/api/skills/reindex/route-973ec48531555712.js +0 -1
  744. package/.next/static/chunks/app/api/skills/route-973ec48531555712.js +0 -1
  745. package/.next/static/chunks/app/api/slash-commands/route-973ec48531555712.js +0 -1
  746. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-973ec48531555712.js +0 -1
  747. package/.next/static/chunks/app/api/tasks/[taskId]/route-973ec48531555712.js +0 -1
  748. package/.next/static/chunks/app/api/templates/[id]/route-973ec48531555712.js +0 -1
  749. package/.next/static/chunks/app/api/templates/route-973ec48531555712.js +0 -1
  750. package/.next/static/chunks/app/api/todos/route-973ec48531555712.js +0 -1
  751. package/.next/static/chunks/app/api/verification/runs/[runId]/route-973ec48531555712.js +0 -1
  752. package/.next/static/chunks/app/api/verification/runs/route-973ec48531555712.js +0 -1
  753. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-973ec48531555712.js +0 -1
  754. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-973ec48531555712.js +0 -1
  755. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-973ec48531555712.js +0 -1
  756. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-973ec48531555712.js +0 -1
  757. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-973ec48531555712.js +0 -1
  758. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-973ec48531555712.js +0 -1
  759. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-973ec48531555712.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-973ec48531555712.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-973ec48531555712.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-973ec48531555712.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-973ec48531555712.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-973ec48531555712.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-973ec48531555712.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-973ec48531555712.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-973ec48531555712.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-973ec48531555712.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-973ec48531555712.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-973ec48531555712.js +0 -1
  771. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-973ec48531555712.js +0 -1
  772. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-973ec48531555712.js +0 -1
  773. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-973ec48531555712.js +0 -1
  774. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-973ec48531555712.js +0 -1
  775. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-973ec48531555712.js +0 -1
  776. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-973ec48531555712.js +0 -1
  777. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-973ec48531555712.js +0 -1
  778. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-973ec48531555712.js +0 -1
  779. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-973ec48531555712.js +0 -1
  780. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-973ec48531555712.js +0 -1
  781. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-973ec48531555712.js +0 -1
  782. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-973ec48531555712.js +0 -1
  783. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-973ec48531555712.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-973ec48531555712.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-973ec48531555712.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-973ec48531555712.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-973ec48531555712.js +0 -1
  788. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-973ec48531555712.js +0 -1
  789. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-973ec48531555712.js +0 -1
  790. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-973ec48531555712.js +0 -1
  791. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-973ec48531555712.js +0 -1
  792. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-973ec48531555712.js +0 -1
  793. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-973ec48531555712.js +0 -1
  794. package/.next/static/chunks/app/api/worktrees/[id]/route-973ec48531555712.js +0 -1
  795. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-973ec48531555712.js +0 -1
  796. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-973ec48531555712.js +0 -1
  797. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-973ec48531555712.js +0 -1
  798. package/.next/static/chunks/app/api/worktrees/[id]/search/route-973ec48531555712.js +0 -1
  799. package/.next/static/chunks/app/api/worktrees/[id]/send/route-973ec48531555712.js +0 -1
  800. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-973ec48531555712.js +0 -1
  801. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-973ec48531555712.js +0 -1
  802. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-973ec48531555712.js +0 -1
  803. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-973ec48531555712.js +0 -1
  804. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-973ec48531555712.js +0 -1
  805. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-973ec48531555712.js +0 -1
  806. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-973ec48531555712.js +0 -1
  807. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-973ec48531555712.js +0 -1
  808. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-973ec48531555712.js +0 -1
  809. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-973ec48531555712.js +0 -1
  810. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-973ec48531555712.js +0 -1
  811. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-973ec48531555712.js +0 -1
  812. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-973ec48531555712.js +0 -1
  813. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-973ec48531555712.js +0 -1
  814. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-973ec48531555712.js +0 -1
  815. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
  816. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-973ec48531555712.js +0 -1
  817. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-973ec48531555712.js +0 -1
  818. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-973ec48531555712.js +0 -1
  819. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-973ec48531555712.js +0 -1
  820. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-973ec48531555712.js +0 -1
  821. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-973ec48531555712.js +0 -1
  822. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-973ec48531555712.js +0 -1
  823. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-973ec48531555712.js +0 -1
  824. package/.next/static/chunks/app/api/worktrees/route-973ec48531555712.js +0 -1
  825. package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +0 -1
  826. package/.next/static/chunks/app/layout-86574192bd3c0e6b.js +0 -1
  827. package/.next/static/chunks/app/manifest.webmanifest/route-973ec48531555712.js +0 -1
  828. package/.next/static/chunks/app/more/page-1619018cac999bbc.js +0 -1
  829. package/.next/static/chunks/app/page-a34d26812f085b6c.js +0 -1
  830. package/.next/static/chunks/app/proxy/[...path]/route-973ec48531555712.js +0 -1
  831. package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +0 -1
  832. package/.next/static/chunks/app/review/page-b559bfb11c46931b.js +0 -1
  833. package/.next/static/chunks/app/sessions/page-3fa7e767d0ab3889.js +0 -1
  834. package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +0 -1
  835. package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +0 -1
  836. package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +0 -1
  837. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-6041d3c3db326317.js +0 -1
  838. package/.next/static/chunks/app/worktrees/[id]/layout-973ec48531555712.js +0 -1
  839. package/.next/static/chunks/app/worktrees/[id]/page-6dc0b8c4e808ea3e.js +0 -1
  840. package/.next/static/css/d3453a6876553d32.css +0 -1
  841. /package/.next/static/{XpKfn5x6H-mtTaXI9yNmb → smu4mnL7qMf8w38n9dQJE}/_ssgManifest.js +0 -0
@@ -0,0 +1,844 @@
1
+ "use strict";
2
+ /**
3
+ * Verification gate execution engine (Issue #1543, Phase 1-3).
4
+ *
5
+ * Runs the gates declared in `.commandmate/verify.yaml` inside a worktree and
6
+ * records every verdict in `verification_runs` / `verification_gate_results`,
7
+ * so "the agent said it was done" and "the work passes the repository's own
8
+ * checks" stop being the same claim.
9
+ *
10
+ * Promoted from the Phase 0 shell runner
11
+ * (`.claude/skills/cmate-verify/scripts/verify-run.sh`), which established the
12
+ * two disciplines this module exists to preserve:
13
+ *
14
+ * 1. The verdict is the process exit code, read directly. Nothing is piped:
15
+ * `cmd | grep` reports grep's status, so a failing gate reads as a pass.
16
+ * 2. A failing gate does not end the run. All gates execute so one report
17
+ * lists every problem instead of revealing them one round-trip at a time.
18
+ *
19
+ * Server-only: spawns processes and reads the filesystem.
20
+ *
21
+ * @module lib/verification/gate-runner
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.VerificationConflictError = exports.MAX_CONCURRENT_VERIFICATIONS = exports.CONFIG_GATE_ID = exports.ENV_CLEAN_GATE_ID = exports.SCOPE_GATE_ID = exports.WORK_EVIDENCE_GATE_ID = void 0;
25
+ exports.waitForVerification = waitForVerification;
26
+ exports.startVerification = startVerification;
27
+ const child_process_1 = require("child_process");
28
+ const fs_1 = require("fs");
29
+ const db_instance_1 = require("../../lib/db/db-instance");
30
+ const db_1 = require("../../lib/db");
31
+ // Past the barrel, as `agent-event-service` does for `getActiveTaskForInstance`:
32
+ // this selector exists for the verification runner alone and re-exporting it
33
+ // would invite the callers that must keep using `getActiveTask` (Auto-Yes,
34
+ // prompt events) to reach for the wider set by accident.
35
+ const tasks_db_1 = require("../../lib/db/tasks-db");
36
+ const git_default_branch_1 = require("../../lib/git/git-default-branch");
37
+ const logger_1 = require("../../lib/logger");
38
+ const contract_message_1 = require("../../lib/tasks/contract-message");
39
+ const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
40
+ const env_clean_gate_1 = require("./env-clean-gate");
41
+ const env_snapshot_1 = require("./env-snapshot");
42
+ const scope_gate_1 = require("./scope-gate");
43
+ const verify_config_1 = require("./verify-config");
44
+ Object.defineProperty(exports, "ENV_CLEAN_GATE_ID", { enumerable: true, get: function () { return verify_config_1.ENV_CLEAN_GATE_ID; } });
45
+ Object.defineProperty(exports, "SCOPE_GATE_ID", { enumerable: true, get: function () { return verify_config_1.SCOPE_GATE_ID; } });
46
+ Object.defineProperty(exports, "WORK_EVIDENCE_GATE_ID", { enumerable: true, get: function () { return verify_config_1.WORK_EVIDENCE_GATE_ID; } });
47
+ const logger = (0, logger_1.createLogger)('lib/verification/gate-runner');
48
+ /**
49
+ * Pseudo-gate used to carry a config-load failure into the run record.
50
+ *
51
+ * `verification_runs` has no message column, so without this row a run that
52
+ * died on a missing or malformed verify.yaml would be an `error` status with
53
+ * no stated cause — the caller would have to guess. It is only ever written on
54
+ * the path where zero real gates run, so it cannot collide with a user gate.
55
+ */
56
+ exports.CONFIG_GATE_ID = 'config';
57
+ /**
58
+ * What the built-in gates record in `command`.
59
+ *
60
+ * Neither runs a shell command, but the column is what a reader consults to see
61
+ * what a gate did, so it names the plumbing instead of being left null.
62
+ */
63
+ const WORK_EVIDENCE_GATE_COMMAND = 'git merge-base / rev-list / status --porcelain (excluding contract files)';
64
+ const SCOPE_GATE_COMMAND = 'git diff --name-only / status --porcelain × contract scope';
65
+ const ENV_CLEAN_GATE_COMMAND = 'lsof -iTCP -sTCP:LISTEN / tmux list-sessions / $HOME / ~/.commandmate × task-start snapshot';
66
+ /**
67
+ * Concurrent runs allowed process-wide.
68
+ *
69
+ * Gates are whole test suites and builds; letting every worktree start one at
70
+ * once turns a verification request into a fork bomb on a developer laptop.
71
+ * Excess runs queue rather than fail: the run row already exists and its
72
+ * caller has the id, so a queued run is honest about what will happen.
73
+ */
74
+ exports.MAX_CONCURRENT_VERIFICATIONS = 2;
75
+ /** Grace period between SIGTERM and SIGKILL for a gate that overran. */
76
+ const SIGKILL_GRACE_MS = 5000;
77
+ /** A run is already in flight for this worktree. Surfaces as HTTP 409. */
78
+ class VerificationConflictError extends Error {
79
+ worktreeId;
80
+ runningRunId;
81
+ constructor(worktreeId, runningRunId) {
82
+ super(`Verification run ${runningRunId} is already running for worktree '${worktreeId}'`);
83
+ this.name = 'VerificationConflictError';
84
+ this.worktreeId = worktreeId;
85
+ this.runningRunId = runningRunId;
86
+ }
87
+ }
88
+ exports.VerificationConflictError = VerificationConflictError;
89
+ /**
90
+ * A gate that did not execute (Issue #1625).
91
+ *
92
+ * `started_at` is NOT NULL in the schema and a null `finished_at` already means
93
+ * "still open", so there is no way to spell "no interval" — a zero-length
94
+ * window at the instant the decision was made is recorded instead. It is also
95
+ * the truth: nothing ran, and `duration_ms` has always said 0 for these rows.
96
+ */
97
+ function notRun(logTail) {
98
+ return {
99
+ status: 'skipped',
100
+ exitCode: null,
101
+ startedAt: Date.now(),
102
+ durationMs: 0,
103
+ logTail,
104
+ };
105
+ }
106
+ // =============================================================================
107
+ // Concurrency
108
+ // =============================================================================
109
+ let activeVerifications = 0;
110
+ const slotWaiters = [];
111
+ function acquireSlot() {
112
+ if (activeVerifications < exports.MAX_CONCURRENT_VERIFICATIONS) {
113
+ activeVerifications += 1;
114
+ return Promise.resolve();
115
+ }
116
+ return new Promise((resolve) => {
117
+ slotWaiters.push(resolve);
118
+ });
119
+ }
120
+ function releaseSlot() {
121
+ const next = slotWaiters.shift();
122
+ if (next) {
123
+ // Hand the slot straight over instead of decrementing and re-incrementing:
124
+ // a gap between the two would let a third run slip past the limit.
125
+ next();
126
+ return;
127
+ }
128
+ activeVerifications -= 1;
129
+ }
130
+ /**
131
+ * In-flight runs, so callers (tests, and the CLI in Phase 1-4) can await a run
132
+ * that {@link startVerification} deliberately did not wait for.
133
+ */
134
+ const inFlight = new Map();
135
+ /**
136
+ * Resolve when `runId` finishes, with its final status.
137
+ *
138
+ * Returns null when the run is not in flight — either it never started or it
139
+ * already finished, in which case the database holds the answer.
140
+ */
141
+ function waitForVerification(runId) {
142
+ return inFlight.get(runId) ?? Promise.resolve(null);
143
+ }
144
+ // =============================================================================
145
+ // Command execution
146
+ // =============================================================================
147
+ /**
148
+ * Keep exactly the last `maxBytes` of output.
149
+ *
150
+ * A failing suite's useful part is its tail (the summary), and log_tail is
151
+ * stored per gate, so an unbounded buffer would put a full `npm test` log in
152
+ * SQLite for every run.
153
+ *
154
+ * Evicting whole chunks is not enough: a stream that writes 4KB and then a
155
+ * newline would leave the newline as the entire "tail". The head chunk is
156
+ * trimmed in place instead, so what is retained never depends on where the
157
+ * operating system happened to split the writes.
158
+ */
159
+ class TailBuffer {
160
+ maxBytes;
161
+ chunks = [];
162
+ size = 0;
163
+ constructor(maxBytes) {
164
+ this.maxBytes = maxBytes;
165
+ }
166
+ append(chunk) {
167
+ if (this.maxBytes <= 0 || chunk.length === 0)
168
+ return;
169
+ this.chunks.push(chunk);
170
+ this.size += chunk.length;
171
+ // Drop head chunks that are entirely outside the window...
172
+ while (this.chunks.length > 0 && this.size - this.chunks[0].length >= this.maxBytes) {
173
+ this.size -= this.chunks.shift().length;
174
+ }
175
+ // ...then trim the one chunk that straddles its edge.
176
+ if (this.size > this.maxBytes) {
177
+ const excess = this.size - this.maxBytes;
178
+ this.chunks[0] = this.chunks[0].subarray(excess);
179
+ this.size -= excess;
180
+ }
181
+ }
182
+ toString() {
183
+ return this.chunks.length === 0 ? '' : Buffer.concat(this.chunks).toString('utf8');
184
+ }
185
+ }
186
+ /**
187
+ * Run one shell command and report its exit code.
188
+ *
189
+ * `shell: true` so a gate can be written the way a developer would type it
190
+ * (`npm run lint`), and `detached: true` so the timeout can signal the whole
191
+ * process group — killing only the shell leaves the `npm`/`vitest` grandchildren
192
+ * running and holding the worktree.
193
+ */
194
+ function runCommand(command, cwd, timeoutSec, maxLogTailBytes) {
195
+ return new Promise((resolve) => {
196
+ const startedAt = Date.now();
197
+ const tail = new TailBuffer(maxLogTailBytes);
198
+ let settled = false;
199
+ let timedOut = false;
200
+ let graceTimer;
201
+ const child = (0, child_process_1.spawn)(command, {
202
+ shell: true,
203
+ cwd,
204
+ // CI=true matches how the same commands run in the pipeline; vitest picks
205
+ // a different fileParallelism otherwise, and a gate that passes here but
206
+ // fails in CI is worse than no gate.
207
+ env: { ...process.env, CI: 'true' },
208
+ detached: true,
209
+ stdio: ['ignore', 'pipe', 'pipe'],
210
+ });
211
+ // stdout and stderr share one buffer: gate output is read as a transcript,
212
+ // and interleaving is what makes an error attributable to the step above it.
213
+ child.stdout?.on('data', (chunk) => tail.append(chunk));
214
+ child.stderr?.on('data', (chunk) => tail.append(chunk));
215
+ const signalGroup = (signal) => {
216
+ if (child.pid === undefined)
217
+ return;
218
+ try {
219
+ process.kill(-child.pid, signal);
220
+ }
221
+ catch {
222
+ // The group is already gone, or this platform refused the negative pid.
223
+ try {
224
+ child.kill(signal);
225
+ }
226
+ catch {
227
+ // Nothing left to signal.
228
+ }
229
+ }
230
+ };
231
+ // Only ever called from an event handler, so the killTimer binding below is
232
+ // initialised by the time this runs.
233
+ const finish = (outcome) => {
234
+ if (settled)
235
+ return;
236
+ settled = true;
237
+ clearTimeout(killTimer);
238
+ if (graceTimer)
239
+ clearTimeout(graceTimer);
240
+ resolve({ ...outcome, startedAt, durationMs: Date.now() - startedAt });
241
+ };
242
+ const killTimer = setTimeout(() => {
243
+ timedOut = true;
244
+ signalGroup('SIGTERM');
245
+ graceTimer = setTimeout(() => signalGroup('SIGKILL'), SIGKILL_GRACE_MS);
246
+ graceTimer.unref?.();
247
+ }, timeoutSec * 1000);
248
+ killTimer.unref?.();
249
+ child.on('error', (error) => {
250
+ finish({
251
+ status: 'error',
252
+ exitCode: null,
253
+ logTail: `${tail.toString()}\n[gate could not be spawned: ${error.message}]`.trim(),
254
+ });
255
+ });
256
+ child.on('close', (code, signal) => {
257
+ if (timedOut) {
258
+ finish({
259
+ status: 'timeout',
260
+ // A timed-out gate has no verdict of its own; recording the signal's
261
+ // exit code would look like the command decided something.
262
+ exitCode: null,
263
+ logTail: `${tail.toString()}\n[gate exceeded ${timeoutSec}s and was terminated (${signal ?? 'exited'})]`.trim(),
264
+ });
265
+ return;
266
+ }
267
+ finish({
268
+ status: code === 0 ? 'passed' : 'failed',
269
+ exitCode: code,
270
+ logTail: tail.toString() || null,
271
+ });
272
+ });
273
+ });
274
+ }
275
+ /** Run a git plumbing command. No shell: every argument here is code-supplied. */
276
+ function runGit(args, cwd) {
277
+ return new Promise((resolve) => {
278
+ let stdout = '';
279
+ const child = (0, child_process_1.spawn)('git', args, { cwd, stdio: ['ignore', 'pipe', 'ignore'] });
280
+ child.stdout?.on('data', (chunk) => {
281
+ stdout += chunk.toString('utf8');
282
+ });
283
+ child.on('error', () => resolve({ code: null, stdout: '' }));
284
+ child.on('close', (code) => resolve({ code, stdout }));
285
+ });
286
+ }
287
+ // =============================================================================
288
+ // Built-in work-evidence gate
289
+ // =============================================================================
290
+ /**
291
+ * Decide whether the worktree contains work at all.
292
+ *
293
+ * Commits ahead of `baseRef` or a dirty tree both count. Neither means the
294
+ * agent reported completion without touching anything, which the run records
295
+ * as `not_started` rather than letting empty work collect a row of passing
296
+ * gates — the precise failure `verify-completion.sh` was written to catch.
297
+ *
298
+ * Contract files are evidence of the *orchestrator*, not of the agent, so
299
+ * neither side counts them (see {@link CONTRACT_DIR_PREFIX}).
300
+ */
301
+ async function evaluateWorkEvidence(worktreePath, baseRef, requireCommit) {
302
+ const startedAt = Date.now();
303
+ const done = (status, logTail, exitCode) => ({
304
+ status,
305
+ exitCode,
306
+ startedAt,
307
+ durationMs: Date.now() - startedAt,
308
+ logTail,
309
+ });
310
+ if (!baseRef) {
311
+ return done('error', 'work-evidence: no base ref. Set options.baseRef in ' +
312
+ `${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}; origin/HEAD did not resolve a default branch.`, null);
313
+ }
314
+ const mergeBase = await runGit(['merge-base', baseRef, 'HEAD'], worktreePath);
315
+ if (mergeBase.code !== 0 || mergeBase.stdout.trim() === '') {
316
+ return done('error', `work-evidence: 'git merge-base ${baseRef} HEAD' failed; base ref is unreachable from this worktree.`, null);
317
+ }
318
+ const base = mergeBase.stdout.trim();
319
+ // `:(top)` is an explicit "everything from the repository root" so the
320
+ // pathspec is not exclusions alone, and it anchors both patterns at the root
321
+ // rather than at cwd. A setup commit that only carries the contract must not
322
+ // read as a commit's worth of work.
323
+ const revList = await runGit([
324
+ 'rev-list',
325
+ '--count',
326
+ `${base}..HEAD`,
327
+ '--',
328
+ ':(top)',
329
+ `:(exclude,top)${scope_gate_1.CONTRACT_DIR_PREFIX}`,
330
+ ], worktreePath);
331
+ if (revList.code !== 0) {
332
+ return done('error', `work-evidence: 'git rev-list --count ${base}..HEAD' failed.`, null);
333
+ }
334
+ const commitCount = Number.parseInt(revList.stdout.trim(), 10);
335
+ // -z -uall for the same reasons scope-gate uses them: the human format
336
+ // C-quotes paths with spaces and joins renames with ` -> `, and the default
337
+ // untracked mode collapses a fresh `.commandmate/tasks/` to one directory
338
+ // entry — all three make a per-path exclusion judge something that is not a
339
+ // path. An entry counts as work when any of its paths is not a contract file,
340
+ // so renaming a contract into real work is still a change.
341
+ const porcelain = await runGit(['status', '--porcelain', '-z', '--untracked-files=all'], worktreePath);
342
+ if (porcelain.code !== 0) {
343
+ return done('error', "work-evidence: 'git status --porcelain' failed.", null);
344
+ }
345
+ const uncommittedCount = (0, scope_gate_1.parsePorcelainEntries)(porcelain.stdout).filter((paths) => paths.some((path) => !(0, scope_gate_1.isContractPath)(path))).length;
346
+ const summary = `work-evidence: baseRef=${baseRef} commits=${commitCount} uncommitted=${uncommittedCount}` +
347
+ (requireCommit.required ? ' requireCommit=true' : '') +
348
+ ' (contract files excluded)';
349
+ if (!Number.isFinite(commitCount) || (commitCount === 0 && uncommittedCount === 0)) {
350
+ return done('failed', `${summary}\nNo commits and no uncommitted changes: nothing to verify.`, 1);
351
+ }
352
+ // Issue #1628 (D-4): `commits=0 uncommitted=1` passing is what let a task
353
+ // contract that says "未 commit の作業は未完了とみなされる" still end in
354
+ // `RESULT passed` over work that was never committed. Opt-in, and off by
355
+ // default so the gate keeps answering "is there work here" for everyone else.
356
+ // Two declarations can switch it on — `options.requireCommit` per repository
357
+ // and `success.requireCommit` per delegation (#1642) — so the reason names
358
+ // whichever ones actually did.
359
+ if (requireCommit.required && commitCount === 0) {
360
+ return done('failed', `${summary}\n${requireCommit.sources.join(' and ')} requires a commit: ` +
361
+ 'uncommitted changes are not work evidence, commit them.', 1);
362
+ }
363
+ return done('passed', summary, 0);
364
+ }
365
+ // =============================================================================
366
+ // Run orchestration
367
+ // =============================================================================
368
+ function sameRealPath(a, b) {
369
+ try {
370
+ return (0, fs_1.realpathSync)(a) === (0, fs_1.realpathSync)(b);
371
+ }
372
+ catch {
373
+ // An unresolvable path cannot be proven to be the primary checkout, and the
374
+ // gates would fail on it anyway.
375
+ return false;
376
+ }
377
+ }
378
+ /**
379
+ * Resolve the ref work-evidence diffs against.
380
+ *
381
+ * An explicit `options.baseRef` wins. Otherwise origin/HEAD names the default
382
+ * branch, and the remote-tracking ref is used rather than the local branch:
383
+ * a linked worktree frequently has no local checkout of `main`.
384
+ */
385
+ async function resolveBaseRef(config, worktreePath) {
386
+ if (config.options.baseRef)
387
+ return config.options.baseRef;
388
+ const defaultBranch = await (0, git_default_branch_1.resolveDefaultBranchName)(worktreePath);
389
+ return defaultBranch ? `origin/${defaultBranch}` : null;
390
+ }
391
+ /**
392
+ * Every gate available to this run, in execution order (Issue #1791).
393
+ *
394
+ * The repository's own declarations first, then the ones this delegation's
395
+ * contract carried. Repository-wide criteria are what an Issue gate is judged
396
+ * *against*, so running the shared ones first is what makes a report readable
397
+ * top to bottom: "the repository's definition of passing held, and then the
398
+ * Issue-specific check did too".
399
+ *
400
+ * A contract gate whose id collides with a verify.yaml gate is refused rather
401
+ * than merged. `validateContractAgainstVerifyConfig` already rejects that at
402
+ * send, so reaching here means the contract was stored by an older build or
403
+ * written straight into the database — and running both would put two rows
404
+ * under one id in the report, which is precisely the ambiguity `source` exists
405
+ * to remove.
406
+ */
407
+ function declaredGates(config, contractGates) {
408
+ const fromConfig = config.gates.map((gate) => ({
409
+ ...gate,
410
+ source: 'verify.yaml',
411
+ }));
412
+ const configIds = new Set(fromConfig.map((gate) => gate.id));
413
+ const collisions = contractGates.filter((gate) => configIds.has(gate.id)).map((gate) => gate.id);
414
+ if (collisions.length > 0) {
415
+ return (`Contract gate id(s) ${collisions.join(', ')} are already declared in ` +
416
+ `${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}. A contract may add gates, never redefine the ` +
417
+ "repository's own.");
418
+ }
419
+ return [...fromConfig, ...contractGates.map((gate) => ({ ...gate, source: 'contract' }))];
420
+ }
421
+ /**
422
+ * Resolve `gateIds` against the declared gates.
423
+ *
424
+ * Returns a message instead of a selection when the request names a gate that
425
+ * does not exist, or selects nothing at all. Both would otherwise produce a run
426
+ * with zero gate results, which {@link aggregateRunStatus} would have to call
427
+ * `passed` — a green verdict from having checked nothing.
428
+ *
429
+ * @param declared verify.yaml's gates followed by the contract's (#1791); the
430
+ * selection preserves this order, never the order `gateIds` was typed in
431
+ * @param requireEnvClean whether a declaration switched env-clean on. It is
432
+ * ORed with an explicit request rather than replacing it, so `--gates
433
+ * env-clean` still works with the switch off (and honestly reports
434
+ * UNKNOWN, because no baseline was recorded), and a delegation that
435
+ * declared the requirement cannot lose it by naming a narrower gate list.
436
+ */
437
+ function selectGates(declared, gateIds, requireEnvClean) {
438
+ if (!gateIds) {
439
+ return {
440
+ runWorkEvidence: true,
441
+ scope: 'implicit',
442
+ runEnvClean: requireEnvClean,
443
+ gates: declared,
444
+ };
445
+ }
446
+ const known = new Set([
447
+ verify_config_1.WORK_EVIDENCE_GATE_ID,
448
+ verify_config_1.SCOPE_GATE_ID,
449
+ verify_config_1.ENV_CLEAN_GATE_ID,
450
+ ...declared.map((g) => g.id),
451
+ ]);
452
+ const unknown = gateIds.filter((id) => !known.has(id));
453
+ if (unknown.length > 0) {
454
+ return `Unknown gate id(s): ${unknown.join(', ')}. Declared gates: ${[...known].join(', ')}.`;
455
+ }
456
+ const requested = new Set(gateIds);
457
+ const selection = {
458
+ runWorkEvidence: requested.has(verify_config_1.WORK_EVIDENCE_GATE_ID),
459
+ scope: requested.has(verify_config_1.SCOPE_GATE_ID) ? 'explicit' : 'off',
460
+ runEnvClean: requested.has(verify_config_1.ENV_CLEAN_GATE_ID) || requireEnvClean,
461
+ gates: declared.filter((gate) => requested.has(gate.id)),
462
+ };
463
+ if (!selection.runWorkEvidence &&
464
+ selection.scope === 'off' &&
465
+ !selection.runEnvClean &&
466
+ selection.gates.length === 0) {
467
+ return 'gateIds selected no gates; a run with no gates has nothing to report.';
468
+ }
469
+ return selection;
470
+ }
471
+ /**
472
+ * Collapse gate verdicts into the run verdict.
473
+ *
474
+ * A `skipped` gate blocks `passed` on purpose. The primary-checkout guard skips
475
+ * exactly the gates that would have judged the work, so reporting `passed`
476
+ * would turn "we declined to check" into "we checked and it was fine" — the
477
+ * inversion `skipped` exists to prevent.
478
+ */
479
+ function aggregateRunStatus(gateStatuses) {
480
+ if (gateStatuses.some((s) => s === 'failed' || s === 'timeout' || s === 'error'))
481
+ return 'failed';
482
+ if (gateStatuses.some((s) => s === 'skipped'))
483
+ return 'error';
484
+ return 'passed';
485
+ }
486
+ async function executeRun(db, runId, worktreePath, config, selection, baseRef, task, detachedContract, envClean) {
487
+ const { maxLogTailBytes, skipInPrimaryCheckout } = config.options;
488
+ const { runWorkEvidence, gates } = selection;
489
+ // ORed with the repository-wide switch rather than replacing it (#1642): a
490
+ // delegation may tighten the rule, never relax one the repository declared.
491
+ const requireCommit = (0, contract_message_1.resolveRequireCommit)(task?.contract ?? null, config);
492
+ /**
493
+ * Close an open gate row with the interval its evaluator measured.
494
+ *
495
+ * `finishedAt` is derived from the same clock reading `durationMs` was
496
+ * measured against, so the stored pair is that measurement rather than a
497
+ * second, later reading (#1625).
498
+ */
499
+ const close = (rowId, outcome) => {
500
+ (0, db_1.finishGateResult)(db, rowId, {
501
+ status: outcome.status,
502
+ exitCode: outcome.exitCode,
503
+ durationMs: outcome.durationMs,
504
+ logTail: outcome.logTail,
505
+ executionWindow: {
506
+ startedAt: outcome.startedAt,
507
+ finishedAt: outcome.startedAt + outcome.durationMs,
508
+ },
509
+ });
510
+ return outcome;
511
+ };
512
+ /**
513
+ * Open the gate's row, run it, then close it.
514
+ *
515
+ * The row exists *before* the gate does anything, so a process that dies
516
+ * mid-gate leaves a `running` row naming what it died in — which is what
517
+ * {@link reconcileOrphanVerificationRuns} closes on the next start. Opening
518
+ * and closing back to back (what this used to do) left that loop with nothing
519
+ * to find, and an interrupted gate with no record at all.
520
+ */
521
+ const runGate = async (gateId, command, source, evaluate) => {
522
+ const row = (0, db_1.createGateResult)(db, runId, { gateId, command, source });
523
+ return close(row.id, await evaluate());
524
+ };
525
+ /**
526
+ * Record a gate that was never entered.
527
+ *
528
+ * Opened and closed on the spot: there is no execution to leave a `running`
529
+ * row around, and the row carries {@link notRun}'s zero-length window.
530
+ */
531
+ const recordNotRun = (gateId, command, source, reason) => {
532
+ const outcome = notRun(reason);
533
+ const row = (0, db_1.createGateResult)(db, runId, { gateId, command, source });
534
+ return close(row.id, outcome);
535
+ };
536
+ const statuses = [];
537
+ if (runWorkEvidence) {
538
+ const outcome = await runGate(verify_config_1.WORK_EVIDENCE_GATE_ID, WORK_EVIDENCE_GATE_COMMAND, 'builtin', () => evaluateWorkEvidence(worktreePath, baseRef, requireCommit));
539
+ if (outcome.status !== 'passed') {
540
+ // Nothing was produced, so every command gate below would be judging the
541
+ // base commit. Record them as skipped so the run shows what was not run.
542
+ const reason = `skipped: the ${verify_config_1.WORK_EVIDENCE_GATE_ID} gate did not pass.`;
543
+ if (selection.scope !== 'off') {
544
+ recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', reason);
545
+ }
546
+ if (selection.runEnvClean) {
547
+ recordNotRun(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, 'builtin', reason);
548
+ }
549
+ for (const gate of gates) {
550
+ recordNotRun(gate.id, gate.command, gate.source, reason);
551
+ }
552
+ return outcome.status === 'failed' ? 'not_started' : 'error';
553
+ }
554
+ statuses.push(outcome.status);
555
+ }
556
+ if (selection.scope !== 'off') {
557
+ // A detached contract is decided before the gate would run, so its row is
558
+ // recorded rather than executed.
559
+ const outcome = detachedContract
560
+ ? recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', (0, scope_gate_1.scopeSkipDetachedContract)(detachedContract.id, detachedContract.status))
561
+ : await runGate(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', () => (0, scope_gate_1.evaluateScope)(worktreePath, task?.contract.scope ?? null, task?.contract.success.requireScopeClean ?? false, baseRef, task?.contractPath ?? null));
562
+ // A skipped scope gate in the default selection is usually not a declined
563
+ // check: no contract declared a scope, so there was no assertion to test.
564
+ // Counting it would turn every contract-less run into `error` (see
565
+ // aggregateRunStatus). It *is* a declined check when the caller asked for
566
+ // scope by name, and when a contract exists that this run could not attach
567
+ // to — that second case is how a run reported `passed` while the scope it
568
+ // was supposed to judge went unexamined (#1620).
569
+ const declined = selection.scope === 'explicit' || detachedContract !== null;
570
+ if (outcome.status !== 'skipped' || declined) {
571
+ statuses.push(outcome.status);
572
+ }
573
+ }
574
+ if (selection.runEnvClean) {
575
+ // Measured before the command gates, not after: the pair of snapshots spans
576
+ // the agent's working window, and the gates below are the repository's own
577
+ // declared commands. A `test:e2e` gate that starts a server would otherwise
578
+ // be reported as the agent leaking one.
579
+ const outcome = await runGate(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, 'builtin', () => (0, env_clean_gate_1.evaluateEnvClean)({
580
+ worktreeId: envClean.worktreeId,
581
+ worktreePath,
582
+ taskId: envClean.taskId,
583
+ baseline: envClean.baseline,
584
+ sources: envClean.decision.sources,
585
+ }));
586
+ statuses.push(outcome.status);
587
+ }
588
+ const isPrimaryCheckout = skipInPrimaryCheckout && sameRealPath(worktreePath, process.cwd());
589
+ for (const gate of gates) {
590
+ if (isPrimaryCheckout) {
591
+ // The server process runs out of this directory. A `build` here replaces
592
+ // the chunks the running app is serving mid-flight and breaks the live UI
593
+ // — observed twice before this guard existed.
594
+ statuses.push(recordNotRun(gate.id, gate.command, gate.source, 'skipped: worktreePath is the server process working directory and ' +
595
+ 'options.skipInPrimaryCheckout is true.').status);
596
+ continue;
597
+ }
598
+ const outcome = await runGate(gate.id, gate.command, gate.source, () => runCommand(gate.command, worktreePath, gate.timeoutSec, maxLogTailBytes));
599
+ statuses.push(outcome.status);
600
+ }
601
+ return aggregateRunStatus(statuses);
602
+ }
603
+ // =============================================================================
604
+ // Task contracts (#1545)
605
+ // =============================================================================
606
+ /**
607
+ * Translate a run verdict into the event that closes the task.
608
+ *
609
+ * `error` maps to `verify_failed`: no verdict was reached, and a task that could
610
+ * not be verified is not a task that passed. Leaving it in `verifying` forever
611
+ * would be a worse lie than calling it failed — the reason is recorded in the
612
+ * run's `config` gate log_tail.
613
+ */
614
+ function taskEventForRunStatus(status) {
615
+ switch (status) {
616
+ case 'passed':
617
+ return 'verify_passed';
618
+ case 'not_started':
619
+ return 'verify_not_started';
620
+ case 'cancelled':
621
+ return 'cancel';
622
+ default:
623
+ return 'verify_failed';
624
+ }
625
+ }
626
+ /**
627
+ * Raise a task event, tolerating a task that vanished mid-run.
628
+ *
629
+ * A deleted worktree takes its tasks with it; the run's own record is already
630
+ * written by then, so failing here would lose a verdict that exists.
631
+ *
632
+ * Whether the event is allowed is the state machine's decision, not this
633
+ * module's — a run against an already-`succeeded` task is refused there, and the
634
+ * refusal is recorded in `task_events` instead of vanishing.
635
+ */
636
+ function recordTaskTransition(db, taskId, event, runId) {
637
+ try {
638
+ (0, task_transition_service_1.applyTaskEvent)(db, taskId, event, runId === undefined ? undefined : { runId });
639
+ }
640
+ catch (error) {
641
+ logger.warn('task-transition-failed', {
642
+ taskId,
643
+ event,
644
+ error: error instanceof Error ? error.message : String(error),
645
+ });
646
+ }
647
+ }
648
+ /**
649
+ * Resolve the task this run belongs to.
650
+ *
651
+ * An explicit `taskId` wins even when the row is gone — the caller asserted the
652
+ * attribution and the run should record it — so a missing row yields no task to
653
+ * transition, not an error. It also wins over the task's status: naming a task
654
+ * is the caller saying "this run is about that contract", which is what lets a
655
+ * `wait --verify` still judge a contract whose agent already verified itself
656
+ * and closed the task (#1620).
657
+ */
658
+ function resolveTask(db, input) {
659
+ if (input.taskId !== undefined) {
660
+ return (0, db_1.getTask)(db, input.taskId);
661
+ }
662
+ return (0, tasks_db_1.getVerifiableTask)(db, input.worktreeId);
663
+ }
664
+ /**
665
+ * A contract this worktree has that the run could not be attached to.
666
+ *
667
+ * The scope gate skips whenever no task resolves, and that skip is forgiven so
668
+ * a repository without contracts is not permanently `error`. The forgiveness
669
+ * was load-bearing for a case it was never meant to cover: once an agent's own
670
+ * `commandmate verify` moved its task to `succeeded`, the orchestrator's run
671
+ * resolved nothing, skipped scope, and reported `passed` — a green verdict on a
672
+ * declaration nothing had read (#1620).
673
+ *
674
+ * Reported only when the contract actually asked for a clean scope: a contract
675
+ * with `requireScopeClean: false` would have skipped while fully attached, so
676
+ * nothing was declined by losing it.
677
+ *
678
+ * @returns the closed task, or null when there is genuinely nothing to judge
679
+ */
680
+ function findDetachedContract(db, input, task) {
681
+ // A resolved task, or a caller that named one, is an attributed run.
682
+ if (task !== null || input.taskId !== undefined)
683
+ return null;
684
+ const [latest] = (0, db_1.listTasks)(db, input.worktreeId, 1);
685
+ // `pending` is not detached: nothing was sent, so no run can be about it yet.
686
+ // Anything resolvable would already have come back from resolveTask.
687
+ if (!latest || latest.status === 'pending')
688
+ return null;
689
+ return latest.contract.success.requireScopeClean ? latest : null;
690
+ }
691
+ /**
692
+ * Open a verification run and execute it in the background.
693
+ *
694
+ * Returns as soon as the run row exists, so an HTTP caller gets an id it can
695
+ * poll instead of holding a connection open for the length of a test suite.
696
+ * Use {@link waitForVerification} to await the verdict.
697
+ *
698
+ * @throws VerificationConflictError when the worktree already has an open run
699
+ */
700
+ async function startVerification(input) {
701
+ const db = (0, db_instance_1.getDbInstance)();
702
+ const existing = (0, db_1.getRunningVerificationRun)(db, input.worktreeId);
703
+ if (existing) {
704
+ throw new VerificationConflictError(input.worktreeId, existing.id);
705
+ }
706
+ const task = resolveTask(db, input);
707
+ // Deliberately not folded into `taskId` below: the run did not judge this
708
+ // contract, and recording it would put a verdict-less run in that task's
709
+ // history. It is named in the scope gate's log_tail instead.
710
+ const detachedContract = findDetachedContract(db, input, task);
711
+ const taskId = input.taskId ?? task?.id ?? null;
712
+ // An explicit gateIds always wins: `verify --gates lint` must mean lint even
713
+ // when the contract asks for more.
714
+ const gateIds = input.gateIds ?? (task ? (0, contract_message_1.resolveContractGateIds)(task.contract) ?? undefined : undefined);
715
+ let config = null;
716
+ let configFailure = null;
717
+ try {
718
+ config = (0, verify_config_1.loadVerifyConfig)(input.worktreePath);
719
+ if (!config) {
720
+ configFailure =
721
+ `${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH} not found in ${input.worktreePath}. ` +
722
+ 'Declare the repository verification gates there before running verification.';
723
+ }
724
+ }
725
+ catch (error) {
726
+ configFailure =
727
+ error instanceof verify_config_1.VerifyConfigError
728
+ ? error.message
729
+ : `Failed to read ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}: ${error.message}`;
730
+ }
731
+ // Resolved before gate selection because it can add a gate to it (#1740).
732
+ const envCleanDecision = (0, env_clean_gate_1.resolveRequireEnvClean)(task?.contract ?? null, config);
733
+ let selection = null;
734
+ if (config && !configFailure) {
735
+ // Contract gates come from the task this run is actually about (#1791), so
736
+ // a detached contract contributes none — the same rule `requireCommit`
737
+ // follows, and for the same reason: that run is not about that contract.
738
+ const declared = declaredGates(config, task ? (0, contract_message_1.contractGateDefinitions)(task.contract) : []);
739
+ if (typeof declared === 'string') {
740
+ configFailure = declared;
741
+ }
742
+ else {
743
+ const selected = selectGates(declared, gateIds, envCleanDecision.required);
744
+ if (typeof selected === 'string') {
745
+ configFailure = selected;
746
+ }
747
+ else {
748
+ selection = selected;
749
+ }
750
+ }
751
+ }
752
+ const baseRef = config ? await resolveBaseRef(config, input.worktreePath) : null;
753
+ const run = (0, db_1.createVerificationRun)(db, {
754
+ worktreeId: input.worktreeId,
755
+ trigger: input.trigger,
756
+ instanceId: input.instanceId ?? null,
757
+ taskId,
758
+ baseRef,
759
+ });
760
+ // Whether this run may move the task is the state machine's call (#1548).
761
+ // It refuses `verify_started` from `succeeded`/`cancelled`, so an unrelated
762
+ // manual run still cannot walk back a recorded verdict — while a `failed`
763
+ // task, which a retry legitimately reopens, is no longer excluded by a status
764
+ // check that could not tell the two apart.
765
+ const trackedTask = task;
766
+ if (!config || !selection) {
767
+ // Closed synchronously: there is no work to schedule, and leaving the row
768
+ // `running` would block the next request for this worktree on a run that
769
+ // will never move.
770
+ // Recorded, not run: this row carries a message about a config that could
771
+ // not be loaded, so like any gate that never executed it gets a zero-length
772
+ // window at the moment the failure was recorded (#1625).
773
+ const recordedAt = Date.now();
774
+ const row = (0, db_1.createGateResult)(db, run.id, {
775
+ gateId: exports.CONFIG_GATE_ID,
776
+ command: verify_config_1.VERIFY_CONFIG_RELATIVE_PATH,
777
+ source: 'builtin',
778
+ });
779
+ (0, db_1.finishGateResult)(db, row.id, {
780
+ status: 'error',
781
+ exitCode: null,
782
+ durationMs: 0,
783
+ logTail: configFailure,
784
+ executionWindow: { startedAt: recordedAt, finishedAt: recordedAt },
785
+ });
786
+ (0, db_1.finishVerificationRun)(db, run.id, 'error');
787
+ logger.warn('verification-config-unusable', { runId: run.id, worktreeId: input.worktreeId });
788
+ if (trackedTask) {
789
+ // The run opened and immediately errored, so the task passes through
790
+ // `verifying` the same way it would for gates that ran: an unusable config
791
+ // means this task can never be shown to have passed, and going straight to
792
+ // `verify_failed` would be a transition the machine has no rule for.
793
+ recordTaskTransition(db, trackedTask.id, 'verify_started', run.id);
794
+ recordTaskTransition(db, trackedTask.id, 'verify_failed', run.id);
795
+ }
796
+ return { runId: run.id };
797
+ }
798
+ if (trackedTask) {
799
+ recordTaskTransition(db, trackedTask.id, 'verify_started', run.id);
800
+ }
801
+ const resolvedConfig = config;
802
+ const resolvedSelection = selection;
803
+ // Read once, up front: the baseline is a file, and a run that took minutes
804
+ // must be judged against the snapshot the task started from, not against
805
+ // whatever is on disk when the gate finally executes.
806
+ const envCleanContext = {
807
+ worktreeId: input.worktreeId,
808
+ taskId,
809
+ baseline: resolvedSelection.runEnvClean && taskId ? (0, env_snapshot_1.loadEnvSnapshot)(taskId) : null,
810
+ decision: envCleanDecision,
811
+ };
812
+ const completion = (async () => {
813
+ await acquireSlot();
814
+ let terminalStatus = 'error';
815
+ try {
816
+ const status = await executeRun(db, run.id, input.worktreePath, resolvedConfig, resolvedSelection, baseRef, task, detachedContract, envCleanContext);
817
+ terminalStatus = status;
818
+ (0, db_1.finishVerificationRun)(db, run.id, status);
819
+ return status;
820
+ }
821
+ catch (error) {
822
+ logger.error('verification-run-crashed', {
823
+ runId: run.id,
824
+ error: error instanceof Error ? error.message : String(error),
825
+ });
826
+ try {
827
+ (0, db_1.finishVerificationRun)(db, run.id, 'error');
828
+ }
829
+ catch {
830
+ // The row is gone (worktree deleted mid-run); nothing left to close.
831
+ }
832
+ return 'error';
833
+ }
834
+ finally {
835
+ if (trackedTask) {
836
+ recordTaskTransition(db, trackedTask.id, taskEventForRunStatus(terminalStatus), run.id);
837
+ }
838
+ releaseSlot();
839
+ inFlight.delete(run.id);
840
+ }
841
+ })();
842
+ inFlight.set(run.id, completion);
843
+ return { runId: run.id };
844
+ }