commandmate 0.49.2 → 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 (704) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +241 -234
  3. package/.next/app-path-routes-manifest.json +19 -18
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  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 -2
  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_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  222. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  225. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
  228. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
  232. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  233. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  235. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  253. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  254. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/worktrees/route.js +1 -1
  277. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  278. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  279. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  285. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  287. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  288. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  289. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  290. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  291. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  292. package/.next/server/app/worktrees/[id]/page.js +10 -10
  293. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  294. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  295. package/.next/server/app-paths-manifest.json +19 -18
  296. package/.next/server/chunks/1308.js +1 -0
  297. package/.next/server/chunks/1656.js +2 -2
  298. package/.next/server/chunks/1957.js +2 -2
  299. package/.next/server/chunks/2119.js +1 -1
  300. package/.next/server/chunks/2445.js +1 -1
  301. package/.next/server/chunks/2897.js +1 -1
  302. package/.next/server/chunks/3417.js +1 -1
  303. package/.next/server/chunks/3801.js +7 -7
  304. package/.next/server/chunks/4207.js +1 -1
  305. package/.next/server/chunks/4490.js +1 -0
  306. package/.next/server/chunks/4911.js +1 -1
  307. package/.next/server/chunks/4936.js +1 -1
  308. package/.next/server/chunks/5209.js +2 -2
  309. package/.next/server/chunks/5350.js +212 -0
  310. package/.next/server/chunks/5354.js +1 -1
  311. package/.next/server/chunks/6130.js +1 -1
  312. package/.next/server/chunks/6401.js +1 -1
  313. package/.next/server/chunks/7023.js +3 -3
  314. package/.next/server/chunks/7905.js +1 -1
  315. package/.next/server/chunks/7926.js +1 -0
  316. package/.next/server/chunks/8581.js +1 -1
  317. package/.next/server/chunks/8728.js +2 -2
  318. package/.next/server/chunks/8782.js +1 -1
  319. package/.next/server/chunks/8807.js +89 -88
  320. package/.next/server/chunks/8918.js +3 -3
  321. package/.next/server/chunks/9169.js +1 -0
  322. package/.next/server/chunks/9390.js +1 -1
  323. package/.next/server/chunks/9584.js +1 -1
  324. package/.next/server/chunks/9627.js +5 -5
  325. package/.next/server/chunks/9702.js +1 -0
  326. package/.next/server/chunks/9731.js +3 -3
  327. package/.next/server/middleware-manifest.json +5 -5
  328. package/.next/server/pages/500.html +1 -1
  329. package/.next/server/server-reference-manifest.json +1 -1
  330. package/.next/static/chunks/{2407-07a237575e1ceb9e.js → 2407-87ec01332344ec2b.js} +1 -1
  331. package/.next/static/chunks/3931-3ef48b8d97357282.js +1 -0
  332. package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +1 -0
  333. package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
  334. package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
  335. package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
  336. package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
  337. package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
  338. package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
  339. package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
  340. package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
  341. package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
  342. package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
  343. package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
  344. package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
  345. package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
  346. package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
  347. package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
  348. package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
  349. package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
  350. package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
  351. package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
  352. package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
  353. package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
  354. package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
  355. package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
  356. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
  357. package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
  358. package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
  359. package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
  360. package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
  361. package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
  362. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
  363. package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
  364. package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
  365. package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
  366. package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
  367. package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
  368. package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
  369. package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
  370. package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
  371. package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
  372. package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
  373. package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
  374. package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
  375. package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
  376. package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
  377. package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
  378. package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
  379. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
  380. package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
  381. package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
  382. package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
  383. package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
  384. package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
  470. package/.next/static/chunks/app/{layout-4f64316957b0a8e5.js → layout-b9d8aef70e4f17b2.js} +1 -1
  471. package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
  472. package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
  473. package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
  474. package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
  475. package/.next/trace +13 -13
  476. package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
  477. package/.next/types/routes.d.ts +2 -1
  478. package/.next/types/validator.ts +9 -0
  479. package/dist/cli/commands/prompt.d.ts.map +1 -1
  480. package/dist/cli/commands/prompt.js +2 -1
  481. package/dist/cli/commands/relays.d.ts +2 -0
  482. package/dist/cli/commands/relays.d.ts.map +1 -1
  483. package/dist/cli/commands/relays.js +142 -5
  484. package/dist/cli/commands/report.d.ts +7 -2
  485. package/dist/cli/commands/report.d.ts.map +1 -1
  486. package/dist/cli/commands/report.js +19 -6
  487. package/dist/cli/commands/respond-strict.d.ts.map +1 -1
  488. package/dist/cli/commands/respond-strict.js +9 -2
  489. package/dist/cli/commands/task.d.ts +22 -0
  490. package/dist/cli/commands/task.d.ts.map +1 -1
  491. package/dist/cli/commands/task.js +26 -18
  492. package/dist/cli/types/api-responses.d.ts +52 -0
  493. package/dist/cli/types/api-responses.d.ts.map +1 -1
  494. package/dist/cli/utils/api-client-deadline.d.ts +28 -0
  495. package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
  496. package/dist/cli/utils/api-client-deadline.js +46 -0
  497. package/dist/cli/utils/api-client-errors.d.ts +118 -0
  498. package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
  499. package/dist/cli/utils/api-client-errors.js +210 -0
  500. package/dist/cli/utils/api-client.d.ts +3 -133
  501. package/dist/cli/utils/api-client.d.ts.map +1 -1
  502. package/dist/cli/utils/api-client.js +30 -257
  503. package/dist/lib/cli-tools/types.d.ts +6 -0
  504. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  505. package/dist/server/locales/en/worktree.json +7 -0
  506. package/dist/server/locales/ja/worktree.json +7 -0
  507. package/dist/server/src/lib/cli-tools/claude.js +8 -2
  508. package/dist/server/src/lib/cli-tools/command-code.js +7 -15
  509. package/dist/server/src/lib/cli-tools/copilot.js +154 -25
  510. package/dist/server/src/lib/cli-tools/opencode.js +157 -6
  511. package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
  512. package/dist/server/src/lib/cli-tools/submit-composer-read.js +41 -8
  513. package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
  514. package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
  515. package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
  516. package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
  517. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +94 -295
  518. package/dist/server/src/lib/cli-tools/vibe-local.js +87 -0
  519. package/dist/server/src/lib/db/chat-db.js +14 -1
  520. package/dist/server/src/lib/db/db-instance.js +114 -2
  521. package/dist/server/src/lib/db/migrations/index.js +2 -0
  522. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  523. package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
  524. package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
  525. package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
  526. package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
  527. package/dist/server/src/lib/db/relay-bind-db.js +88 -167
  528. package/dist/server/src/lib/db/relay-db-base.js +20 -0
  529. package/dist/server/src/lib/db/relay-db-count.js +49 -0
  530. package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
  531. package/dist/server/src/lib/db/relay-db-hold.js +250 -0
  532. package/dist/server/src/lib/db/relay-db.js +33 -92
  533. package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
  534. package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
  535. package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
  536. package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
  537. package/dist/server/src/lib/relay/relay-delivery.js +359 -79
  538. package/dist/server/src/lib/relay/relay-messages.js +13 -0
  539. package/dist/server/src/lib/relay/relay-system-line.js +28 -15
  540. package/dist/server/src/lib/relay/types.js +14 -2
  541. package/dist/server/src/lib/session/claude-session.js +4 -1
  542. package/dist/server/src/lib/session/current-output-builder.js +7 -5
  543. package/dist/server/src/lib/session/instance-input-lock.js +47 -2
  544. package/dist/server/src/lib/session/prompt-submit-receipt.js +87 -18
  545. package/dist/server/src/lib/session/prompt-waiting-guard.js +8 -2
  546. package/dist/server/src/lib/session/respond-target.js +82 -0
  547. package/dist/server/src/lib/session/send-attempt-state.js +130 -3
  548. package/dist/server/src/lib/session/send-user-message.js +78 -7
  549. package/dist/server/src/lib/session/structured-prompt.js +12 -7
  550. package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
  551. package/dist/server/src/lib/session-key-sender.js +6 -1
  552. package/package.json +1 -1
  553. package/release-notes/0.49.3.json +52 -0
  554. package/.next/server/chunks/1062.js +0 -1
  555. package/.next/server/chunks/110.js +0 -1
  556. package/.next/server/chunks/2422.js +0 -1
  557. package/.next/server/chunks/3756.js +0 -1
  558. package/.next/server/chunks/5630.js +0 -1
  559. package/.next/server/chunks/6808.js +0 -4
  560. package/.next/server/chunks/9198.js +0 -144
  561. package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +0 -1
  562. package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
  563. package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
  564. package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
  565. package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
  566. package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
  567. package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
  568. package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
  569. package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
  570. package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
  571. package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
  572. package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
  573. package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
  574. package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
  575. package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
  576. package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
  577. package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
  578. package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
  579. package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
  580. package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
  581. package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
  582. package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
  583. package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
  584. package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
  585. package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
  586. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
  587. package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
  588. package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
  589. package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
  590. package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
  591. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
  592. package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
  593. package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
  594. package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
  595. package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
  596. package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
  597. package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
  598. package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
  599. package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
  600. package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
  601. package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
  602. package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
  603. package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
  604. package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
  605. package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
  606. package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
  607. package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
  608. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
  609. package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
  610. package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
  611. package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
  612. package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
  613. package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
  614. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
  615. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
  616. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
  617. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
  618. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
  619. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
  647. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
  648. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
  649. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
  650. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
  651. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
  670. package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
  671. package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
  672. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
  673. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
  674. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
  675. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
  676. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
  677. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
  678. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
  679. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
  680. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
  681. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
  682. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
  683. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
  684. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
  685. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
  699. package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
  700. package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
  701. package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
  702. package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +0 -1
  703. /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
  704. /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
