commandmate 0.47.0 → 0.48.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 (696) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +501 -501
  3. package/.next/app-path-routes-manifest.json +34 -34
  4. package/.next/build-manifest.json +8 -8
  5. package/.next/diagnostics/framework.json +1 -1
  6. package/.next/next-minimal-server.js.nft.json +1 -1
  7. package/.next/next-server.js.nft.json +1 -1
  8. package/.next/prerender-manifest.json +12 -12
  9. package/.next/react-loadable-manifest.json +1 -1
  10. package/.next/required-server-files.json +1 -1
  11. package/.next/server/app/_not-found/page.js +2 -2
  12. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/agents/update/route.js +2 -2
  15. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  16. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/agents/versions/route.js +1 -1
  18. package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
  19. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/app/release-notes/route.js +1 -1
  21. package/.next/server/app/api/app/release-notes/route.js.nft.json +1 -1
  22. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/app/update/route.js +5 -5
  24. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  25. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/app/update-check/route.js +1 -1
  27. package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
  28. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/auth/login/route.js +1 -1
  30. package/.next/server/app/api/auth/login/route.js.nft.json +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.js +1 -1
  33. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  34. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/status/route.js +1 -1
  36. package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  37. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/capabilities/route.js +1 -1
  39. package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
  40. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/daily-summary/route.js +1 -1
  42. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  43. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  45. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  46. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  48. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  49. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  51. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/external-apps/route.js +1 -1
  54. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  55. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/fs/browse/route.js +1 -1
  57. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  58. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  60. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  61. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  63. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  64. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  66. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  67. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  69. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  70. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/metrics/vibe/route.js +2 -2
  72. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  73. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/ollama/models/route.js +1 -1
  75. package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
  76. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/push/escalation/route.js +1 -1
  78. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  79. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  81. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  82. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/push/vapid/route.js +1 -1
  84. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  85. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  87. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  88. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/relays/route.js +1 -1
  90. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  91. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/remote/pair/route.js +2 -2
  93. package/.next/server/app/api/remote/pair/route.js.nft.json +1 -1
  94. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  96. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  97. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  99. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  100. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/repositories/clone/route.js +1 -1
  102. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  103. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  105. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  106. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/repositories/restore/route.js +1 -1
  108. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  109. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/repositories/route.js +1 -1
  111. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  112. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/repositories/scan/route.js +1 -1
  114. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  115. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/repositories/sync/route.js +1 -1
  117. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  118. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  120. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  121. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  123. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  124. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/settings/default-surface-mode/route.js +1 -1
  126. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  127. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  129. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  130. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/skills/[id]/route.js +1 -1
  132. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  133. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/skills/installations/route.js +1 -1
  135. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  136. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/skills/operations/route.js +2 -2
  138. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  139. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/skills/reindex/route.js +1 -1
  141. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  142. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/skills/route.js +1 -1
  144. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  145. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/slash-commands/route.js +1 -1
  147. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  148. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
  150. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  151. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  153. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/templates/[id]/route.js +1 -1
  156. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  157. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/templates/route.js +1 -1
  159. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  160. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  162. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  163. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/verification/runs/route.js +1 -1
  165. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  166. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +7 -7
  183. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/env/route.js +2 -2
  192. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -3
  198. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  253. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  256. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  262. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  274. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  291. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  298. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  313. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  325. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  326. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  327. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  331. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  332. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  333. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  334. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  335. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  337. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  338. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  340. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +5 -5
  342. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  343. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  344. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  346. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  347. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  349. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  350. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  352. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  353. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  354. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  355. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  356. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  357. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  358. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  359. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  360. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  361. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  362. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  363. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  364. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  365. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  366. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  367. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  368. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  369. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  370. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  371. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  372. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  373. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  374. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  375. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  376. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  377. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  378. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  379. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  380. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  381. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  382. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  383. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  384. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  385. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  386. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  387. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  388. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  389. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  390. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  391. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  392. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  393. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  394. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  395. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  396. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  397. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  398. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -2
  399. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  400. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  401. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  402. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  403. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  404. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  405. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  406. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  407. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  408. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  409. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  410. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  411. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  412. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  413. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  414. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  415. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  416. package/.next/server/app/api/worktrees/apply-default-agents/route.js +1 -1
  417. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  418. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  419. package/.next/server/app/api/worktrees/route.js +1 -1
  420. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  421. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  422. package/.next/server/app/apple-icon.png/route.js +1 -1
  423. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
  424. package/.next/server/app/apple-icon.png.meta +1 -1
  425. package/.next/server/app/icon.png/route.js +1 -1
  426. package/.next/server/app/icon.png/route.js.nft.json +1 -1
  427. package/.next/server/app/icon.png.meta +1 -1
  428. package/.next/server/app/icon1.png/route.js +1 -1
  429. package/.next/server/app/icon1.png/route.js.nft.json +1 -1
  430. package/.next/server/app/icon1.png.meta +1 -1
  431. package/.next/server/app/icon2.png/route.js +1 -1
  432. package/.next/server/app/icon2.png/route.js.nft.json +1 -1
  433. package/.next/server/app/icon2.png.meta +1 -1
  434. package/.next/server/app/login/page.js +2 -2
  435. package/.next/server/app/login/page.js.nft.json +1 -1
  436. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  437. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  438. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  439. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  440. package/.next/server/app/manifest.webmanifest.meta +1 -1
  441. package/.next/server/app/more/page.js +2 -2
  442. package/.next/server/app/more/page.js.nft.json +1 -1
  443. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  444. package/.next/server/app/offline/page.js +2 -2
  445. package/.next/server/app/offline/page.js.nft.json +1 -1
  446. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  447. package/.next/server/app/page.js +2 -2
  448. package/.next/server/app/page.js.nft.json +1 -1
  449. package/.next/server/app/page_client-reference-manifest.js +1 -1
  450. package/.next/server/app/proxy/[...path]/route.js +1 -1
  451. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  452. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  453. package/.next/server/app/repositories/page.js +2 -2
  454. package/.next/server/app/repositories/page.js.nft.json +1 -1
  455. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  456. package/.next/server/app/review/page.js +2 -2
  457. package/.next/server/app/review/page.js.nft.json +1 -1
  458. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  459. package/.next/server/app/sessions/page.js +2 -2
  460. package/.next/server/app/sessions/page.js.nft.json +1 -1
  461. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  462. package/.next/server/app/skills/[skillId]/page.js +2 -2
  463. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  464. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  465. package/.next/server/app/skills/installed/page.js +2 -2
  466. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  467. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  468. package/.next/server/app/skills/page.js +2 -2
  469. package/.next/server/app/skills/page.js.nft.json +1 -1
  470. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  471. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  472. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  473. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  474. package/.next/server/app/worktrees/[id]/page.js +12 -12
  475. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  476. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  477. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  478. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  479. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  480. package/.next/server/app-paths-manifest.json +34 -34
  481. package/.next/server/chunks/{5048.js → 1185.js} +1 -1
  482. package/.next/server/chunks/1191.js +11 -4
  483. package/.next/server/chunks/1501.js +1 -1
  484. package/.next/server/chunks/1601.js +2 -2
  485. package/.next/server/chunks/1656.js +19 -0
  486. package/.next/server/chunks/1945.js +3 -3
  487. package/.next/server/chunks/1990.js +103 -0
  488. package/.next/server/chunks/2119.js +1 -1
  489. package/.next/server/chunks/2404.js +1 -1
  490. package/.next/server/chunks/2422.js +1 -1
  491. package/.next/server/chunks/2445.js +1 -1
  492. package/.next/server/chunks/2534.js +1 -1
  493. package/.next/server/chunks/255.js +1 -0
  494. package/.next/server/chunks/3241.js +1 -1
  495. package/.next/server/chunks/3505.js +7 -0
  496. package/.next/server/chunks/3897.js +22 -0
  497. package/.next/server/chunks/4072.js +5 -5
  498. package/.next/server/chunks/4248.js +1 -1
  499. package/.next/server/chunks/4280.js +1 -0
  500. package/.next/server/chunks/463.js +1 -0
  501. package/.next/server/chunks/5209.js +1 -1
  502. package/.next/server/chunks/5611.js +1 -1
  503. package/.next/server/chunks/6119.js +1 -0
  504. package/.next/server/chunks/6130.js +1 -1
  505. package/.next/server/chunks/6345.js +1 -1
  506. package/.next/server/chunks/6401.js +1 -1
  507. package/.next/server/chunks/6486.js +9 -8
  508. package/.next/server/chunks/6781.js +1 -1
  509. package/.next/server/chunks/6784.js +1 -0
  510. package/.next/server/chunks/720.js +103 -0
  511. package/.next/server/chunks/7604.js +2 -0
  512. package/.next/server/chunks/7905.js +1 -1
  513. package/.next/server/chunks/8581.js +7 -7
  514. package/.next/server/chunks/8728.js +3 -3
  515. package/.next/server/chunks/8791.js +1 -1
  516. package/.next/server/chunks/8807.js +19 -18
  517. package/.next/server/chunks/8918.js +2 -104
  518. package/.next/server/chunks/9130.js +1 -1
  519. package/.next/server/chunks/936.js +1 -1
  520. package/.next/server/chunks/9390.js +1 -1
  521. package/.next/server/chunks/9540.js +1 -1
  522. package/.next/server/chunks/9627.js +4 -4
  523. package/.next/server/chunks/9731.js +3 -3
  524. package/.next/server/middleware-build-manifest.js +1 -1
  525. package/.next/server/middleware-manifest.json +5 -5
  526. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  527. package/.next/server/pages/500.html +1 -1
  528. package/.next/server/pages/_document.js.nft.json +1 -1
  529. package/.next/server/pages/_error.js +3 -3
  530. package/.next/server/pages/_error.js.nft.json +1 -1
  531. package/.next/server/server-reference-manifest.json +1 -1
  532. package/.next/server/src/middleware.js.map +1 -1
  533. package/.next/static/chunks/{1111.5ab4f0ffb0d944e5.js → 1111.1b653d4a9816a0a7.js} +8 -8
  534. package/.next/static/chunks/{1255-7e5873f06b25e129.js → 1255-a85690d352f4f8fd.js} +1 -1
  535. package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +1 -0
  536. package/.next/static/chunks/{2407-b2f524f99f7fc353.js → 2407-26139a8a2f1adbe8.js} +1 -1
  537. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  538. package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-f0121af1cbbedb3b.js} +1 -1
  539. package/.next/static/chunks/{8165-263172c17ae8e8c3.js → 8165-c68b3dc844210e6a.js} +1 -1
  540. package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
  541. package/.next/static/chunks/9079-406b84d3cc891a87.js +1 -0
  542. package/.next/static/chunks/9465-b59bb255b376c813.js +1 -0
  543. package/.next/static/chunks/app/{layout-419eaf7de340f4ab.js → layout-46b4cbf07520d9b6.js} +1 -1
  544. package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +1 -0
  545. package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +1 -0
  546. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  547. package/.next/static/chunks/main-37ca13e38030fe8b.js +1 -0
  548. package/.next/static/chunks/{webpack-468b7b33030234b3.js → webpack-838df0273b03af19.js} +1 -1
  549. package/.next/trace +13 -13
  550. package/dist/cli/commands/auto-yes.d.ts +24 -0
  551. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  552. package/dist/cli/commands/auto-yes.js +73 -3
  553. package/dist/cli/commands/instances.d.ts.map +1 -1
  554. package/dist/cli/commands/instances.js +10 -1
  555. package/dist/cli/commands/prompt.d.ts.map +1 -1
  556. package/dist/cli/commands/prompt.js +28 -14
  557. package/dist/cli/commands/send.d.ts.map +1 -1
  558. package/dist/cli/commands/send.js +15 -0
  559. package/dist/cli/commands/wait.d.ts.map +1 -1
  560. package/dist/cli/commands/wait.js +108 -14
  561. package/dist/cli/docs/agent-operations.d.ts +2 -2
  562. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  563. package/dist/cli/docs/agent-operations.js +27 -0
  564. package/dist/cli/types/api-responses.d.ts +131 -4
  565. package/dist/cli/types/api-responses.d.ts.map +1 -1
  566. package/dist/cli/types/index.d.ts +4 -0
  567. package/dist/cli/types/index.d.ts.map +1 -1
  568. package/dist/cli/utils/resource-resolvers.d.ts +0 -18
  569. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
  570. package/dist/cli/utils/resource-resolvers.js +1 -51
  571. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +65 -2
  572. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  573. package/dist/lib/polling/auto-yes-suppression-reason.js +36 -2
  574. package/dist/lib/prompt-observation/types.d.ts +13 -0
  575. package/dist/lib/prompt-observation/types.d.ts.map +1 -1
  576. package/dist/server/locales/en/worktree.json +2 -1
  577. package/dist/server/locales/ja/worktree.json +2 -1
  578. package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
  579. package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
  580. package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
  581. package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
  582. package/dist/server/src/lib/auto-yes-poller.js +468 -792
  583. package/dist/server/src/lib/auto-yes-state.js +50 -2
  584. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +107 -14
  585. package/dist/server/src/lib/db/chat-db.js +5 -1
  586. package/dist/server/src/lib/db/verification-db.js +23 -2
  587. package/dist/server/src/lib/detection/option-recommendation.js +120 -0
  588. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
  589. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +396 -268
  590. package/dist/server/src/lib/detection/prompt-detector.js +92 -21
  591. package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
  592. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
  593. package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
  594. package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
  595. package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
  596. package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
  597. package/dist/server/src/lib/hooks/permission-adjudication.js +26 -0
  598. package/dist/server/src/lib/hooks/permission-decision-service.js +49 -4
  599. package/dist/server/src/lib/hooks/permission-request-payload.js +20 -0
  600. package/dist/server/src/lib/hooks/sources/antigravity/source.js +21 -0
  601. package/dist/server/src/lib/hooks/sources/claude/source.js +3 -0
  602. package/dist/server/src/lib/hooks/sources/codex/source.js +2 -0
  603. package/dist/server/src/lib/hooks/sources/command-code/source.js +2 -0
  604. package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
  605. package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
  606. package/dist/server/src/lib/hooks/sources/legacy-relay.js +2 -0
  607. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
  608. package/dist/server/src/lib/hooks/sources/opencode/source.js +2 -0
  609. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +6 -0
  610. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +2 -0
  611. package/dist/server/src/lib/hooks/sources/pending-decisions.js +14 -2
  612. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +14 -3
  613. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +21 -1
  614. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
  615. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +117 -0
  616. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +1091 -0
  617. package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
  618. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
  619. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
  620. package/dist/server/src/lib/polling/auto-yes-ledger-records.js +143 -0
  621. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +122 -0
  622. package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
  623. package/dist/server/src/lib/polling/auto-yes-policy.js +46 -11
  624. package/dist/server/src/lib/polling/auto-yes-poller-capture.js +63 -0
  625. package/dist/server/src/lib/polling/auto-yes-poller-enter-fallback.js +37 -0
  626. package/dist/server/src/lib/polling/auto-yes-poller-generation.js +192 -0
  627. package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +324 -0
  628. package/dist/server/src/lib/polling/auto-yes-poller-state.js +193 -26
  629. package/dist/server/src/lib/polling/auto-yes-poller-steps.js +279 -0
  630. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +13 -2
  631. package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
  632. package/dist/server/src/lib/polling/auto-yes-resolver.js +117 -22
  633. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +36 -2
  634. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
  635. package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
  636. package/dist/server/src/lib/polling/response-checker-blank-response.js +30 -0
  637. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
  638. package/dist/server/src/lib/polling/response-checker.js +138 -53
  639. package/dist/server/src/lib/prompt-answer-sender.js +104 -10
  640. package/dist/server/src/lib/prompt-observation/appearance.js +165 -0
  641. package/dist/server/src/lib/push/notification-dedup.js +15 -2
  642. package/dist/server/src/lib/push/prompt-card-state.js +140 -19
  643. package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
  644. package/dist/server/src/lib/push/push-sender.js +23 -3
  645. package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
  646. package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
  647. package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
  648. package/dist/server/src/lib/session/agent-event-state.js +25 -5
  649. package/dist/server/src/lib/session/agent-event-turn.js +140 -46
  650. package/dist/server/src/lib/session/cli-session.js +21 -2
  651. package/dist/server/src/lib/session/current-output-builder.js +64 -11
  652. package/dist/server/src/lib/session/send-attempt-state.js +23 -7
  653. package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
  654. package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
  655. package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
  656. package/dist/server/src/lib/session/waiting-episode-state.js +307 -17
  657. package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
  658. package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
  659. package/dist/server/src/lib/tmux/tmux.js +54 -9
  660. package/dist/server/src/lib/verification/gate-runner.js +162 -13
  661. package/dist/server/src/lib/verification/machine-lock.js +5 -0
  662. package/dist/server/src/lib/ws-server.js +18 -3
  663. package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
  664. package/dist/server/src/types/auto-yes-decision.js +61 -0
  665. package/dist/server/src/types/auto-yes.js +6 -0
  666. package/dist/server/src/types/prompt-reading.js +32 -0
  667. package/dist/types/auto-yes-answer-mode.d.ts +35 -0
  668. package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
  669. package/dist/types/auto-yes-answer-mode.js +38 -0
  670. package/docs/en/user-guide/webapp-guide.md +33 -4
  671. package/package.json +2 -2
  672. package/public/sw.js +76 -4
  673. package/release-notes/0.47.1.json +20 -0
  674. package/release-notes/0.47.2.json +20 -0
  675. package/release-notes/0.48.0.json +57 -0
  676. package/scripts/hooks/cmate-agent-event.sh +22 -0
  677. package/.next/server/chunks/1331.js +0 -22
  678. package/.next/server/chunks/1559.js +0 -2
  679. package/.next/server/chunks/1836.js +0 -1
  680. package/.next/server/chunks/1944.js +0 -1
  681. package/.next/server/chunks/2328.js +0 -1
  682. package/.next/server/chunks/2460.js +0 -1
  683. package/.next/server/chunks/5292.js +0 -7
  684. package/.next/server/chunks/5595.js +0 -1
  685. package/.next/server/chunks/7166.js +0 -19
  686. package/.next/server/chunks/9051.js +0 -1
  687. package/.next/server/chunks/9199.js +0 -1
  688. package/.next/static/chunks/602-1c1488959215e140.js +0 -1
  689. package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
  690. package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
  691. package/.next/static/chunks/9465-e5a351baa941f31b.js +0 -1
  692. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
  693. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +0 -1
  694. package/.next/static/chunks/main-ac91ed6e71380841.js +0 -1
  695. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_buildManifest.js +0 -0
  696. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_ssgManifest.js +0 -0
