commandmate 0.49.0 → 0.49.1

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 (721) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +238 -231
  3. package/.next/app-path-routes-manifest.json +19 -18
  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/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  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_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/push/subscriptions/route.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_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/[relayId]/route.js +1 -0
  45. package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
  46. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
  47. package/.next/server/app/api/relays/route.js +1 -1
  48. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  49. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/clone/route.js +1 -1
  56. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/restore/route.js +1 -1
  60. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/route.js +1 -1
  63. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/scan/route.js +1 -1
  66. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/sync/route.js +1 -1
  69. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  73. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  74. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  85. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  89. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/verification/runs/route.js +1 -1
  91. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  197. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/send/route.js +144 -1
  214. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  217. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  218. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  231. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
  235. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/route.js +1 -1
  263. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  264. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  266. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  268. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  269. package/.next/server/app/page_client-reference-manifest.js +1 -1
  270. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  272. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  273. package/.next/server/app/sessions/page.js +1 -1
  274. package/.next/server/app/sessions/page.js.nft.json +1 -1
  275. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  276. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/worktrees/[id]/page.js +11 -11
  281. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  282. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app-paths-manifest.json +19 -18
  285. package/.next/server/chunks/1656.js +2 -2
  286. package/.next/server/chunks/2119.js +1 -1
  287. package/.next/server/chunks/2404.js +1 -1
  288. package/.next/server/chunks/2445.js +1 -1
  289. package/.next/server/chunks/3773.js +1 -0
  290. package/.next/server/chunks/3801.js +31 -0
  291. package/.next/server/chunks/5209.js +1 -1
  292. package/.next/server/chunks/5354.js +1 -1
  293. package/.next/server/chunks/{9130.js → 5630.js} +1 -1
  294. package/.next/server/chunks/5775.js +1 -0
  295. package/.next/server/chunks/610.js +1 -0
  296. package/.next/server/chunks/6119.js +1 -1
  297. package/.next/server/chunks/6130.js +1 -1
  298. package/.next/server/chunks/6401.js +1 -1
  299. package/.next/server/chunks/6486.js +1 -1
  300. package/.next/server/chunks/6781.js +1 -1
  301. package/.next/server/chunks/6808.js +4 -0
  302. package/.next/server/chunks/7023.js +14 -0
  303. package/.next/server/chunks/7604.js +1 -1
  304. package/.next/server/chunks/7905.js +1 -1
  305. package/.next/server/chunks/8581.js +15 -15
  306. package/.next/server/chunks/8728.js +2 -2
  307. package/.next/server/chunks/8782.js +1 -1
  308. package/.next/server/chunks/8807.js +63 -53
  309. package/.next/server/chunks/8918.js +103 -1
  310. package/.next/server/chunks/9198.js +144 -0
  311. package/.next/server/chunks/9390.js +1 -1
  312. package/.next/server/chunks/9584.js +1 -1
  313. package/.next/server/chunks/9627.js +1 -1
  314. package/.next/server/chunks/9731.js +3 -3
  315. package/.next/server/middleware-manifest.json +5 -5
  316. package/.next/server/pages/500.html +1 -1
  317. package/.next/server/server-reference-manifest.json +1 -1
  318. package/.next/static/chunks/{2407-ab92ae9837c39dce.js → 2407-675ba6b21844dc3b.js} +1 -1
  319. package/.next/static/chunks/3931-1a1abab16248f14d.js +1 -0
  320. package/.next/static/chunks/8606-ce17ffa77f39608e.js +1 -0
  321. package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
  322. package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
  323. package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
  324. package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
  325. package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
  326. package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
  327. package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
  328. package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
  329. package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
  330. package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
  331. package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
  332. package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
  333. package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
  334. package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
  335. package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
  336. package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
  337. package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
  338. package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
  339. package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
  340. package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
  341. package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
  342. package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
  343. package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
  344. package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
  345. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
  346. package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
  347. package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
  348. package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
  349. package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
  350. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
  351. package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
  352. package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
  353. package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
  354. package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
  355. package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
  356. package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
  357. package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
  358. package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
  359. package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
  360. package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
  361. package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
  362. package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
  363. package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
  364. package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
  365. package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
  366. package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
  367. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
  368. package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
  369. package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
  370. package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
  371. package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
  372. package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
  458. package/.next/static/chunks/app/layout-8bfac4724277b47f.js +1 -0
  459. package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
  460. package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
  461. package/.next/static/chunks/app/sessions/page-890fd50ec9739973.js +1 -0
  462. package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
  463. package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +1 -0
  464. package/.next/static/css/c1e307d05daf93b6.css +1 -0
  465. package/.next/trace +13 -13
  466. package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
  467. package/.next/types/routes.d.ts +2 -1
  468. package/.next/types/validator.ts +9 -0
  469. package/dist/cli/commands/ask.d.ts.map +1 -1
  470. package/dist/cli/commands/ask.js +178 -13
  471. package/dist/cli/commands/message-dispatch.d.ts +25 -5
  472. package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
  473. package/dist/cli/commands/message-dispatch.js +92 -6
  474. package/dist/cli/commands/relays.d.ts +25 -2
  475. package/dist/cli/commands/relays.d.ts.map +1 -1
  476. package/dist/cli/commands/relays.js +69 -5
  477. package/dist/cli/commands/respond.d.ts +12 -0
  478. package/dist/cli/commands/respond.d.ts.map +1 -1
  479. package/dist/cli/commands/respond.js +63 -1
  480. package/dist/cli/commands/send.d.ts.map +1 -1
  481. package/dist/cli/commands/send.js +6 -4
  482. package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
  483. package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
  484. package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
  485. package/dist/cli/commands/wait-instance.d.ts +21 -0
  486. package/dist/cli/commands/wait-instance.d.ts.map +1 -0
  487. package/dist/cli/commands/wait-instance.js +41 -0
  488. package/dist/cli/commands/wait-notices.d.ts +87 -0
  489. package/dist/cli/commands/wait-notices.d.ts.map +1 -0
  490. package/dist/cli/commands/wait-notices.js +301 -0
  491. package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
  492. package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
  493. package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
  494. package/dist/cli/commands/wait-poll-state.d.ts +118 -0
  495. package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
  496. package/dist/cli/commands/wait-poll-state.js +6 -0
  497. package/dist/cli/commands/wait-timing.d.ts +46 -0
  498. package/dist/cli/commands/wait-timing.d.ts.map +1 -0
  499. package/dist/cli/commands/wait-timing.js +99 -0
  500. package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
  501. package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
  502. package/dist/cli/commands/wait-turn-boundary.js +427 -0
  503. package/dist/cli/commands/wait-verify.d.ts +50 -0
  504. package/dist/cli/commands/wait-verify.d.ts.map +1 -0
  505. package/dist/cli/commands/wait-verify.js +124 -0
  506. package/dist/cli/commands/wait.d.ts +6 -105
  507. package/dist/cli/commands/wait.d.ts.map +1 -1
  508. package/dist/cli/commands/wait.js +207 -959
  509. package/dist/cli/docs/agent-operations.d.ts +2 -2
  510. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  511. package/dist/cli/docs/agent-operations.js +23 -1
  512. package/dist/cli/types/api-responses.d.ts +47 -3
  513. package/dist/cli/types/api-responses.d.ts.map +1 -1
  514. package/dist/cli/utils/api-client.d.ts +15 -1
  515. package/dist/cli/utils/api-client.d.ts.map +1 -1
  516. package/dist/cli/utils/api-client.js +7 -1
  517. package/dist/cli/utils/reply-ledger.d.ts +79 -0
  518. package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
  519. package/dist/cli/utils/reply-ledger.js +141 -1
  520. package/dist/lib/session/send-attempt-types.d.ts +23 -1
  521. package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
  522. package/dist/lib/session/send-attempt-types.js +9 -1
  523. package/dist/server/locales/en/worktree.json +18 -3
  524. package/dist/server/locales/ja/worktree.json +18 -3
  525. package/dist/server/src/lib/auto-yes-poller.js +49 -10
  526. package/dist/server/src/lib/cli-tools/antigravity.js +40 -7
  527. package/dist/server/src/lib/cli-tools/codex.js +60 -11
  528. package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
  529. package/dist/server/src/lib/cli-tools/copilot.js +120 -30
  530. package/dist/server/src/lib/cli-tools/gemini.js +28 -9
  531. package/dist/server/src/lib/cli-tools/opencode.js +55 -13
  532. package/dist/server/src/lib/cli-tools/submit-composer-read.js +580 -0
  533. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +356 -621
  534. package/dist/server/src/lib/db/migrations/index.js +2 -0
  535. package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
  536. package/dist/server/src/lib/db/migrations/runner.js +37 -4
  537. package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
  538. package/dist/server/src/lib/db/relay-bind-db.js +437 -0
  539. package/dist/server/src/lib/db/relay-db.js +59 -96
  540. package/dist/server/src/lib/detection/upstream-faults.js +40 -6
  541. package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
  542. package/dist/server/src/lib/polling/response-checker.js +7 -5
  543. package/dist/server/src/lib/prompt-answer-errors.js +288 -0
  544. package/dist/server/src/lib/prompt-answer-sender.js +264 -288
  545. package/dist/server/src/lib/push/failure-episode-state.js +4 -1
  546. package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
  547. package/dist/server/src/lib/realtime-snippet.js +54 -0
  548. package/dist/server/src/lib/relay/relay-bind.js +294 -0
  549. package/dist/server/src/lib/relay/relay-boot.js +51 -0
  550. package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
  551. package/dist/server/src/lib/relay/relay-delivery.js +134 -220
  552. package/dist/server/src/lib/relay/relay-messages.js +39 -4
  553. package/dist/server/src/lib/relay/relay-overlap.js +92 -0
  554. package/dist/server/src/lib/relay/relay-system-line.js +3 -2
  555. package/dist/server/src/lib/relay/types.js +12 -1
  556. package/dist/server/src/lib/session/agent-session-lifecycle.js +18 -0
  557. package/dist/server/src/lib/session/claude-session.js +41 -6
  558. package/dist/server/src/lib/session/composer-clear.js +54 -1
  559. package/dist/server/src/lib/session/current-output-builder.js +21 -5
  560. package/dist/server/src/lib/session/instance-input-lock.js +664 -0
  561. package/dist/server/src/lib/session/send-attempt-state.js +17 -0
  562. package/dist/server/src/lib/session/send-attempt-types.js +9 -1
  563. package/dist/server/src/lib/session/send-user-message.js +82 -13
  564. package/package.json +1 -1
  565. package/release-notes/0.49.1.json +66 -0
  566. package/.next/server/chunks/1210.js +0 -1
  567. package/.next/server/chunks/1945.js +0 -14
  568. package/.next/server/chunks/1990.js +0 -103
  569. package/.next/server/chunks/4194.js +0 -67
  570. package/.next/server/chunks/4280.js +0 -1
  571. package/.next/server/chunks/5845.js +0 -1
  572. package/.next/server/chunks/720.js +0 -103
  573. package/.next/server/chunks/936.js +0 -1
  574. package/.next/server/chunks/9540.js +0 -1
  575. package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
  576. package/.next/static/chunks/9079-987939d231704218.js +0 -1
  577. package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
  578. package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
  579. package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
  580. package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
  581. package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
  582. package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
  583. package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
  584. package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
  585. package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
  586. package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
  587. package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
  588. package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
  589. package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
  590. package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
  591. package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
  592. package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
  593. package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
  594. package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
  595. package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
  596. package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
  597. package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
  598. package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
  599. package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
  600. package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
  601. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
  602. package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
  603. package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
  604. package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
  605. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
  606. package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
  607. package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
  608. package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
  609. package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
  610. package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
  611. package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
  612. package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
  613. package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
  614. package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
  615. package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
  616. package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
  617. package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
  618. package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
  619. package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
  620. package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
  621. package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
  622. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
  623. package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
  624. package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
  625. package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
  626. package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
  627. package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
  647. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
  648. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
  649. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
  650. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
  651. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
  670. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
  671. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
  672. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
  673. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
  674. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
  675. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
  676. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
  677. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
  678. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
  679. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
  680. package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
  681. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
  682. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
  683. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
  684. package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
  685. package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
  699. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
  700. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
  701. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
  702. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
  703. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
  704. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
  705. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
  706. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
  707. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
  708. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
  709. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
  710. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
  711. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
  712. package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
  713. package/.next/static/chunks/app/layout-aa8e66164a4367af.js +0 -1
  714. package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
  715. package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
  716. package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +0 -1
  717. package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
  718. package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +0 -1
  719. package/.next/static/css/db8959555c3d9c96.css +0 -1
  720. /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → fqfSDqQMweROeHUzOt_m1}/_buildManifest.js +0 -0
  721. /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → fqfSDqQMweROeHUzOt_m1}/_ssgManifest.js +0 -0
