commandmate 0.26.0 → 0.27.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 (838) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +431 -403
  3. package/.next/app-path-routes-manifest.json +26 -22
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +6 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +24 -0
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update-check/route.js +1 -1
  12. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  15. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  17. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  18. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js +1 -1
  20. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  21. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js +1 -1
  23. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  24. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js +1 -1
  26. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  27. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/assistant/terminal/route.js +2 -2
  29. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js +1 -1
  32. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  33. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/capabilities/route.js +1 -0
  38. package/.next/server/app/api/capabilities/route.js.nft.json +1 -0
  39. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -0
  40. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +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.js +2 -2
  46. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  47. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/fs/recent-paths/route.js +2 -2
  49. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  50. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  52. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  53. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/hooks/claude-done/route.js +19 -1
  55. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  56. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  58. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  59. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/push/escalation/route.js +1 -1
  63. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  64. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  66. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/push/vapid/route.js +1 -1
  68. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  69. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  72. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  74. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  76. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/clone/route.js +1 -1
  79. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/restore/route.js +1 -1
  83. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  84. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/repositories/route.js +1 -1
  86. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  87. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/repositories/scan/route.js +1 -1
  89. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  90. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/repositories/sync/route.js +1 -1
  92. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  93. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  95. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  96. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  106. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/todos/route.js +1 -1
  110. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  112. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/verification/runs/route.js +1 -1
  114. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  117. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  120. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -0
  122. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -0
  123. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -0
  124. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  128. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/current-output/route.js +2 -1
  130. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  131. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/env/route.js +2 -0
  133. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -0
  134. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -0
  135. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  141. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -0
  194. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -0
  195. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -0
  196. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  201. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -5
  203. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -6
  209. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/send/route.js +3 -1
  215. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  216. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  240. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/route.js +3 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  258. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/route.js +1 -1
  269. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  270. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/chat/page.js +2 -2
  272. package/.next/server/app/chat/page.js.nft.json +1 -1
  273. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/login/page.js +2 -2
  275. package/.next/server/app/login/page.js.nft.json +1 -1
  276. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/more/page.js +2 -2
  279. package/.next/server/app/more/page.js.nft.json +1 -1
  280. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/page.js +1 -1
  283. package/.next/server/app/page.js.nft.json +1 -1
  284. package/.next/server/app/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/repositories/page.js +2 -2
  287. package/.next/server/app/repositories/page.js.nft.json +1 -1
  288. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  289. package/.next/server/app/review/page.js +1 -1
  290. package/.next/server/app/review/page.js.nft.json +1 -1
  291. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  292. package/.next/server/app/sessions/page.js +1 -1
  293. package/.next/server/app/sessions/page.js.nft.json +1 -1
  294. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  295. package/.next/server/app/skills/[skillId]/page.js +2 -2
  296. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  297. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  298. package/.next/server/app/skills/installed/page.js +2 -2
  299. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  300. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  301. package/.next/server/app/skills/page.js +2 -2
  302. package/.next/server/app/skills/page.js.nft.json +1 -1
  303. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  304. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  305. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  306. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  307. package/.next/server/app/worktrees/[id]/page.js +9 -7
  308. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  309. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  310. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  311. package/.next/server/app-paths-manifest.json +26 -22
  312. package/.next/server/chunks/1029.js +1 -1
  313. package/.next/server/chunks/1068.js +3 -1
  314. package/.next/server/chunks/1296.js +1 -1
  315. package/.next/server/chunks/1538.js +7 -0
  316. package/.next/server/chunks/1601.js +2 -2
  317. package/.next/server/chunks/2119.js +1 -1
  318. package/.next/server/chunks/2404.js +3 -2
  319. package/.next/server/chunks/2445.js +1 -1
  320. package/.next/server/chunks/2546.js +1 -1
  321. package/.next/server/chunks/2689.js +13 -0
  322. package/.next/server/chunks/2759.js +8 -0
  323. package/.next/server/chunks/2839.js +1 -0
  324. package/.next/server/chunks/3241.js +1 -1
  325. package/.next/server/chunks/3292.js +1 -0
  326. package/.next/server/chunks/3417.js +1 -1
  327. package/.next/server/chunks/3480.js +1 -17
  328. package/.next/server/chunks/4393.js +1 -1
  329. package/.next/server/chunks/4423.js +1 -0
  330. package/.next/server/chunks/4444.js +22 -8
  331. package/.next/server/chunks/4565.js +3 -0
  332. package/.next/server/chunks/467.js +1 -0
  333. package/.next/server/chunks/4905.js +5 -0
  334. package/.next/server/chunks/5017.js +1 -0
  335. package/.next/server/chunks/5089.js +1 -0
  336. package/.next/server/chunks/5164.js +1 -1
  337. package/.next/server/chunks/5220.js +1 -0
  338. package/.next/server/chunks/5354.js +1 -0
  339. package/.next/server/chunks/552.js +19 -0
  340. package/.next/server/chunks/5571.js +1 -1
  341. package/.next/server/chunks/5998.js +3 -3
  342. package/.next/server/chunks/6130.js +1 -1
  343. package/.next/server/chunks/6274.js +11 -11
  344. package/.next/server/chunks/6285.js +1 -1
  345. package/.next/server/chunks/6401.js +1 -1
  346. package/.next/server/chunks/6781.js +1 -1
  347. package/.next/server/chunks/7472.js +1 -0
  348. package/.next/server/chunks/7506.js +1 -0
  349. package/.next/server/chunks/848.js +1 -1
  350. package/.next/server/chunks/8536.js +1 -1
  351. package/.next/server/chunks/880.js +1 -1
  352. package/.next/server/chunks/8807.js +5 -5
  353. package/.next/server/chunks/9067.js +1 -1
  354. package/.next/server/chunks/9284.js +1 -0
  355. package/.next/server/chunks/9358.js +1 -1
  356. package/.next/server/chunks/9508.js +1 -0
  357. package/.next/server/chunks/9938.js +1 -0
  358. package/.next/server/middleware-build-manifest.js +1 -1
  359. package/.next/server/middleware-manifest.json +5 -5
  360. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  361. package/.next/server/pages/500.html +1 -1
  362. package/.next/server/server-reference-manifest.json +1 -1
  363. package/.next/static/chunks/{2053-dfac2d49227cc942.js → 2053-c0e931eb4391baa1.js} +1 -1
  364. package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +1 -0
  365. package/.next/static/chunks/3922.0d2e64daf9f187da.js +1 -0
  366. package/.next/static/chunks/{5229-35f9acab97a553c5.js → 5229-1f5f19740a8d6c11.js} +1 -1
  367. package/.next/static/chunks/{6381-9303430933084b56.js → 6381-b7250e8ca7a44c6c.js} +1 -1
  368. package/.next/static/chunks/{8649-f551b0010dba4986.js → 8521-c43994fb58501d13.js} +1 -1
  369. package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +1 -0
  370. package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +1 -0
  371. package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +1 -0
  372. package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +1 -0
  373. package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +1 -0
  374. package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +1 -0
  375. package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +1 -0
  376. package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +1 -0
  377. package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +1 -0
  378. package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +1 -0
  379. package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +1 -0
  380. package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +1 -0
  381. package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +1 -0
  382. package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +1 -0
  383. package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +1 -0
  384. package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +1 -0
  385. package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +1 -0
  386. package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +1 -0
  387. package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +1 -0
  388. package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +1 -0
  389. package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +1 -0
  390. package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +1 -0
  391. package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +1 -0
  392. package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +1 -0
  393. package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +1 -0
  394. package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +1 -0
  395. package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +1 -0
  396. package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +1 -0
  397. package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +1 -0
  398. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
  399. package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +1 -0
  400. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +1 -0
  401. package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +1 -0
  402. package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +1 -0
  403. package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +1 -0
  404. package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +1 -0
  405. package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +1 -0
  406. package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +1 -0
  407. package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +1 -0
  408. package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +1 -0
  409. package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +1 -0
  410. package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +1 -0
  411. package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +1 -0
  412. package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +1 -0
  413. package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +1 -0
  414. package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +1 -0
  415. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +1 -0
  416. package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +1 -0
  417. package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +1 -0
  418. package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +1 -0
  419. package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +1 -0
  420. package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +1 -0
  421. package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +1 -0
  478. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +1 -0
  479. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +1 -0
  480. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +1 -0
  481. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +1 -0
  482. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +1 -0
  483. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +1 -0
  484. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +1 -0
  485. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +1 -0
  486. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +1 -0
  487. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
  488. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +1 -0
  489. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +1 -0
  490. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +1 -0
  491. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +1 -0
  492. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +1 -0
  493. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +1 -0
  494. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +1 -0
  495. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +1 -0
  496. package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +1 -0
  497. package/.next/static/chunks/app/chat/{page-439b35c9cb90dbe0.js → page-231df45127e876c2.js} +1 -1
  498. package/.next/static/chunks/app/login/{page-eefd515d8c37e5ee.js → page-adc51f0f7cbb7ac6.js} +1 -1
  499. package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +1 -0
  500. package/.next/static/chunks/app/more/{page-889b7546a8a553dc.js → page-3266dfa945972649.js} +1 -1
  501. package/.next/static/chunks/app/{page-a8d04ac0e3e4c9fc.js → page-0305431f43195431.js} +1 -1
  502. package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +1 -0
  503. package/.next/static/chunks/app/repositories/{page-f3c4d8839b1ca203.js → page-ae8fa55749976f79.js} +1 -1
  504. package/.next/static/chunks/app/review/{page-6dc88649fe88ac16.js → page-8f63aff862fee421.js} +1 -1
  505. package/.next/static/chunks/app/sessions/{page-2c9ed9e969097688.js → page-4d5382b257077c14.js} +1 -1
  506. package/.next/static/chunks/app/skills/[skillId]/{page-19beef6121c4c982.js → page-aaf0bcb1dfb558b9.js} +1 -1
  507. package/.next/static/chunks/app/skills/installed/{page-d5b9cef6d21fabda.js → page-dafc486410e839b7.js} +1 -1
  508. package/.next/static/chunks/app/skills/{page-06ef637e07dd9377.js → page-9e3c91da31514893.js} +1 -1
  509. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-5fed3984fafcd910.js → page-90f96977c741bbf8.js} +1 -1
  510. package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +1 -0
  511. package/.next/static/chunks/app/worktrees/[id]/page-e4f28966b4fc0ce1.js +1 -0
  512. package/.next/static/chunks/{webpack-9d892a9ff07c289d.js → webpack-6a9668cf54a26eba.js} +1 -1
  513. package/.next/static/css/928e5a8830fbf997.css +1 -0
  514. package/.next/static/t0BoV4H46ZgKmTjSi7GIz/_buildManifest.js +1 -0
  515. package/.next/trace +13 -12
  516. package/.next/types/app/api/capabilities/route.ts +347 -0
  517. package/.next/types/app/api/worktrees/[id]/clear-composer/route.ts +347 -0
  518. package/.next/types/app/api/worktrees/[id]/env/route.ts +347 -0
  519. package/.next/types/app/api/worktrees/[id]/resolve-target/route.ts +347 -0
  520. package/.next/types/routes.d.ts +5 -1
  521. package/.next/types/validator.ts +36 -0
  522. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  523. package/dist/cli/commands/auto-yes.js +40 -2
  524. package/dist/cli/commands/capture.d.ts.map +1 -1
  525. package/dist/cli/commands/capture.js +28 -13
  526. package/dist/cli/commands/instances.d.ts +30 -18
  527. package/dist/cli/commands/instances.d.ts.map +1 -1
  528. package/dist/cli/commands/instances.js +32 -36
  529. package/dist/cli/commands/ls.d.ts.map +1 -1
  530. package/dist/cli/commands/ls.js +73 -1
  531. package/dist/cli/commands/respond.d.ts.map +1 -1
  532. package/dist/cli/commands/respond.js +18 -1
  533. package/dist/cli/commands/send.d.ts.map +1 -1
  534. package/dist/cli/commands/send.js +21 -15
  535. package/dist/cli/commands/status.d.ts.map +1 -1
  536. package/dist/cli/commands/status.js +38 -0
  537. package/dist/cli/commands/wait.d.ts +26 -0
  538. package/dist/cli/commands/wait.d.ts.map +1 -1
  539. package/dist/cli/commands/wait.js +390 -43
  540. package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
  541. package/dist/cli/config/cli-dependencies.js +16 -0
  542. package/dist/cli/config/cli-tool-ids.d.ts +11 -0
  543. package/dist/cli/config/cli-tool-ids.d.ts.map +1 -1
  544. package/dist/cli/config/cli-tool-ids.js +12 -1
  545. package/dist/cli/types/api-responses.d.ts +443 -2
  546. package/dist/cli/types/api-responses.d.ts.map +1 -1
  547. package/dist/cli/utils/api-client.d.ts +18 -0
  548. package/dist/cli/utils/api-client.d.ts.map +1 -1
  549. package/dist/cli/utils/api-client.js +22 -0
  550. package/dist/cli/utils/server-capabilities.d.ts +56 -0
  551. package/dist/cli/utils/server-capabilities.d.ts.map +1 -0
  552. package/dist/cli/utils/server-capabilities.js +166 -0
  553. package/dist/cli/utils/session-target.d.ts +70 -0
  554. package/dist/cli/utils/session-target.d.ts.map +1 -0
  555. package/dist/cli/utils/session-target.js +118 -0
  556. package/dist/lib/cli-tools/copilot-executable.d.ts +79 -0
  557. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -0
  558. package/dist/lib/cli-tools/copilot-executable.js +155 -0
  559. package/dist/lib/cli-tools/types.d.ts +61 -0
  560. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  561. package/dist/lib/cli-tools/types.js +41 -0
  562. package/dist/lib/detection/ansi.d.ts +2 -1
  563. package/dist/lib/detection/ansi.d.ts.map +1 -1
  564. package/dist/lib/detection/ansi.js +3 -2
  565. package/dist/lib/detection/tools/verified-against.d.ts +84 -0
  566. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -0
  567. package/dist/lib/detection/tools/verified-against.js +88 -0
  568. package/dist/lib/detection/version-probes.d.ts +207 -0
  569. package/dist/lib/detection/version-probes.d.ts.map +1 -0
  570. package/dist/lib/detection/version-probes.js +290 -0
  571. package/dist/lib/security/env-sanitizer.d.ts +198 -0
  572. package/dist/lib/security/env-sanitizer.d.ts.map +1 -0
  573. package/dist/lib/security/env-sanitizer.js +232 -0
  574. package/dist/server/locales/en/notifications.json +17 -6
  575. package/dist/server/locales/ja/notifications.json +17 -6
  576. package/dist/server/src/config/activity-bar-config.js +4 -0
  577. package/dist/server/src/config/cli-tool-timing-config.js +59 -2
  578. package/dist/server/src/config/copilot-constants.js +11 -1
  579. package/dist/server/src/config/detection-evidence-config.js +129 -0
  580. package/dist/server/src/config/schedule-config.js +56 -7
  581. package/dist/server/src/config/tmux-pane-config.js +18 -1
  582. package/dist/server/src/lib/auto-yes-poller.js +36 -0
  583. package/dist/server/src/lib/cli-tools/antigravity.js +4 -2
  584. package/dist/server/src/lib/cli-tools/base.js +131 -10
  585. package/dist/server/src/lib/cli-tools/capture-spec.js +56 -0
  586. package/dist/server/src/lib/cli-tools/claude.js +1 -1
  587. package/dist/server/src/lib/cli-tools/codex.js +6 -2
  588. package/dist/server/src/lib/cli-tools/composer-spec.js +96 -0
  589. package/dist/server/src/lib/cli-tools/copilot-executable.js +155 -0
  590. package/dist/server/src/lib/cli-tools/copilot.js +307 -81
  591. package/dist/server/src/lib/cli-tools/gemini.js +8 -6
  592. package/dist/server/src/lib/cli-tools/graceful-exit.js +181 -0
  593. package/dist/server/src/lib/cli-tools/index.js +11 -1
  594. package/dist/server/src/lib/cli-tools/manager.js +56 -4
  595. package/dist/server/src/lib/cli-tools/opencode-config.js +195 -24
  596. package/dist/server/src/lib/cli-tools/opencode.js +233 -30
  597. package/dist/server/src/lib/cli-tools/session-name.js +57 -0
  598. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +213 -30
  599. package/dist/server/src/lib/cli-tools/types.js +41 -0
  600. package/dist/server/src/lib/cli-tools/vibe-local.js +7 -3
  601. package/dist/server/src/lib/cmate-cli-tool-parser.js +29 -1
  602. package/dist/server/src/lib/cmate-parser.js +12 -4
  603. package/dist/server/src/lib/db/db.js +5 -1
  604. package/dist/server/src/lib/db/migrations/v41-push-subscriptions.js +11 -0
  605. package/dist/server/src/lib/db/push-subscriptions-db.js +60 -3
  606. package/dist/server/src/lib/detection/ansi.js +3 -2
  607. package/dist/server/src/lib/detection/cli-patterns.js +901 -67
  608. package/dist/server/src/lib/detection/composer-text.js +455 -0
  609. package/dist/server/src/lib/detection/idle-evidence-observation.js +51 -0
  610. package/dist/server/src/lib/detection/model-info-extractor.js +195 -4
  611. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +19 -0
  612. package/dist/server/src/lib/detection/status-detector.js +76 -675
  613. package/dist/server/src/lib/detection/status-reason.js +57 -0
  614. package/dist/server/src/lib/detection/tools/antigravity/detect.js +75 -0
  615. package/dist/server/src/lib/detection/tools/claude/detect.js +144 -0
  616. package/dist/server/src/lib/detection/tools/claude/patterns.js +98 -0
  617. package/dist/server/src/lib/detection/tools/claude/prompt.js +124 -0
  618. package/dist/server/src/lib/detection/tools/codex/detect.js +343 -0
  619. package/dist/server/src/lib/detection/tools/codex/prompt.js +104 -0
  620. package/dist/server/src/lib/detection/tools/copilot/detect.js +185 -0
  621. package/dist/server/src/lib/detection/tools/copilot/prompt.js +89 -0
  622. package/dist/server/src/lib/detection/tools/dialog-block.js +159 -0
  623. package/dist/server/src/lib/detection/tools/frame.js +47 -0
  624. package/dist/server/src/lib/detection/tools/opencode/detect.js +242 -0
  625. package/dist/server/src/lib/detection/tools/opencode/prompt.js +85 -0
  626. package/dist/server/src/lib/detection/tools/registry.js +58 -0
  627. package/dist/server/src/lib/detection/tools/run-detection.js +202 -0
  628. package/dist/server/src/lib/detection/tools/types.js +34 -0
  629. package/dist/server/src/lib/detection/tools/verified-against.js +88 -0
  630. package/dist/server/src/lib/hooks/agent-event-types.js +19 -1
  631. package/dist/server/src/lib/hooks/permission-adjudication.js +160 -0
  632. package/dist/server/src/lib/hooks/permission-decision-service.js +81 -14
  633. package/dist/server/src/lib/hooks/permission-decision-state.js +62 -0
  634. package/dist/server/src/lib/hooks/permission-request-payload.js +18 -1
  635. package/dist/server/src/lib/hooks/sources/antigravity/source.js +10 -0
  636. package/dist/server/src/lib/hooks/sources/claude/source.js +20 -0
  637. package/dist/server/src/lib/hooks/sources/codex/source.js +10 -0
  638. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +403 -50
  639. package/dist/server/src/lib/hooks/sources/copilot/source.js +40 -4
  640. package/dist/server/src/lib/hooks/sources/define-source.js +23 -1
  641. package/dist/server/src/lib/hooks/sources/event-mapper.js +29 -1
  642. package/dist/server/src/lib/hooks/sources/gemini/source.js +10 -0
  643. package/dist/server/src/lib/hooks/sources/index.js +3 -1
  644. package/dist/server/src/lib/hooks/sources/launch-command.js +96 -1
  645. package/dist/server/src/lib/hooks/sources/legacy-relay.js +12 -0
  646. package/dist/server/src/lib/hooks/sources/opencode/client.js +295 -32
  647. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +120 -42
  648. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +95 -3
  649. package/dist/server/src/lib/hooks/sources/opencode/ports.js +70 -9
  650. package/dist/server/src/lib/hooks/sources/opencode/runtime.js +62 -4
  651. package/dist/server/src/lib/hooks/sources/opencode/source.js +54 -3
  652. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +254 -26
  653. package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +119 -4
  654. package/dist/server/src/lib/hooks/sources/pending-decisions.js +40 -2
  655. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +67 -0
  656. package/dist/server/src/lib/hooks/tool-input-normalization.js +157 -0
  657. package/dist/server/src/lib/job-executor.js +16 -4
  658. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +184 -0
  659. package/dist/server/src/lib/polling/response-checker.js +243 -26
  660. package/dist/server/src/lib/push/failure-episode-state.js +127 -0
  661. package/dist/server/src/lib/push/failure-push-notifier.js +344 -0
  662. package/dist/server/src/lib/push/index.js +35 -1
  663. package/dist/server/src/lib/push/prompt-card-state.js +93 -0
  664. package/dist/server/src/lib/push/prompt-push-gate.js +130 -0
  665. package/dist/server/src/lib/push/push-sender.js +82 -7
  666. package/dist/server/src/lib/push/resolution-push-notifier.js +193 -0
  667. package/dist/server/src/lib/push/waiting-push-notifier.js +42 -0
  668. package/dist/server/src/lib/response-cleaner.js +93 -20
  669. package/dist/server/src/lib/response-extractor.js +98 -5
  670. package/dist/server/src/lib/security/env-sanitizer.js +179 -5
  671. package/dist/server/src/lib/session/agent-event-state.js +1038 -189
  672. package/dist/server/src/lib/session/agent-session-lifecycle.js +8 -0
  673. package/dist/server/src/lib/session/claude-executor.js +23 -3
  674. package/dist/server/src/lib/session/claude-session.js +11 -1
  675. package/dist/server/src/lib/session/composer-clear.js +95 -0
  676. package/dist/server/src/lib/session/current-output-builder.js +267 -25
  677. package/dist/server/src/lib/session/provisional-turn.js +310 -0
  678. package/dist/server/src/lib/session/resolve-session-target.js +156 -0
  679. package/dist/server/src/lib/session/send-user-message.js +14 -18
  680. package/dist/server/src/lib/session/session-start-error.js +53 -1
  681. package/dist/server/src/lib/session/status-evidence.js +217 -0
  682. package/dist/server/src/lib/session/structured-prompt.js +46 -4
  683. package/dist/server/src/lib/session/waiting-episode-state.js +24 -0
  684. package/dist/server/src/lib/tmux/key-sequence.js +120 -0
  685. package/dist/server/src/lib/tmux/tmux.js +91 -19
  686. package/dist/server/src/lib/tui-accumulator.js +68 -1
  687. package/dist/server/src/lib/verification/gate-runner.js +84 -1
  688. package/dist/server/src/lib/ws-server.js +8 -5
  689. package/dist/server/src/types/cli-tool-contracts.js +75 -0
  690. package/dist/server/src/types/terminal-keys.js +37 -0
  691. package/dist/types/cli-tool-contracts.d.ts +235 -0
  692. package/dist/types/cli-tool-contracts.d.ts.map +1 -0
  693. package/dist/types/cli-tool-contracts.js +75 -0
  694. package/package.json +3 -2
  695. package/public/sw.js +65 -2
  696. package/.next/server/chunks/1841.js +0 -1
  697. package/.next/server/chunks/233.js +0 -1
  698. package/.next/server/chunks/3022.js +0 -1
  699. package/.next/server/chunks/3270.js +0 -1
  700. package/.next/server/chunks/4455.js +0 -1
  701. package/.next/server/chunks/5959.js +0 -27
  702. package/.next/server/chunks/7458.js +0 -6
  703. package/.next/server/chunks/8730.js +0 -1
  704. package/.next/server/chunks/9058.js +0 -1
  705. package/.next/server/chunks/9687.js +0 -3
  706. package/.next/static/chunks/3898-ef488bfa804507d9.js +0 -1
  707. package/.next/static/chunks/9263.f2034ec525abcf72.js +0 -1
  708. package/.next/static/chunks/app/api/app/update/route-fae89f8d4cc3ff97.js +0 -1
  709. package/.next/static/chunks/app/api/app/update-check/route-fae89f8d4cc3ff97.js +0 -1
  710. package/.next/static/chunks/app/api/assistant/conversation/route-fae89f8d4cc3ff97.js +0 -1
  711. package/.next/static/chunks/app/api/assistant/current-output/route-fae89f8d4cc3ff97.js +0 -1
  712. package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +0 -1
  713. package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +0 -1
  714. package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +0 -1
  715. package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +0 -1
  716. package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +0 -1
  717. package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +0 -1
  718. package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +0 -1
  719. package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +0 -1
  720. package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +0 -1
  721. package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +0 -1
  722. package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +0 -1
  723. package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +0 -1
  724. package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +0 -1
  725. package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +0 -1
  726. package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +0 -1
  727. package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +0 -1
  728. package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +0 -1
  729. package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +0 -1
  730. package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +0 -1
  731. package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +0 -1
  732. package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +0 -1
  733. package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +0 -1
  734. package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +0 -1
  735. package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +0 -1
  736. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
  737. package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
  738. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +0 -1
  739. package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +0 -1
  740. package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +0 -1
  741. package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +0 -1
  742. package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +0 -1
  743. package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +0 -1
  744. package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +0 -1
  745. package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +0 -1
  746. package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +0 -1
  747. package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +0 -1
  748. package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +0 -1
  749. package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +0 -1
  750. package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +0 -1
  751. package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +0 -1
  752. package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
  753. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +0 -1
  754. package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +0 -1
  755. package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +0 -1
  756. package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +0 -1
  757. package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +0 -1
  758. package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
  759. package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +0 -1
  771. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +0 -1
  772. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +0 -1
  773. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +0 -1
  774. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +0 -1
  775. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +0 -1
  776. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +0 -1
  777. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +0 -1
  778. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +0 -1
  779. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +0 -1
  780. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +0 -1
  781. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +0 -1
  782. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +0 -1
  783. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +0 -1
  788. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +0 -1
  789. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +0 -1
  790. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +0 -1
  791. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +0 -1
  792. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +0 -1
  793. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +0 -1
  794. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +0 -1
  795. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +0 -1
  796. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +0 -1
  797. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +0 -1
  798. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +0 -1
  799. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +0 -1
  800. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +0 -1
  801. package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +0 -1
  802. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +0 -1
  803. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +0 -1
  804. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +0 -1
  805. package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +0 -1
  806. package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +0 -1
  807. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +0 -1
  808. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +0 -1
  809. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +0 -1
  810. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +0 -1
  811. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +0 -1
  812. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +0 -1
  813. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +0 -1
  814. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +0 -1
  815. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
  816. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +0 -1
  817. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +0 -1
  818. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +0 -1
  819. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +0 -1
  820. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +0 -1
  821. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +0 -1
  822. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
  823. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
  824. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  825. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +0 -1
  826. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  827. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +0 -1
  828. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
  829. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +0 -1
  830. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +0 -1
  831. package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +0 -1
  832. package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +0 -1
  833. package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  834. package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +0 -1
  835. package/.next/static/chunks/app/worktrees/[id]/page-fbdf4621a2911ac1.js +0 -1
  836. package/.next/static/css/e865c4979a41aa03.css +0 -1
  837. package/.next/static/hNdNiFes2xLls68SWhAU9/_buildManifest.js +0 -1
  838. /package/.next/static/{hNdNiFes2xLls68SWhAU9 → t0BoV4H46ZgKmTjSi7GIz}/_ssgManifest.js +0 -0