@@ -131,25 +131,26 @@ var __importStar = (this && this.__importStar) || (function () {
131
131
  };
132
132
  })();
133
133
  Object.defineProperty(exports, "__esModule", { value: true });
134
- exports.PROMPT_REPORT_WAIT_MS = exports.LITERAL_SEND_MAX_BYTES = exports.isSubmitted = exports.classifySubmitWithRule = 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;
135
135
  exports.clearComposerBeforeSend = clearComposerBeforeSend;
136
136
  exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
137
137
  const childProcess = __importStar(require("child_process"));
138
138
  const tmux_1 = require("../tmux/tmux");
139
139
  const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
140
140
  const composer_spec_1 = require("./composer-spec");
141
- const cli_patterns_1 = require("../detection/cli-patterns");
142
141
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
143
- const logger_1 = require("../../lib/logger");
144
142
  const global_state_1 = require("../../lib/global-state");
145
143
  const composer_clear_1 = require("../../lib/session/composer-clear");
146
144
  Object.defineProperty(exports, "recheckComposerBeforeInput", { enumerable: true, get: function () { return composer_clear_1.recheckComposerBeforeInput; } });
147
145
  const prompt_submit_receipt_1 = require("../../lib/session/prompt-submit-receipt");
148
- const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
149
146
  const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