@@ -0,0 +1,580 @@
1
+ "use strict";
2
+ /**
3
+ * Reading a captured pane's composer for the submit-verified sender
4
+ * (Issue #3963: split out of `submit-verified-sender.ts`, which re-exports the
5
+ * public names). Pure functions of the captured text: no tmux, no waiting.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.VERIFY_WINDOW_LINES = void 0;
9
+ exports.withoutTrailingBlankRows = withoutTrailingBlankRows;
10
+ exports.findPasteTokens = findPasteTokens;
11
+ exports.readSubmitComposer = readSubmitComposer;
12
+ exports.classifySubmit = classifySubmit;
13
+ exports.isSubmitted = isSubmitted;
14
+ exports.classifyPasteLanded = classifyPasteLanded;
15
+ exports.compactText = compactText;
16
+ const composer_spec_1 = require("./composer-spec");
17
+ const cli_patterns_1 = require("../detection/cli-patterns");
18
+ const composer_text_1 = require("../../lib/detection/composer-text");
19
+ /**
20
+ * Version-resilient pasted-text placeholder.
21
+ *
22
+ * Broader than PASTED_TEXT_PATTERN (`/\[Pasted text #\d+/`) so it still matches
23
+ * when a CLI version drops the `#N` and renders `[Pasted text +46 lines]`
24
+ * (Issue #1469 condition 2). Used ONLY as a positive "still in the input box"
25
+ * signal — never as the sole submit gate — so applying it to every tool is safe:
26
+ * a tool that never renders it simply never matches.
27
+ */
28
+ const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
29
+ /**
30
+ * A slash-command sitting on the input line (Issue #1501).
31
+ *
32
+ * TUI completion popups replace a typed slash command with a highlighted menu
33
+ * item (`/status` -> `/statusline`, `/review` -> `/teamwork-preview`); the
34
+ * result is always another slash command. Scoping the "replaced" verdict to
35
+ * `/…` text keeps idle-prompt placeholders that some TUIs paint on an empty
36
+ * composer (gemini's "Type your message or @path", claude's hints, "? for
37
+ * shortcuts") — none of which start with `/` — from being mistaken for a
38
+ * substitution, so a genuinely-submitted message never fails spuriously.
39
+ */
40
+ const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
41
+ /**
42
+ * Prompt input-line markers across the marker-drawing TUIs.
43
+ * claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
44
+ * vibe-local: `ctx:N% ❯`. Leading whitespace is tolerated (tmux padding).
45
+ *
46
+ * Issue #1906 scopes this to the tools whose {@link ComposerSpec.reader} is
47
+ * `input-line-marker`. opencode draws no marker at all, so applying it there was
48
+ * wrong in both directions — see {@link readComposer}.
49
+ */
50
+ const INPUT_LINE_MARKER = /^\s*(?:ctx:\d+%\s*)?[>❯›]/;
51
+ /**
52
+ * Lines of pane tail to inspect for the "is the tool generating?" signal.
53
+ *
54
+ * Distinct from `ComposerSpec.verifyCaptureLines`, which sizes the tmux
55
+ * capture: the busy marker of every tool lives in a status bar pinned to the
56
+ * bottom of the pane, so it is read from a short tail even when the capture
57
+ * itself is opencode's whole 200-row frame. Widening it to that frame would
58
+ * match `esc interrupt` printed inside a reply.
59
+ *
60
+ * "The bottom" is the last row that holds anything (Issue #2464). codex,
61
+ * Command Code and agy draw inline from the TOP of the 1000-row pane, so the
62
+ * last twelve rows of the capture are blank padding — measured at rows 306,
63
+ * 297 and 286 of 1,002 — and reading them found no composer on any send to
64
+ * those three tools. See {@link withoutTrailingBlankRows}.
65
+ */
66
+ exports.VERIFY_WINDOW_LINES = 12;
67
+ /**
68
+ * Read the composer out of a captured frame.
69
+ *
70
+ * Two readers, because the two families of TUI say "this is the input line" in
71
+ * incompatible ways:
72
+ *
73
+ * - **marker tools** (`reader: 'input-line-marker'`) draw a `>` / `❯` / `›` at
74
+ * the start of the row. Scanned bottom-up over the tail window so a status bar
75
+ * below the box does not hide it.
76
+ * - **opencode** draws a box with a gutter and no marker anywhere. Its buffer
77
+ * rows are located structurally by {@link findOpenCodeComposerRows} (#1911's
78
+ * chrome walk), and `Ask anything...` inside that box is opencode's own way of
79
+ * saying the buffer is empty (#1883) rather than a row of text.
80
+ *
81
+ * Before this split, opencode went through the marker reader, which is wrong
82
+ * both ways round. It never matched opencode's composer, so EVERY opencode send
83
+ * was classified `submitted` without evidence — #1471's "the Enter was
84
+ * swallowed" recovery has never once run on opencode. And when a `>` did land in
85
+ * the window from somewhere else (a Markdown quote in a reply), the reader
86
+ * treated that row as the input line and answered from it.
87
+ *
88
+ * Issue #1933 turned "which reader" from a `cliToolId === 'opencode'` test plus
89
+ * a set membership test into {@link ComposerSpec.reader}, so the answer is one
90
+ * declaration the tool owns rather than two tables a new tool has to be added
91
+ * to. `unreadable` is the third arm, and it is the one #1906 found opencode
92
+ * silently occupying: it means every send is classified `submitted` without
93
+ * evidence, so it is a state to declare knowingly, never to fall into.
94
+ */
95
+ function readComposer(reader, lines, windowLines) {
96
+ if (reader === 'opencode-box') {
97
+ const rows = (0, cli_patterns_1.findOpenCodeComposerRows)(lines);
98
+ if (rows === null)
99
+ return { kind: 'absent' };
100
+ // The placeholder is painted only while the buffer is empty, and only
101
+ // inside the box — hence matched on the raw, still-guttered row (#1883).
102
+ if (rows.some((row) => cli_patterns_1.OPENCODE_IDLE_COMPOSER_PATTERN.test(row)))
103
+ return { kind: 'empty' };
104
+ const first = rows.map(cli_patterns_1.stripOpenCodeGutter).find((row) => row.length > 0);
105
+ if (first === undefined)
106
+ return { kind: 'empty' };
107
+ return { kind: 'text', text: first, rows };
108
+ }
109
+ if (reader !== 'input-line-marker')
110
+ return { kind: 'absent' };
111
+ const inputLine = findInputLine(windowLines);
112
+ if (inputLine === null)
113
+ return { kind: 'absent' };
114
+ const stripped = stripInputMarker(inputLine);
115
+ if (stripped.length === 0)
116
+ return { kind: 'empty' };
117
+ return { kind: 'text', text: stripped, rows: [inputLine] };
118
+ }
119
+ /**
120
+ * The captured rows without the blank rows under the last drawn one
121
+ * (Issue #2464).
122
+ *
123
+ * `capture-pane` returns every row of the pane, and a TUI that renders inline
124
+ * from the top (codex, Command Code, agy) fills only the first few hundred of
125
+ * the 1000 rows the session is created with. The composer is the last thing
126
+ * such a TUI draws, so "the tail of the pane" has to mean "the tail of what is
127
+ * drawn" — otherwise the tail window is all padding, no composer is ever found,
128
+ * and every send to those tools classifies as `submitted` whatever the
129
+ * composer actually holds. A bottom-anchored TUI (claude) has no trailing blank
130
+ * rows, so for it this is the identity.
131
+ */
132
+ function withoutTrailingBlankRows(lines) {
133
+ let end = lines.length;
134
+ while (end > 0 && lines[end - 1].trim() === '')
135
+ end--;
136
+ return lines.slice(0, end);
137
+ }
138
+ /**
139
+ * First non-blank line of the message, trimmed. This is what a TUI shows on the
140
+ * prompt line before the body folds into a paste placeholder. NOT truncated:
141
+ * the replacement check (inputMatchesBody) needs the full first line so that a
142
+ * completion suffix (`/status` -> `/statusline`) is not mistaken for the body.
143
+ */
144
+ function firstNonBlankLine(message) {
145
+ const line = message
146
+ .split('\n')
147
+ .map((l) => l.trim())
148
+ .find((l) => l.length > 0);
149
+ return line ?? '';
150
+ }
151
+ /**
152
+ * Locate the active input line within the pane tail: the last line that begins
153
+ * with a prompt marker. Scanned bottom-up so a status-bar/footer line rendered
154
+ * BELOW the input box (antigravity's "? for shortcuts", vibe-local's status bar)
155
+ * does not hide the real input line above it.
156
+ */
157
+ function findInputLine(windowLines) {
158
+ for (let i = windowLines.length - 1; i >= 0; i--) {
159
+ if (INPUT_LINE_MARKER.test(windowLines[i])) {
160
+ return windowLines[i];
161
+ }
162
+ }
163
+ return null;
164
+ }
165
+ /** Input line text with the prompt marker stripped and surrounding space trimmed. */
166
+ function stripInputMarker(inputLine) {
167
+ return inputLine.replace(INPUT_LINE_MARKER, '').trim();
168
+ }
169
+ /**
170
+ * Whether the (marker-stripped, non-empty) input-line text is still our
171
+ * unsent body rather than a TUI-substituted command.
172
+ *
173
+ * The still-unsent body appears verbatim on the input line. Line wrapping can
174
+ * visually truncate it to a PREFIX of the first line, but a completion popup
175
+ * always produces a DIFFERENT string — the body plus a completion suffix
176
+ * (`/status` -> `/statusline`) or an unrelated command (`/review` ->
177
+ * `/teamwork-preview`) — which is never a prefix of the body. So the body is
178
+ * "still there" iff the input text is a prefix of (or equals) the body's first
179
+ * line. This deliberately rejects `/statusline` for a `/status` body: the safe
180
+ * rule is "input text that is not the body (or a prefix of it) is NOT resent".
181
+ */
182
+ function inputMatchesBody(strippedInput, message) {
183
+ const bodyFirstLine = firstNonBlankLine(message);
184
+ if (bodyFirstLine.length === 0)
185
+ return false;
186
+ return bodyFirstLine.startsWith(strippedInput);
187
+ }
188
+ /**
189
+ * Collapsed-paste placeholders, as measured at the production 200x1000
190
+ * geometry (Issue #2464, `tests/fixtures/long-body-2464/`):
191
+ *
192
+ * claude 2.1.268 `[Pasted text #86 +59 lines]` for 60 lines, `[Pasted text #87]` for one
193
+ * agy 1.2.0 `[Pasted text #5 +60 lines]` for 60 lines, `[Pasted text #6 12288 chars]` for one
194
+ * codex 0.154.0 `[Pasted Content 12288 chars]`
195
+ * Command Code 1.53.0 `[PROBE P12k… +60L]` — the first ten characters, then the line count
196
+ *
197
+ * The `#N` stays optional for #1469's version drift (`[Pasted text +46 lines]`).
198
+ */
199
+ const PASTE_TOKEN_PATTERNS = [
200
+ {
201
+ pattern: /\[Pasted text(?: #\d+)?(?: \+(\d+) lines?| (\d+) chars?)?\]/g,
202
+ read: (m) => m[1] !== undefined ? { lines: Number(m[1]) } : m[2] !== undefined ? { chars: Number(m[2]) } : {},
203
+ },
204
+ { pattern: /\[Pasted Content (\d+) chars?\]/g, read: (m) => ({ chars: Number(m[1]) }) },
205
+ { pattern: /\[([^\]\n]*?)… \+(\d+)L\]/g, read: (m) => ({ head: m[1], lineTotal: Number(m[2]) }) },
206
+ ];
207
+ /** Every paste placeholder on a composer row, and the text left around them. */
208
+ function findPasteTokens(text) {
209
+ const tokens = [];
210
+ let rest = text;
211
+ for (const { pattern, read } of PASTE_TOKEN_PATTERNS) {
212
+ for (const match of text.matchAll(pattern)) {
213
+ tokens.push(read(match));
214
+ rest = rest.replace(match[0], '');
215
+ }
216
+ }
217
+ return { tokens, rest: rest.trim() };
218
+ }
219
+ /**
220
+ * Does one placeholder account for the whole body?
221
+ *
222
+ * Counts below the body's mean the paste is still arriving; counts above it mean
223
+ * the composer holds more than the body. The two units that differ between
224
+ * tools for the same `+M lines` wording (claude: 59 for a 60-line body, agy: 60)
225
+ * are both accepted — a bracketed paste arrives as one unit, so the failure this
226
+ * guards against is a count that is wildly short (the 24-byte tail of #2464),
227
+ * not one that is off by one line.
228
+ */
229
+ function comparePasteToken(token, message) {
230
+ const newlines = (message.match(/\n/g) ?? []).length;
231
+ if (token.head !== undefined) {
232
+ const normalizedHead = token.head.replace(/\s+/g, ' ').trim();
233
+ if (!message.replace(/\s+/g, ' ').startsWith(normalizedHead))
234
+ return 'mismatch';
235
+ }
236
+ let observed;
237
+ let accepted;
238
+ if (token.chars !== undefined) {
239
+ observed = token.chars;
240
+ accepted = [[...message].length, message.length];
241
+ }
242
+ else if (token.lineTotal !== undefined) {
243
+ observed = token.lineTotal;
244
+ accepted = [newlines + 1];
245
+ }
246
+ else if (token.lines !== undefined) {
247
+ observed = token.lines;
248
+ accepted = [newlines, newlines + 1];
249
+ }
250
+ else {
251
+ // claude's bare `[Pasted text #N]` is what it draws for a single line.
252
+ return newlines === 0 ? 'landed' : 'pasting';
253
+ }
254
+ if (accepted.includes(observed))
255
+ return 'landed';
256
+ return observed < Math.min(...accepted) ? 'pasting' : 'mismatch';
257
+ }
258
+ /**
259
+ * The composer as {@link classifySubmit} reads it (Issue #3205).
260
+ *
261
+ * {@link readComposer}'s marker reader takes the bottom-most `›` row of the
262
+ * tail as the input line. A codex composer holding several lines draws its
263
+ * continuation rows under the `›` row, and when one of them itself begins with
264
+ * `›` — a body quoting a dialog's `› 1. Yes, proceed (y)` — that continuation
265
+ * row was read as the input line: its text is not the body's first line, so a
266
+ * body still sitting in the composer was classified `submitted` (F). Measured:
267
+ * `tests/fixtures/codex-multiline-composer-3205/tc104-raw-pane.txt`.
268
+ *
269
+ * So for codex a composer of two or more rows is read with
270
+ * `extractComposerText` — the #1890 reader `awaitTypedBody` already uses —
271
+ * and its first line is the input line. Every other frame (a one-row
272
+ * composer, an empty or ghost one, none at all, another tool) is read exactly
273
+ * as before.
274
+ *
275
+ * Issue #3880 (H-2): this is also the reader before Enter
276
+ * ({@link classifyPasteLanded}) and in the error text ({@link describeComposer}).
277
+ * The paste check used to read the twelve-row tail with {@link readComposer}
278
+ * alone, so a codex composer taller than that window (a 20-line paste, or 600
279
+ * bytes wrapped in a narrow pane) put its `›` row above the window — `unseen`,
280
+ * and the body that was in the composer was withdrawn and reported as not
281
+ * landed — and a continuation row starting with `>` (a Markdown quote) was taken
282
+ * for the input line — `mismatch`. The same frame read after Enter was
283
+ * `pending`. One reader on both sides of Enter keeps the two verdicts about the
284
+ * same composer.
285
+ */
286
+ /**
287
+ * Everything a codex composer holds, for deciding that a pasted body arrived in
288
+ * full (Issue #3880).
289
+ *
290
+ * `extractComposerText` answers for the UI: its text stops at 2,000 characters,
291
+ * at 40 rows and at the composer's first blank row, so a composer that matches
292
+ * it may still be missing the rest of the body — or hold something after it.
293
+ * This reads the raw rows instead, from the `›` row down to the last block of
294
+ * the frame (codex's model / cwd footer), so a body with blank lines, more than
295
+ * 40 rows or more than 2,000 characters is compared whole, and anything typed
296
+ * after the body is part of what is compared.
297
+ */
298
+ function codexComposerRegion(output) {
299
+ const raw = output.split('\n');
300
+ const box = (0, composer_text_1.findCodexInputBox)(raw);
301
+ if (box === null)
302
+ return null;
303
+ return codexRegionFrom(raw, box.firstRow, box.lastRow);
304
+ }
305
+ /**
306
+ * {@link codexComposerRegion} from a known `›` row (Issue #3906): the rows from
307
+ * `firstRow` down to the frame's last block (the footer), ANSI and glyph
308
+ * stripped. `lastRow` is the end of the `›` row's own block, so a composer that
309
+ * is itself the frame's last block is read to the end.
310
+ */
311
+ function codexRegionFrom(raw, firstRow, lastRow) {
312
+ const isBlank = (row) => (0, cli_patterns_1.stripAnsi)(row).trim() === '';
313
+ let end = raw.length - 1;
314
+ while (end >= 0 && isBlank(raw[end]))
315
+ end--;
316
+ let lastBlockStart = end;
317
+ while (lastBlockStart > 0 && !isBlank(raw[lastBlockStart - 1]))
318
+ lastBlockStart--;
319
+ const stop = lastBlockStart > lastRow ? lastBlockStart - 1 : end;
320
+ const rows = raw.slice(firstRow, stop + 1).map((row) => (0, cli_patterns_1.stripAnsi)(row));
321
+ rows[0] = rows[0].replace(/^\s*\u203A ?/, '');
322
+ return rows.join('\n');
323
+ }
324
+ /** End (inclusive) of the blank-row-delimited block that starts at `row`. */
325
+ function blockEndFrom(raw, row) {
326
+ let end = row;
327
+ while (end + 1 < raw.length && (0, cli_patterns_1.stripAnsi)(raw[end + 1]).trim() !== '')
328
+ end++;
329
+ return end;
330
+ }
331
+ /** The bottom-most row of `windowLines` the marker reader takes as the input line, as a frame index. */
332
+ function markerRowIndex(windowLines, windowStart) {
333
+ for (let i = windowLines.length - 1; i >= 0; i--) {
334
+ if (INPUT_LINE_MARKER.test(windowLines[i]))
335
+ return windowStart + i;
336
+ }
337
+ return -1;
338
+ }
339
+ function readSubmitComposer(output, cliToolId, reader, lines, windowLines, message) {
340
+ if (cliToolId === 'codex' && reader === 'input-line-marker') {
341
+ const raw = output.split('\n');
342
+ const windowStart = lines.length - windowLines.length;
343
+ const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
344
+ if (read.state === 'content') {
345
+ const box = (0, composer_text_1.findCodexInputBox)(raw);
346
+ // Issue #3906: a dialog option drawn below the composer the extractor
347
+ // located means the dialog is what the pane shows now, on every branch
348
+ // below — that composer is one left from before, not this send's.
349
+ if (box !== null && (0, composer_text_1.codexDialogBelow)(raw, box.firstRow))
350
+ return { kind: 'absent' };
351
+ const outsideWindow = box !== null && box.firstRow < windowStart;
352
+ const region = codexComposerRegion(output) ?? read.text;
353
+ if (read.text.includes('\n')) {
354
+ // Issue #3906: a composer of many rows with no blank line (20 lines) has
355
+ // its `›` row above the window too, and is marked so like the others.
356
+ return {
357
+ kind: 'text',
358
+ text: firstNonBlankLine(read.text),
359
+ rows: read.text.split('\n'),
360
+ region,
361
+ ...(outsideWindow ? { outsideWindow } : {}),
362
+ };
363
+ }
364
+ // Issue #3906 (1): the `›` row sits above the twelve-row window (a one-line
365
+ // paragraph, a blank line, then a tall one). The marker reader would see no
366
+ // input line there — `unseen` before Enter, `submitted` after it — so the
367
+ // composer `extractComposerText` located is read instead, whole.
368
+ if (outsideWindow && (0, composer_text_1.findCodexLiveComposerRow)(raw) === box.firstRow) {
369
+ return { kind: 'text', text: read.text.trim(), rows: [raw[box.firstRow]], region, outsideWindow: true };
370
+ }
371
+ // Issue #3880 (N1): a one-row excerpt is read as before for its verdict
372
+ // after Enter, but still carries the whole region — `head` with the rest of
373
+ // the body under a blank row is one excerpt row and must not pass for the
374
+ // whole body before Enter.
375
+ const single = readComposer(reader, lines, windowLines);
376
+ return single.kind === 'text' ? { ...single, region } : single;
377
+ }
378
+ if (read.state === 'no_composer') {
379
+ // Issue #3906 (2): more paragraphs than the four blocks the extractor
380
+ // searches. Whatever the marker reader takes must carry the whole region,
381
+ // so the composer's first line alone never passes for the body. The row is
382
+ // the live composer only when no dialog option is drawn below it
383
+ // ({@link findCodexLiveComposerRow}, the order `findCodexBottomGlyphRow`
384
+ // reads a frame in): a composer row left above an approval dialog is
385
+ // never this send's composer, however its text reads.
386
+ const composerRow = (0, composer_text_1.findCodexLiveComposerRow)(raw);
387
+ if (composerRow >= 0) {
388
+ const region = codexRegionFrom(raw, composerRow, blockEndFrom(raw, composerRow));
389
+ const text = stripInputMarker((0, cli_patterns_1.stripAnsi)(raw[composerRow]));
390
+ if (composerRow >= windowStart) {
391
+ const single = readComposer(reader, lines, windowLines);
392
+ if (single.kind === 'text' && markerRowIndex(windowLines, windowStart) === composerRow) {
393
+ return { ...single, region };
394
+ }
395
+ return single;
396
+ }
397
+ // Above the window as well, with no dialog below it.
398
+ if (message !== undefined && text.length > 0 && inputMatchesBody(text, message)) {
399
+ return { kind: 'text', text, rows: [raw[composerRow]], region, outsideWindow: true };
400
+ }
401
+ // Not the body's first line. A composer whose own block is empty or
402
+ // placeholder-only is empty; real text is read too — a `/…` command
403
+ // there is `replaced` as it is inside the window, and anything else is
404
+ // not proof that the message left ({@link classifySubmit}: `indeterminate`).
405
+ const held = (0, composer_text_1.readCodexComposerFrom)(raw.slice(0, blockEndFrom(raw, composerRow) + 1), composerRow);
406
+ if (held.state !== 'content')
407
+ return { kind: 'empty' };
408
+ return {
409
+ kind: 'text',
410
+ text: firstNonBlankLine(held.text),
411
+ rows: [raw[composerRow]],
412
+ region,
413
+ outsideWindow: true,
414
+ };
415
+ }
416
+ }
417
+ }
418
+ return readComposer(reader, lines, windowLines);
419
+ }
420
+ /**
421
+ * Classify a captured pane into submitted / pending / replaced (Issue #1501).
422
+ *
423
+ * Version-independent by design — does NOT require the paste placeholder:
424
+ * A. The tool is generating a response -> submitted.
425
+ * B. No composer, or the composer is empty -> submitted.
426
+ * C. A paste placeholder is folded in the composer -> pending (Enter eaten).
427
+ * D. The body is still verbatim in the composer -> pending (resend Enter).
428
+ * E. A DIFFERENT slash command is in the composer -> replaced (TUI popup
429
+ * autocompleted the command; clear the line and throw, never resend Enter).
430
+ * F. Any other non-empty text (idle placeholder/hint) -> submitted (unchanged
431
+ * pre-#1501 permissive default, so normal sends never spuriously fail) —
432
+ * except in a codex composer above the read window -> indeterminate
433
+ * (Issue #3906).
434
+ *
435
+ * C–F are scoped to the composer only, so the user-message echo that a TUI
436
+ * prints into its history above the prompt never causes a false verdict.
437
+ *
438
+ * Issue #1906: "the composer" is read per tool by {@link readComposer} rather
439
+ * than by looking for a `>` in the last twelve rows. For opencode — which draws
440
+ * no marker — that read was unreachable, so every send reached F (in fact B) and
441
+ * this function has never returned anything but `submitted` for it.
442
+ *
443
+ * Issue #2464: the tail window starts at the last drawn row, not at the last row
444
+ * of the pane ({@link withoutTrailingBlankRows}), and C recognises every tool's
445
+ * paste placeholder ({@link findPasteTokens}), not only claude's.
446
+ *
447
+ * @param output - Captured pane, ANSI intact. For opencode this must be the
448
+ * whole pane; {@link ComposerSpec.verifyCaptureLines} is what asks tmux for it.
449
+ * @param cliToolId - CLI tool id, for the "generating" detector
450
+ * @param message - The body that was typed
451
+ * @param composer - The tool's composer description (Issue #1933). Defaults to
452
+ * the tool's own, so every existing three-argument caller is unchanged.
453
+ */
454
+ function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
455
+ const clean = (0, cli_patterns_1.stripAnsi)(output);
456
+ const lines = withoutTrailingBlankRows(clean.split('\n'));
457
+ const windowLines = lines.slice(-exports.VERIFY_WINDOW_LINES);
458
+ const windowStr = windowLines.join('\n');
459
+ // A. Actively generating a response => the message was accepted. Read from the
460
+ // tail window for every tool: each one's busy marker lives in a status bar
461
+ // pinned to the bottom of the pane, and widening it to opencode's whole
462
+ // frame would match `esc interrupt` printed inside a reply.
463
+ if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
464
+ return 'submitted';
465
+ }
466
+ const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, windowLines, message);
467
+ // B. No composer visible (scrolled off / dialog / still starting), or the
468
+ // composer is empty => the message left the box => submitted.
469
+ if (composer.kind !== 'text') {
470
+ return 'submitted';
471
+ }
472
+ // C. A paste placeholder is still folded into the composer => body is there.
473
+ if (composer.rows.some((row) => PASTE_PLACEHOLDER_PATTERN.test(row) || findPasteTokens(row).tokens.length > 0)) {
474
+ return 'pending';
475
+ }
476
+ // D. The typed body is still sitting in the composer => resend Enter.
477
+ if (inputMatchesBody(composer.text, message)) {
478
+ return 'pending';
479
+ }
480
+ // E. A different slash command is in the composer => a completion popup
481
+ // replaced what we typed. (Scoped to `/…` so idle-prompt placeholders that
482
+ // some TUIs paint on an empty composer are never mistaken for this.)
483
+ if (REPLACEMENT_COMMAND_PATTERN.test(composer.text)) {
484
+ return 'replaced';
485
+ }
486
+ // F. Non-empty, non-command steady-state text (idle placeholder / hint) =>
487
+ // submitted, preserving the pre-#1501 permissive default. Not for a codex
488
+ // composer above the window (Issue #3906): before #3906 that frame was
489
+ // read as no composer at all; text there that is not the body says
490
+ // neither that the message left nor that Enter would send it.
491
+ return composer.outsideWindow ? 'indeterminate' : 'submitted';
492
+ }
493
+ /**
494
+ * Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
495
+ * A `replaced` verdict is NOT "submitted", so this returns false for it too.
496
+ */
497
+ function isSubmitted(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
498
+ return classifySubmit(output, cliToolId, message, composerSpec) === 'submitted';
499
+ }
500
+ /**
501
+ * How much of a pasted body the composer shows, read BEFORE Enter (Issue #2464).
502
+ *
503
+ * The question #2464 needs answered is not "did Enter work" but "is what Enter
504
+ * would submit the message we sent". Claude kept the last 24 bytes of a 12 KB
505
+ * brief as ordinary composer text; every check that runs after Enter saw an
506
+ * empty box and a generating model, i.e. a perfect send. So the composer is
507
+ * judged here, while pressing Enter can still be withheld:
508
+ *
509
+ * 1. A collapsed placeholder is compared by the count the TUI prints — lines
510
+ * for claude, agy and Command Code, characters for codex and agy's
511
+ * single-line form ({@link comparePasteToken}).
512
+ * 2. Plain text is the body only if it is the body's BEGINNING. Text that
513
+ * occurs in the body but not at its start is exactly the #2464 tail, and is
514
+ * a mismatch rather than "not drawn yet".
515
+ * 3. Anything else — the idle placeholder, a ghost suggestion, no composer —
516
+ * shows nothing of the body. `unseen`, which the caller decides about.
517
+ *
518
+ * Reads the composer the way {@link classifySubmit} does
519
+ * ({@link readSubmitComposer}), so a history echo of an earlier message above the
520
+ * composer is never mistaken for this one, and a frame both functions see holds
521
+ * the same composer for both (Issue #3880). A multi-row codex composer is
522
+ * compared as a whole ({@link codexComposerRegion}), whitespace removed
523
+ * (wrapping and continuation indent proof): only the WHOLE body is `landed`;
524
+ * the body's beginning alone is `pasting` (never enough to press Enter on), the
525
+ * body plus anything else or text from inside it is `mismatch`. The whole body
526
+ * is checked before placeholders, so a body that itself quotes
527
+ * `[Pasted Content 600 chars]` is its own text, not codex's placeholder; a real
528
+ * placeholder is only ever the composer's first row.
529
+ *
530
+ * Issue #3906: a codex composer outside the twelve-row window, or split into
531
+ * more blocks than `extractComposerText` searches, is still read with its whole
532
+ * region ({@link readSubmitComposer}), so neither `unseen` for a body that is
533
+ * there nor `landed` on its first line alone.
534
+ */
535
+ function classifyPasteLanded(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
536
+ const lines = withoutTrailingBlankRows((0, cli_patterns_1.stripAnsi)(output).split('\n'));
537
+ const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, lines.slice(-exports.VERIFY_WINDOW_LINES), message);
538
+ if (composer.kind !== 'text')
539
+ return 'unseen';
540
+ if (composer.region !== undefined) {
541
+ const shown = compactText(composer.region);
542
+ const body = compactText(message);
543
+ if (shown === body)
544
+ return 'landed';
545
+ const placeholder = findPasteTokens(composer.text);
546
+ if (placeholder.tokens.length > 0) {
547
+ // A placeholder plus anything else — on its row or under it — is not the body as sent.
548
+ const below = compactText(composer.region.split('\n').slice(1).join('\n'));
549
+ if (placeholder.tokens.length > 1 || placeholder.rest !== '' || below !== '')
550
+ return 'mismatch';
551
+ return comparePasteToken(placeholder.tokens[0], message);
552
+ }
553
+ if (body.startsWith(shown))
554
+ return 'pasting';
555
+ // The body's beginning followed by something else, the body plus more, or a
556
+ // piece from inside it: the composer holds something other than the body.
557
+ if (inputMatchesBody(composer.text, message) || shown.startsWith(body) || body.includes(shown)) {
558
+ return 'mismatch';
559
+ }
560
+ return 'unseen';
561
+ }
562
+ // The whole body on one row is the body, even when it quotes a placeholder.
563
+ if (compactText(composer.text) === compactText(message))
564
+ return 'landed';
565
+ const { tokens, rest } = findPasteTokens(composer.text);
566
+ if (tokens.length === 0) {
567
+ if (inputMatchesBody(composer.text, message))
568
+ return 'landed';
569
+ if (message.includes(composer.text))
570
+ return 'mismatch';
571
+ return 'unseen';
572
+ }
573
+ if (tokens.length > 1 || rest !== '')
574
+ return 'mismatch';
575
+ return comparePasteToken(tokens[0], message);
576
+ }
577
+ /** The text with every whitespace character removed — wrapping and indent proof. */
578
+ function compactText(text) {
579
+ return text.replace(/\s+/g, '');
580
+ }