@@ -25,42 +25,14 @@
25
25
  * coupling via a minimal DTO/projection type.
26
26
  */
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
- exports.SELECTION_LIST_REASONS = exports.STATUS_REASON = void 0;
28
+ exports.STATUS_CHECK_LINE_COUNT = exports.GENERATING_REASONS = exports.SELECTION_LIST_REASONS = exports.STATUS_REASON = void 0;
29
+ exports.isGeneratingStatus = isGeneratingStatus;
29
30
  exports.detectSessionStatus = detectSessionStatus;
30
- const cli_patterns_1 = require("./cli-patterns");
31
- const prompt_detector_1 = require("./prompt-detector");
32
- const tui_detection_frame_1 = require("./tui-detection-frame");
33
- const thinking_constants_1 = require("../../config/thinking-constants");
34
- /**
35
- * Number of lines from the end to check for prompt and input indicators
36
- * @constant
37
- */
38
- const STATUS_CHECK_LINE_COUNT = 15;
39
- // THINKING_TAIL_LINE_COUNT imported from @/config/thinking-constants (Issue #575)
40
- // Previously THINKING_TAIL_LINE_COUNT = 5 (local constant)
41
- // See also: THINKING_CHECK_LINE_COUNT (50) in auto-yes-manager.ts (wider window for safety)
42
- /**
43
- * Reason string constants for StatusDetectionResult.reason.
44
- * Shared between status-detector.ts and current-output/route.ts to prevent typos (DR2-003).
45
- */
46
- exports.STATUS_REASON = {
47
- PROMPT_DETECTED: 'prompt_detected',
48
- THINKING_INDICATOR: 'thinking_indicator',
49
- OPENCODE_PROCESSING_INDICATOR: 'opencode_processing_indicator',
50
- OPENCODE_SELECTION_LIST: 'opencode_selection_list',
51
- CLAUDE_SELECTION_LIST: 'claude_selection_list',
52
- COPILOT_SELECTION_LIST: 'copilot_selection_list',
53
- CODEX_SELECTION_LIST: 'codex_selection_list',
54
- /** Issue #1017: Codex pager / edit-previous (transcript) mode. */
55
- CODEX_PAGER: 'codex_pager',
56
- /** Issue #1829: Codex's hooks review screens, which only `t`/`esc` leave. */
57
- CODEX_HOOKS_REVIEW: 'codex_hooks_review',
58
- ANTIGRAVITY_SELECTION_LIST: 'antigravity_selection_list',
59
- OPENCODE_RESPONSE_COMPLETE: 'opencode_response_complete',
60
- INPUT_PROMPT: 'input_prompt',
61
- NO_RECENT_OUTPUT: 'no_recent_output',
62
- DEFAULT: 'default',
63
- };
31
+ const status_reason_1 = require("./status-reason");
32
+ const frame_1 = require("./tools/frame");
33
+ const registry_1 = require("./tools/registry");
34
+ var status_reason_2 = require("./status-reason");
35
+ Object.defineProperty(exports, "STATUS_REASON", { enumerable: true, get: function () { return status_reason_2.STATUS_REASON; } });
64
36
  /**
65
37
  * Set of STATUS_REASON values that indicate a selection list is active.
66
38
  * Used by current-output/route.ts to determine if NavigationButtons should be shown.
@@ -69,669 +41,98 @@ exports.STATUS_REASON = {
69
41
  * @see STATUS_REASON
70
42
  */
