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
@@ -17,7 +17,7 @@
17
17
  * [SEC4-001].
18
18
  */
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.CopilotTool = exports.COPILOT_EXIT_COMMAND = void 0;
20
+ exports.CopilotTool = exports.COPILOT_EXIT_COMMAND = exports.COPILOT_DIALOG_CONFIRM_MS = void 0;
21
21
  exports.isCopilotStartupLoading = isCopilotStartupLoading;
22
22
  exports.readCopilotModelSwitchOutcomes = readCopilotModelSwitchOutcomes;
23
23
  exports.judgeCopilotModelSwitch = judgeCopilotModelSwitch;
@@ -25,7 +25,10 @@ const base_1 = require("./base");
25
25
  const tmux_1 = require("../tmux/tmux");
26
26
  const submit_verified_sender_1 = require("./submit-verified-sender");
27
27
  const composer_clear_1 = require("../../lib/session/composer-clear");
28
+ const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
29
+ const prompt_wait_dialog_1 = require("./prompt-wait-dialog");
28
30
  const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
31
+ const status_detector_1 = require("../detection/status-detector");
29
32
  const cli_patterns_1 = require("../detection/cli-patterns");
30
33
  const copilot_executable_1 = require("./copilot-executable");
31
34
  const copilot_constants_1 = require("../../config/copilot-constants");
@@ -46,6 +49,19 @@ const COPILOT_POLL_INTERVAL_MS = 1000;
46
49
  const COPILOT_INIT_MAX_ATTEMPTS = 30;
47
50
  /** Timeout for waiting for prompt before sending a message */
48
51
  const COPILOT_PROMPT_WAIT_TIMEOUT_MS = 15000;
