commandmate 0.47.2 → 0.49.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 (434) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +180 -180
  3. package/.next/app-path-routes-manifest.json +30 -30
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route.js +3 -3
  12. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  27. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  28. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  30. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  31. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/escalation/route.js +1 -1
  38. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/vapid/route.js +1 -1
  41. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  44. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/relays/route.js +1 -1
  46. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  47. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  51. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/repositories/clone/route.js +1 -1
  54. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  55. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/restore/route.js +1 -1
  58. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  59. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/route.js +1 -1
  61. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  62. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/scan/route.js +1 -1
  64. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  65. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/sync/route.js +1 -1
  67. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  71. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  72. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  89. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  92. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  95. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  101. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  104. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  135. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  138. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  141. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  157. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  191. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/route.js +1 -1
  212. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  218. package/.next/server/app/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/sessions/page.js +1 -1
  223. package/.next/server/app/sessions/page.js.nft.json +1 -1
  224. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  225. package/.next/server/app/skills/[skillId]/page.js +1 -1
  226. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  227. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  230. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  231. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  232. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  233. package/.next/server/app/worktrees/[id]/page.js +12 -12
  234. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  235. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app-paths-manifest.json +30 -30
  238. package/.next/server/chunks/1191.js +11 -4
  239. package/.next/server/chunks/1501.js +1 -1
  240. package/.next/server/chunks/1601.js +2 -2
  241. package/.next/server/chunks/1656.js +2 -2
  242. package/.next/server/chunks/1945.js +3 -3
  243. package/.next/server/chunks/1990.js +103 -0
  244. package/.next/server/chunks/2069.js +1 -0
  245. package/.next/server/chunks/2119.js +1 -1
  246. package/.next/server/chunks/2404.js +1 -1
  247. package/.next/server/chunks/2422.js +1 -1
  248. package/.next/server/chunks/2445.js +1 -1
  249. package/.next/server/chunks/2534.js +1 -1
  250. package/.next/server/chunks/255.js +1 -1
  251. package/.next/server/chunks/3241.js +1 -1
  252. package/.next/server/chunks/3505.js +2 -2
  253. package/.next/server/chunks/4243.js +1 -1
  254. package/.next/server/chunks/4248.js +1 -1
  255. package/.next/server/chunks/4280.js +1 -0
  256. package/.next/server/chunks/5209.js +1 -1
  257. package/.next/server/chunks/6119.js +1 -1
  258. package/.next/server/chunks/6130.js +1 -1
  259. package/.next/server/chunks/6401.js +1 -1
  260. package/.next/server/chunks/6486.js +9 -8
  261. package/.next/server/chunks/6781.js +1 -1
  262. package/.next/server/chunks/720.js +103 -0
  263. package/.next/server/chunks/7604.js +2 -0
  264. package/.next/server/chunks/7905.js +1 -1
  265. package/.next/server/chunks/8581.js +8 -8
  266. package/.next/server/chunks/8728.js +3 -3
  267. package/.next/server/chunks/8791.js +1 -1
  268. package/.next/server/chunks/8807.js +19 -18
  269. package/.next/server/chunks/8918.js +2 -104
  270. package/.next/server/chunks/936.js +1 -1
  271. package/.next/server/chunks/9390.js +1 -1
  272. package/.next/server/chunks/9540.js +1 -1
  273. package/.next/server/chunks/9627.js +5 -5
  274. package/.next/server/chunks/9731.js +2 -2
  275. package/.next/server/middleware-manifest.json +5 -5
  276. package/.next/server/pages/500.html +1 -1
  277. package/.next/server/server-reference-manifest.json +1 -1
  278. package/.next/static/chunks/1128-914c559913546bbc.js +1 -0
  279. package/.next/static/chunks/{2407-a6533805a86d05bd.js → 2407-ab92ae9837c39dce.js} +1 -1
  280. package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-7173dc305dffc4f6.js} +1 -1
  281. package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
  282. package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
  283. package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
  284. package/.next/static/chunks/9079-987939d231704218.js +1 -0
  285. package/.next/static/chunks/app/{layout-538d8d2746ad1588.js → layout-aa8e66164a4367af.js} +1 -1
  286. package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +1 -0
  287. package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
  288. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
  289. package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +1 -0
  290. package/.next/static/css/{743f79ff19ab91e9.css → db8959555c3d9c96.css} +1 -1
  291. package/.next/trace +13 -13
  292. package/dist/cli/commands/auto-yes.d.ts +24 -0
  293. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  294. package/dist/cli/commands/auto-yes.js +76 -8
  295. package/dist/cli/commands/capture.d.ts.map +1 -1
  296. package/dist/cli/commands/capture.js +5 -0
  297. package/dist/cli/commands/instances.d.ts.map +1 -1
  298. package/dist/cli/commands/instances.js +10 -1
  299. package/dist/cli/commands/prompt.d.ts.map +1 -1
  300. package/dist/cli/commands/prompt.js +5 -3
  301. package/dist/cli/commands/send.d.ts.map +1 -1
  302. package/dist/cli/commands/send.js +19 -6
  303. package/dist/cli/commands/verify.d.ts.map +1 -1
  304. package/dist/cli/commands/verify.js +8 -1
  305. package/dist/cli/commands/wait.d.ts.map +1 -1
  306. package/dist/cli/commands/wait.js +101 -13
  307. package/dist/cli/config/duration-constants.d.ts +16 -13
  308. package/dist/cli/config/duration-constants.d.ts.map +1 -1
  309. package/dist/cli/config/duration-constants.js +21 -21
  310. package/dist/cli/docs/agent-operations.d.ts +2 -2
  311. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  312. package/dist/cli/docs/agent-operations.js +29 -1
  313. package/dist/cli/types/api-responses.d.ts +145 -3
  314. package/dist/cli/types/api-responses.d.ts.map +1 -1
  315. package/dist/cli/types/index.d.ts +4 -0
  316. package/dist/cli/types/index.d.ts.map +1 -1
  317. package/dist/cli/utils/resource-resolvers.d.ts +0 -18
  318. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
  319. package/dist/cli/utils/resource-resolvers.js +1 -51
  320. package/dist/cli/utils/verify-runner.d.ts +24 -1
  321. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  322. package/dist/cli/utils/verify-runner.js +54 -1
  323. package/dist/config/auto-yes-duration.d.ts +56 -0
  324. package/dist/config/auto-yes-duration.d.ts.map +1 -0
  325. package/dist/config/auto-yes-duration.js +76 -0
  326. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +54 -2
  327. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  328. package/dist/lib/polling/auto-yes-suppression-reason.js +33 -2
  329. package/dist/lib/prompt-observation/types.d.ts +13 -0
  330. package/dist/lib/prompt-observation/types.d.ts.map +1 -1
  331. package/dist/server/locales/en/worktree.json +2 -1
  332. package/dist/server/locales/ja/worktree.json +2 -1
  333. package/dist/server/src/config/auto-yes-config.js +14 -19
  334. package/dist/server/src/config/auto-yes-duration.js +76 -0
  335. package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
  336. package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
  337. package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
  338. package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
  339. package/dist/server/src/lib/auto-yes-poller.js +337 -376
  340. package/dist/server/src/lib/auto-yes-state.js +59 -4
  341. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +235 -19
  342. package/dist/server/src/lib/db/chat-db.js +5 -1
  343. package/dist/server/src/lib/db/verification-db.js +23 -2
  344. package/dist/server/src/lib/detection/composer-text.js +215 -11
  345. package/dist/server/src/lib/detection/option-recommendation.js +120 -0
  346. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
  347. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
  348. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +402 -539
  349. package/dist/server/src/lib/detection/prompt-detector.js +92 -21
  350. package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
  351. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
  352. package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
  353. package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
  354. package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
  355. package/dist/server/src/lib/detection/upstream-faults.js +19 -2
  356. package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
  357. package/dist/server/src/lib/hooks/permission-decision-service.js +7 -0
  358. package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
  359. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
  360. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +3 -0
  361. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +34 -3
  362. package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
  363. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
  364. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
  365. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +124 -0
  366. package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
  367. package/dist/server/src/lib/polling/auto-yes-policy.js +11 -5
  368. package/dist/server/src/lib/polling/auto-yes-poller-capture.js +15 -2
  369. package/dist/server/src/lib/polling/auto-yes-poller-generation.js +42 -1
  370. package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +42 -5
  371. package/dist/server/src/lib/polling/auto-yes-poller-state.js +147 -49
  372. package/dist/server/src/lib/polling/auto-yes-poller-steps.js +172 -2
  373. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +2 -2
  374. package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
  375. package/dist/server/src/lib/polling/auto-yes-resolver.js +96 -21
  376. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +33 -2
  377. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
  378. package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
  379. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
  380. package/dist/server/src/lib/polling/response-checker.js +145 -58
  381. package/dist/server/src/lib/prompt-answer-sender.js +104 -10
  382. package/dist/server/src/lib/push/notification-dedup.js +15 -2
  383. package/dist/server/src/lib/push/prompt-card-state.js +140 -19
  384. package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
  385. package/dist/server/src/lib/push/push-sender.js +23 -3
  386. package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
  387. package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
  388. package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
  389. package/dist/server/src/lib/session/agent-event-state.js +25 -5
  390. package/dist/server/src/lib/session/agent-event-turn.js +140 -46
  391. package/dist/server/src/lib/session/cli-session.js +21 -2
  392. package/dist/server/src/lib/session/composer-clear.js +56 -4
  393. package/dist/server/src/lib/session/current-output-builder.js +66 -12
  394. package/dist/server/src/lib/session/send-attempt-state.js +24 -7
  395. package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
  396. package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
  397. package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
  398. package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
  399. package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
  400. package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
  401. package/dist/server/src/lib/session/waiting-episode-state.js +68 -91
  402. package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
  403. package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
  404. package/dist/server/src/lib/tmux/tmux.js +79 -9
  405. package/dist/server/src/lib/verification/gate-runner.js +172 -16
  406. package/dist/server/src/lib/verification/machine-lock.js +5 -0
  407. package/dist/server/src/lib/ws-server.js +18 -3
  408. package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
  409. package/dist/server/src/types/auto-yes-decision.js +61 -0
  410. package/dist/server/src/types/auto-yes.js +6 -0
  411. package/dist/server/src/types/prompt-reading.js +32 -0
  412. package/dist/types/auto-yes-answer-mode.d.ts +35 -0
  413. package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
  414. package/dist/types/auto-yes-answer-mode.js +38 -0
  415. package/docs/en/user-guide/webapp-guide.md +47 -13
  416. package/package.json +1 -1
  417. package/public/sw.js +76 -4
  418. package/release-notes/0.48.0.json +57 -0
  419. package/release-notes/0.49.0.json +45 -0
  420. package/.next/server/chunks/1559.js +0 -2
  421. package/.next/server/chunks/2460.js +0 -1
  422. package/.next/server/chunks/5595.js +0 -1
  423. package/.next/server/chunks/610.js +0 -1
  424. package/.next/server/chunks/6722.js +0 -1
  425. package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
  426. package/.next/static/chunks/602-1c1488959215e140.js +0 -1
  427. package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
  428. package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
  429. package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
  430. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
  431. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
  432. package/.next/static/chunks/app/worktrees/[id]/page-46aced20b2b1c010.js +0 -1
  433. /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_buildManifest.js +0 -0
  434. /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_ssgManifest.js +0 -0