71
43
  exports.SELECTION_LIST_REASONS = new Set([
72
- exports.STATUS_REASON.OPENCODE_SELECTION_LIST,
73
- exports.STATUS_REASON.CLAUDE_SELECTION_LIST,
74
- exports.STATUS_REASON.COPILOT_SELECTION_LIST,
75
- exports.STATUS_REASON.CODEX_SELECTION_LIST,
44
+ status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
45
+ // Issue #1893: opencode's permission dialog is a horizontal button strip that
46
+ // only ←/→ + Enter drive — typing an option number does nothing (measured on
47
+ // 1.18.21), so it is a `menu`, not something `respond <id> N` can answer.
48
+ status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT,
49
+ status_reason_1.STATUS_REASON.CLAUDE_SELECTION_LIST,
50
+ status_reason_1.STATUS_REASON.COPILOT_SELECTION_LIST,
51
+ status_reason_1.STATUS_REASON.CODEX_SELECTION_LIST,
76
52
  // Issue #1017: Codex pager/edit-previous mode also drives NavigationButtons.
77
- exports.STATUS_REASON.CODEX_PAGER,
53
+ status_reason_1.STATUS_REASON.CODEX_PAGER,
78
54
  // Issue #1829: the hooks review screens have no numbered options — `t` and
79
55
  // `esc` are the only ways out, and NavigationButtons is how a human sends them.
80
- exports.STATUS_REASON.CODEX_HOOKS_REVIEW,
81
- exports.STATUS_REASON.ANTIGRAVITY_SELECTION_LIST,
56
+ status_reason_1.STATUS_REASON.CODEX_HOOKS_REVIEW,
57
+ status_reason_1.STATUS_REASON.ANTIGRAVITY_SELECTION_LIST,
82
58
  ]);
