commandmate 0.42.2 → 0.43.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 (421) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +148 -148
  3. package/.next/app-path-routes-manifest.json +25 -25
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update-check/route.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  21. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  24. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/agent-event/route.js +103 -1
  31. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  32. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  34. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  45. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  46. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/relays/route.js +1 -1
  48. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  49. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/clone/route.js +1 -1
  56. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/restore/route.js +1 -1
  60. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/route.js +1 -1
  63. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/scan/route.js +1 -1
  66. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/sync/route.js +1 -1
  69. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  73. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  74. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/[id]/route.js +1 -1
  78. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/skills/route.js +1 -1
  83. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/slash-commands/route.js +1 -1
  85. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
  104. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/route.js +1 -103
  173. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
  176. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
  179. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
  182. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
  186. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +104 -2
  189. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/route.js +1 -1
  225. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  230. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/worktrees/[id]/page.js +9 -9
  241. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  243. package/.next/server/app-paths-manifest.json +25 -25
  244. package/.next/server/chunks/1068.js +1 -1
  245. package/.next/server/chunks/1210.js +1 -1
  246. package/.next/server/chunks/1501.js +3 -3
  247. package/.next/server/chunks/1990.js +1 -1
  248. package/.next/server/chunks/2119.js +1 -1
  249. package/.next/server/chunks/22.js +1 -1
  250. package/.next/server/chunks/2328.js +1 -1
  251. package/.next/server/chunks/2404.js +4 -3
  252. package/.next/server/chunks/2445.js +1 -1
  253. package/.next/server/chunks/252.js +1 -1
  254. package/.next/server/chunks/2816.js +1 -1
  255. package/.next/server/chunks/3543.js +1 -1
  256. package/.next/server/chunks/3730.js +1 -1
  257. package/.next/server/chunks/3945.js +1 -1
  258. package/.next/server/chunks/4207.js +3 -3
  259. package/.next/server/chunks/5064.js +1 -1
  260. package/.next/server/chunks/5571.js +1 -1
  261. package/.next/server/chunks/5742.js +1 -1
  262. package/.next/server/chunks/5775.js +1 -1
  263. package/.next/server/chunks/611.js +1 -1
  264. package/.next/server/chunks/6130.js +1 -1
  265. package/.next/server/chunks/6285.js +1 -1
  266. package/.next/server/chunks/6491.js +103 -0
  267. package/.next/server/chunks/6661.js +1 -1
  268. package/.next/server/chunks/6781.js +1 -1
  269. package/.next/server/chunks/6793.js +1 -1
  270. package/.next/server/chunks/7491.js +3 -0
  271. package/.next/server/chunks/7685.js +1 -1
  272. package/.next/server/chunks/7905.js +1 -1
  273. package/.next/server/chunks/8581.js +2 -2
  274. package/.next/server/chunks/8673.js +6 -6
  275. package/.next/server/chunks/8728.js +2 -2
  276. package/.next/server/chunks/8791.js +1 -1
  277. package/.next/server/chunks/8800.js +4 -3
  278. package/.next/server/chunks/8918.js +5 -5
  279. package/.next/server/chunks/9130.js +3 -3
  280. package/.next/server/chunks/{8052.js → 9353.js} +4 -2
  281. package/.next/server/chunks/9390.js +3 -0
  282. package/.next/server/chunks/9627.js +3 -3
  283. package/.next/server/chunks/967.js +1 -0
  284. package/.next/server/chunks/9731.js +3 -3
  285. package/.next/server/chunks/9882.js +3 -3
  286. package/.next/server/middleware-manifest.json +5 -5
  287. package/.next/server/pages/500.html +1 -1
  288. package/.next/server/server-reference-manifest.json +1 -1
  289. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  290. package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-940df9b11fadafc6.js} +1 -1
  291. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  292. package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
  293. package/.next/static/chunks/7705-1f58d4c03d991fcf.js +1 -0
  294. package/.next/static/chunks/8165-3525fb42f1b4976e.js +1 -0
  295. package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-057c850cd0df978e.js} +1 -1
  296. package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
  297. package/.next/static/chunks/app/skills/[skillId]/page-74aac15286504ef4.js +1 -0
  298. package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
  299. package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +1 -0
  300. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  301. package/.next/trace +13 -13
  302. package/README.md +3 -3
  303. package/dist/cli/commands/ask.d.ts.map +1 -1
  304. package/dist/cli/commands/ask.js +23 -149
  305. package/dist/cli/commands/reply.d.ts +40 -0
  306. package/dist/cli/commands/reply.d.ts.map +1 -0
  307. package/dist/cli/commands/reply.js +133 -0
  308. package/dist/cli/commands/wait.d.ts +5 -0
  309. package/dist/cli/commands/wait.d.ts.map +1 -1
  310. package/dist/cli/commands/wait.js +10 -1
  311. package/dist/cli/docs/agent-operations.d.ts +2 -2
  312. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  313. package/dist/cli/docs/agent-operations.js +13 -0
  314. package/dist/cli/program.d.ts.map +1 -1
  315. package/dist/cli/program.js +4 -0
  316. package/dist/cli/utils/reply-ledger.d.ts +95 -0
  317. package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
  318. package/dist/cli/utils/reply-ledger.js +187 -0
  319. package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
  320. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
  321. package/dist/lib/cli-tools/copilot-executable.js +21 -5
  322. package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
  323. package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
  324. package/dist/lib/cli-tools/opencode-executable.js +179 -0
  325. package/dist/lib/cli-tools/types.d.ts +1 -1
  326. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  327. package/dist/lib/cli-tools/types.js +5 -1
  328. package/dist/lib/detection/tools/verified-against.d.ts +15 -0
  329. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  330. package/dist/lib/detection/tools/verified-against.js +17 -1
  331. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  332. package/dist/lib/detection/version-probes.js +14 -1
  333. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
  334. package/dist/lib/session/tmux-session-surface.js +1 -1
  335. package/dist/server/locales/en/worktree.json +44 -14
  336. package/dist/server/locales/ja/worktree.json +44 -14
  337. package/dist/server/server.js +23 -0
  338. package/dist/server/src/config/cli-tool-timing-config.js +19 -1
  339. package/dist/server/src/config/detection-evidence-config.js +3 -0
  340. package/dist/server/src/config/schedule-config.js +55 -1
  341. package/dist/server/src/lib/auto-yes-poller.js +47 -4
  342. package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
  343. package/dist/server/src/lib/cli-tools/base.js +6 -2
  344. package/dist/server/src/lib/cli-tools/command-code.js +55 -1
  345. package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
  346. package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
  347. package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
  348. package/dist/server/src/lib/cli-tools/index.js +3 -1
  349. package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
  350. package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
  351. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  352. package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
  353. package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
  354. package/dist/server/src/lib/cli-tools/opencode.js +29 -5
  355. package/dist/server/src/lib/cli-tools/types.js +5 -1
  356. package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
  357. package/dist/server/src/lib/cmate-parser.js +12 -0
  358. package/dist/server/src/lib/cmate-validator.js +13 -1
  359. package/dist/server/src/lib/detection/cli-patterns.js +78 -2
  360. package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
  361. package/dist/server/src/lib/detection/status-detector.js +10 -1
  362. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
  363. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
  364. package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
  365. package/dist/server/src/lib/detection/tools/registry.js +2 -0
  366. package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
  367. package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
  368. package/dist/server/src/lib/detection/upstream-faults.js +8 -0
  369. package/dist/server/src/lib/detection/version-probes.js +14 -1
  370. package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
  371. package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
  372. package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
  373. package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
  374. package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
  375. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
  376. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
  377. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
  378. package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
  379. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
  380. package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
  381. package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
  382. package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
  383. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
  384. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
  385. package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
  386. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
  387. package/dist/server/src/lib/hooks/sources/registry.js +2 -0
  388. package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
  389. package/dist/server/src/lib/job-executor.js +2 -1
  390. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
  391. package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
  392. package/dist/server/src/lib/relay/relay-delivery.js +4 -1
  393. package/dist/server/src/lib/session/agent-event-state.js +24 -0
  394. package/dist/server/src/lib/session/claude-executor.js +184 -10
  395. package/dist/server/src/lib/session/current-output-builder.js +27 -3
  396. package/dist/server/src/lib/session/send-user-message.js +4 -0
  397. package/dist/server/src/lib/session/structured-prompt.js +54 -0
  398. package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
  399. package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
  400. package/dist/server/src/lib/tmux/tmux.js +48 -2
  401. package/dist/server/src/lib/verification/env-clean-gate.js +87 -5
  402. package/dist/server/src/types/cli-tool-contracts.js +10 -2
  403. package/dist/types/cli-tool-contracts.d.ts +16 -5
  404. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  405. package/dist/types/cli-tool-contracts.js +10 -2
  406. package/package.json +2 -1
  407. package/release-notes/0.43.0.json +130 -0
  408. package/scripts/hooks/cmate-agent-event.sh +14 -0
  409. package/scripts/opencode-v2/launch.sh +226 -0
  410. package/.next/server/chunks/4443.js +0 -3
  411. package/.next/server/chunks/5164.js +0 -1
  412. package/.next/server/chunks/650.js +0 -1
  413. package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
  414. package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
  415. package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
  416. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
  417. package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
  418. package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
  419. package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
  420. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
  421. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
