commandmate 0.49.0 → 0.49.2

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 (806) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +251 -248
  3. package/.next/app-path-routes-manifest.json +22 -21
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  27. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  28. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  30. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  31. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  39. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/[relayId]/route.js +1 -0
  45. package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
  46. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
  47. package/.next/server/app/api/relays/route.js +1 -1
  48. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  49. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/clone/route.js +1 -1
  56. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/restore/route.js +1 -1
  60. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/route.js +1 -1
  63. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/scan/route.js +1 -1
  66. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/sync/route.js +1 -1
  69. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  73. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  74. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  85. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  89. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/verification/runs/route.js +1 -1
  91. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -1
  175. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
  181. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/send/route.js +144 -1
  222. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  239. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
  243. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  263. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  266. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/api/worktrees/route.js +1 -1
  275. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  276. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  277. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  279. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  283. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/review/page.js +1 -1
  285. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app/sessions/page.js +1 -1
  287. package/.next/server/app/sessions/page.js.nft.json +1 -1
  288. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  289. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  290. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  291. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  292. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  293. package/.next/server/app/worktrees/[id]/page.js +11 -11
  294. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  295. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  296. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  297. package/.next/server/app-paths-manifest.json +22 -21
  298. package/.next/server/chunks/1062.js +1 -0
  299. package/.next/server/chunks/{936.js → 110.js} +1 -1
  300. package/.next/server/chunks/1501.js +5 -4
  301. package/.next/server/chunks/1656.js +2 -2
  302. package/.next/server/chunks/1957.js +2 -0
  303. package/.next/server/chunks/2119.js +1 -1
  304. package/.next/server/chunks/2404.js +1 -1
  305. package/.next/server/chunks/2445.js +1 -1
  306. package/.next/server/chunks/2897.js +1 -0
  307. package/.next/server/chunks/3417.js +1 -0
  308. package/.next/server/chunks/3505.js +1 -1
  309. package/.next/server/chunks/{4280.js → 3756.js} +1 -1
  310. package/.next/server/chunks/3801.js +31 -0
  311. package/.next/server/chunks/4911.js +1 -0
  312. package/.next/server/chunks/4936.js +1 -0
  313. package/.next/server/chunks/5209.js +2 -1
  314. package/.next/server/chunks/5354.js +1 -1
  315. package/.next/server/chunks/{9130.js → 5630.js} +1 -1
  316. package/.next/server/chunks/610.js +1 -0
  317. package/.next/server/chunks/6119.js +1 -1
  318. package/.next/server/chunks/6130.js +1 -1
  319. package/.next/server/chunks/6401.js +1 -1
  320. package/.next/server/chunks/6486.js +1 -1
  321. package/.next/server/chunks/6781.js +1 -1
  322. package/.next/server/chunks/6808.js +4 -0
  323. package/.next/server/chunks/7023.js +14 -0
  324. package/.next/server/chunks/7905.js +1 -1
  325. package/.next/server/chunks/8581.js +8 -8
  326. package/.next/server/chunks/8728.js +2 -2
  327. package/.next/server/chunks/8782.js +1 -1
  328. package/.next/server/chunks/8807.js +63 -53
  329. package/.next/server/chunks/8918.js +103 -1
  330. package/.next/server/chunks/9198.js +144 -0
  331. package/.next/server/chunks/9390.js +1 -1
  332. package/.next/server/chunks/9584.js +1 -1
  333. package/.next/server/chunks/9627.js +1 -1
  334. package/.next/server/chunks/9731.js +3 -3
  335. package/.next/server/middleware-manifest.json +5 -5
  336. package/.next/server/pages/500.html +1 -1
  337. package/.next/server/server-reference-manifest.json +1 -1
  338. package/.next/static/chunks/{2407-ab92ae9837c39dce.js → 2407-07a237575e1ceb9e.js} +1 -1
  339. package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +1 -0
  340. package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
  341. package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
  342. package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
  343. package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
  344. package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
  345. package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
  346. package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
  347. package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
  348. package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
  349. package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
  350. package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
  351. package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
  352. package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
  353. package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
  354. package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
  355. package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
  356. package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
  357. package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
  358. package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
  359. package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
  360. package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
  361. package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
  362. package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
  363. package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
  364. package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
  365. package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
  366. package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
  367. package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
  368. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
  369. package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
  370. package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
  371. package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
  372. package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
  373. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
  374. package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
  375. package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
  376. package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
  377. package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
  378. package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
  379. package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
  380. package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
  381. package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
  382. package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
  383. package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
  384. package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
  385. package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
  386. package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
  387. package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
  388. package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
  389. package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
  390. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
  391. package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
  392. package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
  393. package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
  394. package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
  395. package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
  478. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
  479. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
  480. package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
  481. package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +1 -0
  482. package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
  483. package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
  484. package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
  485. package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
  486. package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
  487. package/.next/static/chunks/app/sessions/page-c6eb7c02db2f4c80.js +1 -0
  488. package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
  489. package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +1 -0
  490. package/.next/static/css/c1e307d05daf93b6.css +1 -0
  491. package/.next/trace +13 -13
  492. package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
  493. package/.next/types/routes.d.ts +2 -1
  494. package/.next/types/validator.ts +9 -0
  495. package/dist/cli/commands/ask.d.ts.map +1 -1
  496. package/dist/cli/commands/ask.js +233 -17
  497. package/dist/cli/commands/attach.d.ts +4 -1
  498. package/dist/cli/commands/attach.d.ts.map +1 -1
  499. package/dist/cli/commands/attach.js +19 -7
  500. package/dist/cli/commands/command-target.d.ts +7 -0
  501. package/dist/cli/commands/command-target.d.ts.map +1 -1
  502. package/dist/cli/commands/command-target.js +10 -0
  503. package/dist/cli/commands/instances.d.ts.map +1 -1
  504. package/dist/cli/commands/instances.js +38 -2
  505. package/dist/cli/commands/message-dispatch.d.ts +39 -5
  506. package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
  507. package/dist/cli/commands/message-dispatch.js +100 -8
  508. package/dist/cli/commands/relays.d.ts +26 -2
  509. package/dist/cli/commands/relays.d.ts.map +1 -1
  510. package/dist/cli/commands/relays.js +70 -5
  511. package/dist/cli/commands/respond-strict.d.ts.map +1 -1
  512. package/dist/cli/commands/respond-strict.js +22 -5
  513. package/dist/cli/commands/respond.d.ts +12 -0
  514. package/dist/cli/commands/respond.d.ts.map +1 -1
  515. package/dist/cli/commands/respond.js +83 -18
  516. package/dist/cli/commands/send.d.ts.map +1 -1
  517. package/dist/cli/commands/send.js +14 -8
  518. package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
  519. package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
  520. package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
  521. package/dist/cli/commands/wait-instance.d.ts +29 -0
  522. package/dist/cli/commands/wait-instance.d.ts.map +1 -0
  523. package/dist/cli/commands/wait-instance.js +56 -0
  524. package/dist/cli/commands/wait-notices.d.ts +87 -0
  525. package/dist/cli/commands/wait-notices.d.ts.map +1 -0
  526. package/dist/cli/commands/wait-notices.js +301 -0
  527. package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
  528. package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
  529. package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
  530. package/dist/cli/commands/wait-poll-state.d.ts +136 -0
  531. package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
  532. package/dist/cli/commands/wait-poll-state.js +6 -0
  533. package/dist/cli/commands/wait-timing.d.ts +46 -0
  534. package/dist/cli/commands/wait-timing.d.ts.map +1 -0
  535. package/dist/cli/commands/wait-timing.js +99 -0
  536. package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
  537. package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
  538. package/dist/cli/commands/wait-turn-boundary.js +427 -0
  539. package/dist/cli/commands/wait-verify.d.ts +51 -0
  540. package/dist/cli/commands/wait-verify.d.ts.map +1 -0
  541. package/dist/cli/commands/wait-verify.js +128 -0
  542. package/dist/cli/commands/wait.d.ts +6 -105
  543. package/dist/cli/commands/wait.d.ts.map +1 -1
  544. package/dist/cli/commands/wait.js +240 -968
  545. package/dist/cli/commands/whoami.d.ts.map +1 -1
  546. package/dist/cli/commands/whoami.js +3 -1
  547. package/dist/cli/docs/agent-operations.d.ts +2 -2
  548. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  549. package/dist/cli/docs/agent-operations.js +24 -1
  550. package/dist/cli/types/api-responses.d.ts +49 -3
  551. package/dist/cli/types/api-responses.d.ts.map +1 -1
  552. package/dist/cli/utils/api-client.d.ts +69 -1
  553. package/dist/cli/utils/api-client.d.ts.map +1 -1
  554. package/dist/cli/utils/api-client.js +226 -18
  555. package/dist/cli/utils/follow-up-command.d.ts +38 -0
  556. package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
  557. package/dist/cli/utils/follow-up-command.js +57 -0
  558. package/dist/cli/utils/reply-ledger.d.ts +80 -1
  559. package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
  560. package/dist/cli/utils/reply-ledger.js +147 -2
  561. package/dist/cli/utils/server-capabilities.d.ts +18 -0
  562. package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
  563. package/dist/cli/utils/server-capabilities.js +36 -3
  564. package/dist/cli/utils/session-target.d.ts +1 -1
  565. package/dist/cli/utils/session-target.d.ts.map +1 -1
  566. package/dist/cli/utils/session-target.js +3 -0
  567. package/dist/cli/utils/verify-runner.d.ts +7 -0
  568. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  569. package/dist/cli/utils/verify-runner.js +51 -15
  570. package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
  571. package/dist/lib/cli-tools/session-name.js +11 -3
  572. package/dist/lib/session/send-attempt-types.d.ts +48 -1
  573. package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
  574. package/dist/lib/session/send-attempt-types.js +18 -1
  575. package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
  576. package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
  577. package/dist/lib/verification/session-kill-ledger.js +174 -0
  578. package/dist/server/locales/en/worktree.json +20 -3
  579. package/dist/server/locales/ja/worktree.json +20 -3
  580. package/dist/server/src/config/cli-tool-timing-config.js +1 -7
  581. package/dist/server/src/lib/auto-yes-poller.js +54 -11
  582. package/dist/server/src/lib/cli-tools/antigravity.js +45 -9
  583. package/dist/server/src/lib/cli-tools/base.js +39 -0
  584. package/dist/server/src/lib/cli-tools/codex.js +67 -15
  585. package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
  586. package/dist/server/src/lib/cli-tools/command-code.js +7 -3
  587. package/dist/server/src/lib/cli-tools/copilot.js +125 -33
  588. package/dist/server/src/lib/cli-tools/gemini.js +37 -10
  589. package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
  590. package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
  591. package/dist/server/src/lib/cli-tools/opencode.js +60 -15
  592. package/dist/server/src/lib/cli-tools/session-name.js +11 -3
  593. package/dist/server/src/lib/cli-tools/submit-composer-read.js +590 -0
  594. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +512 -620
  595. package/dist/server/src/lib/cli-tools/vibe-local.js +4 -2
  596. package/dist/server/src/lib/db/db-migration-path.js +63 -2
  597. package/dist/server/src/lib/db/migrations/index.js +2 -0
  598. package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
  599. package/dist/server/src/lib/db/migrations/runner.js +37 -4
  600. package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
  601. package/dist/server/src/lib/db/relay-bind-db.js +437 -0
  602. package/dist/server/src/lib/db/relay-db.js +59 -96
  603. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
  604. package/dist/server/src/lib/detection/upstream-faults.js +40 -6
  605. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
  606. package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
  607. package/dist/server/src/lib/polling/response-checker.js +7 -5
  608. package/dist/server/src/lib/prompt-answer-errors.js +362 -0
  609. package/dist/server/src/lib/prompt-answer-sender.js +264 -288
  610. package/dist/server/src/lib/push/failure-episode-state.js +4 -1
  611. package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
  612. package/dist/server/src/lib/realtime-snippet.js +54 -0
  613. package/dist/server/src/lib/relay/relay-bind.js +294 -0
  614. package/dist/server/src/lib/relay/relay-boot.js +51 -0
  615. package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
  616. package/dist/server/src/lib/relay/relay-delivery.js +134 -220
  617. package/dist/server/src/lib/relay/relay-messages.js +39 -4
  618. package/dist/server/src/lib/relay/relay-overlap.js +92 -0
  619. package/dist/server/src/lib/relay/relay-system-line.js +3 -2
  620. package/dist/server/src/lib/relay/types.js +12 -1
  621. package/dist/server/src/lib/session/agent-event-state.js +4 -0
  622. package/dist/server/src/lib/session/agent-session-lifecycle.js +23 -0
  623. package/dist/server/src/lib/session/claude-session.js +59 -8
  624. package/dist/server/src/lib/session/composer-clear.js +54 -1
  625. package/dist/server/src/lib/session/current-output-builder.js +26 -8
  626. package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
  627. package/dist/server/src/lib/session/instance-input-lock.js +664 -0
  628. package/dist/server/src/lib/session/prompt-submit-receipt.js +155 -0
  629. package/dist/server/src/lib/session/prompt-waiting-guard.js +10 -3
  630. package/dist/server/src/lib/session/send-attempt-state.js +65 -0
  631. package/dist/server/src/lib/session/send-attempt-types.js +18 -1
  632. package/dist/server/src/lib/session/send-user-message.js +84 -14
  633. package/dist/server/src/lib/session/session-launch-flight.js +243 -0
  634. package/dist/server/src/lib/session/session-starting-state.js +40 -4
  635. package/dist/server/src/lib/session/structured-prompt.js +12 -9
  636. package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
  637. package/dist/server/src/lib/session-cleanup.js +32 -0
  638. package/dist/server/src/lib/session-key-sender.js +0 -27
  639. package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
  640. package/dist/server/src/lib/verification/env-snapshot.js +11 -2
  641. package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
  642. package/package.json +5 -1
  643. package/release-notes/0.49.1.json +66 -0
  644. package/release-notes/0.49.2.json +49 -0
  645. package/.next/server/chunks/1210.js +0 -1
  646. package/.next/server/chunks/1945.js +0 -14
  647. package/.next/server/chunks/1990.js +0 -103
  648. package/.next/server/chunks/4194.js +0 -67
  649. package/.next/server/chunks/5845.js +0 -1
  650. package/.next/server/chunks/720.js +0 -103
  651. package/.next/server/chunks/7604.js +0 -2
  652. package/.next/server/chunks/9540.js +0 -1
  653. package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
  654. package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
  655. package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
  656. package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
  657. package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
  658. package/.next/static/chunks/9079-987939d231704218.js +0 -1
  659. package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
  660. package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
  661. package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
  662. package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
  663. package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
  664. package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
  665. package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
  666. package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
  667. package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
  668. package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
  669. package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
  670. package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
  671. package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
  672. package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
  673. package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
  674. package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
  675. package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
  676. package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
  677. package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
  678. package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
  679. package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
  680. package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
  681. package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
  682. package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
  683. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
  684. package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
  685. package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
  686. package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
  687. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
  688. package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
  689. package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
  690. package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
  691. package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
  692. package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
  693. package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
  694. package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
  695. package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
  696. package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
  697. package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
  698. package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
  699. package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
  700. package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
  701. package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
  702. package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
  703. package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
  704. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
  705. package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
  706. package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
  707. package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
  708. package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
  709. package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
  710. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
  711. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
  712. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
  713. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
  714. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
  715. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
  716. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
  717. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
  718. package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
  719. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
  720. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
  721. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
  722. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
  723. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
  724. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
  725. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
  726. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
  727. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
  728. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
  729. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
  730. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
  731. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
  732. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
  733. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
  734. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
  735. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
  736. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
  737. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
  738. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
  739. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
  740. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
  741. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
  742. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
  743. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
  744. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
  745. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
  746. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
  747. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
  748. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
  749. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
  750. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
  751. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
  752. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
  753. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
  754. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
  755. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
  756. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
  757. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
  758. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
  759. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
  771. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
  772. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
  773. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
  774. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
  775. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
  776. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
  777. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
  778. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
  779. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
  780. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
  781. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
  782. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
  783. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
  788. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
  789. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
  790. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
  791. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
  792. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
  793. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
  794. package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
  795. package/.next/static/chunks/app/layout-aa8e66164a4367af.js +0 -1
  796. package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
  797. package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
  798. package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
  799. package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
  800. package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
  801. package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +0 -1
  802. package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
  803. package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +0 -1
  804. package/.next/static/css/db8959555c3d9c96.css +0 -1
  805. /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_buildManifest.js +0 -0
  806. /package/.next/static/{3_JtAZaKMJEDFIIfkHv4n → yGatWDsS532awSs51kXyd}/_ssgManifest.js +0 -0
