commandmate 0.34.1 → 0.36.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 (343) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +365 -343
  3. package/.next/app-path-routes-manifest.json +29 -29
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  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/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.nft.json +1 -1
  14. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  16. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/messages/route.js +1 -1
  18. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  19. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/session/route.js +1 -1
  21. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  22. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/assistant/start/route.js +1 -1
  24. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  25. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/assistant/terminal/route.js +1 -1
  27. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  28. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/capabilities/route.js +1 -1
  35. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  44. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  46. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  47. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  49. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  56. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  57. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/relays/route.js +1 -1
  59. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  60. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  66. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/clone/route.js +1 -1
  69. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/restore/route.js +1 -1
  73. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/route.js +1 -1
  76. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/scan/route.js +1 -1
  79. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/sync/route.js +1 -1
  82. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  83. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  86. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  115. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  163. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  197. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/route.js +1 -1
  211. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/chat/page.js +2 -2
  214. package/.next/server/app/chat/page.js.nft.json +1 -1
  215. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/more/page.js +2 -2
  219. package/.next/server/app/more/page.js.nft.json +1 -1
  220. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/page.js +1 -1
  223. package/.next/server/app/page.js.nft.json +1 -1
  224. package/.next/server/app/page_client-reference-manifest.js +1 -1
  225. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/repositories/page.js +2 -2
  227. package/.next/server/app/repositories/page.js.nft.json +1 -1
  228. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app/review/page.js +1 -1
  230. package/.next/server/app/review/page.js.nft.json +1 -1
  231. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/sessions/page.js +2 -2
  233. package/.next/server/app/sessions/page.js.nft.json +1 -1
  234. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/skills/[skillId]/page.js +2 -2
  236. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  237. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/skills/installed/page.js +2 -2
  239. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  240. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/skills/page.js +1 -1
  242. package/.next/server/app/skills/page.js.nft.json +1 -1
  243. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  245. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/worktrees/[id]/page.js +9 -22
  247. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  248. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  250. package/.next/server/app-paths-manifest.json +29 -29
  251. package/.next/server/chunks/1210.js +1 -1
  252. package/.next/server/chunks/{6286.js → 1467.js} +6 -6
  253. package/.next/server/chunks/1707.js +14 -0
  254. package/.next/server/chunks/1886.js +1 -1
  255. package/.next/server/chunks/2980.js +1 -1
  256. package/.next/server/chunks/3077.js +1 -1
  257. package/.next/server/chunks/3123.js +1 -1
  258. package/.next/server/chunks/3241.js +1 -1
  259. package/.next/server/chunks/3323.js +1 -1
  260. package/.next/server/chunks/3543.js +1 -1
  261. package/.next/server/chunks/364.js +1 -0
  262. package/.next/server/chunks/3945.js +1 -1
  263. package/.next/server/chunks/434.js +1 -1
  264. package/.next/server/chunks/4443.js +1 -1
  265. package/.next/server/chunks/450.js +1 -1
  266. package/.next/server/chunks/4802.js +1 -1
  267. package/.next/server/chunks/6130.js +1 -1
  268. package/.next/server/chunks/650.js +1 -1
  269. package/.next/server/chunks/6677.js +3 -3
  270. package/.next/server/chunks/7004.js +1 -0
  271. package/.next/server/chunks/7075.js +1 -1
  272. package/.next/server/chunks/7506.js +1 -1
  273. package/.next/server/chunks/7905.js +1 -1
  274. package/.next/server/chunks/8142.js +1 -0
  275. package/.next/server/chunks/8728.js +8 -0
  276. package/.next/server/chunks/8918.js +5 -5
  277. package/.next/server/chunks/9123.js +2 -2
  278. package/.next/server/chunks/9627.js +1 -1
  279. package/.next/server/chunks/9701.js +1 -0
  280. package/.next/server/middleware-build-manifest.js +1 -1
  281. package/.next/server/middleware-manifest.json +5 -5
  282. package/.next/server/pages/500.html +1 -1
  283. package/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/static/chunks/2039-117a361f795ddc4b.js +1 -0
  285. package/.next/static/chunks/2053-ce3fe896ad45e50f.js +1 -0
  286. package/.next/static/chunks/2407-6b8ca567e18ad583.js +1 -0
  287. package/.next/static/chunks/3160-79d24ca264a528b9.js +1 -0
  288. package/.next/static/chunks/{4322-dfd5a7119b5ba4fc.js → 4322-59a7dbd77a7763cc.js} +1 -1
  289. package/.next/static/chunks/4388-410b1d8ed0d8d98b.js +1 -0
  290. package/.next/static/chunks/4718-56ebb6e55073ed5e.js +1 -0
  291. package/.next/static/chunks/4949-d804db873cfd9310.js +1 -0
  292. package/.next/static/chunks/{6022-7a7d1760fc9814c7.js → 6022-d2d7bd9373ff3ae9.js} +1 -1
  293. package/.next/static/chunks/6983-3ed2099251793bdf.js +1 -0
  294. package/.next/static/chunks/934-a37509667baa86ee.js +1 -0
  295. package/.next/static/chunks/9526-4fe2fc64be44e5c1.js +1 -0
  296. package/.next/static/chunks/app/chat/page-bfc1f5bb17bd771d.js +1 -0
  297. package/.next/static/chunks/app/error-c1dc1038d0a84a33.js +1 -0
  298. package/.next/static/chunks/app/global-error-49f765ecb7fd6527.js +1 -0
  299. package/.next/static/chunks/app/{layout-4c2f21e3f653ee4c.js → layout-114dc6e93e332392.js} +1 -1
  300. package/.next/static/chunks/app/more/page-400ffa825f8f150e.js +1 -0
  301. package/.next/static/chunks/app/{page-26a42881c8648cd3.js → page-a4f03c188610c6c8.js} +1 -1
  302. package/.next/static/chunks/app/repositories/{page-2576158c8420fda0.js → page-a15efb4ce1d1721e.js} +1 -1
  303. package/.next/static/chunks/app/review/{page-35b99baaf3c93b38.js → page-90ac618489676cbc.js} +1 -1
  304. package/.next/static/chunks/app/sessions/page-366edfaa0b1faad2.js +1 -0
  305. package/.next/static/chunks/app/skills/[skillId]/{page-06799157652e8fa9.js → page-ce8f6fd9e4356580.js} +1 -1
  306. package/.next/static/chunks/app/skills/installed/{page-2f3987e3a131c8d0.js → page-566dfde26d7e63ba.js} +1 -1
  307. package/.next/static/chunks/app/skills/{page-e70bfcf5ed4e4865.js → page-7859540e8092aace.js} +1 -1
  308. package/.next/static/chunks/app/worktrees/[id]/page-df482ec0c378c77b.js +1 -0
  309. package/.next/static/chunks/{webpack-1dc9eb5ebb4fa5ff.js → webpack-0281b30457d46ebc.js} +1 -1
  310. package/.next/static/css/c511ecdf1e7f18a0.css +1 -0
  311. package/.next/trace +14 -13
  312. package/dist/lib/detection/tools/verified-against.d.ts +20 -0
  313. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  314. package/dist/lib/detection/tools/verified-against.js +20 -0
  315. package/dist/server/src/config/websocket-config.js +67 -0
  316. package/dist/server/src/lib/auto-yes-poller.js +40 -7
  317. package/dist/server/src/lib/auto-yes-state.js +36 -0
  318. package/dist/server/src/lib/detection/selection-shape.js +361 -3
  319. package/dist/server/src/lib/detection/tools/command-code/detect.js +96 -0
  320. package/dist/server/src/lib/detection/tools/command-code/dialog.js +314 -0
  321. package/dist/server/src/lib/detection/tools/verified-against.js +20 -0
  322. package/dist/server/src/lib/polling/response-checker.js +48 -2
  323. package/dist/server/src/lib/ws-server.js +111 -1
  324. package/package.json +1 -1
  325. package/public/sw.js +12 -0
  326. package/.next/server/chunks/120.js +0 -1
  327. package/.next/server/chunks/595.js +0 -8
  328. package/.next/server/chunks/7593.js +0 -1
  329. package/.next/static/chunks/1191-b7dfdfe86b1d31d1.js +0 -1
  330. package/.next/static/chunks/2053-9ac860ab4e92ac89.js +0 -1
  331. package/.next/static/chunks/2652-18b8fea64413467e.js +0 -1
  332. package/.next/static/chunks/4718-29cfcfb806724d9a.js +0 -1
  333. package/.next/static/chunks/5542-b6457f305d724a6b.js +0 -1
  334. package/.next/static/chunks/8361-0142beb59be2abf3.js +0 -1
  335. package/.next/static/chunks/app/chat/page-e60d07c4c79602f0.js +0 -1
  336. package/.next/static/chunks/app/error-27ab04bce6545dae.js +0 -1
  337. package/.next/static/chunks/app/global-error-7b761b8e181ffc1f.js +0 -1
  338. package/.next/static/chunks/app/more/page-fc94f86aa881489e.js +0 -1
  339. package/.next/static/chunks/app/sessions/page-a3ab6f122ec60d5a.js +0 -1
  340. package/.next/static/chunks/app/worktrees/[id]/page-60eab4e24c37cb77.js +0 -1
  341. package/.next/static/css/b09bede85744e1cf.css +0 -1
  342. /package/.next/static/{oDWX0JcwfhUYrMnnqDWVC → zNNp00FuBenN_iZtIvIBP}/_buildManifest.js +0 -0
  343. /package/.next/static/{oDWX0JcwfhUYrMnnqDWVC → zNNp00FuBenN_iZtIvIBP}/_ssgManifest.js +0 -0
