commandmate 0.49.1 → 0.49.3

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 (819) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +246 -243
  3. package/.next/app-path-routes-manifest.json +18 -17
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  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.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  21. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  24. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  31. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  32. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  34. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/escalation/route.js +1 -1
  42. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  43. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  45. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/push/vapid/route.js +1 -1
  47. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  48. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -1
  50. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  51. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/relays/[relayId]/resolve/route.js +1 -0
  53. package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
  54. package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
  55. package/.next/server/app/api/relays/[relayId]/route.js +1 -1
  56. package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
  57. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/relays/route.js +4 -1
  59. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  60. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  65. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/clone/route.js +1 -1
  67. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/restore/route.js +1 -1
  71. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/route.js +1 -1
  74. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/scan/route.js +1 -1
  77. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  78. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/repositories/sync/route.js +1 -1
  80. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  81. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  84. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  85. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  100. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/verification/runs/route.js +1 -1
  102. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  130. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  131. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -1
  188. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
  194. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  195. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  218. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  228. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  231. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
  234. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
  238. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  239. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  241. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  242. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  259. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  260. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  277. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  279. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  280. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  282. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  283. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  286. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  289. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/route.js +1 -1
  291. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  294. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  296. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  297. package/.next/server/app/page_client-reference-manifest.js +1 -1
  298. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  300. package/.next/server/app/review/page.js +1 -1
  301. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  302. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  303. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  304. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  305. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  306. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  307. package/.next/server/app/worktrees/[id]/page.js +10 -10
  308. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  309. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  310. package/.next/server/app-paths-manifest.json +18 -17
  311. package/.next/server/chunks/1308.js +1 -0
  312. package/.next/server/chunks/1501.js +5 -4
  313. package/.next/server/chunks/1656.js +2 -2
  314. package/.next/server/chunks/1957.js +2 -0
  315. package/.next/server/chunks/2119.js +1 -1
  316. package/.next/server/chunks/2445.js +1 -1
  317. package/.next/server/chunks/2897.js +1 -0
  318. package/.next/server/chunks/3417.js +1 -0
  319. package/.next/server/chunks/3505.js +1 -1
  320. package/.next/server/chunks/3801.js +8 -8
  321. package/.next/server/chunks/4207.js +1 -1
  322. package/.next/server/chunks/4490.js +1 -0
  323. package/.next/server/chunks/4911.js +1 -0
  324. package/.next/server/chunks/4936.js +1 -0
  325. package/.next/server/chunks/5209.js +2 -1
  326. package/.next/server/chunks/5350.js +212 -0
  327. package/.next/server/chunks/5354.js +1 -1
  328. package/.next/server/chunks/6130.js +1 -1
  329. package/.next/server/chunks/6401.js +1 -1
  330. package/.next/server/chunks/7023.js +3 -3
  331. package/.next/server/chunks/7905.js +1 -1
  332. package/.next/server/chunks/7926.js +1 -0
  333. package/.next/server/chunks/8581.js +15 -15
  334. package/.next/server/chunks/8728.js +2 -2
  335. package/.next/server/chunks/8782.js +1 -1
  336. package/.next/server/chunks/8807.js +89 -88
  337. package/.next/server/chunks/8918.js +3 -3
  338. package/.next/server/chunks/9169.js +1 -0
  339. package/.next/server/chunks/9390.js +1 -1
  340. package/.next/server/chunks/9584.js +1 -1
  341. package/.next/server/chunks/9627.js +5 -5
  342. package/.next/server/chunks/9702.js +1 -0
  343. package/.next/server/chunks/9731.js +3 -3
  344. package/.next/server/middleware-manifest.json +5 -5
  345. package/.next/server/pages/500.html +1 -1
  346. package/.next/server/server-reference-manifest.json +1 -1
  347. package/.next/static/chunks/{2407-675ba6b21844dc3b.js → 2407-87ec01332344ec2b.js} +1 -1
  348. package/.next/static/chunks/3931-3ef48b8d97357282.js +1 -0
  349. package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
  350. package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
  351. package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
  352. package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
  353. package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +1 -0
  354. package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
  355. package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
  356. package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
  357. package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
  358. package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
  359. package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
  360. package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
  361. package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
  362. package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
  363. package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
  364. package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
  365. package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
  366. package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
  367. package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
  368. package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
  369. package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
  370. package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
  371. package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
  372. package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
  373. package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
  374. package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
  375. package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
  376. package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
  377. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
  378. package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
  379. package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
  380. package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
  381. package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
  382. package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
  383. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
  384. package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
  385. package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
  386. package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
  387. package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
  388. package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
  389. package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
  390. package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
  391. package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
  392. package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
  393. package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
  394. package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
  395. package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
  396. package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
  397. package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
  398. package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
  399. package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
  400. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
  401. package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
  402. package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
  403. package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
  404. package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
  405. package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
  478. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
  479. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
  480. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
  481. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
  482. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
  483. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
  484. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
  485. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
  486. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
  487. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
  488. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
  489. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
  490. package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
  491. package/.next/static/chunks/app/layout-b9d8aef70e4f17b2.js +1 -0
  492. package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
  493. package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
  494. package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
  495. package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
  496. package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
  497. package/.next/static/chunks/app/sessions/{page-890fd50ec9739973.js → page-c6eb7c02db2f4c80.js} +1 -1
  498. package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
  499. package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
  500. package/.next/trace +13 -13
  501. package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
  502. package/.next/types/routes.d.ts +2 -1
  503. package/.next/types/validator.ts +9 -0
  504. package/dist/cli/commands/ask.d.ts.map +1 -1
  505. package/dist/cli/commands/ask.js +56 -5
  506. package/dist/cli/commands/attach.d.ts +4 -1
  507. package/dist/cli/commands/attach.d.ts.map +1 -1
  508. package/dist/cli/commands/attach.js +19 -7
  509. package/dist/cli/commands/command-target.d.ts +7 -0
  510. package/dist/cli/commands/command-target.d.ts.map +1 -1
  511. package/dist/cli/commands/command-target.js +10 -0
  512. package/dist/cli/commands/instances.d.ts.map +1 -1
  513. package/dist/cli/commands/instances.js +38 -2
  514. package/dist/cli/commands/message-dispatch.d.ts +17 -3
  515. package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
  516. package/dist/cli/commands/message-dispatch.js +14 -8
  517. package/dist/cli/commands/prompt.d.ts.map +1 -1
  518. package/dist/cli/commands/prompt.js +2 -1
  519. package/dist/cli/commands/relays.d.ts +4 -1
  520. package/dist/cli/commands/relays.d.ts.map +1 -1
  521. package/dist/cli/commands/relays.js +146 -8
  522. package/dist/cli/commands/report.d.ts +7 -2
  523. package/dist/cli/commands/report.d.ts.map +1 -1
  524. package/dist/cli/commands/report.js +19 -6
  525. package/dist/cli/commands/respond-strict.d.ts.map +1 -1
  526. package/dist/cli/commands/respond-strict.js +29 -5
  527. package/dist/cli/commands/respond.d.ts +2 -2
  528. package/dist/cli/commands/respond.d.ts.map +1 -1
  529. package/dist/cli/commands/respond.js +40 -37
  530. package/dist/cli/commands/send.d.ts.map +1 -1
  531. package/dist/cli/commands/send.js +8 -4
  532. package/dist/cli/commands/task.d.ts +22 -0
  533. package/dist/cli/commands/task.d.ts.map +1 -1
  534. package/dist/cli/commands/task.js +26 -18
  535. package/dist/cli/commands/wait-instance.d.ts +9 -1
  536. package/dist/cli/commands/wait-instance.d.ts.map +1 -1
  537. package/dist/cli/commands/wait-instance.js +15 -0
  538. package/dist/cli/commands/wait-poll-state.d.ts +18 -0
  539. package/dist/cli/commands/wait-poll-state.d.ts.map +1 -1
  540. package/dist/cli/commands/wait-verify.d.ts +2 -1
  541. package/dist/cli/commands/wait-verify.d.ts.map +1 -1
  542. package/dist/cli/commands/wait-verify.js +5 -1
  543. package/dist/cli/commands/wait.d.ts.map +1 -1
  544. package/dist/cli/commands/wait.js +37 -13
  545. package/dist/cli/commands/whoami.d.ts.map +1 -1
  546. package/dist/cli/commands/whoami.js +3 -1
  547. package/dist/cli/docs/agent-operations.d.ts +1 -1
  548. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  549. package/dist/cli/docs/agent-operations.js +1 -0
  550. package/dist/cli/types/api-responses.d.ts +55 -1
  551. package/dist/cli/types/api-responses.d.ts.map +1 -1
  552. package/dist/cli/utils/api-client-deadline.d.ts +28 -0
  553. package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
  554. package/dist/cli/utils/api-client-deadline.js +46 -0
  555. package/dist/cli/utils/api-client-errors.d.ts +118 -0
  556. package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
  557. package/dist/cli/utils/api-client-errors.js +210 -0
  558. package/dist/cli/utils/api-client.d.ts +33 -109
  559. package/dist/cli/utils/api-client.d.ts.map +1 -1
  560. package/dist/cli/utils/api-client.js +202 -227
  561. package/dist/cli/utils/follow-up-command.d.ts +38 -0
  562. package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
  563. package/dist/cli/utils/follow-up-command.js +57 -0
  564. package/dist/cli/utils/reply-ledger.d.ts +1 -1
  565. package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
  566. package/dist/cli/utils/reply-ledger.js +7 -2
  567. package/dist/cli/utils/server-capabilities.d.ts +18 -0
  568. package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
  569. package/dist/cli/utils/server-capabilities.js +36 -3
  570. package/dist/cli/utils/session-target.d.ts +1 -1
  571. package/dist/cli/utils/session-target.d.ts.map +1 -1
  572. package/dist/cli/utils/session-target.js +3 -0
  573. package/dist/cli/utils/verify-runner.d.ts +7 -0
  574. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  575. package/dist/cli/utils/verify-runner.js +51 -15
  576. package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
  577. package/dist/lib/cli-tools/session-name.js +11 -3
  578. package/dist/lib/cli-tools/types.d.ts +6 -0
  579. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  580. package/dist/lib/session/send-attempt-types.d.ts +25 -0
  581. package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
  582. package/dist/lib/session/send-attempt-types.js +10 -1
  583. package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
  584. package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
  585. package/dist/lib/verification/session-kill-ledger.js +174 -0
  586. package/dist/server/locales/en/worktree.json +9 -0
  587. package/dist/server/locales/ja/worktree.json +9 -0
  588. package/dist/server/src/config/cli-tool-timing-config.js +1 -7
  589. package/dist/server/src/lib/auto-yes-poller.js +5 -1
  590. package/dist/server/src/lib/cli-tools/antigravity.js +5 -2
  591. package/dist/server/src/lib/cli-tools/base.js +39 -0
  592. package/dist/server/src/lib/cli-tools/claude.js +8 -2
  593. package/dist/server/src/lib/cli-tools/codex.js +7 -4
  594. package/dist/server/src/lib/cli-tools/command-code.js +14 -18
  595. package/dist/server/src/lib/cli-tools/copilot.js +159 -28
  596. package/dist/server/src/lib/cli-tools/gemini.js +10 -2
  597. package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
  598. package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
  599. package/dist/server/src/lib/cli-tools/opencode.js +162 -8
  600. package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
  601. package/dist/server/src/lib/cli-tools/session-name.js +11 -3
  602. package/dist/server/src/lib/cli-tools/submit-composer-read.js +57 -14
  603. package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
  604. package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
  605. package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
  606. package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
  607. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +143 -187
  608. package/dist/server/src/lib/cli-tools/vibe-local.js +91 -2
  609. package/dist/server/src/lib/db/chat-db.js +14 -1
  610. package/dist/server/src/lib/db/db-instance.js +114 -2
  611. package/dist/server/src/lib/db/db-migration-path.js +63 -2
  612. package/dist/server/src/lib/db/migrations/index.js +2 -0
  613. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  614. package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
  615. package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
  616. package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
  617. package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
  618. package/dist/server/src/lib/db/relay-bind-db.js +88 -167
  619. package/dist/server/src/lib/db/relay-db-base.js +20 -0
  620. package/dist/server/src/lib/db/relay-db-count.js +49 -0
  621. package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
  622. package/dist/server/src/lib/db/relay-db-hold.js +250 -0
  623. package/dist/server/src/lib/db/relay-db.js +33 -92
  624. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
  625. package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
  626. package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
  627. package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
  628. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
  629. package/dist/server/src/lib/prompt-answer-errors.js +76 -2
  630. package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
  631. package/dist/server/src/lib/relay/relay-delivery.js +359 -79
  632. package/dist/server/src/lib/relay/relay-messages.js +13 -0
  633. package/dist/server/src/lib/relay/relay-system-line.js +28 -15
  634. package/dist/server/src/lib/relay/types.js +14 -2
  635. package/dist/server/src/lib/session/agent-event-state.js +4 -0
  636. package/dist/server/src/lib/session/agent-session-lifecycle.js +6 -1
  637. package/dist/server/src/lib/session/claude-session.js +26 -7
  638. package/dist/server/src/lib/session/current-output-builder.js +7 -3
  639. package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
  640. package/dist/server/src/lib/session/instance-input-lock.js +47 -2
  641. package/dist/server/src/lib/session/prompt-submit-receipt.js +224 -0
  642. package/dist/server/src/lib/session/prompt-waiting-guard.js +16 -3
  643. package/dist/server/src/lib/session/respond-target.js +82 -0
  644. package/dist/server/src/lib/session/send-attempt-state.js +177 -2
  645. package/dist/server/src/lib/session/send-attempt-types.js +10 -1
  646. package/dist/server/src/lib/session/send-user-message.js +80 -8
  647. package/dist/server/src/lib/session/session-launch-flight.js +243 -0
  648. package/dist/server/src/lib/session/session-starting-state.js +40 -4
  649. package/dist/server/src/lib/session/structured-prompt.js +17 -9
  650. package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
  651. package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
  652. package/dist/server/src/lib/session-cleanup.js +32 -0
  653. package/dist/server/src/lib/session-key-sender.js +6 -28
  654. package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
  655. package/dist/server/src/lib/verification/env-snapshot.js +11 -2
  656. package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
  657. package/package.json +5 -1
  658. package/release-notes/0.49.2.json +49 -0
  659. package/release-notes/0.49.3.json +52 -0
  660. package/.next/server/chunks/2422.js +0 -1
  661. package/.next/server/chunks/3773.js +0 -1
  662. package/.next/server/chunks/5630.js +0 -1
  663. package/.next/server/chunks/5775.js +0 -1
  664. package/.next/server/chunks/6808.js +0 -4
  665. package/.next/server/chunks/7604.js +0 -2
  666. package/.next/server/chunks/9198.js +0 -144
  667. package/.next/static/chunks/3931-1a1abab16248f14d.js +0 -1
  668. package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
  669. package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
  670. package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
  671. package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
  672. package/.next/static/chunks/8606-ce17ffa77f39608e.js +0 -1
  673. package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
  674. package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
  675. package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
  676. package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
  677. package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
  678. package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
  679. package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
  680. package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
  681. package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
  682. package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
  683. package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
  684. package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
  685. package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
  686. package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
  687. package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
  688. package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
  689. package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
  690. package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
  691. package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
  692. package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
  693. package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
  694. package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
  695. package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
  696. package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
  697. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
  698. package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
  699. package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
  700. package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
  701. package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
  702. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
  703. package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
  704. package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
  705. package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
  706. package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
  707. package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
  708. package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
  709. package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
  710. package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
  711. package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
  712. package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
  713. package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
  714. package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
  715. package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
  716. package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
  717. package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
  718. package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
  719. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
  720. package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
  721. package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
  722. package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
  723. package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
  724. package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
  725. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
  726. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
  727. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
  728. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
  729. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
  730. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
  731. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
  732. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
  733. package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
  734. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
  735. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
  736. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
  737. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
  738. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
  739. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
  740. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
  741. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
  742. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
  743. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
  744. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
  745. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
  746. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
  747. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
  748. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
  749. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
  750. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
  751. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
  752. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
  753. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
  754. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
  755. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
  756. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
  757. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
  758. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
  759. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
  771. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
  772. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
  773. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
  774. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
  775. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
  776. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
  777. package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
  778. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
  779. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
  780. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
  781. package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
  782. package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
  783. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
  788. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
  789. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
  790. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
  791. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
  792. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
  793. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
  794. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
  795. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
  796. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
  797. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
  798. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
  799. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
  800. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
  801. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
  802. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
  803. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
  804. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
  805. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
  806. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
  807. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
  808. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
  809. package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
  810. package/.next/static/chunks/app/layout-8bfac4724277b47f.js +0 -1
  811. package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
  812. package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
  813. package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
  814. package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
  815. package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
  816. package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
  817. package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +0 -1
  818. /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
  819. /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
