commandmate 0.48.0 → 0.49.1

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 (780) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +292 -285
  3. package/.next/app-path-routes-manifest.json +35 -34
  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.js +1 -1
  38. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  40. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/vapid/route.js +1 -1
  42. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  44. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  45. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/relays/[relayId]/route.js +1 -0
  47. package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -0
  48. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -0
  49. package/.next/server/app/api/relays/route.js +1 -1
  50. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  51. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  55. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  56. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/clone/route.js +1 -1
  58. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  59. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/repositories/restore/route.js +1 -1
  62. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  63. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/route.js +1 -1
  65. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  66. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/scan/route.js +1 -1
  68. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  69. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/sync/route.js +1 -1
  71. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  75. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  76. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  87. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  91. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/verification/runs/route.js +1 -1
  93. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  96. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  99. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  102. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  114. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +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 +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/send/route.js +144 -1
  216. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  219. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  233. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
  237. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/route.js +1 -1
  265. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  266. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  268. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  270. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/page_client-reference-manifest.js +1 -1
  272. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  275. package/.next/server/app/sessions/page.js +1 -1
  276. package/.next/server/app/sessions/page.js.nft.json +1 -1
  277. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/skills/[skillId]/page.js +1 -1
  279. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  280. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  284. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  285. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app/worktrees/[id]/page.js +11 -11
  287. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  288. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  289. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  290. package/.next/server/app-paths-manifest.json +35 -34
  291. package/.next/server/chunks/1601.js +2 -2
  292. package/.next/server/chunks/1656.js +2 -2
  293. package/.next/server/chunks/2069.js +1 -0
  294. package/.next/server/chunks/2119.js +1 -1
  295. package/.next/server/chunks/2404.js +1 -1
  296. package/.next/server/chunks/2422.js +1 -1
  297. package/.next/server/chunks/2445.js +1 -1
  298. package/.next/server/chunks/2534.js +1 -1
  299. package/.next/server/chunks/3241.js +1 -1
  300. package/.next/server/chunks/3773.js +1 -0
  301. package/.next/server/chunks/3801.js +31 -0
  302. package/.next/server/chunks/4243.js +1 -1
  303. package/.next/server/chunks/4248.js +1 -1
  304. package/.next/server/chunks/5209.js +1 -1
  305. package/.next/server/chunks/5354.js +1 -1
  306. package/.next/server/chunks/{9130.js → 5630.js} +1 -1
  307. package/.next/server/chunks/5775.js +1 -0
  308. package/.next/server/chunks/610.js +1 -0
  309. package/.next/server/chunks/6119.js +1 -1
  310. package/.next/server/chunks/6130.js +1 -1
  311. package/.next/server/chunks/6401.js +1 -1
  312. package/.next/server/chunks/6486.js +1 -1
  313. package/.next/server/chunks/6781.js +1 -1
  314. package/.next/server/chunks/6808.js +4 -0
  315. package/.next/server/chunks/7023.js +14 -0
  316. package/.next/server/chunks/7604.js +2 -2
  317. package/.next/server/chunks/7905.js +1 -1
  318. package/.next/server/chunks/8581.js +16 -16
  319. package/.next/server/chunks/8728.js +3 -3
  320. package/.next/server/chunks/8782.js +1 -1
  321. package/.next/server/chunks/8791.js +1 -1
  322. package/.next/server/chunks/8807.js +63 -53
  323. package/.next/server/chunks/8918.js +103 -1
  324. package/.next/server/chunks/9198.js +144 -0
  325. package/.next/server/chunks/9390.js +1 -1
  326. package/.next/server/chunks/9584.js +1 -1
  327. package/.next/server/chunks/9627.js +4 -4
  328. package/.next/server/chunks/9731.js +3 -3
  329. package/.next/server/middleware-manifest.json +5 -5
  330. package/.next/server/pages/500.html +1 -1
  331. package/.next/server/server-reference-manifest.json +1 -1
  332. package/.next/static/chunks/1128-914c559913546bbc.js +1 -0
  333. package/.next/static/chunks/{2407-26139a8a2f1adbe8.js → 2407-675ba6b21844dc3b.js} +1 -1
  334. package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
  335. package/.next/static/chunks/{2863-f0121af1cbbedb3b.js → 2863-7173dc305dffc4f6.js} +1 -1
  336. package/.next/static/chunks/3931-1a1abab16248f14d.js +1 -0
  337. package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
  338. package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
  339. package/.next/static/chunks/{8165-c68b3dc844210e6a.js → 8165-263172c17ae8e8c3.js} +1 -1
  340. package/.next/static/chunks/8606-ce17ffa77f39608e.js +1 -0
  341. package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +1 -0
  342. package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +1 -0
  343. package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +1 -0
  344. package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +1 -0
  345. package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +1 -0
  346. package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +1 -0
  347. package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +1 -0
  348. package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +1 -0
  349. package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +1 -0
  350. package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +1 -0
  351. package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +1 -0
  352. package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +1 -0
  353. package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +1 -0
  354. package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +1 -0
  355. package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +1 -0
  356. package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +1 -0
  357. package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +1 -0
  358. package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +1 -0
  359. package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +1 -0
  360. package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +1 -0
  361. package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +1 -0
  362. package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +1 -0
  363. package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +1 -0
  364. package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +1 -0
  365. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +1 -0
  366. package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +1 -0
  367. package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +1 -0
  368. package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +1 -0
  369. package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +1 -0
  370. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +1 -0
  371. package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +1 -0
  372. package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +1 -0
  373. package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +1 -0
  374. package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +1 -0
  375. package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +1 -0
  376. package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +1 -0
  377. package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +1 -0
  378. package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +1 -0
  379. package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +1 -0
  380. package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +1 -0
  381. package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +1 -0
  382. package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +1 -0
  383. package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +1 -0
  384. package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +1 -0
  385. package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +1 -0
  386. package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +1 -0
  387. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +1 -0
  388. package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +1 -0
  389. package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +1 -0
  390. package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +1 -0
  391. package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +1 -0
  392. package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +1 -0
  478. package/.next/static/chunks/app/layout-8bfac4724277b47f.js +1 -0
  479. package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +1 -0
  480. package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +1 -0
  481. package/.next/static/chunks/app/sessions/page-890fd50ec9739973.js +1 -0
  482. package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
  483. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
  484. package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +1 -0
  485. package/.next/static/chunks/app/worktrees/[id]/page-f6d3ab8185d93aae.js +1 -0
  486. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
  487. package/.next/static/css/c1e307d05daf93b6.css +1 -0
  488. package/.next/trace +13 -13
  489. package/.next/types/app/api/relays/[relayId]/route.ts +347 -0
  490. package/.next/types/routes.d.ts +2 -1
  491. package/.next/types/validator.ts +9 -0
  492. package/dist/cli/commands/ask.d.ts.map +1 -1
  493. package/dist/cli/commands/ask.js +178 -13
  494. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  495. package/dist/cli/commands/auto-yes.js +3 -5
  496. package/dist/cli/commands/capture.d.ts.map +1 -1
  497. package/dist/cli/commands/capture.js +5 -0
  498. package/dist/cli/commands/message-dispatch.d.ts +25 -5
  499. package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
  500. package/dist/cli/commands/message-dispatch.js +92 -6
  501. package/dist/cli/commands/relays.d.ts +25 -2
  502. package/dist/cli/commands/relays.d.ts.map +1 -1
  503. package/dist/cli/commands/relays.js +69 -5
  504. package/dist/cli/commands/respond.d.ts +12 -0
  505. package/dist/cli/commands/respond.d.ts.map +1 -1
  506. package/dist/cli/commands/respond.js +63 -1
  507. package/dist/cli/commands/send.d.ts.map +1 -1
  508. package/dist/cli/commands/send.js +10 -10
  509. package/dist/cli/commands/verify.d.ts.map +1 -1
  510. package/dist/cli/commands/verify.js +8 -1
  511. package/dist/cli/commands/wait-hook-stop-settle.d.ts +66 -0
  512. package/dist/cli/commands/wait-hook-stop-settle.d.ts.map +1 -0
  513. package/dist/cli/commands/wait-hook-stop-settle.js +150 -0
  514. package/dist/cli/commands/wait-instance.d.ts +21 -0
  515. package/dist/cli/commands/wait-instance.d.ts.map +1 -0
  516. package/dist/cli/commands/wait-instance.js +41 -0
  517. package/dist/cli/commands/wait-notices.d.ts +87 -0
  518. package/dist/cli/commands/wait-notices.d.ts.map +1 -0
  519. package/dist/cli/commands/wait-notices.js +301 -0
  520. package/dist/cli/commands/wait-poll-bookkeeping.d.ts +15 -0
  521. package/dist/cli/commands/wait-poll-bookkeeping.d.ts.map +1 -0
  522. package/dist/cli/commands/wait-poll-bookkeeping.js +57 -0
  523. package/dist/cli/commands/wait-poll-state.d.ts +118 -0
  524. package/dist/cli/commands/wait-poll-state.d.ts.map +1 -0
  525. package/dist/cli/commands/wait-poll-state.js +6 -0
  526. package/dist/cli/commands/wait-timing.d.ts +46 -0
  527. package/dist/cli/commands/wait-timing.d.ts.map +1 -0
  528. package/dist/cli/commands/wait-timing.js +99 -0
  529. package/dist/cli/commands/wait-turn-boundary.d.ts +284 -0
  530. package/dist/cli/commands/wait-turn-boundary.d.ts.map +1 -0
  531. package/dist/cli/commands/wait-turn-boundary.js +427 -0
  532. package/dist/cli/commands/wait-verify.d.ts +50 -0
  533. package/dist/cli/commands/wait-verify.d.ts.map +1 -0
  534. package/dist/cli/commands/wait-verify.js +124 -0
  535. package/dist/cli/commands/wait.d.ts +6 -105
  536. package/dist/cli/commands/wait.d.ts.map +1 -1
  537. package/dist/cli/commands/wait.js +207 -959
  538. package/dist/cli/config/duration-constants.d.ts +16 -13
  539. package/dist/cli/config/duration-constants.d.ts.map +1 -1
  540. package/dist/cli/config/duration-constants.js +21 -21
  541. package/dist/cli/docs/agent-operations.d.ts +2 -2
  542. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  543. package/dist/cli/docs/agent-operations.js +25 -2
  544. package/dist/cli/types/api-responses.d.ts +76 -4
  545. package/dist/cli/types/api-responses.d.ts.map +1 -1
  546. package/dist/cli/utils/api-client.d.ts +15 -1
  547. package/dist/cli/utils/api-client.d.ts.map +1 -1
  548. package/dist/cli/utils/api-client.js +7 -1
  549. package/dist/cli/utils/reply-ledger.d.ts +79 -0
  550. package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
  551. package/dist/cli/utils/reply-ledger.js +141 -1
  552. package/dist/cli/utils/verify-runner.d.ts +24 -1
  553. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  554. package/dist/cli/utils/verify-runner.js +54 -1
  555. package/dist/config/auto-yes-duration.d.ts +56 -0
  556. package/dist/config/auto-yes-duration.d.ts.map +1 -0
  557. package/dist/config/auto-yes-duration.js +76 -0
  558. package/dist/lib/session/send-attempt-types.d.ts +23 -1
  559. package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
  560. package/dist/lib/session/send-attempt-types.js +9 -1
  561. package/dist/server/locales/en/worktree.json +18 -3
  562. package/dist/server/locales/ja/worktree.json +18 -3
  563. package/dist/server/src/config/auto-yes-config.js +14 -19
  564. package/dist/server/src/config/auto-yes-duration.js +76 -0
  565. package/dist/server/src/lib/auto-yes-poller.js +49 -10
  566. package/dist/server/src/lib/auto-yes-state.js +9 -2
  567. package/dist/server/src/lib/cli-tools/antigravity.js +40 -7
  568. package/dist/server/src/lib/cli-tools/codex.js +60 -11
  569. package/dist/server/src/lib/cli-tools/command-code-plan-review.js +24 -2
  570. package/dist/server/src/lib/cli-tools/copilot.js +120 -30
  571. package/dist/server/src/lib/cli-tools/gemini.js +28 -9
  572. package/dist/server/src/lib/cli-tools/opencode.js +55 -13
  573. package/dist/server/src/lib/cli-tools/submit-composer-read.js +580 -0
  574. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +374 -516
  575. package/dist/server/src/lib/db/migrations/index.js +2 -0
  576. package/dist/server/src/lib/db/migrations/pre-migration-backup.js +266 -0
  577. package/dist/server/src/lib/db/migrations/runner.js +37 -4
  578. package/dist/server/src/lib/db/migrations/v62-session-relays-bind.js +102 -0
  579. package/dist/server/src/lib/db/relay-bind-db.js +437 -0
  580. package/dist/server/src/lib/db/relay-db.js +59 -96
  581. package/dist/server/src/lib/detection/composer-text.js +215 -11
  582. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
  583. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +8 -191
  584. package/dist/server/src/lib/detection/upstream-faults.js +56 -5
  585. package/dist/server/src/lib/hooks/sources/opencode/client.js +12 -6
  586. package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
  587. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +4 -2
  588. package/dist/server/src/lib/polling/response-checker.js +15 -16
  589. package/dist/server/src/lib/prompt-answer-errors.js +288 -0
  590. package/dist/server/src/lib/prompt-answer-sender.js +264 -288
  591. package/dist/server/src/lib/push/failure-episode-state.js +4 -1
  592. package/dist/server/src/lib/realtime/terminal-broadcast.js +1 -4
  593. package/dist/server/src/lib/realtime-snippet.js +54 -0
  594. package/dist/server/src/lib/relay/relay-bind.js +294 -0
  595. package/dist/server/src/lib/relay/relay-boot.js +51 -0
  596. package/dist/server/src/lib/relay/relay-bound-reply.js +519 -0
  597. package/dist/server/src/lib/relay/relay-delivery.js +134 -220
  598. package/dist/server/src/lib/relay/relay-messages.js +39 -4
  599. package/dist/server/src/lib/relay/relay-overlap.js +92 -0
  600. package/dist/server/src/lib/relay/relay-system-line.js +3 -2
  601. package/dist/server/src/lib/relay/types.js +12 -1
  602. package/dist/server/src/lib/session/agent-session-lifecycle.js +18 -0
  603. package/dist/server/src/lib/session/claude-session.js +41 -6
  604. package/dist/server/src/lib/session/composer-clear.js +109 -4
  605. package/dist/server/src/lib/session/current-output-builder.js +23 -6
  606. package/dist/server/src/lib/session/instance-input-lock.js +664 -0
  607. package/dist/server/src/lib/session/send-attempt-state.js +19 -1
  608. package/dist/server/src/lib/session/send-attempt-types.js +9 -1
  609. package/dist/server/src/lib/session/send-user-message.js +82 -13
  610. package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
  611. package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
  612. package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
  613. package/dist/server/src/lib/session/waiting-episode-state.js +26 -339
  614. package/dist/server/src/lib/tmux/tmux.js +25 -0
  615. package/dist/server/src/lib/verification/gate-runner.js +11 -4
  616. package/docs/en/user-guide/webapp-guide.md +15 -10
  617. package/package.json +1 -1
  618. package/release-notes/0.49.0.json +45 -0
  619. package/release-notes/0.49.1.json +66 -0
  620. package/.next/server/chunks/1210.js +0 -1
  621. package/.next/server/chunks/1945.js +0 -14
  622. package/.next/server/chunks/1990.js +0 -103
  623. package/.next/server/chunks/4194.js +0 -67
  624. package/.next/server/chunks/4280.js +0 -1
  625. package/.next/server/chunks/5845.js +0 -1
  626. package/.next/server/chunks/6722.js +0 -1
  627. package/.next/server/chunks/720.js +0 -103
  628. package/.next/server/chunks/936.js +0 -1
  629. package/.next/server/chunks/9540.js +0 -1
  630. package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +0 -1
  631. package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
  632. package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
  633. package/.next/static/chunks/8606-cf6bdbff44a764cf.js +0 -1
  634. package/.next/static/chunks/9079-406b84d3cc891a87.js +0 -1
  635. package/.next/static/chunks/app/api/agents/update/route-c81284a9d8b35304.js +0 -1
  636. package/.next/static/chunks/app/api/agents/versions/route-c81284a9d8b35304.js +0 -1
  637. package/.next/static/chunks/app/api/app/release-notes/route-c81284a9d8b35304.js +0 -1
  638. package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +0 -1
  639. package/.next/static/chunks/app/api/app/update-check/route-c81284a9d8b35304.js +0 -1
  640. package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +0 -1
  641. package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +0 -1
  642. package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +0 -1
  643. package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +0 -1
  644. package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +0 -1
  645. package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +0 -1
  646. package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +0 -1
  647. package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +0 -1
  648. package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +0 -1
  649. package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +0 -1
  650. package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +0 -1
  651. package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +0 -1
  652. package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +0 -1
  653. package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +0 -1
  654. package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +0 -1
  655. package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +0 -1
  656. package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +0 -1
  657. package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +0 -1
  658. package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +0 -1
  659. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +0 -1
  660. package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +0 -1
  661. package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +0 -1
  662. package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +0 -1
  663. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +0 -1
  664. package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +0 -1
  665. package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +0 -1
  666. package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +0 -1
  667. package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +0 -1
  668. package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +0 -1
  669. package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +0 -1
  670. package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +0 -1
  671. package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +0 -1
  672. package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +0 -1
  673. package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +0 -1
  674. package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +0 -1
  675. package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +0 -1
  676. package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +0 -1
  677. package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +0 -1
  678. package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +0 -1
  679. package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +0 -1
  680. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +0 -1
  681. package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +0 -1
  682. package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +0 -1
  683. package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +0 -1
  684. package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +0 -1
  685. package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +0 -1
  699. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +0 -1
  700. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +0 -1
  701. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +0 -1
  702. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +0 -1
  703. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +0 -1
  704. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +0 -1
  705. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +0 -1
  706. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +0 -1
  707. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +0 -1
  708. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +0 -1
  709. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +0 -1
  710. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +0 -1
  711. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +0 -1
  712. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +0 -1
  713. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +0 -1
  714. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +0 -1
  715. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +0 -1
  716. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +0 -1
  717. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +0 -1
  718. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +0 -1
  719. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +0 -1
  720. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +0 -1
  721. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +0 -1
  722. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +0 -1
  723. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +0 -1
  724. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +0 -1
  725. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +0 -1
  726. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +0 -1
  727. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +0 -1
  728. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +0 -1
  729. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +0 -1
  730. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +0 -1
  731. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +0 -1
  732. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +0 -1
  733. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +0 -1
  734. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +0 -1
  735. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +0 -1
  736. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +0 -1
  737. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +0 -1
  738. package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +0 -1
  739. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +0 -1
  740. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +0 -1
  741. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +0 -1
  742. package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +0 -1
  743. package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +0 -1
  744. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +0 -1
  745. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +0 -1
  746. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +0 -1
  747. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +0 -1
  748. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +0 -1
  749. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +0 -1
  750. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +0 -1
  751. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +0 -1
  752. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +0 -1
  753. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +0 -1
  754. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +0 -1
  755. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +0 -1
  756. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +0 -1
  757. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +0 -1
  758. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +0 -1
  759. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +0 -1
  771. package/.next/static/chunks/app/layout-46b4cbf07520d9b6.js +0 -1
  772. package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +0 -1
  773. package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +0 -1
  774. package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +0 -1
  775. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
  776. package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +0 -1
  777. package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +0 -1
  778. package/.next/static/css/743f79ff19ab91e9.css +0 -1
  779. /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → fqfSDqQMweROeHUzOt_m1}/_buildManifest.js +0 -0
  780. /package/.next/static/{PTlAswXLq8PAe2vUJ8dVP → fqfSDqQMweROeHUzOt_m1}/_ssgManifest.js +0 -0