@@ -66,6 +66,8 @@
66
66
  Object.defineProperty(exports, "__esModule", { value: true });
67
67
  exports.DISMISSABLE_PANEL_FOOTER_PATTERN = exports.COMMAND_CODE_SELECTION_LIST_FOOTER = exports.SET_AS_DEFAULT_FOOTER_PATTERN = exports.SESSION_SCOPE_FOOTER_PATTERN = exports.MAX_OPTION_NUMBER = exports.SELECTION_SHAPE_TAIL_LINE_COUNT = void 0;
68
68
  exports.hasDismissablePanelFooter = hasDismissablePanelFooter;
69
+ exports.readCommandCodeQuestionRegion = readCommandCodeQuestionRegion;
70
+ exports.hasCommandCodeQuestionChrome = hasCommandCodeQuestionChrome;
69
71
  exports.extractCommandCodeSelectionListFrame = extractCommandCodeSelectionListFrame;
70
72
  exports.readSelectionListShape = readSelectionListShape;
71
73
  exports.shouldOfferOptionNumbers = shouldOfferOptionNumbers;
@@ -249,6 +251,344 @@ const COMMAND_CODE_RULE_ROW_PATTERN = /^\u2500+$/;
249
251
  * `tests/fixtures/`.
250
252
  */
251
253
  const COMMAND_CODE_RULE_MIN_COLUMNS = 40;
