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
@@ -16,6 +16,7 @@ exports.classifyPasteLanded = classifyPasteLanded;
16
16
  exports.compactText = compactText;
17
17
  const composer_spec_1 = require("./composer-spec");
18
18
  const cli_patterns_1 = require("../detection/cli-patterns");
19
+ const composer_own_text_1 = require("../detection/tools/opencode/composer-own-text");
19
20
  const composer_text_1 = require("../../lib/detection/composer-text");
20
21
  /**
21
22
  * Version-resilient pasted-text placeholder.
@@ -39,6 +40,13 @@ const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
39
40
  * substitution, so a genuinely-submitted message never fails spuriously.
40
41
  */
41
42
  const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
43
+ /**
44
+ * opencode's empty-buffer placeholder on a box row's own text (Issue #4067):
45
+ * `OPENCODE_IDLE_COMPOSER_PATTERN` with the gutter already removed by
46
+ * `readOpenCodeComposerOwnRows`. Start-anchored like that pattern, so the
47
+ * phrase quoted inside a typed body is not taken for it.
48
+ */
49
+ const OPENCODE_OWN_PLACEHOLDER = /^Ask anything(?:\.\.\.|\u2026)/;
42
50
  /**
43
51
  * Prompt input-line markers across the marker-drawing TUIs.
44
52
  * claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
@@ -95,17 +103,26 @@ exports.VERIFY_WINDOW_LINES = 12;
95
103
  */