@@ -4,8 +4,8 @@
4
4
  * Shared between response-poller.ts and API routes
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_TRAILED_STATUS_BAR_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_EFFORT_PICKER_FOOTER_PATTERN = exports.CODEX_PICKER_FOOTER_PATTERN = exports.CODEX_FORM_SUBMIT_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_TRUST_QUESTION_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
8
- exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = void 0;
7
+ exports.findOpencodeV2DialogTitle = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = exports.OPENCODE_V2_THINKING_PATTERN = exports.OPENCODE_V2_FOOTER_PATTERN = exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_TRAILED_STATUS_BAR_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_EFFORT_PICKER_FOOTER_PATTERN = exports.CODEX_PICKER_FOOTER_PATTERN = exports.CODEX_FORM_SUBMIT_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_TRUST_QUESTION_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
8
+ exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_V2_SKIP_PATTERNS = void 0;
9
9
  exports.isCodexTurnActive = isCodexTurnActive;
10
10
  exports.findClaudeChromeStart = findClaudeChromeStart;
11
11
  exports.isCodexPromptReady = isCodexPromptReady;
@@ -17,6 +17,7 @@ exports.findOpenCodeChromeStart = findOpenCodeChromeStart;
17
17
  exports.findOpenCodeUserEchoEnd = findOpenCodeUserEchoEnd;
18
18
  exports.findOpenCodeComposerRows = findOpenCodeComposerRows;
19
19
  exports.stripOpenCodeGutter = stripOpenCodeGutter;
20
+ exports.isOpencodeV2ComposerVisible = isOpencodeV2ComposerVisible;
20
21
  exports.readCopilotStatusBar = readCopilotStatusBar;
21
22
  exports.findCopilotChromeStart = findCopilotChromeStart;
22
23
  exports.isCopilotSelectionFrame = isCopilotSelectionFrame;
@@ -1498,6 +1499,68 @@ exports.OPENCODE_SKIP_PATTERNS = [
1498
1499
  exports.OPENCODE_FOOTER_STATUS_PATTERN,
1499
1500
  exports.PASTED_TEXT_PATTERN,
1500
1501
  ];