150
147
  const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
151
148
  const composer_text_1 = require("../../lib/detection/composer-text");
152
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");
153
154
  // Issue #3963: the composer reads moved to `submit-composer-read`; re-exported
154
155
  // so every caller and test keeps importing them from here.
155
156
  var submit_composer_read_2 = require("./submit-composer-read");
@@ -157,45 +158,15 @@ Object.defineProperty(exports, "classifyPasteLanded", { enumerable: true, get: f
157
158
  Object.defineProperty(exports, "classifySubmit", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmit; } });
158
159
  Object.defineProperty(exports, "classifySubmitWithRule", { enumerable: true, get: function () { return submit_composer_read_2.classifySubmitWithRule; } });
159
160
  Object.defineProperty(exports, "isSubmitted", { enumerable: true, get: function () { return submit_composer_read_2.isSubmitted; } });
160
- const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
161
- /**
162
- * Largest body typed as keystrokes (`send-keys -l`); anything longer is pasted
163
- * (Issue #2464).
164
- *
165
- * The limit is the pty's, not tmux's. tmux hands the pane the whole argv —
166
- * 16,320 bytes arrived intact on tmux 3.5a, and past ~16.3 KB `send-keys`
167
- * refuses with `command too long`, loudly — but the TUI reads it back in
168
- * pty-sized pieces, 1,022 bytes each on macOS. Claude Code keeps only the last
169
- * piece of unbracketed input (`12288 mod 1022` = the 24 bytes that arrived of a
170
- * 12 KB brief), so a body is only safe as keystrokes while it fits in a single
171
- * read. Half the smallest read measured leaves room for multi-byte text and for
172
- * a platform whose reads are shorter.
173
- */
174
- exports.LITERAL_SEND_MAX_BYTES = 512;
175
- /**
176
- * How often the composer is read while a pasted body is expected to appear in
177
- * it. Claude, codex, Command Code and agy all drew the pasted body within
178
- * 60 ms of `paste-buffer` on a 12 KB brief.
179
- */
180
- const PASTE_LANDED_POLL_MS = 100;
181
- /** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
182
- const DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
183
- /**
184
- * How often the composer is read while a TYPED body is expected to appear in it
185
- * (Issue #3366). codex draws a burst of keystrokes all at once when the burst
186
- * ends, so the poll only decides how late after that moment Enter goes in.
187
- */
188
- const TYPED_BODY_POLL_MS = 50;
189
- /**
190
- * Composer reads before a typed body that has not appeared is abandoned (5 s).
191
- *
192
- * codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
193
- * per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
194
- * so this is roughly twice the slowest draw measured, for a loaded machine.
195
- */
196
- const DEFAULT_TYPED_BODY_ATTEMPTS = 100;
197
- /** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
198
- 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; } });
199
170
  /**
200
171
  * Makes each send's tmux paste buffer name unique within this process — on
201
172
  * `globalThis` (Issue #3945 review #11): tmux buffers are server-wide, and a
@@ -204,29 +175,10 @@ const PASTE_COMMAND_TIMEOUT_MS = 5000;
204
175
  * `load-buffer` overwriting the first before its `paste-buffer`).
205
176
  */
206
177
  const pasteBufferSeq = (0, global_state_1.getOrInitGlobal)('__submitPasteBufferSeq', () => ({ last: 0 }));
207
- /**
208
- * Rows read for the re-check under the input lock (Issue #3945). The same
209
- * capture `clearComposer` takes for its first read, so on a tool that clears
210
- * before sending that read is the re-check's frame and no extra read is made.
211
- */
212
- const RECHECK_CAPTURE_LINES = 200;
213
- /** How often a send waiting out a carried paste mark reads the composer (Issue #3945). */
214
- const CARRIED_MARK_POLL_MS = 200;
215
- /** Default bounded recovery Enters (each read back) before giving up (throwing). */
216
- const DEFAULT_VERIFY_ATTEMPTS = 4;
217
- /**
218
- * How long a B/F verdict on a session's first prompt waits for the agent's own
219
- * report of it (Issue #4035). Claude 2.1.314 reported the first prompt 0.66–0.74 s
220
- * after the send began in all 29 submitted first sends measured; an unsent body
221
- * was drawn into the composer 0.9–1.7 s after its Enter.
222
- */
223
- exports.PROMPT_REPORT_WAIT_MS = 5000;
224
- /** How often the report and the composer are looked at during that wait. */
225
- const PROMPT_REPORT_POLL_MS = 100;
226
178
  /** Run one tmux command, optionally feeding it `input` on stdin. */