254
+ /**
255
+ * The cursor glyph Command Code draws against the highlighted option.
256
+ *
257
+ * U+276F, measured on the capture Issue #2521 was raised from. Only this one,
258
+ * and not codex's `›` or gemini's `●`: {@link readCommandCodeQuestionRegion}
259
+ * counts cursors to decide whether the region holds ONE live dialog, and a
260
+ * wider alphabet would start counting glyphs that are not cursors at all.
261
+ */
262
+ const COMMAND_CODE_CURSOR_GLYPH = '❯';
263
+ /**
264
+ * The markers Command Code paints on a question screen's tab strip.
265
+ *
266
+ * Measured row: `● Dispatch | ◯ Review` — a filled disc on the tab that has the
267
+ * screen and a hollow ring on the one that does not. The names are NOT part of
268
+ * the reading (a different question draws different tabs); what is read is the
269
+ * strip's structure, which is what {@link isCommandCodeQuestionTabRow} states.
270
+ *
271
+ * Two families rather than one alphabet, because "one of these is filled and one
272
+ * of these is not" is the whole signal. A list of bullets (`● item one`) carries
273
+ * the first family and nothing else, and a bullet list is the thing this
274
+ * reading must never mistake for a dialog.
275
+ */
276
+ const COMMAND_CODE_TAB_SELECTED_MARKERS = '●◉⦿';
277
+ /** The hollow half of {@link COMMAND_CODE_TAB_SELECTED_MARKERS}'s pair. */
278
+ const COMMAND_CODE_TAB_UNSELECTED_MARKERS = '◯○◌⚪';
279
+ /** One `<marker> <label>` cell of the tab strip. */
280
+ const COMMAND_CODE_TAB_SEGMENT_PATTERN = new RegExp(`^\\s*([${COMMAND_CODE_TAB_SELECTED_MARKERS}${COMMAND_CODE_TAB_UNSELECTED_MARKERS}])\\s+\\S`);
281
+ /**
282
+ * Is this row Command Code's question-screen tab strip?
283
+ *
284
+ * Three conditions, and each one is a bullet list this predicate has to refuse:
285
+ *
286
+ * - **two or more `|`-separated cells.** `● Dispatch` on its own is a bullet;
287
+ * `● Dispatch | ◯ Review` is a strip. The separator is the cheapest part of
288
+ * the structure and the one prose never has in this position;
289
+ * - **every cell is `<marker> <label>`.** A row that is a strip for its first
290
+ * cell and prose for its second is prose;
291
+ * - **at least one filled marker and at least one hollow one.** A tab strip
292
+ * says which tab has the screen. A row of identical bullets does not, and
293
+ * `● one | ● two` is exactly the list-with-a-pipe this rules out.
294
+ */
295
+ function isCommandCodeQuestionTabRow(line) {
296
+ const segments = line.split('|');
297
+ if (segments.length < 2)
298
+ return false;
299
+ let selected = 0;
300
+ let unselected = 0;
301
+ for (const segment of segments) {
302
+ const match = COMMAND_CODE_TAB_SEGMENT_PATTERN.exec(segment);
303
+ if (match === null)
304
+ return false;
305
+ if (COMMAND_CODE_TAB_SELECTED_MARKERS.includes(match[1]))
306
+ selected += 1;
307
+ else
308
+ unselected += 1;
309
+ }
310
+ return selected > 0 && unselected > 0;
311
+ }
312
+ /**
313
+ * Rows that mean the region spans more than the one dialog on screen now.
314
+ *
315
+ * Issue #2521's condition 4: the tab strip and its options have to be the
316
+ * SAME screen, with no other turn's generating or completion UI between them.
317
+ * Structurally that is mostly settled by taking the LAST rule row as the top
318
+ * edge — a new turn repaints the composer, and the composer's own lower rule
319
+ * then becomes that edge — so this pattern is the belt to that braces, for a
320
+ * frame captured mid-repaint.
321
+ *
322
+ * Two rows, both restated here rather than imported: `cli-patterns` owns
323
+ * Command Code's busy and marker vocabularies and pulls the logger and the tool
324
+ * registry in with them, and this module is the browser-safe leaf the chat
325
+ * surface imports (see the module docblock).
326
+ *
327
+ * - `esc to interrupt`, the tail Command Code appends to every status row
328
+ * (`COMMAND_CODE_INTERRUPT_HINT_PATTERN`). A turn is in flight;
329
+ * - a row that OPENS with U+273B and a word — `✻ Thought for 1 second`,
330
+ * `✻ Worked for 4s`. Matched by shape rather than by the two English verbs,
331
+ * so a reworded or localised marker still ends the region.
332
+ */
333
+ const COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN = /\besc\s+to\s+interrupt\b|^[^\S\n]*✻[^\S\n]+\S/im;
334
+ /**
335
+ * Where a footer-less Command Code question screen sits on a pane (Issue #2521).
336
+ *
337
+ * ## The frame this exists for
338
+ *
339
+ * Command Code's `AskUserQuestion` draws no hint-bar footer. It draws a rule,
340
+ * a tab strip, the question, and the options — and when an option's description
341
+ * WRAPS, the continuation row begins with a single space:
342
+ *
343
+ * ────────────────────────────… (200 columns of U+2500)
344
+ * ● Dispatch | ◯ Review
345
+ *
346
+ * Approve proceeding from the plan into worktree creation and dispatch?
347
+ *
348
+ * ❯ 1. Prepare worktrees + dispatch (Recommended)
349
+ * I create the worktrees and pause for you to
350
+ * answer).
351
+ * 2. Worktrees only, then pause
352
+ * …
353
+ *
354
+ * Measured 2026-09-12 on a pane reported as Command Code 1.53.0 at the
355
+ * production 200x1000; the anonymised capture is
356
+ * `tests/fixtures/command-code-askuserquestion-2521/`. Nothing read it:
357
+ * `detectPrompt` stops its scan at ` answer).` and never reaches option 1, and
358
+ * the selection-list branch below wants a footer this screen does not draw. So
359
+ * the frame fell through to the generic composer check — which matches, because
360
+ * `COMMAND_CODE_PROMPT_PATTERN` is `^❯(\s*$|\s+\S)` and `❯ 1. Prepare …` is a
361
+ * `❯` followed by a space and a glyph — and the pane was published as
362
+ * `ready` / `input_prompt`. `wait` read that as a finished turn and exited 0 on
363
+ * a session that was asking a question (Issue #2521's "偽完了").
364
+ *
365
+ * ## What this function is NOT
366
+ *
367
+ * It is not a general reading of footer-less dialogs, and it deliberately does
368
+ * not make `optionCount` into a dialog test. {@link readSelectionListShape}
369
+ * counts the numbers in the tail of ANY frame, an ordinary numbered answer
370
+ * included, and the whole point of the conditions below is that a number list
371
+ * on its own proves nothing. Five things have to line up:
372
+ *
373
+ * 1. the LAST rule row that qualifies as the seam ({@link
374
+ * COMMAND_CODE_RULE_ROW_PATTERN} at {@link COMMAND_CODE_RULE_MIN_COLUMNS} or
375
+ * wider) is the top edge, and the last row carrying content is the bottom.
376
+ * Taking the LAST one is what keeps an older dialog higher up the pane out:
377
+ * a new turn repaints the composer, whose own rules sit below the old
378
+ * dialog, and the region is then the composer's hint row;
379
+ * 2. the first row under that rule is a tab strip
380
+ * ({@link isCommandCodeQuestionTabRow}) and a non-blank question body
381
+ * follows it before the first option;
382
+ * 3. the options are a STRICT run `1.` … `N.`, 2 ≤ N ≤ {@link
383
+ * MAX_OPTION_NUMBER}. A gap, a repeat or a list that starts at `2` is not
384
+ * this screen;
385
+ * 4. exactly one {@link COMMAND_CODE_CURSOR_GLYPH} in the region, and it is on
386
+ * an option row. Two cursors means two screens — typically a composer's own
387
+ * `❯` under the dialog — and none means the highlight is elsewhere;
388
+ * 5. no filter box, no `/model` footer, no dismiss-only footer and no other
389
+ * turn's UI in the region ({@link FILTER_INPUT_PATTERN},
390
+ * {@link COMMAND_CODE_SELECTION_LIST_FOOTER},
391
+ * {@link DISMISSABLE_PANEL_FOOTER_PATTERN},
392
+ * {@link COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN}). `Type something...`
393
+ * is an OPTION on this screen, not a filter, and the filter pattern is
394
+ * narrow enough to tell them apart.
395
+ *
396
+ * `null` for anything else, which leaves every existing verdict and every
397
+ * existing crop exactly as they were.
398
+ *
399
+ * ## Tool-id-free and browser-safe, on purpose
400
+ *
401
+ * Three call sites read the same answer: the command-code detector's
402
+ * `afterPrompt`, {@link extractCommandCodeSelectionListFrame} (which runs for
403
+ * every CLI, with no tool id in hand) and `ChatSurface`, a client component.
404
+ * So this takes a raw frame and nothing else, and imports nothing but
405
+ * `./ansi` — the same trade the rest of this module makes.
406
+ *
407
+ * ## The one spelling it cannot answer on
408
+ *
409
+ * A capture that has been through `stripBoxDrawing` — which blanks a pure-U+2500
410
+ * row, so condition 1 finds no seam and this returns `null`. Same limitation
411
+ * `extractOpenCodeModalOverlayFrame` records for the same reason. Issue #2522
412
+ * did not weaken the reading to work around it: the three consumers that clean
413
+ * their frames (the response poller, Auto-Yes, `/prompt-response`) now keep the
414
+ * same tick's RAW capture and hand that here, so both spellings of one capture
415
+ * exist and the right one is passed.
416
+ *
417
+ * ## Issue #2522: the structural half is shared
418
+ *
419
+ * Conditions 1, 2, 3-minus-strictness and 5 moved into
420
+ * {@link scanCommandCodeQuestionScreen}, which {@link hasCommandCodeQuestionChrome}
421
+ * also reads. This function is exactly that scan plus the two conditions that
422
+ * are about the LIST — a strict run and a single cursor — so every verdict it
423
+ * gave before is the verdict it gives now.
424
+ *
425
+ * @param frame - a raw `capture-pane -p -e` frame, ANSI intact (CRLF tolerated)
426
+ * @returns the region's line indices into the LF-normalised frame, or `null`
427
+ */
428
+ function readCommandCodeQuestionRegion(frame) {
429
+ const screen = scanCommandCodeQuestionScreen(frame);
430
+ if (screen === null)
431
+ return null;
432
+ // 3 (continued). A STRICT run. The numbers were collected in the order they
433
+ // are drawn and are compared against the run, rather than restarted on every
434
+ // fresh `1` the way `countTrailingOptionRun` does: that function is reading a
435
+ // tail that may hold two lists, and this one is asserting that the region
436
+ // holds exactly one.
437
+ if (!screen.numbers.every((value, index) => value === index + 1))
438
+ return null;
439
+ // 4 (continued). Exactly ONE cursor. Two means two screens — typically a
440
+ // composer's own `❯` under the dialog, or a frame caught mid-repaint.
441
+ if (screen.cursorCount !== 1)
442
+ return null;
443
+ return {
444
+ ruleLineIndex: screen.ruleLineIndex,
445
+ firstLineIndex: screen.firstLineIndex,
446
+ lastLineIndex: screen.lastLineIndex,
447
+ tabLineIndex: screen.tabLineIndex,
448
+ cursorLineIndex: screen.cursorLineIndex,
449
+ optionCount: screen.numbers.length,
450
+ };
451
+ }
452
+ /**
453
+ * Is Command Code's question CHROME on this frame, whatever its numbering says?
454
+ * (Issue #2522)
455
+ *
456
+ * The same five conditions {@link readCommandCodeQuestionRegion} applies, minus
457
+ * the two that are about the LIST rather than about the screen: the run need not
458
+ * be a strict `1.`…`N.`, and there may be more than one cursor on it.
459
+ *
460
+ * ## Why the weaker reading is worth having
461
+ *
462
+ * Issue #2522 確定仕様 B needs three answers where #2521 had two. "Not this
463
+ * screen" keeps every existing verdict; "read in full" produces an answerable
464
+ * prompt; and **"this screen, unreadable"** — a gap in the numbering, a repeated
465
+ * row, a list that starts at `2`, a second cursor from a half-finished repaint —
466
+ * has to reach the manual-operation fallback rather than the `ready` the generic
467
+ * composer check would otherwise publish off the dialog's own `❯` row. That is
468
+ * the very failure both Issues exist for: `wait` exiting 0 on a pane that is
469
+ * asking a human a question.
470
+ *
471
+ * It is deliberately NOT a relaxation of the strict reading. Nothing that was
472
+ * `null` becomes a REGION, so no partial option list is produced anywhere and no
473
+ * existing crop, card or prompt payload changes. What this adds is the ability
474
+ * to say "declined for a numbering reason" out loud.
475
+ *
476
+ * ## Why it is still narrow
477
+ *
478
+ * Every structural condition stays: the last qualifying rule row, a genuine tab
479
+ * strip as the first row under it ({@link isCommandCodeQuestionTabRow} — one
480
+ * filled marker, one hollow, `|`-separated), a non-blank question body before
481
+ * the first option, at least two numbered rows, at least one `❯` ON one of them,
482
+ * and none of the pickers, panels or other-turn UI the other branches own. An
483
+ * assistant answering in a numbered list carries none of that, and a frame with
484
+ * one option or with the `❯` on a composer row is still `false` — the two cases
485
+ * #2521 recorded as "the highlight is elsewhere".
486
+ *
487
+ * @param frame - a raw `capture-pane -p -e` frame, ANSI intact (CRLF tolerated)
488
+ */
489
+ function hasCommandCodeQuestionChrome(frame) {
490
+ return scanCommandCodeQuestionScreen(frame) !== null;
491
+ }
492
+ /**
493
+ * The structural half of the question-screen reading, shared by the strict
494
+ * {@link readCommandCodeQuestionRegion} and the weaker
495
+ * {@link hasCommandCodeQuestionChrome} (Issue #2522 split them apart).
496
+ *
497
+ * Written once rather than twice on purpose: the conditions below are what make
498
+ * the reading safe for every other CLI's frames, and a second copy of them is a
499
+ * second thing to forget to narrow.
500
+ */
501
+ function scanCommandCodeQuestionScreen(frame) {
502
+ if (!frame)
503
+ return null;
504
+ // Stripped per line off the same split, so every index below is valid against
505
+ // the ANSI-bearing rows the cropper slices.
506
+ const lines = frame.replace(/\r\n/g, '\n').split('\n').map(ansi_1.stripAnsi);
507
+ let last = lines.length - 1;
508
+ while (last >= 0 && lines[last].trim() === '')
509
+ last -= 1;
510
+ // A region needs a rule above it, so the last content row cannot be row 0.
511
+ if (last < 1)
512
+ return null;
513
+ let ruleLineIndex = -1;
514
+ for (let i = last - 1; i >= 0; i -= 1) {
515
+ const row = lines[i].trim();
516
+ if (row.length < COMMAND_CODE_RULE_MIN_COLUMNS)
517
+ continue;
518
+ if (!COMMAND_CODE_RULE_ROW_PATTERN.test(row))
519
+ continue;
520
+ ruleLineIndex = i;
521
+ break;
522
+ }
523
+ if (ruleLineIndex < 0)
524
+ return null;
525
+ const region = lines.slice(ruleLineIndex + 1, last + 1);
526
+ const body = region.join('\n');
527
+ // 5. The screens this reading must not take over.
528
+ if (FILTER_INPUT_PATTERN.test(body))
529
+ return null;
530
+ if (exports.COMMAND_CODE_SELECTION_LIST_FOOTER.test(body))
531
+ return null;
532
+ if (exports.DISMISSABLE_PANEL_FOOTER_PATTERN.test(body))
533
+ return null;
534
+ if (COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN.test(body))
535
+ return null;
536
+ // 2. The tab strip opens the region.
537
+ const tabOffset = region.findIndex((line) => line.trim() !== '');
538
+ if (tabOffset < 0)
539
+ return null;
540
+ if (!isCommandCodeQuestionTabRow(region[tabOffset]))
541
+ return null;
542
+ // 3. Numbered rows under it.
543
+ const numbers = [];
544
+ let firstOptionOffset = -1;
545
+ for (let i = tabOffset + 1; i < region.length; i += 1) {
546
+ const match = OPTION_ROW_PATTERN.exec(region[i]);
547
+ if (match === null)
548
+ continue;
549
+ if (firstOptionOffset < 0)
550
+ firstOptionOffset = i;
551
+ numbers.push(Number(match[1]));
552
+ }
553
+ // Two is the floor: one numbered row under a tab strip is not a choice. The
554
+ // ceiling is {@link MAX_OPTION_NUMBER} and it is {@link OPTION_ROW_PATTERN}'s
555
+ // rather than a length check — that pattern captures a SINGLE digit, so a
556
+ // `10.` row is not read as an option at all and an eleven-option screen
557
+ // reports its first nine. Recognising such a screen and under-counting it is
558
+ // the right failure: declining it would put the pane back on the `ready` that
559
+ // made `wait` exit 0. (Issue #2522's reader cross-checks the count against its
560
+ // own block reading and declines to ANSWER such a screen; what it must not do
561
+ // is hand the pane back to the composer check.)
562
+ if (numbers.length < 2)
563
+ return null;
564
+ // 2 (continued). The question itself. A tab strip sitting straight on top of
565
+ // its options is some other screen.
566
+ if (!region.slice(tabOffset + 1, firstOptionOffset).some((line) => line.trim() !== '')) {
567
+ return null;
568
+ }
569
+ // 4. A cursor, on an option row.
570
+ let cursorCount = 0;
571
+ let cursorOffset = -1;
572
+ for (let i = 0; i < region.length; i += 1) {
573
+ const inRow = region[i].split(COMMAND_CODE_CURSOR_GLYPH).length - 1;
574
+ if (inRow === 0)
575
+ continue;
576
+ cursorCount += inRow;
577
+ if (OPTION_ROW_PATTERN.test(region[i]))
578
+ cursorOffset = i;
579
+ }
580
+ if (cursorCount === 0 || cursorOffset < 0)
581
+ return null;
582
+ return {
583
+ ruleLineIndex,
584
+ firstLineIndex: ruleLineIndex + 1,
585
+ lastLineIndex: last,
586
+ tabLineIndex: ruleLineIndex + 1 + tabOffset,
587
+ numbers,
588
+ cursorCount,
589
+ cursorLineIndex: ruleLineIndex + 1 + cursorOffset,
590
+ };
591
+ }
252
592
  /**
253
593
  * The rows of a Command Code dialog, cut out of the pane it is painted on
254
594
  * (Issue #2326).
@@ -290,7 +630,11 @@ const COMMAND_CODE_RULE_MIN_COLUMNS = 40;
290
630
  * - **no footer** — the picker was closed between the flags being read and the
291
631
  * pane being captured, or the frame is some other dialog. Cropping on a
292
632
  * guess would blank the card, which Issue #2326 calls out as worse than
293
- * showing too much;
633
+ * showing too much. Issue #2521 carved ONE screen out of this: a frame that
634
+ * {@link readCommandCodeQuestionRegion} positively recognises is cropped to
635
+ * that region, because `AskUserQuestion` draws no footer at all and its card
636
+ * was otherwise the whole pane. The carve-out is a positive reading, not a
637
+ * relaxation — everything it declines still lands here;
294
638
  * - **a footer but no rule above it** — copilot's `/model` footer is
295
639
  * `↑/↓ to navigate · … · enter to select · esc to cancel` and matches the
296
640
  * same pattern, but copilot draws its picker in a corner-bordered box, so no
@@ -314,8 +658,22 @@ function extractCommandCodeSelectionListFrame(frame) {
314
658
  break;
315
659
  }
316
660
  }
317
- if (footer < 0)
318
- return null;
661
+ // Issue #2521: no footer is no longer unconditionally "do not crop". One
662
+ // screen draws none — `AskUserQuestion` — and it is the screen whose
663
+ // uncropped card was 409 rows of transcript with the question below the fold.
664
+ // The reading is the narrow one, so every other footer-less frame (a closed
665
+ // picker, a permission dialog, another CLI's overlay) still takes the `null`
666
+ // path and is returned untouched. Checked only when the footer is absent, so
667
+ // a picker's own crop is decided exactly as #2326 left it.
668
+ if (footer < 0) {
669
+ const region = readCommandCodeQuestionRegion(frame);
670
+ if (region === null)
671
+ return null;
672
+ // The rule row itself is the transcript's boundary and not the dialog's
673
+ // first row — the same edge the footer path takes — and `lastLineIndex` is
674
+ // the last row with content, so the pane's trailing padding is left out.
675
+ return lines.slice(region.firstLineIndex, region.lastLineIndex + 1).join('\n');
676
+ }
319
677
  for (let i = footer - 1; i >= 0; i -= 1) {
320
678
  const row = (0, ansi_1.stripAnsi)(lines[i]).trim();
321
679
  if (row.length < COMMAND_CODE_RULE_MIN_COLUMNS)
@@ -72,6 +72,24 @@
72
72
  * box. Measured live on v1.40.1 at the production 200x1000 geometry; the capture
73
73
  * is `tests/fixtures/chat-dialog-card-2254/command-code-model-1-40-1.txt`.
74
74
  *
75
+ * `beforePrompt` arrived with Issue #2521 as a third `afterPrompt` branch and
76
+ * was moved ahead of the shared parser by Issue #2522. It is the only branch
77
+ * here not read off a footer: `AskUserQuestion` draws none. The screen is a
78
+ * rule, a tab strip (`● Dispatch | ◯ Review`), the question and a strict
79
+ * `1.`…`N.` run with one `❯` on it, and `readCommandCodeQuestionRegion` is what
80
+ * recognises that shape. Before #2521, a wrapped option description took the
81
+ * frame away from the shared parser and the generic composer check answered
82
+ * `ready` off the dialog's own cursor row — so `wait` exited 0 on a pane that
83
+ * was asking a human a question.
84
+ *
85
+ * #2521 answered that with a manual-operation fallback (the selection-list
86
+ * reason, no `promptData`). #2522 added `tools/command-code/dialog.ts`, which
87
+ * READS the same region, and the branch now publishes one of two verdicts:
88
+ * `PROMPT_DETECTED` with the parsed question, options and `❯` default where the
89
+ * reading succeeds, and #2521's fallback where the screen is plainly up and the
90
+ * reading declines. The move to `beforePrompt` is part of that: see the branch
91
+ * for why the generic parser must not get this frame either before or after.
92
+ *
75
93
  * ## What #2304 re-measured, and what it did not change
76
94
  *
77
95
  * Nothing here changed, and that is the finding. Seven frames were captured
@@ -104,6 +122,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
104
122
  exports.commandCodeStatusDetector = exports.VERIFIED_AGAINST = void 0;
105
123
  const cli_patterns_1 = require("../../cli-patterns");
106
124
  const selection_shape_1 = require("../../selection-shape");
125
+ const dialog_1 = require("./dialog");
107
126
  const status_reason_1 = require("../../status-reason");
108
127
  const run_detection_1 = require("../run-detection");
109
128
  const verified_against_1 = require("../verified-against");
@@ -112,6 +131,83 @@ exports.VERIFIED_AGAINST = verified_against_1.COMMAND_CODE_VERIFIED_AGAINST;
112
131
  exports.commandCodeStatusDetector = (0, run_detection_1.createToolStatusDetector)({
113
132
  tool: 'command-code',
114
133
  verifiedAgainst: exports.VERIFIED_AGAINST,
134
+ beforePrompt(frame) {
135
+ // Issue #2521 recognised this screen; Issue #2522 reads it.
136
+ //
137
+ // `AskUserQuestion` draws no footer, so neither `afterPrompt` branch below
138
+ // reads it — and the shared `detectPrompt` at step 1 does not either, because
139
+ // a wrapped option description continues on a row that begins with a SINGLE
140
+ // space (` answer).`) and the generic multiple-choice parser ends its scan
141
+ // there, one row short of option 1. The frame therefore reached step 3, where
142
+ // `COMMAND_CODE_PROMPT_PATTERN` (`^❯(\s*$|\s+\S)`) matched the dialog's own
143
+ // cursor row, `❯ 1. Prepare worktrees + dispatch (Recommended)`, and the pane
144
+ // was published as `ready` / `input_prompt`. A human was being asked a
145
+ // question and `wait` exited 0 on it.
146
+ //
147
+ // ## Why `beforePrompt` and not `afterPrompt` (Issue #2522 確定仕様 A / B)
148
+ //
149
+ // #2521's branch sat at 1.5, after the shared parser, because it only had to
150
+ // catch the frames that parser could not read. This one has to run FIRST, and
151
+ // for two separate reasons:
152
+ //
153
+ // - **the short spelling.** With one-line descriptions the generic parser
154
+ // SUCCEEDS on this screen, and succeeds badly: `extractQuestionText` walks
155
+ // up to five rows above option 1 and takes the tab strip, the rule and the
156
+ // transcript's TODOS row into the question. Placing the reader after it
157
+ // would leave exactly the frames that already look fine — and are wrong;
158
+ // - **the unreadable spelling.** A question screen with a gap in its
159
+ // numbering, or one taller than the reader's cap, must reach #2521's
160
+ // manual-operation fallback and NOT the generic parser's partial list.
161
+ // That is only expressible ahead of the parser.
162
+ //
163
+ // `/usage`, `/model` and the four permission dialogs are unaffected, and not
164
+ // by ordering: `readCommandCodeQuestionRegion` positively declines every one
165
+ // of them (the pickers by their own footers, the permission dialogs by having
166
+ // no tab strip), which is what the fixture sweep in
167
+ // `command-code-askuserquestion-2521.test.ts` pins.
168
+ //
169
+ // Read against `frame.raw` rather than `frame.lastLines` or `frame.clean`:
170
+ // the region runs from the last rule row to the last content row, which is
171
+ // more rows than the 15-row window holds, and the rule row itself is what
172
+ // `stripBoxDrawing` would erase. Every other consumer of this reading keeps
173
+ // the same tick's raw capture for the same reason (確定仕様 C).
174
+ const reading = (0, dialog_1.readCommandCodeQuestionDialog)(frame.raw);
175
+ // Read in full: the question, its options, the `❯` default and the free-text
176
+ // row are all in hand, so the pane is published exactly as an ordinary
177
+ // answerable dialog is. `hasActivePrompt: true` is what puts `promptData` on
178
+ // `/current-output`, raises the answer buttons, lets `respond <id> 2` reach
179
+ // the pane and lets Auto-Yes consider it — every one of them through the
180
+ // SAME payload, which is the point of reading it once here.
181
+ if (reading.kind === 'prompt') {
182
+ return {
183
+ status: 'waiting',
184
+ confidence: 'high',
185
+ reason: status_reason_1.STATUS_REASON.PROMPT_DETECTED,
186
+ hasActivePrompt: true,
187
+ evidence: 'positive',
188
+ promptDetection: reading.prompt,
189
+ };
190
+ }
191
+ // The question UI is plainly up and this reader could not read it. #2521's
192
+ // verdict, unchanged and deliberately kept: `COMMAND_CODE_SELECTION_LIST` is
193
+ // in `SELECTION_LIST_REASONS`, which publishes `isSelectionListActive`,
194
+ // raises the arrow-driven card and makes `wait` exit 10 instead of polling a
195
+ // blocked agent to its `--timeout`.
196
+ //
197
+ // `hasActivePrompt: false` and no `promptDetection`: nothing parsed the
198
+ // options, so there is no payload to answer with and none is invented — and
199
+ // the generic parser is not given a second chance to invent a partial one.
200
+ if (reading.kind === 'unsupported') {
201
+ return {
202
+ status: 'waiting',
203
+ confidence: 'high',
204
+ reason: status_reason_1.STATUS_REASON.COMMAND_CODE_SELECTION_LIST,
205
+ hasActivePrompt: false,
206
+ evidence: 'positive',
207
+ };
208
+ }
209
+ return null;
210
+ },
115
211
  afterPrompt(frame) {
116
212
  // Issue #2369. `/usage` opens a READ-ONLY panel: a plan header, two usage
117
213
  // meters, a breakdown URL, and `Press Esc to close` as its last row. It is