1502
+ // =============================================================================
1503
+ // OpenCode V2 (`opencode2`, Issue #2934)
1504
+ // =============================================================================
1505
+ //
1506
+ // A separate tool id from `opencode` (Epic #2370, decision 1). Its TUI is drawn
1507
+ // by the same toolkit and many rows look alike, but v1's constants are v1's:
1508
+ // they are left exactly as they are, and v2 names its own here so a change on
1509
+ // either side cannot move the other. Phase 1 reads only what the send path and
1510
+ // the fallback status reader need; the approval dialog (`Always allow`, the
1511
+ // reverse of v1's `Allow always`), the completion row and the session tabs are
1512
+ // Phase 3's.
1513
+ /**
1514
+ * OpenCode V2's empty composer: the input box's `┃` gutter with the
1515
+ * `Ask anything…` placeholder on the same row (2.0.18 draws U+2026; the ASCII
1516
+ * `...` is accepted too, as for v1 since #2915).
1517
+ *
1518
+ * Measured on 2.0.18 at 80x200 (2026-09-28):
1519
+ * ` ┃ Ask anything… "Fix broken tests"`. Match against the ANSI-stripped
1520
+ * frame BEFORE `stripBoxDrawing`, which removes the gutter this anchors on.
1521
+ */
1522
+ exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN = /^[^\S\n]*[\u2502\u2503][^\S\n]*Ask anything(?:\.\.\.|\u2026)/m;
1523
+ /**
1524
+ * OpenCode V2's footer, which ends in `ctrl+p commands` on every frame the
1525
+ * TUI draws (before a turn: `<path>:<branch> shift+tab agents ctrl+p commands`;
1526
+ * after one: `<path>:<branch> 8.8K (1%) ctrl+p commands`, 2.0.18).
1527
+ *
1528
+ * Proof that the TUI — and so its composer — is on screen, NOT that it is idle:
1529
+ * a running turn keeps the footer.
1530
+ */
1531
+ exports.OPENCODE_V2_FOOTER_PATTERN = /ctrl\+p commands/;
1532
+ /**
1533
+ * OpenCode V2 working indicator: the footer's `esc interrupt` hint, drawn only
1534
+ * while a turn is running (2.0.18).
1535
+ */
1536
+ exports.OPENCODE_V2_THINKING_PATTERN = /esc interrupt/;
1537
+ /**
1538
+ * Whether OpenCode V2's composer is on screen, so a send may type into it
1539
+ * (Issue #2934, D6): the gutter-anchored placeholder, or the footer.
1540
+ *
1541
+ * @param text - ANSI-stripped capture, box drawing intact
1542
+ */
1543
+ function isOpencodeV2ComposerVisible(text) {
1544
+ return exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test(text) || exports.OPENCODE_V2_FOOTER_PATTERN.test(text);
1545
+ }
1546
+ /**
1547
+ * The OpenCode V2 dialog title row and its reader (Issue #2971) live in a
1548
+ * browser-safe leaf since Issue #2983, because the chat surface's dialog card
1549
+ * reads the same row to decide whether v2's model keys may close the dialog
1550
+ * first. Re-exported here so every server-side caller keeps one import site.
1551
+ */
1552
+ var dialog_title_1 = require("./tools/opencode-v2/dialog-title");
1553
+ Object.defineProperty(exports, "OPENCODE_V2_DIALOG_TITLE_PATTERN", { enumerable: true, get: function () { return dialog_title_1.OPENCODE_V2_DIALOG_TITLE_PATTERN; } });
1554
+ Object.defineProperty(exports, "findOpencodeV2DialogTitle", { enumerable: true, get: function () { return dialog_title_1.findOpencodeV2DialogTitle; } });
1555
+ /** OpenCode V2 rows that are chrome, never reply content. */
1556
+ exports.OPENCODE_V2_SKIP_PATTERNS = [
1557
+ exports.OPENCODE_SEPARATOR_PATTERN,
1558
+ exports.OPENCODE_V2_FOOTER_PATTERN,
1559
+ exports.OPENCODE_V2_THINKING_PATTERN,
1560
+ /Ask anything(?:\.\.\.|\u2026)/,
1561
+ /^Build\s+·/,
1562
+ exports.PASTED_TEXT_PATTERN,
1563
+ ];
1501
1564
  /**
1502
1565
  * Copilot prompt pattern (Issue #545)
1503
1566
  * Copilot CLI shows "❯" followed by cursor/text hint:
@@ -2669,6 +2732,9 @@ function detectThinking(cliToolId, content) {
2669
2732
  case 'command-code':
2670
2733
  result = exports.COMMAND_CODE_THINKING_PATTERN.test(content);
2671
2734
  break;
2735
+ case 'opencode-v2':
2736
+ result = exports.OPENCODE_V2_THINKING_PATTERN.test(content);
2737
+ break;
2672
2738
  default:
2673
2739
  result = exports.CLAUDE_THINKING_PATTERN.test(content);
2674
2740
  }
@@ -2787,6 +2853,16 @@ function getCliToolPatterns(cliToolId) {
2787
2853
  thinkingPattern: exports.COMMAND_CODE_THINKING_PATTERN,
2788
2854
  skipPatterns: [...exports.COMMAND_CODE_SKIP_PATTERNS],
2789
2855
  };
2856
+ // Issue #2934: OpenCode V2's own constants (see OPENCODE_V2_* above). The
2857
+ // separator row is the same half-block rule v1 draws, so v1's pattern is
2858
+ // reused as a value; nothing of v1's is changed.
2859
+ case 'opencode-v2':
2860
+ return {
2861
+ promptPattern: exports.OPENCODE_V2_IDLE_COMPOSER_PATTERN,
2862
+ separatorPattern: exports.OPENCODE_SEPARATOR_PATTERN,
2863
+ thinkingPattern: exports.OPENCODE_V2_THINKING_PATTERN,
2864
+ skipPatterns: [...exports.OPENCODE_V2_SKIP_PATTERNS],
2865
+ };
2790
2866
  default:
2791
2867
  // Default to Claude patterns
2792
2868
  return getCliToolPatterns('claude');
@@ -62,7 +62,7 @@
62
62
  * @see Issue #1784, Phase 2 of the model/effort visibility series
63
63
  */