52
+ /**
53
+ * How long a dialog has to stay up in {@link CopilotTool.waitForPrompt} before
54
+ * the wait gives up on it (Issue #4067), on {@link PROMPT_WAIT_DIALOG_CONFIRM_READS}
55
+ * reads in a row.
56
+ *
57
+ * A dialog waits for a person, so waiting out the 15 s (or `/model`'s 30 s)
58
+ * window behind it only delays the refusal — and the picker and `/model` wait
59
+ * holding the instance's input lock, so Auto-Yes and other writers wait too.
60
+ * Both thresholds must hold, so a frame caught mid-paint that reads as a
61
+ * dialog once does not refuse a send. The count is shared with opencode's and
62
+ * vibe-local's waits (Issue #4084, {@link createDialogConfirmation}).
63
+ */
64
+ exports.COPILOT_DIALOG_CONFIRM_MS = prompt_wait_dialog_1.PROMPT_WAIT_DIALOG_CONFIRM_MS;
49
65
  /**
50
66
  * Copilot CLI slash commands that open a picker.
51
67
  *
@@ -263,6 +279,36 @@ function describeBottomRow(output) {
263
279
  }
264
280
  return 'an empty pane';
265
281
  }
282
+ /**
283
+ * Re-read the pane and throw `recheckComposerBeforeInput`'s `prompt-waiting`
284
+ * refusal when a dialog is open (Issue #4040). Any other outcome — no dialog,
285
+ * or a re-read that failed — returns, so the caller's own refusal stands.
286
+ */
287
+ async function rethrowIfDialogOpen(sessionName) {
288
+ try {
289
+ await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
290
+ }
291
+ catch (error) {
292
+ if (error.code === send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE)
293
+ throw error;
294
+ }
295
+ }
296
+ /**
297
+ * Refuse as `prompt-waiting` after {@link CopilotTool.waitForPrompt} saw a
298
+ * dialog stay up for {@link COPILOT_DIALOG_CONFIRM_MS} (Issue #4067), with the
299
+ * re-check's `code` and the wording `classifySendFailure` reads as
300
+ * `prompt-waiting`. Nothing has been typed.
301
+ *
302
+ * Refused on the wait's own reads, without reading the pane once more: those
303
+ * reads already confirmed the dialog, and another capture (tmux's own time-out
304
+ * is 5 s) would keep the picker and `/model` holding the instance's input lock
305
+ * past the confirmation time (review of #4067).
306
+ */
307
+ function refuseConfirmedDialog(sessionName) {
308
+ logger.warn('input-recheck-prompt-waiting', { sessionName, cliToolId: 'copilot', confirmedMs: exports.COPILOT_DIALOG_CONFIRM_MS });
309
+ throw Object.assign(new Error(`A prompt dialog stayed open in session ${sessionName} for ${exports.COPILOT_DIALOG_CONFIRM_MS}ms ` +
310
+ 'while the copilot composer was awaited (re-checked under the input lock); nothing was typed (Issue #4067).'), { code: send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE });
311
+ }
266
312
  /**
267
313
  * Copilot CLI tool implementation
268
314
  * Manages GitHub Copilot interactive sessions using tmux
@@ -548,17 +594,18 @@ class CopilotTool extends base_1.BaseCLITool {
548
594
  * `❯` at column 0 while it is Working, the loop captures BEFORE its first
549
595
  * sleep, and `COPILOT_PROMPT_PATTERN` matches immediately. A whole
550
596
  * `sendMessage` measured 338 ms end to end, verification included.
551
- * - **Composer gone — a dialog is up: the full 15 s, then it sends anyway.**
552
- * Measured against a session parked on copilot's own `Asked user …` question:
553
- * the window expired and the body was typed into the QUESTION's input line,
554
- * which is single-line, so a four-line message arrived as
555
- * `ping oneping twoping three…`.
597
+ * - **Composer gone — a dialog is up: the full 15 s.** Measured against a
598
+ * session parked on copilot's own `Asked user …` question: until Issue #4040
599
+ * the send then went ahead, and the body was typed into the QUESTION's input
600
+ * line, which is single-line, so a four-line message arrived as
601
+ * `ping oneping twoping three…`. Now the window expiring refuses the send.
556
602
  *
557
603
  * That second case is #559's objection, and it is real — but it is not a
558
604
  * reason to skip this method, because skipping it is what produced the same
559
- * outcome in 0 ms instead of 15 s. What keeps it out of production is the layer
560
- * above: `sendUserMessage` and the terminal route both consult
561
- * `isPromptWaiting` (#1708/#1737) and refuse before reaching here.
605
+ * outcome in 0 ms instead of 15 s. The layer above refuses most dialogs
606
+ * first: `sendUserMessage` and the terminal route both consult
607
+ * `isPromptWaiting` (#1708/#1737), and the shared sender re-reads the pane
608
+ * under the input lock (#3945).
562
609
  *
563
610
  * Issue #2623 adds a third case, measured on 1.0.85: **composer on screen,
564
611
  * copilot still starting — until loading ends (3–4.5 s).** The composer is drawn
@@ -567,23 +614,44 @@ class CopilotTool extends base_1.BaseCLITool {
567
614
  * used to end this wait in 0 ms right there, which is how `send --model` on a
568
615
  * session it had just started typed a body that never ran.
569
616
  *
570
- * Timing out still only logs and lets the send proceed, as before; the caller
571
- * that must not proceed ({@link sendModelCommand}) reads the result.
617
+ * Timing out logs and returns `ready: false`; every caller reads it and types
618
+ * nothing then — the normal send since Issue #4040 (it used to drop the result
619
+ * and send anyway), the selection-list branch and {@link sendModelCommand}.
620
+ *
621
+ * Issue #4067: a dialog does not wait out the window. A frame the shared
622
+ * sender's re-check would refuse (`detectSessionStatus().hasActivePrompt`,
623
+ * {@link recheckComposerBeforeInput}) on {@link PROMPT_WAIT_DIALOG_CONFIRM_READS}
624
+ * reads in a row spanning {@link COPILOT_DIALOG_CONFIRM_MS} returns
625
+ * `ready: false, dialog: true`, and every caller refuses it as
626
+ * `prompt-waiting`. Not counted: the folder-trust dialog (answered above,
627
+ * #1886), and a frame with the composer drawn — `idle` waits through a
628
+ * Working turn, which keeps `❯` on screen, and that is not a dialog.
629
+ *
630
+ * Issue #4084: no capture is waited for past `timeoutMs` ({@link readBeforeDeadline}):
631
+ * one still running then, or one that answers after it, is not used.
572
632
  *
573
633
  * @param sessionName - tmux session name
574
634
  * @param timeoutMs - Optional timeout in ms (default: COPILOT_PROMPT_WAIT_TIMEOUT_MS)
575
635
  * @param until - What counts as ready (Issue #2623, default `composer`)
576
- * @returns Whether the pane got there, and the last frame read (ANSI stripped)
636
+ * @returns Whether the pane got there, the last frame read (ANSI stripped),
637
+ * and whether it gave up on a dialog (Issue #4067)
577
638
  */