227
179
  function runTmux(args, input) {
228
180
  return new Promise((resolve, reject) => {
229
- 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) => {
230
182
  if (error) {
231
183
  reject(error);
232
184
  return;
@@ -281,7 +233,7 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
281
233
  }
282
234
  if (!ticket.isCurrent()) {
283
235
  await runTmux(['delete-buffer', '-b', bufferName]).catch(() => undefined);
284
- assertInputOwner(ticket, cliToolId, 'paste-buffer', false);
236
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'paste-buffer', false);
285
237
  }
286
238
  // Issue #3953: the send's stamp, as the typed branch takes it — after
287
239
  // `load-buffer` (up to its timeout), right before the body reaches the pane.
@@ -304,16 +256,6 @@ async function pasteBody(sessionName, message, ticket, cliToolId) {
304
256
  }
305
257
  }
306
258
  /** The composer's first row, for an error message a person has to act on. */
307
- function describeComposer(output, cliToolId, composerSpec, message) {
308
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
309
- const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
310
- if (composer.kind === 'absent')
311
- return 'no composer on screen';
312
- if (composer.kind === 'empty')
313
- return 'an empty composer';
314
- const text = composer.text.length > 80 ? `${composer.text.slice(0, 80)}…` : composer.text;
315
- return JSON.stringify(text);
316
- }
317
259
  /**
318
260
  * Take a body that did not arrive intact back out of the composer, best effort.
319
261
  *
@@ -330,7 +272,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
330
272
  // no longer current means another writer owns the composer now, and what it
331
273
  // holds is that writer's.
332
274
  if (!ticket.isCurrent()) {
333
- 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 });
334
276
  return false;
335
277
  }
336
278
  try {
@@ -343,7 +285,7 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
343
285
  return false;
344
286
  }
345
287
  catch (clearError) {
346
- logger.error('paste-withdraw-failed', {
288
+ submit_verified_sender_shared_1.logger.error('paste-withdraw-failed', {
347
289
  sessionName,
348
290
  cliToolId,
349
291
  error: clearError instanceof Error ? clearError.message : String(clearError),
@@ -351,23 +293,6 @@ async function withdrawUnsentBody(sessionName, cliToolId, composerSpec, ticket)
351
293
  return false;
352
294
  }
353
295
  }
354
- /**
355
- * Throw unless `ticket` still owns the composer (Issue #3945 stage 3). Called
356
- * right before every key a send sends — body, paste, each Enter — so work still
357
- * in flight after its ownership ended cannot reach the next owner's composer.
358
- *
359
- * @param typed - Whether any of the body may already be in the composer, which
360
- * decides how the failure classifies (`not-sent` before the body only).
361
- */
362
- function assertInputOwner(ticket, cliToolId, step, typed) {
363
- if (ticket.isCurrent())
364
- return;
365
- logger.error('input-lock-lost', { sessionName: ticket.sessionName, cliToolId, step, generation: ticket.generation });
366
- if (!typed) {
367
- throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
368
- }
369
- throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; part of the message may be in its composer (Issue #3945).`);
370
- }
371
296
  /**
372
297
  * Hold off typing while a carried paste mark is fresh (Issue #3945 stage 4).
373
298
  *
@@ -384,7 +309,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
384
309
  const mark = (0, instance_input_lock_1.getCarriedPasteMark)(sessionName);
385
310
  if (mark === null)
386
311
  return false;
387
- logger.warn('carried-paste-mark-wait', {
312
+ submit_verified_sender_shared_1.logger.warn('carried-paste-mark-wait', {
388
313
  sessionName,
389
314
  cliToolId,
390
315
  originGeneration: mark.originGeneration,
@@ -392,13 +317,13 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
392
317
  remainingMs: mark.expiresAt - Date.now(),
393
318
  });
394
319
  while (Date.now() < mark.expiresAt) {
395
- 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())));
396
321
  if (!composer.clearBeforeSend)
397
322
  continue;
398
- assertInputOwner(ticket, cliToolId, 'the carried paste wait', false);
323
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the carried paste wait', false);
399
324
  let frame;
400
325
  try {
401
- 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);
402
327
  }
403
328
  catch {
404
329
  // The re-check after the wait decides about a pane that cannot be read.
@@ -411,7 +336,7 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
411
336
  beforePass: () => ticket.isCurrent(),
412
337
  });
413
338
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
414
- logger.warn('carried-paste-withdrawn', {
339
+ submit_verified_sender_shared_1.logger.warn('carried-paste-withdrawn', {
415
340
  sessionName,
416
341
  cliToolId,
417
342
  originGeneration: mark.originGeneration,
@@ -422,12 +347,6 @@ async function waitOutCarriedPaste(sessionName, cliToolId, composer, ticket) {
422
347
  (0, instance_input_lock_1.clearExpiredCarriedPasteMark)(ticket);
423
348
  return true;
424
349
  }
425
- /** Whether the composer in `output` holds any text at all, read as the sender reads it. */
426
- function composerHoldsText(output, cliToolId, composerSpec, message) {
427
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
428
- return ((0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message)
429
- .kind === 'text');
430
- }
431
350
  /**
432
351
  * Wait until the composer shows the whole pasted body; decide whether Enter
433
352
  * may be pressed (Issue #2464).
@@ -469,20 +388,20 @@ async function confirmPasteLanded(params) {
469
388
  let lateAfterMs = null;
470
389
  try {
471
390
  for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
472
- 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));
473
392
  output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
474
393
  state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
475
394
  if (state === 'landed' || state === 'mismatch')
476
395
  break;
477
396
  }
478
397
  if (state === 'unseen' && composer.clearBeforeSend) {
479
- 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);
480
399
  for (let attempt = 1; attempt <= observeAttempts; attempt++) {
481
- 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));
482
401
  output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
483
402
  state = (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composer);
484
403
  if (state !== 'unseen') {
485
- lateAfterMs = attempt * PASTE_LANDED_POLL_MS;
404
+ lateAfterMs = attempt * submit_verified_sender_shared_1.PASTE_LANDED_POLL_MS;
486
405
  break;
487
406
  }
488
407
  }
@@ -494,18 +413,18 @@ async function confirmPasteLanded(params) {
494
413
  if (readError === null && lateAfterMs === null && state === 'landed')
495
414
  return;
496
415
  if (readError === null && state === 'unseen' && !composer.clearBeforeSend) {
497
- 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') });
498
417
  return;
499
418
  }
500
419
  const bytes = Buffer.byteLength(message, 'utf8');
501
420
  const lineCount = message.split('\n').length;
502
- 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';
503
422
  const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
504
423
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
505
424
  const mayStillArrive = readError !== null || state === 'unseen' || state === 'pasting' || !withdrawn;
506
425
  if (mayStillArrive)
507
426
  (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
508
- logger.error('paste-not-landed', {
427
+ submit_verified_sender_shared_1.logger.error('paste-not-landed', {
509
428
  sessionName,
510
429
  cliToolId,
511
430
  state,
@@ -520,50 +439,15 @@ async function confirmPasteLanded(params) {
520
439
  const what = readError !== null
521
440
  ? `the composer could not be read while the paste was checked (${readError})`
522
441
  : lateAfterMs !== null
523
- ? `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})`
524
443
  : state === 'mismatch'
525
444
  ? `the composer does not hold the message as sent (it shows ${shown})`
526
445
  : state === 'pasting'
527
- ? `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})`
528
447
  : `the message never appeared in the composer (${shown})`;
529
448
  throw new Error(`Message body did not arrive intact for session ${sessionName}: ${what}; the message is ${bytes} bytes / ${lineCount} lines. ` +
530
449
  'Enter was not pressed, so nothing was submitted (Issue #2464).');
531
450
  }
532
- /**
533
- * Whether the composer shows a paste placeholder whose count is not this body's
534
- * (Issue #3945): one counting fewer or more, or more than one placeholder.
535
- */
536
- function composerShowsForeignPasteToken(output, cliToolId, message, composerSpec) {
537
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
538
- const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
539
- if (composer.kind !== 'text')
540
- return false;
541
- if (!composer.rows.some((row) => (0, submit_composer_read_1.findPasteTokens)(row).tokens.length > 0))
542
- return false;
543
- return (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composerSpec) !== 'landed';
544
- }
545
- /**
546
- * The part of a typed body the composer reader can see (Issue #3366).
547
- *
548
- * The codex reader takes the composer as one run of non-blank rows, so a blank
549
- * line inside the body ends what it returns: what it can show is the body up to
550
- * its first blank line after the first non-blank one. Leading blank lines are
551
- * kept — they are drawn as composer rows of their own and compact to nothing.
552
- */
553
- function visibleTypedBody(message) {
554
- const lines = message.split('\n');
555
- const first = lines.findIndex((line) => line.trim() !== '');
556
- if (first < 0)
557
- return '';
558
- const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
559
- return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
560
- }
561
- /** Whether the whole codex composer, read past the bounded readers (Issue #3906), is exactly `message`. */
562
- function codexComposerShowsWholeBody(output, message, composerSpec) {
563
- const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
564
- const composer = (0, submit_composer_read_1.readSubmitComposer)(output, 'codex', composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
565
- return composer.kind === 'text' && composer.region !== undefined && (0, submit_composer_read_1.compactText)(composer.region) === (0, submit_composer_read_1.compactText)(message);
566
- }
567
451
  /**
568
452
  * Wait until the composer shows the typed body; only then may Enter be pressed
569
453
  * (Issue #3366).
@@ -589,21 +473,21 @@ function codexComposerShowsWholeBody(output, message, composerSpec) {
589
473
  */
590
474
  async function confirmTypedBodyLanded(params) {
591
475
  const { sessionName, message, cliToolId, composer, attempts, ticket } = params;
592
- 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));
593
477
  if (expected === '')
594
478
  return;
595
479
  let output = '';
596
480
  let readError = null;
597
481
  try {
598
482
  for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
599
- 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));
600
484
  output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
601
485
  // Issue #3906: on codex the whole composer must show the whole body. The
602
486
  // extractor's excerpt stops at the first blank row, so its match is only
603
487
  // the first paragraph — a five-paragraph body with one paragraph drawn
604
488
  // would pass on it — and it cannot reach a body of more than four blocks.
605
489
  if (cliToolId === 'codex') {
606
- if (codexComposerShowsWholeBody(output, message, composer))
490
+ if ((0, submit_verified_sender_composer_1.codexComposerShowsWholeBody)(output, message, composer))
607
491
  return;
608
492
  continue;
609
493
  }
@@ -616,82 +500,21 @@ async function confirmTypedBodyLanded(params) {
616
500
  readError = error instanceof Error ? error.message : String(error);
617
501
  }
618
502
  const bytes = Buffer.byteLength(message, 'utf8');
619
- 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';
620
504
  // Issue #3945: a body never seen (codex can draw a burst late), a read that
621
505
  // threw, or a withdrawal that was not confirmed may still put text in the
622
506
  // composer after this throw — the next send waits that out.
623
- 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);
624
508
  const withdrawn = await withdrawUnsentBody(sessionName, cliToolId, composer, ticket);