@@ -1,19 +1,25 @@
1
1
  "use strict";
2
2
  /** Multiple choice prompt detection logic extracted from prompt-detector.ts (Issue #575). */
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.APPROVAL_TARGET_MAX_LOOKBACK = void 0;
4
+ exports.joinApprovalTarget = exports.findApprovalContextStart = exports.findApprovalContextRange = exports.APPROVAL_TARGET_MAX_LOOKBACK = void 0;
5
5
  exports.findClaudeTaskPanelLines = findClaudeTaskPanelLines;
6
6
  exports.findClaudeChrome = findClaudeChrome;
7
7
  exports.maskClaudeChrome = maskClaudeChrome;
8
8
  exports.isTypedTextFieldOption = isTypedTextFieldOption;
9
- exports.findApprovalContextStart = findApprovalContextStart;
10
- exports.joinApprovalTarget = joinApprovalTarget;
11
9
  exports.buildMultipleChoiceResult = buildMultipleChoiceResult;
12
10
  exports.detectMultipleChoicePrompt = detectMultipleChoicePrompt;
13
11
  const tui_detection_frame_1 = require("./tui-detection-frame");
14
12
  const cli_patterns_1 = require("./cli-patterns");
13
+ const patterns_1 = require("./tools/claude/patterns");
15
14
  const prompt_view_1 = require("../../lib/session/prompt-view");