578
639
  async waitForPrompt(sessionName, timeoutMs = COPILOT_PROMPT_WAIT_TIMEOUT_MS, until = 'composer') {
579
- const startTime = Date.now();
640
+ // Issue #4084: one deadline for the whole wait — a capture still running at
641
+ // it is not waited for, and a frame it returns past it is not used.
642
+ const deadline = Date.now() + timeoutMs;
580
643
  const pollInterval = 500;
581
644
  let trustDialogHandled = false;
582
645
  let output = '';
583
- while (Date.now() - startTime < timeoutMs) {
646
+ // Issue #4067: the current run of reads that showed a dialog (counted by
647
+ // the helper opencode and vibe-local share, Issue #4084).
648
+ const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
649
+ while (Date.now() < deadline) {
584
650
  try {
585
651
  const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
586
- const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
652
+ const rawOutput = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, 50), deadline);
653
+ if (rawOutput === null)
654
+ break;
587
655
  output = (0, cli_patterns_1.stripAnsi)(rawOutput);
588
656
  if (this.isReadyFor(until, output)) {
589
657
  return { ready: true, output };
@@ -591,20 +659,28 @@ class CopilotTool extends base_1.BaseCLITool {
591
659
  // Issue #1886: `startSession` returns early for a session that already
592
660
  // exists, so a pane adopted from outside CommandMate -- or one whose
593
661
  // trust dialog nobody answered -- arrives here still sitting on it.
594
- // Unlike codex's, this method only logs on timeout and lets the send
595
- // proceed, which types the message body INTO the dialog; the body's
596
- // digits are option selections there, so a message containing `2` picks
597
- // "Yes, and remember this folder" and writes the operator's
598
- // machine-global ~/.copilot/config.json. Answer it here for the same
599
- // reason the launch path does, rather than leaving the worse outcome.
662
+ // Until Issue #4040 the normal send went ahead on a timeout, which
663
+ // typed the message body INTO the dialog; the body's digits are option
664
+ // selections there, so a message containing `2` picks "Yes, and
665
+ // remember this folder" and writes the operator's machine-global
666
+ // ~/.copilot/config.json. The send now refuses instead, but answering
667
+ // it here (as the launch path does) is what lets that send go through.
600
668
  if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
601
669
  trustDialogHandled = true;
602
670
  }
671
+ if (dialog.observe(this.isRefusableDialog(rawOutput, output))) {
672
+ logger.info('copilot-prompt-wait-dialog', { until, reads: dialog.reads, bottomRow: describeBottomRow(output) });
673
+ return { ready: false, output, dialog: true };
674
+ }
603
675
  }
604
676
  catch {
605
- // Capture may fail - continue polling
677
+ // Capture may fail - continue polling. Not a dialog read: the run restarts.
678
+ dialog.reset();
606
679
  }
607
- await new Promise((resolve) => setTimeout(resolve, pollInterval));
680
+ const remaining = deadline - Date.now();
681
+ if (remaining <= 0)
682
+ break;
683
+ await new Promise((resolve) => setTimeout(resolve, Math.min(pollInterval, remaining)));
608
684
  }
609
685
  logger.info('copilot-prompt-not-detected', { until, bottomRow: describeBottomRow(output) });
610
686
  return { ready: false, output };
@@ -620,6 +696,32 @@ class CopilotTool extends base_1.BaseCLITool {
620
696
  * @param until - What counts as ready
621
697
  * @param output - ANSI-stripped pane capture
622
698
  */
699
+ /**
700
+ * {@link isReadyFor}`('composer')` for the shared sender's read under the
701
+ * input lock (Issue #4040). Not `idle`: copilot draws `❯` while Working and
702
+ * takes a body then, as it always has.
703
+ */
704
+ inputReadiness = {
705
+ label: 'copilot',
706
+ isReady: (frame) => this.isReadyFor('composer', (0, cli_patterns_1.stripAnsi)(frame)),
707
+ };
708
+ /**
709
+ * Whether {@link waitForPrompt} counts this frame towards giving up on a
710
+ * dialog (Issue #4067): the shared sender's re-check would refuse it
711
+ * (`hasActivePrompt`), it is not the folder-trust dialog `waitForPrompt`
712
+ * answers itself (#1886), and no composer is drawn — a Working turn keeps
713
+ * `❯` up and is waited through, not refused.
714
+ *
715
+ * @param rawOutput - The capture as read (ANSI allowed), for the detector
716
+ * @param output - The same capture, ANSI stripped
717
+ */
718
+ isRefusableDialog(rawOutput, output) {
719
+ if ((0, cli_patterns_1.isCopilotFolderTrustDialog)(output))
720
+ return false;
721
+ if (this.isReadyFor('composer', output))
722
+ return false;
723
+ return (0, status_detector_1.detectSessionStatus)(rawOutput, 'copilot').hasActivePrompt;
724
+ }
623
725
  isReadyFor(until, output) {
624
726
  if (!cli_patterns_1.COPILOT_PROMPT_PATTERN.test(output))
625
727
  return false;
@@ -700,6 +802,10 @@ class CopilotTool extends base_1.BaseCLITool {
700
802
  // then refuses on the same terms right before the keys: a dialog is
701
803
  // `prompt-waiting`, a pane that cannot be read `recheck-failed`.
702
804
  const prompt = await this.waitForPrompt(sessionName);
805
+ // Issue #4067: a dialog that stayed up is refused at once — the lock
806
+ // is not held for the rest of the window behind it.
807
+ if (prompt.dialog)
808
+ refuseConfirmedDialog(sessionName);
703
809
  await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
704
810
  if (!prompt.ready) {
705
811
  // review-3: neither the request nor the pane goes into the message.
@@ -723,8 +829,25 @@ class CopilotTool extends base_1.BaseCLITool {
723
829
  logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
724
830
  return;
725
831
  }
726
- // Verify Copilot is at prompt state before sending
727
- await this.waitForPrompt(sessionName);
832
+ // Verify Copilot is at prompt state before sending. Issue #4040: a
833
+ // composer that never came up is not typed into — refused as the
834
+ // selection-list branch refuses (review-3: neither the body nor the pane
835
+ // goes into the message, which `classifySendFailure` reads).
836
+ const prompt = await this.waitForPrompt(sessionName);
837
+ if (!prompt.ready) {
838
+ // Issue #4067: the wait gave up on a dialog after its confirmation time
839
+ // rather than the whole 15 s window.
840
+ if (prompt.dialog)
841
+ refuseConfirmedDialog(sessionName);
842
+ // A dialog that opened during the wait and is still up is refused as
843
+ // the shared sender's re-check refuses it — `prompt-waiting` (409
844
+ // PROMPT_WAITING), not `prompt-not-ready`. A re-read that fails is
845
+ // left to the refusal below.
846
+ await rethrowIfDialogOpen(sessionName);
847
+ logger.warn('copilot-message-not-sent:prompt-not-ready', { bottomRow: describeBottomRow(prompt.output) });
848
+ throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
849
+ 'so the message was not sent; nothing was typed');
850
+ }
728
851
  // Issue #1471: Body/Enter separation + read-back submit verification via the
729
852
  // shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
730
853
  // Copilot's own text-input / post-Enter delays are preserved. The selection
@@ -736,6 +859,8 @@ class CopilotTool extends base_1.BaseCLITool {
736
859
  composer: this.describeComposer(),
737
860
  textInputWaitMs: copilot_constants_1.COPILOT_TEXT_INPUT_DELAY_MS,
738
861
  verifyDelayMs: copilot_constants_1.COPILOT_SEND_ENTER_DELAY_MS,
862
+ // Issue #4040: the same test, of the newest frame read under the lock.
863
+ readiness: this.inputReadiness,
739
864
  });
740
865
  // Invalidate cache after sending message
741
866
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
@@ -822,6 +947,10 @@ class CopilotTool extends base_1.BaseCLITool {
822
947
  await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
823
948
  const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
824
949
  if (!idle.ready) {
950
+ // Issue #4067: a dialog is refused after its confirmation time, not after
951
+ // the 30 s window under the lock.
952
+ if (idle.dialog)
953
+ refuseConfirmedDialog(sessionName);
825
954
  // The pane's text goes to the log, not the message: the message is read by
826
955
  // `classifySendFailure`, which a screen quoting its keywords would steer (#3954).
827
956
  logger.warn('copilot-model-switch-not-idle', { model: modelName, bottomRow: describeBottomRow(idle.output) });
@@ -52,6 +52,10 @@ const terminal_keys_1 = require("../../types/terminal-keys");
52
52
  const tmux_1 = require("../tmux/tmux");
53
53
  const cli_patterns_1 = require("../detection/cli-patterns");
54
54
  const submit_verified_sender_1 = require("./submit-verified-sender");
55
+ const readiness_1 = require("../detection/tools/opencode/readiness");
56
+ const status_detector_1 = require("../detection/status-detector");
57
+ const prompt_wait_dialog_1 = require("./prompt-wait-dialog");
58
+ const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
55
59
  const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
56
60
  const opencode_config_1 = require("./opencode-config");
57
61
  const tmux_pane_config_1 = require("../../config/tmux-pane-config");
@@ -110,6 +114,28 @@ exports.OPENCODE_READY_MAX_ATTEMPTS = 60;
110
114
  * in the frame regardless of this number. Matches copilot's 50.
111
115
  */
112
116
  const OPENCODE_READY_CAPTURE_LINES = 50;
117
+ /**
118
+ * How long a send that has to fall back to the keyboard waits for the input
119
+ * box (Issue #4040) — the same 15 s as gemini's and codex's send waits. The
120
+ * launch window (`OPENCODE_READY_*`, 30 s) is the launch's; a send arrives
121
+ * after it, and a pane still not up 15 s later is refused as `not-sent`
122
+ * rather than typed into.
123
+ */
124
+ const OPENCODE_PROMPT_WAIT_TIMEOUT_MS = 15000;
125
+ /** Interval between the send's readiness polls (Issue #4040). */
126
+ const OPENCODE_PROMPT_POLL_INTERVAL_MS = 500;
127
+ /**
128
+ * Whether {@link OpenCodeTool}'s keyboard-fallback wait counts this frame
129
+ * towards giving up on a dialog (Issue #4084): an active prompt, or opencode's
130
+ * `waiting` without one (its permission strip, pickers, palette and overlays
131
+ * answer with keys, #1896) — and never a turn being generated. There is no
132
+ * folder-trust dialog here to leave out: this wait answers none.
133
+ */
134
+ function isOpenCodeWaitDialog(status) {
135
+ if ((0, status_detector_1.isGeneratingStatus)(status))
136
+ return false;
137
+ return status.hasActivePrompt || status.status === 'waiting';
138
+ }
113
139
  /**
114
140
  * Waits before each read-back of a message just posted to the server (#2035).
115
141
  *
@@ -498,12 +524,16 @@ class OpenCodeTool extends base_1.BaseCLITool {
498
524
  * @param imagePath - Absolute path to an attachment, if there is one
499
525
  * @returns Whether the message was posted **and** read back
500
526
  */
501
- async trySendViaServer(target, message, imagePath) {
527
+ async trySendViaServer(target, message, imagePath, trace) {
502
528
  const outcome = await this.dispatchViaServer(target, message, imagePath);
503
529
  if (outcome === 'delivered')
504
530
  return true;
505
531
  if (outcome !== 'skipped')
506
532
  (0, instance_input_lock_1.noteDispatchFailed)(outcome);
533
+ // Issue #4040: an `unknown` dispatch may have delivered the message, so a
534
+ // keyboard fallback that then refuses must not report the send `not-sent`.
535
+ if (outcome === 'unknown' && trace !== undefined)
536
+ trace.unknown = true;
507
537
  return false;
508
538
  }
509
539
  /**
@@ -655,10 +685,24 @@ class OpenCodeTool extends base_1.BaseCLITool {
655
685
  * `CM_AGENT_HOOKS_INJECT=0`, or on an opencode too old for `--port`, must not
656
686
  * become a pane that cannot be sent to.
657
687
  *
688
+ * Issue #4040: that keyboard path now waits for an empty input box first
689
+ * (`waitForPrompt`, and again under the input lock) and refuses as
690
+ * `not-sent` / `prompt-not-ready` when none comes up — unless the server
691
+ * dispatch before it ended `unknown`, in which case the refusal stays
692
+ * `indeterminate`. A `delivered` send neither waits nor types.
693
+ *
658
694
  * @param worktreeId - Worktree ID
659
695
  * @param message - Message to send
660
696
  */
661
697
  async sendMessage(worktreeId, message, instanceId) {
698
+ await this.sendMessageAfterDispatch(worktreeId, message, instanceId, { unknown: false });
699
+ }
700
+ /**
701
+ * {@link sendMessage}'s body, carrying whether a server dispatch earlier in
702
+ * the same send ended `unknown` (Issue #4040): {@link sendMessageWithImage}'s
703
+ * image dispatch is one, and its path fallback comes back through here.
704
+ */
705
+ async sendMessageAfterDispatch(worktreeId, message, instanceId, trace) {
662
706
  const sessionName = this.getSessionName(worktreeId, instanceId);
663
707
  // Issue #2070: the pane exists, but does the AGENT? An agent that quit,
664
708
  // updated itself or crashed leaves its tmux session behind, and the send
@@ -671,14 +715,27 @@ class OpenCodeTool extends base_1.BaseCLITool {
671
715
  // typing the message into a shell prompt. The relaunch reserves a port and
672
716
  // re-attaches, so the server path is available again by the time it is
673
717
  // tried. `sendMessageWithImage` reaches this through its own fallback.
674
- await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: true });
675
- if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message)) {
718
+ //
719
+ // Issue #4040: when that fallback follows an `unknown` image dispatch, a
720
+ // refusal here (`SESSION_STARTING`, a pane that is gone) typed nothing but
721
+ // does not make the send as a whole safe to resend either.
722
+ try {
723
+ await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: true });
724
+ }
725
+ catch (error) {
726
+ throw this.keepUnknownDispatch(error, trace, sessionName) ?? error;
727
+ }
728
+ if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message, undefined, trace)) {
676
729
  // Issue #405: the transcript grew, so the cached capture is stale — the
677
730
  // same reason the keystroke path invalidates below.
678
731
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
679
732
  return;
680
733
  }
681
734
  try {
735
+ // Issue #4040: the keyboard fallback types only into an input box that is
736
+ // up and empty — the first send to a new pane always lands here (no
737
+ // session id yet), as does every send of a pane with no live server.
738
+ await this.waitForPrompt(sessionName);
682
739
  // Issue #1471: Body/Enter separation + read-back submit verification via the
683
740
  // shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
684
741
  await (0, submit_verified_sender_1.sendMessageWithSubmitVerification)({
@@ -686,6 +743,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
686
743
  message,
687
744
  cliToolId: 'opencode',
688
745
  composer: this.describeComposer(),
746
+ // Issue #4040: the same test, of the newest frame read under the input lock.
747
+ readiness: { label: 'OpenCode', isReady: readiness_1.isOpenCodeComposerReady },
689
748
  });
690
749
  // Issue #405: Invalidate cache after sending message
691
750
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
@@ -693,10 +752,97 @@ class OpenCodeTool extends base_1.BaseCLITool {
693
752
  }
694
753
  catch (error) {
695
754
  const errorMessage = (0, errors_1.getErrorMessage)(error);
755
+ // Issue #4040: the keyboard typed nothing (no ready input box — or any
756
+ // other refusal before the first key: a dialog, the lock), but the server
757
+ // dispatch before it may have delivered the message, so the send as a
758
+ // whole stays unknown rather than "safe to resend".
759
+ const kept = this.keepUnknownDispatch(error, trace, sessionName);
760
+ if (kept)
761
+ throw kept;
696
762
  // Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
697
763
  throw new Error(`Failed to send message to OpenCode: ${errorMessage}`, { cause: error });
698
764
  }
699
765
  }
766
+ /**
767
+ * The error a refusal with nothing typed becomes after a server dispatch of
768
+ * the same send ended `unknown` (Issue #4040): the message may already be
769
+ * there, so `classifySendFailure` must read the send as indeterminate.
770
+ *
771
+ * @returns the wrapped error, or `null` when the dispatch was not `unknown`
772
+ * or the refusal is not a `not-sent` one (the caller throws its own)
773
+ */
774
+ keepUnknownDispatch(error, trace, sessionName) {
775
+ if (!trace.unknown)
776
+ return null;
777
+ const refusal = (0, send_attempt_state_1.classifySendFailure)(error);
778
+ if (refusal.state !== 'not-sent')
779
+ return null;
780
+ logger.warn('opencode-send-not-typed-after-unknown-dispatch', { sessionName, reason: refusal.reason });
781
+ return new Error(`Failed to send message to OpenCode: the keyboard fallback typed nothing (${refusal.reason}), ` +
782
+ 'but an earlier server dispatch may have delivered the message (Issue #4040)', { cause: error });
783
+ }
784
+ /**
785
+ * Wait for an empty input box before the keyboard fallback types (Issue #4040).
786
+ *
787
+ * {@link isOpenCodeComposerReady} is the test: the box on screen, empty, and
788
+ * no dialog or overlay over it (the `Connect a provider` overlay included —
789
+ * every option on it writes credentials, so it is never typed into).
790
+ *
791
+ * A dialog or overlay ({@link isOpenCodeWaitDialog}) does not keep the send
792
+ * here for the whole window behind a choice only a person can make — but
793
+ * since Issue #4084 it ends the wait only once confirmed: seen on 2 reads in a
794
+ * row spanning {@link PROMPT_WAIT_DIALOG_CONFIRM_MS}, the count copilot's wait
795
+ * uses (#4067). It used to end the wait on one read, so a frame mid-paint
796
+ * could cut the wait short. A confirmed dialog is refused at once on the
797
+ * wait's own reads, as the shared sender's re-check under the lock would have
798
+ * refused it: `prompt-waiting` when the detector reports an active prompt,
799
+ * otherwise `prompt-not-ready` (opencode's permission strip, pickers and
800
+ * palette read as `waiting` without `hasActivePrompt`, #1896). A dialog that
801
+ * opens after the wait is still refused under the input lock on one read. No
802
+ * capture is waited for past the window: one still running at the deadline
803
+ * is not used.
804
+ *
805
+ * @throws Error (`OpenCode prompt not ready`) when the box did not come up
806
+ * within {@link OPENCODE_PROMPT_WAIT_TIMEOUT_MS}, or a dialog without an
807
+ * active prompt was confirmed; nothing was typed
808
+ * @throws Error coded `prompt-waiting` ({@link confirmedDialogRefusal}) for a
809
+ * confirmed dialog the detector reads as an active prompt; nothing was typed
810
+ */
811
+ async waitForPrompt(sessionName) {
812
+ const deadline = Date.now() + OPENCODE_PROMPT_WAIT_TIMEOUT_MS;
813
+ const dialog = (0, prompt_wait_dialog_1.createDialogConfirmation)();
814
+ while (Date.now() < deadline) {
815
+ let refusal = null;
816
+ try {
817
+ const output = await (0, prompt_wait_dialog_1.readBeforeDeadline)(() => (0, tmux_1.capturePane)(sessionName, OPENCODE_READY_CAPTURE_LINES), deadline);
818
+ if (output === null)
819
+ break;
820
+ if ((0, readiness_1.isOpenCodeComposerReady)(output))
821
+ return;
822
+ const status = (0, status_detector_1.detectSessionStatus)(output, 'opencode');
823
+ if (dialog.observe(isOpenCodeWaitDialog(status))) {
824
+ logger.warn('opencode-prompt-wait-dialog', { sessionName, reads: dialog.reads, reason: status.reason });
825
+ refusal = status.hasActivePrompt
826
+ ? (0, prompt_wait_dialog_1.confirmedDialogRefusal)(sessionName, 'OpenCode')
827
+ : new Error(`OpenCode prompt not ready: a dialog or overlay (${status.reason}) stayed up for ` +
828
+ `${prompt_wait_dialog_1.PROMPT_WAIT_DIALOG_CONFIRM_MS}ms before sending; nothing was typed (Issue #4084)`);
829
+ }
830
+ }
831
+ catch (error) {
832
+ // Capture may fail - continue polling. Not a dialog read: the run restarts.
833
+ dialog.reset();
834
+ logger.debug('opencode-prompt-capture-failed', { sessionName, error: (0, errors_1.getErrorMessage)(error) });
835
+ }
836
+ if (refusal)
837
+ throw refusal;
838
+ const remaining = deadline - Date.now();
839
+ if (remaining <= 0)
840
+ break;
841
+ await new Promise((resolve) => setTimeout(resolve, Math.min(OPENCODE_PROMPT_POLL_INTERVAL_MS, remaining)));
842
+ }
843
+ logger.info('opencode-prompt-not-detected');
844
+ throw new Error('OpenCode prompt not ready: timed out waiting for the input prompt before sending');
845
+ }
700
846
  /**
701
847
  * opencode can attach an image — sometimes (Issue #2035).
702
848
  *
@@ -724,7 +870,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
724
870
  *
725
871
  * The fallback is that same degraded body, reached whenever the server route
726
872
  * does not apply, and it is deliberately routed back through
727
- * {@link sendMessage} rather than `sendMessageWithSubmitVerification`: the
873
+ * {@link sendMessage}'s body (`sendMessageAfterDispatch`, carrying whether
874
+ * the image dispatch ended `unknown` — Issue #4040) rather than
875
+ * `sendMessageWithSubmitVerification`: the
728
876
  * reason the image could not be attached is usually "no session yet", and by
729
877
  * the time the text is sent that can already have changed. Going through
730
878
  * `sendMessage` gives the text one honest attempt at the API before the
@@ -739,12 +887,15 @@ class OpenCodeTool extends base_1.BaseCLITool {
739
887
  const sessionName = this.getSessionName(worktreeId, instanceId);
740
888
  await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: false });
741
889
  const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
742
- if (await this.trySendViaServer(target, message, imagePath)) {
890
+ // Issue #4040: one trace for the whole send, so an `unknown` image dispatch
891
+ // is not forgotten when the path fallback's own dispatch is refused.
892
+ const trace = { unknown: false };
893
+ if (await this.trySendViaServer(target, message, imagePath, trace)) {
743
894
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
744
895
  return;
745
896
  }
746
897
  logger.info('opencode-image-degraded-to-path', { worktreeId, instanceId: instanceId ?? this.id });
747
- await this.sendMessage(worktreeId, formatImagePathFallbackMessage(message, imagePath), instanceId);
898
+ await this.sendMessageAfterDispatch(worktreeId, formatImagePathFallbackMessage(message, imagePath), instanceId, trace);
748
899
  }
749
900
  /**
750
901
  * Kill OpenCode session with graceful shutdown.
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ /**
3
+ * Giving up on a dialog in a tool's own prompt wait — the wait before the
4
+ * input lock (Issue #4067 for copilot, Issue #4084 for opencode and
5
+ * vibe-local).
6
+ *
7
+ * A dialog waits for a person, so the wait does not sit out its whole window
8
+ * (15 s) behind it. But a frame caught mid-paint can read as a dialog once, so
9
+ * one read is not enough: the dialog has to be seen on
10
+ * {@link PROMPT_WAIT_DIALOG_CONFIRM_READS} reads in a row spanning
11
+ * {@link PROMPT_WAIT_DIALOG_CONFIRM_MS}. A read without a dialog, or a capture
12
+ * that failed, starts the run again.
13
+ *
14
+ * What counts as a dialog is each tool's own test (copilot excludes its
15
+ * folder-trust dialog and a drawn composer; opencode counts `waiting` without
16
+ * `hasActivePrompt`; nobody counts a Working frame). This module only counts.
17
+ *
18
+ * Only the wait's screen reading is confirmed this way. The prompt guard at
19
+ * the service entry (which also reads the hooks' structured record) and the
20
+ * re-check under the input lock still decide on one read.
21
+ *
22
+ * @module lib/cli-tools/prompt-wait-dialog
23
+ */
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.PROMPT_WAIT_DIALOG_CONFIRM_READS = exports.PROMPT_WAIT_DIALOG_CONFIRM_MS = void 0;
26
+ exports.createDialogConfirmation = createDialogConfirmation;
27
+ exports.readBeforeDeadline = readBeforeDeadline;
28
+ exports.confirmedDialogRefusal = confirmedDialogRefusal;
29
+ const send_attempt_types_1 = require("../../lib/session/send-attempt-types");
30
+ /** How long a dialog has to stay up before a prompt wait gives up on it. */
31
+ exports.PROMPT_WAIT_DIALOG_CONFIRM_MS = 2000;
32
+ /** On how many reads in a row (both thresholds must hold). */
33
+ exports.PROMPT_WAIT_DIALOG_CONFIRM_READS = 2;
34
+ /** A fresh, empty run. */
35
+ function createDialogConfirmation() {
36
+ let since = null;
37
+ let reads = 0;
38
+ return {
39
+ observe(isDialog, now = Date.now()) {
40
+ if (!isDialog) {
41
+ since = null;
42
+ reads = 0;
43
+ return false;
44
+ }
45
+ since ??= now;
46
+ reads++;
47
+ return reads >= exports.PROMPT_WAIT_DIALOG_CONFIRM_READS && now - since >= exports.PROMPT_WAIT_DIALOG_CONFIRM_MS;
48
+ },
49
+ reset() {
50
+ since = null;
51
+ reads = 0;
52
+ },
53
+ get reads() {
54
+ return reads;
55
+ },
56
+ };
57
+ }
58
+ /**
59
+ * Run `read` (a capture), but stop waiting for it at `deadline` (Issue #4084):
60
+ * a capture that is still running then (tmux's own time-out is 5 s) does not
61
+ * stretch the wait past its window, and the frame it returns late is not used.
62
+ *
63
+ * The clock is checked again once the race has answered, as the wait under the
64
+ * input lock does (`awaitReadyUnderLock`): when the capture's completion is
65
+ * handled before the deadline's timer, the race answers with a frame read past
66
+ * the deadline, and that frame is not used either (nor a failure that late).
67
+ *
68
+ * @returns what `read` returned, or `null` when the deadline came first
69
+ * @throws what `read` threw, when it threw before the deadline
70
+ */
71
+ async function readBeforeDeadline(read, deadline) {
72
+ const remaining = deadline - Date.now();
73
+ if (remaining <= 0)
74
+ return null;
75
+ let timer;
76
+ const reading = read();
77
+ // A late failure is nobody's to handle once the deadline has answered.
78
+ reading.catch(() => undefined);
79
+ let result;
80
+ try {
81
+ result = await Promise.race([
82
+ reading,
83
+ new Promise((resolve) => {
84
+ timer = setTimeout(() => resolve(null), remaining);
85
+ }),
86
+ ]);
87
+ }
88
+ catch (error) {
89
+ if (Date.now() > deadline)
90
+ return null;
91
+ throw error;
92
+ }
93
+ finally {
94
+ if (timer !== undefined)
95
+ clearTimeout(timer);
96
+ }
97
+ // Answered past the deadline, whichever settled first: the wait is over.
98
+ if (Date.now() > deadline)
99
+ return null;
100
+ return result;
101
+ }
102
+ /**
103
+ * The `prompt-waiting` refusal of a dialog a prompt wait confirmed (Issue
104
+ * #4084), worded and coded as the re-check under the input lock words it
105
+ * (`recheckComposerBeforeInput`), which is what `classifySendFailure` and the
106
+ * send service read. Nothing has been typed. Refused on the wait's own reads,
107
+ * without reading the pane once more.
108
+ *
109
+ * The wording must not say "prompt not ready": the classifier matches that
110
+ * first.
111
+ */
112
+ function confirmedDialogRefusal(sessionName, label) {
113
+ return Object.assign(new Error(`A prompt dialog stayed open in session ${sessionName} for ${exports.PROMPT_WAIT_DIALOG_CONFIRM_MS}ms ` +
114
+ `while the ${label} input prompt was awaited (re-checked under the input lock); nothing was typed (Issue #4084).`), { code: send_attempt_types_1.INPUT_RECHECK_PROMPT_WAITING_CODE });
115
+ }