83
59
  /**
84
- * Time threshold (in ms) for considering output as "stale"
85
- * If no new output for this duration, assume processing is complete
86
- * @constant
87
- */
88
- const STALE_OUTPUT_THRESHOLD_MS = 5000;
89
- /**
90
- * Issue #1160: anchors for the BOTTOM edge of a Codex approval / numbered-choice
91
- * prompt. Used only by isCodexStalePrompt() to distinguish an ACTIVE prompt (the
92
- * bottom-most interactive element → waiting) from an already-ANSWERED one lingering
93
- * in scrollback with Codex processing below it (→ fall through to running detection).
94
- * Detection-wide Codex patterns live in cli-patterns.ts; these stay local to the guard.
60
+ * The `running` reasons that mean "the agent is producing output right now"
61
+ * (Issue #1912).
95
62
  *
96
- * CODEX_CONFIRMATION_FOOTER_PATTERN matches the "press number/enter to confirm" footer
97
- * that closes a numbered prompt. CODEX_NUMBERED_OPTION_PATTERN matches an option line
98
- * ("1. Yes", optionally prefixed by a ❯/›/● selection indicator). Neither pattern uses
99
- * /g (keeps .test() stateless) nor nested quantifiers (ReDoS-safe).
100
- */
101
- const CODEX_CONFIRMATION_FOOTER_PATTERN = /press\s+(?:number|enter)\s+to\s+confirm/i;
102
- const CODEX_NUMBERED_OPTION_PATTERN = /^\s*[❯›●]?\s*\d{1,2}[.)]\s/;
103
- /**
104
- * Issue #1160: decide whether a Codex prompt that detectPrompt() matched is a stale,
105
- * already-answered prompt left in the 50-line scan window rather than an active one.
63
+ * `current-output-builder` derives `thinking` / `isGenerating` from this, and it
64
+ * was a single `=== THINKING_INDICATOR` comparison until opencode grew a second
65
+ * one: branch A of the opencode block answers `opencode_processing_indicator`
66
+ * for the footer that reads `esc interrupt`, which is opencode's ONLY signal
67
+ * while it is between the submitted prompt and the first transcript row. A
68
+ * scraper-only session (no hooks) therefore showed no thinking indicator in
69
+ * `MessageList` for exactly the stretch where one is wanted.
106
70
  *
107
- * Codex keeps the answered "1. Yes / 2. No" block + "press number to confirm" footer in
108
- * its transcript (it draws on the normal screen, so tmux retains a scrollback for it
109
- * TMUX_HISTORY_LIMIT lines deep) instead of repainting it away like Claude,
110
- * so detectPrompt() keeps matching it and detectSessionStatus() reports `waiting` even
111
- * after the user answered and Codex resumed — the sidebar status dot then stays orange
112
- * forever (the reported bug).
71
+ * `DEFAULT` is deliberately absent: it is the "output changed recently" fallback
72
+ * and says nothing about the agent having announced itself, so promoting it
73
+ * would light the indicator on any repainting frame.
113
74
  *
114
- * Position-based guard (mirrors isCodexPromptReady()'s bottom-most-element idea): the
115
- * prompt is stale when a Codex thinking indicator (• Working / • Ran / …) sits strictly
116
- * BELOW the bottom-most prompt anchor (footer or numbered option) within the content
117
- * above the status bar. An UNANSWERED prompt has no running indicator below its block,
118
- * so this returns false and the caller keeps reporting `waiting` (Auto-Yes unaffected).
75
+ * @see STATUS_REASON
76
+ */
77
+ exports.GENERATING_REASONS = new Set([
78
+ status_reason_1.STATUS_REASON.THINKING_INDICATOR,
79
+ status_reason_1.STATUS_REASON.OPENCODE_PROCESSING_INDICATOR,
80
+ ]);
81
+ /**
82
+ * Whether a detection result describes an agent that is actively generating.
119
83
  *
120
- * The bare "›" input-line case ("answered, then below") is already handled upstream by
121
- * detectPrompt()'s user-input barrier (prompt-detect-multiple-choice.ts), which returns
122
- * isPrompt=false before this guard runs, so only the thinking-indicator signal is needed
123
- * here — keeping the guard conservative against flipping a genuine prompt to running.
84
+ * Both halves matter: the reason alone is not enough because a stale frame can
85
+ * carry a `running` reason after the status has degraded to `ready`.
124
86
  */