64
64
  Object.defineProperty(exports, "__esModule", { value: true });
65
- exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
65
+ exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_EFFORT_ROW_PATTERN = exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
66
66
  exports.resolveEffortToken = resolveEffortToken;
67
67
  exports.extractModelInfo = extractModelInfo;
68
68
  exports.deriveEffortFromModelId = deriveEffortFromModelId;
@@ -288,14 +288,83 @@ function readCodexFooter(line) {
288
288
  * literal-anchored parts, and the greedy prefix class is disjoint from `\S`.
289
289
  */
290
290
  exports.CLAUDE_STARTUP_BANNER_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+with\s+(minimal|low|medium|high|xhigh)\s+effort\b/i;
291
+ /**
292
+ * The startup banner as claude 2.1.28x draws it: `<model> · <plan>` with no
293
+ * effort clause (Issue #2955).
294
+ *
295
+ * Measured on claude 2.1.284 (`tests/fixtures/claude-session-start-2955/`):
296
+ * `▝▜██████▀ Sonnet 5.5 · Claude Max`
297
+ * The effort moved off this row to a right-aligned one of its own
298
+ * ({@link CLAUDE_EFFORT_ROW_PATTERN}). Issue #3023 measured on 2.1.285 that
299
+ * this is the shape at the model's DEFAULT effort only: a non-default effort
300
+ * brings the clause back (`Opus 5.5 with xhigh effort · Claude Max`), which
301
+ * {@link CLAUDE_STARTUP_BANNER_PATTERN} reads
302
+ * (`tests/fixtures/claude-effort-default-3023/`).
303
+ *
304
+ * Without the `with … effort` anchor, a box-framed table row containing ` · `
305
+ * would read as a banner — the reason #2361 declined to widen
306
+ * {@link CLAUDE_STARTUP_BANNER_PATTERN}. The anchor here is the plan instead:
307
+ * the separator must be followed by `Claude <Plan>`, the spelling measured on
308
+ * 2.1.284. `API Usage Billing` is deliberately NOT accepted yet: the only frames
309
+ * that carry it are #2361's 2.1.263 Haiku banners, and
310
+ * `model-info-claude-switch-2361.test.ts` pins those as an honest unknown
311
+ * (`fullscreen-after-clear`). The hook's `SessionStart` names the model on
312
+ * those sessions. `·` is excluded from the model group so the lazy
313
+ * match stops at the first separator, and a label still carrying `with …
314
+ * effort` (a truncated old-format banner) is refused by the caller.
315
+ *
316
+ * Tried only after the old pattern, so a 2.1.232-shaped line keeps its effort.
317
+ */
318
+ exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F·]*?)\s+·\s+Claude\s+[A-Za-z]+\b/;
319
+ /**
320
+ * The right-aligned effort row claude 2.1.28x draws under its banner
321
+ * (Issue #2955): `◐ medium · /effort`.
322
+ *
323
+ * Anchored on the trailing `· /effort` hint, which is chrome and nothing a
324
+ * reply would end a line with; the leading glyph is any one non-space
325
+ * character (the dial changes with the level). The word goes through
326
+ * {@link resolveEffortToken}, so anything outside the known levels reads as no
327
+ * effort rather than as a guess.
328
+ *
329
+ * The row is drawn on the first frame only; after the first turn it is gone
330
+ * (Issue #3023), so a later frame reads the model and no effort.
331
+ */
332
+ exports.CLAUDE_EFFORT_ROW_PATTERN = /^\s*\S\s+([A-Za-z]+)\s+·\s+\/effort\s*$/;
291
333
  function readClaudeBanner(line) {
292
334
  const match = exports.CLAUDE_STARTUP_BANNER_PATTERN.exec(line);
293
- if (!match)
335
+ if (match) {
336
+ const model = match[1].trim();
337
+ if (!isPlausibleModelLabel(model))
338
+ return null;
339
+ return { model, effort: resolveEffortToken(match[2]) };
340
+ }
341
+ // Issue #2955: the 2.1.28x shape, no effort on the row.
342
+ const current = exports.CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN.exec(line);
343
+ if (!current)
294
344
  return null;
295
- const model = match[1].trim();
296
- if (!isPlausibleModelLabel(model))
345
+ const model = current[1].trim();
346
+ if (/\swith\s/i.test(model) || !isPlausibleModelLabel(model))
297
347
  return null;
298
- return { model, effort: resolveEffortToken(match[2]) };
348
+ return { model, effort: null };
349
+ }
350
+ function readClaudeEffortRow(line) {
351
+ const match = exports.CLAUDE_EFFORT_ROW_PATTERN.exec(line);
352
+ if (!match)
353
+ return null;
354
+ const effort = resolveEffortToken(match[1]);
355
+ return effort === null ? null : { model: null, effort };
356
+ }
357
+ /**
358
+ * The banner, with the effort filled from the 2.1.28x effort row when the
359
+ * banner itself names none (Issue #2955). The row is consulted only for a
360
+ * banner that was read, so it never supplies an effort on its own.
361
+ */
362
+ function readClaudeBannerWithEffort(captureText) {
363
+ const banner = scanFromEnd(captureText, readClaudeBanner);
364
+ if (!banner || banner.effort !== null)
365
+ return banner;
366
+ const row = scanFromEnd(captureText, readClaudeEffortRow);
367
+ return row ? { model: banner.model, effort: row.effort } : banner;
299
368
  }