@@ -30,6 +30,7 @@ const logger_1 = require("../../lib/logger");
30
30
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
31
31
  const launch_screen_1 = require("../../lib/session/launch-screen");
32
32
  const errors_1 = require("../../lib/errors");
33
+ const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
33
34
  const logger = (0, logger_1.createLogger)('cli-tools/antigravity');
34
35
  /**
35
36
  * Single-quote a value for safe embedding in a shell command typed into a
@@ -308,6 +309,7 @@ class AntigravityTool extends base_1.BaseCLITool {
308
309
  let lastCaptureError;
309
310
  for (let i = 0; i < ANTIGRAVITY_INIT_MAX_ATTEMPTS; i++) {
310
311
  try {
312
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
311
313
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
312
314
  const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
313
315
  lastOutput = rawOutput;
@@ -323,11 +325,17 @@ class AntigravityTool extends base_1.BaseCLITool {
323
325
  if (!trustDialogHandled) {
324
326
  const decision = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.ANTIGRAVITY_TRUST_LAUNCH_DIALOG, output);
325
327
  if (decision.action === 'press' && !(0, antigravity_startup_trust_1.isStartupTrustHeld)(sessionName)) {
326
- await (0, tmux_1.sendSpecialKey)(sessionName, decision.key);
327
- trustDialogHandled = true;
328
- logger.info('auto-trusted-folder-for-antigravity');
329
- await new Promise((resolve) => setTimeout(resolve, ANTIGRAVITY_DIALOG_SETTLE_MS));
330
- continue;
328
+ // Issue #3952: typed as the composer's writer, and only while the
329
+ // screen still asks for this key once a send holding it is over.
330
+ const key = decision.key;
331
+ const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isTrustPressStill(sessionName, key), () => (0, tmux_1.sendSpecialKey)(sessionName, key));
332
+ if (outcome.answered) {
333
+ trustDialogHandled = true;
334
+ logger.info('auto-trusted-folder-for-antigravity');
335
+ await new Promise((resolve) => setTimeout(resolve, ANTIGRAVITY_DIALOG_SETTLE_MS));
336
+ continue;
337
+ }
338
+ logger.info('antigravity-trust-answer-skipped', { sessionName, reason: outcome.reason });
331
339
  }
332
340
  logTrustDecisionOnce(sessionName, decision, loggedTrustDecisions);
333
341
  }
@@ -354,6 +362,16 @@ class AntigravityTool extends base_1.BaseCLITool {
354
362
  ...(lastCaptureError !== undefined ? { lastCaptureError } : {}),
355
363
  });
356
364
  }
365
+ /**
366
+ * Whether a fresh read still shows the trust screen with `key` as its answer
367
+ * — the re-check an automatic trust answer makes once it owns the composer
368
+ * after another writer (Issue #3952).
369
+ */
370
+ async isTrustPressStill(sessionName, key) {
371
+ const output = (0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50));
372
+ const decision = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.ANTIGRAVITY_TRUST_LAUNCH_DIALOG, output);
373
+ return decision.action === 'press' && decision.key === key;
374
+ }
357
375
  /**
358
376
  * Wait for agy's prompt before sending a message.
359
377
  * Mirrors CodexTool.waitForPrompt: throws on timeout so a failed readiness
@@ -380,6 +398,7 @@ class AntigravityTool extends base_1.BaseCLITool {
380
398
  let lastCaptureError;
381
399
  while (Date.now() < deadline) {
382
400
  try {
401
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
383
402
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
384
403
  const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
385
404
  lastOutput = rawOutput;
@@ -395,8 +414,22 @@ class AntigravityTool extends base_1.BaseCLITool {
395
414
  if (trustDecision !== null && trustDecision.action !== 'press' && (0, antigravity_startup_trust_1.isStartupTrustPending)(sessionName)) {
396
415
  logTrustDecisionOnce(sessionName, trustDecision, loggedTrustDecisions);
397
416
  }
398
- if (trustDecision?.action === 'press' && (0, antigravity_startup_trust_1.claimStartupTrust)(sessionName)) {
399
- await (0, tmux_1.sendSpecialKey)(sessionName, trustDecision.key);
417
+ // Issue #3952: claimed and typed as the composer's writer. The claim is
418
+ // made only once the screen has been read again after a send holding
419
+ // the composer, so a screen that moved meanwhile keeps the Enter owed.
420
+ const pressKey = trustDecision?.action === 'press' ? trustDecision.key : null;
421
+ const claimed = pressKey !== null && (0, antigravity_startup_trust_1.isStartupTrustPending)(sessionName)
422
+ ? await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isTrustPressStill(sessionName, pressKey), async () => {
423
+ if (!(0, antigravity_startup_trust_1.claimStartupTrust)(sessionName))
424
+ return false;
425
+ await (0, tmux_1.sendSpecialKey)(sessionName, pressKey);
426
+ return true;
427
+ })
428
+ : null;
429
+ if (claimed !== null && !claimed.answered) {
430
+ logger.info('antigravity-trust-answer-skipped', { sessionName, reason: claimed.reason, afterLaunchWindow: true });
431
+ }
432
+ if (claimed?.answered === true && claimed.value) {
400
433
  logger.info('auto-trusted-folder-for-antigravity', { sessionName, afterLaunchWindow: true });
401
434
  // A full ordinary window for agy to draw its prompt after the Enter.
402
435
  deadline = Math.max(deadline, Date.now() + ANTIGRAVITY_PROMPT_WAIT_TIMEOUT_MS);
@@ -21,6 +21,7 @@ const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifec
21
21
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
22
22
  const launch_screen_1 = require("../../lib/session/launch-screen");
23
23
  const errors_1 = require("../../lib/errors");
24
+ const instance_input_lock_1 = require("../../lib/session/instance-input-lock");
24
25
  const logger = (0, logger_1.createLogger)('cli-tools/codex');
25
26
  /** Wait for Codex CLI to initialize after launch */