125
- function isCodexStalePrompt(contentLines) {
126
- // Locate the Codex status bar (version-independent, Issue #1150). The content of
127
- // interest is above it — same footer-boundary scan as priority 2.7 below.
128
- let footerBoundary = -1;
129
- for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
130
- if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(contentLines[ci])) {
131
- footerBoundary = ci;
132
- break;
133
- }
134
- }
135
- const end = footerBoundary >= 0 ? footerBoundary : contentLines.length;
136
- let lastPromptIdx = -1;
137
- let lastThinkingIdx = -1;
138
- for (let i = 0; i < end; i++) {
139
- const line = contentLines[i];
140
- const trimmed = line.trim();
141
- if (trimmed === '') {
142
- continue;
143
- }
144
- if (CODEX_CONFIRMATION_FOOTER_PATTERN.test(trimmed) ||
145
- CODEX_NUMBERED_OPTION_PATTERN.test(trimmed)) {
146
- lastPromptIdx = i;
147
- }
148
- // detectThinking('codex', …) requires the "•" activity prefix, so option text that
149
- // merely contains a word like "Running" cannot be mistaken for a running indicator.
150
- if ((0, cli_patterns_1.detectThinking)('codex', line)) {
151
- lastThinkingIdx = i;
152
- }
153
- }
154
- return lastPromptIdx >= 0 && lastThinkingIdx > lastPromptIdx;
87
+ function isGeneratingStatus(result) {
88
+ return result.status === 'running' && exports.GENERATING_REASONS.has(result.reason);
155
89
  }
156
90
  /**
157
- * Issue #1628: decide whether a Codex frame that matched CODEX_SELECTION_LIST_PATTERN
158
- * is the agent ASKING FOR APPROVAL rather than the user browsing a menu.
91
+ * Number of lines from the end to check for prompt and input indicators.
159
92
  *
160
- * Why this exists: Codex renders both with a "Press enter to confirm" footer, so the
161
- * priority-0.8 selection-list branch (added for `/model` in Issue #622) also swallowed
162
- * every approval request and returned `hasActivePrompt: false`. `isPromptWaiting` is the
163
- * only blocked-on-a-human signal the current-output payload carries, so `commandmate wait
164
- * --on-prompt agent` could never raise exit 10 for a Codex worker sitting on
165
- * "Would you like to run the following command?" — it polled until the timeout while the
166
- * agent was stopped. Auto-Yes was unaffected because it calls detectPrompt() directly,
167
- * which parses these frames correctly; only the status-detector layer lost them.
168
- *
169
- * Two OR'd signals, both measured against live codex-cli 0.146.0 captures
170
- * (5 approval frames from one real session + 2 `/model` picker frames):
171
- * 1. an interrogative question line directly above the options
172
- * ("Would you like to run the following command?" → the extracted question ends
173
- * with "?"; a picker's ends with its description, e.g. "…browse all models.")
174
- * 2. the approval escape verb ("esc to cancel" vs a menu's "esc to go back" /
175
- * "esc to dismiss")
176
- * Either alone covers every measured approval frame, so a rewording of one does not
177
- * reopen the bug.
178
- *
179
- * Gated on `promptDetection.isPrompt` so a frame detectPrompt() could not parse into
180
- * options (e.g. the unnumbered "Select a model" list of Issue #619) can never be
181
- * promoted to an active prompt.
93
+ * Re-exported from `tools/frame.ts`, where Issue #1927 moved the definition so
94
+ * the tool modules and the shared chain read one constant. Kept exported here
95
+ * because it was published from this module first and is imported by name
96
+ * elsewhere.
182
97
  */
183
- function isCodexApprovalRequest(promptDetection, selectionWindow) {
184
- if (!promptDetection.isPrompt)
185
- return false;
186
- const question = promptDetection.promptData?.question?.trim() ?? '';
187
- return question.endsWith('?') || cli_patterns_1.CODEX_APPROVAL_FOOTER_PATTERN.test(selectionWindow);
188
- }
98
+ var frame_2 = require("./tools/frame");
99
+ Object.defineProperty(exports, "STATUS_CHECK_LINE_COUNT", { enumerable: true, get: function () { return frame_2.STATUS_CHECK_LINE_COUNT; } });
189
100
  /**
190
- * Detect session status with confidence level
101
+ * Detect session status with confidence level.
102
+ *
103
+ * Since Issue #1927 this is a facade: it normalises the frame once and hands it
104
+ * to the tool's own {@link ToolStatusDetector}, which runs the priority chain in
105
+ * `tools/run-detection.ts`. The signature, the return shape and every verdict a
106
+ * tool can reach are unchanged by that move; what the split buys is a place to
107
+ * state, per tool, what counts as evidence (§4 D1 / D2).
191
108
  *
192
- * Priority order:
193
- * 1. Interactive prompt (yes/no, multiple choice) -> waiting
194
- * 2. Thinking indicator (spinner, progress) -> running
195
- * 3. Input prompt (>, ❯, ›, $, %) -> ready
196
- * 4. No recent output (>5s) -> ready (low confidence)
197
- * 5. Default -> running (low confidence)
109
+ * Priority order (see `tools/run-detection.ts` for the full commentary):
110
+ * 1. Tool-specific pre-prompt branches (pickers, pagers, status bars)
111
+ * 2. Interactive prompt (yes/no, multiple choice) -> waiting
112
+ * 3. Thinking indicator (spinner, progress) -> running
113
+ * 4. Tool-specific running / completion markers
114
+ * 5. Input prompt (>, ❯, ›, $, %) -> ready, with per-tool idle evidence
115
+ * 6. No recent output (>5s) -> running, evidence none (Issue #1927; was `ready`)
116
+ * 7. Floor -> running, evidence none (`unknown_frame` / `default`)
198
117
  *
199
118
  * @param output - Raw tmux output (including ANSI escape codes).
200
119
  * This function handles ANSI stripping internally.
201
120
  * @param cliToolId - CLI tool identifier for pattern selection (CLIToolType).
202
121
  * @param lastOutputTimestamp - Optional timestamp (Date) for time-based heuristic.
203
- * @returns Detection result with status, confidence, reason, hasActivePrompt, and promptDetection
122
+ * @returns Detection result with status, confidence, reason, hasActivePrompt, evidence and promptDetection
204
123
  */
