commandmate 0.16.0 → 0.18.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 (616) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +298 -228
  3. package/.next/app-path-routes-manifest.json +39 -29
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +57 -0
  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_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  43. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/hooks/agent-event/route.js +1 -0
  45. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -0
  46. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -0
  47. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  48. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  49. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/metrics/vibe/route.js +37 -0
  51. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -0
  52. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -0
  53. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  55. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  59. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  61. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  63. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/clone/route.js +1 -1
  66. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/restore/route.js +1 -1
  70. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/route.js +1 -1
  73. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/scan/route.js +1 -1
  76. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/sync/route.js +1 -1
  79. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +4 -0
  90. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -0
  91. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -0
  92. package/.next/server/app/api/tasks/[taskId]/route.js +4 -0
  93. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -0
  94. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -0
  95. package/.next/server/app/api/templates/[id]/route.js +1 -1
  96. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/templates/route.js +1 -1
  98. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/todos/route.js +1 -1
  100. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -0
  102. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -0
  103. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -0
  104. package/.next/server/app/api/verification/runs/route.js +1 -0
  105. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -0
  106. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -0
  107. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  119. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  123. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  195. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
  204. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/skills/route.js +2 -2
  218. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/tasks/route.js +6 -0
  228. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -0
  229. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -0
  230. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  237. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/verify/route.js +4 -0
  249. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -0
  250. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -0
  251. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -0
  252. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -0
  253. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -0
  254. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -0
  255. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -0
  256. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -0
  257. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/route.js +1 -1
  260. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  263. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  264. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  266. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  267. package/.next/server/app/page_client-reference-manifest.js +1 -1
  268. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/repositories/page.js +1 -1
  270. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/review/page.js +1 -1
  272. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  273. package/.next/server/app/sessions/page.js +1 -1
  274. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  275. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  276. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/worktrees/[id]/page.js +2 -2
  280. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app-paths-manifest.json +39 -29
  283. package/.next/server/chunks/1068.js +1 -1
  284. package/.next/server/chunks/1117.js +1 -1
  285. package/.next/server/chunks/1503.js +2 -0
  286. package/.next/server/chunks/2366.js +1 -0
  287. package/.next/server/chunks/3042.js +1 -1
  288. package/.next/server/chunks/3736.js +1 -1
  289. package/.next/server/chunks/4444.js +1 -1
  290. package/.next/server/chunks/4689.js +25 -0
  291. package/.next/server/chunks/5381.js +50 -10
  292. package/.next/server/chunks/5959.js +3 -3
  293. package/.next/server/chunks/6130.js +1 -1
  294. package/.next/server/chunks/6274.js +13 -0
  295. package/.next/server/chunks/646.js +1 -1
  296. package/.next/server/chunks/8681.js +1 -1
  297. package/.next/server/chunks/8807.js +194 -51
  298. package/.next/server/chunks/8856.js +4 -0
  299. package/.next/server/chunks/9687.js +2 -2
  300. package/.next/server/middleware-manifest.json +5 -5
  301. package/.next/server/pages/500.html +1 -1
  302. package/.next/server/server-reference-manifest.json +1 -1
  303. package/.next/static/-BSmW0Ae2YsxyCl_ue7_d/_buildManifest.js +1 -0
  304. package/.next/static/chunks/{4560-8ffb0bb19f2ba998.js → 4560-0917ae2e6a0e5400.js} +1 -1
  305. package/.next/static/chunks/{6488-c2a968ec806975c2.js → 6488-109e3825c7249e47.js} +1 -1
  306. package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +1 -0
  307. package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +1 -0
  308. package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +1 -0
  309. package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +1 -0
  310. package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +1 -0
  311. package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +1 -0
  312. package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +1 -0
  313. package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +1 -0
  314. package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +1 -0
  315. package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +1 -0
  316. package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +1 -0
  317. package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +1 -0
  318. package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +1 -0
  319. package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +1 -0
  320. package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +1 -0
  321. package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +1 -0
  322. package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +1 -0
  323. package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +1 -0
  324. package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +1 -0
  325. package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +1 -0
  326. package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +1 -0
  327. package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +1 -0
  328. package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +1 -0
  329. package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +1 -0
  330. package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +1 -0
  331. package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +1 -0
  332. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +1 -0
  333. package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +1 -0
  334. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +1 -0
  335. package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +1 -0
  336. package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +1 -0
  337. package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +1 -0
  338. package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +1 -0
  339. package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +1 -0
  340. package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +1 -0
  341. package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +1 -0
  342. package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +1 -0
  343. package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +1 -0
  344. package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +1 -0
  345. package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +1 -0
  346. package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +1 -0
  347. package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +1 -0
  348. package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +1 -0
  349. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +1 -0
  350. package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +1 -0
  351. package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +1 -0
  352. package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +1 -0
  353. package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +1 -0
  354. package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +1 -0
  355. package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +1 -0
  426. package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +1 -0
  427. package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +1 -0
  428. package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +1 -0
  429. package/.next/static/chunks/app/review/{page-f431d630097c2e85.js → page-b559bfb11c46931b.js} +1 -1
  430. package/.next/static/chunks/app/sessions/{page-20f07a99db64d2ca.js → page-3fa7e767d0ab3889.js} +1 -1
  431. package/.next/static/chunks/app/worktrees/[id]/page-12b3c5f32fc6094e.js +1 -0
  432. package/.next/trace +12 -11
  433. package/.next/types/app/api/hooks/agent-event/route.ts +347 -0
  434. package/.next/types/app/api/metrics/vibe/route.ts +347 -0
  435. package/.next/types/app/api/tasks/[taskId]/cancel/route.ts +347 -0
  436. package/.next/types/app/api/tasks/[taskId]/route.ts +347 -0
  437. package/.next/types/app/api/verification/runs/[runId]/route.ts +347 -0
  438. package/.next/types/app/api/verification/runs/route.ts +347 -0
  439. package/.next/types/app/api/worktrees/[id]/tasks/route.ts +347 -0
  440. package/.next/types/app/api/worktrees/[id]/verify/route.ts +347 -0
  441. package/.next/types/app/api/worktrees/[id]/verify/runs/[runId]/route.ts +347 -0
  442. package/.next/types/app/api/worktrees/[id]/verify/runs/route.ts +347 -0
  443. package/.next/types/routes.d.ts +11 -1
  444. package/.next/types/validator.ts +90 -0
  445. package/dist/cli/commands/report.d.ts +1 -0
  446. package/dist/cli/commands/report.d.ts.map +1 -1
  447. package/dist/cli/commands/report.js +54 -0
  448. package/dist/cli/commands/send.d.ts.map +1 -1
  449. package/dist/cli/commands/send.js +116 -14
  450. package/dist/cli/commands/task.d.ts +11 -0
  451. package/dist/cli/commands/task.d.ts.map +1 -0
  452. package/dist/cli/commands/task.js +126 -0
  453. package/dist/cli/commands/verify.d.ts +19 -0
  454. package/dist/cli/commands/verify.d.ts.map +1 -0
  455. package/dist/cli/commands/verify.js +229 -0
  456. package/dist/cli/commands/wait.d.ts +2 -0
  457. package/dist/cli/commands/wait.d.ts.map +1 -1
  458. package/dist/cli/commands/wait.js +128 -13
  459. package/dist/cli/docs/agent-operations.d.ts +2 -2
  460. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  461. package/dist/cli/docs/agent-operations.js +92 -3
  462. package/dist/cli/program.d.ts.map +1 -1
  463. package/dist/cli/program.js +6 -0
  464. package/dist/cli/types/api-responses.d.ts +180 -0
  465. package/dist/cli/types/api-responses.d.ts.map +1 -1
  466. package/dist/cli/types/index.d.ts +82 -0
  467. package/dist/cli/types/index.d.ts.map +1 -1
  468. package/dist/cli/types/index.js +30 -1
  469. package/dist/cli/utils/api-client.d.ts +8 -0
  470. package/dist/cli/utils/api-client.d.ts.map +1 -1
  471. package/dist/cli/utils/verify-runner.d.ts +63 -0
  472. package/dist/cli/utils/verify-runner.d.ts.map +1 -0
  473. package/dist/cli/utils/verify-runner.js +175 -0
  474. package/dist/server/server.js +15 -0
  475. package/dist/server/src/config/auto-yes-config.js +22 -0
  476. package/dist/server/src/lib/auto-yes-poller.js +34 -2
  477. package/dist/server/src/lib/auto-yes-state.js +6 -19
  478. package/dist/server/src/lib/db/db.js +34 -1
  479. package/dist/server/src/lib/db/migrations/index.js +6 -0
  480. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  481. package/dist/server/src/lib/db/migrations/v49-verification-runs.js +86 -0
  482. package/dist/server/src/lib/db/migrations/v50-tasks.js +68 -0
  483. package/dist/server/src/lib/db/migrations/v51-task-events.js +58 -0
  484. package/dist/server/src/lib/db/task-events-db.js +59 -0
  485. package/dist/server/src/lib/db/tasks-db.js +263 -0
  486. package/dist/server/src/lib/db/verification-db.js +290 -0
  487. package/dist/server/src/lib/polling/auto-yes-policy.js +117 -0
  488. package/dist/server/src/lib/polling/auto-yes-resolver.js +144 -4
  489. package/dist/server/src/lib/polling/response-checker.js +8 -0
  490. package/dist/server/src/lib/session/agent-event-state.js +46 -0
  491. package/dist/server/src/lib/session/current-output-builder.js +4 -0
  492. package/dist/server/src/lib/session/status-mapping.js +146 -0
  493. package/dist/server/src/lib/tasks/contract-parser.js +385 -0
  494. package/dist/server/src/lib/tasks/task-state-machine.js +183 -0
  495. package/dist/server/src/lib/tasks/task-transition-service.js +106 -0
  496. package/dist/server/src/lib/verification/verification-reconciler.js +49 -0
  497. package/dist/server/src/types/sidebar.js +7 -20
  498. package/package.json +5 -2
  499. package/scripts/hooks/cmate-agent-event.sh +175 -0
  500. package/.next/server/chunks/2064.js +0 -2
  501. package/.next/static/AKqbAyuzbFfg05qpbCI_K/_buildManifest.js +0 -1
  502. package/.next/static/chunks/app/api/app/update/route-55e398bd20e2d7a9.js +0 -1
  503. package/.next/static/chunks/app/api/app/update-check/route-55e398bd20e2d7a9.js +0 -1
  504. package/.next/static/chunks/app/api/assistant/conversation/route-55e398bd20e2d7a9.js +0 -1
  505. package/.next/static/chunks/app/api/assistant/current-output/route-55e398bd20e2d7a9.js +0 -1
  506. package/.next/static/chunks/app/api/assistant/messages/route-55e398bd20e2d7a9.js +0 -1
  507. package/.next/static/chunks/app/api/assistant/session/route-55e398bd20e2d7a9.js +0 -1
  508. package/.next/static/chunks/app/api/assistant/start/route-55e398bd20e2d7a9.js +0 -1
  509. package/.next/static/chunks/app/api/assistant/terminal/route-55e398bd20e2d7a9.js +0 -1
  510. package/.next/static/chunks/app/api/assistant/tools/route-55e398bd20e2d7a9.js +0 -1
  511. package/.next/static/chunks/app/api/auth/login/route-55e398bd20e2d7a9.js +0 -1
  512. package/.next/static/chunks/app/api/auth/logout/route-55e398bd20e2d7a9.js +0 -1
  513. package/.next/static/chunks/app/api/auth/status/route-55e398bd20e2d7a9.js +0 -1
  514. package/.next/static/chunks/app/api/daily-summary/route-55e398bd20e2d7a9.js +0 -1
  515. package/.next/static/chunks/app/api/daily-summary/status/route-55e398bd20e2d7a9.js +0 -1
  516. package/.next/static/chunks/app/api/external-apps/[id]/health/route-55e398bd20e2d7a9.js +0 -1
  517. package/.next/static/chunks/app/api/external-apps/[id]/route-55e398bd20e2d7a9.js +0 -1
  518. package/.next/static/chunks/app/api/external-apps/route-55e398bd20e2d7a9.js +0 -1
  519. package/.next/static/chunks/app/api/fs/browse/route-55e398bd20e2d7a9.js +0 -1
  520. package/.next/static/chunks/app/api/fs/recent-paths/route-55e398bd20e2d7a9.js +0 -1
  521. package/.next/static/chunks/app/api/hooks/claude-done/route-55e398bd20e2d7a9.js +0 -1
  522. package/.next/static/chunks/app/api/ollama/models/route-55e398bd20e2d7a9.js +0 -1
  523. package/.next/static/chunks/app/api/push/subscriptions/route-55e398bd20e2d7a9.js +0 -1
  524. package/.next/static/chunks/app/api/push/vapid/route-55e398bd20e2d7a9.js +0 -1
  525. package/.next/static/chunks/app/api/repositories/[id]/route-55e398bd20e2d7a9.js +0 -1
  526. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-55e398bd20e2d7a9.js +0 -1
  527. package/.next/static/chunks/app/api/repositories/[id]/todos/route-55e398bd20e2d7a9.js +0 -1
  528. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-55e398bd20e2d7a9.js +0 -1
  529. package/.next/static/chunks/app/api/repositories/clone/route-55e398bd20e2d7a9.js +0 -1
  530. package/.next/static/chunks/app/api/repositories/excluded/route-55e398bd20e2d7a9.js +0 -1
  531. package/.next/static/chunks/app/api/repositories/restore/route-55e398bd20e2d7a9.js +0 -1
  532. package/.next/static/chunks/app/api/repositories/route-55e398bd20e2d7a9.js +0 -1
  533. package/.next/static/chunks/app/api/repositories/scan/route-55e398bd20e2d7a9.js +0 -1
  534. package/.next/static/chunks/app/api/repositories/sync/route-55e398bd20e2d7a9.js +0 -1
  535. package/.next/static/chunks/app/api/repositories/validate-path/route-55e398bd20e2d7a9.js +0 -1
  536. package/.next/static/chunks/app/api/sidebar/group-order/route-55e398bd20e2d7a9.js +0 -1
  537. package/.next/static/chunks/app/api/skills/[id]/route-55e398bd20e2d7a9.js +0 -1
  538. package/.next/static/chunks/app/api/skills/installations/route-55e398bd20e2d7a9.js +0 -1
  539. package/.next/static/chunks/app/api/skills/operations/route-55e398bd20e2d7a9.js +0 -1
  540. package/.next/static/chunks/app/api/skills/reindex/route-55e398bd20e2d7a9.js +0 -1
  541. package/.next/static/chunks/app/api/skills/route-55e398bd20e2d7a9.js +0 -1
  542. package/.next/static/chunks/app/api/slash-commands/route-55e398bd20e2d7a9.js +0 -1
  543. package/.next/static/chunks/app/api/templates/[id]/route-55e398bd20e2d7a9.js +0 -1
  544. package/.next/static/chunks/app/api/templates/route-55e398bd20e2d7a9.js +0 -1
  545. package/.next/static/chunks/app/api/todos/route-55e398bd20e2d7a9.js +0 -1
  546. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-55e398bd20e2d7a9.js +0 -1
  547. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-55e398bd20e2d7a9.js +0 -1
  548. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-55e398bd20e2d7a9.js +0 -1
  549. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-55e398bd20e2d7a9.js +0 -1
  550. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-55e398bd20e2d7a9.js +0 -1
  551. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-55e398bd20e2d7a9.js +0 -1
  552. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-55e398bd20e2d7a9.js +0 -1
  553. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-55e398bd20e2d7a9.js +0 -1
  554. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-55e398bd20e2d7a9.js +0 -1
  555. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-55e398bd20e2d7a9.js +0 -1
  556. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-55e398bd20e2d7a9.js +0 -1
  557. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-55e398bd20e2d7a9.js +0 -1
  558. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-55e398bd20e2d7a9.js +0 -1
  559. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-55e398bd20e2d7a9.js +0 -1
  560. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-55e398bd20e2d7a9.js +0 -1
  561. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-55e398bd20e2d7a9.js +0 -1
  562. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-55e398bd20e2d7a9.js +0 -1
  563. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-55e398bd20e2d7a9.js +0 -1
  564. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-55e398bd20e2d7a9.js +0 -1
  565. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-55e398bd20e2d7a9.js +0 -1
  566. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-55e398bd20e2d7a9.js +0 -1
  567. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-55e398bd20e2d7a9.js +0 -1
  568. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-55e398bd20e2d7a9.js +0 -1
  569. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-55e398bd20e2d7a9.js +0 -1
  570. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-55e398bd20e2d7a9.js +0 -1
  571. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-55e398bd20e2d7a9.js +0 -1
  572. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-55e398bd20e2d7a9.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-55e398bd20e2d7a9.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-55e398bd20e2d7a9.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-55e398bd20e2d7a9.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-55e398bd20e2d7a9.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-55e398bd20e2d7a9.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-55e398bd20e2d7a9.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-55e398bd20e2d7a9.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-55e398bd20e2d7a9.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-55e398bd20e2d7a9.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-55e398bd20e2d7a9.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-55e398bd20e2d7a9.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-55e398bd20e2d7a9.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-55e398bd20e2d7a9.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-55e398bd20e2d7a9.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/route-55e398bd20e2d7a9.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-55e398bd20e2d7a9.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-55e398bd20e2d7a9.js +0 -1
  590. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-55e398bd20e2d7a9.js +0 -1
  591. package/.next/static/chunks/app/api/worktrees/[id]/search/route-55e398bd20e2d7a9.js +0 -1
  592. package/.next/static/chunks/app/api/worktrees/[id]/send/route-55e398bd20e2d7a9.js +0 -1
  593. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-55e398bd20e2d7a9.js +0 -1
  594. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-55e398bd20e2d7a9.js +0 -1
  595. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-55e398bd20e2d7a9.js +0 -1
  596. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-55e398bd20e2d7a9.js +0 -1
  597. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-55e398bd20e2d7a9.js +0 -1
  598. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-55e398bd20e2d7a9.js +0 -1
  599. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-55e398bd20e2d7a9.js +0 -1
  600. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-55e398bd20e2d7a9.js +0 -1
  601. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-55e398bd20e2d7a9.js +0 -1
  602. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-55e398bd20e2d7a9.js +0 -1
  603. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-55e398bd20e2d7a9.js +0 -1
  604. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-55e398bd20e2d7a9.js +0 -1
  605. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-55e398bd20e2d7a9.js +0 -1
  606. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-55e398bd20e2d7a9.js +0 -1
  607. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-55e398bd20e2d7a9.js +0 -1
  608. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-55e398bd20e2d7a9.js +0 -1
  609. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-55e398bd20e2d7a9.js +0 -1
  610. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-55e398bd20e2d7a9.js +0 -1
  611. package/.next/static/chunks/app/api/worktrees/route-55e398bd20e2d7a9.js +0 -1
  612. package/.next/static/chunks/app/manifest.webmanifest/route-55e398bd20e2d7a9.js +0 -1
  613. package/.next/static/chunks/app/proxy/[...path]/route-55e398bd20e2d7a9.js +0 -1
  614. package/.next/static/chunks/app/repositories/page-3c4fb889da48ce24.js +0 -1
  615. package/.next/static/chunks/app/worktrees/[id]/page-59a63a2c013ec1eb.js +0 -1
  616. /package/.next/static/{AKqbAyuzbFfg05qpbCI_K → -BSmW0Ae2YsxyCl_ue7_d}/_ssgManifest.js +0 -0
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /**
3
+ * Verification run database operations (Issue #1542, migration v49).
4
+ *
5
+ * Persists the outcome of a verification gate run: one `verification_runs` row
6
+ * per attempt, one `verification_gate_results` row per command inside it.
7
+ *
8
+ * Both create* functions open a record in `running` state and both finish*
9
+ * functions close it. That split is deliberate: a run that crashes mid-flight
10
+ * leaves a `running` row behind, which is recoverable evidence, whereas a
11
+ * single write-on-completion would leave nothing at all.
12
+ *
13
+ * The timestamps describe the *execution*, not the writes (Issue #1625): a
14
+ * caller that measured a gate closes the row with the window it measured, so
15
+ * `finished_at - started_at` equals `duration_ms` instead of the gap between
16
+ * two adjacent INSERT/UPDATE statements.
17
+ *
18
+ * The finish* functions throw when the target row does not exist. A silent
19
+ * no-op would let a caller believe it recorded a verdict it never recorded —
20
+ * exactly the failure this table exists to make impossible.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.MAX_RUN_HISTORY_DAYS = exports.MAX_RUN_HISTORY_LIMIT = exports.DEFAULT_RUN_HISTORY_LIMIT = exports.VERIFICATION_TRIGGERS = void 0;
24
+ exports.createVerificationRun = createVerificationRun;
25
+ exports.finishVerificationRun = finishVerificationRun;
26
+ exports.createGateResult = createGateResult;
27
+ exports.finishGateResult = finishGateResult;
28
+ exports.getVerificationRun = getVerificationRun;
29
+ exports.getRunningVerificationRun = getRunningVerificationRun;
30
+ exports.listRunningVerificationRuns = listRunningVerificationRuns;
31
+ exports.listVerificationRuns = listVerificationRuns;
32
+ exports.listVerificationRunsForPeriod = listVerificationRunsForPeriod;
33
+ /**
34
+ * What caused a verification run to start.
35
+ *
36
+ * The runtime tuple mirrors the `trigger` CHECK constraint in migration v49 and
37
+ * is the single source callers validate untrusted input against, so a new
38
+ * trigger cannot be accepted by an API route and then rejected by SQLite.
39
+ */
40
+ exports.VERIFICATION_TRIGGERS = ['manual', 'wait', 'api', 'task'];
41
+ const RUN_COLUMNS = `
42
+ id, worktree_id, instance_id, task_id, trigger, status, base_ref, started_at, finished_at
43
+ `;
44
+ const GATE_COLUMNS = `
45
+ id, run_id, gate_id, command, status, exit_code, duration_ms, log_tail, started_at, finished_at
46
+ `;
47
+ function mapRunRow(row) {
48
+ return {
49
+ id: row.id,
50
+ worktreeId: row.worktree_id,
51
+ instanceId: row.instance_id,
52
+ taskId: row.task_id,
53
+ trigger: row.trigger,
54
+ status: row.status,
55
+ baseRef: row.base_ref,
56
+ startedAt: new Date(row.started_at),
57
+ finishedAt: row.finished_at === null ? null : new Date(row.finished_at),
58
+ };
59
+ }
60
+ function mapGateRow(row) {
61
+ return {
62
+ id: row.id,
63
+ runId: row.run_id,
64
+ gateId: row.gate_id,
65
+ command: row.command,
66
+ status: row.status,
67
+ exitCode: row.exit_code,
68
+ durationMs: row.duration_ms,
69
+ logTail: row.log_tail,
70
+ startedAt: new Date(row.started_at),
71
+ finishedAt: row.finished_at === null ? null : new Date(row.finished_at),
72
+ timingsMeasured: row.finished_at !== null &&
73
+ row.duration_ms !== null &&
74
+ row.finished_at - row.started_at === row.duration_ms,
75
+ };
76
+ }
77
+ /** Open a run in `running` state. */
78
+ function createVerificationRun(db, input) {
79
+ const now = Date.now();
80
+ const info = db
81
+ .prepare(`
82
+ INSERT INTO verification_runs (
83
+ worktree_id, instance_id, task_id, trigger, status, base_ref, started_at, finished_at
84
+ )
85
+ VALUES (?, ?, ?, ?, 'running', ?, ?, NULL)
86
+ `)
87
+ .run(input.worktreeId, input.instanceId ?? null, input.taskId ?? null, input.trigger, input.baseRef ?? null, now);
88
+ const row = db
89
+ .prepare(`SELECT ${RUN_COLUMNS} FROM verification_runs WHERE id = ?`)
90
+ .get(Number(info.lastInsertRowid));
91
+ if (!row) {
92
+ throw new Error('Failed to persist verification run');
93
+ }
94
+ return mapRunRow(row);
95
+ }
96
+ /** Close a run with its final verdict, stamping `finished_at`. */
97
+ function finishVerificationRun(db, runId, status) {
98
+ const info = db
99
+ .prepare('UPDATE verification_runs SET status = ?, finished_at = ? WHERE id = ?')
100
+ .run(status, Date.now(), runId);
101
+ if (info.changes === 0) {
102
+ throw new Error(`Verification run ${runId} not found`);
103
+ }
104
+ }
105
+ /** Open a gate result under an existing run, in `running` state. */
106
+ function createGateResult(db, runId, input) {
107
+ const now = Date.now();
108
+ const info = db
109
+ .prepare(`
110
+ INSERT INTO verification_gate_results (
111
+ run_id, gate_id, command, status, exit_code, duration_ms, log_tail, started_at, finished_at
112
+ )
113
+ VALUES (?, ?, ?, 'running', NULL, NULL, NULL, ?, NULL)
114
+ `)
115
+ .run(runId, input.gateId, input.command, now);
116
+ const row = db
117
+ .prepare(`SELECT ${GATE_COLUMNS} FROM verification_gate_results WHERE id = ?`)
118
+ .get(Number(info.lastInsertRowid));
119
+ if (!row) {
120
+ throw new Error('Failed to persist verification gate result');
121
+ }
122
+ return mapGateRow(row);
123
+ }
124
+ /**
125
+ * Close a gate result with its outcome and the interval it occupied.
126
+ *
127
+ * `started_at` is rewritten only when the caller declares an
128
+ * {@link FinishGateResultPatch.executionWindow}: the value written when the row
129
+ * was opened is a placeholder for "this gate was entered", and the measured
130
+ * start is a few milliseconds later — after the insert this call is closing.
131
+ * Leaving the placeholder would put that gap inside the reported window.
132
+ */
133
+ function finishGateResult(db, gateResultId, patch) {
134
+ const info = db
135
+ .prepare(`
136
+ UPDATE verification_gate_results
137
+ SET status = ?, exit_code = ?, duration_ms = ?, log_tail = ?,
138
+ started_at = COALESCE(?, started_at),
139
+ finished_at = ?
140
+ WHERE id = ?
141
+ `)
142
+ .run(patch.status, patch.exitCode ?? null, patch.durationMs ?? null, patch.logTail ?? null, patch.executionWindow?.startedAt ?? null, patch.executionWindow?.finishedAt ?? Date.now(), gateResultId);
143
+ if (info.changes === 0) {
144
+ throw new Error(`Verification gate result ${gateResultId} not found`);
145
+ }
146
+ }
147
+ /** Fetch a run with its gate results, or null when the run does not exist. */
148
+ function getVerificationRun(db, runId) {
149
+ const runRow = db
150
+ .prepare(`SELECT ${RUN_COLUMNS} FROM verification_runs WHERE id = ?`)
151
+ .get(runId);
152
+ if (!runRow) {
153
+ return null;
154
+ }
155
+ const gateRows = db
156
+ .prepare(`
157
+ SELECT ${GATE_COLUMNS} FROM verification_gate_results
158
+ WHERE run_id = ?
159
+ ORDER BY started_at ASC, id ASC
160
+ `)
161
+ .all(runId);
162
+ return { ...mapRunRow(runRow), gates: gateRows.map(mapGateRow) };
163
+ }
164
+ /**
165
+ * The open run for a worktree, or null when none is in flight.
166
+ *
167
+ * A worktree admits one run at a time: two runs sharing a working tree would
168
+ * see each other's build output and their exit codes would describe neither.
169
+ * `id DESC` is a safety net — the invariant says there is at most one row, and
170
+ * if a bug ever breaks it the newest is the one a caller means.
171
+ */
172
+ function getRunningVerificationRun(db, worktreeId) {
173
+ const row = db
174
+ .prepare(`
175
+ SELECT ${RUN_COLUMNS} FROM verification_runs
176
+ WHERE worktree_id = ? AND status = 'running'
177
+ ORDER BY id DESC
178
+ LIMIT 1
179
+ `)
180
+ .get(worktreeId);
181
+ return row ? mapRunRow(row) : null;
182
+ }
183
+ /**
184
+ * Every run still marked `running`, across all worktrees, oldest first.
185
+ *
186
+ * Used by startup reconciliation: after a restart no run is actually in flight,
187
+ * so every row this returns is an orphan whose verdict was lost.
188
+ */
189
+ function listRunningVerificationRuns(db) {
190
+ const rows = db
191
+ .prepare(`
192
+ SELECT ${RUN_COLUMNS} FROM verification_runs
193
+ WHERE status = 'running'
194
+ ORDER BY id ASC
195
+ `)
196
+ .all();
197
+ return rows.map(mapRunRow);
198
+ }
199
+ /**
200
+ * Most recent runs for a worktree, newest first.
201
+ *
202
+ * `id DESC` breaks ties: runs started within the same millisecond are common
203
+ * enough that without it the "newest first" contract would be unordered.
204
+ */
205
+ function listVerificationRuns(db, worktreeId, limit = 20) {
206
+ const rows = db
207
+ .prepare(`
208
+ SELECT ${RUN_COLUMNS} FROM verification_runs
209
+ WHERE worktree_id = ?
210
+ ORDER BY started_at DESC, id DESC
211
+ LIMIT ?
212
+ `)
213
+ .all(worktreeId, limit);
214
+ return rows.map(mapRunRow);
215
+ }
216
+ /** Default page size for {@link listVerificationRunsForPeriod}. */
217
+ exports.DEFAULT_RUN_HISTORY_LIMIT = 50;
218
+ /** Largest page {@link listVerificationRunsForPeriod} will return. */
219
+ exports.MAX_RUN_HISTORY_LIMIT = 500;
220
+ /** Longest window {@link listVerificationRunsForPeriod} will look back over. */
221
+ exports.MAX_RUN_HISTORY_DAYS = 90;
222
+ const MS_PER_DAY = 86_400_000;
223
+ /** Clamp to an integer inside [min, max]; non-finite input falls back to `fallback`. */
224
+ function clampInt(value, fallback, min, max) {
225
+ if (value === undefined || !Number.isFinite(value))
226
+ return fallback;
227
+ return Math.min(Math.max(Math.trunc(value), min), max);
228
+ }
229
+ /**
230
+ * Recent runs across worktrees, newest first, each with its gate verdicts but
231
+ * no log bodies (Issue #1593).
232
+ *
233
+ * `worktreeId` is optional because the advisor that consumes this (#1594) looks
234
+ * at a repository's trend, not one worktree's. Ordering follows the same
235
+ * `started_at DESC, id DESC` contract as {@link listVerificationRuns} so both
236
+ * feeds agree about what "newest" means.
237
+ *
238
+ * `days` and `limit` are clamped rather than rejected: this is a read-only feed
239
+ * and a caller asking for 10000 runs wants as many as it can have, not an
240
+ * exception. API routes validate before calling so a user typo still 400s.
241
+ */
242
+ function listVerificationRunsForPeriod(db, opts = {}) {
243
+ const limit = clampInt(opts.limit, exports.DEFAULT_RUN_HISTORY_LIMIT, 1, exports.MAX_RUN_HISTORY_LIMIT);
244
+ const conditions = [];
245
+ const params = [];
246
+ if (opts.worktreeId !== undefined) {
247
+ conditions.push('worktree_id = ?');
248
+ params.push(opts.worktreeId);
249
+ }
250
+ if (opts.days !== undefined) {
251
+ const days = clampInt(opts.days, exports.MAX_RUN_HISTORY_DAYS, 1, exports.MAX_RUN_HISTORY_DAYS);
252
+ conditions.push('started_at >= ?');
253
+ params.push(Date.now() - days * MS_PER_DAY);
254
+ }
255
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
256
+ const runRows = db
257
+ .prepare(`
258
+ SELECT ${RUN_COLUMNS} FROM verification_runs
259
+ ${where}
260
+ ORDER BY started_at DESC, id DESC
261
+ LIMIT ?
262
+ `)
263
+ .all(...params, limit);
264
+ if (runRows.length === 0)
265
+ return [];
266
+ const placeholders = runRows.map(() => '?').join(', ');
267
+ const gateRows = db
268
+ .prepare(`
269
+ SELECT run_id, gate_id, status, exit_code, duration_ms
270
+ FROM verification_gate_results
271
+ WHERE run_id IN (${placeholders})
272
+ ORDER BY started_at ASC, id ASC
273
+ `)
274
+ .all(...runRows.map((row) => row.id));
275
+ const byRun = new Map();
276
+ for (const row of gateRows) {
277
+ const summary = {
278
+ gateId: row.gate_id,
279
+ status: row.status,
280
+ exitCode: row.exit_code,
281
+ durationMs: row.duration_ms,
282
+ };
283
+ const bucket = byRun.get(row.run_id);
284
+ if (bucket)
285
+ bucket.push(summary);
286
+ else
287
+ byRun.set(row.run_id, [summary]);
288
+ }
289
+ return runRows.map((row) => ({ ...mapRunRow(row), gates: byRun.get(row.id) ?? [] }));
290
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * Auto-Yes policy lookup — resolves the `autoYes` block of the execution
4
+ * contract governing one agent instance (Issue #1547).
5
+ *
6
+ * Server-only: reads the database. Kept out of auto-yes-state.ts so that module
7
+ * stays free of a database dependency, and out of auto-yes-resolver.ts because
8
+ * that one is bundled into the client.
9
+ *
10
+ * The result is cached per composite key with a short TTL. Without it, a prompt
11
+ * the policy suppresses would be re-read from SQLite on every poll for as long
12
+ * as it stays on screen: the poller's duplicate guard only remembers prompts it
13
+ * *answered*, so a suppressed prompt is re-evaluated every POLLING_INTERVAL_MS
14
+ * indefinitely. The TTL is what bounds staleness — a task that starts or ends is
15
+ * picked up within it, without this module having to observe task transitions.
16
+ *
17
+ * @module lib/polling/auto-yes-policy
18
+ */
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ exports.AUTO_YES_POLICY_CACHE_TTL_MS = void 0;
21
+ exports.getSessionAutoYesPolicy = getSessionAutoYesPolicy;
22
+ exports.invalidateSessionAutoYesPolicy = invalidateSessionAutoYesPolicy;
23
+ exports.clearAutoYesPolicyCache = clearAutoYesPolicyCache;
24
+ const db_1 = require("../../lib/db");
25
+ const db_instance_1 = require("../../lib/db/db-instance");
26
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
27
+ const logger_1 = require("../../lib/logger");
28
+ const logger = (0, logger_1.createLogger)('auto-yes-policy');
29
+ /** How long a resolved policy is reused before the task is looked up again. */
30
+ exports.AUTO_YES_POLICY_CACHE_TTL_MS = 5000;
31
+ /**
32
+ * Cache ceiling. Above it, expired entries are dropped on write, so a long-lived
33
+ * server cannot accumulate one entry per worktree ever polled.
34
+ */
35
+ const MAX_CACHE_ENTRIES = 200;
36
+ /**
37
+ * Plain module-level Map rather than the globalThis pattern used for auto-yes
38
+ * *state*: losing a cache on hot reload costs one database read, while losing
39
+ * state would silently disable auto-yes.
40
+ */
41
+ const policyCache = new Map();
42
+ function purgeExpired(now) {
43
+ for (const [key, entry] of policyCache.entries()) {
44
+ if (entry.expiresAt <= now) {
45
+ policyCache.delete(key);
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Read the policy from the active task, or null when no contract governs this
51
+ * instance.
52
+ *
53
+ * A database failure yields null — the unconstrained behaviour. Failing closed
54
+ * here would suppress auto-yes for every user who has no contract at all, which
55
+ * is the population this feature must not touch; the suppressing decisions
56
+ * (`off`, deny patterns) are made inside the resolver only once a contract has
57
+ * actually been read.
58
+ */
59
+ function readPolicy(worktreeId, cliToolId, instanceId) {
60
+ try {
61
+ const task = (0, db_1.getActiveTaskForInstance)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId, instanceId);
62
+ if (!task)
63
+ return null;
64
+ // Assignment, not a cast: a drift in TaskContractAutoYes fails the build here.
65
+ const policy = task.contract.autoYes;
66
+ return policy;
67
+ }
68
+ catch (error) {
69
+ logger.warn('policy-lookup-failed', {
70
+ worktreeId,
71
+ cliToolId,
72
+ instanceId,
73
+ error: error instanceof Error ? error.message : String(error),
74
+ });
75
+ return null;
76
+ }
77
+ }
78
+ /**
79
+ * The auto-answer policy for an agent instance, cached for
80
+ * {@link AUTO_YES_POLICY_CACHE_TTL_MS}.
81
+ *
82
+ * @param worktreeId - Worktree identifier
83
+ * @param cliToolId - CLI tool being polled
84
+ * @param instanceId - Agent instance id (defaults to the primary, i.e. cliToolId)
85
+ * @returns The contract's autoYes block, or null when no contract governs this instance
86
+ */
87
+ function getSessionAutoYesPolicy(worktreeId, cliToolId, instanceId) {
88
+ const resolvedInstanceId = instanceId ?? cliToolId;
89
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, resolvedInstanceId);
90
+ const now = Date.now();
91
+ const cached = policyCache.get(key);
92
+ if (cached && cached.expiresAt > now) {
93
+ return cached.policy;
94
+ }
95
+ const policy = readPolicy(worktreeId, cliToolId, resolvedInstanceId);
96
+ if (policyCache.size >= MAX_CACHE_ENTRIES) {
97
+ purgeExpired(now);
98
+ }
99
+ policyCache.set(key, { policy, expiresAt: now + exports.AUTO_YES_POLICY_CACHE_TTL_MS });
100
+ return policy;
101
+ }
102
+ /**
103
+ * Drop the cached policy for a composite key, so the next lookup re-reads the
104
+ * task. Called when a poller starts or stops.
105
+ *
106
+ * @param compositeKey - Composite key (worktreeId:cliToolId[:instanceId])
107
+ */
108
+ function invalidateSessionAutoYesPolicy(compositeKey) {
109
+ policyCache.delete(compositeKey);
110
+ }
111
+ /**
112
+ * Clear the whole cache.
113
+ * @internal Exported for testing and worktree teardown.
114
+ */
115
+ function clearAutoYesPolicyCache() {
116
+ policyCache.clear();
117
+ }
@@ -2,20 +2,44 @@
2
2
  /**
3
3
  * Auto Yes Resolver - Determines automatic answer for prompt data
4
4
  *
5
- * Rules:
5
+ * Base rules (unchanged since Issue #479):
6
6
  * - yes/no prompt -> 'y'
7
7
  * - multiple_choice with default option -> default option number
8
8
  * - multiple_choice without default -> first option number
9
9
  * - option requiring text input -> null (skip)
10
10
  * - unknown type -> null (skip)
11
+ *
12
+ * Issue #1547: an optional {@link AutoYesPolicy} — the `autoYes` block of an
13
+ * execution contract — can withhold an answer the base rules would have sent.
14
+ * The policy can only ever suppress: it never turns a null into an answer, and
15
+ * omitting it (or passing one that states nothing) reproduces the pre-#1547
16
+ * behaviour exactly, which is what keeps contract-less operation untouched.
17
+ *
18
+ * Client-safe: no server-only imports, because a 'use client' hook
19
+ * (`hooks/useAutoYes.ts`) imports this module.
11
20
  */
12
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.MAX_DENY_MATCH_TEXT_LENGTH = exports.MAX_DENY_PATTERN_LENGTH = void 0;
23
+ exports.resolveAutoAnswerWithPolicy = resolveAutoAnswerWithPolicy;
13
24
  exports.resolveAutoAnswer = resolveAutoAnswer;
25
+ const auto_yes_config_1 = require("../../config/auto-yes-config");
14
26
  /**
15
- * Resolve the automatic answer for a given prompt
16
- * @returns The answer string to send, or null if auto-answer is not possible
27
+ * Upper bound on a deny pattern, mirroring MAX_PATTERN_LENGTH in
28
+ * lib/tasks/contract-parser (asserted equal by the unit tests). Contracts are
29
+ * validated on load, so this is defence in depth for a contract snapshot that
30
+ * reached the database some other way.
31
+ */
32
+ exports.MAX_DENY_PATTERN_LENGTH = 200;
33
+ /**
34
+ * Upper bound on the text a deny pattern is matched against, per field.
35
+ *
36
+ * A prompt question or option label is a few hundred characters; the bound only
37
+ * exists so a pathological pane cannot make every poll scan megabytes with 32
38
+ * patterns. Matching is over the head of the field, deterministically.
17
39
  */
18
- function resolveAutoAnswer(promptData) {
40
+ exports.MAX_DENY_MATCH_TEXT_LENGTH = 20_000;
41
+ /** The pre-policy resolution: the rules as they were before Issue #1547. */
42
+ function resolveBaseAnswer(promptData) {
19
43
  if (promptData.type === 'yes_no') {
20
44
  return 'y';
21
45
  }
@@ -32,3 +56,119 @@ function resolveAutoAnswer(promptData) {
32
56
  }
33
57
  return null;
34
58
  }
59
+ /**
60
+ * Every piece of prompt text a deny pattern is matched against.
61
+ *
62
+ * `instructionText` is included because that is where the dangerous part
63
+ * usually is — Claude's permission prompts put the command being approved in the
64
+ * lines above the question, not in the question itself.
65
+ */
66
+ function collectDenyMatchTexts(promptData) {
67
+ const texts = [promptData.question];
68
+ if (promptData.instructionText) {
69
+ texts.push(promptData.instructionText);
70
+ }
71
+ if (promptData.type === 'multiple_choice') {
72
+ for (const option of promptData.options) {
73
+ texts.push(option.label);
74
+ }
75
+ }
76
+ else {
77
+ texts.push(...promptData.options);
78
+ }
79
+ return texts.map(text => text.length > exports.MAX_DENY_MATCH_TEXT_LENGTH ? text.slice(0, exports.MAX_DENY_MATCH_TEXT_LENGTH) : text);
80
+ }
81
+ /**
82
+ * Test the prompt against every deny pattern.
83
+ *
84
+ * Patterns are screened by {@link validateStopPattern} (length, safe-regex2
85
+ * catastrophic-backtracking detection, syntax) before execution, which is the
86
+ * same ReDoS defence the stop-pattern path uses. A pattern that fails screening
87
+ * — or whose execution throws — is reported as `unusable`, not skipped.
88
+ */
89
+ function evaluateDenyPatterns(promptData, patterns) {
90
+ if (patterns.length === 0) {
91
+ return { outcome: 'no-match' };
92
+ }
93
+ const texts = collectDenyMatchTexts(promptData);
94
+ for (const pattern of patterns) {
95
+ if (pattern.length > exports.MAX_DENY_PATTERN_LENGTH || !(0, auto_yes_config_1.validateStopPattern)(pattern).valid) {
96
+ return { outcome: 'unusable', pattern };
97
+ }
98
+ const regex = new RegExp(pattern);
99
+ for (const text of texts) {
100
+ const matched = (0, auto_yes_config_1.executeRegexWithTimeout)(regex, text);
101
+ if (matched === null) {
102
+ return { outcome: 'unusable', pattern };
103
+ }
104
+ if (matched) {
105
+ return { outcome: 'match', pattern };
106
+ }
107
+ }
108
+ }
109
+ return { outcome: 'no-match' };
110
+ }
111
+ /**
112
+ * Decide whether the policy forbids answering this prompt.
113
+ *
114
+ * Deny patterns are honoured even when `mode` is null: a contract that lists
115
+ * them has stated a policy, and a listed pattern that quietly did nothing is the
116
+ * worst failure a contract can have. `mode` null with no deny patterns — what
117
+ * the parser produces for a contract with no `autoYes` block — reaches none of
118
+ * these branches and leaves behaviour identical.
119
+ */
120
+ function evaluatePolicy(promptData, policy) {
121
+ if (!policy)
122
+ return null;
123
+ if (policy.mode === 'off') {
124
+ return { reason: 'mode-off' };
125
+ }
126
+ const deny = evaluateDenyPatterns(promptData, policy.denyPatterns);
127
+ if (deny.outcome === 'match') {
128
+ return { reason: 'deny-pattern', pattern: deny.pattern };
129
+ }
130
+ if (deny.outcome === 'unusable') {
131
+ return { reason: 'deny-pattern-unusable', pattern: deny.pattern };
132
+ }
133
+ if (policy.mode === 'safe') {
134
+ return promptData.type === 'yes_no' ? null : { reason: 'type-not-allowed' };
135
+ }
136
+ if (policy.mode === 'allow-listed') {
137
+ return policy.allowPromptTypes.includes(promptData.type)
138
+ ? null
139
+ : { reason: 'type-not-allowed' };
140
+ }
141
+ return null;
142
+ }
143
+ /**
144
+ * Resolve the automatic answer, reporting whether a policy withheld it.
145
+ *
146
+ * `suppressedBy` is set only when an answer was actually withheld, so the
147
+ * escalation log records real suppressions and not prompts the base rules were
148
+ * never going to answer anyway (an empty option list, an option that needs
149
+ * typing). Those still resolve to null, with `suppressedBy` null.
150
+ *
151
+ * @param promptData - Detected prompt
152
+ * @param policy - Contract auto-answer policy; omit for the unconstrained behaviour
153
+ */
154
+ function resolveAutoAnswerWithPolicy(promptData, policy) {
155
+ const answer = resolveBaseAnswer(promptData);
156
+ if (answer === null) {
157
+ return { answer: null, suppressedBy: null };
158
+ }
159
+ const denial = evaluatePolicy(promptData, policy);
160
+ if (denial) {
161
+ return { answer: null, suppressedBy: denial.reason, pattern: denial.pattern };
162
+ }
163
+ return { answer, suppressedBy: null };
164
+ }
165
+ /**
166
+ * Resolve the automatic answer for a given prompt.
167
+ *
168
+ * @param promptData - Detected prompt
169
+ * @param policy - Contract auto-answer policy; omit for the unconstrained behaviour
170
+ * @returns The answer string to send, or null if auto-answer is not possible
171
+ */
172
+ function resolveAutoAnswer(promptData, policy) {
173
+ return resolveAutoAnswerWithPolicy(promptData, policy).answer;
174
+ }
@@ -27,6 +27,7 @@ const prompt_dedup_1 = require("./prompt-dedup");
27
27
  const response_dedup_1 = require("./response-dedup");
28
28
  const response_poller_core_1 = require("./response-poller-core");
29
29
  const push_1 = require("../../lib/push");
30
+ const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
30
31
  /**
31
32
  * Creates an incomplete extraction result with empty response.
32
33
  * Centralizes the repeated pattern of returning an in-progress/incomplete state.
@@ -420,6 +421,13 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
420
421
  });
421
422
  (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
422
423
  (0, ws_server_1.broadcastMessage)('message', { worktreeId, message });
424
+ // Issue #1548: the agent is blocked on input. Raised after the dedup and
425
+ // save above, so the task log counts prompts the system actually recorded
426
+ // rather than every poll that saw the same one still on screen. No-ops
427
+ // when this instance is not running a contract.
428
+ (0, task_transition_service_1.applyEventToActiveTask)(db, worktreeId, cliToolId, resolvedInstanceId, 'prompt_detected', {
429
+ promptType: promptDetection.promptData?.type,
430
+ });
423
431
  // Web Push fan-out (Issue #1125): agent is now waiting for a prompt reply.
424
432
  // Fire-and-forget — push is advisory and must never block/break the poller.
425
433
  void (0, push_1.notifyPushSubscribers)({
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ /**
3
+ * In-memory record of the last structured "the agent stopped" event (#1549).
4
+ *
5
+ * The agent CLI telling us it stopped is a different kind of fact from the
6
+ * screen-scraped status: it is exact, but it only exists when someone wired a
7
+ * hook up. So this is kept beside the detector's output rather than folded into
8
+ * it — `buildCurrentOutput` exposes the timestamp, and nothing in the completion
9
+ * decision reads it yet. Phase 3-2 is deliberately observation only; swapping
10
+ * the wait/poller verdict from string matching to hook events before there is
11
+ * field data on how often hooks actually fire would trade a known failure mode
12
+ * for an unknown one.
13
+ *
14
+ * In-memory and not in SQLite for the same reason `auto-yes-state` is: the value
15
+ * describes a live tmux session, and a session does not survive a server restart
16
+ * for the timestamp to still be about.
17
+ *
18
+ * @module lib/session/agent-event-state
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.recordAgentStopEvent = recordAgentStopEvent;
22
+ exports.getLastStopEventAt = getLastStopEventAt;
23
+ exports.clearAgentStopEvents = clearAgentStopEvents;
24
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
25
+ /** compositeKey -> epoch ms of the most recent stop event. */
26
+ const lastStopEventAt = new Map();
27
+ /**
28
+ * Record that `instanceId` reported it stopped.
29
+ *
30
+ * @param at - Epoch ms; defaults to now. Passed explicitly by callers that need
31
+ * the stored value and their own record of the event to agree exactly.
32
+ */
33
+ function recordAgentStopEvent(worktreeId, cliToolId, instanceId, at = Date.now()) {
34
+ lastStopEventAt.set((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId), at);
35
+ }
36
+ /**
37
+ * @returns Epoch ms of the last stop event, or null when none has been received
38
+ * — which is the ordinary case for a session whose agent has no hook set up.
39
+ */
40
+ function getLastStopEventAt(worktreeId, cliToolId, instanceId) {
41
+ return lastStopEventAt.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
42
+ }
43
+ /** Drop every recorded event. Test seam. */
44
+ function clearAgentStopEvents() {
45
+ lastStopEventAt.clear();
46
+ }
@@ -15,6 +15,7 @@ const cli_session_1 = require("../../lib/session/cli-session");
15
15
  const status_detector_1 = require("../../lib/detection/status-detector");
16
16
  const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
17
17
  const status_capture_config_1 = require("../../config/status-capture-config");
18
+ const agent_event_state_1 = require("../../lib/session/agent-event-state");
18
19
  /**
19
20
  * Build the current-output payload for a worktree session.
20
21
  *
@@ -27,6 +28,7 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
27
28
  const resolvedInstanceId = instanceId ?? cliToolId;
28
29
  const manager = manager_1.CLIToolManager.getInstance();
29
30
  const cliTool = manager.getTool(cliToolId);
31
+ const stopEventAt = (0, agent_event_state_1.getLastStopEventAt)(worktreeId, cliToolId, instanceId);
30
32
  const running = await cliTool.isRunning(worktreeId, instanceId);
31
33
  if (!running) {
32
34
  return {
@@ -36,6 +38,7 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
36
38
  cliToolId,
37
39
  sessionStatus: 'idle',
38
40
  sessionStatusReason: 'session_not_running',
41
+ lastStopEventAt: stopEventAt,
39
42
  };
40
43
  }
41
44
  const sessionState = (0, db_1.getSessionState)(db, worktreeId, resolvedInstanceId);
@@ -91,5 +94,6 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
91
94
  isUnclassifiedActive,
92
95
  lastServerResponseTimestamp,
93
96
  serverPollerActive: (0, auto_yes_manager_1.isPollerActive)(compositeKey),
97
+ lastStopEventAt: stopEventAt,
94
98
  };
95
99
  }