300
369
  /**
301
370
  * Reads `<model>[ with <effort> effort]` off the line Claude prints when the
@@ -341,7 +410,10 @@ function readClaudeBanner(line) {
341
410
  * Billing`), so {@link CLAUDE_STARTUP_BANNER_PATTERN} does not read it and
342
411
  * the confirmation line is what publishes the model there. The banner
343
412
  * pattern is deliberately not widened: without the `with … effort` anchor
344
- * a box-framed table row containing ` · ` would read as a banner.
413
+ * a box-framed table row containing ` · ` would read as a banner. (#2955
414
+ * added a second, plan-anchored pattern for the 2.1.28x banner —
415
+ * {@link CLAUDE_STARTUP_BANNER_V2_1_28X_PATTERN} — which accepts
416
+ * `· Claude <Plan>` only, so this Haiku row is still not read.)
345
417
  * - **`/fast` prints `⎿ ↯ Fast mode ON · model set to Opus 5 · $10/$50 per
346
418
  * Mtok` and is a model switch** (`PostModelSwitch` reported
347
419
  * `claude-fable-5-1` → `claude-opus-5[1m]` on the same keypress). It is NOT
@@ -747,7 +819,7 @@ function extractModelInfo(cliToolId, captureText) {
747
819
  // hooks name the model on `SessionStart` alone — `/model` fires none of
748
820
  // the events CommandMate registers — so on a switch the pane is the only
749
821
  // channel that hears it.
750
- return (scanFromEnd(captureText, readClaudeBanner) ??
822
+ return (readClaudeBannerWithEffort(captureText) ??
751
823
  scanFromEnd(captureText, readClaudeModelSwitchLine) ??
752
824
  unknown());
753
825
  case 'antigravity':
@@ -31,6 +31,7 @@ exports.detectSessionStatus = detectSessionStatus;
31
31
  const status_reason_1 = require("./status-reason");
32
32
  const frame_1 = require("./tools/frame");
33
33
  const registry_1 = require("./tools/registry");
34
+ const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
34
35
  var status_reason_2 = require("./status-reason");
35
36
  Object.defineProperty(exports, "STATUS_REASON", { enumerable: true, get: function () { return status_reason_2.STATUS_REASON; } });
36
37
  /**
@@ -139,7 +140,15 @@ Object.defineProperty(exports, "STATUS_CHECK_LINE_COUNT", { enumerable: true, ge
139
140
  */
140
141
  function detectSessionStatus(output, cliToolId, lastOutputTimestamp) {
141
142
  const frame = (0, frame_1.normalizeFrame)(output);
142
- const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, { lastOutputTimestamp });
143
+ const verdict = (0, registry_1.getToolStatusDetector)(cliToolId).detect(frame, {
144
+ lastOutputTimestamp,
145
+ // Issue #2991: the same presence reading Auto-Yes and History use, so an
146
+ // unvouched numbered list is not `waiting` here either (and therefore
147
+ // neither `isPromptWaiting` nor a send refusal). Consulted only by tools
148
+ // that set `requireVouchedPrompt`; `legacy` tools and non-`multiple_choice`
149
+ // prompts come back `present: true` regardless.
150
+ isPromptVouched: (prompt) => (0, auto_yes_dialog_gate_1.evaluateDialogPresence)(cliToolId, prompt.promptData?.type, output).present,
151
+ });
143
152
  return {
144
153
  status: verdict.status,
145
154
  confidence: verdict.confidence,
@@ -155,10 +155,11 @@ exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
155
155
  * | `Press space to select or enter to save for next conversation` | `/experimental` | 1st |
156
156
  * | `Press space to select or enter to save` | `/experimental` (0.155.1) | 1st |
157
157
  * | `left/right group · enter edit shortcut · … · esc close` | `/keymap` | 2nd |
158
+ * | `enter continue · esc skip` | update offer (0.157.1, Issue #3020) | 2nd |
158
159
  *
159
160
  * No `/g` (keeps `.test()` stateless) and no nested quantifiers (ReDoS-safe).
160
161
  */
161
- exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back)/i;
162
+ exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back|skip)/i;
162
163
  const INITIAL_SGR = { bold: false, dim: false, fg: null };