625
509
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
626
510
  const mayStillArrive = !seen || !withdrawn;
627
511
  if (mayStillArrive)
628
512
  (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
629
- 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 });
630
514
  throw new Error(`Message body did not appear in the composer for session ${sessionName} within ` +
631
- `${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. ` +
632
516
  'Enter was not pressed, so nothing was submitted (Issue #3366).');
633
517
  }
634
- /**
635
- * Whether a verdict is one the agent's own report must back (Issue #4035):
636
- * `submitted` from B or F — the screen saying only that the body is not in the
637
- * composer. A (generating) stands on its own. A body starting with `/` or `!`
638
- * is run by the TUI itself, which is not measured to report it as a prompt.
639
- */
640
- function needsPromptReport(state, rule, message) {
641
- if (state !== 'submitted' || rule === 'A')
642
- return false;
643
- return !/^\s*[/!]/.test(message);
644
- }
645
- /**
646
- * Watch a session's first prompt until the agent reports it (Issue #4035).
647
- *
648
- * Reads the hook record and the composer every {@link PROMPT_REPORT_POLL_MS}
649
- * until `deadline`, without pressing anything. The deadline is the send's, not
650
- * the call's: a send that waits again after a resent Enter gets only what is
651
- * left of its {@link PROMPT_REPORT_WAIT_MS} (it holds the input lock meanwhile).
652
- *
653
- * - the agent reported the prompt — `received`;
654
- * - the screen changes its verdict — generating (A), or the body drawn into
655
- * the composer after all (C/D, `pending`: the caller resends Enter, as for
656
- * any typed-but-unsent body), or a completion (E) — `screen`, with the frame;
657
- * - neither, to the end — `unreported`: nothing says the message left.
658
- */
659
- async function awaitPromptReport(params) {
660
- const { sessionName, message, cliToolId, composer, enteredAt, deadline } = params;
661
- let rule = params.rule;
662
- while (Date.now() < deadline) {
663
- await new Promise((resolve) => setTimeout(resolve, PROMPT_REPORT_POLL_MS));
664
- if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) === 'received')
665
- return { verdict: 'received' };
666
- const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
667
- const verdict = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
668
- if (verdict.state !== 'submitted' || verdict.rule === 'A')
669
- return { verdict: 'screen', ...verdict, output };
670
- rule = verdict.rule;
671
- }
672
- if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) === 'received')
673
- return { verdict: 'received' };
674
- return { verdict: 'unreported', rule };
675
- }
676
- /**
677
- * Say so when the pre-send clear finds the body this session last reported
678
- * submitted (Issue #4035): that body never reached the agent, and the send that
679
- * said `sent` for it was wrong. The instance's `lastSend` is turned
680
- * `indeterminate` (the send now running records its own outcome after it).
681
- */
682
- function reportSubmittedBodyInComposer(sessionName, cliToolId, composerText, cleared) {
683
- if (composerText === '' || !(0, prompt_submit_receipt_1.matchesSubmittedBody)(sessionName, composerText))
684
- return;
685
- const target = (0, prompt_submit_receipt_1.getPromptSubmitTarget)(sessionName);
686
- if (target !== null)
687
- (0, send_attempt_state_1.markLastSendDiscarded)({ ...target, instanceId: target.instanceId ?? target.cliToolId });
688
- logger.warn('pre-send-found-submitted-body', {
689
- sessionName,
690
- cliToolId,
691
- cleared,
692
- length: composerText.length,
693
- });
694
- }
695
518
  /**
696
519
  * Empty the composer before the body is typed into it (Issue #1880).
697
520
  *
@@ -750,10 +573,10 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
750
573
  ...(ticket !== undefined ? { beforePass: () => ticket.isCurrent() } : {}),
751
574
  });
752
575
  if (ticket !== undefined)
753
- assertInputOwner(ticket, cliToolId, 'the pre-send clear', false);
754
- reportSubmittedBodyInComposer(sessionName, cliToolId, result.discardedText, result.state !== 'content');
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);
755
578
  if (result.state === 'content') {
756
- logger.error('pre-send-composer-clear-failed', {
579
+ submit_verified_sender_shared_1.logger.error('pre-send-composer-clear-failed', {
757
580
  sessionName,
758
581
  cliToolId,
759
582
  passes: result.passes,
@@ -767,7 +590,7 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
767
590
  // The only record of what was thrown away. `remainingText` is the FINAL
768
591
  // read and is empty on this path by definition, which is why clearComposer
769
592
  // reports `discardedText` separately.
770
- logger.warn('pre-send-composer-cleared', {
593
+ submit_verified_sender_shared_1.logger.warn('pre-send-composer-cleared', {
771
594
  sessionName,
772
595
  cliToolId,
773
596
  passes: result.passes,
@@ -803,11 +626,18 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
803
626
  * when the composer was not free in time (nothing typed).
804
627
  */