@@ -89,6 +89,13 @@
89
89
  * checks it still owns the composer before every key, watches an `unseen`
90
90
  * paste a little longer before giving up, and leaves a mark for a body that
91
91
  * may still arrive, which the next send waits out ({@link waitOutCarriedPaste}).
92
+ *
93
+ * Issue #4035 is a claude session's first prompt reported sent when it was
94
+ * not. Keys typed right after the prompt appeared were drawn ~1 s later and
95
+ * their Enter was lost, while the read-back still showed the dim placeholder
96
+ * (rule F). On that first prompt a B or F verdict now waits for claude's own
97
+ * `UserPromptSubmit` ({@link awaitPromptReport}), and a later send that clears
98
+ * a body this one called sent says so ({@link reportSubmittedBodyInComposer}).
92
99
  */
93
100
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
94
101
  if (k2 === undefined) k2 = k;
@@ -124,67 +131,42 @@ var __importStar = (this && this.__importStar) || (function () {
124
131
  };
125
132
  })();
126
133
  Object.defineProperty(exports, "__esModule", { value: true });
127
- exports.LITERAL_SEND_MAX_BYTES = exports.isSubmitted = exports.classifySubmit = exports.classifyPasteLanded = exports.recheckComposerBeforeInput = void 0;
134
+ exports.promptUnreportedResendNote = exports.PROMPT_UNREPORTED_RESEND_NOTE = exports.PROMPT_REPORT_WAIT_MS = exports.PROMPT_REPORT_POLL_MS = exports.LITERAL_SEND_MAX_BYTES = exports.INPUT_READINESS_UNDER_LOCK_WAIT_MS = exports.isSubmitted = exports.classifySubmitWithRule = exports.classifySubmit = exports.classifyPasteLanded = exports.recheckComposerBeforeInput = void 0;
128
135
  exports.clearComposerBeforeSend = clearComposerBeforeSend;