15
+ const option_recommendation_1 = require("./option-recommendation");
16
16
  const picker_chrome_1 = require("./tools/claude/picker-chrome");
17
+ const prompt_detect_multiple_choice_approval_context_1 = require("./prompt-detect-multiple-choice-approval-context");
18
+ var prompt_detect_multiple_choice_approval_context_2 = require("./prompt-detect-multiple-choice-approval-context");
19
+ Object.defineProperty(exports, "APPROVAL_TARGET_MAX_LOOKBACK", { enumerable: true, get: function () { return prompt_detect_multiple_choice_approval_context_2.APPROVAL_TARGET_MAX_LOOKBACK; } });
20
+ Object.defineProperty(exports, "findApprovalContextRange", { enumerable: true, get: function () { return prompt_detect_multiple_choice_approval_context_2.findApprovalContextRange; } });
21
+ Object.defineProperty(exports, "findApprovalContextStart", { enumerable: true, get: function () { return prompt_detect_multiple_choice_approval_context_2.findApprovalContextStart; } });
22
+ Object.defineProperty(exports, "joinApprovalTarget", { enumerable: true, get: function () { return prompt_detect_multiple_choice_approval_context_2.joinApprovalTarget; } });
17
23
  // ============================================================================
18
24
  // Constants
19
25
  // ============================================================================
@@ -220,13 +226,6 @@ function maskClaudeChrome(lines, chrome) {
220
226
  * Anchored, no nested quantifiers — ReDoS safe (S4-001).
221
227
  */
222
228
  const PANE_WRAPPED_LABEL_PATTERN = /^\s{3,}\S/;
223
- /**
224
- * Pattern for separator lines (horizontal rules).
225
- * Matches lines consisting only of dash (-) or em-dash (─) characters.
226
- * Used to skip separator lines in question extraction and non-option line handling.
227
- * Anchored at both ends -- ReDoS safe (S4-001).
228
- */
229
- const SEPARATOR_LINE_PATTERN = /^[-─]+$/;
230
229
  /**
231
230
  * How many lines above `questionEndIndex` the question text is collected from.
232
231
  * Also the point the Issue #1699 approval-context scan starts walking up from,
@@ -552,7 +551,7 @@ function findQuestionLineInRange(lines, startIndex, scanRange, lowerBound) {
552
551
  for (let i = startIndex - 1; i >= scanLimit; i--) {
553
552
  const candidateLine = lines[i]?.trim() ?? '';
554
553
  // Skip empty lines and separator lines (horizontal rules)
555
- if (!candidateLine || SEPARATOR_LINE_PATTERN.test(candidateLine))
554
+ if (!candidateLine || prompt_detect_multiple_choice_approval_context_1.SEPARATOR_LINE_PATTERN.test(candidateLine))
556
555
  continue;
557
556
  if (isQuestionLikeLine(candidateLine)) {
558
557
  return true;
@@ -649,26 +648,86 @@ function isContinuationLine(rawLine, line) {
649
648
  }
650
649
  return false;
651
650
  }
651
+ /**
652
+ * The user's own message echo (Issue #3832): claude's `❯ msg`, codex's `› msg`.
653
+ * The cursor of an option row (`❯ 1.`) is not one. `>` is left out on purpose:
654
+ * codex's trust dialog opens with `> You are in <dir>` and a here-document's
655
+ * body carries `> ` rows, so a `>` row may be the prompt's own.
656
+ */
657
+ const USER_ECHO_PATTERN = /^[❯›]\s(?!\s*\d+[.)]\s)/;
658
+ /**
659
+ * codex's end-of-turn row (Issue #3832): `Worked for 17s • 19:30`, or the rule
660
+ * form `─ Worked for 1m 2s ─`. claude's is {@link CLAUDE_TURN_COMPLETE_PATTERN}.
661
+ */
662
+ const CODEX_TURN_COMPLETE_PATTERN = /^─*\s*Worked for\s+(?:\d+h\s*)?(?:\d+m\s*)?\d+s\b/;
663
+ /** True when the nearest non-blank row above `row` (down to `floor`) ends a finished turn. */
664
+ function followsFinishedTurn(lines, row, floor) {
665
+ for (let i = row - 1; i >= floor; i--) {
666
+ const line = lines[i];
667
+ if (line === undefined || line.trim() === '')
668
+ continue;
669
+ return patterns_1.CLAUDE_TURN_COMPLETE_PATTERN.test(line) || CODEX_TURN_COMPLETE_PATTERN.test(line.trim());
670
+ }
671
+ return false;
672
+ }
673
+ /**
674
+ * The lowest row in `[from, questionEndIndex)` that is the user's message echo
675
+ * (Issue #3832), or -1.
676
+ *
677
+ * A `❯ ` / `› ` row is taken for the echo only when the screen leaves no doubt:
678
+ * drawn left of the dialog's frame (claude's echo at column 0 against its frame
679
+ * at 1, codex's at 0 against 2), and right under the previous turn's end-of-turn
680
+ * row (`✻ Baked for 3s`, `Worked for 17s`). A body row that happens to start
681
+ * with the glyph — at the frame's column, or under the command it belongs to —
682
+ * is not one, so the rows above it stay in `question` and the deny surface is
683
+ * taken wide.
684
+ */
685
+ function findUserEchoRow(lines, questionEndIndex, from, panelEnd, floor) {
686
+ const frameIndent = (0, prompt_detect_multiple_choice_approval_context_1.panelFrameIndent)(lines, questionEndIndex, panelEnd);
687
+ for (let i = questionEndIndex - 1; i >= from; i--) {
688
+ const line = lines[i];
689
+ if (line === undefined || line.trim() === '')
690
+ continue;
691
+ if ((0, prompt_detect_multiple_choice_approval_context_1.indentOf)(line) < frameIndent && USER_ECHO_PATTERN.test(line.trim())
692
+ && followsFinishedTurn(lines, i, floor)) {
693
+ return i;
694
+ }
695
+ }
696
+ return -1;
697
+ }
652
698
  /**
653
699
  * Extract question text from the lines around questionEndIndex.
654
700
  * Collects non-empty, non-separator lines from up to 5 lines before questionEndIndex
655
701
  * through questionEndIndex itself, joining them with spaces.
656
702
  *
703
+ * [Issue #3832] Not above the user's message echo ({@link findUserEchoRow}):
704
+ * that message opened the current turn, so the rows above it — the previous
705
+ * turn's `⏺ IMPL_COMPLETED` / `✻ Cogitated …`, codex's `• HTTP/2 200` /
706
+ * `Worked for 17s` on the measured screens — are not the prompt's and used to
707
+ * reach the deny surface through `question`. The echo row itself stays. No
708
+ * other row bounds the window: a `⏺` / `●` / `•` row may be the call the prompt
709
+ * asks about (codex's `• Calling …`, agy's `● Bash(…)`), and `question` is what
710
+ * keeps such a row in the deny surface when `approvalTarget` cuts at it.
711
+ *
657
712
  * @param lines - Array of output lines
658
713
  * @param questionEndIndex - Index of the last line before options, or -1 if not found
659
714
  * @param floor - First row the question may start at. Issue #2486: one below an
660
715
  * AskUserQuestion picker's tab row, so neither that row nor the transcript
661
716
  * above it becomes part of the question; 0 when there is none.
717
+ * @param panelEnd - Exclusive end of the dialog's own rows, which set the frame
718
+ * column the echo is drawn at or left of (Issue #3832)
662
719
  * @returns Extracted question text, or generic fallback if questionEndIndex is -1
663
720
  */