805
628
  async function sendMessageWithSubmitVerification(params) {
806
- 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
+ });
807
637
  }
808
638
  async function sendUnderInputLock(params, ticket) {
809
- 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;
810
- 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);
811
641
  // -1. Issue #3945 (review-1 #4): every send re-reads the pane once it owns
812
642
  // the composer, whether or not it queued — the prompt guard and the
813
643
  // tool's readiness wait ran before the lock, and a dialog can open in the
@@ -821,26 +651,30 @@ async function sendUnderInputLock(params, ticket) {
821
651
  if (await waitOutCarriedPaste(sessionName, cliToolId, composer, ticket)) {
822
652
  frame = await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, cliToolId);
823
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 });
824
659
  // 0. Empty the composer first (Issue #1880). The body below is typed at the
825
660
  // TUI's current cursor position, so anything already in the box would be
826
661
  // spliced into it. Throws for a claude composer that could not be emptied.
827
- await clearComposerBeforeSend(sessionName, cliToolId, composer, { initialCapture: frame, ticket });
828
- 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) {
829
668
  // 1'. A body that would reach the TUI as more than one pty read is pasted
830
669
  // as ONE bracketed paste, and Enter waits until the composer shows all
831
670
  // of it (Issue #2464). Typed, Claude Code would keep only its last read.
832
671
  const pastedAt = Date.now();
833
- assertInputOwner(ticket, cliToolId, 'the paste', false);
672
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the paste', false);
834
673
  try {
835
674
  await pasteBody(sessionName, message, ticket, cliToolId);
836
675
  }
837
676
  catch (error) {
838
- // Whether tmux put any of it into the pane is unknown — except after a
839
- // refused input boundary (Issue #3992) or a failed `load-buffer` (Issue
840
- // #4011, `not-started`), both before `paste-buffer`: a mark then would
841
- // only hold the next send off for nothing.
842
- const notStarted = error?.delivery === 'not-started';
843
- if (!(0, instance_input_lock_1.isInputBoundaryRefusal)(error) && !notStarted)
677
+ if ((0, submit_verified_sender_report_1.pasteFailureMayHaveTyped)(error))
844
678
  (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
845
679
  throw error;
846
680
  }
@@ -862,7 +696,7 @@ async function sendUnderInputLock(params, ticket) {
862
696
  // nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
863
697
  // built in `lib/tmux/key-sequence.ts`, which carries the table.
864
698
  const typedAt = Date.now();
865
- assertInputOwner(ticket, cliToolId, 'the body', false);
699
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'the body', false);
866
700
  // Issue #3953: the send's stamp is taken here — after the lock, the carried
867
701
  // mark, the re-check and the clear, right before the body's first key — so a
868
702
  // previous turn that ended during any of them is older than this send.
@@ -883,7 +717,7 @@ async function sendUnderInputLock(params, ticket) {
883
717
  // means waiting until the body is drawn (Issue #3366): an Enter pressed
884
718
  // while codex still holds the keystrokes as a paste burst becomes a
885
719
  // newline, and the body stays unsent. The fixed wait stays as a floor.
886
- if (awaitTypedBody && composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId)) {
720
+ if ((0, submit_verified_sender_report_1.shouldAwaitTypedBody)(awaitTypedBody, cliToolId)) {
887
721
  await confirmTypedBodyLanded({ sessionName, message, cliToolId, composer, attempts: typedBodyAttempts, ticket });
888
722
  }
889
723
  const remaining = textInputWaitMs - (Date.now() - typedAt);
@@ -895,7 +729,7 @@ async function sendUnderInputLock(params, ticket) {
895
729
  // Issue #4035: the agent's own report of the prompt counts from here.
896
730
  const enteredAt = Date.now();
897
731
  for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
898
- assertInputOwner(ticket, cliToolId, 'Enter', true);
732
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'Enter', true);
899
733
  await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
900
734
  if (i < submitEnterCount - 1) {
901
735
  await new Promise((resolve) => setTimeout(resolve, interEnterWaitMs));
@@ -915,19 +749,21 @@ async function sendUnderInputLock(params, ticket) {
915
749
  for (let attempt = 0; attempt <= attempts; attempt++) {
916
750
  await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
917
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');
918
756
  let { state, rule } = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
919
- const receipt = needsPromptReport(state, rule, message)
920
- ? (0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt)
921
- : 'not-required';
757
+ const receipt = (0, submit_verified_sender_report_1.promptReceiptFor)({ state, rule, message, sessionName, cliToolId, enteredAt, target });
922
758
  // Issue #4035: every verdict names the rule that gave it, so a send reported
923
759
  // `sent` can be traced to what the screen showed.
924
- logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt });
760
+ submit_verified_sender_shared_1.logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt });
925
761
  if (receipt === 'awaited') {
926
762
  // Issue #4035: the screen says only that the body is not in the composer,
927
763
  // on a session that has not reported a prompt yet. Watch, without Enter,
928
764
  // until the agent reports it or the composer shows the body after all.
929
- promptReportDeadline ??= Date.now() + exports.PROMPT_REPORT_WAIT_MS;
930
- const watched = await awaitPromptReport({
765
+ promptReportDeadline ??= Date.now() + submit_verified_sender_shared_1.PROMPT_REPORT_WAIT_MS;
766
+ const watched = await (0, submit_verified_sender_report_1.awaitPromptReport)({
931
767
  sessionName,
932
768
  message,
933
769
  cliToolId,
@@ -935,37 +771,13 @@ async function sendUnderInputLock(params, ticket) {
935
771
  enteredAt,
936
772
  rule,
937
773
  deadline: promptReportDeadline,
774
+ ticket,
775
+ ...(target !== undefined ? { target } : {}),
938
776
  });
939
- if (watched.verdict === 'unreported') {
940
- (0, tmux_capture_cache_1.invalidateCache)(sessionName);
941
- logger.error('submit-not-confirmed:prompt-unreported', {
942
- sessionName,
943
- cliToolId,
944
- attempt,
945
- rule: watched.rule,
946
- waitedMs: exports.PROMPT_REPORT_WAIT_MS,
947
- });
948
- throw new Error(`Message submit could not be confirmed for session ${sessionName}: the composer did not show the body ` +
949
- `(rule ${watched.rule}) but the agent did not report the prompt within ${exports.PROMPT_REPORT_WAIT_MS}ms ` +
950
- '(Issue #4035).');
951
- }
952
- if (watched.verdict === 'received') {
953
- logger.info('submit-confirmed-by-prompt-hook', { sessionName, cliToolId, attempt, rule });
954
- state = 'submitted';
955
- }
956
- else {
957
- ({ state, rule, output } = watched);
958
- logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule, receipt: 'awaited' });
959
- }
777
+ ({ state, rule, output } = (0, submit_verified_sender_report_1.settleAwaitedPromptReport)({ watched, sessionName, cliToolId, attempt, rule, output, target }));
960
778
  }
961
779
  if (state === 'submitted') {
962
- // Issue #4035: only a body the screen alone called submitted is remembered
963
- // for the next send's clear. One the agent reported did leave, and the same
964
- // text back in the composer is claude restoring it (Esc), the history (↑),
965
- // or a person typing it — not a send that never arrived.
966
- if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) !== 'received') {
967
- (0, prompt_submit_receipt_1.noteSubmittedBody)(sessionName, message);
968
- }
780
+ (0, submit_verified_sender_report_1.rememberScreenOnlySubmit)({ sessionName, cliToolId, enteredAt, message, ticket, target });
969
781
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
970
782
  return;
971
783
  }
@@ -980,56 +792,43 @@ async function sendUnderInputLock(params, ticket) {
980
792
  await (0, tmux_1.clearInputLine)(sessionName);
981
793
  }
982
794
  else {
983
- 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 });
984
796
  }