163
164
  /**
164
165
  * Apply one SGR parameter list to the running attribute state.
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ /**
3
+ * OpenCode V2 screen detector — the fallback reader (Issue #2934, Phase 1).
4
+ *
5
+ * OpenCode V2's state comes from its server's SSE stream
6
+ * (`@/lib/hooks/sources/opencode-v2`); this module is what decides when that
7
+ * stream is not there (a pane launched `--standalone`, a subscription that has
8
+ * not reattached yet). It reads, in this order:
9
+ *
10
+ * - the approval dialog's button strip (`Allow once Always allow Reject`)
11
+ * → `waiting` (Issue #2965);
12
+ * - the question form's key hints (`↑↓ select enter submit esc dismiss`)
13
+ * → `waiting` (Issue #2965);
14
+ * - a dialog's title row (`Select variant … esc`, the model / variant
15
+ * pickers, Commands, Sessions, Select agent) anywhere on the pane
16
+ * → `waiting` (Issue #2971);
17
+ * - the footer's `esc interrupt` hint → `running`;
18
+ * - the completion row (`Build · <model> · 3.5s · 11.2 tok/s`) as the last
19
+ * transcript row → `ready` (Issue #2965);
20
+ * - the gutter-anchored empty composer (`┃ Ask anything…`) → `ready`;
21
+ * - otherwise the footer without that hint (`… 8.6K (1%) ctrl+p commands`,
22
+ * the frame after a turn, whose composer is a bare gutter) → `ready`.
23
+ *
24
+ * Both dialogs are drawn INSIDE the composer's `┃` gutter and replace the
25
+ * footer altogether (measured on 2.0.18, 80x200, 2026-09-29:
26
+ * `tests/fixtures/opencode-v2-live-2945/permission-required.txt` /
27
+ * `question.txt`), so before #2965 they reached the floor as `running` /
28
+ * `default` — an unclassified frame, which is what wrote the "could not parse
29
+ * it" row into the chat while the structured layer held the very approval.
30
+ *
31
+ * v1's opencode detector is deliberately not reused: its dialog rule keys on
32
+ * v1's wording (`Allow always`, the reverse word order) and would misread v2.
33
+ *
34
+ * `detectDialog` (Issue #2984) reads the same three surfaces for the Auto-Yes
35
+ * gate (`polling/auto-yes-dialog-gate`), measured on 2.0.18 at 80x200
36
+ * (2026-09-29, `tests/fixtures/opencode-v2-dialogs-2984/`): the approval strip
37
+ * (`keys` — a typed digit leaves it open), the question form (`numbered`,
38
+ * `answer_only` — a typed `2` alone submitted `Blue`) and a dialog title
39
+ * (`keys` — a digit goes into the filter). v2's approvals and questions are
40
+ * still answered through the agent's own API (#2945); what the gate needs from
41
+ * this module is the NO — an agent's reply that quotes a `❯ 1. Yes` dialog is
42
+ * none of the three, so Auto-Yes does not type into the composer for it.
43
+ *
44
+ * @module lib/detection/tools/opencode-v2/detect
45
+ */
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.opencodeV2StatusDetector = exports.OPENCODE_V2_PERMISSION_OPTIONS = exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = exports.OPENCODE_V2_QUESTION_PATTERN = exports.OPENCODE_V2_PERMISSION_PATTERN = exports.VERIFIED_AGAINST = void 0;
48
+ exports.endsWithTurnComplete = endsWithTurnComplete;
49
+ const cli_patterns_1 = require("../../cli-patterns");
50
+ const status_reason_1 = require("../../status-reason");
51
+ const run_detection_1 = require("../run-detection");
52
+ const verified_against_1 = require("../verified-against");
53
+ exports.VERIFIED_AGAINST = verified_against_1.OPENCODE_V2_VERIFIED_AGAINST;
54
+ /**
55
+ * The approval dialog's button strip, on the composer's own `┃` gutter:
56
+ * `┃ Allow once Always allow Reject ctrl+f fullscreen ⇆ select enter con…`
57
+ * (2.0.18). The gutter anchor keeps the same words reaching the pane inside a
58
+ * reply from being read as a dialog, as v1's `OPENCODE_PERMISSION_PATTERN`
59
+ * does; the word order is v2's own (`Always allow`, not v1's `Allow always`).
60
+ */
61
+ exports.OPENCODE_V2_PERMISSION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*Allow once[^\S\n]{2,}Always allow[^\S\n]{2,}Reject\b/m;
62
+ /**
63
+ * The question form's key hints, on the composer's gutter:
64
+ * `┃ ↑↓ select enter submit esc dismiss` (2.0.18, below the numbered
65
+ * choices and `Type your own answer`).
66
+ */
67
+ exports.OPENCODE_V2_QUESTION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*↑↓ select[^\S\n]+enter submit[^\S\n]+esc dismiss\b/m;
68
+ /**
69
+ * The row that closes a finished turn: `Build · <model> · 3.5s · 11.2 tok/s`
70
+ * (2.0.18). Transcript rows carry no gutter; the composer's model bar
71
+ * (`┃ Build · <model> OpenCode Zen`) does and has no duration, so neither it
72
+ * nor v1's `▣` row matches. A duration is required — the row without one is not
73
+ * a completion (the lesson v1's #1893 learned).
74
+ */
75
+ exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = /^[^\S\n│┃]*[A-Za-z][\w-]*(?: [\w-]+)* · [^\n]+? · \d+(?:\.\d+)?(?:ms|s|m(?: \d+s)?)(?: · [\d.]+ tok\/s)?[^\S\n]*$/;
76
+ /** The approval strip's buttons, in the order it draws them (2.0.18). */
77
+ exports.OPENCODE_V2_PERMISSION_OPTIONS = ['Allow once', 'Always allow', 'Reject'];
78
+ /** A row of the composer's gutter (`┃ …`). The question form is drawn entirely on it. */
79
+ const GUTTER_ROW_PATTERN = /^[^\S\n]*[│┃]/;
80
+ /** One choice of the question form: `┃ 1. Red` (2.0.18). */
81
+ const QUESTION_OPTION_ROW_PATTERN = /^[^\S\n]*[│┃][^\S\n]*(\d+)\.[^\S\n]+(\S.*?)[^\S\n]*$/;
82
+ /**
83
+ * The question form as a dialog (Issue #2984): the choices on the gutter rows
84
+ * above its key hints, numbered 1..n without a gap. `null` when the hints row
85
+ * is not in the status window or fewer than two choices can be read.
86
+ *
87
+ * `numbered` / `answer_only` because that is what the form does with a digit:
88
+ * measured on 2.0.18, typing `2` with no Enter submitted `Blue`
89
+ * (`tests/fixtures/opencode-v2-dialogs-2984/question-answered-by-digit.txt`).
90
+ */
91
+ function readQuestionDialog(frame) {
92
+ if (!exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines))
93
+ return null;
94
+ const lines = frame.contentLines;
95
+ let hints = -1;
96
+ for (let i = lines.length - 1; i >= 0; i--) {
97
+ if (exports.OPENCODE_V2_QUESTION_PATTERN.test(lines[i])) {
98
+ hints = i;
99
+ break;
100
+ }
101
+ }
102
+ if (hints < 0)
103
+ return null;
104
+ const options = [];
105
+ for (let i = hints - 1; i >= 0 && GUTTER_ROW_PATTERN.test(lines[i]); i--) {
106
+ const match = QUESTION_OPTION_ROW_PATTERN.exec(lines[i]);
107
+ if (match)
108
+ options.unshift(`${match[1]}. ${match[2]}`);
109
+ }
110
+ if (options.length < 2)
111
+ return null;
112
+ if (!options.every((option, index) => option.startsWith(`${index + 1}. `)))
113
+ return null;
114
+ return { kind: 'question', options, answerMode: 'numbered', submitMode: 'answer_only' };
115
+ }
116
+ /** Rows below the transcript that are chrome: gutter padding, the model bar, the rule, the footer, the version. */
117
+ function isChromeRow(line) {
118
+ if (/^[\s│┃╹▀]*$/.test(line))
119
+ return true;
120
+ // The composer's model bar: gutter, then `<Agent> · <model> <provider>` with no second `·`.
121
+ if (/^[^\S\n]*[│┃][^\S\n]*[A-Za-z][\w-]* · [^·\n]+$/.test(line))
122
+ return true;
123
+ if (cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(line))
124
+ return true;
125
+ return /^\s*\d+\.\d+\.\d+\s*$/.test(line);
126
+ }
127
+ /**
128
+ * Whether the last transcript row — the first row above the composer's chrome —
129
+ * is the completion row. Only the LAST row counts: the completion row of an
130
+ * earlier turn stays on the pane behind the next turn and behind a dialog.
131
+ */
132
+ function endsWithTurnComplete(frame) {
133
+ const lines = frame.contentLines;
134
+ for (let i = lines.length - 1; i >= 0; i--) {
135
+ if (isChromeRow(lines[i]))
136
+ continue;
137
+ return exports.OPENCODE_V2_TURN_COMPLETE_PATTERN.test(lines[i]);
138
+ }
139
+ return false;
140
+ }
141
+ exports.opencodeV2StatusDetector = (0, run_detection_1.createToolStatusDetector)({
142
+ tool: 'opencode-v2',
143
+ verifiedAgainst: exports.VERIFIED_AGAINST,
144
+ // Issue #2991: every v2 dialog is recognised by `beforePrompt` below, so a
145
+ // numbered list that reaches the generic parser is text in a reply (the UAT
146
+ // frame: `❯ 1. Yes / 2. No` quoted in the answer). Unvouched by
147
+ // `detectDialog`, it is not published as `waiting` — which had left the
148
+ // session refusing every send with nothing on screen to answer.
149
+ requireVouchedPrompt: true,
150
+ // Issue #2965: the two dialogs, ahead of everything. Each is the agent
151
+ // blocked on a human whatever else is on the pane — the question frame keeps
152
+ // the previous turn's completion row above it — and ahead of the generic
153
+ // numbered-list parser too, because the question's `1. Red / 2. Blue` is
154
+ // driven by ↑↓ + Enter (hence `hasActivePrompt: false` and a reason from
155
+ // `SELECTION_LIST_REASONS`, which draws the arrow keys instead of offering to
156
+ // type a number). Issue #2984 measured that a typed digit also commits it,
157
+ // with no Enter — see `detectDialog` below.
158
+ beforePrompt(frame) {
159
+ if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
160
+ return {
161
+ status: 'waiting',
162
+ confidence: 'high',
163
+ reason: status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT,
164
+ hasActivePrompt: false,
165
+ evidence: 'positive',
166
+ };
167
+ }
168
+ if (exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines)) {
169
+ return {
170
+ status: 'waiting',
171
+ confidence: 'high',
172
+ reason: status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
173
+ hasActivePrompt: false,
174
+ evidence: 'positive',
175
+ };
176
+ }
177
+ // Issue #2971: a dialog opened over the composer keeps the footer (and
178
+ // often the placeholder) on screen, so every rule below read it as `ready`
179
+ // and `wait` completed a turn that never started. Its title row sits ~150
180
+ // rows above the bottom of an 80x200 pane, outside `lastLines`, so the
181
+ // whole frame is read. The reason is v1's (#2112): the same kind of
182
+ // overlay, driven by ↑↓ + Enter and closed with `esc` — no number answers
183
+ // it, hence `hasActivePrompt: false`.
184
+ if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
185
+ return {
186
+ status: 'waiting',
187
+ confidence: 'high',
188
+ reason: status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
189
+ hasActivePrompt: false,
190
+ evidence: 'positive',
191
+ };
192
+ }
193
+ return null;
194
+ },
195
+ afterThinking(frame) {
196
+ if ((0, cli_patterns_1.detectThinking)('opencode-v2', frame.lastLines)) {
197
+ return {
198
+ status: 'running',
199
+ confidence: 'high',
200
+ reason: status_reason_1.STATUS_REASON.THINKING_INDICATOR,
201
+ hasActivePrompt: false,
202
+ evidence: 'positive',
203
+ };
204
+ }
205
+ // Issue #2965: the completion row as the last transcript row, with no
206
+ // `esc interrupt` (ruled out just above) — a finished turn, whether or not
207
+ // the footer made it into the capture.
208
+ if (endsWithTurnComplete(frame)) {
209
+ return {
210
+ status: 'ready',
211
+ confidence: 'high',
212
+ reason: status_reason_1.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE,
213
+ hasActivePrompt: false,
214
+ evidence: 'positive',
215
+ };
216
+ }
217
+ // The placeholder against the ANSI-stripped frame with its box drawing
218
+ // intact (the pattern anchors on the `┃` gutter). The footer is on every
219
+ // frame, and the running hint was ruled out just above.
220
+ if (cli_patterns_1.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test((0, cli_patterns_1.stripAnsi)(frame.raw)) ||
221
+ cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(frame.lastLines)) {
222
+ return {
223
+ status: 'ready',
224
+ confidence: 'high',
225
+ reason: status_reason_1.STATUS_REASON.INPUT_PROMPT,
226
+ hasActivePrompt: false,
227
+ evidence: 'positive',
228
+ };
229
+ }
230
+ return null;
231
+ },
232
+ // Issue #2984: the seam the Auto-Yes gate and `respond` read. The same three
233
+ // rules `beforePrompt` reports `waiting` on, in the same order, so the gate
234
+ // and the status API agree about which frames carry a dialog.
235
+ //
236
+ // The strip and the question form are anchored on the composer's `┃` gutter,
237
+ // which `stripBoxDrawing` removes: on the spelling the Auto-Yes poller judges
238
+ // they answer `null` (v1's #1893 precedent). For Auto-Yes `null` and `keys`
239
+ // both send nothing, and the question form never reaches the gate anyway —
240
+ // it draws no `❯` for the generic parser to key on.
241
+ detectDialog(frame) {
242
+ if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
243
+ return { kind: 'permission', options: exports.OPENCODE_V2_PERMISSION_OPTIONS, answerMode: 'keys' };
244
+ }
245
+ const question = readQuestionDialog(frame);
246
+ if (question !== null)
247
+ return question;
248
+ if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
249
+ return { kind: 'picker', options: [], answerMode: 'keys' };
250
+ }
251
+ return null;
252
+ },
253
+ });
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * OpenCode V2's dialog title row — a pure, dependency-free leaf (Issue #2983).
4
+ *
5
+ * Moved out of `cli-patterns.ts` (which re-exports both names) so a client
6
+ * component can read the same row the detector reads without pulling the
7
+ * logger and the tool registry into the browser bundle: the chat surface's
8
+ * dialog card draws v2's model keys only while one of these dialogs is open,
9
+ * because each of those keys closes the dialog with `Escape` before it is sent.
10
+ *
11
+ * @module lib/detection/tools/opencode-v2/dialog-title
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = void 0;
15
+ exports.findOpencodeV2DialogTitle = findOpencodeV2DialogTitle;
16
+ /**
17
+ * The title row of an OpenCode V2 dialog opened over the composer: the model
18
+ * picker (`ctrl+x m`), the variant picker it opens next, the Commands palette
19
+ * (`ctrl+p`), Sessions (`ctrl+x l`) and Select agent (`ctrl+x a`) — Issue #2971.
20
+ *
21
+ * Measured on 2.0.18 at 80x200 (2026-09-29,
22
+ * `tests/fixtures/opencode-v2-live-2971/`): every one of them opens with a row
23
+ * ` <Title> esc`, the dismiss hint
24
+ * right-aligned after a wide gap, with no `┃` gutter in front. The row BELOW it
25
+ * is the filter (`Search`, or whatever was typed into it) and changes; the
26
+ * title row does not. The footer (`… ctrl+p commands`) stays drawn under every
27
+ * one of them, which is why the footer alone cannot say the composer is free.
28
+ *
29
+ * Not matched: the running footer (`esc interrupt ctrl+p commands`, `esc` not
30
+ * last) and the question form's `┃ ↑↓ select enter submit esc dismiss`
31
+ * (gutter, `esc` not last). Match against the ANSI-stripped frame; the title
32
+ * sits far above the 15-line status window (row 52 of 200), so pass the whole
33
+ * capture.
34
+ */
35
+ exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = /^[^\S\n]*[^\s\u2502\u2503\u2579\u2580][^\n]*?[^\S\n]{8,}esc[^\S\n]*$/m;
36
+ /**
37
+ * The title of the OpenCode V2 dialog open on the pane (`Select variant`), or
38
+ * `null` when none is (Issue #2971). A send must not type while one is open:
39
+ * the text lands in the dialog's filter, not in the composer.
40
+ *
41
+ * @param text - ANSI-stripped capture of the whole pane
42
+ */
43
+ function findOpencodeV2DialogTitle(text) {
44
+ const match = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN.exec(text);
45
+ if (match === null)
46
+ return null;
47
+ return match[0].trim().replace(/\s+esc$/, '');
48
+ }
@@ -18,6 +18,7 @@ const detect_3 = require("./codex/detect");
18
18
  const detect_4 = require("./command-code/detect");