129
136
  exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
130
137
  const childProcess = __importStar(require("child_process"));
131
138
  const tmux_1 = require("../tmux/tmux");
132
139
  const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
133
140
  const composer_spec_1 = require("./composer-spec");
134
- const cli_patterns_1 = require("../detection/cli-patterns");
135
141
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
136
- const logger_1 = require("../../lib/logger");
137
142
  const global_state_1 = require("../../lib/global-state");
138
143
  const composer_clear_1 = require("../../lib/session/composer-clear");
139
144
  Object.defineProperty(exports, "recheckComposerBeforeInput", { enumerable: true, get: function () { return composer_clear_1.recheckComposerBeforeInput; } });
145
+ const prompt_submit_receipt_1 = require("../../lib/session/prompt-submit-receipt");
146
+ const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
140
147
  const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
141
148
  const composer_text_1 = require("../../lib/detection/composer-text");
142
149
  const submit_composer_read_1 = require("./submit-composer-read");
150
+ const submit_verified_sender_shared_1 = require("./submit-verified-sender-shared");
151
+ const submit_verified_sender_lock_1 = require("./submit-verified-sender-lock");
152
+ const submit_verified_sender_composer_1 = require("./submit-verified-sender-composer");
153
+ const submit_verified_sender_report_1 = require("./submit-verified-sender-report");
143
154
  // Issue #3963: the composer reads moved to `submit-composer-read`; re-exported
144
155
  // so every caller and test keeps importing them from here.
145
156
  var submit_composer_read_2 = require("./submit-composer-read");
146
157
  Object.defineProperty(exports, "classifyPasteLanded", { enumerable: true, get: function () { return submit_composer_read_2.classifyPasteLanded; } });
147
158
  Object.defineProperty(exports, "classifySubmit", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmit; } });
159
+ Object.defineProperty(exports, "classifySubmitWithRule", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmitWithRule; } });
148
160
  Object.defineProperty(exports, "isSubmitted", { enumerable: true, get: function () { return submit_composer_read_2.isSubmitted; } });
