commandmate 0.23.0 → 0.25.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 (688) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +415 -406
  3. package/.next/app-path-routes-manifest.json +27 -26
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +4 -4
  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 +2 -2
  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_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  48. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  49. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  51. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  52. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  54. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  55. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/push/escalation/route.js +1 -0
  59. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -0
  60. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -0
  61. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  62. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/push/vapid/route.js +1 -1
  64. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  65. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  68. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  70. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  72. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  73. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/repositories/clone/route.js +1 -1
  75. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/restore/route.js +1 -1
  79. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/route.js +1 -1
  82. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  83. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/repositories/scan/route.js +1 -1
  85. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  86. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/repositories/sync/route.js +1 -1
  88. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  89. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  100. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/todos/route.js +1 -1
  104. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  106. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/verification/runs/route.js +1 -1
  108. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  114. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  119. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  122. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +5 -5
  168. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  185. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  191. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  217. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  225. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/route.js +1 -1
  244. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/chat/page.js +2 -2
  247. package/.next/server/app/chat/page.js.nft.json +1 -1
  248. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/login/page.js +2 -2
  250. package/.next/server/app/login/page.js.nft.json +1 -1
  251. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  252. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/more/page.js +2 -2
  254. package/.next/server/app/more/page.js.nft.json +1 -1
  255. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  256. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  257. package/.next/server/app/page.js +1 -1
  258. package/.next/server/app/page.js.nft.json +1 -1
  259. package/.next/server/app/page_client-reference-manifest.js +1 -1
  260. package/.next/server/app/proxy/[...path]/route.js +1 -1
  261. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/repositories/page.js +2 -2
  263. package/.next/server/app/repositories/page.js.nft.json +1 -1
  264. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  265. package/.next/server/app/review/page.js +1 -1
  266. package/.next/server/app/review/page.js.nft.json +1 -1
  267. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  268. package/.next/server/app/sessions/page.js +1 -1
  269. package/.next/server/app/sessions/page.js.nft.json +1 -1
  270. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/skills/[skillId]/page.js +2 -2
  272. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  273. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/skills/installed/page.js +2 -2
  275. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  276. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/skills/page.js +2 -2
  278. package/.next/server/app/skills/page.js.nft.json +1 -1
  279. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  281. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  282. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/worktrees/[id]/page.js +7 -7
  284. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  285. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  287. package/.next/server/app-paths-manifest.json +27 -26
  288. package/.next/server/chunks/1029.js +1 -1
  289. package/.next/server/chunks/1296.js +1 -1
  290. package/.next/server/chunks/1366.js +1 -1
  291. package/.next/server/chunks/1601.js +7 -0
  292. package/.next/server/chunks/1825.js +1 -1
  293. package/.next/server/chunks/2119.js +1 -1
  294. package/.next/server/chunks/2404.js +1 -1
  295. package/.next/server/chunks/2445.js +1 -1
  296. package/.next/server/chunks/2546.js +1 -1
  297. package/.next/server/chunks/3346.js +1 -1
  298. package/.next/server/chunks/3417.js +1 -1
  299. package/.next/server/chunks/3480.js +1 -1
  300. package/.next/server/chunks/3543.js +1 -1
  301. package/.next/server/chunks/3945.js +1 -1
  302. package/.next/server/chunks/4393.js +1 -0
  303. package/.next/server/chunks/4444.js +1 -1
  304. package/.next/server/chunks/4455.js +1 -0
  305. package/.next/server/chunks/5164.js +1 -0
  306. package/.next/server/chunks/5571.js +1 -1
  307. package/.next/server/chunks/5959.js +5 -5
  308. package/.next/server/chunks/5998.js +1 -1
  309. package/.next/server/chunks/6130.js +1 -1
  310. package/.next/server/chunks/6159.js +1 -1
  311. package/.next/server/chunks/6274.js +2 -2
  312. package/.next/server/chunks/6285.js +1 -1
  313. package/.next/server/chunks/6401.js +1 -1
  314. package/.next/server/chunks/7458.js +5 -5
  315. package/.next/server/chunks/848.js +1 -1
  316. package/.next/server/chunks/8536.js +1 -1
  317. package/.next/server/chunks/8730.js +1 -0
  318. package/.next/server/chunks/880.js +21 -0
  319. package/.next/server/chunks/8807.js +134 -129
  320. package/.next/server/chunks/9058.js +1 -1
  321. package/.next/server/chunks/9123.js +8 -8
  322. package/.next/server/chunks/9328.js +1 -1
  323. package/.next/server/chunks/9358.js +1 -1
  324. package/.next/server/chunks/9373.js +3 -3
  325. package/.next/server/chunks/9687.js +1 -1
  326. package/.next/server/middleware-build-manifest.js +1 -1
  327. package/.next/server/middleware-manifest.json +5 -5
  328. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  329. package/.next/server/pages/500.html +1 -1
  330. package/.next/server/pages-manifest.json +1 -1
  331. package/.next/server/server-reference-manifest.json +1 -1
  332. package/.next/static/chunks/2053-dfac2d49227cc942.js +1 -0
  333. package/.next/static/chunks/3898-ef488bfa804507d9.js +1 -0
  334. package/.next/static/chunks/4322-dfd5a7119b5ba4fc.js +1 -0
  335. package/.next/static/chunks/{4974-eaf66770bfa9dea0.js → 4974-35592ec312322124.js} +1 -1
  336. package/.next/static/chunks/5229-35f9acab97a553c5.js +1 -0
  337. package/.next/static/chunks/6381-51f9c4a128aadc0b.js +1 -0
  338. package/.next/static/chunks/7229.7f0f5a7032b612b4.js +1 -0
  339. package/.next/static/chunks/{9599-d29d2f8eeaf7c249.js → 8649-f551b0010dba4986.js} +1 -1
  340. package/.next/static/chunks/9263.f2034ec525abcf72.js +1 -0
  341. package/.next/static/chunks/app/api/app/update/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  342. package/.next/static/chunks/app/api/app/update-check/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  343. package/.next/static/chunks/app/api/assistant/conversation/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  344. package/.next/static/chunks/app/api/assistant/current-output/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  345. package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +1 -0
  346. package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +1 -0
  347. package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +1 -0
  348. package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +1 -0
  349. package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +1 -0
  350. package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +1 -0
  351. package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +1 -0
  352. package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +1 -0
  353. package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +1 -0
  354. package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +1 -0
  355. package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +1 -0
  356. package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +1 -0
  357. package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +1 -0
  358. package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +1 -0
  359. package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +1 -0
  360. package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +1 -0
  361. package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +1 -0
  362. package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +1 -0
  363. package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +1 -0
  364. package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +1 -0
  365. package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +1 -0
  366. package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +1 -0
  367. package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +1 -0
  368. package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +1 -0
  369. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
  370. package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
  371. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +1 -0
  372. package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +1 -0
  373. package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +1 -0
  374. package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +1 -0
  375. package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +1 -0
  376. package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +1 -0
  377. package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +1 -0
  378. package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +1 -0
  379. package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +1 -0
  380. package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +1 -0
  381. package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +1 -0
  382. package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +1 -0
  383. package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +1 -0
  384. package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +1 -0
  385. package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
  386. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +1 -0
  387. package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +1 -0
  388. package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +1 -0
  389. package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +1 -0
  390. package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +1 -0
  391. package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
  392. package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +1 -0
  465. package/.next/static/chunks/app/chat/page-439b35c9cb90dbe0.js +1 -0
  466. package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +1 -0
  467. package/.next/static/chunks/app/login/page-eefd515d8c37e5ee.js +1 -0
  468. package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +1 -0
  469. package/.next/static/chunks/app/more/page-889b7546a8a553dc.js +1 -0
  470. package/.next/static/chunks/app/page-a8d04ac0e3e4c9fc.js +1 -0
  471. package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  472. package/.next/static/chunks/app/repositories/page-f3c4d8839b1ca203.js +1 -0
  473. package/.next/static/chunks/app/review/page-6dc88649fe88ac16.js +1 -0
  474. package/.next/static/chunks/app/sessions/page-2c9ed9e969097688.js +1 -0
  475. package/.next/static/chunks/app/skills/[skillId]/page-19beef6121c4c982.js +1 -0
  476. package/.next/static/chunks/app/skills/installed/page-d5b9cef6d21fabda.js +1 -0
  477. package/.next/static/chunks/app/skills/page-06ef637e07dd9377.js +1 -0
  478. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-5fed3984fafcd910.js +1 -0
  479. package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +1 -0
  480. package/.next/static/chunks/app/worktrees/[id]/page-207c69540fd856ef.js +1 -0
  481. package/.next/static/chunks/{webpack-180bebdee221b6f4.js → webpack-9d892a9ff07c289d.js} +1 -1
  482. package/.next/static/css/e865c4979a41aa03.css +1 -0
  483. package/.next/static/ehkNc5xDMDkXlua08Bwq0/_buildManifest.js +1 -0
  484. package/.next/trace +12 -12
  485. package/.next/types/app/api/push/escalation/route.ts +347 -0
  486. package/.next/types/routes.d.ts +2 -1
  487. package/.next/types/validator.ts +9 -0
  488. package/README.md +96 -45
  489. package/dist/cli/commands/capture.d.ts.map +1 -1
  490. package/dist/cli/commands/capture.js +6 -0
  491. package/dist/cli/commands/instances.d.ts.map +1 -1
  492. package/dist/cli/commands/instances.js +19 -1
  493. package/dist/cli/commands/task.d.ts.map +1 -1
  494. package/dist/cli/commands/task.js +6 -0
  495. package/dist/cli/commands/verify.js +6 -1
  496. package/dist/cli/types/api-responses.d.ts +46 -0
  497. package/dist/cli/types/api-responses.d.ts.map +1 -1
  498. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  499. package/dist/cli/utils/verify-runner.js +17 -1
  500. package/dist/server/locales/en/notifications.json +20 -1
  501. package/dist/server/locales/ja/notifications.json +20 -1
  502. package/dist/server/server.js +23 -0
  503. package/dist/server/src/config/activity-bar-config.js +5 -1
  504. package/dist/server/src/lib/auto-yes-poller.js +40 -4
  505. package/dist/server/src/lib/cli-tools/codex.js +58 -29
  506. package/dist/server/src/lib/db/db.js +2 -1
  507. package/dist/server/src/lib/db/migrations/index.js +2 -0
  508. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  509. package/dist/server/src/lib/db/migrations/v56-gate-result-source.js +58 -0
  510. package/dist/server/src/lib/db/verification-db.js +26 -6
  511. package/dist/server/src/lib/detection/cli-patterns.js +148 -6
  512. package/dist/server/src/lib/detection/model-info-extractor.js +384 -0
  513. package/dist/server/src/lib/detection/status-detector.js +28 -0
  514. package/dist/server/src/lib/hooks/sources/antigravity/source.js +4 -0
  515. package/dist/server/src/lib/hooks/sources/claude/source.js +7 -0
  516. package/dist/server/src/lib/hooks/sources/codex/source.js +5 -0
  517. package/dist/server/src/lib/hooks/sources/define-source.js +8 -0
  518. package/dist/server/src/lib/hooks/sources/event-mapper.js +20 -0
  519. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
  520. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +22 -0
  521. package/dist/server/src/lib/hooks/sources/opencode/source.js +3 -0
  522. package/dist/server/src/lib/polling/response-checker.js +47 -0
  523. package/dist/server/src/lib/push/escalation-settings.js +114 -0
  524. package/dist/server/src/lib/push/index.js +21 -1
  525. package/dist/server/src/lib/push/notification-dedup.js +35 -0
  526. package/dist/server/src/lib/push/push-sender.js +66 -7
  527. package/dist/server/src/lib/push/waiting-push-notifier.js +231 -0
  528. package/dist/server/src/lib/realtime/waiting-broadcast.js +93 -0
  529. package/dist/server/src/lib/session/agent-event-state.js +260 -0
  530. package/dist/server/src/lib/session/current-output-builder.js +24 -0
  531. package/dist/server/src/lib/session/next-action-helper.js +93 -0
  532. package/dist/server/src/lib/session/prompt-waiting-composition.js +38 -0
  533. package/dist/server/src/lib/session/waiting-episode-state.js +136 -0
  534. package/dist/server/src/lib/session/waiting-kind.js +59 -0
  535. package/dist/server/src/lib/tasks/contract-message.js +64 -21
  536. package/dist/server/src/lib/tasks/contract-parser.js +58 -12
  537. package/dist/server/src/lib/verification/gate-runner.js +64 -22
  538. package/dist/server/src/lib/verification/verify-config.js +84 -51
  539. package/dist/server/src/lib/ws-server.js +9 -0
  540. package/dist/server/src/types/sidebar.js +68 -0
  541. package/package.json +1 -1
  542. package/.next/server/chunks/3451.js +0 -1
  543. package/.next/server/chunks/6283.js +0 -1
  544. package/.next/server/chunks/646.js +0 -21
  545. package/.next/static/chunks/2053-52d3c82014e1cd54.js +0 -1
  546. package/.next/static/chunks/4560-0917ae2e6a0e5400.js +0 -1
  547. package/.next/static/chunks/6488-95ba9d24a76f0cc5.js +0 -1
  548. package/.next/static/chunks/7229.edb331fb9fbafa27.js +0 -1
  549. package/.next/static/chunks/744-fa8c0ae444c8338c.js +0 -1
  550. package/.next/static/chunks/9263.5259f73f89220d64.js +0 -1
  551. package/.next/static/chunks/app/api/assistant/messages/route-973ec48531555712.js +0 -1
  552. package/.next/static/chunks/app/api/assistant/session/route-973ec48531555712.js +0 -1
  553. package/.next/static/chunks/app/api/assistant/start/route-973ec48531555712.js +0 -1
  554. package/.next/static/chunks/app/api/assistant/terminal/route-973ec48531555712.js +0 -1
  555. package/.next/static/chunks/app/api/assistant/tools/route-973ec48531555712.js +0 -1
  556. package/.next/static/chunks/app/api/auth/login/route-973ec48531555712.js +0 -1
  557. package/.next/static/chunks/app/api/auth/logout/route-973ec48531555712.js +0 -1
  558. package/.next/static/chunks/app/api/auth/status/route-973ec48531555712.js +0 -1
  559. package/.next/static/chunks/app/api/daily-summary/route-973ec48531555712.js +0 -1
  560. package/.next/static/chunks/app/api/daily-summary/status/route-973ec48531555712.js +0 -1
  561. package/.next/static/chunks/app/api/external-apps/[id]/health/route-973ec48531555712.js +0 -1
  562. package/.next/static/chunks/app/api/external-apps/[id]/route-973ec48531555712.js +0 -1
  563. package/.next/static/chunks/app/api/external-apps/route-973ec48531555712.js +0 -1
  564. package/.next/static/chunks/app/api/fs/browse/route-973ec48531555712.js +0 -1
  565. package/.next/static/chunks/app/api/fs/recent-paths/route-973ec48531555712.js +0 -1
  566. package/.next/static/chunks/app/api/hooks/agent-event/route-973ec48531555712.js +0 -1
  567. package/.next/static/chunks/app/api/hooks/claude-done/route-973ec48531555712.js +0 -1
  568. package/.next/static/chunks/app/api/hooks/permission-request/route-973ec48531555712.js +0 -1
  569. package/.next/static/chunks/app/api/metrics/vibe/route-973ec48531555712.js +0 -1
  570. package/.next/static/chunks/app/api/ollama/models/route-973ec48531555712.js +0 -1
  571. package/.next/static/chunks/app/api/push/subscriptions/route-973ec48531555712.js +0 -1
  572. package/.next/static/chunks/app/api/push/vapid/route-973ec48531555712.js +0 -1
  573. package/.next/static/chunks/app/api/repositories/[id]/route-973ec48531555712.js +0 -1
  574. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
  575. package/.next/static/chunks/app/api/repositories/[id]/todos/route-973ec48531555712.js +0 -1
  576. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-973ec48531555712.js +0 -1
  577. package/.next/static/chunks/app/api/repositories/clone/route-973ec48531555712.js +0 -1
  578. package/.next/static/chunks/app/api/repositories/excluded/route-973ec48531555712.js +0 -1
  579. package/.next/static/chunks/app/api/repositories/restore/route-973ec48531555712.js +0 -1
  580. package/.next/static/chunks/app/api/repositories/route-973ec48531555712.js +0 -1
  581. package/.next/static/chunks/app/api/repositories/scan/route-973ec48531555712.js +0 -1
  582. package/.next/static/chunks/app/api/repositories/sync/route-973ec48531555712.js +0 -1
  583. package/.next/static/chunks/app/api/repositories/validate-path/route-973ec48531555712.js +0 -1
  584. package/.next/static/chunks/app/api/sidebar/group-order/route-973ec48531555712.js +0 -1
  585. package/.next/static/chunks/app/api/skills/[id]/route-973ec48531555712.js +0 -1
  586. package/.next/static/chunks/app/api/skills/installations/route-973ec48531555712.js +0 -1
  587. package/.next/static/chunks/app/api/skills/operations/route-973ec48531555712.js +0 -1
  588. package/.next/static/chunks/app/api/skills/reindex/route-973ec48531555712.js +0 -1
  589. package/.next/static/chunks/app/api/skills/route-973ec48531555712.js +0 -1
  590. package/.next/static/chunks/app/api/slash-commands/route-973ec48531555712.js +0 -1
  591. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-973ec48531555712.js +0 -1
  592. package/.next/static/chunks/app/api/tasks/[taskId]/route-973ec48531555712.js +0 -1
  593. package/.next/static/chunks/app/api/templates/[id]/route-973ec48531555712.js +0 -1
  594. package/.next/static/chunks/app/api/templates/route-973ec48531555712.js +0 -1
  595. package/.next/static/chunks/app/api/todos/route-973ec48531555712.js +0 -1
  596. package/.next/static/chunks/app/api/verification/runs/[runId]/route-973ec48531555712.js +0 -1
  597. package/.next/static/chunks/app/api/verification/runs/route-973ec48531555712.js +0 -1
  598. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-973ec48531555712.js +0 -1
  599. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-973ec48531555712.js +0 -1
  600. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-973ec48531555712.js +0 -1
  601. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-973ec48531555712.js +0 -1
  602. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-973ec48531555712.js +0 -1
  603. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-973ec48531555712.js +0 -1
  604. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-973ec48531555712.js +0 -1
  605. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-973ec48531555712.js +0 -1
  606. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-973ec48531555712.js +0 -1
  607. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-973ec48531555712.js +0 -1
  608. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-973ec48531555712.js +0 -1
  609. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-973ec48531555712.js +0 -1
  610. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-973ec48531555712.js +0 -1
  611. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-973ec48531555712.js +0 -1
  612. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-973ec48531555712.js +0 -1
  613. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-973ec48531555712.js +0 -1
  614. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-973ec48531555712.js +0 -1
  615. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-973ec48531555712.js +0 -1
  616. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-973ec48531555712.js +0 -1
  617. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-973ec48531555712.js +0 -1
  618. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-973ec48531555712.js +0 -1
  619. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-973ec48531555712.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-973ec48531555712.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-973ec48531555712.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-973ec48531555712.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-973ec48531555712.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-973ec48531555712.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-973ec48531555712.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-973ec48531555712.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-973ec48531555712.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-973ec48531555712.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-973ec48531555712.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-973ec48531555712.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-973ec48531555712.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-973ec48531555712.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-973ec48531555712.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-973ec48531555712.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-973ec48531555712.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-973ec48531555712.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-973ec48531555712.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-973ec48531555712.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/route-973ec48531555712.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-973ec48531555712.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-973ec48531555712.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-973ec48531555712.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/search/route-973ec48531555712.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/send/route-973ec48531555712.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-973ec48531555712.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-973ec48531555712.js +0 -1
  647. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-973ec48531555712.js +0 -1
  648. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-973ec48531555712.js +0 -1
  649. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-973ec48531555712.js +0 -1
  650. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-973ec48531555712.js +0 -1
  651. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-973ec48531555712.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-973ec48531555712.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-973ec48531555712.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-973ec48531555712.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-973ec48531555712.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-973ec48531555712.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-973ec48531555712.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-973ec48531555712.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-973ec48531555712.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-973ec48531555712.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-973ec48531555712.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-973ec48531555712.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-973ec48531555712.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-973ec48531555712.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-973ec48531555712.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-973ec48531555712.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-973ec48531555712.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/route-973ec48531555712.js +0 -1
  670. package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +0 -1
  671. package/.next/static/chunks/app/layout-86574192bd3c0e6b.js +0 -1
  672. package/.next/static/chunks/app/login/page-0247a3fb569bb22b.js +0 -1
  673. package/.next/static/chunks/app/manifest.webmanifest/route-973ec48531555712.js +0 -1
  674. package/.next/static/chunks/app/more/page-1619018cac999bbc.js +0 -1
  675. package/.next/static/chunks/app/page-a34d26812f085b6c.js +0 -1
  676. package/.next/static/chunks/app/proxy/[...path]/route-973ec48531555712.js +0 -1
  677. package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +0 -1
  678. package/.next/static/chunks/app/review/page-b559bfb11c46931b.js +0 -1
  679. package/.next/static/chunks/app/sessions/page-3fa7e767d0ab3889.js +0 -1
  680. package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +0 -1
  681. package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +0 -1
  682. package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +0 -1
  683. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-6041d3c3db326317.js +0 -1
  684. package/.next/static/chunks/app/worktrees/[id]/layout-973ec48531555712.js +0 -1
  685. package/.next/static/chunks/app/worktrees/[id]/page-966a451ae7b0903a.js +0 -1
  686. package/.next/static/css/d3453a6876553d32.css +0 -1
  687. package/.next/static/wH6K6QNPHSdATFkVoIcy3/_buildManifest.js +0 -1
  688. /package/.next/static/{wH6K6QNPHSdATFkVoIcy3 → ehkNc5xDMDkXlua08Bwq0}/_ssgManifest.js +0 -0
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * When each agent instance started waiting, and the one place that edge is
4
+ * observed (Issue #1786).
5
+ *
6
+ * `isWaitingForResponse` is a level, and every question the display Issues ask
7
+ * is about the *edge*: #1787 wants "waiting for how long", #1788 wants to push a
8
+ * WebSocket frame the instant it flips, #1790 wants to fire a push notification
9
+ * on the same instant and not on the 200 polls that follow. A level cannot
10
+ * answer any of those, and three surfaces each keeping their own "was it waiting
11
+ * last time?" would be three chances to disagree about when a wait began.
12
+ *
13
+ * So the edge is detected exactly once, here, by {@link observeWaitingEdge}, and
14
+ * everything else either reads {@link getWaitingEpisode} or subscribes with
15
+ * {@link onWaitingTransition}. There is one caller today —
16
+ * `worktree-status-helper`, on the list API's per-instance probe — and it passes
17
+ * the *composed* verdict (scraper OR structured), so a wait that only the
18
+ * agent's own events can see opens an episode exactly like one the screen
19
+ * scraper read.
20
+ *
21
+ * ## Where #1788 / #1790 plug in
22
+ *
23
+ * `onWaitingTransition(listener)` — the listener receives every false→true and
24
+ * true→false crossing, with the instance it belongs to, the episode's `since`
25
+ * and its {@link WaitingKind}. #1788 broadcasts it (`broadcastToWorktree`),
26
+ * #1790 decides whether to send a push. Neither needs to touch this module's
27
+ * internals, and neither can move the timestamps the other reports.
28
+ *
29
+ * Listeners are called synchronously, inside the request that observed the edge,
30
+ * because the point of the seam is immediacy. A listener that throws is
31
+ * contained: this store is on the list API's hot path, and a broken notification
32
+ * sink must not take the status read down with it.
33
+ *
34
+ * In-memory (via `globalThis`, per Issue #1736 — see the note in
35
+ * `agent-event-state`) rather than SQLite, for the same reason the structured
36
+ * state is: it describes a live tmux session, and a wait does not outlive the
37
+ * server process that observed it.
38
+ *
39
+ * @module lib/session/waiting-episode-state
40
+ */
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.onWaitingTransition = onWaitingTransition;
43
+ exports.observeWaitingEdge = observeWaitingEdge;
44
+ exports.getWaitingEpisode = getWaitingEpisode;
45
+ exports.clearWaitingEpisodes = clearWaitingEpisodes;
46
+ exports.clearWaitingTransitionListeners = clearWaitingTransitionListeners;
47
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
48
+ const logger_1 = require("../../lib/logger");
49
+ const logger = (0, logger_1.createLogger)('waiting-episode-state');
50
+ /** compositeKey -> the wait currently in progress for that instance. */
51
+ const episodes = globalThis.__sessionWaitingEpisodes ??
52
+ (globalThis.__sessionWaitingEpisodes = new Map());
53
+ /** Subscribers to the edge. See the module docblock. */
54
+ const listeners = globalThis.__sessionWaitingTransitionListeners ??
55
+ (globalThis.__sessionWaitingTransitionListeners = new Set());
56
+ /**
57
+ * Subscribe to waiting edges.
58
+ *
59
+ * @returns An unsubscribe function. Idempotent — calling it twice is harmless.
60
+ */
61
+ function onWaitingTransition(listener) {
62
+ listeners.add(listener);
63
+ return () => {
64
+ listeners.delete(listener);
65
+ };
66
+ }
67
+ /** Notify subscribers, containing anything they throw. */
68
+ function emit(transition) {
69
+ for (const listener of listeners) {
70
+ try {
71
+ listener(transition);
72
+ }
73
+ catch (error) {
74
+ logger.error('waiting-transition-listener-failed', {
75
+ worktreeId: transition.worktreeId,
76
+ cliToolId: transition.cliToolId,
77
+ instanceId: transition.instanceId ?? transition.cliToolId,
78
+ waiting: transition.waiting,
79
+ error: error instanceof Error ? error.message : String(error),
80
+ });
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Record this poll's waiting verdict and answer when the current wait began.
86
+ *
87
+ * The single writer of the edge, by design (Issue #1786). Idempotent for a
88
+ * level that has not changed: repeated `waiting: true` polls return the same
89
+ * `since` and emit nothing, so a listener hears one event per wait rather than
90
+ * one per poll.
91
+ *
92
+ * @returns The episode's `since` while waiting, or null when it is not.
93
+ */
94
+ function observeWaitingEdge({ worktreeId, cliToolId, instanceId, waiting, kind = null, structuredSince = null, now = Date.now(), }) {
95
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
96
+ const existing = episodes.get(key);
97
+ if (!waiting) {
98
+ if (existing === undefined)
99
+ return null;
100
+ episodes.delete(key);
101
+ emit({ worktreeId, cliToolId, instanceId, waiting: false, since: null, kind: null, at: now });
102
+ return null;
103
+ }
104
+ if (existing !== undefined) {
105
+ // A wait can change character without ending — a permission dialog answered
106
+ // into a selection list is still one uninterrupted wait — so the kind is
107
+ // refreshed while `since` stays put.
108
+ existing.kind = kind;
109
+ return existing.since;
110
+ }
111
+ const since = structuredSince ?? now;
112
+ episodes.set(key, { since, kind });
113
+ emit({ worktreeId, cliToolId, instanceId, waiting: true, since, kind, at: now });
114
+ return since;
115
+ }
116
+ /**
117
+ * @returns The wait in progress for this instance, or null when it is not
118
+ * waiting. Read-only: observing the edge is {@link observeWaitingEdge}'s job.
119
+ */
120
+ function getWaitingEpisode(worktreeId, cliToolId, instanceId) {
121
+ return episodes.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
122
+ }
123
+ /**
124
+ * Drop every episode. Test seam.
125
+ *
126
+ * CI runs with `fileParallelism: false`, so one process holds this map for the
127
+ * whole suite: a test that opens an episode and does not clear it hands the next
128
+ * file a session that is already waiting.
129
+ */
130
+ function clearWaitingEpisodes() {
131
+ episodes.clear();
132
+ }
133
+ /** Drop every subscriber. Test seam, paired with {@link clearWaitingEpisodes}. */
134
+ function clearWaitingTransitionListeners() {
135
+ listeners.clear();
136
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * What *kind* of waiting a session is in (Issue #1786).
4
+ *
5
+ * `isWaitingForResponse` answers "does this session need a human?" and nothing
6
+ * else, so every surface that shows it has to render one orange dot for three
7
+ * situations a user would act on differently:
8
+ *
9
+ * - a y/n or numbered prompt the app itself can answer for them (`prompt`);
10
+ * - a selection list or a pager, which only the terminal can drive (`menu`);
11
+ * - a dialog only the agent's own events reported, or a frame neither layer
12
+ * could classify (`unclassified`).
13
+ *
14
+ * Kept a pure function of the detector's verdict — no clock, no store, no tmux —
15
+ * because it is the one piece of #1786 that the display Issues (#1787/#1788)
16
+ * will read literally and therefore the one piece that has to be pinned by unit
17
+ * tests rather than by a live session.
18
+ *
19
+ * @module lib/session/waiting-kind
20
+ */
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.deriveWaitingKind = deriveWaitingKind;
23
+ const status_detector_1 = require("../../lib/detection/status-detector");
24
+ /**
25
+ * Classify a waiting session, or answer null when it is not waiting.
26
+ *
27
+ * The order is a precedence, not a sequence of independent tests: a frame that
28
+ * carries an answerable prompt is a `prompt` even if the reason string would
29
+ * also pass the menu test, because "you can answer this from the app" is the
30
+ * more actionable fact.
31
+ *
32
+ * | condition | kind |
33
+ * |--------------------------------------------------|------------------|
34
+ * | not waiting | `null` |
35
+ * | `hasActivePrompt` | `'prompt'` |
36
+ * | scraper `waiting` + a {@link SELECTION_LIST_REASONS} reason | `'menu'` |
37
+ * | anything else that is still waiting | `'unclassified'` |
38
+ *
39
+ * The `menu` row is the same expression `current-output-builder` publishes as
40
+ * `isSelectionListActive`, and the pager (`codex_pager`) is a member of that set
41
+ * — so the pager lands in `menu` for the reason the Issue asks for, without a
42
+ * second copy of the membership test.
43
+ *
44
+ * `unclassified` is the honest fallback rather than a fourth guess. In practice
45
+ * it is reached when only the structured layer sees the dialog: every scraper
46
+ * `waiting` verdict is either `prompt_detected` (→ `prompt`) or a selection-list
47
+ * reason (→ `menu`), so a waiting session the scraper never classified is one it
48
+ * could not read at all.
49
+ */
50
+ function deriveWaitingKind(input) {
51
+ if (!input.waiting)
52
+ return null;
53
+ if (input.hasActivePrompt)
54
+ return 'prompt';
55
+ if (input.scraperStatus === 'waiting' && status_detector_1.SELECTION_LIST_REASONS.has(input.scraperReason)) {
56
+ return 'menu';
57
+ }
58
+ return 'unclassified';
59
+ }
@@ -18,6 +18,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.REQUIRE_COMMIT_SOURCE_CONTRACT = exports.REQUIRE_COMMIT_SOURCE_CONFIG = void 0;
19
19
  exports.resolveRequireCommit = resolveRequireCommit;
20
20
  exports.resolveContractGateIds = resolveContractGateIds;
21
+ exports.contractGateDefinitions = contractGateDefinitions;
21
22
  exports.validateContractAgainstVerifyConfig = validateContractAgainstVerifyConfig;
22
23
  exports.resolveGateCommands = resolveGateCommands;
23
24
  exports.composeContractMessage = composeContractMessage;
@@ -88,37 +89,75 @@ function resolveContractGateIds(contract) {
88
89
  return [...selected, ...rest];
89
90
  }
90
91
  /**
91
- * Check that every gate the contract names can actually be resolved.
92
+ * The gates this contract defines itself (#1791).
93
+ *
94
+ * Read through a helper because `contract` also arrives from
95
+ * `tasks.contract_json`, and a row written before the field existed parses back
96
+ * as `undefined` rather than an empty list. Every consumer reads it here so
97
+ * "an old task" and "a task that defines no gates" cannot behave differently.
98
+ */
99
+ function contractGateDefinitions(contract) {
100
+ return contract.verify.gateDefinitions ?? [];
101
+ }
102
+ /**
103
+ * Check that the contract's gates can actually be resolved, and that its own
104
+ * definitions do not collide with the repository's.
92
105
  *
93
106
  * A contract pointing at a gate id that does not exist would only be caught at
94
107
  * verification time, by which point the agent has already been told a
95
108
  * completion criterion that cannot be evaluated. Reporting it here makes
96
109
  * "the contract was accepted" and "the contract's gates exist" the same moment.
97
110
  *
111
+ * The collision check is the same discipline pointed the other way (#1791). A
112
+ * contract that redefined an id `.commandmate/verify.yaml` already declares
113
+ * would replace the repository's own definition of passing with one written per
114
+ * delegation — silently, since both spell the same id in the report. Reserved
115
+ * ids (`work-evidence` / `scope` / `env-clean`) are refused one step earlier, by
116
+ * the shared gate validator in the parser; both refusals happen at send.
117
+ *
98
118
  * @returns issue strings, empty when the contract resolves cleanly
99
119
  */
100
120
  function validateContractAgainstVerifyConfig(contract, config) {
101
121
  const gates = contract.verify.gates;
102
- if (!gates)
103
- return [];
122
+ const definitions = contractGateDefinitions(contract);
123
+ const issues = [];
104
124
  if (!config) {
105
- return [
106
- `verify.gates: declared ${gates.join(', ')}, but ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH} ` +
107
- 'is missing or unreadable in this worktree, so the gate ids cannot be resolved',
108
- ];
125
+ // Fail-closed for definitions too: the runner refuses to start a run at all
126
+ // without a config, so accepting the contract would promise a criterion that
127
+ // can never be evaluated the exact thing this function exists to prevent.
128
+ if (definitions.length > 0) {
129
+ issues.push(`verify.gateDefinitions: declared ${definitions.map((gate) => gate.id).join(', ')}, ` +
130
+ `but ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH} is missing or unreadable in this worktree, ` +
131
+ 'so no verification run can execute them');
132
+ }
133
+ if (gates) {
134
+ issues.push(`verify.gates: declared ${gates.join(', ')}, but ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH} ` +
135
+ 'is missing or unreadable in this worktree, so the gate ids cannot be resolved');
136
+ }
137
+ return issues;
109
138
  }
110
- const known = new Set([
111
- verify_config_1.WORK_EVIDENCE_GATE_ID,
112
- verify_config_1.SCOPE_GATE_ID,
113
- ...config.gates.map((gate) => gate.id),
114
- ]);
115
- const unknown = gates.filter((id) => !known.has(id));
116
- if (unknown.length === 0)
117
- return [];
118
- return [
119
- `verify.gates: unknown gate id(s) ${unknown.join(', ')}. ` +
120
- `Declared in ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}: ${[...known].join(', ')}`,
121
- ];
139
+ const configIds = config.gates.map((gate) => gate.id);
140
+ const collisions = definitions
141
+ .map((gate) => gate.id)
142
+ .filter((id) => configIds.includes(id));
143
+ if (collisions.length > 0) {
144
+ issues.push(`verify.gateDefinitions: gate id(s) ${collisions.join(', ')} are already declared in ` +
145
+ `${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}. A contract may add gates, never redefine the ` +
146
+ "repository's own — rename the contract gate.");
147
+ }
148
+ if (gates) {
149
+ const known = new Set([verify_config_1.WORK_EVIDENCE_GATE_ID, verify_config_1.SCOPE_GATE_ID, ...configIds]);
150
+ const defined = new Set(definitions.map((gate) => gate.id));
151
+ const unknown = gates.filter((id) => !known.has(id) && !defined.has(id));
152
+ if (unknown.length > 0) {
153
+ const sources = [`Declared in ${verify_config_1.VERIFY_CONFIG_RELATIVE_PATH}: ${[...known].join(', ')}`];
154
+ if (defined.size > 0) {
155
+ sources.push(`in verify.gateDefinitions: ${[...defined].join(', ')}`);
156
+ }
157
+ issues.push(`verify.gates: unknown gate id(s) ${unknown.join(', ')}. ${sources.join('; ')}`);
158
+ }
159
+ }
160
+ return issues;
122
161
  }
123
162
  /**
124
163
  * The commands the contract's gates will run, in the order they will run.
@@ -136,6 +175,10 @@ function resolveGateCommands(contract, config) {
136
175
  [verify_config_1.WORK_EVIDENCE_GATE_ID, workEvidenceLabel],
137
176
  [verify_config_1.SCOPE_GATE_ID, SCOPE_LABEL],
138
177
  ]);
178
+ // Contract-defined gates run after the repository's own, so the preamble
179
+ // lists them in that order too — the line claims to be "the commands that
180
+ // will run", and an order it invents would be the first thing to drift.
181
+ const declared = [...config.gates, ...contractGateDefinitions(contract)];
139
182
  const selected = resolveContractGateIds(contract);
140
183
  if (!selected) {
141
184
  // An omitted gates list runs every gate, and the built-ins are still governed
@@ -143,9 +186,9 @@ function resolveGateCommands(contract, config) {
143
186
  const builtIns = [workEvidenceLabel];
144
187
  if (contract.success.requireScopeClean)
145
188
  builtIns.push(SCOPE_LABEL);
146
- return [...builtIns, ...config.gates.map((gate) => gate.command)];
189
+ return [...builtIns, ...declared.map((gate) => gate.command)];
147
190
  }
148
- const byId = new Map(config.gates.map((gate) => [gate.id, gate.command]));
191
+ const byId = new Map(declared.map((gate) => [gate.id, gate.command]));
149
192
  return selected.map((id) => builtInLabels.get(id) ?? byId.get(id));
150
193
  }
151
194
  /**
@@ -23,13 +23,14 @@
23
23
  * @module lib/tasks/contract-parser
24
24
  */
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.TaskContractError = exports.MAX_ALLOW_PROMPT_TYPES = exports.MAX_DENY_PATTERNS = exports.MAX_GATE_IDS = exports.MAX_SCOPE_PATTERNS = exports.MAX_PATTERN_LENGTH = exports.MAX_GOAL_LENGTH = exports.MAX_TITLE_LENGTH = exports.PROMPT_TYPES = exports.AUTO_YES_MODES = exports.TASK_CONTRACT_DIR = void 0;
26
+ exports.TaskContractError = exports.MAX_ALLOW_PROMPT_TYPES = exports.MAX_DENY_PATTERNS = exports.MAX_GATE_DEFINITIONS = exports.MAX_GATE_IDS = exports.MAX_SCOPE_PATTERNS = exports.MAX_PATTERN_LENGTH = exports.MAX_GOAL_LENGTH = exports.MAX_TITLE_LENGTH = exports.PROMPT_TYPES = exports.AUTO_YES_MODES = exports.TASK_CONTRACT_DIR = void 0;
27
27
  exports.parseTaskContract = parseTaskContract;
28
28
  exports.loadTaskContract = loadTaskContract;
29
29
  const fs_1 = require("fs");
30
30
  const path_1 = require("path");
31
31
  const yaml_1 = require("yaml");
32
32
  const path_validator_1 = require("../../lib/security/path-validator");
33
+ const verify_config_1 = require("../../lib/verification/verify-config");
33
34
  /** Directory contracts live in, relative to the worktree root. */
34
35
  exports.TASK_CONTRACT_DIR = '.commandmate/tasks';
35
36
  /**
@@ -63,11 +64,13 @@ exports.MAX_GOAL_LENGTH = 8000;
63
64
  exports.MAX_PATTERN_LENGTH = 200;
64
65
  exports.MAX_SCOPE_PATTERNS = 200;
65
66
  exports.MAX_GATE_IDS = 32;
67
+ /** Matches {@link MAX_GATE_IDS}: a contract cannot select more gates than it may define. */
68
+ exports.MAX_GATE_DEFINITIONS = 32;
66
69
  exports.MAX_DENY_PATTERNS = 32;
67
70
  exports.MAX_ALLOW_PROMPT_TYPES = 16;
68
71
  const TOP_LEVEL_KEYS = ['version', 'title', 'goal', 'scope', 'verify', 'autoYes', 'success'];
69
72
  const SCOPE_KEYS = ['allow', 'deny'];
70
- const VERIFY_KEYS = ['gates'];
73
+ const VERIFY_KEYS = ['gates', 'gateDefinitions'];
71
74
  const AUTO_YES_KEYS = ['mode', 'allowPromptTypes', 'denyPatterns'];
72
75
  const SUCCESS_KEYS = [
73
76
  'requireWorkEvidence',
@@ -75,8 +78,6 @@ const SUCCESS_KEYS = [
75
78
  'requireCommit',
76
79
  'autoVerifyOnStop',
77
80
  ];
78
- /** Mirrors GATE_ID_PATTERN in verify-config.ts: a contract can only name ids that could exist. */
79
- const GATE_ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,31}$/;
80
81
  class TaskContractError extends Error {
81
82
  issues;
82
83
  constructor(issues) {
@@ -198,30 +199,61 @@ function validateScope(value, issues) {
198
199
  }
199
200
  return scope;
200
201
  }
202
+ /**
203
+ * Validate `verify.gateDefinitions` (Issue #1791).
204
+ *
205
+ * Delegates every per-entry rule to verify-config's own gate validator, so a
206
+ * gate defined in a contract is held to exactly the constraints a gate declared
207
+ * in `.commandmate/verify.yaml` is — including the reserved ids, which is where
208
+ * a contract shadowing `work-evidence` or `scope` is rejected. That rejection
209
+ * lands here, at parse time, rather than in the verify.yaml cross-check: it
210
+ * needs no config to decide, and both run at send.
211
+ *
212
+ * An empty list is accepted as equivalent to omitting the key. Unlike
213
+ * `verify.gates: []` — which would read as "pass having run nothing" — a
214
+ * definition list with no entries has exactly one possible meaning, and an
215
+ * orchestrator that emits YAML programmatically should not have to special-case
216
+ * "this delegation happens to need no extra gate".
217
+ */
218
+ function validateGateDefinitions(value, issues) {
219
+ if (value === undefined || value === null)
220
+ return [];
221
+ if (Array.isArray(value) && value.length > exports.MAX_GATE_DEFINITIONS) {
222
+ issues.push(`verify.gateDefinitions: at most ${exports.MAX_GATE_DEFINITIONS} entries (got ${value.length})`);
223
+ return [];
224
+ }
225
+ return (0, verify_config_1.validateGateEntries)(value, 'verify.gateDefinitions', issues);
226
+ }
201
227
  function validateVerify(value, issues) {
228
+ const empty = () => ({ gates: null, gateDefinitions: [] });
202
229
  if (value === undefined || value === null)
203
- return { gates: null };
230
+ return empty();
204
231
  if (!isMapping(value)) {
205
232
  issues.push(`verify: must be a mapping (got ${describe(value)})`);
206
- return { gates: null };
233
+ return empty();
207
234
  }
208
235
  collectUnknownKeys(value, VERIFY_KEYS, 'verify', issues);
236
+ const gateDefinitions = validateGateDefinitions(value.gateDefinitions, issues);
237
+ const withDefinitions = (gates) => ({
238
+ gates,
239
+ gateDefinitions,
240
+ });
209
241
  if (value.gates === undefined || value.gates === null)
210
- return { gates: null };
242
+ return withDefinitions(null);
211
243
  const gates = validateStringList(value.gates, 'verify.gates', { maxEntries: exports.MAX_GATE_IDS, maxLength: 32 }, issues);
212
244
  if (!gates)
213
- return { gates: null };
245
+ return withDefinitions(null);
214
246
  // An empty list would read as "pass with no gates run". "Run everything" is
215
247
  // spelled by omitting the key, so the two can never be confused.
216
248
  if (Array.isArray(value.gates) && value.gates.length === 0) {
217
249
  issues.push('verify.gates: must name at least one gate (omit the key to run every gate)');
218
- return { gates: null };
250
+ return withDefinitions(null);
219
251
  }
220
252
  const valid = [];
221
253
  const seen = new Set();
222
254
  gates.forEach((id, index) => {
223
- if (!GATE_ID_PATTERN.test(id)) {
224
- issues.push(`verify.gates[${index}]: "${id}" must match ${GATE_ID_PATTERN.source}`);
255
+ if (!verify_config_1.GATE_ID_PATTERN.test(id)) {
256
+ issues.push(`verify.gates[${index}]: "${id}" must match ${verify_config_1.GATE_ID_PATTERN.source}`);
225
257
  return;
226
258
  }
227
259
  if (seen.has(id)) {
@@ -231,7 +263,7 @@ function validateVerify(value, issues) {
231
263
  seen.add(id);
232
264
  valid.push(id);
233
265
  });
234
- return { gates: valid.length > 0 ? valid : null };
266
+ return withDefinitions(valid.length > 0 ? valid : null);
235
267
  }
236
268
  function validateAutoYes(value, issues) {
237
269
  const autoYes = { mode: null, allowPromptTypes: [], denyPatterns: [] };
@@ -364,6 +396,20 @@ function parseTaskContract(raw, sourceLabel) {
364
396
  '(the commit requirement is judged by the work-evidence gate, which ' +
365
397
  'requireWorkEvidence: false switches off)');
366
398
  }
399
+ // Same rule again, for the gates this contract defines itself (#1791). A
400
+ // definition that `verify.gates` leaves out is a check the contract appears to
401
+ // add and never runs — and it is the *only* declaration of that gate, so
402
+ // unlike a verify.yaml gate there is no other run that would ever execute it.
403
+ // Selecting a subset is spelled by deleting the definition.
404
+ if (verify.gates) {
405
+ const unselected = verify.gateDefinitions
406
+ .map((gate) => gate.id)
407
+ .filter((id) => !verify.gates?.includes(id));
408
+ if (unselected.length > 0) {
409
+ issues.push(`verify.gateDefinitions: ${unselected.join(', ')} defined but not named in verify.gates, ` +
410
+ 'so nothing would ever run them (list them, or delete the definition)');
411
+ }
412
+ }
367
413
  if (issues.length > 0)
368
414
  throw new TaskContractError(issues);
369
415
  return { version: 1, title, goal, scope, verify, autoYes, success };
@@ -389,33 +389,65 @@ async function resolveBaseRef(config, worktreePath) {
389
389
  return defaultBranch ? `origin/${defaultBranch}` : null;
390
390
  }
391
391
  /**
392
- * Resolve `gateIds` against the config.
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.
393
423
  *
394
424
  * Returns a message instead of a selection when the request names a gate that
395
425
  * does not exist, or selects nothing at all. Both would otherwise produce a run
396
426
  * with zero gate results, which {@link aggregateRunStatus} would have to call
397
427
  * `passed` — a green verdict from having checked nothing.
398
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
399
431
  * @param requireEnvClean whether a declaration switched env-clean on. It is
400
432
  * ORed with an explicit request rather than replacing it, so `--gates
401
433
  * env-clean` still works with the switch off (and honestly reports
402
434
  * UNKNOWN, because no baseline was recorded), and a delegation that
403
435
  * declared the requirement cannot lose it by naming a narrower gate list.
404
436
  */
405
- function selectGates(config, gateIds, requireEnvClean) {
437
+ function selectGates(declared, gateIds, requireEnvClean) {
406
438
  if (!gateIds) {
407
439
  return {
408
440
  runWorkEvidence: true,
409
441
  scope: 'implicit',
410
442
  runEnvClean: requireEnvClean,
411
- gates: config.gates,
443
+ gates: declared,
412
444
  };
413
445
  }
414
446
  const known = new Set([
415
447
  verify_config_1.WORK_EVIDENCE_GATE_ID,
416
448
  verify_config_1.SCOPE_GATE_ID,
417
449
  verify_config_1.ENV_CLEAN_GATE_ID,
418
- ...config.gates.map((g) => g.id),
450
+ ...declared.map((g) => g.id),
419
451
  ]);
420
452
  const unknown = gateIds.filter((id) => !known.has(id));
421
453
  if (unknown.length > 0) {
@@ -426,7 +458,7 @@ function selectGates(config, gateIds, requireEnvClean) {
426
458
  runWorkEvidence: requested.has(verify_config_1.WORK_EVIDENCE_GATE_ID),
427
459
  scope: requested.has(verify_config_1.SCOPE_GATE_ID) ? 'explicit' : 'off',
428
460
  runEnvClean: requested.has(verify_config_1.ENV_CLEAN_GATE_ID) || requireEnvClean,
429
- gates: config.gates.filter((gate) => requested.has(gate.id)),
461
+ gates: declared.filter((gate) => requested.has(gate.id)),
430
462
  };
431
463
  if (!selection.runWorkEvidence &&
432
464
  selection.scope === 'off' &&
@@ -486,8 +518,8 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
486
518
  * and closing back to back (what this used to do) left that loop with nothing
487
519
  * to find, and an interrupted gate with no record at all.
488
520
  */
489
- const runGate = async (gateId, command, evaluate) => {
490
- const row = (0, db_1.createGateResult)(db, runId, { gateId, command });
521
+ const runGate = async (gateId, command, source, evaluate) => {
522
+ const row = (0, db_1.createGateResult)(db, runId, { gateId, command, source });
491
523
  return close(row.id, await evaluate());
492
524
  };
493
525
  /**
@@ -496,26 +528,26 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
496
528
  * Opened and closed on the spot: there is no execution to leave a `running`
497
529
  * row around, and the row carries {@link notRun}'s zero-length window.
498
530
  */
499
- const recordNotRun = (gateId, command, reason) => {
531
+ const recordNotRun = (gateId, command, source, reason) => {
500
532
  const outcome = notRun(reason);
501
- const row = (0, db_1.createGateResult)(db, runId, { gateId, command });
533
+ const row = (0, db_1.createGateResult)(db, runId, { gateId, command, source });
502
534
  return close(row.id, outcome);
503
535
  };
504
536
  const statuses = [];
505
537
  if (runWorkEvidence) {
506
- const outcome = await runGate(verify_config_1.WORK_EVIDENCE_GATE_ID, WORK_EVIDENCE_GATE_COMMAND, () => evaluateWorkEvidence(worktreePath, baseRef, requireCommit));
538
+ const outcome = await runGate(verify_config_1.WORK_EVIDENCE_GATE_ID, WORK_EVIDENCE_GATE_COMMAND, 'builtin', () => evaluateWorkEvidence(worktreePath, baseRef, requireCommit));
507
539
  if (outcome.status !== 'passed') {
508
540
  // Nothing was produced, so every command gate below would be judging the
509
541
  // base commit. Record them as skipped so the run shows what was not run.
510
542
  const reason = `skipped: the ${verify_config_1.WORK_EVIDENCE_GATE_ID} gate did not pass.`;
511
543
  if (selection.scope !== 'off') {
512
- recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, reason);
544
+ recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, 'builtin', reason);
513
545
  }
514
546
  if (selection.runEnvClean) {
515
- recordNotRun(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, reason);
547
+ recordNotRun(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, 'builtin', reason);
516
548
  }
517
549
  for (const gate of gates) {
518
- recordNotRun(gate.id, gate.command, reason);
550
+ recordNotRun(gate.id, gate.command, gate.source, reason);
519
551
  }
520
552
  return outcome.status === 'failed' ? 'not_started' : 'error';
521
553
  }
@@ -525,8 +557,8 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
525
557
  // A detached contract is decided before the gate would run, so its row is
526
558
  // recorded rather than executed.
527
559
  const outcome = detachedContract
528
- ? recordNotRun(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, (0, scope_gate_1.scopeSkipDetachedContract)(detachedContract.id, detachedContract.status))
529
- : await runGate(verify_config_1.SCOPE_GATE_ID, SCOPE_GATE_COMMAND, () => (0, scope_gate_1.evaluateScope)(worktreePath, task?.contract.scope ?? null, task?.contract.success.requireScopeClean ?? false, baseRef, task?.contractPath ?? null));
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));
530
562
  // A skipped scope gate in the default selection is usually not a declined
531
563
  // check: no contract declared a scope, so there was no assertion to test.
532
564
  // Counting it would turn every contract-less run into `error` (see
@@ -544,7 +576,7 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
544
576
  // the agent's working window, and the gates below are the repository's own
545
577
  // declared commands. A `test:e2e` gate that starts a server would otherwise
546
578
  // be reported as the agent leaking one.
547
- const outcome = await runGate(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, () => (0, env_clean_gate_1.evaluateEnvClean)({
579
+ const outcome = await runGate(verify_config_1.ENV_CLEAN_GATE_ID, ENV_CLEAN_GATE_COMMAND, 'builtin', () => (0, env_clean_gate_1.evaluateEnvClean)({
548
580
  worktreeId: envClean.worktreeId,
549
581
  worktreePath,
550
582
  taskId: envClean.taskId,
@@ -559,11 +591,11 @@ async function executeRun(db, runId, worktreePath, config, selection, baseRef, t
559
591
  // The server process runs out of this directory. A `build` here replaces
560
592
  // the chunks the running app is serving mid-flight and breaks the live UI
561
593
  // — observed twice before this guard existed.
562
- statuses.push(recordNotRun(gate.id, gate.command, 'skipped: worktreePath is the server process working directory and ' +
594
+ statuses.push(recordNotRun(gate.id, gate.command, gate.source, 'skipped: worktreePath is the server process working directory and ' +
563
595
  'options.skipInPrimaryCheckout is true.').status);
564
596
  continue;
565
597
  }
566
- const outcome = await runGate(gate.id, gate.command, () => runCommand(gate.command, worktreePath, gate.timeoutSec, maxLogTailBytes));
598
+ const outcome = await runGate(gate.id, gate.command, gate.source, () => runCommand(gate.command, worktreePath, gate.timeoutSec, maxLogTailBytes));
567
599
  statuses.push(outcome.status);
568
600
  }
569
601
  return aggregateRunStatus(statuses);
@@ -700,12 +732,21 @@ async function startVerification(input) {
700
732
  const envCleanDecision = (0, env_clean_gate_1.resolveRequireEnvClean)(task?.contract ?? null, config);
701
733
  let selection = null;
702
734
  if (config && !configFailure) {
703
- const selected = selectGates(config, gateIds, envCleanDecision.required);
704
- if (typeof selected === 'string') {
705
- configFailure = selected;
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;
706
741
  }
707
742
  else {
708
- selection = selected;
743
+ const selected = selectGates(declared, gateIds, envCleanDecision.required);
744
+ if (typeof selected === 'string') {
745
+ configFailure = selected;
746
+ }
747
+ else {
748
+ selection = selected;
749
+ }
709
750
  }
710
751
  }
711
752
  const baseRef = config ? await resolveBaseRef(config, input.worktreePath) : null;
@@ -733,6 +774,7 @@ async function startVerification(input) {
733
774
  const row = (0, db_1.createGateResult)(db, run.id, {
734
775
  gateId: exports.CONFIG_GATE_ID,
735
776
  command: verify_config_1.VERIFY_CONFIG_RELATIVE_PATH,
777
+ source: 'builtin',
736
778
  });
737
779
  (0, db_1.finishGateResult)(db, row.id, {
738
780
  status: 'error',