19
19
  const detect_5 = require("./copilot/detect");
20
20
  const detect_6 = require("./opencode/detect");
21
+ const detect_7 = require("./opencode-v2/detect");
21
22
  const run_detection_1 = require("./run-detection");
22
23
  const verified_against_1 = require("./verified-against");
23
24
  /**
@@ -43,6 +44,7 @@ const DETECTORS = {
43
44
  opencode: detect_6.opencodeStatusDetector,
44
45
  antigravity: detect_1.antigravityStatusDetector,
45
46
  'command-code': detect_4.commandCodeStatusDetector,
47
+ 'opencode-v2': detect_7.opencodeV2StatusDetector,
46
48
  gemini: geminiStatusDetector,
47
49
  'vibe-local': vibeLocalStatusDetector,
48
50
  };
@@ -99,6 +99,15 @@ function runToolDetection(spec, frame, context = {}) {
99
99
  // and let the chain continue to the tool's running/idle branches.
100
100
  promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
101
101
  }
102
+ else if (spec.requireVouchedPrompt && context.isPromptVouched?.(promptDetection) === false) {
103
+ // Issue #2991: a numbered list the tool's own dialog rules do not vouch
104
+ // for — the agent's reply quoting `❯ 1. Yes / 2. No`. Auto-Yes (#2984)
105
+ // and History (#2457) already refuse it; publishing `waiting` for it
106
+ // left the session unanswerable (no dialog to answer) and unwritable (the
107
+ // send guard refused every message). Neutralised the same way as the
108
+ // stale block above, so the tool's own branches decide the status.
109
+ promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
110
+ }
102
111
  else {
103
112
  return {
104
113
  status: 'waiting',