26
27
  const CODEX_INIT_WAIT_MS = 3000;
@@ -327,6 +328,7 @@ class CodexTool extends base_1.BaseCLITool {
327
328
  try {
328
329
  for (let i = 0; i < maxAttempts; i++) {
329
330
  try {
331
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
330
332
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
331
333
  const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
332
334
  // Issue #2315: the hooks screens are judged BEFORE readiness, and the
@@ -343,7 +345,7 @@ class CodexTool extends base_1.BaseCLITool {
343
345
  if (lifecycleScreen === 'hooks-review' ||
344
346
  lifecycleScreen === 'hooks-list' ||
345
347
  lifecycleScreen === 'hooks-detail') {
346
- const sent = await this.answerCodexHooksScreen(sessionName, lifecycleScreen, hooksScreenState, trustHooks);
348
+ const sent = await this.answerCodexHooksScreen(sessionName, lifecycleScreen, hooksScreenState, trustHooks, readMark);
347
349
  if (sent) {
348
350
  await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
349
351
  continue;
@@ -499,7 +501,20 @@ class CodexTool extends base_1.BaseCLITool {
499
501
  // stray keypress -- an empty submit on the main prompt, or worst case the
500
502
  // default "1. Update now" confirm if the key was dropped during a re-render.
501
503
  // Send the digit alone and let the next poll observe the result.
502
- await (0, tmux_1.sendKeys)(sessionName, keyToSend, false);
504
+ //
505
+ // Issue #3952: as the composer's writer, and only while the update
506
+ // dialog is still the active one once a send holding it is over.
507
+ const digit = keyToSend;
508
+ const updateOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'update'), () => (0, tmux_1.sendKeys)(sessionName, digit, false));
509
+ if (!updateOutcome.answered) {
510
+ // Nothing typed: the install this lock covers never started.
511
+ if (updateLockHeld) {
512
+ updateLockHeld = false;
513
+ (0, updates_1.releaseAgentUpdateLock)(CODEX_UPDATE_LOCK_TOOL);
514
+ }
515
+ logger.info('codex-update-dialog-answer-skipped', { sessionName, reason: updateOutcome.reason });
516
+ continue;
517
+ }
503
518
  updateDialogHandled = true;
504
519
  if (keyToSend === codex_update_dialog_config_1.CODEX_UPDATE_DIALOG_KEYS.update) {
505
520
  // codex is about to become `npm install`. The prompt this method
@@ -519,7 +534,11 @@ class CodexTool extends base_1.BaseCLITool {
519
534
  // Numbered selection dialogs are dismissed by the number key above, so this
520
535
  // branch is reached only when no number selection is pending.
521
536
  if (activeDialog === 'press-enter') {
522
- await (0, tmux_1.sendSpecialKey)(sessionName, 'Enter');
537
+ const enterOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'press-enter'), () => (0, tmux_1.sendSpecialKey)(sessionName, 'Enter'));
538
+ if (!enterOutcome.answered) {
539
+ logger.info('codex-notification-answer-skipped', { sessionName, reason: enterOutcome.reason });
540
+ continue;
541
+ }
523
542
  logger.info('dismissed-codex-notification');
524
543
  await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
525
544
  continue;
@@ -528,7 +547,11 @@ class CodexTool extends base_1.BaseCLITool {
528
547
  // Options: › 1. Yes, continue / 2. No, quit
529
548
  if (activeDialog === 'trust' && !trustDialogHandled) {
530
549
  // Issue #890: number-key selection confirms instantly; no trailing Enter.
531
- await (0, tmux_1.sendKeys)(sessionName, '1', false);
550
+ const trustOutcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, () => this.isActiveDialogStill(sessionName, 'trust'), () => (0, tmux_1.sendKeys)(sessionName, '1', false));
551
+ if (!trustOutcome.answered) {
552
+ logger.info('codex-trust-dialog-answer-skipped', { sessionName, reason: trustOutcome.reason });
553
+ continue;
554
+ }
532
555
  trustDialogHandled = true;
533
556
  logger.info('auto-trusted-folder-for-codex');
534
557
  await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CODEX_DIALOG_SETTLE_MS));
@@ -556,6 +579,14 @@ class CodexTool extends base_1.BaseCLITool {
556
579
  }
557
580
  }
558
581
  }
582
+ /**
583
+ * Whether `dialog` is still codex's active dialog on a fresh read — the
584
+ * re-check an automatic launch answer makes once it owns the composer after
585
+ * another writer (Issue #3952).
586
+ */
587
+ async isActiveDialogStill(sessionName, dialog) {
588
+ return (0, cli_patterns_1.getCodexActiveDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))) === dialog;
589
+ }
559
590
  /**
560
591
  * Send the one key that gets this pane off the hooks screen it is on
561
592
  * (Issue #2315).
@@ -590,9 +621,12 @@ class CodexTool extends base_1.BaseCLITool {
590
621
  * @param screen - The bottom-most active hooks screen, from `getCodexLifecycleDialog`
591
622
  * @param state - Per-screen budget, carried across polls by the caller
592
623
  * @param trust - Whether trust may be granted, from {@link shouldTrustCodexHooks}
593
- * @returns True when a key was sent, false when this screen's budget is spent
624
+ * @param readMark - {@link instanceInputReadMark} taken before the frame that showed `screen` was read
625
+ * @returns True when a key was sent, or none was because the composer's writer
626
+ * found the screen gone (Issue #3952) — either way the caller polls again;
627
+ * false when this screen's budget is spent
594
628
  */
595
- async answerCodexHooksScreen(sessionName, screen, state, trust) {
629
+ async answerCodexHooksScreen(sessionName, screen, state, trust, readMark) {
596
630
  if (state.screen !== screen) {
597
631
  // Progress. The pane moved, so the previous screen's spent attempts say
598
632
  // nothing about this one.
@@ -603,7 +637,22 @@ class CodexTool extends base_1.BaseCLITool {
603
637
  logger.warn('codex-hooks-screen-unresponsive', { sessionName, screen, trust });
604
638
  return false;
605
639
  }
606
- const attempt = ++state.attempts;
640
+ const attempt = state.attempts + 1;
641
+ // Issue #3952: the key goes to the composer's tmux pane, so it waits for a
642
+ // send that holds it — and is not typed if the hooks screen it was chosen
643
+ // for is gone once that send is over. Inside `sendMessage` under
644
+ // `sendUserMessage`'s lock it joins that lock instead.
645
+ const outcome = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => (0, cli_patterns_1.getCodexLifecycleDialog)((0, cli_patterns_1.stripAnsi)(await (0, tmux_1.capturePane)(sessionName, 50))) === screen, () => this.sendCodexHooksScreenKey(sessionName, screen, attempt, trust));
646
+ if (!outcome.answered) {
647
+ // Nothing was typed, so this screen's budget is not spent; poll again.
648
+ logger.info('codex-hooks-screen-answer-skipped', { sessionName, screen, reason: outcome.reason });
649
+ return true;
650
+ }
651
+ state.attempts = attempt;
652
+ return true;
653
+ }
654
+ /** The key {@link answerCodexHooksScreen} chose, typed as the composer's writer. */
655
+ async sendCodexHooksScreenKey(sessionName, screen, attempt, trust) {
607
656
  if (screen === 'hooks-review') {
608
657
  const key = attempt === 1
609
658
  ? trust
@@ -614,18 +663,17 @@ class CodexTool extends base_1.BaseCLITool {
614
663
  // on the screen this key just opened.
615
664
  await (0, tmux_1.sendKeys)(sessionName, key, false);
616
665
  logger.info('codex-hooks-review-answered', { sessionName, key, attempt, trust });
617
- return true;
666
+ return;
618
667
  }
619
668
  if (trust) {
620
669
  // `t`, the key screens 2 and 3 print in their own footers. Literal, so
621
670
  // tmux sends the character rather than resolving it as a key name.
622
671
  await (0, tmux_1.sendKeys)(sessionName, CODEX_HOOKS_TRUST_KEY, false, { literal: true });
623
672
  logger.info('codex-hooks-screen-trusted', { sessionName, screen, attempt });
624
- return true;
673
+ return;
625
674
  }
626
675
  await (0, tmux_1.sendSpecialKey)(sessionName, 'Escape');
627
676
  logger.info('codex-hooks-screen-escaped', { sessionName, screen, attempt });
628
- return true;
629
677
  }
630
678
  /**
631
679
  * Wait for Codex prompt before sending a message.
@@ -653,6 +701,7 @@ class CodexTool extends base_1.BaseCLITool {
653
701
  let trustHooks = null;
654
702
  while (Date.now() - startTime < CODEX_PROMPT_WAIT_TIMEOUT_MS) {
655
703
  try {
704
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
656
705
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
657
706
  const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
658
707
  // Before readiness, for the reason `waitForReady` gives: a review screen
@@ -667,7 +716,7 @@ class CodexTool extends base_1.BaseCLITool {
667
716
  const worktreePath = await (0, tmux_1.getSessionWorkingDirectory)(sessionName);
668
717
  trustHooks = worktreePath !== null && (0, hooks_config_1.shouldTrustCodexHooks)(worktreePath);
669
718
  }
670
- await this.answerCodexHooksScreen(sessionName, screen, hooksScreenState, trustHooks);
719
+ await this.answerCodexHooksScreen(sessionName, screen, hooksScreenState, trustHooks, readMark);
671
720
  }
672
721
  else if ((0, cli_patterns_1.isCodexPromptReady)(output)) {
673
722
  // Issue #890/#892: position-based guard so a residual update/trust dialog
@@ -34,7 +34,7 @@
34
34
  * @module lib/cli-tools/command-code-plan-review
35
35
  */
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.PLAN_REVIEW_STEP_DELAY_MS = exports.PLAN_REVIEW_REFUSAL = exports.PLAN_REVIEW_ACTIONS = void 0;
37
+ exports.PlanReviewInputLostError = exports.PLAN_REVIEW_STEP_DELAY_MS = exports.PLAN_REVIEW_REFUSAL = exports.PLAN_REVIEW_ACTIONS = void 0;
38
38
  exports.isPlanReviewAction = isPlanReviewAction;
39
39
  exports.planCommandCodePlanReviewKeys = planCommandCodePlanReviewKeys;
40
40
  exports.sendCommandCodePlanReviewKeys = sendCommandCodePlanReviewKeys;
@@ -153,15 +153,37 @@ function planCommandCodePlanReviewKeys(state, request) {
153
153
  }
154
154
  /** Pause between steps, so the TUI handles each one as its own input event. */
155
155
  exports.PLAN_REVIEW_STEP_DELAY_MS = 300;
156
+ /**
157
+ * The plan review's keys stopped part-way (Issue #3952 review P2-3): the
158
+ * session's input was taken from the answer — the session was replaced — after
159
+ * `stepsSent` of its steps had gone out. The rest were not sent.
160
+ */
161
+ class PlanReviewInputLostError extends Error {
162
+ stepsSent;
163
+ constructor(sessionName, stepsSent) {
164
+ super(`Session ${sessionName} was replaced while the plan review answer held its input; ` +
165
+ `${stepsSent} step(s) had been sent, the rest were not (Issue #3952).`);
166
+ this.stepsSent = stepsSent;
167
+ this.name = 'PlanReviewInputLostError';
168
+ }
169
+ }
170
+ exports.PlanReviewInputLostError = PlanReviewInputLostError;
156
171
  /**
157
172
  * Send the planned steps, one tmux invocation each.
158
173
  *
159
174
  * Key steps (including `C-r`) go through `sendSpecialKeys`; the comment text
160
175
  * goes through `-l` so it is never resolved as a key name.
176
+ *
177
+ * Issue #3952 review P2-3: given `isCurrent` (the input ticket the answer holds),
178
+ * it is asked before every step — after each wait — and a ticket that is no
179
+ * longer current stops the steps there ({@link PlanReviewInputLostError}), as
180
+ * the strict respond's keys stop.
161
181
  */
162
- async function sendCommandCodePlanReviewKeys(sessionName, steps, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
182
+ async function sendCommandCodePlanReviewKeys(sessionName, steps, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)), isCurrent) {
163
183
  for (let i = 0; i < steps.length; i++) {
164
184
  const step = steps[i];
185
+ if (isCurrent !== undefined && !isCurrent())
186
+ throw new PlanReviewInputLostError(sessionName, i);
165
187
  if (step.kind === 'text') {
166
188
  await (0, tmux_1.sendKeys)(sessionName, step.text, false, { literal: true });
167
189
  }
@@ -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--) {
@@ -397,15 +426,25 @@ class CopilotTool extends base_1.BaseCLITool {
397
426
  * `waiting`, and the send guard refuses a `waiting` session for as long as
398
427
  * that entry lives.
399
428
  *
429
+ * Issue #3952: the digit is typed as the composer's writer. A send that holds
430
+ * the composer is waited out, and the dialog is read again after it: when it
431
+ * is gone nothing is typed and false comes back, so the caller looks again on
432
+ * its next poll. Inside the selection-list branch's lock it joins that lock.
433
+ *
400
434
  * @param sessionName - tmux session name
401
435
  * @param output - ANSI-stripped pane capture
436
+ * @param readMark - {@link instanceInputReadMark} taken before `output` was read
402
437
  * @returns True when the dialog was found and answered
403
438
  */
404
- async answerFolderTrustDialog(sessionName, output) {
439
+ async answerFolderTrustDialog(sessionName, output, readMark) {
405
440
  if (!(0, cli_patterns_1.isCopilotFolderTrustDialog)(output)) {
406
441
  return false;
407
442
  }
408
- await (0, tmux_1.sendKeys)(sessionName, cli_patterns_1.COPILOT_FOLDER_TRUST_ANSWER_KEY, false);
443
+ 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));
444
+ if (!outcome.answered) {
445
+ logger.info('copilot-folder-trust-answer-skipped', { reason: outcome.reason });
446
+ return false;
447
+ }
409
448
  (0, launch_window_1.recordLaunchDialogPress)(sessionName);
410
449
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
411
450
  logger.info('copilot-folder-trust-answered');
@@ -477,6 +516,7 @@ class CopilotTool extends base_1.BaseCLITool {
477
516
  let trustDialogHandled = false;
478
517
  for (let i = 0; i < COPILOT_INIT_MAX_ATTEMPTS; i++) {
479
518
  try {
519
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
480
520
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
481
521
  const output = (0, cli_patterns_1.stripAnsi)(rawOutput);
482
522
  // Check if copilot's own composer is on screen
@@ -484,7 +524,7 @@ class CopilotTool extends base_1.BaseCLITool {
484
524
  logger.info('copilot-prompt-detected');
485
525
  return;
486
526
  }
487
- if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
527
+ if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
488
528
  trustDialogHandled = true;
489
529
  }
490
530
  }
@@ -541,6 +581,7 @@ class CopilotTool extends base_1.BaseCLITool {
541
581
  let output = '';
542
582
  while (Date.now() - startTime < timeoutMs) {
543
583
  try {
584
+ const readMark = (0, instance_input_lock_1.instanceInputReadMark)();
544
585
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, 50);
545
586
  output = (0, cli_patterns_1.stripAnsi)(rawOutput);
546
587
  if (this.isReadyFor(until, output)) {
@@ -555,7 +596,7 @@ class CopilotTool extends base_1.BaseCLITool {
555
596
  // "Yes, and remember this folder" and writes the operator's
556
597
  // machine-global ~/.copilot/config.json. Answer it here for the same
557
598
  // reason the launch path does, rather than leaving the worse outcome.
558
- if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output))) {
599
+ if (!trustDialogHandled && (await this.answerFolderTrustDialog(sessionName, output, readMark))) {
559
600
  trustDialogHandled = true;
560
601
  }
561
602
  }
@@ -641,19 +682,48 @@ class CopilotTool extends base_1.BaseCLITool {
641
682
  // same pane when the tool is gone; costs one `capture-pane` when it is not.
642
683
  await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: true });
643
684
  try {
644
- // Verify Copilot is at prompt state before sending
645
- await this.waitForPrompt(sessionName);
646
685
  // Check if this is a slash command that triggers a selection list
647
686
  const slashCmd = this.extractSlashCommand(message);
648
687
  if (slashCmd && SELECTION_LIST_COMMANDS.has(slashCmd)) {
649
688
  // For selection list commands: send text + Enter, then wait for
650
689
  // 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);
690
+ //
691
+ // Issue #3945: this types into the composer without the shared sender,
692
+ // so it takes the instance's input lock itself — from the readiness
693
+ // read (fresh, under the lock) to the picker that answers it — and
694
+ // waits out a carried paste mark first, as a normal send does.
695
+ await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, async (ticket) => {
696
+ await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
697
+ // review-2: a composer that never came up (a dialog, an unreadable
698
+ // pane, a time-out) is not typed into. The shared sender's re-check
699
+ // then refuses on the same terms right before the keys: a dialog is
700
+ // `prompt-waiting`, a pane that cannot be read `recheck-failed`.
701
+ const prompt = await this.waitForPrompt(sessionName);
702
+ await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
703
+ if (!prompt.ready) {
704
+ // review-3: neither the request nor the pane goes into the message.
705
+ // `classifySendFailure` reads the wording, and its "may have been
706
+ // typed" rules come first — a body or a screen saying `submit could
707
+ // not be confirmed` would turn this refusal into `indeterminate`.
708
+ logger.warn('copilot-selection-list-not-sent:prompt-not-ready', {
709
+ command: slashCmd,
710
+ bottomRow: describeBottomRow(prompt.output),
711
+ });
712
+ throw new Error(`copilot prompt not ready within ${COPILOT_PROMPT_WAIT_TIMEOUT_MS}ms, ` +
713
+ 'so the selection-list command was not sent; nothing was typed');
714
+ }
715
+ assertCopilotInputOwner(ticket, 'the selection-list command');
716
+ // Issue #3953: the send's stamp, as the shared sender takes it.
717
+ (0, instance_input_lock_1.noteInputStart)();
718
+ await typeLeavingMarkOnFailure(sessionName, message, ticket);
719
+ await this.waitForSelectionList(sessionName);
720
+ });
653
721
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
654
722
  logger.info('sent-selection-list-command-to-copilot', { command: slashCmd });
655
723
  return;
656
724
  }
725
+ // Verify Copilot is at prompt state before sending
726
+ await this.waitForPrompt(sessionName);
657
727
  // Issue #1471: Body/Enter separation + read-back submit verification via the
658
728
  // shared helper (replaces the old type -> C-m -> `\n`-gated paste recovery).
659
729
  // Copilot's own text-input / post-Enter delays are preserved. The selection
@@ -731,32 +801,52 @@ class CopilotTool extends base_1.BaseCLITool {
731
801
  const sessionName = this.getSessionName(worktreeId, instanceId);
732
802
  await this.requireSession('Copilot', worktreeId, instanceId, { relaunch: false });
733
803
  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 });
804
+ // Issue #3945: `/model` is typed into the composer, so it is one writer's
805
+ // turn like the selection-list branch — from the idle read to the answer.
806
+ await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, (ticket) => this.switchModelUnderInputLock(sessionName, modelName, ticket));
755
807
  }
756
808
  catch (error) {
757
809
  const errorMessage = (0, errors_1.getErrorMessage)(error);
758
- throw new Error(`Failed to switch Copilot model to ${modelName}: ${errorMessage}`);
810
+ // Issue #3952: the re-check's `code` is kept, so the caller records a
811
+ // dialog or an unreadable pane as such rather than as a refused model.
812
+ const code = error?.code;
813
+ throw Object.assign(new Error(`Failed to switch Copilot model to ${modelName}: ${errorMessage}`), typeof code === 'string' ? { code } : {});
814
+ }
815
+ }
816
+ /** {@link sendModelCommand}'s keys and waits, as the composer's only writer (Issue #3945). */
817
+ async switchModelUnderInputLock(sessionName, modelName, ticket) {
818
+ // A previous send's body may still arrive (review-1 #5): `/model` waits it
819
+ // out like a normal send, and the idle read below is the one after the wait.
820
+ await (0, instance_input_lock_1.waitOutCarriedPasteMark)(ticket);
821
+ const idle = await this.waitForPrompt(sessionName, copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS, 'idle');
822
+ if (!idle.ready) {
823
+ // The pane's text goes to the log, not the message: the message is read by
824
+ // `classifySendFailure`, which a screen quoting its keywords would steer (#3954).
825
+ logger.warn('copilot-model-switch-not-idle', { model: modelName, bottomRow: describeBottomRow(idle.output) });
826
+ throw new Error(`copilot did not become idle within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms, so /model was not sent`);
827
+ }
828
+ const before = readCopilotModelSwitchOutcomes(idle.output, modelName);
829
+ // Issue #3952: "idle, so no dialog" holds for the frame that was read, not
830
+ // for the moment the keys go out. The pane is read once more right before
831
+ // them, as every send is: a dialog is `prompt-waiting`, a pane that cannot
832
+ // be read `recheck-failed`, and nothing is typed in either case.
833
+ await (0, composer_clear_1.recheckComposerBeforeInput)(sessionName, 'copilot');
834
+ // Send /model <modelName> command with Enter. An argument means an
835
+ // in-place switch, never a picker (Issue #1895).
836
+ assertCopilotInputOwner(ticket, '/model');
837
+ await typeLeavingMarkOnFailure(sessionName, `/model ${modelName}`, ticket);
838
+ const verdict = await this.waitForModelSwitchOutcome(sessionName, modelName, before);
839
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
840
+ if (verdict.kind === 'rejected') {
841
+ logger.warn('copilot-model-rejected', { model: modelName, reason: verdict.reason });
842
+ throw new Error(`copilot refused it: ${verdict.reason}`);
843
+ }
844
+ if (verdict.kind === 'pending') {
845
+ logger.warn('copilot-model-switch-unconfirmed', { model: modelName, bottomRow: verdict.bottomRow });
846
+ throw new Error(`copilot printed no answer to /model within ${copilot_constants_1.COPILOT_MODEL_SWITCH_TIMEOUT_MS}ms; ` +
847
+ 'the switch may still take effect, and nothing further was typed');
759
848
  }
849
+ logger.info('copilot-model-switched', { model: modelName });
760
850
  }
761
851
  /**
762
852
  * 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,11 @@ 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
+ await (0, instance_input_lock_1.withInstanceInputLock)(sessionName, () => (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true));
110
115
  // Wait for Gemini to initialize (minimum wait for banner/auth)
111
116
  await new Promise((resolve) => setTimeout(resolve, GEMINI_INIT_WAIT_MS));
112
117
  // Poll until Gemini interactive prompt is ready
@@ -139,6 +144,8 @@ class GeminiTool extends base_1.BaseCLITool {
139
144
  const loggedDecisions = new Set();
140
145
  for (let i = 0; i < GEMINI_INIT_MAX_ATTEMPTS; i++) {
141
146
  try {
147
+ // Issue #3975: taken before the read the trust Enter is decided on.
148
+ const readMark = (0, instance_input_lock_1.instanceInputLaunchReadMark)();
142
149
  const rawOutput = await (0, tmux_1.capturePane)(sessionName, capture_spec_1.GEMINI_PANE_HEIGHT);
143
150
  // Strip ANSI escape codes before pattern matching
144
151
  // (Gemini TUI uses 24-bit color codes that break regex matching)
@@ -152,14 +159,26 @@ class GeminiTool extends base_1.BaseCLITool {
152
159
  if (!trustDialogHandled) {
153
160
  const decision = (0, launch_dialog_1.decideLaunchDialog)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, output);
154
161
  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
162
+ // Issue #3975: the Enter as an `exclusive` writer, so it never lands
163
+ // inside a send's body, paste or Enter; a send that came between
164
+ // the read and the lock makes the dialog be read again first.
165
+ const pressed = await (0, instance_input_lock_1.answerUnderInstanceInputLock)(sessionName, readMark, async () => {
166
+ 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)));
167
+ return again.action === 'press' && again.key === decision.key;
168
+ }, () => (0, tmux_1.sendSpecialKey)(sessionName, decision.key), { mode: 'exclusive' });
169
+ if (pressed.answered) {
170
+ trustDialogHandled = true;
171
+ trustPressedAt = Date.now();
172
+ // Issue #3790: the poller leaves the answered dialog alone even if
173
+ // the window closes before gemini redraws it.
174
+ (0, launch_window_1.recordLaunchDialogPress)(sessionName, trustPressedAt);
175
+ logger.info('auto-trusted-folder-for-gemini');
176
+ // Continue polling for prompt after trust dialog
177
+ }
178
+ else {
179
+ // Not answered this poll; the next one reads the screen again.
180
+ logger.info('gemini-trust-answer-skipped', { sessionName, reason: pressed.reason });
181
+ }
163
182
  }
164
183
  else {
165
184
  const warning = (0, launch_dialog_1.launchDialogWarning)(launch_dialog_1.GEMINI_TRUST_LAUNCH_DIALOG, decision);