149
- const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
150
- /**
151
- * Largest body typed as keystrokes (`send-keys -l`); anything longer is pasted
152
- * (Issue #2464).
153
- *
154
- * The limit is the pty's, not tmux's. tmux hands the pane the whole argv —
155
- * 16,320 bytes arrived intact on tmux 3.5a, and past ~16.3 KB `send-keys`
156
- * refuses with `command too long`, loudly — but the TUI reads it back in
157
- * pty-sized pieces, 1,022 bytes each on macOS. Claude Code keeps only the last
158
- * piece of unbracketed input (`12288 mod 1022` = the 24 bytes that arrived of a
159
- * 12 KB brief), so a body is only safe as keystrokes while it fits in a single
160
- * read. Half the smallest read measured leaves room for multi-byte text and for
161
- * a platform whose reads are shorter.
162
- */
163
- exports.LITERAL_SEND_MAX_BYTES = 512;
164
- /**
165
- * How often the composer is read while a pasted body is expected to appear in
166
- * it. Claude, codex, Command Code and agy all drew the pasted body within
167
- * 60 ms of `paste-buffer` on a 12 KB brief.
168
- */
169
- const PASTE_LANDED_POLL_MS = 100;
170
- /** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
171
- const DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
172
- /**
173
- * How often the composer is read while a TYPED body is expected to appear in it
174
- * (Issue #3366). codex draws a burst of keystrokes all at once when the burst
175
- * ends, so the poll only decides how late after that moment Enter goes in.
176
- */
177
- const TYPED_BODY_POLL_MS = 50;
178
- /**
179
- * Composer reads before a typed body that has not appeared is abandoned (5 s).
180
- *
181
- * codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
182
- * per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
183
- * so this is roughly twice the slowest draw measured, for a loaded machine.
184
- */
185
- const DEFAULT_TYPED_BODY_ATTEMPTS = 100;
186
- /** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
187
- const PASTE_COMMAND_TIMEOUT_MS = 5000;
161
+ // Issue #4056: the constants, option types and helpers moved to
162
+ // `submit-verified-sender-*.ts`; the public ones are re-exported from here.
163
+ var submit_verified_sender_shared_2 = require("./submit-verified-sender-shared");
164
+ Object.defineProperty(exports, "INPUT_READINESS_UNDER_LOCK_WAIT_MS", { enumerable: true, get: function () { return submit_verified_sender_shared_2.INPUT_READINESS_UNDER_LOCK_WAIT_MS; } });
165
+ Object.defineProperty(exports, "LITERAL_SEND_MAX_BYTES", { enumerable: true, get: function () { return submit_verified_sender_shared_2.LITERAL_SEND_MAX_BYTES; } });
166
+ Object.defineProperty(exports, "PROMPT_REPORT_POLL_MS", { enumerable: true, get: function () { return submit_verified_sender_shared_2.PROMPT_REPORT_POLL_MS; } });
167
+ Object.defineProperty(exports, "PROMPT_REPORT_WAIT_MS", { enumerable: true, get: function () { return submit_verified_sender_shared_2.PROMPT_REPORT_WAIT_MS; } });
168
+ Object.defineProperty(exports, "PROMPT_UNREPORTED_RESEND_NOTE", { enumerable: true, get: function () { return submit_verified_sender_shared_2.PROMPT_UNREPORTED_RESEND_NOTE; } });
169
+ Object.defineProperty(exports, "promptUnreportedResendNote", { enumerable: true, get: function () { return submit_verified_sender_shared_2.promptUnreportedResendNote; } });
188
170
  /**
189
171
  * Makes each send's tmux paste buffer name unique within this process — on
190
172
  * `globalThis` (Issue #3945 review #11): tmux buffers are server-wide, and a
@@ -193,20 +175,10 @@ const PASTE_COMMAND_TIMEOUT_MS = 5000;
193
175
  * `load-buffer` overwriting the first before its `paste-buffer`).
194
176
  */
195
177
  const pasteBufferSeq = (0, global_state_1.getOrInitGlobal)('__submitPasteBufferSeq', () => ({ last: 0 }));
196
- /**
197
- * Rows read for the re-check under the input lock (Issue #3945). The same
198
- * capture `clearComposer` takes for its first read, so on a tool that clears
199
- * before sending that read is the re-check's frame and no extra read is made.
200
- */
201
- const RECHECK_CAPTURE_LINES = 200;
202
- /** How often a send waiting out a carried paste mark reads the composer (Issue #3945). */
203
- const CARRIED_MARK_POLL_MS = 200;
204
- /** Default bounded recovery Enters (each read back) before giving up (throwing). */
205
- const DEFAULT_VERIFY_ATTEMPTS = 4;
206
178
  /** Run one tmux command, optionally feeding it `input` on stdin. */