205
124
  function detectSessionStatus(output, cliToolId, lastOutputTimestamp) {
206
- // Strip ANSI codes and get last N lines for analysis
207
- const cleanOutput = (0, tui_detection_frame_1.normalizeTuiFrameForDetection)((0, cli_patterns_1.stripAnsi)(output));
208
- const lines = cleanOutput.split('\n');
209
- // Strip trailing empty lines (tmux terminal padding) before windowing.
210
- // tmux buffers often end with many empty padding lines that would otherwise
211
- // fill the entire detection window, hiding the actual prompt/status content.
212
- let lastNonEmptyIndex = lines.length - 1;
213
- while (lastNonEmptyIndex >= 0 && lines[lastNonEmptyIndex].trim() === '') {
214
- lastNonEmptyIndex--;
215
- }
216
- const contentLines = lines.slice(0, lastNonEmptyIndex + 1);
217
- const lastLines = contentLines.slice(-STATUS_CHECK_LINE_COUNT).join('\n');
218
- // DR-003: Separate thinking detection window (5 lines) from prompt detection window (15 lines)
219
- const thinkingLines = contentLines.slice(-thinking_constants_1.THINKING_TAIL_LINE_COUNT).join('\n');
220
- // 0. Copilot: selection list detection BEFORE thinking detection
221
- // COPILOT_THINKING_PATTERN includes "Reasoning\s+[■▪▮]" which matches the
222
- // "Reasoning ■■■ medium" UI element shown in /model selection lists.
223
- // Without this early check, the selection list would be misdetected as thinking.
224
- // However, yes/no prompts also contain "to navigate · Enter to select" footer,
225
- // so we must check detectPrompt first — if a prompt is detected, it takes priority
226
- // over selection list (prompts show PromptPanel with Yes/No buttons).
227
- const copilotSelectionWindow = contentLines.slice(-30).join('\n');
228
- if (cliToolId === 'copilot' && cli_patterns_1.COPILOT_SELECTION_LIST_PATTERN.test(copilotSelectionWindow)) {
229
- const promptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
230
- const promptDetection = (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)(cleanOutput), promptOptions);
231
- if (promptDetection.isPrompt) {
232
- // Distinguish yes/no prompts (2-3 options, e.g., "Do you want to run this command?")
233
- // from ask_user multi-select prompts (4+ options). Yes/no prompts should show
234
- // PromptPanel with buttons; ask_user prompts need NavigationButtons for ↑↓ selection.
235
- const optionsCount = promptDetection.promptData?.options?.length ?? 0;
236
- if (optionsCount <= 3) {
237
- return {
238
- status: 'waiting',
239
- confidence: 'high',
240
- reason: 'prompt_detected',
241
- hasActivePrompt: true,
242
- promptDetection,
243
- };
244
- }
245
- // 4+ options: treat as selection list (NavigationButtons)
246
- }
247
- return {
248
- status: 'waiting',
249
- confidence: 'high',
250
- reason: exports.STATUS_REASON.COPILOT_SELECTION_LIST,
251
- hasActivePrompt: false,
252
- promptDetection,
253
- };
254
- }
255
- // 0.5. Copilot: thinking detection BEFORE prompt detection (Issue #547)
256
- // Copilot CLI keeps the "❯" prompt visible even during processing,
257
- // so prompt detection would always match first. Check thinking first for copilot.
258
- // Uses last 15 lines (not 5) because copilot shows action log lines above prompt.
259
- const copilotThinkingWindow = contentLines.slice(-STATUS_CHECK_LINE_COUNT).join('\n');
260
- if (cliToolId === 'copilot' && (0, cli_patterns_1.detectThinking)(cliToolId, copilotThinkingWindow)) {
261
- const promptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
262
- const promptDetection = (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)(cleanOutput), promptOptions);
263
- return {
264
- status: 'running',
265
- confidence: 'high',
266
- reason: 'thinking_indicator',
267
- hasActivePrompt: false,
268
- promptDetection,
269
- };
270
- }
271
- // 0.7. Codex: pager / edit-previous (transcript) mode detection (Issue #1017)
272
- // Codex's transcript pager renders scroll / edit key-hint footers, e.g.:
273
- // "↑/↓ to scroll pgup/pgdn to page home/end to jump"
274
- // "q to quit esc/← to edit prev → to edit next enter to edit message"
275
- // together with a scroll-percentage separator ("─ N% ─") in place of the usual
276
- // "model · N% left · path" status bar. So neither CODEX_SELECTION_LIST_PATTERN
277
- // (footer is "enter to edit message", not "press enter to confirm/select") nor the
278
- // status-bar boundary logic in 0.8 / 2.7 fire, leaving the read-only TerminalDisplay
279
- // with no way to scroll or escape. Detect the pager footer directly — independent of
280
- // the "N% left ·" status bar — and surface it as a selection list so NavigationButtons
281
- // render (isSelectionListActive via SELECTION_LIST_REASONS). Checked ahead of
282
- // detectPrompt/thinking because the pager has no active y/n prompt and its transcript
283
- // content must not be misread as one. CODEX_PAGER_FOOTER_PATTERN does not match the
284
- // genuine "/model" selection footer, so the 0.8 path below is unaffected (no regression).
285
- if (cliToolId === 'codex' && cli_patterns_1.CODEX_PAGER_FOOTER_PATTERN.test(lastLines)) {
286
- const codexPagerPromptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
287
- const codexPagerPromptDetection = (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)(cleanOutput), codexPagerPromptOptions);
288
- return {
289
- status: 'waiting',
290
- confidence: 'high',
291
- reason: exports.STATUS_REASON.CODEX_PAGER,
292
- hasActivePrompt: false,
293
- promptDetection: codexPagerPromptDetection,
294
- };
295
- }
296
- // 0.75. Codex: the hooks review screens (Issue #1829)
297
- // codex-cli 0.148.0 answers "1. Review hooks" with a two-screen review UI:
298
- // screen 2 "Press t to trust all; enter to review hooks; esc to close"
299
- // screen 3 "Press t to trust; esc to go back"
300
- // Neither carries a numbered option, a "press enter to confirm" footer, or any
301
- // thinking indicator, so every branch below falls through to the `running`
302
- // default -- which is how two live sessions sat parked on screen 3 while the UI
303
- // and `cmate wait` both reported them as busy. They are the bottom-most
304
- // interactive element and nothing but a keypress moves them: that is `waiting`.
305
- // Checked ahead of prompt detection because the transcript rows on screen 2 are
306
- // ordinary text that must not be read as options.
307
- if (cliToolId === 'codex') {
308
- const codexLifecycleDialog = (0, cli_patterns_1.getCodexLifecycleDialog)(cleanOutput);
309
- if (codexLifecycleDialog === 'hooks-list' || codexLifecycleDialog === 'hooks-detail') {
310
- return {
311
- status: 'waiting',
312
- confidence: 'high',
313
- reason: exports.STATUS_REASON.CODEX_HOOKS_REVIEW,
314
- hasActivePrompt: false,
315
- promptDetection: (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)(cleanOutput), (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId)),
316
- };
317
- }
318
- }
319
- // 0.8. Codex: selection list detection BEFORE prompt detection (Issue #622)
320
- // CODEX_SELECTION_LIST_PATTERN matches "press enter to confirm/select" footer.
321
- // Without this early check, detectPrompt() at priority 1 would detect the numbered
322
- // options (e.g., "› 1. gpt-5.4") as a multiple_choice prompt, preventing
323
- // NavigationButtons from being shown.
324
- // This mirrors the Copilot Priority 0 pattern above.
325
- //
326
- // The pattern is scoped to the content window immediately above the Codex status
327
- // bar (mirroring step 2.7's boundary detection). Matching against the full content
328
- // would allow stale "Press enter to confirm" text from already-answered approval
329
- // prompts high in scrollback to falsely trigger NavigationButtons.
330
- if (cliToolId === 'codex') {
331
- // Issue #1150: locate the status bar via CODEX_STATUS_BAR_PATTERN (version-
332
- // independent; matches both legacy "N% left ·" and v0.141 "model · path" bars).
333
- let codexFooterBoundary = -1;
334
- for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
335
- if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(contentLines[ci])) {
336
- codexFooterBoundary = ci;
337
- break;
338
- }
339
- }
340
- let codexContentEnd = codexFooterBoundary >= 0 ? codexFooterBoundary - 1 : contentLines.length - 1;
341
- while (codexContentEnd >= 0 && contentLines[codexContentEnd].trim() === '') {
342
- codexContentEnd--;
343
- }
344
- if (codexContentEnd >= 0) {
345
- const codexSelectionWindow = contentLines
346
- .slice(Math.max(0, codexContentEnd - STATUS_CHECK_LINE_COUNT + 1), codexContentEnd + 1)
347
- .join('\n');
348
- if (cli_patterns_1.CODEX_SELECTION_LIST_PATTERN.test(codexSelectionWindow)) {
349
- const codexPromptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
350
- const codexPromptDetection = (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)(cleanOutput), codexPromptOptions);
351
- // Issue #1628: an approval request wears the same footer as a menu but is the
352
- // agent blocked on the human, so it must surface as an active prompt (exit 10
353
- // for `wait`, PromptPanel in the UI) instead of a navigable list. The #1160
354
- // staleness guard still applies: an ALREADY-ANSWERED approval whose footer is
355
- // still inside the window, with Codex running below it, is dead scrollback.
356
- if (isCodexApprovalRequest(codexPromptDetection, codexSelectionWindow) &&
357
- !isCodexStalePrompt(contentLines)) {
358
- return {
359
- status: 'waiting',
360
- confidence: 'high',
361
- reason: exports.STATUS_REASON.PROMPT_DETECTED,
362
- hasActivePrompt: true,
363
- promptDetection: codexPromptDetection,
364
- };
365
- }
366
- return {
367
- status: 'waiting',
368
- confidence: 'high',
369
- reason: exports.STATUS_REASON.CODEX_SELECTION_LIST,
370
- hasActivePrompt: false,
371
- promptDetection: codexPromptDetection,
372
- };
373
- }
374
- }
375
- }
376
- // 0.9. Antigravity: selection list detection BEFORE thinking detection (Issue #995)
377
- // agy's "Switch Model" (and other) selection TUIs render an "esc to cancel"
378
- // footer that ANTIGRAVITY_THINKING_PATTERN also matches, so the generic thinking
379
- // check at priority 2 (and the antigravity footer branch at 2.8) would otherwise
380
- // misreport the selection screen as "generating" and NavigationButtons would never
381
- // be shown. Detecting the selection list here — ahead of thinking — is the fix.
382
- // Mirrors the Copilot (priority 0) / Codex (priority 0.8) early-detection pattern.
383
- if (cliToolId === 'antigravity' && cli_patterns_1.ANTIGRAVITY_SELECTION_LIST_PATTERN.test(lastLines)) {
384
- const agyPromptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
385
- const agyPromptDetection = (0, prompt_detector_1.detectPrompt)((0, cli_patterns_1.stripBoxDrawing)(cleanOutput), agyPromptOptions);
386
- return {
387
- status: 'waiting',
388
- confidence: 'high',
389
- reason: exports.STATUS_REASON.ANTIGRAVITY_SELECTION_LIST,
390
- hasActivePrompt: false,
391
- promptDetection: agyPromptDetection,
392
- };
393
- }
394
- // 1. Interactive prompt detection (highest priority)
395
- // This includes yes/no prompts, multiple choice, and approval prompts
396
- const promptOptions = (0, cli_patterns_1.buildDetectPromptOptions)(cliToolId);
397
- // Apply stripBoxDrawing() for Gemini CLI and OpenCode TUI compatibility:
398
- // Gemini wraps prompts in box-drawing characters (╭╮╰╯│─) which prevent
399
- // detectPrompt() from recognizing the prompt content.
400
- // OpenCode TUI uses ┃ borders and █ scrollbar that need stripping.
401
- // For OpenCode, Codex, and Claude, use full cleanOutput instead of lastLines
402
- // (15-line window) because their multiple-choice prompts with descriptions
403
- // can exceed 15 lines. Examples: Codex approval prompts with long file lists,
404
- // Claude "Yes, and don't ask again for: git commit -m ..." options that embed
405
- // full commit messages. detectPrompt() applies its own 50-line window internally.
406
- const promptInput = (cliToolId === 'opencode' || cliToolId === 'codex' || cliToolId === 'claude' || cliToolId === 'copilot')
407
- ? (0, cli_patterns_1.stripBoxDrawing)(cleanOutput)
408
- : (0, cli_patterns_1.stripBoxDrawing)(lastLines);
409
- let promptDetection = (0, prompt_detector_1.detectPrompt)(promptInput, promptOptions);
410
- if (promptDetection.isPrompt) {
411
- // Issue #1160: Codex keeps an ANSWERED approval / numbered-choice block
412
- // ("1. Yes / 2. No" + "press number to confirm" footer) in its transcript
413
- // (non-alternate-screen, so tmux keeps TMUX_HISTORY_LIMIT lines of scrollback for
414
- // it) instead of repainting it away like Claude. detectPrompt's
415
- // 50-line window then keeps matching that dead prompt, so this priority-1 branch
416
- // returns `waiting` even after the user answered and Codex resumed — the sidebar
417
- // status dot stays orange forever (the reported bug). Guard with a position check:
418
- // treat the prompt as active only when it is the bottom-most interactive element.
419
- // If a Codex thinking indicator (• Working / • Ran / …) sits BELOW the prompt block,
420
- // it is stale scrollback — neutralize the detection (so Auto-Yes and the sidebar
421
- // never act on a dead prompt) and fall through to the priority-2.7 running/idle
422
- // check. Unanswered prompts (nothing running below the block) still return `waiting`,
423
- // so Auto-Yes is unaffected.
424
- if (cliToolId === 'codex' && isCodexStalePrompt(contentLines)) {
425
- promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
426
- }
427
- else {
428
- return {
429
- status: 'waiting',
430
- confidence: 'high',
431
- reason: 'prompt_detected',
432
- hasActivePrompt: true,
433
- promptDetection,
434
- };
435
- }
436
- }
437
- // 1.5. Claude CLI selection list detection
438
- // Claude CLI's multi-select/checkbox prompts (e.g., AskUserQuestion with checkboxes)
439
- // use arrow keys + Enter to navigate and toggle, not number input.
440
- // The 15-line window may miss the question line, causing SEC-001a rejection above.
441
- // Detect via the footer instruction pattern and show NavigationButtons instead of PromptPanel.
442
- if (cliToolId === 'claude' && cli_patterns_1.CLAUDE_SELECTION_LIST_FOOTER.test(lastLines)) {
443
- return {
444
- status: 'waiting',
445
- confidence: 'high',
446
- reason: exports.STATUS_REASON.CLAUDE_SELECTION_LIST,
447
- hasActivePrompt: false,
448
- promptDetection,
449
- };
450
- }
451
- // 1.6. Copilot CLI selection list detection — moved to priority 0 (above thinking)
452
- // See comment at priority 0 for rationale.
453
- // 2. Thinking indicator detection - THINKING_TAIL_LINE_COUNT window (narrower)
454
- // CLI tool is actively processing (shows spinner, "Planning...", etc.)
455
- if ((0, cli_patterns_1.detectThinking)(cliToolId, thinkingLines)) {
456
- return {
457
- status: 'running',
458
- confidence: 'high',
459
- reason: 'thinking_indicator',
460
- hasActivePrompt: false,
461
- promptDetection,
462
- };
463
- }
464
- // 2.6. Claude status-bar "esc to interrupt" detection — wider STATUS_CHECK_LINE_COUNT window (Issue #805)
465
- // When Claude runs a subagent Task (e.g., /pm-auto-dev + general-purpose subagent), the
466
- // bottom-of-screen task panel ("⏺ main" / "◯ general-purpose ... 55s" rows) pushes BOTH the
467
- // "✶ Running…" spinner (top of the footer) and the "esc to interrupt" status bar above the
468
- // narrow THINKING_TAIL_LINE_COUNT (5) window used by step 2. The visible "❯" input box then
469
- // matches the input-prompt check at step 3, so the session was misreported as Ready.
470
- //
471
- // The "esc to interrupt" status bar appears only while Claude is actively processing (idle
472
- // sessions show "? for shortcuts" instead) and is repainted live rather than lingering in
473
- // scrollback, so matching it in the wider 15-line footer window is a safe running signal and
474
- // does not reintroduce the Issue #188 spinner-summary false positive (only the spinner+ellipsis
475
- // branch is restricted to the 5-line window).
476
- if (cliToolId === 'claude' && cli_patterns_1.CLAUDE_INTERRUPT_HINT_PATTERN.test(lastLines)) {
477
- return {
478
- status: 'running',
479
- confidence: 'high',
480
- reason: exports.STATUS_REASON.THINKING_INDICATOR,
481
- hasActivePrompt: false,
482
- promptDetection,
483
- };
484
- }
485
- // 2.5. OpenCode status detection (Issue #379)
486
- // OpenCode TUI layout: content area (top) | empty padding (~150 lines) | footer status bar (~6 lines at bottom).
487
- // Standard windowed checks (last N lines) only see footer/padding, never the content area.
488
- //
489
- // Detection strategy:
490
- // A. "esc interrupt" in footer → actively processing (running)
491
- // B. Find footer boundary via "ctrl+t" keybinding line, extract content above it, check for thinking → running
492
- // C. Same content window, check for ▣ Build completion → ready
493
- if (cliToolId === 'opencode') {
494
- // A. Check footer for processing indicator ("esc interrupt" replaces "ctrl+t variants..." during processing)
495
- if (cli_patterns_1.OPENCODE_PROCESSING_INDICATOR.test(lastLines)) {
496
- return {
497
- status: 'running',
498
- confidence: 'high',
499
- reason: 'opencode_processing_indicator',
500
- hasActivePrompt: false,
501
- promptDetection,
502
- };
503
- }
504
- // Extract content area by finding TUI footer boundary dynamically.
505
- // Footer structure (bottom-up): keybinding hints ("ctrl+t variants..."),
506
- // ╹▀▀ separator, model info bar ("Build GPT-5-mini GitHub Copilot"), ┃ padding.
507
- // The keybinding line is the anchor; model bar is 2 lines above it.
508
- // ┃ padding above the model bar becomes empty after stripBoxDrawing and is
509
- // skipped by the lastNonEmpty search below.
510
- const strippedForOpenCode = (0, cli_patterns_1.stripBoxDrawing)(cleanOutput);
511
- const ocLines = strippedForOpenCode.split('\n');
512
- let footerBoundary = Math.max(0, ocLines.length - 7); // fallback: skip 7 lines
513
- for (let i = ocLines.length - 1; i >= Math.max(0, ocLines.length - 10); i--) {
514
- if (/ctrl\+[tp]/.test(ocLines[i])) {
515
- // Exclude keybinding line (i), separator (i-1), and model info bar (i-2)
516
- footerBoundary = Math.max(0, i - 2);
517
- break;
518
- }
519
- }
520
- const contentCandidates = ocLines.slice(0, footerBoundary);
521
- let lastContentIdx = contentCandidates.length - 1;
522
- while (lastContentIdx >= 0 && contentCandidates[lastContentIdx].trim() === '') {
523
- lastContentIdx--;
524
- }
525
- if (lastContentIdx >= 0) {
526
- // B. Check last few content lines for thinking indicators
527
- const contentThinkingWindow = contentCandidates
528
- .slice(Math.max(0, lastContentIdx - thinking_constants_1.THINKING_TAIL_LINE_COUNT + 1), lastContentIdx + 1)
529
- .join('\n');
530
- if ((0, cli_patterns_1.detectThinking)('opencode', contentThinkingWindow)) {
531
- return {
532
- status: 'running',
533
- confidence: 'high',
534
- reason: 'thinking_indicator',
535
- hasActivePrompt: false,
536
- promptDetection,
537
- };
538
- }
539
- // C. Check content area for selection list (Issue #473: fuzzy-search list detection)
540
- // Selection list header ("Select model"/"Select provider") may be far above the
541
- // last content line when many items are listed, so check all content candidates.
542
- const contentCheckWindow = contentCandidates
543
- .slice(Math.max(0, lastContentIdx - STATUS_CHECK_LINE_COUNT + 1), lastContentIdx + 1)
544
- .join('\n');
545
- const fullContentText = contentCandidates.join('\n');
546
- if (cli_patterns_1.OPENCODE_SELECTION_LIST_PATTERN.test(fullContentText)) {
547
- return {
548
- status: 'waiting',
549
- confidence: 'high',
550
- reason: exports.STATUS_REASON.OPENCODE_SELECTION_LIST,
551
- hasActivePrompt: false,
552
- promptDetection,
553
- };
554
- }
555
- // D. Check last few content lines for completion marker (▣ Build · model · time)
556
- if (cli_patterns_1.OPENCODE_RESPONSE_COMPLETE.test(contentCheckWindow)) {
557
- return {
558
- status: 'ready',
559
- confidence: 'high',
560
- reason: exports.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE,
561
- hasActivePrompt: false,
562
- promptDetection,
563
- };
564
- }
565
- // E. Check content area for prompt pattern (Issue #473: "Ask anything..." is in content area,
566
- // not in lastLines, due to OpenCode TUI padding between content and footer)
567
- const { promptPattern: ocPromptPattern } = (0, cli_patterns_1.getCliToolPatterns)('opencode');
568
- if (ocPromptPattern.test(contentCheckWindow)) {
569
- return {
570
- status: 'ready',
571
- confidence: 'high',
572
- reason: exports.STATUS_REASON.PROMPT_DETECTED,
573
- hasActivePrompt: true,
574
- promptDetection,
575
- };
576
- }
577
- }
578
- }
579
- // 2.7. Codex TUI content area detection (thinking + idle prompt)
580
- // Codex TUI layout: conversation area (top) | empty padding (~30 lines) | input area + status bar (bottom).
581
- // Standard windowed checks (last 5/15 lines) only see padding/status bar, missing both:
582
- // A. Thinking indicators (• Ran, • Planning) in the conversation area → should show spinner
583
- // B. Idle prompt (›) at the end of the conversation area → should show ready
584
- // Strategy: find the Codex status bar, extract content above it, then check for thinking/idle.
585
- //
586
- // Issue #1150: the status-bar pattern was relaxed (CODEX_STATUS_BAR_PATTERN) so it
587
- // matches v0.141's "model · path" bar (no "N% left ·"). Without this, codexFooterBoundary
588
- // stayed -1, this whole block was skipped, and generating sessions fell through to the
589
- // input-prompt check below and were misreported as `ready` (static dot, no glow).
590
- if (cliToolId === 'codex') {
591
- let codexFooterBoundary = -1;
592
- for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
593
- if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(contentLines[ci])) {
594
- codexFooterBoundary = ci;
595
- break;
596
- }
597
- }
598
- if (codexFooterBoundary >= 0) {
599
- // Find last non-empty content line above footer (skip padding + input area)
600
- let lastContentIdx = codexFooterBoundary - 1;
601
- while (lastContentIdx >= 0 && contentLines[lastContentIdx].trim() === '') {
602
- lastContentIdx--;
603
- }
604
- if (lastContentIdx >= 0) {
605
- // A. Check content area for thinking indicators (wider window than step 2)
606
- const codexThinkingWindow = contentLines
607
- .slice(Math.max(0, lastContentIdx - thinking_constants_1.THINKING_TAIL_LINE_COUNT + 1), lastContentIdx + 1)
608
- .join('\n');
609
- if ((0, cli_patterns_1.detectThinking)('codex', codexThinkingWindow)) {
610
- return {
611
- status: 'running',
612
- confidence: 'high',
613
- reason: 'thinking_indicator',
614
- hasActivePrompt: false,
615
- promptDetection,
616
- };
617
- }
618
- // A2. (Removed — Codex selection list detection moved to priority 0.8,
619
- // before detectPrompt, to prevent false multiple_choice detection. Issue #622)
620
- // B. Check if the last content line is the idle › prompt.
621
- // The last non-empty line above the status bar is the current active line.
622
- // When Codex is idle, this is the › prompt (with optional suggestion text).
623
- // When processing, this is command output (not ›), so the check naturally fails.
624
- const lastContentLine = contentLines[lastContentIdx].trim();
625
- if (cli_patterns_1.CODEX_PROMPT_PATTERN.test(lastContentLine)) {
626
- return {
627
- status: 'ready',
628
- confidence: 'high',
629
- reason: 'input_prompt',
630
- hasActivePrompt: false,
631
- promptDetection,
632
- };
633
- }
634
- // C. Fallback: status bar present but neither thinking nor idle › detected.
635
- // This means Codex is actively processing — command output has pushed the
636
- // • Ran/• Working indicators beyond the 5-line thinking window.
637
- // The status bar ("model · N% left · path") is always visible during Codex
638
- // sessions, and the only idle state (›) was checked in B above.
639
- return {
640
- status: 'running',
641
- confidence: 'high',
642
- reason: 'thinking_indicator',
643
- hasActivePrompt: false,
644
- promptDetection,
645
- };
646
- }
647
- }
648
- else {
649
- // D. Status-bar-independent running detection (Issue #1150, mitigation B).
650
- // Defense-in-depth for the next Codex CLI status-bar format drift: if the bar
651
- // can't be located (the exact failure that broke Issue #1150), fall back to the
652
- // Codex thinking indicator in the wider 15-line footer window — mirroring
653
- // Claude's priority 2.6 interrupt-hint net. Gated so idle frames are unaffected:
654
- // only fires when the tail is NOT the idle › prompt, so an idle session still
655
- // falls through to the 'ready' input-prompt check at step 3.
656
- let codexTailIdx = contentLines.length - 1;
657
- while (codexTailIdx >= 0 && contentLines[codexTailIdx].trim() === '') {
658
- codexTailIdx--;
659
- }
660
- const codexTailIsIdlePrompt = codexTailIdx >= 0 && cli_patterns_1.CODEX_PROMPT_PATTERN.test(contentLines[codexTailIdx].trim());
661
- if (!codexTailIsIdlePrompt && (0, cli_patterns_1.detectThinking)('codex', lastLines)) {
662
- return {
663
- status: 'running',
664
- confidence: 'high',
665
- reason: 'thinking_indicator',
666
- hasActivePrompt: false,
667
- promptDetection,
668
- };
669
- }
670
- }
671
- }
672
- // 2.8. Antigravity (agy) footer-based detection (Issue #988)
673
- // agy renders inline (scrollback retained), with the status bar as the last
674
- // non-empty line and a bare "> " input box always visible just above it — even
675
- // while generating. So the always-visible "> " would make step 3's generic
676
- // prompt check report ready during generation. The footer is the source of
677
- // truth: "esc to cancel" + braille spinner / "Generating..." while running,
678
- // "? for shortcuts" when idle. Resolve running explicitly here first, then idle.
679
- if (cliToolId === 'antigravity') {
680
- // Running: thinking footer/spinner anywhere in the 15-line footer window.
681
- if ((0, cli_patterns_1.detectThinking)('antigravity', lastLines)) {
682
- return {
683
- status: 'running',
684
- confidence: 'high',
685
- reason: exports.STATUS_REASON.THINKING_INDICATOR,
686
- hasActivePrompt: false,
687
- promptDetection,
688
- };
689
- }
690
- // Idle: bare "> " input prompt visible and the response has completed.
691
- const { promptPattern: agyPromptPattern } = (0, cli_patterns_1.getCliToolPatterns)('antigravity');
692
- if (agyPromptPattern.test(lastLines)) {
693
- return {
694
- status: 'ready',
695
- confidence: 'high',
696
- reason: exports.STATUS_REASON.INPUT_PROMPT,
697
- hasActivePrompt: false,
698
- promptDetection,
699
- };
700
- }
701
- }
702
- // 3. Input prompt detection
703
- // CLI tool is waiting for user input (shows >, ❯, ›, $, %, etc.)
704
- const { promptPattern } = (0, cli_patterns_1.getCliToolPatterns)(cliToolId);
705
- if (promptPattern.test(lastLines)) {
706
- return {
707
- status: 'ready',
708
- confidence: 'high',
709
- reason: 'input_prompt',
710
- hasActivePrompt: false,
711
- promptDetection,
712
- };
713
- }
714
- // 4. Time-based heuristic
715
- // If no new output for >5 seconds, assume processing is complete
716
- if (lastOutputTimestamp) {
717
- const elapsed = Date.now() - lastOutputTimestamp.getTime();
718
- if (elapsed > STALE_OUTPUT_THRESHOLD_MS) {
719
- return {
720
- status: 'ready',
721
- confidence: 'low',
722
- reason: 'no_recent_output',
723
- hasActivePrompt: false,
724
- promptDetection,
725
- };
726
- }
727
- }
728
- // 5. Default: assume running with low confidence
729
- // This is a safe default when we cannot determine the state
125
+ const frame = (0, frame_1.normalizeFrame)(output);
126
+ const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, { lastOutputTimestamp });
730
127
  return {
731
- status: 'running',
732
- confidence: 'low',
733
- reason: 'default',
734
- hasActivePrompt: false,
735
- promptDetection,
128
+ status: verdict.status,
129
+ confidence: verdict.confidence,
130
+ reason: verdict.reason,
131
+ hasActivePrompt: verdict.hasActivePrompt,
132
+ evidence: verdict.evidence,
133
+ // Every chain exit carries one; the fallback keeps the required field
134
+ // total rather than letting a future branch publish `undefined` into a
135
+ // payload that has always had it (Issue #408's defense-in-depth).
136
+ promptDetection: verdict.promptDetection ?? { isPrompt: false, cleanContent: frame.clean },
736
137
  };
737
138
  }