664
- function extractQuestionText(lines, questionEndIndex, floor = 0) {
721
+ function extractQuestionText(lines, questionEndIndex, floor = 0, panelEnd = questionEndIndex + 1) {
665
722
  if (questionEndIndex < 0) {
666
723
  return 'Please select an option:';
667
724
  }
725
+ const windowStart = Math.max(floor, questionEndIndex - QUESTION_CONTEXT_LINES);
726
+ const start = Math.max(windowStart, findUserEchoRow(lines, questionEndIndex, windowStart, panelEnd, floor));
668
727
  const questionLines = [];
669
- for (let i = Math.max(floor, questionEndIndex - QUESTION_CONTEXT_LINES); i <= questionEndIndex; i++) {
728
+ for (let i = start; i <= questionEndIndex; i++) {
670
729
  const line = lines[i].trim();
671
- if (line && !SEPARATOR_LINE_PATTERN.test(line)) {
730
+ if (line && !prompt_detect_multiple_choice_approval_context_1.SEPARATOR_LINE_PATTERN.test(line)) {
672
731
  questionLines.push(line);
673
732
  }
674
733
  }
@@ -694,79 +753,6 @@ function extractInstructionText(lines, questionEndIndex, effectiveEnd) {
694
753
  const joined = blockLines.join('\n').trim();
695
754
  return joined.length > 0 ? joined : undefined;
696
755
  }
697
- /**
698
- * Lines that mean "the previous turn ended here" when scanning upward.
699
- *
700
- * Every supported CLI renders its transcript as marker-prefixed rows — Claude's
701
- * tool-use `⏺` and result `⎿`, Codex's activity `•`, its approval receipts `✔`
702
- * / `✗`, the user's own `›` / `❯` / `>` echo, and its output continuation `└`.
703
- * The lines a prompt panel puts above its question (a header such as "Bash
704
- * command", the command itself, a one-line description) never carry one, which
705
- * is what makes this usable as the panel's upper edge after `stripBoxDrawing`
706
- * has erased the real box border.
707
- *
708
- * Horizontal rules count too: Codex draws one between turns.
709
- *
710
- * Anchored at the start of the trimmed line — ReDoS safe (no repetition).
711
- */
712
- const TURN_BOUNDARY_PATTERN = /^[⏺⎿●○•✔✓✖✗✘›»❯└├>]/;
713
- /**
714
- * How far above the question the approval context may reach (Issue #1699).
715
- *
716
- * The boundary marker above is the actual fix; this cap only exists so a frame
717
- * that happens to contain no marker at all (a bare shell `(y/n)` prompt under
718
- * plain command output) cannot drag an unbounded scrollback window into the
719
- * deny surface the way the old fixed 19-line lookback did. Sized for the
720
- * tallest real permission panel measured: header + blank + a wrapped multi-line
721
- * command + description + blank.
722
- */
723
- exports.APPROVAL_TARGET_MAX_LOOKBACK = 12;
724
- /** True when this line belongs to a previous turn rather than the prompt panel. */
725
- function isTurnBoundaryLine(rawLine) {
726
- if (rawLine === undefined)
727
- return false;
728
- const line = rawLine.trim();
729
- if (line === '')
730
- return false;
731
- return TURN_BOUNDARY_PATTERN.test(line) || SEPARATOR_LINE_PATTERN.test(line);
732
- }
733
- /**
734
- * First line index that still belongs to *this* prompt, scanning upward.
735
- *
736
- * Walks up from `questionLineIndex - 1` and stops just below the nearest turn
737
- * boundary; with no boundary in reach it falls back to the lookback cap.
738
- * Everything above the returned index is a previous turn and must never reach a
739
- * deny pattern — that poisoning is Issue #1699.
740
- *
741
- * Shared by both detector paths: multiple_choice passes its `questionEndIndex`,
742
- * yes_no the line its pattern matched on.
743
- *
744
- * @param lines - Full frame, already ANSI/box stripped
745
- * @param questionLineIndex - Line the prompt's own question sits on
746
- * @returns Index of the first line of the current prompt's own block
747
- */
748
- function findApprovalContextStart(lines, questionLineIndex) {
749
- const floor = Math.max(0, questionLineIndex - exports.APPROVAL_TARGET_MAX_LOOKBACK);
750
- for (let i = questionLineIndex - 1; i >= floor; i--) {
751
- if (isTurnBoundaryLine(lines[i])) {
752
- return i + 1;
753
- }
754
- }
755
- return floor;
756
- }
757
- /**
758
- * Join a slice of the frame into an approval-target string.
759
- *
760
- * @returns The trimmed block, or undefined when it is empty
761
- */
762
- function joinApprovalTarget(lines, start, end) {
763
- const joined = lines
764
- .slice(start, end)
765
- .map(l => l.trimEnd())
766
- .join('\n')
767
- .trim();
768
- return joined.length > 0 ? joined : undefined;
769
- }
770
756
  /**
771
757
  * Extract what this multiple-choice prompt is asking approval for (Issue #1699).
772
758
  *
@@ -782,8 +768,9 @@ function joinApprovalTarget(lines, start, end) {
782
768
  *
783
769
  * Residual, deliberately left alone: `question` itself is built from up to
784
770
  * {@link QUESTION_CONTEXT_LINES} lines above `questionEndIndex` and is also part
785
- * of the deny surface. Narrowing that would change prompt dedup keys and what
786
- * the UI renders, and it is bounded by the options below it either way.
771
+ * of the deny surface. Issue #3832 only stops it at the user's message echo
772
+ * (see {@link extractQuestionText}); a previous turn below no echo still
773
+ * reaches it, which over-suppresses rather than under-suppresses.
787
774
  *
788
775
  * [Issue #2486] One exception to both: neither reaches above an AskUserQuestion
789
776
  * picker's tab row. Everything up there is the transcript — the Bash call Claude
@@ -800,7 +787,19 @@ function extractApprovalTarget(lines, questionEndIndex, effectiveEnd, floor = 0)
800
787
  if (questionEndIndex < 0) {
801
788
  return undefined;
802
789
  }
803
- return joinApprovalTarget(lines, Math.max(floor, findApprovalContextStart(lines, questionEndIndex)), effectiveEnd);
790
+ const range = (0, prompt_detect_multiple_choice_approval_context_1.findApprovalContextRange)(lines, questionEndIndex, effectiveEnd);
791
+ // Issue #3881: the picker's tab row is a boundary of its own, so a scan it
792
+ // cuts short is complete whatever the scan said about the rows above.
793
+ const bounded = floor > 0 && floor >= range.start;
794
+ const start = Math.max(floor, range.start);
795
+ return {
796
+ approvalTarget: (0, prompt_detect_multiple_choice_approval_context_1.joinApprovalTarget)(lines, start, effectiveEnd),
797
+ approvalContext: {
798
+ startRow: start,
799
+ endRow: effectiveEnd,
800
+ completeness: bounded ? 'complete' : range.completeness,
801
+ },
802
+ };
804
803
  }
805
804
  /**
806
805
  * Build the final PromptDetectionResult for a multiple choice prompt.
@@ -819,7 +818,7 @@ function extractApprovalTarget(lines, questionEndIndex, effectiveEnd, floor = 0)
819
818
  * @returns PromptDetectionResult with isPrompt: true and multiple_choice data
820
819
  */
821
820
  function buildMultipleChoiceResult(question, collectedOptions, context, output, truncateRawContentFn, submitMode, isAskUserQuestion) {
822
- const { instructionText, approvalTarget } = context ?? {};
821
+ const { instructionText, approvalTarget, approvalContext } = context ?? {};
823
822
  return {
824
823
  isPrompt: true,
825
824
  promptData: {
@@ -837,11 +836,16 @@ function buildMultipleChoiceResult(question, collectedOptions, context, output,
837
836
  status: 'pending',
838
837
  instructionText,
839
838
  ...(approvalTarget !== undefined ? { approvalTarget } : {}),
839
+ // Issue #3881 (H-3): only the case the resolver must act on.
840
+ ...(approvalTarget !== undefined && approvalContext?.completeness === 'truncated'
841
+ ? { approvalTargetCompleteness: 'truncated' }
842
+ : {}),
840
843
  ...(submitMode ? { submitMode } : {}),
841
844
  ...(isAskUserQuestion ? { isAskUserQuestion: true } : {}),
842
845
  },
843
846
  cleanContent: question.trim(),
844
847
  rawContent: truncateRawContentFn(output.trim()), // Issue #235: complete prompt output (truncated) [MF-001]
848
+ ...(approvalContext !== undefined ? { approvalContext } : {}),
845
849
  };
846
850
  }
847
851
  // ============================================================================
@@ -893,6 +897,61 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
893
897
  // C-003: Use ?? true for readability instead of !== false double negation
894
898
  const requireDefault = options?.requireDefaultIndicator ?? true;
895
899
  const lines = output.split('\n');
900
+ const { scanStart, effectiveEnd, hasAskUserQuestionFooter } = findScanWindow(lines);
901
+ const scanWindow = lines.slice(scanStart, effectiveEnd);
902
+ if (hasModelOverlayFooter(scanWindow)) {
903
+ return noPromptResult(output);
904
+ }
905
+ const { hasConfirmationFooter, hasNumberFooter } = findConfirmationFooter(scanWindow);
906
+ // ==========================================================================
907
+ // Pass 1: Check for ❯ indicator existence in scan window
908
+ // If no ❯ lines found and requireDefault is true, there is no multiple_choice prompt.
909
+ // When requireDefault is false, skip this gate entirely to allow ❯-less detection.
910
+ // ==========================================================================
911
+ if (requireDefault) {
912
+ const hasDefaultLine = hasDefaultOptionLine(scanWindow);
913
+ if (!hasDefaultLine && !hasConfirmationFooter) {
914
+ return noPromptResult(output);
915
+ }
916
+ }
917
+ const scan = collectOptions(lines, scanStart, effectiveEnd);
918
+ if (scan === null) {
919
+ return noPromptResult(output);
920
+ }
921
+ const { collectedOptions, optionRows, questionEndIndex } = scan;
922
+ if (!passesOptionValidation(collectedOptions, requireDefault, hasConfirmationFooter, questionEndIndex, lines, scanStart)) {
923
+ return noPromptResult(output);
924
+ }
925
+ // [Issue #2486] An AskUserQuestion picker's tab row is the dialog's top edge:
926
+ // the row is chrome and everything above it is transcript. Found once so
927
+ // `question` and `approvalTarget` start at the same row; 0 on a frame with no
928
+ // tab row, which leaves every other prompt exactly as it was. `instructionText`
929
+ // keeps its wide window — it is the human's view, and on a preview picker the
930
+ // pane it carries is what the question asks the human to look at.
931
+ const pickerTop = questionEndIndex < 0
932
+ ? 0
933
+ : (0, picker_chrome_1.findAskUserQuestionTabRow)(lines, questionEndIndex, prompt_detect_multiple_choice_approval_context_1.APPROVAL_TARGET_MAX_LOOKBACK) + 1;
934
+ const question = extractQuestionText(lines, questionEndIndex, pickerTop, effectiveEnd);
935
+ const instructionText = extractInstructionText(lines, questionEndIndex, effectiveEnd);
936
+ // Issue #1699: the same block, cut at the previous turn's boundary. Display
937
+ // keeps the wide window; deny patterns are judged against this one.
938
+ const approvalBlock = extractApprovalTarget(lines, questionEndIndex, effectiveEnd, pickerTop);
939
+ // Issue #616: Determine submitMode from confirmation footer (detected in single-pass above)
940
+ const submitMode = hasConfirmationFooter
941
+ ? (hasNumberFooter ? 'answer_only' : 'answer_then_enter')
942
+ : undefined;
943
+ const result = buildMultipleChoiceResult(question, collectedOptions, { instructionText, ...approvalBlock }, output, truncateRawContentFn, submitMode, hasAskUserQuestionFooter);
944
+ // [Issue #3863] Only the AskUserQuestion picker: the one this parser reads
945
+ // as a question, whose rows are a title and an indented description.
946
+ if (!hasAskUserQuestionFooter)
947
+ return result;
948
+ const paneColumns = (0, option_recommendation_1.lowerBoundPaneColumns)(lines);
949
+ return {
950
+ ...result,
951
+ optionRecommendations: collectedOptions.map((option, index) => readPickerOptionRecommendation(option.label, optionRows[index], paneColumns)),
952
+ };
953
+ }
954
+ function findScanWindow(lines) {
896
955
  // Strip trailing empty lines (tmux terminal padding) before computing scan window.
897
956
  // tmux buffers often end with many empty padding lines that would shift the
898
957
  // scan window away from the actual prompt content.
@@ -926,7 +985,9 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
926
985
  break;
927
986
  }
928
987
  }
929
- const scanWindow = lines.slice(scanStart, effectiveEnd);
988
+ return { scanStart, effectiveEnd, hasAskUserQuestionFooter };
989
+ }
990
+ function hasModelOverlayFooter(scanWindow) {
930
991
  // [Issue #1495] Claude `/model` local-settings overlay guard.
931
992
  // The `/model` overlay renders a ❯-marked numbered model list ("1. Default …
932
993
  // 5. Haiku") under a "Select model" header, which the option-collection logic
@@ -942,9 +1003,12 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
942
1003
  // selection list via CLAUDE_SELECTION_LIST_FOOTER (NavigationButtons + ESC hatch).
943
1004
  for (const rawLine of scanWindow) {
944
1005
  if (cli_patterns_1.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN.test(rawLine)) {
945
- return noPromptResult(output);
1006
+ return true;
946
1007
  }
947
1008
  }
1009
+ return false;
1010
+ }
1011
+ function findConfirmationFooter(scanWindow) {
948
1012
  // Single-pass footer detection: identify both confirmation footer presence and
949
1013
  // specific "press number to confirm" variant in one iteration (Issue #616).
950
1014
  let hasConfirmationFooter = false;
@@ -959,31 +1023,36 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
959
1023
  break; // Both patterns are subsets of CONFIRMATION_FOOTER; one match suffices
960
1024
  }
961
1025
  }
962
- // ==========================================================================
963
- // Pass 1: Check for ❯ indicator existence in scan window
964
- // If no ❯ lines found and requireDefault is true, there is no multiple_choice prompt.
965
- // When requireDefault is false, skip this gate entirely to allow ❯-less detection.
966
- // ==========================================================================
967
- if (requireDefault) {
968
- let hasDefaultLine = false;
969
- for (const rawLine of scanWindow) {
970
- const line = rawLine.trim();
971
- if (DEFAULT_OPTION_PATTERN.test(line)) {
972
- hasDefaultLine = true;
973
- break;
974
- }
975
- }
976
- if (!hasDefaultLine && !hasConfirmationFooter) {
977
- return noPromptResult(output);
1026
+ return { hasConfirmationFooter, hasNumberFooter };
1027
+ }
1028
+ function hasDefaultOptionLine(scanWindow) {
1029
+ for (const rawLine of scanWindow) {
1030
+ const line = rawLine.trim();
1031
+ if (DEFAULT_OPTION_PATTERN.test(line)) {
1032
+ return true;
978
1033
  }
979
1034
  }
1035
+ return false;
1036
+ }
1037
+ function collectOptions(lines, scanStart, effectiveEnd) {
980
1038
  // ==========================================================================
981
1039
  // Pass 2: Collect options (executed when Pass 1 passes or is skipped)
982
1040
  // Scan from end to find options, using both patterns.
983
1041
  // ==========================================================================
984
- const collectedOptions = [];
985
- let questionEndIndex = -1;
986
- let continuationLineCount = 0;
1042
+ const state = {
1043
+ collectedOptions: [],
1044
+ // [Issue #3863] Per collected option (same order): the option row as drawn
1045
+ // and the rows under it, for telling its title from its description.
1046
+ optionRows: [],
1047
+ // Continuation rows met since the option below was collected — the rows
1048
+ // UNDER the option the reverse scan reaches next.
1049
+ rowsBelow: [],
1050
+ questionEndIndex: -1,
1051
+ continuationLineCount: 0,
1052
+ // [Issue #2486] Wrapped label rows beside a preview pane, held for the option
1053
+ // ABOVE them, which the reverse scan has not reached yet.
1054
+ paneWrap: [],
1055
+ };
987
1056
  // [Issue #1708] Claude's bottom-anchored task panel is an overlay, not part of
988
1057
  // the prompt frame. Resolved as a block up front because the reverse scan meets
989
1058
  // its rows before its header and so cannot recognise them one at a time.
@@ -992,16 +1061,13 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
992
1061
  // rows the scan likewise meets before the top border that identifies it — and
993
1062
  // some of which it shares with the options column.
994
1063
  const chrome = findClaudeChrome(lines, scanStart, effectiveEnd);
995
- // [Issue #2486] Wrapped label rows beside a preview pane, held for the option
996
- // ABOVE them, which the reverse scan has not reached yet.
997
- let paneWrap = [];
998
1064
  for (let i = effectiveEnd - 1; i >= scanStart; i--) {
999
1065
  // [Issue #1708] Chrome rows are metadata. Same handling as the
1000
1066
  // COLLAPSED_OUTPUT / SUMMARY guards below: skip without ending the scan, so
1001
1067
  // the options rendered ABOVE the panel (or beside the pane) are still
1002
1068
  // reachable.
1003
1069
  if (chrome.rows.has(i)) {
1004
- continuationLineCount++;
1070
+ state.continuationLineCount++;
1005
1071
  continue;
1006
1072
  }
1007
1073
  // [Issue #2486] A row the preview pane shares with the options column is
@@ -1011,143 +1077,180 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
1011
1077
  // Original indentation preserved; only the pane is cut off.
1012
1078
  const rawLine = paneCut === undefined ? lines[i] : lines[i].slice(0, paneCut).trimEnd();
1013
1079
  const line = rawLine.trim();
1014
- // [Issue #2486] See PANE_WRAPPED_LABEL_PATTERN: the tail of the label above.
1015
- if (paneCut !== undefined && PANE_WRAPPED_LABEL_PATTERN.test(rawLine)) {
1016
- paneWrap.unshift(line);
1017
- continuationLineCount++;
1018
- continue;
1019
- }
1020
- // Collapsed preview markers like "[… 12 lines] ctrl + a view all" are
1021
- // metadata, not selectable options. Skip them before option parsing to
1022
- // avoid misclassifying "12" as an option number.
1023
- if (COLLAPSED_OUTPUT_PATTERN.test(line)) {
1024
- continuationLineCount++;
1080
+ if (isMetadataRow(state, rawLine, line, paneCut)) {
1025
1081
  continue;
1026
1082
  }
1027
- // [Issue #704] Claude v2.1.142 renders summary lines like "… +1 pending"
1028
- // BELOW the real options. Without this guard, NORMAL_OPTION_PATTERN below
1029
- // would match the summary line as `option N / label='pending'`, which
1030
- // would then poison isValidPrecedingOption() and cause every real option
1031
- // above (1./2./3.) to be rejected — resulting in collectedOptions.length<2
1032
- // and a spurious no_prompt verdict. Treat the summary line as metadata
1033
- // (same continuation handling as COLLAPSED_OUTPUT_PATTERN above) so the
1034
- // reverse scan continues into the actual option block.
1035
- //
1036
- // Defense-in-depth: works alongside the S2 effectiveEnd trim above. Either
1037
- // S1 or S2 alone is sufficient to fix Issue #704; keeping both protects
1038
- // against future Claude renderings where the footer line text changes
1039
- // (S1 still catches) or the summary line wording changes (S2 still
1040
- // catches via footer trim).
1041
- if (SUMMARY_LINE_PATTERN.test(line)) {
1042
- continuationLineCount++;
1083
+ if (tryCollectOption(state, rawLine, line, paneCut)) {
1043
1084
  continue;
1044
1085
  }
1045
- // Try DEFAULT_OPTION_PATTERN first (❯ indicator)
1046
- const defaultMatch = line.match(DEFAULT_OPTION_PATTERN);
1047
- if (defaultMatch) {
1048
- const number = parseInt(defaultMatch[1], 10);
1049
- if (number <= 20 && isValidPrecedingOption(number, collectedOptions)) {
1050
- // [Issue #2486] A label that wrapped beside a preview pane is whole again.
1051
- const label = [defaultMatch[2].trim(), ...paneWrap].join(' ');
1052
- paneWrap = [];
1053
- collectedOptions.unshift({ number, label, isDefault: true });
1054
- continuationLineCount = 0;
1055
- continue;
1056
- }
1057
- }
1058
- // Try NORMAL_OPTION_PATTERN (no ❯ indicator)
1059
- const normalMatch = line.match(NORMAL_OPTION_PATTERN);
1060
- if (normalMatch) {
1061
- const number = parseInt(normalMatch[1], 10);
1062
- // Skip unreasonably large option numbers (e.g., "[… 373 lines]" from Codex
1063
- // collapsed output matches as option 373). CLI prompts never exceed 20 options.
1064
- if (number > 20) {
1065
- // Treat as non-option line
1066
- }
1067
- else if (!isValidPrecedingOption(number, collectedOptions)) {
1068
- // Treat as non-option line (e.g., diff line numbers from Codex approval prompts)
1069
- }
1070
- else {
1071
- const label = [normalMatch[2].trim(), ...paneWrap].join(' ');
1072
- paneWrap = [];
1073
- collectedOptions.unshift({ number, label, isDefault: false });
1074
- continuationLineCount = 0;
1075
- continue;
1076
- }
1077
- }
1078
1086
  // [Issue #287 Bug3] User input prompt barrier:
1079
1087
  // When no options have been collected yet and the line starts with ❯ (U+276F)
1080
1088
  // but did NOT match DEFAULT_OPTION_PATTERN above, this line is a Claude Code
1081
1089
  // user input prompt (e.g., "❯ 1", "❯ /command") or idle prompt ("❯").
1082
1090
  // Anything above this line in the scrollback is historical conversation text,
1083
1091
  // not an active prompt. Stop scanning to prevent false positives.
1084
- if (collectedOptions.length === 0 && (line.startsWith('\u276F') || line.startsWith('\u25CF') || line.startsWith('\u203A'))) {
1085
- return noPromptResult(output);
1092
+ if (state.collectedOptions.length === 0 && (line.startsWith('❯') || line.startsWith('●') || line.startsWith('›'))) {
1093
+ return null;
1094
+ }
1095
+ // [Issue #3863] An indented row under the bottom option: its wrapped title
1096
+ // or its description. Only remembered; the scan goes on as before.
1097
+ if (state.collectedOptions.length === 0 && line && /^\s{3,}/.test(rawLine)) {
1098
+ state.rowsBelow.unshift(rawLine);
1086
1099
  }
1087
1100
  // Non-option line handling
1088
- if (collectedOptions.length > 0 && line && !SEPARATOR_LINE_PATTERN.test(line)) {
1089
- // [Issue #460] For deeply indented lines (4+ leading spaces), check
1090
- // continuation BEFORE question keywords. These are option description
1091
- // lines (e.g., " Let Gemini CLI decide the best model...") that may
1092
- // contain keywords like "decide" or "select" but are NOT question lines.
1093
- // The 2-space " Select model" case (Issue #256) is excluded by the 4+ threshold.
1094
- const isDeepIndent = /^\s{4,}/.test(rawLine);
1095
- if (isDeepIndent && isContinuationLine(rawLine, line)) {
1096
- continuationLineCount++;
1097
- if (continuationLineCount > MAX_DEEP_INDENT_CONTINUATION_LINES) {
1098
- questionEndIndex = i;
1099
- break;
1100
- }
1101
- continue;
1102
- }
1103
- // [MF-001 / Issue #256] Check if line is a question-like line BEFORE
1104
- // continuation check. This preserves isContinuationLine()'s SRP by not
1105
- // mixing question detection into it. Without this pre-check, indented
1106
- // question lines (e.g., " Select model") could be misclassified as
1107
- // continuation lines by isContinuationLine()'s hasLeadingSpaces check.
1108
- //
1109
- // [SF-S4-003] Both this pre-check and SEC-001b upward scan use the same
1110
- // isQuestionLikeLine() function intentionally (DRY). If a question line is
1111
- // caught here, SEC-001b upward scan is not needed (questionEndIndex line
1112
- // itself passes isQuestionLikeLine()).
1113
- if (isQuestionLikeLine(line)) {
1114
- questionEndIndex = i;
1101
+ if (state.collectedOptions.length > 0 && line && !prompt_detect_multiple_choice_approval_context_1.SEPARATOR_LINE_PATTERN.test(line)) {
1102
+ if (scanNonOptionLine(state, rawLine, line, i) === 'break') {
1115
1103
  break;
1116
1104
  }
1117
- // Check if this is a continuation line (indented line between options,
1118
- // or path/filename fragments from terminal width wrapping - Issue #181)
1119
- if (isContinuationLine(rawLine, line)) {
1120
- continuationLineCount++;
1121
- const maxContinuationLines = /^\s{4,}/.test(rawLine)
1122
- ? MAX_DEEP_INDENT_CONTINUATION_LINES
1123
- : MAX_CONTINUATION_LINES;
1124
- // Issue #372: Codex TUI indents all output with 2 spaces, causing
1125
- // every line to match isContinuationLine(). Limit the scan distance
1126
- // to prevent traversing into body text where numbered lists would be
1127
- // collected as false options.
1128
- if (continuationLineCount > maxContinuationLines) {
1129
- questionEndIndex = i;
1130
- break;
1131
- }
1132
- // Skip continuation lines and continue scanning for more options
1133
- continue;
1134
- }
1135
- // Found a non-empty, non-separator line before options - likely the question
1136
- questionEndIndex = i;
1137
- break;
1138
1105
  }
1139
1106
  }
1107
+ return {
1108
+ collectedOptions: state.collectedOptions,
1109
+ optionRows: state.optionRows,
1110
+ questionEndIndex: state.questionEndIndex,
1111
+ };
1112
+ }
1113
+ /** Rows the reverse scan skips as metadata without ending the scan. */
1114
+ function isMetadataRow(state, rawLine, line, paneCut) {
1115
+ // [Issue #2486] See PANE_WRAPPED_LABEL_PATTERN: the tail of the label above.
1116
+ if (paneCut !== undefined && PANE_WRAPPED_LABEL_PATTERN.test(rawLine)) {
1117
+ state.paneWrap.unshift(line);
1118
+ state.continuationLineCount++;
1119
+ return true;
1120
+ }
1121
+ // Collapsed preview markers like "[… 12 lines] ctrl + a view all" are
1122
+ // metadata, not selectable options. Skip them before option parsing to
1123
+ // avoid misclassifying "12" as an option number.
1124
+ if (COLLAPSED_OUTPUT_PATTERN.test(line)) {
1125
+ state.continuationLineCount++;
1126
+ return true;
1127
+ }
1128
+ // [Issue #704] Claude v2.1.142 renders summary lines like "… +1 pending"
1129
+ // BELOW the real options. Without this guard, NORMAL_OPTION_PATTERN below
1130
+ // would match the summary line as `option N / label='pending'`, which
1131
+ // would then poison isValidPrecedingOption() and cause every real option
1132
+ // above (1./2./3.) to be rejected — resulting in collectedOptions.length<2
1133
+ // and a spurious no_prompt verdict. Treat the summary line as metadata
1134
+ // (same continuation handling as COLLAPSED_OUTPUT_PATTERN above) so the
1135
+ // reverse scan continues into the actual option block.
1136
+ //
1137
+ // Defense-in-depth: works alongside the S2 effectiveEnd trim above. Either
1138
+ // S1 or S2 alone is sufficient to fix Issue #704; keeping both protects
1139
+ // against future Claude renderings where the footer line text changes
1140
+ // (S1 still catches) or the summary line wording changes (S2 still
1141
+ // catches via footer trim).
1142
+ if (SUMMARY_LINE_PATTERN.test(line)) {
1143
+ state.continuationLineCount++;
1144
+ return true;
1145
+ }
1146
+ return false;
1147
+ }
1148
+ /** Collects the row as an option when either option pattern accepts it. */
1149
+ function tryCollectOption(state, rawLine, line, paneCut) {
1150
+ // Try DEFAULT_OPTION_PATTERN first (❯ indicator)
1151
+ const defaultMatch = line.match(DEFAULT_OPTION_PATTERN);
1152
+ if (defaultMatch) {
1153
+ const number = parseInt(defaultMatch[1], 10);
1154
+ if (number <= 20 && isValidPrecedingOption(number, state.collectedOptions)) {
1155
+ // [Issue #2486] A label that wrapped beside a preview pane is whole again.
1156
+ collectOption(state, rawLine, number, defaultMatch[2], true, paneCut);
1157
+ return true;
1158
+ }
1159
+ }
1160
+ // Try NORMAL_OPTION_PATTERN (no ❯ indicator)
1161
+ const normalMatch = line.match(NORMAL_OPTION_PATTERN);
1162
+ if (normalMatch) {
1163
+ const number = parseInt(normalMatch[1], 10);
1164
+ // Skip unreasonably large option numbers (e.g., "[… 373 lines]" from Codex
1165
+ // collapsed output matches as option 373). CLI prompts never exceed 20 options.
1166
+ if (number > 20) {
1167
+ // Treat as non-option line
1168
+ }
1169
+ else if (!isValidPrecedingOption(number, state.collectedOptions)) {
1170
+ // Treat as non-option line (e.g., diff line numbers from Codex approval prompts)
1171
+ }
1172
+ else {
1173
+ collectOption(state, rawLine, number, normalMatch[2], false, paneCut);
1174
+ return true;
1175
+ }
1176
+ }
1177
+ return false;
1178
+ }
1179
+ function collectOption(state, rawLine, number, matchedLabel, isDefault, paneCut) {
1180
+ const label = [matchedLabel.trim(), ...state.paneWrap].join(' ');
1181
+ state.optionRows.unshift({ row: rawLine, besidePane: paneCut !== undefined || state.paneWrap.length > 0, rowsBelow: state.rowsBelow });
1182
+ state.rowsBelow = [];
1183
+ state.paneWrap = [];
1184
+ state.collectedOptions.unshift({ number, label, isDefault });
1185
+ state.continuationLineCount = 0;
1186
+ }
1187
+ /** A non-empty, non-separator, non-option row above collected options. */
1188
+ function scanNonOptionLine(state, rawLine, line, i) {
1189
+ // [Issue #460] For deeply indented lines (4+ leading spaces), check
1190
+ // continuation BEFORE question keywords. These are option description
1191
+ // lines (e.g., " Let Gemini CLI decide the best model...") that may
1192
+ // contain keywords like "decide" or "select" but are NOT question lines.
1193
+ // The 2-space " Select model" case (Issue #256) is excluded by the 4+ threshold.
1194
+ const isDeepIndent = /^\s{4,}/.test(rawLine);
1195
+ if (isDeepIndent && isContinuationLine(rawLine, line)) {
1196
+ state.rowsBelow.unshift(rawLine);
1197
+ state.continuationLineCount++;
1198
+ if (state.continuationLineCount > MAX_DEEP_INDENT_CONTINUATION_LINES) {
1199
+ state.questionEndIndex = i;
1200
+ return 'break';
1201
+ }
1202
+ return 'continue';
1203
+ }
1204
+ // [MF-001 / Issue #256] Check if line is a question-like line BEFORE
1205
+ // continuation check. This preserves isContinuationLine()'s SRP by not
1206
+ // mixing question detection into it. Without this pre-check, indented
1207
+ // question lines (e.g., " Select model") could be misclassified as
1208
+ // continuation lines by isContinuationLine()'s hasLeadingSpaces check.
1209
+ //
1210
+ // [SF-S4-003] Both this pre-check and SEC-001b upward scan use the same
1211
+ // isQuestionLikeLine() function intentionally (DRY). If a question line is
1212
+ // caught here, SEC-001b upward scan is not needed (questionEndIndex line
1213
+ // itself passes isQuestionLikeLine()).
1214
+ if (isQuestionLikeLine(line)) {
1215
+ state.questionEndIndex = i;
1216
+ return 'break';
1217
+ }
1218
+ // Check if this is a continuation line (indented line between options,
1219
+ // or path/filename fragments from terminal width wrapping - Issue #181)
1220
+ if (isContinuationLine(rawLine, line)) {
1221
+ state.rowsBelow.unshift(rawLine);
1222
+ state.continuationLineCount++;
1223
+ const maxContinuationLines = /^\s{4,}/.test(rawLine)
1224
+ ? MAX_DEEP_INDENT_CONTINUATION_LINES
1225
+ : MAX_CONTINUATION_LINES;
1226
+ // Issue #372: Codex TUI indents all output with 2 spaces, causing
1227
+ // every line to match isContinuationLine(). Limit the scan distance
1228
+ // to prevent traversing into body text where numbered lists would be
1229
+ // collected as false options.
1230
+ if (state.continuationLineCount > maxContinuationLines) {
1231
+ state.questionEndIndex = i;
1232
+ return 'break';
1233
+ }
1234
+ // Skip continuation lines and continue scanning for more options
1235
+ return 'continue';
1236
+ }
1237
+ // Found a non-empty, non-separator line before options - likely the question
1238
+ state.questionEndIndex = i;
1239
+ return 'break';
1240
+ }
1241
+ /** Layers 3–5: whether the collected options make a prompt. */
1242
+ function passesOptionValidation(collectedOptions, requireDefault, hasConfirmationFooter, questionEndIndex, lines, scanStart) {
1140
1243
  // Layer 3: Consecutive number validation (defensive measure)
1141
1244
  const optionNumbers = collectedOptions.map(opt => opt.number);
1142
1245
  if (!isConsecutiveFromOne(optionNumbers)) {
1143
- return noPromptResult(output);
1246
+ return false;
1144
1247
  }
1145
1248
  // Layer 4: Must have at least 2 options. When requireDefault is true,
1146
1249
  // also require at least one option with ❯ indicator.
1147
1250
  const hasDefaultIndicator = collectedOptions.some(opt => opt.isDefault);
1148
1251
  const allowMissingDefaultIndicator = requireDefault && hasConfirmationFooter;
1149
1252
  if (collectedOptions.length < 2 || (requireDefault && !hasDefaultIndicator && !allowMissingDefaultIndicator)) {
1150
- return noPromptResult(output);
1253
+ return false;
1151
1254
  }
1152
1255
  // Layer 5 [SEC-001]: Enhanced question line validation for requireDefaultIndicator=false.
1153
1256
  // When requireDefault is false, apply stricter validation to prevent false positives
@@ -1162,46 +1265,71 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
1162
1265
  // (「実装方針を選んでください」) be detected. Indicator-less frames (#193 capture
1163
1266
  // artifacts) still go through SEC-001a/b unchanged.
1164
1267
  if (!requireDefault && !hasDefaultIndicator) {
1165
- // SEC-001a: No question line found (questionEndIndex === -1) - reject.
1166
- // Prevents generic question fallback from triggering Auto-Yes
1167
- // on plain numbered lists that happen to be consecutive from 1.
1168
- if (questionEndIndex === -1) {
1169
- return noPromptResult(output);
1170
- }
1171
- // SEC-001b: Question line exists but is not actually a question/selection request.
1172
- // Validates that the question line contains a question mark or a selection keyword
1173
- // with colon, distinguishing "Select an option:" from "Recommendations:".
1174
- //
1175
- // [Issue #256] Enhanced with upward scan via findQuestionLineInRange() (SF-003).
1176
- // When questionEndIndex line itself is not a question-like line, scan upward
1177
- // within QUESTION_SCAN_RANGE to find a question line above it. This handles:
1178
- // - Multi-line question wrapping where ? is on a line above questionEndIndex
1179
- // - Model selection prompts where "Select model" is above description lines
1180
- const questionLine = lines[questionEndIndex]?.trim() ?? '';
1181
- if (!isQuestionLikeLine(questionLine)) {
1182
- // Upward scan: look for a question-like line above questionEndIndex
1183
- if (!findQuestionLineInRange(lines, questionEndIndex, QUESTION_SCAN_RANGE, scanStart)) {
1184
- return noPromptResult(output);
1185
- }
1268
+ return passesQuestionLineValidation(questionEndIndex, lines, scanStart);
1269
+ }
1270
+ return true;
1271
+ }
1272
+ function passesQuestionLineValidation(questionEndIndex, lines, scanStart) {
1273
+ // SEC-001a: No question line found (questionEndIndex === -1) - reject.
1274
+ // Prevents generic question fallback from triggering Auto-Yes
1275
+ // on plain numbered lists that happen to be consecutive from 1.
1276
+ if (questionEndIndex === -1) {
1277
+ return false;
1278
+ }
1279
+ // SEC-001b: Question line exists but is not actually a question/selection request.
1280
+ // Validates that the question line contains a question mark or a selection keyword
1281
+ // with colon, distinguishing "Select an option:" from "Recommendations:".
1282
+ //
1283
+ // [Issue #256] Enhanced with upward scan via findQuestionLineInRange() (SF-003).
1284
+ // When questionEndIndex line itself is not a question-like line, scan upward
1285
+ // within QUESTION_SCAN_RANGE to find a question line above it. This handles:
1286
+ // - Multi-line question wrapping where ? is on a line above questionEndIndex
1287
+ // - Model selection prompts where "Select model" is above description lines
1288
+ const questionLine = lines[questionEndIndex]?.trim() ?? '';
1289
+ if (!isQuestionLikeLine(questionLine)) {
1290
+ // Upward scan: look for a question-like line above questionEndIndex
1291
+ if (!findQuestionLineInRange(lines, questionEndIndex, QUESTION_SCAN_RANGE, scanStart)) {
1292
+ return false;
1186
1293
  }
1187
1294
  }
1188
- // [Issue #2486] An AskUserQuestion picker's tab row is the dialog's top edge:
1189
- // the row is chrome and everything above it is transcript. Found once so
1190
- // `question` and `approvalTarget` start at the same row; 0 on a frame with no
1191
- // tab row, which leaves every other prompt exactly as it was. `instructionText`
1192
- // keeps its wide window — it is the human's view, and on a preview picker the
1193
- // pane it carries is what the question asks the human to look at.
1194
- const pickerTop = questionEndIndex < 0
1195
- ? 0
1196
- : (0, picker_chrome_1.findAskUserQuestionTabRow)(lines, questionEndIndex, exports.APPROVAL_TARGET_MAX_LOOKBACK) + 1;
1197
- const question = extractQuestionText(lines, questionEndIndex, pickerTop);
1198
- const instructionText = extractInstructionText(lines, questionEndIndex, effectiveEnd);
1199
- // Issue #1699: the same block, cut at the previous turn's boundary. Display
1200
- // keeps the wide window; deny patterns are judged against this one.
1201
- const approvalTarget = extractApprovalTarget(lines, questionEndIndex, effectiveEnd, pickerTop);
1202
- // Issue #616: Determine submitMode from confirmation footer (detected in single-pass above)
1203
- const submitMode = hasConfirmationFooter
1204
- ? (hasNumberFooter ? 'answer_only' : 'answer_then_enter')
1205
- : undefined;
1206
- return buildMultipleChoiceResult(question, collectedOptions, { instructionText, approvalTarget }, output, truncateRawContentFn, submitMode, hasAskUserQuestionFooter);
1295
+ return true;
1296
+ }
1297
+ /**
1298
+ * [Issue #3863] What an AskUserQuestion option's title says about being
1299
+ * recommended (`option-recommendation`).
1300
+ *
1301
+ * The picker draws a title row and its description indented under it; a title
1302
+ * too long for the pane wraps to the same indent, so the rows alone do not
1303
+ * say which they are. Read:
1304
+ *
1305
+ * - no row under it: the label is the title;
1306
+ * - beside a preview pane (#2486), where the column draws no descriptions:
1307
+ * the label — its wrapped rows already joined — is the title, as long as no
1308
+ * other row is under it;
1309
+ * - the row under it could not be the title's wrap (its first word would have
1310
+ * fit on the option row, `cannotBeWrapOf`): the label is the title;
1311
+ * - the row under it may be the wrap and holds nothing but a marker: the title
1312
+ * wrapped right before its marker — and ends there only if nothing after
1313
+ * the marker continues it: no further row, or a row that could not be the
1314
+ * marker row's wrap (its first word would have fit after the marker). A row
1315
+ * that may still be the title wrapping on (a word too long to fit after the
1316
+ * marker) leaves the title's end, and so the marker's place, unknown;
1317
+ * - otherwise `unknown`.
1318
+ */
1319
+ function readPickerOptionRecommendation(label, reading, paneColumns) {
1320
+ if (reading === undefined)
1321
+ return 'unknown';
1322
+ const [next] = reading.rowsBelow;
1323
+ if (next === undefined)
1324
+ return (0, option_recommendation_1.isRecommendedTitle)(label);
1325
+ if (reading.besidePane)
1326
+ return 'unknown';
1327
+ if ((0, option_recommendation_1.cannotBeWrapOf)(reading.row, next, paneColumns))
1328
+ return (0, option_recommendation_1.isRecommendedTitle)(label);
1329
+ if (!(0, option_recommendation_1.isRecommendationMarker)(next))
1330
+ return 'unknown';
1331
+ const after = reading.rowsBelow[1];
1332
+ if (after === undefined || (0, option_recommendation_1.cannotBeWrapOf)(next, after, paneColumns))
1333
+ return true;
1334
+ return 'unknown';
1207
1335
  }