207
179
  function runTmux(args, input) {
208
180
  return new Promise((resolve, reject) => {
209
- const child = childProcess.execFile('tmux', args, { timeout: PASTE_COMMAND_TIMEOUT_MS }, (error) => {
181
+ const child = childProcess.execFile('tmux', args, { timeout: submit_verified_sender_shared_1.PASTE_COMMAND_TIMEOUT_MS }, (error) => {
210
182
  if (error) {
211
183
  reject(error);
212
184
  return;
@@ -234,6 +206,12 @@ function runTmux(args, input) {
234
206
  * `load-buffer` ran. A lost ticket drops the buffer and throws before anything
235
207
  * reaches the pane (`input lock lost, nothing was typed`).
236
208
  *
209
+ * Issue #4011: a failed `load-buffer` throws with `delivery: 'not-started'`
210
+ * (the field `TmuxSendError` carries) — it runs before `paste-buffer`, so none
211
+ * of the body reached the pane, however it failed (an exit status or a timeout).
212
+ * Issue #4031: worded `Failed to load message into tmux buffer` and coded
213
+ * `PASTE_NOT_STARTED_CODE`, so `classifySendFailure` records it `not-sent`.
214
+ *
237
215
  * @throws Error when either tmux command fails, or `ticket` lost the composer
238
216
  */
239
217
  async function pasteBody(sessionName, message, ticket, cliToolId) {
@@ -245,11 +223,17 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
245
223
  catch (error) {
246
224
  await runTmux(['delete-buffer', '-b', bufferName]).catch(() => undefined);
247
225
  const errorMessage = error instanceof Error ? error.message : String(error);
248
- throw new Error(`Failed to paste message into tmux session: ${errorMessage}`);
226
+ // Issue #4031: its own wording and code, apart from `paste-buffer`'s
227
+ // failure below (whose body may be on the pane), so the send is recorded
228
+ // `not-sent` with or without a bound relay.
229
+ throw Object.assign(new Error(`Failed to load message into tmux buffer: ${errorMessage}`), {
230
+ delivery: 'not-started',
231
+ code: send_attempt_types_1.PASTE_NOT_STARTED_CODE,
232
+ });
249
233
  }
250
234
  if (!ticket.isCurrent()) {
251
235
  await runTmux(['delete-buffer', '-b', bufferName]).catch(() => undefined);
252
- assertInputOwner(ticket, cliToolId, 'paste-buffer', false);
236
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'paste-buffer', false);
253
237
  }
254
238
  // Issue #3953: the send's stamp, as the typed branch takes it — after
255
239
  // `load-buffer` (up to its timeout), right before the body reaches the pane.
@@ -272,16 +256,6 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
272
256
  }
273
257
  }
274
258
  /** The composer's first row, for an error message a person has to act on. */
275
- function describeComposer(output, cliToolId, composerSpec, message) {
276
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
277
- const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
278
- if (composer.kind === 'absent')
279
- return 'no composer on screen';
280
- if (composer.kind === 'empty')
281
- return 'an empty composer';
282
- const text = composer.text.length > 80 ? `${composer.text.slice(0, 80)}…` : composer.text;
283
- return JSON.stringify(text);
284
- }
285
259
  /**
286
260
  * Take a body that did not arrive intact back out of the composer, best effort.
287
261
  *
@@ -298,7 +272,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
298
272
  // no longer current means another writer owns the composer now, and what it
299
273
  // holds is that writer's.
300
274
  if (!ticket.isCurrent()) {
301
- logger.error('paste-withdraw-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
275
+ submit_verified_sender_shared_1.logger.error('paste-withdraw-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
302
276
  return false;
303
277
  }
304
278
  try {
@@ -311,7 +285,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
311
285
  return false;
312
286
  }
313
287
  catch (clearError) {
314
- logger.error('paste-withdraw-failed', {
288
+ submit_verified_sender_shared_1.logger.error('paste-withdraw-failed', {
315
289
  sessionName,
316
290
  cliToolId,
317
291
  error: clearError instanceof Error ? clearError.message : String(clearError),
@@ -319,23 +293,6 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
319
293
  return false;
320
294
  }
321
295
  }
322
- /**
323
- * Throw unless `ticket` still owns the composer (Issue #3945 stage 3). Called
324
- * right before every key a send sends — body, paste, each Enter — so work still
325
- * in flight after its ownership ended cannot reach the next owner's composer.
326
- *
327
- * @param typed - Whether any of the body may already be in the composer, which
328
- * decides how the failure classifies (`not-sent` before the body only).
329
- */
330
- function assertInputOwner(ticket, cliToolId, step, typed) {
331
- if (ticket.isCurrent())
332
- return;
333
- logger.error('input-lock-lost', { sessionName: ticket.sessionName, cliToolId, step, generation: ticket.generation });
334
- if (!typed) {
335
- throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
336
- }
337
- throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; part of the message may be in its composer (Issue #3945).`);
338
- }
339
296
  /**
340
297
  * Hold off typing while a carried paste mark is fresh (Issue #3945 stage 4).
341
298
  *
@@ -352,7 +309,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
352
309
  const mark = (0, instance_input_lock_1.getCarriedPasteMark)(sessionName);
353
310
  if (mark === null)
354
311
  return false;
355
- logger.warn('carried-paste-mark-wait', {
312
+ submit_verified_sender_shared_1.logger.warn('carried-paste-mark-wait', {
356
313
  sessionName,
357
314
  cliToolId,
358
315
  originGeneration: mark.originGeneration,
@@ -360,13 +317,13 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
360
317
  remainingMs: mark.expiresAt - Date.now(),
361
318
  });
362
319
  while (Date.now() < mark.expiresAt) {
363
- await new Promise((resolve) => setTimeout(resolve, Math.min(CARRIED_MARK_POLL_MS, mark.expiresAt - Date.now())));
320
+ await new Promise((resolve) => setTimeout(resolve, Math.min(submit_verified_sender_shared_1.CARRIED_MARK_POLL_MS, mark.expiresAt - Date.now())));
364
321
  if (!composer.clearBeforeSend)
365
322
  continue;
366
- assertInputOwner(ticket, cliToolId, 'the carried paste wait', false);
323
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the carried paste wait', false);
367
324
  let frame;
368
325
  try {
369
- frame = await (0, tmux_1.capturePane)(sessionName, RECHECK_CAPTURE_LINES);
326
+ frame = await (0, tmux_1.capturePane)(sessionName, submit_verified_sender_shared_1.RECHECK_CAPTURE_LINES);
370
327
  }
371
328
  catch {
372
329
  // The re-check after the wait decides about a pane that cannot be read.
@@ -379,7 +336,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
379
336
  beforePass: () => ticket.isCurrent(),
380
337
  });
381
338
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
382
- logger.warn('carried-paste-withdrawn', {
339
+ submit_verified_sender_shared_1.logger.warn('carried-paste-withdrawn', {
383
340
  sessionName,
384
341
  cliToolId,
385
342
  originGeneration: mark.originGeneration,
@@ -390,12 +347,6 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
390
347
  (0, instance_input_lock_1.clearExpiredCarriedPasteMark)(ticket);
391
348
  return true;
392
349
  }
393
- /** Whether the composer in `output` holds any text at all, read as the sender reads it. */
394
- function composerHoldsText(output, cliToolId, composerSpec, message) {
395
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
396
- return ((0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message)
397
- .kind === 'text');
398
- }
399
350
  /**
400
351
  * Wait until the composer shows the whole pasted body; decide whether Enter
401
352
  * may be pressed (Issue #2464).
@@ -437,20 +388,20 @@ async function confirmPasteLanded(params) {
437
388
  let lateAfterMs = null;
438
389
  try {
439
390
  for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
440
- await new Promise((resolve) => setTimeout(resolve, PASTE_LANDED_POLL_MS));
391
+ await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS));
441
392
  output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
442
393
  state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
443
394
  if (state === 'landed' || state === 'mismatch')
444
395
  break;
445
396
  }
446
397
  if (state === 'unseen' && composer.clearBeforeSend) {
447
- const observeAttempts = Math.ceil(instance_input_lock_1.LATE_PASTE_OBSERVE_MS / PASTE_LANDED_POLL_MS);
398
+ const observeAttempts = Math.ceil(instance_input_lock_1.LATE_PASTE_OBSERVE_MS / submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS);
448
399
  for (let attempt = 1; attempt <= observeAttempts; attempt++) {
449
- await new Promise((resolve) => setTimeout(resolve, PASTE_LANDED_POLL_MS));
400
+ await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS));
450
401
  output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
451
402
  state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
452
403
  if (state !== 'unseen') {
453
- lateAfterMs = attempt * PASTE_LANDED_POLL_MS;
404
+ lateAfterMs = attempt * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS;
454
405
  break;
455
406
  }
456
407
  }
@@ -462,18 +413,18 @@ async function confirmPasteLanded(params) {
462
413
  if (readError === null && lateAfterMs === null && state === 'landed')
463
414
  return;
464
415
  if (readError === null && state === 'unseen' && !composer.clearBeforeSend) {
465
- logger.warn('paste-landed-unverified', { sessionName, cliToolId, bytes: Buffer.byteLength(message, 'utf8') });
416
+ submit_verified_sender_shared_1.logger.warn('paste-landed-unverified', { sessionName, cliToolId, bytes: Buffer.byteLength(message, 'utf8') });
466
417
  return;
467
418
  }
468
419
  const bytes = Buffer.byteLength(message, 'utf8');
469
420
  const lineCount = message.split('\n').length;
470
- const shown = readError === null ? describeComposer(output, cliToolId, composer, message) : 'an unreadable pane';
421
+ const shown = readError === null ? (0, submit_verified_sender_composer_1.describeComposer)(output, cliToolId, composer, message) : 'an unreadable pane';
471
422
  const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
472
423
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
473
424
  const mayStillArrive = readError !== null || state === 'unseen' || state === 'pasting' || !withdrawn;
474
425
  if (mayStillArrive)
475
426
  (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
476
- logger.error('paste-not-landed', {
427
+ submit_verified_sender_shared_1.logger.error('paste-not-landed', {
477
428
  sessionName,
478
429
  cliToolId,
479
430
  state,
@@ -488,50 +439,15 @@ async function confirmPasteLanded(params) {
488
439
  const what = readError !== null
489
440
  ? `the composer could not be read while the paste was checked (${readError})`
490
441
  : lateAfterMs !== null
491
- ? `the paste appeared ${lateAfterMs}ms after the ${attempts * PASTE_LANDED_POLL_MS}ms check and was taken back out (the composer showed ${shown})`
442
+ ? `the paste appeared ${lateAfterMs}ms after the ${attempts * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS}ms check and was taken back out (the composer showed ${shown})`
492
443
  : state === 'mismatch'
493
444
  ? `the composer does not hold the message as sent (it shows ${shown})`
494
445
  : state === 'pasting'
495
- ? `the paste had not finished arriving after ${attempts * PASTE_LANDED_POLL_MS}ms (the composer shows ${shown})`
446
+ ? `the paste had not finished arriving after ${attempts * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS}ms (the composer shows ${shown})`
496
447
  : `the message never appeared in the composer (${shown})`;
497
448
  throw new Error(`Message body did not arrive intact for session ${sessionName}: ${what}; the message is ${bytes} bytes / ${lineCount} lines. ` +
498
449
  'Enter was not pressed, so nothing was submitted (Issue #2464).');
499
450
  }
500
- /**
501
- * Whether the composer shows a paste placeholder whose count is not this body's
502
- * (Issue #3945): one counting fewer or more, or more than one placeholder.
503
- */
504
- function composerShowsForeignPasteToken(output, cliToolId, message, composerSpec) {
505
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
506
- const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
507
- if (composer.kind !== 'text')
508
- return false;
509
- if (!composer.rows.some((row) => (0, submit_composer_read_1.findPasteTokens)(row).tokens.length > 0))
510
- return false;
511
- return (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composerSpec) !== 'landed';
512
- }
513
- /**
514
- * The part of a typed body the composer reader can see (Issue #3366).
515
- *
516
- * The codex reader takes the composer as one run of non-blank rows, so a blank
517
- * line inside the body ends what it returns: what it can show is the body up to
518
- * its first blank line after the first non-blank one. Leading blank lines are
519
- * kept — they are drawn as composer rows of their own and compact to nothing.
520
- */
521
- function visibleTypedBody(message) {
522
- const lines = message.split('\n');
523
- const first = lines.findIndex((line) => line.trim() !== '');
524
- if (first < 0)
525
- return '';
526
- const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
527
- return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
528
- }
529
- /** Whether the whole codex composer, read past the bounded readers (Issue #3906), is exactly `message`. */
530
- function codexComposerShowsWholeBody(output, message, composerSpec) {
531
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
532
- const composer = (0, submit_composer_read_1.readSubmitComposer)(output, 'codex', composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
533
- return composer.kind === 'text' && composer.region !== undefined && (0, submit_composer_read_1.compactText)(composer.region) === (0, submit_composer_read_1.compactText)(message);
534
- }
535
451
  /**
536
452
  * Wait until the composer shows the typed body; only then may Enter be pressed
537
453
  * (Issue #3366).
@@ -557,21 +473,21 @@ function codexComposerShowsWholeBody(output, message, composerSpec) {
557
473
  */
558
474
  async function confirmTypedBodyLanded(params) {
559
475
  const { sessionName, message, cliToolId, composer, attempts, ticket } = params;
560
- const expected = (0, submit_composer_read_1.compactText)(visibleTypedBody(message));
476
+ const expected = (0, submit_composer_read_1.compactText)((0, submit_verified_sender_composer_1.visibleTypedBody)(message));
561
477
  if (expected === '')
562
478
  return;
563
479
  let output = '';
564
480
  let readError = null;
565
481
  try {
566
482
  for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
567
- await new Promise((resolve) => setTimeout(resolve, TYPED_BODY_POLL_MS));
483
+ await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.TYPED_BODY_POLL_MS));
568
484
  output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
569
485
  // Issue #3906: on codex the whole composer must show the whole body. The
570
486
  // extractor's excerpt stops at the first blank row, so its match is only
571
487
  // the first paragraph — a five-paragraph body with one paragraph drawn
572
488
  // would pass on it — and it cannot reach a body of more than four blocks.
573
489
  if (cliToolId === 'codex') {
574
- if (codexComposerShowsWholeBody(output, message, composer))
490
+ if ((0, submit_verified_sender_composer_1.codexComposerShowsWholeBody)(output, message, composer))
575
491
  return;
576
492
  continue;
577
493
  }
@@ -584,19 +500,19 @@ async function confirmTypedBodyLanded(params) {
584
500
  readError = error instanceof Error ? error.message : String(error);
585
501
  }
586
502
  const bytes = Buffer.byteLength(message, 'utf8');
587
- const shown = readError === null ? describeComposer(output, cliToolId, composer, message) : 'an unreadable pane';
503
+ const shown = readError === null ? (0, submit_verified_sender_composer_1.describeComposer)(output, cliToolId, composer, message) : 'an unreadable pane';
588
504
  // Issue #3945: a body never seen (codex can draw a burst late), a read that
589
505
  // threw, or a withdrawal that was not confirmed may still put text in the
590
506
  // composer after this throw — the next send waits that out.
591
- const seen = readError === null && composerHoldsText(output, cliToolId, composer, message);
507
+ const seen = readError === null && (0, submit_verified_sender_composer_1.composerHoldsText)(output, cliToolId, composer, message);
592
508
  const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
593
509
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
594
510
  const mayStillArrive = !seen || !withdrawn;
595
511
  if (mayStillArrive)
596
512
  (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
597
- logger.error('typed-body-not-landed', { sessionName, cliToolId, bytes, attempts, shown, readError, carried: mayStillArrive });
513
+ submit_verified_sender_shared_1.logger.error('typed-body-not-landed', { sessionName, cliToolId, bytes, attempts, shown, readError, carried: mayStillArrive });
598
514
  throw new Error(`Message body did not appear in the composer for session ${sessionName} within ` +
599
- `${attempts * TYPED_BODY_POLL_MS}ms (it shows ${shown}); the message is ${bytes} bytes. ` +
515
+ `${attempts * submit_verified_sender_shared_1.TYPED_BODY_POLL_MS}ms (it shows ${shown}); the message is ${bytes} bytes. ` +
600
516
  'Enter was not pressed, so nothing was submitted (Issue #3366).');
601
517
  }
602
518
  /**
@@ -657,9 +573,10 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
657
573
  ...(ticket !== undefined ? { beforePass: () => ticket.isCurrent() } : {}),
658
574
  });
659
575
  if (ticket !== undefined)
660
- assertInputOwner(ticket, cliToolId, 'the pre-send clear', false);
576
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the pre-send clear', false);
577
+ (0, submit_verified_sender_report_1.reportSubmittedBodyInComposer)(sessionName, cliToolId, result.discardedText, result.state !== 'content', options.target);
661
578
  if (result.state === 'content') {
662
- logger.error('pre-send-composer-clear-failed', {
579
+ submit_verified_sender_shared_1.logger.error('pre-send-composer-clear-failed', {
663
580
  sessionName,
664
581
  cliToolId,
665
582
  passes: result.passes,
@@ -673,7 +590,7 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
673
590
  // The only record of what was thrown away. `remainingText` is the FINAL
674
591
  // read and is empty on this path by definition, which is why clearComposer
675
592
  // reports `discardedText` separately.
676
- logger.warn('pre-send-composer-cleared', {
593
+ submit_verified_sender_shared_1.logger.warn('pre-send-composer-cleared', {
677
594
  sessionName,
678
595
  cliToolId,
679
596
  passes: result.passes,
@@ -709,11 +626,18 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
709
626
  * when the composer was not free in time (nothing typed).
710
627
  */
711
628
  async function sendMessageWithSubmitVerification(params) {
712
- await (0, instance_input_lock_1.withInstanceInputLock)(params.sessionName, (ticket) => sendUnderInputLock(params, ticket));
629
+ await (0, instance_input_lock_1.withInstanceInputLock)(params.sessionName, (ticket) => {
630
+ // Issue #4065: the body's generation, told to the request before any key
631
+ // (and kept by it if the send throws). The same ticket when this joins the
632
+ // send service's outer lock (claude / codex), so it is told once more,
633
+ // with the same number.
634
+ (0, instance_input_lock_1.noteInputTicket)(ticket);
635
+ return sendUnderInputLock(params, ticket);
636
+ });
713
637
  }
714
638
  async function sendUnderInputLock(params, ticket) {
715
- const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, pasteLandedAttempts = DEFAULT_PASTE_LANDED_ATTEMPTS, awaitTypedBody = false, typedBodyAttempts = DEFAULT_TYPED_BODY_ATTEMPTS, } = params;
716
- const submitEnterCount = params.submitEnterCount ?? composer.submitEnterCount;
639
+ const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = submit_verified_sender_shared_1.DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, pasteLandedAttempts = submit_verified_sender_shared_1.DEFAULT_PASTE_LANDED_ATTEMPTS, awaitTypedBody = false, typedBodyAttempts = submit_verified_sender_shared_1.DEFAULT_TYPED_BODY_ATTEMPTS, target, } = params;
640
+ const submitEnterCount = (0, submit_verified_sender_report_1.resolveSubmitEnterCount)(params, composer);
717
641
  // -1. Issue #3945 (review-1 #4): every send re-reads the pane once it owns
718
642
  // the composer, whether or not it queued — the prompt guard and the
719
643
  // tool's readiness wait ran before the lock, and a dialog can open in the
@@ -727,24 +651,30 @@ async function sendUnderInputLock(params, ticket) {
727
651
  if (await waitOutCarriedPaste(sessionName, cliToolId, composer, ticket)) {
728
652
  frame = await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, cliToolId);
729
653
  }
654
+ // Issue #4040: the tool's readiness, asked again of that same newest frame.
655
+ // A dialog was refused just above (and is, at once, on every re-read); this
656
+ // refuses a pane that went back to loading, or still shows the picker of the
657
+ // send before, after the tool's own wait said "ready".
658
+ frame = await (0, submit_verified_sender_lock_1.awaitReadyUnderLock)(params.readiness, frame, { sessionName, cliToolId, ticket });
730
659
  // 0. Empty the composer first (Issue #1880). The body below is typed at the
731
660
  // TUI's current cursor position, so anything already in the box would be
732
661
  // spliced into it. Throws for a claude composer that could not be emptied.
733
- await clearComposerBeforeSend(sessionName, cliToolId, composer, { initialCapture: frame, ticket });
734
- if (Buffer.byteLength(message, 'utf8') > exports.LITERAL_SEND_MAX_BYTES) {
662
+ await clearComposerBeforeSend(sessionName, cliToolId, composer, {
663
+ initialCapture: frame,
664
+ ticket,
665
+ ...(target !== undefined ? { target } : {}),
666
+ });
667
+ if (Buffer.byteLength(message, 'utf8') > submit_verified_sender_shared_1.LITERAL_SEND_MAX_BYTES) {
735
668
  // 1'. A body that would reach the TUI as more than one pty read is pasted
736
669
  // as ONE bracketed paste, and Enter waits until the composer shows all
737
670
  // of it (Issue #2464). Typed, Claude Code would keep only its last read.
738
671
  const pastedAt = Date.now();
739
- assertInputOwner(ticket, cliToolId, 'the paste', false);
672
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the paste', false);
740
673
  try {
741
674
  await pasteBody(sessionName, message, ticket, cliToolId);
742
675
  }
743
676
  catch (error) {
744
- // Whether tmux put any of it into the pane is unknown — except after a
745
- // refused input boundary (Issue #3992), which stops before `paste-buffer`:
746
- // a mark then would only hold the next send off for nothing.
747
- if (!(0, instance_input_lock_1.isInputBoundaryRefusal)(error))
677
+ if ((0, submit_verified_sender_report_1.pasteFailureMayHaveTyped)(error))
748
678
  (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
749
679
  throw error;
750
680
  }
@@ -766,7 +696,7 @@ async function sendUnderInputLock(params, ticket) {
766
696
  // nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
767
697
  // built in `lib/tmux/key-sequence.ts`, which carries the table.
768
698
  const typedAt = Date.now();
769
- assertInputOwner(ticket, cliToolId, 'the body', false);
699
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the body', false);
770
700
  // Issue #3953: the send's stamp is taken here — after the lock, the carried
771
701
  // mark, the re-check and the clear, right before the body's first key — so a
772
702
  // previous turn that ended during any of them is older than this send.
@@ -787,7 +717,7 @@ async function sendUnderInputLock(params, ticket) {
787
717
  // means waiting until the body is drawn (Issue #3366): an Enter pressed
788
718
  // while codex still holds the keystrokes as a paste burst becomes a
789
719
  // newline, and the body stays unsent. The fixed wait stays as a floor.
790
- if (awaitTypedBody && composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId)) {
720
+ if ((0, submit_verified_sender_report_1.shouldAwaitTypedBody)(awaitTypedBody, cliToolId)) {
791
721
  await confirmTypedBodyLanded({ sessionName, message, cliToolId, composer, attempts: typedBodyAttempts, ticket });
792
722
  }
793
723
  const remaining = textInputWaitMs - (Date.now() - typedAt);
@@ -796,8 +726,10 @@ async function sendUnderInputLock(params, ticket) {
796
726
  }
797
727
  }
798
728
  // 3. Submit as a separate command (double Enter for vibe-local's IME mode).
729
+ // Issue #4035: the agent's own report of the prompt counts from here.
730
+ const enteredAt = Date.now();
799
731
  for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
800
- assertInputOwner(ticket, cliToolId, 'Enter', true);
732
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'Enter', true);
801
733
  await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
802
734
  if (i < submitEnterCount - 1) {
803
735
  await new Promise((resolve) => setTimeout(resolve, interEnterWaitMs));
@@ -812,11 +744,40 @@ async function sendUnderInputLock(params, ticket) {
812
744
  // was reported "could not be confirmed" — a sent message as exit 99. The
813
745
  // last read sends nothing: no Enter goes out that is not read back.
814
746
  const attempts = Math.max(1, verifyAttempts);
747
+ // Issue #4035: one wait for the agent's report per send, however many reads.
748
+ let promptReportDeadline = null;
815
749
  for (let attempt = 0; attempt <= attempts; attempt++) {
816
750
  await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
817
- const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
818
- const state = (0, submit_composer_read_1.classifySubmit)(output, cliToolId, message, composer);
751
+ let output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
752
+ // Issue #4048: a frame read after the session was replaced is the new
753
+ // process's, and so would be its hooks — neither says anything about this
754
+ // send, whose Enter went to the old one (indeterminate, not `not-sent`).
755
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the read-back');
756
+ let { state, rule } = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
757
+ const receipt = (0, submit_verified_sender_report_1.promptReceiptFor)({ state, rule, message, sessionName, cliToolId, enteredAt, target });
758
+ // Issue #4035: every verdict names the rule that gave it, so a send reported
759
+ // `sent` can be traced to what the screen showed.
760
+ submit_verified_sender_shared_1.logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt });
761
+ if (receipt === 'awaited') {
762
+ // Issue #4035: the screen says only that the body is not in the composer,
763
+ // on a session that has not reported a prompt yet. Watch, without Enter,
764
+ // until the agent reports it or the composer shows the body after all.
765
+ promptReportDeadline ??= Date.now() + submit_verified_sender_shared_1.PROMPT_REPORT_WAIT_MS;
766
+ const watched = await (0, submit_verified_sender_report_1.awaitPromptReport)({
767
+ sessionName,
768
+ message,
769
+ cliToolId,
770
+ composer,
771
+ enteredAt,
772
+ rule,
773
+ deadline: promptReportDeadline,
774
+ ticket,
775
+ ...(target !== undefined ? { target } : {}),
776
+ });
777
+ ({ state, rule, output } = (0, submit_verified_sender_report_1.settleAwaitedPromptReport)({ watched, sessionName, cliToolId, attempt, rule, output, target }));
778
+ }
819
779
  if (state === 'submitted') {
780
+ (0, submit_verified_sender_report_1.rememberScreenOnlySubmit)({ sessionName, cliToolId, enteredAt, message, ticket, target });
820
781
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
821
782
  return;
822
783
  }
@@ -831,48 +792,43 @@ async function sendUnderInputLock(params, ticket) {
831
792
  await (0, tmux_1.clearInputLine)(sessionName);
832
793
  }
833
794
  else {
834
- logger.error('submit-clear-input-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
795
+ submit_verified_sender_shared_1.logger.error('submit-clear-input-skipped-not-owner', { sessionName, cliToolId, generation: ticket.generation });
835
796
  }
836
797
  }
837
798
  catch (clearError) {
838
- logger.error('submit-clear-input-failed', {
839
- sessionName,
840
- cliToolId,
841
- error: clearError instanceof Error ? clearError.message : String(clearError),
842
- });
799
+ (0, submit_verified_sender_report_1.logClearInputFailed)(sessionName, cliToolId, clearError);
843
800
  }
844
801
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
845
- logger.error('submit-replaced-by-tui-completion', { sessionName, cliToolId, attempt });
802
+ submit_verified_sender_shared_1.logger.error('submit-replaced-by-tui-completion', { sessionName, cliToolId, attempt });
846
803
  throw new Error(`Message was replaced by a TUI autocompletion for session ${sessionName}; the input no longer matches the sent text. Cleared the input line without submitting to avoid executing a different command.`);
847
804
  }
848
805
  // state === 'pending' / 'indeterminate' after the final read-back: give up below.
849
806
  if (attempt === attempts)
850
807
  break;
851
- // state === 'indeterminate' (Issue #3906) — no Enter: the composer does not
852
- // show the body, so another Enter could submit whatever it does show.
853
- if (state === 'indeterminate') {
854
- logger.warn('submit-not-confirmed:composer-unreadable', { sessionName, cliToolId, attempt });
855
- continue;
856
- }
857
- // Issue #3945 (review #1): a paste placeholder that does not count this
858
- // body is not this body. It can only be a paste that arrived after the
859
- // initial Enter (a carried send's, past its mark), and another Enter would
860
- // submit it. One that counts exactly this body cannot be told apart: that
861
- // Enter is the accepted gap (LATE_TOKEN_AFTER_ENTER_SAME_COUNT in the tests).
862
- if (composerShowsForeignPasteToken(output, cliToolId, message, composer)) {
863
- logger.warn('submit-not-confirmed:foreign-paste-token', { sessionName, cliToolId, attempt });
808
+ if ((0, submit_verified_sender_report_1.holdsResendEnter)({ state, output, sessionName, cliToolId, message, composer, attempt }))
864
809
  continue;
810
+ // Issue #4035: the Enter thought lost may only have been late — the agent
811
+ // reporting the prompt now means it went, and another Enter would land on an
812
+ // empty composer, or on a dialog that the prompt just opened.
813
+ // Issue #4048: a report read after the session was replaced (during the
814
+ // wait above, say) may be the new generation's own prompt — this send is
815
+ // then indeterminate, never confirmed by it.
816
+ if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt, target) === 'received') {
817
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the prompt report check');
818
+ submit_verified_sender_shared_1.logger.info('submit-confirmed-by-prompt-hook', { sessionName, cliToolId, attempt, rule });
819
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
820
+ return;
865
821
  }
866
822
  // state === 'pending' — still typed-but-unsent, resend a single Enter and re-check.
867
- logger.warn('submit-not-confirmed:resending-enter', {
823
+ submit_verified_sender_shared_1.logger.warn('submit-not-confirmed:resending-enter', {
868
824
  sessionName,
869
825
  cliToolId,
870
826
  attempt,
871
827
  });
872
- assertInputOwner(ticket, cliToolId, 'a resent Enter', true);
828
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'a resent Enter', true);
873
829
  await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
874
830
  }
875
831
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
876
- logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
832
+ submit_verified_sender_shared_1.logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
877
833
  throw new Error(`Message submit could not be confirmed for session ${sessionName} after ${attempts} attempts (typed but unsent)`);
878
834
  }