@@ -24,6 +24,7 @@ exports.judgeCopilotModelSwitch = judgeCopilotModelSwitch;
24
24
  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
+ const composer_clear_1 = require("../../lib/session/composer-clear");
27
28
  const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
28
29
  const cli_patterns_1 = require("../detection/cli-patterns");
29
30
  const copilot_executable_1 = require("./copilot-executable");
@@ -37,6 +38,7 @@ const logger_1 = require("../../lib/logger");
37
38
  const install_hints_1 = require("./install-hints");
38
39
  const launch_window_1 = require("./launch-window");
39
40
  const launch_screen_1 = require("../../lib/session/launch-screen");
41
+ const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
40
42
  const logger = (0, logger_1.createLogger)('cli-tools/copilot');
41
43
  /** Interval for polling prompt detection */
42
44
  const COPILOT_POLL_INTERVAL_MS = 1000;
@@ -224,6 +226,33 @@ function judgeCopilotModelSwitch(before, output, modelName) {
224
226
  return { kind: 'pending' };
225
227
  }
226
228
  /** The pane's bottom non-blank row, squeezed, for an error message a person reads. */
229
+ /**
230
+ * Throw unless `ticket` still owns the composer (Issue #3945): right before a
231
+ * key this module types itself, so a send whose session was replaced while it
232
+ * waited cannot type into the new one.
233
+ */
234
+ function assertCopilotInputOwner(ticket, step) {
235
+ if (ticket.isCurrent())
236
+ return;
237
+ throw new Error(`Session ${ticket.sessionName} was handed to another writer before ${step}; input lock lost, nothing was typed (Issue #3945).`);
238
+ }
239
+ /**
240
+ * Type `text` + Enter as the composer's owner. A failure that may have put part
241
+ * of it on the pane (anything but a `send-keys` tmux never started,
242
+ * `TmuxSendError.delivery`) leaves the carried paste mark, as the shared
243
+ * sender's typed body does (review-2): the next send waits out what may still
244
+ * be drawn.
245
+ */
246
+ async function typeLeavingMarkOnFailure(sessionName, text, ticket) {
247
+ try {
248
+ await (0, tmux_1.sendKeys)(sessionName, text, true);
249
+ }
250
+ catch (error) {
251
+ if (error?.delivery !== 'not-started')
252
+ (0, instance_input_lock_1.leaveCarriedPasteMark)(ticket);
253
+ throw error;
254
+ }
255
+ }
227
256
  function describeBottomRow(output) {
228
257
  const lines = (0, cli_patterns_1.stripAnsi)(output).split('\n');
229
258
  for (let i = lines.length - 1; i >= 0; i--) {
@@ -351,8 +380,9 @@ class CopilotTool extends base_1.BaseCLITool {
351
380
  // leaves it (`cli-tools/launch-window`).
352
381
  (0, launch_window_1.beginLaunchWindow)(sessionName);
353
382
  try {
354
- // Start Copilot CLI in interactive mode
355
- await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
383
+ // Start Copilot CLI in interactive mode. Issue #3981: in one writer's
384
+ // turn of the input lock; the readiness wait below stays outside it.
385
+ await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
356
386
  // Issue #1907: no blind sleep before this. The 4-second one that used to
357
387
  // sit here was a guess at how long copilot takes to paint (measured on
358
388
  // 1.0.80: banner at ~1.3 s, folder-trust dialog at ~2.5 s), and it was
@@ -397,15 +427,25 @@ class CopilotTool extends base_1.BaseCLITool {
397
427
  * `waiting`, and the send guard refuses a `waiting` session for as long as
398
428
  * that entry lives.
399
429
  *
430
+ * Issue #3952: the digit is typed as the composer's writer. A send that holds
431
+ * the composer is waited out, and the dialog is read again after it: when it
432
+ * is gone nothing is typed and false comes back, so the caller looks again on
433
+ * its next poll. Inside the selection-list branch's lock it joins that lock.
434
+ *
400
435
  * @param sessionName - tmux session name
401
436
  * @param output - ANSI-stripped pane capture
437
+ * @param readMark - {@link instanceInputReadMark} taken before `output` was read
402
438
  * @returns True when the dialog was found and answered
403
439
  */
404
- async answerFolderTrustDialog(sessionName, output) {
440
+ async answerFolderTrustDialog(sessionName, output, readMark) {
405
441
  if (!(0, cli_patterns_1.isCopilotFolderTrustDialog)(output)) {
406
442
  return false;
407
443
  }
408
- await (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false);
444
+ const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => (0, cli_patterns_1.isCopilotFolderTrustDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))), () => (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false));
445
+ if (!outcome.answered) {
446
+ logger.info('copilot-folder-trust-answer-skipped', { reason: outcome.reason });
447
+ return false;
448
+ }
409
449
  (0, launch_window_1.recordLaunchDialogPress)(sessionName);
410
450
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
411
451
  logger.info('copilot-folder-trust-answered');
@@ -477,6 +517,7 @@ class CopilotTool extends base_1.BaseCLITool {
477
517
  let trustDialogHandled = false;
478
518
  for (let i = 0; i < COPILOT_INIT_MAX_ATTEMPTS; i++) {
479
519
  try {
520
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
480
521
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
481
522
  const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
482
523
  // Check if copilot's own composer is on screen
@@ -484,7 +525,7 @@ class CopilotTool extends base_1.BaseCLITool {
484
525
  logger.info('copilot-prompt-detected');
485
526
  return;
486
527
  }
487
- if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
528
+ if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
488
529
  trustDialogHandled = true;
489
530
  }
490
531
  }
@@ -541,6 +582,7 @@ class CopilotTool extends base_1.BaseCLITool {
541
582
  let output = '';
542
583
  while (Date.now() - startTime < timeoutMs) {
543
584
  try {
585
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
544
586
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
545
587
  output = (0, cli_patterns_1.stripAnsi)(rawOutput);
546
588
  if (this.isReadyFor(until, output)) {
@@ -555,7 +597,7 @@ class CopilotTool extends base_1.BaseCLITool {
555
597
  // "Yes, and remember this folder" and writes the operator's
556
598
  // machine-global ~/.copilot/config.json. Answer it here for the same
557
599
  // reason the launch path does, rather than leaving the worse outcome.
558
- if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
600
+ if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
559
601
  trustDialogHandled = true;
560
602
  }
561
603
  }
@@ -641,19 +683,48 @@ class CopilotTool extends base_1.BaseCLITool {
641
683
  // same pane when the tool is gone; costs one `capture-pane` when it is not.
642
684
  await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: true });
643
685
  try {
644
- // Verify Copilot is at prompt state before sending
645
- await this.waitForPrompt(sessionName);
646
686
  // Check if this is a slash command that triggers a selection list
647
687
  const slashCmd = this.extractSlashCommand(message);
648
688
  if (slashCmd && SELECTION_LIST_COMMANDS.has(slashCmd)) {
649
689
  // For selection list commands: send text + Enter, then wait for
650
690
  // the selection list to appear. Do NOT send additional input after.
651
- await (0, tmux_1.sendKeys)(sessionName, message, true);
652
- await this.waitForSelectionList(sessionName);
691
+ //
692
+ // Issue #3945: this types into the composer without the shared sender,
693
+ // so it takes the instance's input lock itself — from the readiness
694
+ // read (fresh, under the lock) to the picker that answers it — and
695
+ // waits out a carried paste mark first, as a normal send does.
696
+ await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, async (ticket) => {
697
+ await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
698
+ // review-2: a composer that never came up (a dialog, an unreadable
699
+ // pane, a time-out) is not typed into. The shared sender's re-check
700
+ // then refuses on the same terms right before the keys: a dialog is
701
+ // `prompt-waiting`, a pane that cannot be read `recheck-failed`.
702
+ const prompt = await this.waitForPrompt(sessionName);
703
+ await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
704
+ if (!prompt.ready) {
705
+ // review-3: neither the request nor the pane goes into the message.
706
+ // `classifySendFailure` reads the wording, and its "may have been
707
+ // typed" rules come first — a body or a screen saying `submit could
708
+ // not be confirmed` would turn this refusal into `indeterminate`.
709
+ logger.warn('copilot-selection-list-not-sent:prompt-not-ready', {
710
+ command: slashCmd,
711
+ bottomRow: describeBottomRow(prompt.output),
712
+ });
713
+ throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
714
+ 'so the selection-list command was not sent; nothing was typed');
715
+ }
716
+ assertCopilotInputOwner(ticket, 'the selection-list command');
717
+ // Issue #3953: the send's stamp, as the shared sender takes it.
718
+ (0, instance_input_lock_1.noteInputStart)();
719
+ await typeLeavingMarkOnFailure(sessionName, message, ticket);
720
+ await this.waitForSelectionList(sessionName);
721
+ });
653
722
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
654
723
  logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
655
724
  return;
656
725
  }
726
+ // Verify Copilot is at prompt state before sending
727
+ await this.waitForPrompt(sessionName);
657
728
  // Issue #1471: Body/Enter separation + read-back submit verification via the
658
729
  // shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
659
730
  // Copilot's own text-input / post-Enter delays are preserved. The selection
@@ -672,7 +743,8 @@ class CopilotTool extends base_1.BaseCLITool {
672
743
  }
673
744
  catch (error) {
674
745
  const errorMessage = (0, errors_1.getErrorMessage)(error);
675
- throw new Error(`Failed to send message to Copilot: ${errorMessage}`);
746
+ // Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
747
+ throw new Error(`Failed to send message to Copilot: ${errorMessage}`, { cause: error });
676
748
  }
677
749
  }
678
750
  /**
@@ -731,32 +803,52 @@ class CopilotTool extends base_1.BaseCLITool {
731
803
  const sessionName = this.getSessionName(worktreeId, instanceId);
732
804
  await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: false });
733
805
  try {
734
- const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
735
- if (!idle.ready) {
736
- throw new Error(`copilot did not become idle within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms, so /model was not sent ` +
737
- `(bottom row: ${describeBottomRow(idle.output)})`);
738
- }
739
- const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
740
- // Send /model <modelName> command with Enter. An argument means an
741
- // in-place switch, never a picker (Issue #1895).
742
- await (0, tmux_1.sendKeys)(sessionName, `/model ${modelName}`, true);
743
- const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
744
- (0, tmux_capture_cache_1.invalidateCache)(sessionName);
745
- if (verdict.kind === 'rejected') {
746
- logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
747
- throw new Error(`copilot refused it: ${verdict.reason}`);
748
- }
749
- if (verdict.kind === 'pending') {
750
- logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
751
- throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms ` +
752
- `(bottom row: ${verdict.bottomRow}); the switch may still take effect, and nothing further was typed`);
753
- }
754
- logger.info('copilot-model-switched', { model: modelName });
806
+ // Issue #3945: `/model` is typed into the composer, so it is one writer's
807
+ // turn like the selection-list branch — from the idle read to the answer.
808
+ await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, (ticket) => this.switchModelUnderInputLock(sessionName, modelName, ticket));
755
809
  }
756
810
  catch (error) {
757
811
  const errorMessage = (0, errors_1.getErrorMessage)(error);
758
- throw new Error(`Failed to switch Copilot model to ${modelName}: ${errorMessage}`);
812
+ // Issue #3952: the re-check's `code` is kept, so the caller records a
813
+ // dialog or an unreadable pane as such rather than as a refused model.
814
+ const code = error?.code;
815
+ throw Object.assign(new Error(`Failed to switch Copilot model to ${modelName}: ${errorMessage}`), typeof code === 'string' ? { code } : {});
816
+ }
817
+ }
818
+ /** {@link sendModelCommand}'s keys and waits, as the composer's only writer (Issue #3945). */
819
+ async switchModelUnderInputLock(sessionName, modelName, ticket) {
820
+ // A previous send's body may still arrive (review-1 #5): `/model` waits it
821
+ // out like a normal send, and the idle read below is the one after the wait.
822
+ await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
823
+ const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
824
+ if (!idle.ready) {
825
+ // The pane's text goes to the log, not the message: the message is read by
826
+ // `classifySendFailure`, which a screen quoting its keywords would steer (#3954).
827
+ logger.warn('copilot-model-switch-not-idle', { model: modelName, bottomRow: describeBottomRow(idle.output) });
828
+ throw new Error(`copilot did not become idle within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms, so /model was not sent`);
829
+ }
830
+ const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
831
+ // Issue #3952: "idle, so no dialog" holds for the frame that was read, not
832
+ // for the moment the keys go out. The pane is read once more right before
833
+ // them, as every send is: a dialog is `prompt-waiting`, a pane that cannot
834
+ // be read `recheck-failed`, and nothing is typed in either case.
835
+ await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
836
+ // Send /model <modelName> command with Enter. An argument means an
837
+ // in-place switch, never a picker (Issue #1895).
838
+ assertCopilotInputOwner(ticket, '/model');
839
+ await typeLeavingMarkOnFailure(sessionName, `/model ${modelName}`, ticket);
840
+ const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
841
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
842
+ if (verdict.kind === 'rejected') {
843
+ logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
844
+ throw new Error(`copilot refused it: ${verdict.reason}`);
845
+ }
846
+ if (verdict.kind === 'pending') {
847
+ logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
848
+ throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms; ` +
849
+ 'the switch may still take effect, and nothing further was typed');
759
850
  }
851
+ logger.info('copilot-model-switched', { model: modelName });
760
852
  }
761
853
  /**
762
854
  * Poll until `/model <modelName>` has answered (Issue #2623).
@@ -25,6 +25,7 @@ const launch_screen_1 = require("../../lib/session/launch-screen");
25
25
  const errors_1 = require("../../lib/errors");
26
26
  const launch_dialog_1 = require("./launch-dialog");
27
27
  const launch_window_1 = require("./launch-window");
28
+ const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
28
29
  const logger = (0, logger_1.createLogger)('cli-tools/gemini');
29
30
  /** Wait for Gemini CLI to initialize after launch (banner + auth + dialog) */
30
31
  const GEMINI_INIT_WAIT_MS = 6000;
@@ -106,7 +107,12 @@ class GeminiTool extends base_1.BaseCLITool {
106
107
  // trust dialog is this launch's to answer; the Auto-Yes poller leaves it.
107
108
  (0, launch_window_1.beginLaunchWindow)(sessionName);
108
109
  try {
109
- await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
110
+ // Issue #3975: the launch line is one writer's turn, so a send's body
111
+ // already in the pane is not run as part of it. Only the keys: the
112
+ // waits below stay outside the lock, where a send waiting for the
113
+ // prompt cannot be held behind them.
114
+ // Issue #3981: through the one launch-key writer every tool shares.
115
+ await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
110
116
  // Wait for Gemini to initialize (minimum wait for banner/auth)
111
117
  await new Promise((resolve) => setTimeout(resolve, GEMINI_INIT_WAIT_MS));
112
118
  // Poll until Gemini interactive prompt is ready
@@ -139,6 +145,8 @@ class GeminiTool extends base_1.BaseCLITool {
139
145
  const loggedDecisions = new Set();
140
146
  for (let i = 0; i < GEMINI_INIT_MAX_ATTEMPTS; i++) {
141
147
  try {
148
+ // Issue #3975: taken before the read the trust Enter is decided on.
149
+ const readMark = (0, instance_input_lock_1.instanceInputLaunchReadMark)();
142
150
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
143
151
  // Strip ANSI escape codes before pattern matching
144
152
  // (Gemini TUI uses 24-bit color codes that break regex matching)
@@ -152,14 +160,26 @@ class GeminiTool extends base_1.BaseCLITool {
152
160
  if (!trustDialogHandled) {
153
161
  const decision = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, output);
154
162
  if (decision.action === 'press') {
155
- await (0, tmux_1.sendSpecialKey)(sessionName, decision.key);
156
- trustDialogHandled = true;
157
- trustPressedAt = Date.now();
158
- // Issue #3790: the poller leaves the answered dialog alone even if
159
- // the window closes before gemini redraws it.
160
- (0, launch_window_1.recordLaunchDialogPress)(sessionName, trustPressedAt);
161
- logger.info('auto-trusted-folder-for-gemini');
162
- // Continue polling for prompt after trust dialog
163
+ // Issue #3975: the Enter as an `exclusive` writer, so it never lands
164
+ // inside a send's body, paste or Enter; a send that came between
165
+ // the read and the lock makes the dialog be read again first.
166
+ const pressed = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
167
+ const again = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, (0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT)));
168
+ return again.action === 'press' && again.key === decision.key;
169
+ }, () => (0, tmux_1.sendSpecialKey)(sessionName, decision.key), { mode: 'exclusive' });
170
+ if (pressed.answered) {
171
+ trustDialogHandled = true;
172
+ trustPressedAt = Date.now();
173
+ // Issue #3790: the poller leaves the answered dialog alone even if
174
+ // the window closes before gemini redraws it.
175
+ (0, launch_window_1.recordLaunchDialogPress)(sessionName, trustPressedAt);
176
+ logger.info('auto-trusted-folder-for-gemini');
177
+ // Continue polling for prompt after trust dialog
178
+ }
179
+ else {
180
+ // Not answered this poll; the next one reads the screen again.
181
+ logger.info('gemini-trust-answer-skipped', { sessionName, reason: pressed.reason });
182
+ }
163
183
  }
164
184
  else {
165
185
  const warning = (0, launch_dialog_1.launchDialogWarning)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, decision);
@@ -188,6 +208,9 @@ class GeminiTool extends base_1.BaseCLITool {
188
208
  /**
189
209
  * Wait for Gemini prompt before sending a message.
190
210
  * Used by sendMessage to ensure Gemini is ready to accept input.
211
+ *
212
+ * @throws Error (`Gemini prompt not ready`) when the prompt did not appear
213
+ * within {@link GEMINI_PROMPT_WAIT_TIMEOUT_MS}; nothing was typed
191
214
  */
192
215
  async waitForPrompt(sessionName) {
193
216
  const startTime = Date.now();
@@ -206,7 +229,10 @@ class GeminiTool extends base_1.BaseCLITool {
206
229
  }
207
230
  await new Promise((resolve) => setTimeout(resolve, pollInterval));
208
231
  }
232
+ // Issue #3981: give up without typing, as codex does. Sending anyway put the
233
+ // body into whatever held the pane (a dialog, a slow start, a shell).
209
234
  logger.info('gemini-prompt-not-detected');
235
+ throw new Error('Gemini prompt not ready: timed out waiting for the input prompt before sending');
210
236
  }
211
237
  /**
212
238
  * Send a message to Gemini interactive session
@@ -239,7 +265,8 @@ class GeminiTool extends base_1.BaseCLITool {
239
265
  }
240
266
  catch (error) {
241
267
  const errorMessage = (0, errors_1.getErrorMessage)(error);
242
- throw new Error(`Failed to send message to Gemini: ${errorMessage}`);
268
+ // Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
269
+ throw new Error(`Failed to send message to Gemini: ${errorMessage}`, { cause: error });
243
270
  }
244
271
  }
245
272
  /**
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ /**
3
+ * The keys a launch types into its pane, in one writer's turn (Issue #3981).
4
+ *
5
+ * #3975 put gemini's and claude's launch lines under the instance input lock;
6
+ * the other seven launch sites, and claude's `unset CLAUDECODE` before its
7
+ * line, still typed with no lock, so a send holding the composer could have
8
+ * them land in the middle of its body, paste or Enter. Every launch now types
9
+ * through {@link typeLaunchLines}: one `exclusive` turn for all of its lines
10
+ * (R2 of `session-launch-flight`), joined when the launcher already holds the
11
+ * lock (codex relaunching inside a send). The init polls and readiness waits
12
+ * that follow stay outside (#3975), so a send waiting for the prompt is never
13
+ * held behind them.
14
+ *
15
+ * @module lib/cli-tools/launch-keys
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.typeLaunchLines = typeLaunchLines;
19
+ const tmux_1 = require("../tmux/tmux");
20
+ const instance_input_lock_1 = require("../session/instance-input-lock");
21
+ /**
22
+ * Type `steps` into `sessionName` as one `exclusive` writer, in order.
23
+ *
24
+ * @param sessionName - tmux session name
25
+ * @param steps - Lines (typed with Enter) and self-typing steps
26
+ * @throws Whatever `withInstanceInputLock` throws when not admitted; nothing was typed then
27
+ */
28
+ async function typeLaunchLines(sessionName, steps) {
29
+ await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, async () => {
30
+ for (const step of steps) {
31
+ if (typeof step === 'string') {
32
+ await (0, tmux_1.sendKeys)(sessionName, step, true);
33
+ }
34
+ else {
35
+ await step();
36
+ }
37
+ }
38
+ });
39
+ }
@@ -235,7 +235,10 @@ class OpenCodeV2Tool extends base_1.BaseCLITool {
235
235
  if (port === null) {
236
236
  logger.warn('opencode-v2-launch-without-server', { worktreeId, instanceId });
237
237
  }
238
- await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)((0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath })), true);
238
+ // Issue #3981: in one writer's turn of the input lock; the readiness
239
+ // wait below stays outside it.
240
+ const launchCommand = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({ target, executablePath: executable.path, worktreePath });
241
+ await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
239
242
  await this.waitForReady(sessionName);
240
243
  await (0, runtime_1.attachOpencodeV2EventStream)(target);
241
244
  logger.info('started-opencode-v2-session');
@@ -313,7 +316,8 @@ class OpenCodeV2Tool extends base_1.BaseCLITool {
313
316
  logger.info('sent-message-to-opencode-v2-session');
314
317
  }
315
318
  catch (error) {
316
- throw new Error(`Failed to send message to OpenCode V2: ${(0, errors_1.getErrorMessage)(error)}`);
319
+ // Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
320
+ throw new Error(`Failed to send message to OpenCode V2: ${(0, errors_1.getErrorMessage)(error)}`, { cause: error });
317
321
  }
318
322
  }
319
323
  /**
@@ -78,6 +78,7 @@ const opencode_executable_1 = require("./opencode-executable");
78
78
  const log_diagnosis_1 = require("../../lib/hooks/sources/opencode/log-diagnosis");
79
79
  const launch_screen_1 = require("../../lib/session/launch-screen");
80
80
  const errors_1 = require("../../lib/errors");
81
+ const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
81
82
  const logger = (0, logger_1.createLogger)('cli-tools/opencode');
82
83
  const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
83
84
  /** OpenCode TUI graceful exit command [D1-006] */
@@ -334,7 +335,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
334
335
  });
335
336
  }
336
337
  const launchedAt = Date.now();
337
- await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
338
+ // Issue #3981: in one writer's turn of the input lock; the readiness
339
+ // wait below stays outside it.
340
+ await this.typeLaunchLines(sessionName, [(0, launch_screen_1.withLaunchScreenCleared)(launchCommand)]);
338
341
  // Issue #1908: poll for opencode's own composer instead of sleeping 15 s.
339
342
  await this.waitForReady(sessionName);
340
343
  // Issue #1763: subscribe once the server is up. Health-checked first, so
@@ -478,17 +481,42 @@ class OpenCodeTool extends base_1.BaseCLITool {
478
481
  * and it is logged as `opencode-send-unverified` so it is visible rather than
479
482
  * inferred.
480
483
  *
484
+ * ## Issue #3957: the dispatch boundary
485
+ *
486
+ * This path types no key, so it reports no input start. Right before the
487
+ * POST it notes a `dispatch` boundary instead (`noteDispatchStart`), which a
488
+ * relay-bound send records as its lower bound — and which can refuse, in
489
+ * which case nothing is posted and the refusal propagates past the catch
490
+ * below. When the POST does not end delivered, the caller is told whether
491
+ * nothing exists (`not_sent`: a POST the server refused — Issue #3992 — or a
492
+ * `404` on the read-back) or it cannot be said (`unknown`: a POST that got no
493
+ * answer or an unexpected 2xx, a body that read back different, an exhausted
494
+ * ladder), BEFORE the keyboard fallback runs.
495
+ *
481
496
  * @param target - The instance
482
497
  * @param message - The body, sent verbatim
483
498
  * @param imagePath - Absolute path to an attachment, if there is one
484
499
  * @returns Whether the message was posted **and** read back
485
500
  */
486
501
  async trySendViaServer(target, message, imagePath) {
502
+ const outcome = await this.dispatchViaServer(target, message, imagePath);
503
+ if (outcome === 'delivered')
504
+ return true;
505
+ if (outcome !== 'skipped')
506
+ (0, instance_input_lock_1.noteDispatchFailed)(outcome);
507
+ return false;
508
+ }
509
+ /**
510
+ * {@link trySendViaServer}'s body, telling apart a route that was never tried
511
+ * (`skipped`) from a dispatch that did not deliver (Issue #3957).
512
+ */
513
+ async dispatchViaServer(target, message, imagePath) {
487
514
  const instanceId = target.instanceId ?? target.cliToolId;
515
+ let dispatched = false;
488
516
  try {
489
517
  const port = (0, ports_1.getAssignedOpencodePort)(target);
490
518
  if (port === null)
491
- return false;
519
+ return 'skipped';
492
520
  // The same three preconditions the abort path checks (#2034): a port with
493
521
  // a live subscription behind it, and a session this instance owns. The
494
522
  // liveness check is what keeps a squatter on a remembered port from being
@@ -501,7 +529,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
501
529
  port,
502
530
  liveness: liveness.state,
503
531
  });
504
- return false;
532
+ return 'skipped';
505
533
  }
506
534
  // Null on a pane that has not run a turn yet — the gate learns the session
507
535
  // from the first frame that names it. That first send goes over the
@@ -513,7 +541,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
513
541
  instanceId,
514
542
  port,
515
543
  });
516
- return false;
544
+ return 'skipped';
517
545
  }
518
546
  const parts = [{ type: 'text', text: message }];
519
547
  if (imagePath !== undefined) {
@@ -535,10 +563,20 @@ class OpenCodeTool extends base_1.BaseCLITool {
535
563
  // §20.5). Null when nothing is configured, and the request body is then
536
564
  // byte-identical to the pre-#2048 one.
537
565
  const selection = (0, launch_settings_1.opencodePromptSelection)((0, launch_settings_1.getOpencodeLaunchSettings)(target));
538
- if (!(await (0, client_1.sendOpencodePrompt)(port, sessionId, messageId, parts, selection)))
539
- return false;
566
+ // Issue #3957: the boundary, right before the POST. A refusal throws and
567
+ // nothing is posted.
568
+ (0, instance_input_lock_1.noteDispatchStart)();
569
+ dispatched = true;
570
+ // Issue #3992: a POST the server refused (a non-2xx, an unknown route's
571
+ // `200 text/html`) sent nothing. One that got no answer, or an unexpected
572
+ // 2xx, may still have created the message, so it stays unknown.
573
+ const dispatch = await (0, client_1.sendOpencodePrompt)(port, sessionId, messageId, parts, selection);
574
+ if (dispatch === 'rejected')
575
+ return 'not_sent';
576
+ if (dispatch === 'unknown')
577
+ return 'unknown';
540
578
  const verified = await this.verifyPostedMessage(port, sessionId, messageId, message);
541
- if (!verified) {
579
+ if (verified !== 'found') {
542
580
  logger.warn('opencode-send-unverified', {
543
581
  worktreeId: target.worktreeId,
544
582
  instanceId,
@@ -547,7 +585,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
547
585
  messageId,
548
586
  hasImage: imagePath !== undefined,
549
587
  });
550
- return false;
588
+ return verified === 'missing' ? 'not_sent' : 'unknown';
551
589
  }
552
590
  logger.info('opencode-send-delivered-via-api', {
553
591
  worktreeId: target.worktreeId,
@@ -557,9 +595,13 @@ class OpenCodeTool extends base_1.BaseCLITool {
557
595
  messageId,
558
596
  hasImage: imagePath !== undefined,
559
597
  });
560
- return true;
598
+ return 'delivered';
561
599
  }
562
600
  catch (error) {
601
+ // Issue #3957: the relay refused the boundary — nothing was posted, and
602
+ // nothing may be typed either.
603
+ if ((0, instance_input_lock_1.isInputBoundaryRefusal)(error))
604
+ throw error;
563
605
  // Nothing above is allowed to take the send down: the keystroke route is
564
606
  // still there and is what runs when this answers false.
565
607
  logger.warn('opencode-send-api-failed', {
@@ -567,7 +609,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
567
609
  instanceId,
568
610
  error: (0, errors_1.getErrorMessage)(error),
569
611
  });
570
- return false;
612
+ return dispatched ? 'unknown' : 'skipped';
571
613
  }
572
614
  }
573
615
  /**
@@ -581,7 +623,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
581
623
  * — so the check is that the sent body is *among* the text parts, not that it
582
624
  * is the only one.
583
625
  *
584
- * @returns True once the body was found; false on a `404` or after the ladder
626
+ * @returns `found` once the body was found; `missing` on a `404`; `mismatch`
627
+ * when a message exists under the id with other text; `unknown` after the
628
+ * ladder (Issue #3957 tells the last three apart)
585
629
  */
586
630
  async verifyPostedMessage(port, sessionId, messageId, message) {
587
631
  for (const waitMs of exports.OPENCODE_SEND_READBACK_DELAYS_MS) {
@@ -589,14 +633,14 @@ class OpenCodeTool extends base_1.BaseCLITool {
589
633
  await new Promise((resolve) => setTimeout(resolve, waitMs));
590
634
  const readback = await (0, client_1.readOpencodeUserMessage)(port, sessionId, messageId);
591
635
  if (readback.kind === 'found')
592
- return readback.texts.includes(message);
636
+ return readback.texts.includes(message) ? 'found' : 'mismatch';
593
637
  // A `404` is the server saying the message does not exist, which does not
594
638
  // become truer by asking again — the measured cause is a part the server
595
639
  // could not resolve, and it discards the whole message when that happens.
596
640
  if (readback.kind === 'missing')
597
- return false;
641
+ return 'missing';
598
642
  }
599
- return false;
643
+ return 'unknown';
600
644
  }
601
645
  /**
602
646
  * Send a message to OpenCode interactive session
@@ -649,7 +693,8 @@ class OpenCodeTool extends base_1.BaseCLITool {
649
693
  }
650
694
  catch (error) {
651
695
  const errorMessage = (0, errors_1.getErrorMessage)(error);
652
- throw new Error(`Failed to send message to OpenCode: ${errorMessage}`);
696
+ // Issue #4031: the cause keeps a failed `load-buffer`'s code (`classifySendFailure`).
697
+ throw new Error(`Failed to send message to OpenCode: ${errorMessage}`, { cause: error });
653
698
  }
654
699
  }
655
700
  /**
@@ -44,8 +44,16 @@ const legacy_session_alias_1 = require("../tmux/legacy-session-alias");
44
44
  const SESSION_NAME_PREFIX = 'mcbd-';
45
45
  /** Shape of a session-name namespace: 8 lowercase hex digits (Issue #2866). */
46
46
  exports.SESSION_NAMESPACE_PATTERN = /^[0-9a-f]{8}$/;
47
- /** CLI tool ids, longest first, so a longer id is never read as a shorter one. */
48
- const CLI_TOOL_IDS_LONGEST_FIRST = [...types_1.CLI_TOOL_IDS].sort((a, b) => b.length - a.length);
47
+ /**
48
+ * CLI tool ids, longest first, so a longer id is never read as a shorter one.
49
+ *
50
+ * Read when called, not when this module loads (Issue #3981): modules loaded
51
+ * early (`session-starting-state`) import this one, and a module-load read of
52
+ * `CLI_TOOL_IDS` reaches a test's getter mock before it can answer.
53
+ */
54
+ function cliToolIdsLongestFirst() {
55
+ return [...types_1.CLI_TOOL_IDS].sort((a, b) => b.length - a.length);
56
+ }
49
57
  /**
50
58
  * The namespace this process names its sessions with, or null (legacy names).
51
59
  *
@@ -150,7 +158,7 @@ function parseSessionName(name) {
150
158
  namespace = body.slice(0, dash);
151
159
  body = body.slice(dash + 1);
152
160
  }
153
- const cliToolId = CLI_TOOL_IDS_LONGEST_FIRST.find((id) => body.startsWith(`${id}-`));
161
+ const cliToolId = cliToolIdsLongestFirst().find((id) => body.startsWith(`${id}-`));
154
162
  if (!cliToolId)
155
163
  return null;
156
164
  const rest = body.slice(cliToolId.length + 1);