@@ -0,0 +1,290 @@
1
+ "use strict";
2
+ /** Approval-context boundary logic split out of prompt-detect-multiple-choice.ts (Issue #3866). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.APPROVAL_TARGET_MAX_LOOKBACK = exports.SEPARATOR_LINE_PATTERN = void 0;
5
+ exports.indentOf = indentOf;
6
+ exports.panelFrameIndent = panelFrameIndent;
7
+ exports.findApprovalContextStart = findApprovalContextStart;
8
+ exports.findApprovalContextRange = findApprovalContextRange;
9
+ exports.findYesNoApprovalContextRange = findYesNoApprovalContextRange;
10
+ exports.joinApprovalTarget = joinApprovalTarget;
11
+ /**
12
+ * Pattern for separator lines (horizontal rules).
13
+ * Matches lines consisting only of dash (-) or em-dash (─) characters.
14
+ * Used to skip separator lines in question extraction and non-option line handling.
15
+ * Anchored at both ends -- ReDoS safe (S4-001).
16
+ */
17
+ exports.SEPARATOR_LINE_PATTERN = /^[-─]+$/;
18
+ /**
19
+ * Lines that mean "the previous turn ended here" when scanning upward.
20
+ *
21
+ * Every supported CLI renders its transcript as marker-prefixed rows — Claude's
22
+ * tool-use `⏺` and result `⎿`, Codex's activity `•`, its approval receipts `✔`
23
+ * / `✗`, the user's own `›` / `❯` / `>` echo, and its output continuation `└`.
24
+ * The lines a prompt panel puts above its question (a header such as "Bash
25
+ * command", the command itself, a one-line description) never carry one, which
26
+ * is what makes this usable as the panel's upper edge after `stripBoxDrawing`
27
+ * has erased the real box border.
28
+ *
29
+ * Horizontal rules count too: Codex draws one between turns.
30
+ *
31
+ * [Issue #3817] Not inside the panel's own frame: the command a panel shows can
32
+ * carry the same glyphs (a here-document's `> quoted` rows), drawn deeper than
33
+ * the panel's header, question and option rows. See
34
+ * {@link findApprovalContextStart}.
35
+ *
36
+ * Anchored at the start of the trimmed line — ReDoS safe (no repetition).
37
+ */
38
+ const TURN_BOUNDARY_PATTERN = /^[⏺⎿●○•✔✓✖✗✘›»❯└├>]/;
39
+ /**
40
+ * How far above the question the approval context may reach (Issue #1699).
41
+ *
42
+ * The boundary marker above is the actual fix; this cap only exists so a frame
43
+ * that happens to contain no marker at all (a bare shell `(y/n)` prompt under
44
+ * plain command output) cannot drag an unbounded scrollback window into the
45
+ * deny surface the way the old fixed 19-line lookback did. Sized for the
46
+ * tallest real permission panel measured: header + blank + a wrapped multi-line
47
+ * command + description + blank.
48
+ */
49
+ exports.APPROVAL_TARGET_MAX_LOOKBACK = 12;
50
+ /**
51
+ * A previous tool call's result row (Issue #3817): claude's `⎿`, codex's `└` /
52
+ * `├` output continuation. Never the user's echo or a quote (`>`).
53
+ */
54
+ const RESULT_MARKER_PATTERN = /^[⎿└├]/;
55
+ /** Width of a row's leading whitespace. */
56
+ function indentOf(line) {
57
+ return line.length - line.trimStart().length;
58
+ }
59
+ /**
60
+ * The column the dialog's own frame is drawn at (Issue #3817): the least
61
+ * indented non-blank row from the question down to `panelEnd`. Those rows are
62
+ * the question, the option block and the footer — claude puts them at column 1
63
+ * and the command at column 3, codex its `› 1.` cursor at column 0.
64
+ */
65
+ function panelFrameIndent(lines, questionLineIndex, panelEnd) {
66
+ let indent = Infinity;
67
+ for (let i = questionLineIndex; i < Math.min(panelEnd, lines.length); i++) {
68
+ const line = lines[i];
69
+ if (line === undefined || line.trim() === '')
70
+ continue;
71
+ indent = Math.min(indent, indentOf(line));
72
+ }
73
+ return indent === Infinity ? 0 : indent;
74
+ }
75
+ /** True when this line carries a transcript marker or is a rule. */
76
+ function isTurnBoundaryLine(rawLine) {
77
+ if (rawLine === undefined)
78
+ return false;
79
+ const line = rawLine.trim();
80
+ if (line === '')
81
+ return false;
82
+ return TURN_BOUNDARY_PATTERN.test(line) || exports.SEPARATOR_LINE_PATTERN.test(line);
83
+ }
84
+ /**
85
+ * First line index that still belongs to *this* prompt, scanning upward.
86
+ *
87
+ * Walks up from `questionLineIndex - 1` and stops just below the nearest turn
88
+ * boundary; with no boundary in reach it falls back to the lookback cap.
89
+ * Everything above the returned index is a previous turn and must never reach a
90
+ * deny pattern — that poisoning is Issue #1699.
91
+ *
92
+ * [Issue #3817] A marker row indented deeper than the dialog's frame
93
+ * ({@link panelFrameIndent}) is the body of the command the panel asks about
94
+ * when a frame row sits above it — the `> quoted` rows of a here-document
95
+ * under a claude panel's ` Bash command` header. Cutting there took the command
96
+ * rows above it out of the deny surface. The previous turn's markers are drawn
97
+ * at or left of the frame (`⏺`, the user's `> msg` / `❯ msg` echo, a rule), or
98
+ * deeper with no frame row above them (claude's ` ⎿` result right under its
99
+ * `⏺`), and both still end the scan.
100
+ *
101
+ * A frame row cannot be told from a body row drawn at the frame's column (a
102
+ * shell here-document's `EOF`), so a frame row is taken as an older panel's
103
+ * header only in one shape: a tool-use block — a marker row at the frame's
104
+ * column, then that row, then deeper rows that are all result markers
105
+ * ({@link RESULT_MARKER_PATTERN}). Anything else between two frame rows is read
106
+ * as body: when the screen cannot tell, the deny surface is taken wide.
107
+ *
108
+ * [Issue #3832] That shape also needs the older header to be one the current
109
+ * panel draws below it (agy's `Command` above ` ⎿ User declined the tool
110
+ * call` above its current `Command`). A body can take the shape too — a
111
+ * 0-column command whose output is an indented `└──` tree, under a `●` row —
112
+ * and cutting there dropped the command from the deny surface. A body that
113
+ * repeats the current header word for word is still cut; the screen cannot
114
+ * tell that one apart.
115
+ *
116
+ * Known limits, measured absent on the claude / codex / agy / copilot /
117
+ * opencode fixtures and the production log (Issue #3832) and left alone:
118
+ * - An older block's result with a row that is not a result marker (an
119
+ * unmarked continuation ` b` under ` ⎿ a`) under a header the current
120
+ * panel repeats is read as body: the previous turn enters the deny surface
121
+ * (over-suppresses).
122
+ * - A body row carrying a marker at the frame's own column (a here-document's
123
+ * `> ` drawn at column 0 under a yes/no `(y/n)`) still ends the scan; the
124
+ * screen cannot tell it from the previous turn's echo. The command rows
125
+ * above the `> ` leave `approvalTarget`, and a yes/no `question` is the
126
+ * prompt line alone. Issue #3881 (the second half) no longer lets that be
127
+ * an answer: the yes/no path ({@link findYesNoApprovalContextRange}) reads
128
+ * a scan that stopped on a `>` row as `truncated`, so a deny miss withholds
129
+ * instead of passing. The boundary itself is left where it was.
130
+ * - agy's older panel under a header the current one does not draw is read as
131
+ * body (over-suppresses), as is the first limit above; both stay.
132
+ *
133
+ * Shared by both detector paths: multiple_choice passes its `questionEndIndex`,
134
+ * yes_no the line its pattern matched on.
135
+ *
136
+ * @param lines - Full frame, already ANSI/box stripped
137
+ * @param questionLineIndex - Line the prompt's own question sits on
138
+ * @param panelEnd - Exclusive end of the dialog's own rows (Issue #3817); their
139
+ * least indented row is the frame. Defaults to the question row alone.
140
+ * @returns Index of the first line of the current prompt's own block
141
+ */
142
+ function findApprovalContextStart(lines, questionLineIndex, panelEnd = questionLineIndex + 1) {
143
+ return findApprovalContextRange(lines, questionLineIndex, panelEnd).start;
144
+ }
145
+ /**
146
+ * Where {@link findApprovalContextStart} put the top of the approval context,
147
+ * and whether that top is a boundary (Issue #3881, H-3).
148
+ *
149
+ * The start index alone cannot say it. A scan that runs out at
150
+ * {@link APPROVAL_TARGET_MAX_LOOKBACK} returns the same kind of number as one
151
+ * that stopped at the previous turn's marker, and `joinApprovalTarget` turns
152
+ * either into an ordinary string — so a deny pattern whose only match is the
153
+ * 13th row above a yes/no question missed, and the resolver took the miss as
154
+ * a pass. The completeness travels with the start instead:
155
+ *
156
+ * - `complete` — the scan stopped at a boundary (a marker at the frame, an
157
+ * older tool-use block);
158
+ * - `truncated` — it ran out at the cap with a non-blank row still above it;
159
+ * - `top-unknown` — it reached the frame's first row without a boundary.
160
+ *
161
+ * A scan that ran out at the cap over blank rows only is `complete`: nothing
162
+ * above it could belong to the panel.
163
+ */
164
+ function findApprovalContextRange(lines, questionLineIndex, panelEnd = questionLineIndex + 1) {
165
+ const { start, completeness } = scanApprovalContext(lines, questionLineIndex, panelEnd);
166
+ return { start, completeness };
167
+ }
168
+ /** {@link findApprovalContextRange}, with the row the scan stopped on (Issue #3881). */
169
+ function scanApprovalContext(lines, questionLineIndex, panelEnd) {
170
+ const floor = Math.max(0, questionLineIndex - exports.APPROVAL_TARGET_MAX_LOOKBACK);
171
+ const frameIndent = panelFrameIndent(lines, questionLineIndex, panelEnd);
172
+ // The lowest deeper marker row with no frame row found above it yet.
173
+ let unenclosed = -1;
174
+ // The deeper rows since the last frame row: are they all result markers?
175
+ let segmentRows = 0;
176
+ let segmentAllResults = true;
177
+ // Frame rows already passed: the current panel's header among them.
178
+ const framesBelow = new Set();
179
+ for (let i = questionLineIndex - 1; i >= floor; i--) {
180
+ const line = lines[i];
181
+ if (line === undefined || line.trim() === '')
182
+ continue;
183
+ const atFrame = indentOf(line) <= frameIndent;
184
+ const marker = isTurnBoundaryLine(line);
185
+ if (marker && atFrame) {
186
+ return { start: (unenclosed >= 0 ? unenclosed : i) + 1, completeness: 'complete', cutFrom: i };
187
+ }
188
+ if (!atFrame) {
189
+ if (marker && unenclosed < 0)
190
+ unenclosed = i;
191
+ segmentRows++;
192
+ segmentAllResults &&= RESULT_MARKER_PATTERN.test(line.trim());
193
+ continue;
194
+ }
195
+ // A frame row: an older tool-use block's header only in that one shape,
196
+ // and only when the current panel draws the same header (Issue #3832).
197
+ const frameText = line.trim();
198
+ if (unenclosed >= 0 && segmentRows > 0 && segmentAllResults && framesBelow.has(frameText)
199
+ && isMarkerRowAtFrameAbove(lines, i, floor, frameIndent)) {
200
+ return { start: unenclosed + 1, completeness: 'complete', cutFrom: i };
201
+ }
202
+ framesBelow.add(frameText);
203
+ unenclosed = -1;
204
+ segmentRows = 0;
205
+ segmentAllResults = true;
206
+ }
207
+ return {
208
+ start: unenclosed >= 0 ? unenclosed + 1 : floor,
209
+ completeness: scanEndCompleteness(lines, floor),
210
+ cutFrom: floor,
211
+ };
212
+ }
213
+ /**
214
+ * A here-document's continuation rows, or a quotation: `>` at the start of a
215
+ * row is the one marker a shell's own output draws (PS2), so a scan that
216
+ * stops on it may have stopped inside the command (Issue #3881).
217
+ */
218
+ const AMBIGUOUS_BOUNDARY_PATTERN = /^>/;
219
+ /**
220
+ * {@link findApprovalContextRange} for a yes/no prompt (Issue #3881, the
221
+ * second half: limit 3 of #3832).
222
+ *
223
+ * A yes/no prompt has no panel of its own, so its frame is the prompt line's
224
+ * column, and a here-document's `> ` continuation rows drawn at that column
225
+ * end the scan exactly like the previous turn's `> msg` echo: the screen
226
+ * cannot tell the two apart. The same holds for a deeper `> ` row that set
227
+ * the start under a `●` boundary (a here-document indented under its command,
228
+ * review N2). Cut at such a row, the boundary is not known
229
+ * to be the previous turn's, so the target is `truncated` — not the whole
230
+ * request: a deny pattern that misses it withholds as `deny-pattern-unusable`
231
+ * rather than passing (the resolver's `approvalTargetCompleteness`). The
232
+ * boundary is not moved: widening the target past a real echo would put the
233
+ * previous turn's text on the deny surface (#1699).
234
+ *
235
+ * Multiple choice keeps {@link findApprovalContextRange}: its panels draw the
236
+ * command deeper than their frame (#3817), and claude's legacy `> msg` echo at
237
+ * the frame is a real boundary there.
238
+ */
239
+ function findYesNoApprovalContextRange(lines, promptLine, panelEnd) {
240
+ const { start, completeness, cutFrom } = scanApprovalContext(lines, promptLine, panelEnd);
241
+ // Review N2: every row that was cut, not only the row the scan stopped on —
242
+ // a deeper `> ` row (a here-document indented under its command) sets the
243
+ // start below the boundary, and the command above it is cut with it.
244
+ const cutByQuote = lines
245
+ .slice(cutFrom, start)
246
+ .some(row => row !== undefined && AMBIGUOUS_BOUNDARY_PATTERN.test(row.trim()));
247
+ // Review N4: whatever the scan's own end said. A scan that ran up to the
248
+ // frame's first row (`top-unknown`) still cut those rows inside the frame,
249
+ // and a capture known to start at the history's top would otherwise clear
250
+ // it (`withCaptureTopCompleteness` adds nothing to a `history-start`): the
251
+ // cut is a fact about rows on screen, not about the capture's top.
252
+ if (cutByQuote) {
253
+ return { start, completeness: 'truncated' };
254
+ }
255
+ return { start, completeness };
256
+ }
257
+ /** How complete a scan that ran down to `floor` without a boundary is (Issue #3881). */
258
+ function scanEndCompleteness(lines, floor) {
259
+ if (floor === 0)
260
+ return 'top-unknown';
261
+ for (let i = 0; i < floor; i++) {
262
+ const line = lines[i];
263
+ if (line !== undefined && line.trim() !== '')
264
+ return 'truncated';
265
+ }
266
+ return 'complete';
267
+ }
268
+ /** True when the nearest non-blank row above `row` is a marker row at the frame's column. */
269
+ function isMarkerRowAtFrameAbove(lines, row, floor, frameIndent) {
270
+ for (let i = row - 1; i >= floor; i--) {
271
+ const line = lines[i];
272
+ if (line === undefined || line.trim() === '')
273
+ continue;
274
+ return indentOf(line) <= frameIndent && isTurnBoundaryLine(line);
275
+ }
276
+ return false;
277
+ }
278
+ /**
279
+ * Join a slice of the frame into an approval-target string.
280
+ *
281
+ * @returns The trimmed block, or undefined when it is empty
282
+ */
283
+ function joinApprovalTarget(lines, start, end) {
284
+ const joined = lines
285
+ .slice(start, end)
286
+ .map(l => l.trimEnd())
287
+ .join('\n')
288
+ .trim();
289
+ return joined.length > 0 ? joined : undefined;
290
+ }
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ /** Claude chrome (task panel, session-diff HUD, preview pane) split out of prompt-detect-multiple-choice.ts (Issue #3924). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.SUMMARY_LINE_PATTERN = void 0;
5
+ exports.findClaudeTaskPanelLines = findClaudeTaskPanelLines;
6
+ exports.findClaudeChrome = findClaudeChrome;
7
+ exports.maskClaudeChrome = maskClaudeChrome;
8
+ const picker_chrome_1 = require("./tools/claude/picker-chrome");
9
+ /**
10
+ * [Issue #704] Pattern for Claude Code v2.1.142 prompt summary lines such as
11
+ * " … +1 pending"
12
+ * " +2 pending"
13
+ * " ↑3 more"
14
+ * " ↓1 more"
15
+ * These lines are rendered BELOW the real options when Claude collapses the
16
+ * remaining choices. They are not selectable options and must be skipped by
17
+ * Pass 2 — otherwise NORMAL_OPTION_PATTERN matches them as option N with
18
+ * label "pending"/"more", and the resulting (number, label) tuple poisons
19
+ * isValidPrecedingOption() so that the real 1./2./3. options above are all
20
+ * rejected (collectedOptions ends up with length 1 and Layer 4 returns
21
+ * no_prompt).
22
+ *
23
+ * Scope of the pattern (FP suppression is critical):
24
+ * - Anchored at line start (^) and requires the trailing keyword to be
25
+ * `pending` or `more` followed by a word boundary (\b). This intentionally
26
+ * prevents matching legitimate option labels that mention these words
27
+ * mid-sentence (e.g. `2. Postpone (will remain pending)`,
28
+ * `3. Show me more`) — those still flow through NORMAL_OPTION_PATTERN.
29
+ * - Optional leading ellipsis (… U+2026) and optional collapse direction
30
+ * marker (+ - ↑ ↓ ⏵ ⏷) accept the variants observed in the wild.
31
+ * - [Issue #1708] `completed` joined `pending`/`more` after a live capture
32
+ * (fixtures/claude-live-1708) showed the task panel collapsing FINISHED
33
+ * rows as `… +2 completed`. That wording was outside the #704 guard, so it
34
+ * reached Pass 2 and was collected as `option 2 / label='completed'` —
35
+ * poisoning isValidPrecedingOption() exactly as `… +1 pending` used to.
36
+ * - The pattern deliberately omits any free `(.+)` capture — it must
37
+ * short-circuit, not extract data.
38
+ *
39
+ * Pattern shape: linear regex with no nested quantifiers — ReDoS safe (S4-001).
40
+ */
41
+ exports.SUMMARY_LINE_PATTERN = /^\s*[…]?\s*[+\-↑↓⏵⏷]?\s*\d+\s+(?:pending|more|completed)\b/i;
42
+ /**
43
+ * [Issue #1708] Header row of Claude Code's bottom-anchored task panel, e.g.
44
+ * " 7 tasks (0 done, 1 in progress, 6 open)"
45
+ *
46
+ * The panel is an overlay pinned to the LAST rows of the pane, structurally
47
+ * unrelated to whatever the agent is currently blocked on. In a production pane
48
+ * (200x1000, alternate screen) a prompt dialog therefore renders near the top and
49
+ * the panel ~880 blank rows below it — rows `compactBlankRows` collapses to one,
50
+ * putting the panel squarely inside Pass 2's 50-line reverse-scan window.
51
+ *
52
+ * That is only harmless while something trims it away. #704/#807 trim at a
53
+ * footer, but the AskUserQuestion *confirmation* step ("Ready to submit your
54
+ * answers?") renders NEITHER footer, so nothing trims and the panel is the first
55
+ * thing the reverse scan meets. Measured on the live capture in
56
+ * fixtures/claude-live-1708/askuserquestion-submit-taskpanel.txt, two of its rows
57
+ * match NORMAL_OPTION_PATTERN independently:
58
+ * - this header → option 7, label "tasks (2 done, 1 in progress, 4 open)"
59
+ * - "… +2 completed" → option 2, label "completed"
60
+ * Either one alone is enough to make isValidPrecedingOption() reject the real
61
+ * `❯ 1. Submit answers` / `2. Cancel` above it, so collectedOptions never reaches
62
+ * 2 and the frame is published as "no prompt" — Issue #1708's silent timeout.
63
+ *
64
+ * Anchored at line start and requires the literal `tasks (` + `<n> done`, which
65
+ * no option label produced by any supported CLI carries. ReDoS safe (S4-001):
66
+ * bounded repetition, no nesting.
67
+ */
68
+ const CLAUDE_TASK_PANEL_HEADER_PATTERN = /^\s*\d{1,3}\s+tasks?\s+\(\d+\s+done\b/i;
69
+ /**
70
+ * [Issue #1708] A single task row of the panel described above, e.g. " ◼ Phase 3".
71
+ *
72
+ * Today these rows are inert — `isContinuationLine()` already absorbs them — but
73
+ * only because none of the observed titles begins with a digit. A title like
74
+ * "2. Fix the parser" would render as " ◻ 2. Fix the parser" and be collected as
75
+ * option 2, reintroducing the same poisoning from a direction no single-line
76
+ * guard anticipates. Skipping the whole panel block closes that off structurally
77
+ * instead of one wording at a time.
78
+ *
79
+ * The glyph set is exactly the two forms measured on a live pane — ◼ (in
80
+ * progress) and ◻ (open) — and nothing else. Every extra glyph is a line this
81
+ * guard can delete from the frame, so the set is an allowlist of things seen,
82
+ * not a guess at what the family might contain:
83
+ *
84
+ * - ❯ ● › are DEFAULT_OPTION_PATTERN's cursor indicators.
85
+ * - ⏺ ⎿ ✔ ✗ are the transcript markers TURN_BOUNDARY_PATTERN reads.
86
+ * - ☐ ☑ ☒ are the natural rendering of a MULTI-SELECT choice, and
87
+ * AskUserQuestion has a multiSelect mode. Measured: with those in the set,
88
+ * `☐ 1. Blue / ☑ 2. Green / ☐ 3. Red` under a panel header is claimed as
89
+ * panel content and the prompt above it disappears entirely
90
+ * (isPrompt=false, zero options) — Issue #1708's own failure, recreated by
91
+ * its fix. See the regression test.
92
+ *
93
+ * A completed row never appears (the panel collapses those into `… +N
94
+ * completed`, which SUMMARY_LINE_PATTERN handles), so no done-marker is needed.
95
+ * An unmatched glyph simply ends the block, which is the safe direction: those
96
+ * rows go back to being handled exactly as they were before this guard existed.
97
+ *
98
+ * To widen this, capture a live pane that actually renders the new glyph and add
99
+ * it as a fixture. Do not widen it from the shape of the character.
100
+ */
101
+ const CLAUDE_TASK_PANEL_ROW_PATTERN = /^\s*[◼◻]\s/;
102
+ /**
103
+ * [Issue #2468] Claude Code 2.1.267's session-diff HUD row, in the two
104
+ * spellings measured on a live pane (tests/fixtures/claude-live-2468):
105
+ * "No changes this session"
106
+ * "+28 files edited before this session (show)"
107
+ *
108
+ * Chrome like the task panel, but a single row and RIGHT-aligned: on a
109
+ * 200-column pane it is ~110 columns of padding and then the text. It is
110
+ * therefore matched on the trimmed row — a reader that slices the row from the
111
+ * left sees nothing but blanks.
112
+ *
113
+ * It broke two readers. Pass 2 below parses `+2 files edited …` as option 2,
114
+ * which poisons the real `1. / 2.` above it the way `… +2 completed` did in
115
+ * #1708. And `findClaudeTranscriptTail` took it for the last transcript row, so
116
+ * `detectClaudeDialog` read it as the footer of the AskUserQuestion
117
+ * confirmation screen — a dialog that draws no footer — and refused a dialog
118
+ * that was open on screen: Auto-Yes, the UI's answer and `commandmate respond`
119
+ * all got `prompt_no_longer_active`.
120
+ *
121
+ * `files?` is the one spelling not seen on a pane: a one-file session was not
122
+ * captured, and the singular is accepted so that it is not the case that
123
+ * regresses. Everything else is literal, for the same reason the glyph set
124
+ * above is an allowlist. Anchored at both ends, no nested quantifiers — ReDoS
125
+ * safe (S4-001).
126
+ */
127
+ const CLAUDE_SESSION_DIFF_HUD_PATTERN = /^(?:No changes this session|\+\d+ files? edited before this session \(show\))$/;
128
+ /**
129
+ * Line indices belonging to Claude's bottom-pinned panels within [start, end).
130
+ *
131
+ * Two panels, both chrome rather than transcript or prompt:
132
+ * - the task panel (#1708). Walks down from each header row for as long as
133
+ * rows keep looking like panel content (task rows or the collapsed `… +N …`
134
+ * summary). The first line that is neither ends the block, so a panel that
135
+ * abuts other content cannot swallow it.
136
+ * - the session-diff HUD (#2468), a single row claimed on its own.
137
+ *
138
+ * Pass 2 here, `findClaudeTranscriptTail` and `detectClaudeDialog`'s footer
139
+ * guard all read this one set — through {@link findClaudeChrome}, which adds an
140
+ * AskUserQuestion preview pane to it (Issue #2486) — so they cannot disagree
141
+ * about which rows are chrome.
142
+ *
143
+ * @param lines - Full frame, already ANSI/box stripped
144
+ * @param start - First index to consider (inclusive)
145
+ * @param end - Last index to consider (exclusive)
146
+ * @returns Indices Pass 2 must treat as metadata rather than options
147
+ */
148
+ function findClaudeTaskPanelLines(lines, start, end) {
149
+ const panelLines = new Set();
150
+ for (let i = Math.max(0, start); i < Math.min(end, lines.length); i++) {
151
+ if (CLAUDE_SESSION_DIFF_HUD_PATTERN.test(lines[i].trim())) {
152
+ panelLines.add(i);
153
+ continue;
154
+ }
155
+ if (!CLAUDE_TASK_PANEL_HEADER_PATTERN.test(lines[i]))
156
+ continue;
157
+ panelLines.add(i);
158
+ for (let j = i + 1; j < Math.min(end, lines.length); j++) {
159
+ const row = lines[j];
160
+ if (!CLAUDE_TASK_PANEL_ROW_PATTERN.test(row) && !exports.SUMMARY_LINE_PATTERN.test(row))
161
+ break;
162
+ panelLines.add(j);
163
+ }
164
+ }
165
+ return panelLines;
166
+ }
167
+ /**
168
+ * Claude's chrome within [start, end). See {@link ClaudeChrome}.
169
+ *
170
+ * @param lines - Full frame, ANSI stripped; box drawing optional
171
+ * @param start - First index to consider (inclusive)
172
+ * @param end - Last index to consider (exclusive)
173
+ */
174
+ function findClaudeChrome(lines, start, end) {
175
+ const rows = findClaudeTaskPanelLines(lines, start, end);
176
+ const panes = (0, picker_chrome_1.findClaudePreviewPanes)(lines, start, end);
177
+ for (const row of panes.rows)
178
+ rows.add(row);
179
+ return { rows, cuts: panes.cuts };
180
+ }
181
+ /**
182
+ * The frame with Claude's chrome taken out: chrome rows blank, rows shared with
183
+ * the preview pane cut back to the options column. Row indices are unchanged,
184
+ * so a reader of the result can report positions in the original frame.
185
+ */
186
+ function maskClaudeChrome(lines, chrome) {
187
+ return lines.map((line, i) => {
188
+ if (chrome.rows.has(i))
189
+ return '';
190
+ const cut = chrome.cuts.get(i);
191
+ return cut === undefined ? line : line.slice(0, cut).trimEnd();
192
+ });
193
+ }