985
797
  }
986
798
  catch (clearError) {
987
- logger.error('submit-clear-input-failed', {
988
- sessionName,
989
- cliToolId,
990
- error: clearError instanceof Error ? clearError.message : String(clearError),
991
- });
799
+ (0, submit_verified_sender_report_1.logClearInputFailed)(sessionName, cliToolId, clearError);
992
800
  }
993
801
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
994
- 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 });
995
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.`);
996
804
  }
997
805
  // state === 'pending' / 'indeterminate' after the final read-back: give up below.
998
806
  if (attempt === attempts)
999
807
  break;
1000
- // state === 'indeterminate' (Issue #3906) — no Enter: the composer does not
1001
- // show the body, so another Enter could submit whatever it does show.
1002
- if (state === 'indeterminate') {
1003
- logger.warn('submit-not-confirmed:composer-unreadable', { sessionName, cliToolId, attempt });
808
+ if ((0, submit_verified_sender_report_1.holdsResendEnter)({ state, output, sessionName, cliToolId, message, composer, attempt }))
1004
809
  continue;
1005
- }
1006
- // Issue #3945 (review #1): a paste placeholder that does not count this
1007
- // body is not this body. It can only be a paste that arrived after the
1008
- // initial Enter (a carried send's, past its mark), and another Enter would
1009
- // submit it. One that counts exactly this body cannot be told apart: that
1010
- // Enter is the accepted gap (LATE_TOKEN_AFTER_ENTER_SAME_COUNT in the tests).
1011
- if (composerShowsForeignPasteToken(output, cliToolId, message, composer)) {
1012
- logger.warn('submit-not-confirmed:foreign-paste-token', { sessionName, cliToolId, attempt });
1013
- continue;
1014
- }
1015
810
  // Issue #4035: the Enter thought lost may only have been late — the agent
1016
811
  // reporting the prompt now means it went, and another Enter would land on an
1017
812
  // empty composer, or on a dialog that the prompt just opened.
1018
- if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt) === 'received') {
1019
- logger.info('submit-confirmed-by-prompt-hook', { sessionName, cliToolId, attempt, rule });
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 });
1020
819
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
1021
820
  return;
1022
821
  }
1023
822
  // state === 'pending' — still typed-but-unsent, resend a single Enter and re-check.
1024
- logger.warn('submit-not-confirmed:resending-enter', {
823
+ submit_verified_sender_shared_1.logger.warn('submit-not-confirmed:resending-enter', {
1025
824
  sessionName,
1026
825
  cliToolId,
1027
826
  attempt,
1028
827
  });
1029
- assertInputOwner(ticket, cliToolId, 'a resent Enter', true);
828
+ (0, submit_verified_sender_lock_1.assertInputOwner)(ticket, cliToolId, 'a resent Enter', true);
1030
829
  await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
1031
830
  }
1032
831
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
1033
- logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
832
+ submit_verified_sender_shared_1.logger.error('submit-verification-failed', { sessionName, cliToolId, attempts });
1034
833
  throw new Error(`Message submit could not be confirmed for session ${sessionName} after ${attempts} attempts (typed but unsent)`);
1035
834
  }