96
104
  function readComposer(reader, lines, windowLines) {
97
105
  if (reader === 'opencode-box') {
98
- const rows = (0, cli_patterns_1.findOpenCodeComposerRows)(lines);
99
- if (rows === null)
106
+ // Each buffer row's own text: gutter removed and cut at the box's right
107
+ // edge (Issue #4067), so the sidebar drawn on the same rows (#2047/#2095 —
108
+ // its working directory starts with `/`) is never read as the body. The
109
+ // same cut as the send readiness (`isOpenCodeComposerReady`).
110
+ const box = (0, composer_own_text_1.readOpenCodeComposerBox)(lines);
111
+ if (box === null)
100
112
  return { kind: 'absent' };
113
+ const { rows } = box;
114
+ // An overlay over the box (its bottom border cut in two): its rows are read
115
+ // to the border's far end, and the reading is marked so B and F do not
116
+ // stand on it (review of #4067).
117
+ const obscured = box.obscured ? { obscured: true } : {};
101
118
  // The placeholder is painted only while the buffer is empty, and only
102
- // inside the box — hence matched on the raw, still-guttered row (#1883).
103
- if (rows.some((row) => cli_patterns_1.OPENCODE_IDLE_COMPOSER_PATTERN.test(row)))
104
- return { kind: 'empty' };
105
- const first = rows.map(cli_patterns_1.stripOpenCodeGutter).find((row) => row.length > 0);
119
+ // inside the box (#1883) — read on the row's own text, which is inside it.
120
+ if (rows.some((row) => OPENCODE_OWN_PLACEHOLDER.test(row)))
121
+ return { kind: 'empty', ...obscured };
122
+ const first = rows.find((row) => row.length > 0);
106
123
  if (first === undefined)
107
- return { kind: 'empty' };
108
- return { kind: 'text', text: first, rows };
124
+ return { kind: 'empty', ...obscured };
125
+ return { kind: 'text', text: first, rows, ...obscured };
109
126
  }
110
127
  if (reader !== 'input-line-marker')
111
128
  return { kind: 'absent' };
@@ -432,6 +449,11 @@ function readSubmitComposer(output, cliToolId, reader, lines, windowLines, messa
432
449
  * pre-#1501 permissive default, so normal sends never spuriously fail) —
433
450
  * except in a codex composer above the read window -> indeterminate
434
451
  * (Issue #3906).
452
+ * None of B–F holds for opencode's box with an overlay drawn over it (its
453
+ * bottom border cut in two) -> indeterminate (`B-obscured` when nothing is
454
+ * seen, `F-obscured` for any text — the body, a token or a `/…` included;
455
+ * review of #4067): what the box holds under the overlay is not seen, and an
456
+ * Enter or a clear would go to the overlay.
435
457
  *
436
458
  * C–F are scoped to the composer only, so the user-message echo that a TUI
437
459
  * prints into its history above the prompt never causes a false verdict.
@@ -476,9 +498,20 @@ function classifySubmitWithRule(output, cliToolId, message, composerSpec = (0, c
476
498
  const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, windowLines, message);
477
499
  // B. No composer visible (scrolled off / dialog / still starting), or the
478
500
  // composer is empty => the message left the box => submitted.
501
+ // Not on opencode's box with an overlay drawn over it (review of #4067):
502
+ // nothing seen there is not the box being empty -> indeterminate.
479
503
  if (composer.kind !== 'text') {
504
+ if (composer.kind === 'empty' && composer.obscured)
505
+ return { state: 'indeterminate', rule: 'B-obscured' };
480
506
  return { state: 'submitted', rule: composer.kind === 'absent' ? 'B-absent' : 'B-empty' };
481
507
  }
508
+ // Text in opencode's box under an overlay (review of #4067): the reading
509
+ // runs to the border's far end, the overlay's text included, so none of
510
+ // C–F is read from it. C/D would resend Enter and E clear the line — keys
511
+ // that would go to the palette or picker on top, not to the box ->
512
+ // indeterminate (no Enter, no clear; read again).
513
+ if (composer.obscured)
514
+ return { state: 'indeterminate', rule: 'F-obscured' };
482
515
  // C. A paste placeholder is still folded into the composer => body is there.
483
516
  if (composer.rows.some((row) => PASTE_PLACEHOLDER_PATTERN.test(row) || findPasteTokens(row).tokens.length > 0)) {
484
517
  return { state: 'pending', rule: 'C' };
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ /**
3
+ * The shared sender's pure reads of a captured composer (Issue #4056: split out
4
+ * of `submit-verified-sender.ts`). No tmux, no keys, no logging.
5
+ *
6
+ * Imports nothing from `submit-verified-sender.ts`.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.describeComposer = describeComposer;
10
+ exports.composerHoldsText = composerHoldsText;
11
+ exports.composerShowsForeignPasteToken = composerShowsForeignPasteToken;
12
+ exports.visibleTypedBody = visibleTypedBody;
13
+ exports.codexComposerShowsWholeBody = codexComposerShowsWholeBody;
14
+ exports.needsPromptReport = needsPromptReport;
15
+ const cli_patterns_1 = require("../detection/cli-patterns");
16
+ const submit_composer_read_1 = require("./submit-composer-read");
17
+ function describeComposer(output, cliToolId, composerSpec, message) {
18
+ const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
19
+ const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
20
+ if (composer.kind === 'absent')
21
+ return 'no composer on screen';
22
+ if (composer.kind === 'empty')
23
+ return 'an empty composer';
24
+ const text = composer.text.length > 80 ? `${composer.text.slice(0, 80)}…` : composer.text;
25
+ return JSON.stringify(text);
26
+ }
27
+ /** Whether the composer in `output` holds any text at all, read as the sender reads it. */
28
+ function composerHoldsText(output, cliToolId, composerSpec, message) {
29
+ const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
30
+ return ((0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message)
31
+ .kind === 'text');
32
+ }
33
+ /**
34
+ * Whether the composer shows a paste placeholder whose count is not this body's
35
+ * (Issue #3945): one counting fewer or more, or more than one placeholder.
36
+ */
37
+ function composerShowsForeignPasteToken(output, cliToolId, message, composerSpec) {
38
+ const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
39
+ const composer = (0, submit_composer_read_1.readSubmitComposer)(output, cliToolId, composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
40
+ if (composer.kind !== 'text')
41
+ return false;
42
+ if (!composer.rows.some((row) => (0, submit_composer_read_1.findPasteTokens)(row).tokens.length > 0))
43
+ return false;
44
+ return (0, submit_composer_read_1.classifyPasteLanded)(output, cliToolId, message, composerSpec) !== 'landed';
45
+ }
46
+ /**
47
+ * The part of a typed body the composer reader can see (Issue #3366).
48
+ *
49
+ * The codex reader takes the composer as one run of non-blank rows, so a blank
50
+ * line inside the body ends what it returns: what it can show is the body up to
51
+ * its first blank line after the first non-blank one. Leading blank lines are
52
+ * kept — they are drawn as composer rows of their own and compact to nothing.
53
+ */
54
+ function visibleTypedBody(message) {
55
+ const lines = message.split('\n');
56
+ const first = lines.findIndex((line) => line.trim() !== '');
57
+ if (first < 0)
58
+ return '';
59
+ const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
60
+ return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
61
+ }
62
+ /** Whether the whole codex composer, read past the bounded readers (Issue #3906), is exactly `message`. */
63
+ function codexComposerShowsWholeBody(output, message, composerSpec) {
64
+ const lines = (0, submit_composer_read_1.withoutTrailingBlankRows)((0, cli_patterns_1.stripAnsi)(output).split('\n'));
65
+ const composer = (0, submit_composer_read_1.readSubmitComposer)(output, 'codex', composerSpec.reader, lines, lines.slice(-submit_composer_read_1.VERIFY_WINDOW_LINES), message);
66
+ return composer.kind === 'text' && composer.region !== undefined && (0, submit_composer_read_1.compactText)(composer.region) === (0, submit_composer_read_1.compactText)(message);
67
+ }
68
+ /**
69
+ * Whether a verdict is one the agent's own report must back (Issue #4035):
70
+ * `submitted` from B or F — the screen saying only that the body is not in the
71
+ * composer. A (generating) stands on its own. A body starting with `/` or `!`
72
+ * is run by the TUI itself, which is not measured to report it as a prompt.
73
+ */
74
+ function needsPromptReport(state, rule, message) {
75
+ if (state !== 'submitted' || rule === 'A')
76
+ return false;
77
+ return !/^\s*[/!]/.test(message);
78
+ }
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ /**
3
+ * Ownership and readiness under the instance input lock (Issue #4056: split out
4
+ * of `submit-verified-sender.ts`): {@link assertInputOwner} before every key,
5
+ * and the tool's readiness asked again of the frames read under the lock.
6
+ *
7
+ * Sends no key. Imports nothing from `submit-verified-sender.ts`.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DEADLINE_PASSED = void 0;
11
+ exports.beforeDeadline = beforeDeadline;
12
+ exports.isReadyFrame = isReadyFrame;
13
+ exports.awaitReadyUnderLock = awaitReadyUnderLock;
14
+ exports.assertInputOwner = assertInputOwner;
15
+ exports.assertStillOwnedAfterEnter = assertStillOwnedAfterEnter;
16
+ const composer_clear_1 = require("../../lib/session/composer-clear");
17
+ const submit_verified_sender_shared_1 = require("./submit-verified-sender-shared");
18
+ /** What {@link beforeDeadline} answers when the deadline came first. */
19
+ exports.DEADLINE_PASSED = Symbol('deadline-passed');
20
+ /**
21
+ * `read`'s value, or {@link DEADLINE_PASSED} when `deadline` (epoch ms) comes
22
+ * first. A rejection that arrives in time is thrown; one that arrives later is
23
+ * dropped with the read (Issue #4040).
24
+ */
25
+ async function beforeDeadline(read, deadline) {
26
+ let timer;
27
+ const expired = new Promise((resolve) => {
28
+ timer = setTimeout(() => resolve(exports.DEADLINE_PASSED), Math.max(0, deadline - Date.now()));
29
+ });
30
+ try {
31
+ return await Promise.race([read, expired]);
32
+ }
33
+ finally {
34
+ clearTimeout(timer);
35
+ read.catch(() => undefined);
36
+ }
37
+ }
38
+ function isReadyFrame(readiness, frame) {
39
+ try {
40
+ return readiness.isReady(frame);
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * The newest frame under the lock that passes the tool's readiness test
48
+ * (Issue #4040), or a refusal before any key.
49
+ *
50
+ * The refusal does not quote the frame: `classifySendFailure` reads this
51
+ * wording, and a screen saying `submit could not be confirmed` would turn it
52
+ * into `indeterminate`.
53
+ *
54
+ * @throws Error `<label> prompt not ready …` (`not-sent` / `prompt-not-ready`);
55
+ * the re-check's own refusals (dialog, unreadable pane); a lost lock
56
+ */
57
+ async function awaitReadyUnderLock(readiness, frame, params) {
58
+ if (readiness === undefined || isReadyFrame(readiness, frame))
59
+ return frame;
60
+ const { sessionName, cliToolId, ticket } = params;
61
+ const deadline = Date.now() + submit_verified_sender_shared_1.INPUT_READINESS_UNDER_LOCK_WAIT_MS;
62
+ for (;;) {
63
+ const beforeSleep = deadline - Date.now();
64
+ if (beforeSleep <= 0)
65
+ break;
66
+ await new Promise((resolve) => setTimeout(resolve, Math.min(submit_verified_sender_shared_1.INPUT_READINESS_UNDER_LOCK_POLL_MS, beforeSleep)));
67
+ if (Date.now() >= deadline)
68
+ break;
69
+ assertInputOwner(ticket, cliToolId, 'the readiness re-read', false);
70
+ const current = await beforeDeadline((0, composer_clear_1.recheckComposerBeforeInput)(sessionName, cliToolId), deadline);
71
+ // A frame read after the deadline is not taken: the wait is over.
72
+ if (current === exports.DEADLINE_PASSED || Date.now() > deadline)
73
+ break;
74
+ if (isReadyFrame(readiness, current))
75
+ return current;
76
+ }
77
+ submit_verified_sender_shared_1.logger.warn('input-readiness-not-ready-under-lock', { sessionName, cliToolId });
78
+ throw new Error(`${readiness.label} prompt not ready under the input lock: ` +
79
+ `no input prompt within ${submit_verified_sender_shared_1.INPUT_READINESS_UNDER_LOCK_WAIT_MS}ms, so nothing was typed (Issue #4040)`);
80
+ }
81
+ /**
82
+ * Throw unless `ticket` still owns the composer (Issue #3945 stage 3). Called
83
+ * right before every key a send sends — body, paste, each Enter — so work still
84
+ * in flight after its ownership ended cannot reach the next owner's composer.
85
+ *
86
+ * @param typed - Whether any of the body may already be in the composer, which
87
+ * decides how the failure classifies (`not-sent` before the body only).
88
+ */
89
+ function assertInputOwner(ticket, cliToolId, step, typed) {
90
+ if (ticket.isCurrent())
91
+ return;
92
+ submit_verified_sender_shared_1.logger.error('input-lock-lost', { sessionName: ticket.sessionName, cliToolId, step, generation: ticket.generation });
93
+ if (!typed) {
94
+ throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
95
+ }
96
+ throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; part of the message may be in its composer (Issue #3945).`);
97
+ }
98
+ /**
99
+ * Throw unless `ticket` still owns the session, after the body and an Enter
100
+ * went in (Issue #4048 item 2). Unlike a loss before the body
101
+ * ({@link assertInputOwner} with `typed: false`), this is no proof the message
102
+ * was not sent — the replaced process may have taken the prompt — so the error
103
+ * classifies `indeterminate`, never `not-sent` / `session-replaced`.
104
+ */
105
+ function assertStillOwnedAfterEnter(ticket, cliToolId, step) {
106
+ if (ticket.isCurrent())
107
+ return;
108
+ submit_verified_sender_shared_1.logger.error('input-lock-lost-after-enter', {
109
+ sessionName: ticket.sessionName,
110
+ cliToolId,
111
+ step,
112
+ generation: ticket.generation,
113
+ });
114
+ throw new Error(`Session ${ticket.sessionName} was replaced during ${step}, after the message and Enter were sent; ` +
115
+ 'the previous process may have submitted it (Issue #4048).');
116
+ }
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ /**
3
+ * The read-back's verdicts after Enter and the agent's own report of the prompt
4
+ * (Issue #4056: split out of `submit-verified-sender.ts`, with the helpers
5
+ * #4057 split out of `sendUnderInputLock`). Reads the pane; sends no key.
6
+ *
7
+ * Imports nothing from `submit-verified-sender.ts`.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.awaitPromptReport = awaitPromptReport;
11
+ exports.reportSubmittedBodyInComposer = reportSubmittedBodyInComposer;
12
+ exports.resolveSubmitEnterCount = resolveSubmitEnterCount;
13
+ exports.pasteFailureMayHaveTyped = pasteFailureMayHaveTyped;
14
+ exports.shouldAwaitTypedBody = shouldAwaitTypedBody;
15
+ exports.promptReceiptFor = promptReceiptFor;
16
+ exports.settleAwaitedPromptReport = settleAwaitedPromptReport;
17
+ exports.rememberScreenOnlySubmit = rememberScreenOnlySubmit;
18
+ exports.logClearInputFailed = logClearInputFailed;
19
+ exports.holdsResendEnter = holdsResendEnter;
20
+ const tmux_1 = require("../tmux/tmux");
21
+ const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
22
+ const prompt_submit_receipt_1 = require("../../lib/session/prompt-submit-receipt");
23
+ const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
24
+ const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
25
+ const composer_text_1 = require("../../lib/detection/composer-text");
26
+ const submit_composer_read_1 = require("./submit-composer-read");
27
+ const submit_verified_sender_shared_1 = require("./submit-verified-sender-shared");
28
+ const submit_verified_sender_composer_1 = require("./submit-verified-sender-composer");
29
+ const submit_verified_sender_lock_1 = require("./submit-verified-sender-lock");
30
+ /**
31
+ * Watch a session's first prompt until the agent reports it (Issue #4035).
32
+ *
33
+ * Reads the hook record and the composer every {@link PROMPT_REPORT_POLL_MS}
34
+ * until `deadline`, without pressing anything. The deadline is the send's, not
35
+ * the call's: a send that waits again after a resent Enter gets only what is
36
+ * left of its {@link PROMPT_REPORT_WAIT_MS} (it holds the input lock meanwhile).
37
+ *
38
+ * - the agent reported the prompt — `received`;
39
+ * - the screen changes its verdict — generating (A), or the body drawn into
40
+ * the composer after all (C/D, `pending`: the caller resends Enter, as for
41
+ * any typed-but-unsent body), or a completion (E) — `screen`, with the frame;
42
+ * - neither, to the end — `unreported`: nothing says the message left.
43
+ *
44
+ * Issue #4048: the wait asks whether `ticket` still owns the session before
45
+ * every read of the report, after every capture, and so before any verdict it
46
+ * returns. The body and its Enter are already in, so a session replaced
47
+ * meanwhile THROWS as indeterminate ({@link assertStillOwnedAfterEnter}) — the
48
+ * old process may have taken the prompt — and the new session's screen and
49
+ * hooks are never read as this send's.
50
+ *
51
+ * The deadline is followed by one last read of the screen
52
+ * ({@link rereadBeforeUnreported}) before `unreported`.
53
+ */
54
+ async function awaitPromptReport(params) {
55
+ const { sessionName, message, cliToolId, composer, enteredAt, deadline, ticket, target } = params;
56
+ const reported = () => {
57
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the prompt report wait');
58
+ return (0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt, target) === 'received';
59
+ };
60
+ let rule = params.rule;
61
+ while (Date.now() < deadline) {
62
+ await new Promise((resolve) => setTimeout(resolve, submit_verified_sender_shared_1.PROMPT_REPORT_POLL_MS));
63
+ if (reported())
64
+ return { verdict: 'received' };
65
+ const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
66
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the prompt report wait');
67
+ const verdict = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
68
+ if (verdict.state !== 'submitted' || verdict.rule === 'A')
69
+ return { verdict: 'screen', ...verdict, output };
70
+ rule = verdict.rule;
71
+ }
72
+ if (reported())
73
+ return { verdict: 'received' };
74
+ const last = await rereadBeforeUnreported({ sessionName, message, cliToolId, composer, ticket });
75
+ if (last !== null)
76
+ return { verdict: 'screen', state: 'submitted', rule: 'A', output: last };
77
+ // The hook may have come while the screen was read.
78
+ if (reported())
79
+ return { verdict: 'received' };
80
+ return { verdict: 'unreported', rule };
81
+ }
82
+ /**
83
+ * The last look at the screen before a first prompt is called `unreported`
84
+ * (Issue #4048 item 1). Only A — the tool generating — saves the send: it is
85
+ * what a `SessionStart`-only environment (the http `UserPromptSubmit` hook not
86
+ * arriving) shows for a body that did go, right at the deadline. Anything else
87
+ * — B, F, the body still in the composer, a capture that fails — leaves the
88
+ * send unconfirmed, and no Enter is pressed for it. Ownership is asked before
89
+ * and after the capture.
90
+ *
91
+ * A says only that something is being generated, not that it is this body
92
+ * (a person's key, or a generation that started otherwise); that limit is
93
+ * accepted, as for every A verdict.
94
+ *
95
+ * @returns The frame when it shows A, else null
96
+ */
97
+ async function rereadBeforeUnreported(params) {
98
+ const { sessionName, message, cliToolId, composer, ticket } = params;
99
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the last read before prompt-unreported');
100
+ let output;
101
+ try {
102
+ output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
103
+ }
104
+ catch (error) {
105
+ submit_verified_sender_shared_1.logger.warn('prompt-unreported-reread-failed', {
106
+ sessionName,
107
+ cliToolId,
108
+ error: error instanceof Error ? error.message : String(error),
109
+ });
110
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the last read before prompt-unreported');
111
+ return null;
112
+ }
113
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the last read before prompt-unreported');
114
+ const verdict = (0, submit_composer_read_1.classifySubmitWithRule)(output, cliToolId, message, composer);
115
+ submit_verified_sender_shared_1.logger.info('prompt-unreported-reread', { sessionName, cliToolId, state: verdict.state, rule: verdict.rule });
116
+ return verdict.state === 'submitted' && verdict.rule === 'A' ? output : null;
117
+ }
118
+ /**
119
+ * Say so when the pre-send clear finds the body this session last reported
120
+ * submitted (Issue #4035): that body never reached the agent, and the send that
121
+ * said `sent` for it was wrong. The instance's `lastSend` is turned
122
+ * `indeterminate` (the send now running records its own outcome after it).
123
+ *
124
+ * Issue #4048: only for claude, whose first prompt is hook-checked — on any
125
+ * other tool the warning is all (its `lastSend` is not rewritten) — and only the
126
+ * record of the attempt whose body was found (matched by its digest), so a later
127
+ * send, or one the agent reported, is never demoted. With an explicit `target`,
128
+ * the body is looked up only in the entry both the name and the target name.
129
+ */
130
+ function reportSubmittedBodyInComposer(sessionName, cliToolId, composerText, cleared, target) {
131
+ if (composerText === '')
132
+ return;
133
+ const expected = target === undefined ? undefined : { ...target, cliToolId };
134
+ const found = (0, prompt_submit_receipt_1.findSubmittedBody)(sessionName, composerText, expected);
135
+ if (found === null)
136
+ return;
137
+ const owner = (0, prompt_submit_receipt_1.reportsPrompts)(cliToolId) ? (0, prompt_submit_receipt_1.getPromptSubmitTarget)(sessionName, expected) : null;
138
+ if (owner !== null) {
139
+ (0, send_attempt_state_1.markLastSendDiscarded)({ ...owner, instanceId: owner.instanceId ?? owner.cliToolId }, Date.now(), found.messageDigest);
140
+ }
141
+ submit_verified_sender_shared_1.logger.warn('pre-send-found-submitted-body', {
142
+ sessionName,
143
+ cliToolId,
144
+ cleared,
145
+ length: composerText.length,
146
+ lastSendDemoted: owner !== null,
147
+ });
148
+ }
149
+ /** `params.submitEnterCount`, else the composer's (Issue #4057: split out of {@link sendUnderInputLock}). */
150
+ function resolveSubmitEnterCount(params, composer) {
151
+ return params.submitEnterCount ?? composer.submitEnterCount;
152
+ }
153
+ /** Whether a failed paste must leave a carried mark (Issue #4057: split out of {@link sendUnderInputLock}). */
154
+ function pasteFailureMayHaveTyped(error) {
155
+ // Whether tmux put any of it into the pane is unknown — except after a
156
+ // refused input boundary (Issue #3992) or a failed `load-buffer` (Issue
157
+ // #4011, `not-started`), both before `paste-buffer`: a mark then would
158
+ // only hold the next send off for nothing.
159
+ const notStarted = error?.delivery === 'not-started';
160
+ return !(0, instance_input_lock_1.isInputBoundaryRefusal)(error) && !notStarted;
161
+ }
162
+ /** Whether the typed body is waited for before Enter (Issue #4057: split out of {@link sendUnderInputLock}). */
163
+ function shouldAwaitTypedBody(awaitTypedBody, cliToolId) {
164
+ return awaitTypedBody && composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId);
165
+ }
166
+ /** The receipt a read-back's verdict asks for (Issue #4057: split out of {@link sendUnderInputLock}). */
167
+ function promptReceiptFor(input) {
168
+ const { state, rule, message, sessionName, cliToolId, enteredAt, target } = input;
169
+ return (0, submit_verified_sender_composer_1.needsPromptReport)(state, rule, message)
170
+ ? (0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt, target)
171
+ : 'not-required';
172
+ }
173
+ /**
174
+ * The read-back after an `awaited` receipt, from what {@link awaitPromptReport}
175
+ * resolved to (Issue #4057: split out of {@link sendUnderInputLock}). Synchronous:
176
+ * the wait itself stays in the caller, so the continuation after it is the
177
+ * original one. THROWS when the agent never reported the prompt.
178
+ */
179
+ function settleAwaitedPromptReport(input) {
180
+ const { watched, sessionName, cliToolId, attempt, rule, output, target } = input;
181
+ if (watched.verdict === 'unreported') {
182
+ // Issue #4048: no extra Enter — the last read did not show the body
183
+ // generating, and the body may have gone all the same (only the http
184
+ // hook missing), so the failure says to look before resending.
185
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
186
+ submit_verified_sender_shared_1.logger.error('submit-not-confirmed:prompt-unreported', {
187
+ sessionName,
188
+ cliToolId,
189
+ attempt,
190
+ rule: watched.rule,
191
+ waitedMs: submit_verified_sender_shared_1.PROMPT_REPORT_WAIT_MS,
192
+ });
193
+ throw new Error(`Message submit could not be confirmed for session ${sessionName}: the composer did not show the body ` +
194
+ `(rule ${watched.rule}) but the agent did not report the prompt within ${submit_verified_sender_shared_1.PROMPT_REPORT_WAIT_MS}ms ` +
195
+ `(Issue #4035). ${(0, submit_verified_sender_shared_1.promptUnreportedResendNote)(target, cliToolId)}`);
196
+ }
197
+ if (watched.verdict === 'received') {
198
+ submit_verified_sender_shared_1.logger.info('submit-confirmed-by-prompt-hook', { sessionName, cliToolId, attempt, rule });
199
+ return { state: 'submitted', rule, output };
200
+ }
201
+ const { state, rule: screenRule, output: screenOutput } = watched;
202
+ submit_verified_sender_shared_1.logger.info('submit-classified', { sessionName, cliToolId, attempt, state, rule: screenRule, receipt: 'awaited' });
203
+ return { state, rule: screenRule, output: screenOutput };
204
+ }
205
+ /** Remember a body only the screen called submitted (Issue #4057: split out of {@link sendUnderInputLock}). */
206
+ function rememberScreenOnlySubmit(input) {
207
+ const { sessionName, cliToolId, enteredAt, message, ticket, target } = input;
208
+ // Issue #4035: only a body the screen alone called submitted is remembered
209
+ // for the next send's clear. One the agent reported did leave, and the same
210
+ // text back in the composer is claude restoring it (Esc), the history (↑),
211
+ // or a person typing it — not a send that never arrived.
212
+ // Issue #4048: noted only while this send still owns the session (the
213
+ // entry under its name is otherwise a newer generation's), and, with an
214
+ // explicit target, only in the entry the target names.
215
+ (0, submit_verified_sender_lock_1.assertStillOwnedAfterEnter)(ticket, cliToolId, 'the submit record');
216
+ if ((0, prompt_submit_receipt_1.readPromptSubmitReceipt)(sessionName, cliToolId, enteredAt, target) !== 'received') {
217
+ (0, prompt_submit_receipt_1.noteSubmittedBody)(sessionName, message, target === undefined ? undefined : { ...target, cliToolId });
218
+ }
219
+ }
220
+ /** Log a failed clear of a replaced input line (Issue #4057: split out of {@link sendUnderInputLock}). */
221
+ function logClearInputFailed(sessionName, cliToolId, clearError) {
222
+ submit_verified_sender_shared_1.logger.error('submit-clear-input-failed', {
223
+ sessionName,
224
+ cliToolId,
225
+ error: clearError instanceof Error ? clearError.message : String(clearError),
226
+ });
227
+ }
228
+ /**
229
+ * Whether a read-back that is not the last one sends no Enter (Issue #4057:
230
+ * split out of {@link sendUnderInputLock}; the caller goes on to the next read).
231
+ */
232
+ function holdsResendEnter(input) {
233
+ const { state, output, sessionName, cliToolId, message, composer, attempt } = input;
234
+ // state === 'indeterminate' (Issue #3906) — no Enter: the composer does not
235
+ // show the body, so another Enter could submit whatever it does show.
236
+ if (state === 'indeterminate') {
237
+ submit_verified_sender_shared_1.logger.warn('submit-not-confirmed:composer-unreadable', { sessionName, cliToolId, attempt });
238
+ return true;
239
+ }
240
+ // Issue #3945 (review #1): a paste placeholder that does not count this
241
+ // body is not this body. It can only be a paste that arrived after the
242
+ // initial Enter (a carried send's, past its mark), and another Enter would
243
+ // submit it. One that counts exactly this body cannot be told apart: that
244
+ // Enter is the accepted gap (LATE_TOKEN_AFTER_ENTER_SAME_COUNT in the tests).
245
+ if ((0, submit_verified_sender_composer_1.composerShowsForeignPasteToken)(output, cliToolId, message, composer)) {
246
+ submit_verified_sender_shared_1.logger.warn('submit-not-confirmed:foreign-paste-token', { sessionName, cliToolId, attempt });
247
+ return true;
248
+ }
249
+ return false;
250
+ }
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ /**
3
+ * The shared sender's logger, constants and option types (Issue #4056: split
4
+ * out of `submit-verified-sender.ts`, which re-exports the public ones).
5
+ *
6
+ * Imports nothing from `submit-verified-sender.ts` (no import cycle).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.INPUT_READINESS_UNDER_LOCK_POLL_MS = exports.INPUT_READINESS_UNDER_LOCK_WAIT_MS = exports.PROMPT_UNREPORTED_RESEND_NOTE = exports.PROMPT_REPORT_POLL_MS = exports.PROMPT_REPORT_WAIT_MS = exports.DEFAULT_VERIFY_ATTEMPTS = exports.CARRIED_MARK_POLL_MS = exports.RECHECK_CAPTURE_LINES = exports.PASTE_COMMAND_TIMEOUT_MS = exports.DEFAULT_TYPED_BODY_ATTEMPTS = exports.TYPED_BODY_POLL_MS = exports.DEFAULT_PASTE_LANDED_ATTEMPTS = exports.PASTE_LANDED_POLL_MS = exports.LITERAL_SEND_MAX_BYTES = exports.logger = void 0;
10
+ exports.promptUnreportedResendNote = promptUnreportedResendNote;
11
+ const logger_1 = require("../../lib/logger");
12
+ exports.logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
13
+ /**
14
+ * Largest body typed as keystrokes (`send-keys -l`); anything longer is pasted
15
+ * (Issue #2464).
16
+ *
17
+ * The limit is the pty's, not tmux's. tmux hands the pane the whole argv —
18
+ * 16,320 bytes arrived intact on tmux 3.5a, and past ~16.3 KB `send-keys`
19
+ * refuses with `command too long`, loudly — but the TUI reads it back in
20
+ * pty-sized pieces, 1,022 bytes each on macOS. Claude Code keeps only the last
21
+ * piece of unbracketed input (`12288 mod 1022` = the 24 bytes that arrived of a
22
+ * 12 KB brief), so a body is only safe as keystrokes while it fits in a single
23
+ * read. Half the smallest read measured leaves room for multi-byte text and for
24
+ * a platform whose reads are shorter.
25
+ */
26
+ exports.LITERAL_SEND_MAX_BYTES = 512;
27
+ /**
28
+ * How often the composer is read while a pasted body is expected to appear in
29
+ * it. Claude, codex, Command Code and agy all drew the pasted body within
30
+ * 60 ms of `paste-buffer` on a 12 KB brief.
31
+ */
32
+ exports.PASTE_LANDED_POLL_MS = 100;
33
+ /** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
34
+ exports.DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
35
+ /**
36
+ * How often the composer is read while a TYPED body is expected to appear in it
37
+ * (Issue #3366). codex draws a burst of keystrokes all at once when the burst
38
+ * ends, so the poll only decides how late after that moment Enter goes in.
39
+ */
40
+ exports.TYPED_BODY_POLL_MS = 50;
41
+ /**
42
+ * Composer reads before a typed body that has not appeared is abandoned (5 s).
43
+ *
44
+ * codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
45
+ * per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
46
+ * so this is roughly twice the slowest draw measured, for a loaded machine.
47
+ */
48
+ exports.DEFAULT_TYPED_BODY_ATTEMPTS = 100;
49
+ /** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
50
+ exports.PASTE_COMMAND_TIMEOUT_MS = 5000;
51
+ /**
52
+ * Rows read for the re-check under the input lock (Issue #3945). The same
53
+ * capture `clearComposer` takes for its first read, so on a tool that clears
54
+ * before sending that read is the re-check's frame and no extra read is made.
55
+ */
56
+ exports.RECHECK_CAPTURE_LINES = 200;
57
+ /** How often a send waiting out a carried paste mark reads the composer (Issue #3945). */
58
+ exports.CARRIED_MARK_POLL_MS = 200;
59
+ /** Default bounded recovery Enters (each read back) before giving up (throwing). */
60
+ exports.DEFAULT_VERIFY_ATTEMPTS = 4;
61
+ /**
62
+ * How long a B/F verdict on a session's first prompt waits for the agent's own
63
+ * report of it (Issue #4035). Claude 2.1.314 reported the first prompt 0.66–0.74 s
64
+ * after the send began in all 29 submitted first sends measured; an unsent body
65
+ * was drawn into the composer 0.9–1.7 s after its Enter.
66
+ */
67
+ exports.PROMPT_REPORT_WAIT_MS = 5000;
68
+ /** How often the report and the composer are looked at during that wait. */
69
+ exports.PROMPT_REPORT_POLL_MS = 100;
70
+ /**
71
+ * What the `prompt-unreported` failure says about the body (Issue #4048): the
72
+ * agent's report never came, but that is no proof the body did not go — an
73
+ * environment where only the http `UserPromptSubmit` hook fails still submits
74
+ * it. Kept after the `(Issue #4035)` wording `classifySendFailure` matches.
75
+ */
76
+ exports.PROMPT_UNREPORTED_RESEND_NOTE = 'The body may already have been submitted; check the pane (`commandmate capture <worktree-id> --pane`) before resending it.';
77
+ /**
78
+ * {@link PROMPT_UNREPORTED_RESEND_NOTE} aimed at the pane the body went to
79
+ * (Issue #4048): with an explicit target its worktree and ` --instance <id>`
80
+ * for a named instance, else ` --agent <tool>` for the tool's primary (the
81
+ * worktree's default agent may be another tool) — the same flags the CLI's
82
+ * own hint (`paneCaptureCommand`) gives. Without a target the note names none.
83
+ */
84
+ function promptUnreportedResendNote(target, cliToolId) {
85
+ if (target === undefined)
86
+ return exports.PROMPT_UNREPORTED_RESEND_NOTE;
87
+ const instance = target.instanceId
88
+ ? ` --instance ${target.instanceId}`
89
+ : cliToolId !== undefined
90
+ ? ` --agent ${cliToolId}`
91
+ : '';
92
+ return ('The body may already have been submitted; check the pane ' +
93
+ `(\`commandmate capture ${target.worktreeId}${instance} --pane\`) before resending it.`);
94
+ }
95
+ /**
96
+ * How long a send that owns the input lock keeps re-reading a pane whose input
97
+ * prompt is not up (Issue #4040), the sleeps and the captures together: a
98
+ * `capture-pane` may take up to its own 5 s timeout (`tmux.ts`), so a read
99
+ * still running at the deadline is abandoned rather than awaited. Short on
100
+ * purpose: the tool's own wait (15 s) ran before the lock, and every writer
101
+ * behind this one waits as long. It covers a picker or a redraw finishing just
102
+ * as the lock changed hands.
103
+ */
104
+ exports.INPUT_READINESS_UNDER_LOCK_WAIT_MS = 2000;
105
+ /** How often that wait reads the pane. */
106
+ exports.INPUT_READINESS_UNDER_LOCK_POLL_MS = 200;