commandmate 0.47.0 → 0.48.0

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 (696) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +501 -501
  3. package/.next/app-path-routes-manifest.json +34 -34
  4. package/.next/build-manifest.json +8 -8
  5. package/.next/diagnostics/framework.json +1 -1
  6. package/.next/next-minimal-server.js.nft.json +1 -1
  7. package/.next/next-server.js.nft.json +1 -1
  8. package/.next/prerender-manifest.json +12 -12
  9. package/.next/react-loadable-manifest.json +1 -1
  10. package/.next/required-server-files.json +1 -1
  11. package/.next/server/app/_not-found/page.js +2 -2
  12. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/agents/update/route.js +2 -2
  15. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  16. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/agents/versions/route.js +1 -1
  18. package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
  19. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/app/release-notes/route.js +1 -1
  21. package/.next/server/app/api/app/release-notes/route.js.nft.json +1 -1
  22. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/app/update/route.js +5 -5
  24. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  25. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/app/update-check/route.js +1 -1
  27. package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
  28. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/auth/login/route.js +1 -1
  30. package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  31. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/auth/logout/route.js +1 -1
  33. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  34. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/status/route.js +1 -1
  36. package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  37. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/capabilities/route.js +1 -1
  39. package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
  40. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/daily-summary/route.js +1 -1
  42. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  43. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  45. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  46. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  48. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  49. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  51. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/external-apps/route.js +1 -1
  54. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  55. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/fs/browse/route.js +1 -1
  57. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  58. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  60. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  61. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  63. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  64. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  66. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  67. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  69. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  70. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/metrics/vibe/route.js +2 -2
  72. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  73. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/ollama/models/route.js +1 -1
  75. package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
  76. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/push/escalation/route.js +1 -1
  78. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  79. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  81. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  82. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/push/vapid/route.js +1 -1
  84. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  85. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  87. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  88. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/relays/route.js +1 -1
  90. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  91. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/remote/pair/route.js +2 -2
  93. package/.next/server/app/api/remote/pair/route.js.nft.json +1 -1
  94. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  96. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  97. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  99. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  100. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/repositories/clone/route.js +1 -1
  102. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  103. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  105. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  106. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/repositories/restore/route.js +1 -1
  108. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  109. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/repositories/route.js +1 -1
  111. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  112. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/repositories/scan/route.js +1 -1
  114. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  115. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/repositories/sync/route.js +1 -1
  117. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  118. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  120. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  121. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  123. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  124. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/settings/default-surface-mode/route.js +1 -1
  126. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  127. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  129. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  130. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/skills/[id]/route.js +1 -1
  132. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  133. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/skills/installations/route.js +1 -1
  135. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  136. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/skills/operations/route.js +2 -2
  138. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  139. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/skills/reindex/route.js +1 -1
  141. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  142. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/skills/route.js +1 -1
  144. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  145. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/slash-commands/route.js +1 -1
  147. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  148. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
  150. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  151. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  153. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/templates/[id]/route.js +1 -1
  156. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  157. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/templates/route.js +1 -1
  159. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  160. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  162. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  163. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/verification/runs/route.js +1 -1
  165. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  166. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +7 -7
  183. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/env/route.js +2 -2
  192. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -3
  198. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  253. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  256. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  262. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  274. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  291. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  298. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  313. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  325. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  326. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  327. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  331. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  332. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  333. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  334. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  335. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  337. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  338. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  340. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +5 -5
  342. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  343. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  344. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  346. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  347. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  349. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  350. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  352. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  353. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  354. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  355. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  356. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  357. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  358. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  359. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  360. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  361. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  362. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  363. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  364. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  365. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  366. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  367. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  368. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  369. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  370. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  371. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  372. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  373. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  374. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  375. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  376. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  377. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  378. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  379. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  380. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  381. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  382. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  383. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  384. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  385. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  386. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  387. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  388. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  389. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  390. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  391. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  392. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  393. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  394. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  395. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  396. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  397. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  398. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -2
  399. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  400. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  401. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  402. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  403. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  404. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  405. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  406. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  407. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  408. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  409. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  410. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  411. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  412. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  413. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  414. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  415. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  416. package/.next/server/app/api/worktrees/apply-default-agents/route.js +1 -1
  417. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  418. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  419. package/.next/server/app/api/worktrees/route.js +1 -1
  420. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  421. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  422. package/.next/server/app/apple-icon.png/route.js +1 -1
  423. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
  424. package/.next/server/app/apple-icon.png.meta +1 -1
  425. package/.next/server/app/icon.png/route.js +1 -1
  426. package/.next/server/app/icon.png/route.js.nft.json +1 -1
  427. package/.next/server/app/icon.png.meta +1 -1
  428. package/.next/server/app/icon1.png/route.js +1 -1
  429. package/.next/server/app/icon1.png/route.js.nft.json +1 -1
  430. package/.next/server/app/icon1.png.meta +1 -1
  431. package/.next/server/app/icon2.png/route.js +1 -1
  432. package/.next/server/app/icon2.png/route.js.nft.json +1 -1
  433. package/.next/server/app/icon2.png.meta +1 -1
  434. package/.next/server/app/login/page.js +2 -2
  435. package/.next/server/app/login/page.js.nft.json +1 -1
  436. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  437. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  438. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  439. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  440. package/.next/server/app/manifest.webmanifest.meta +1 -1
  441. package/.next/server/app/more/page.js +2 -2
  442. package/.next/server/app/more/page.js.nft.json +1 -1
  443. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  444. package/.next/server/app/offline/page.js +2 -2
  445. package/.next/server/app/offline/page.js.nft.json +1 -1
  446. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  447. package/.next/server/app/page.js +2 -2
  448. package/.next/server/app/page.js.nft.json +1 -1
  449. package/.next/server/app/page_client-reference-manifest.js +1 -1
  450. package/.next/server/app/proxy/[...path]/route.js +1 -1
  451. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  452. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  453. package/.next/server/app/repositories/page.js +2 -2
  454. package/.next/server/app/repositories/page.js.nft.json +1 -1
  455. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  456. package/.next/server/app/review/page.js +2 -2
  457. package/.next/server/app/review/page.js.nft.json +1 -1
  458. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  459. package/.next/server/app/sessions/page.js +2 -2
  460. package/.next/server/app/sessions/page.js.nft.json +1 -1
  461. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  462. package/.next/server/app/skills/[skillId]/page.js +2 -2
  463. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  464. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  465. package/.next/server/app/skills/installed/page.js +2 -2
  466. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  467. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  468. package/.next/server/app/skills/page.js +2 -2
  469. package/.next/server/app/skills/page.js.nft.json +1 -1
  470. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  471. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  472. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  473. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  474. package/.next/server/app/worktrees/[id]/page.js +12 -12
  475. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  476. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  477. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  478. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  479. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  480. package/.next/server/app-paths-manifest.json +34 -34
  481. package/.next/server/chunks/{5048.js → 1185.js} +1 -1
  482. package/.next/server/chunks/1191.js +11 -4
  483. package/.next/server/chunks/1501.js +1 -1
  484. package/.next/server/chunks/1601.js +2 -2
  485. package/.next/server/chunks/1656.js +19 -0
  486. package/.next/server/chunks/1945.js +3 -3
  487. package/.next/server/chunks/1990.js +103 -0
  488. package/.next/server/chunks/2119.js +1 -1
  489. package/.next/server/chunks/2404.js +1 -1
  490. package/.next/server/chunks/2422.js +1 -1
  491. package/.next/server/chunks/2445.js +1 -1
  492. package/.next/server/chunks/2534.js +1 -1
  493. package/.next/server/chunks/255.js +1 -0
  494. package/.next/server/chunks/3241.js +1 -1
  495. package/.next/server/chunks/3505.js +7 -0
  496. package/.next/server/chunks/3897.js +22 -0
  497. package/.next/server/chunks/4072.js +5 -5
  498. package/.next/server/chunks/4248.js +1 -1
  499. package/.next/server/chunks/4280.js +1 -0
  500. package/.next/server/chunks/463.js +1 -0
  501. package/.next/server/chunks/5209.js +1 -1
  502. package/.next/server/chunks/5611.js +1 -1
  503. package/.next/server/chunks/6119.js +1 -0
  504. package/.next/server/chunks/6130.js +1 -1
  505. package/.next/server/chunks/6345.js +1 -1
  506. package/.next/server/chunks/6401.js +1 -1
  507. package/.next/server/chunks/6486.js +9 -8
  508. package/.next/server/chunks/6781.js +1 -1
  509. package/.next/server/chunks/6784.js +1 -0
  510. package/.next/server/chunks/720.js +103 -0
  511. package/.next/server/chunks/7604.js +2 -0
  512. package/.next/server/chunks/7905.js +1 -1
  513. package/.next/server/chunks/8581.js +7 -7
  514. package/.next/server/chunks/8728.js +3 -3
  515. package/.next/server/chunks/8791.js +1 -1
  516. package/.next/server/chunks/8807.js +19 -18
  517. package/.next/server/chunks/8918.js +2 -104
  518. package/.next/server/chunks/9130.js +1 -1
  519. package/.next/server/chunks/936.js +1 -1
  520. package/.next/server/chunks/9390.js +1 -1
  521. package/.next/server/chunks/9540.js +1 -1
  522. package/.next/server/chunks/9627.js +4 -4
  523. package/.next/server/chunks/9731.js +3 -3
  524. package/.next/server/middleware-build-manifest.js +1 -1
  525. package/.next/server/middleware-manifest.json +5 -5
  526. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  527. package/.next/server/pages/500.html +1 -1
  528. package/.next/server/pages/_document.js.nft.json +1 -1
  529. package/.next/server/pages/_error.js +3 -3
  530. package/.next/server/pages/_error.js.nft.json +1 -1
  531. package/.next/server/server-reference-manifest.json +1 -1
  532. package/.next/server/src/middleware.js.map +1 -1
  533. package/.next/static/chunks/{1111.5ab4f0ffb0d944e5.js → 1111.1b653d4a9816a0a7.js} +8 -8
  534. package/.next/static/chunks/{1255-7e5873f06b25e129.js → 1255-a85690d352f4f8fd.js} +1 -1
  535. package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +1 -0
  536. package/.next/static/chunks/{2407-b2f524f99f7fc353.js → 2407-26139a8a2f1adbe8.js} +1 -1
  537. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  538. package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-f0121af1cbbedb3b.js} +1 -1
  539. package/.next/static/chunks/{8165-263172c17ae8e8c3.js → 8165-c68b3dc844210e6a.js} +1 -1
  540. package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
  541. package/.next/static/chunks/9079-406b84d3cc891a87.js +1 -0
  542. package/.next/static/chunks/9465-b59bb255b376c813.js +1 -0
  543. package/.next/static/chunks/app/{layout-419eaf7de340f4ab.js → layout-46b4cbf07520d9b6.js} +1 -1
  544. package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +1 -0
  545. package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +1 -0
  546. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  547. package/.next/static/chunks/main-37ca13e38030fe8b.js +1 -0
  548. package/.next/static/chunks/{webpack-468b7b33030234b3.js → webpack-838df0273b03af19.js} +1 -1
  549. package/.next/trace +13 -13
  550. package/dist/cli/commands/auto-yes.d.ts +24 -0
  551. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  552. package/dist/cli/commands/auto-yes.js +73 -3
  553. package/dist/cli/commands/instances.d.ts.map +1 -1
  554. package/dist/cli/commands/instances.js +10 -1
  555. package/dist/cli/commands/prompt.d.ts.map +1 -1
  556. package/dist/cli/commands/prompt.js +28 -14
  557. package/dist/cli/commands/send.d.ts.map +1 -1
  558. package/dist/cli/commands/send.js +15 -0
  559. package/dist/cli/commands/wait.d.ts.map +1 -1
  560. package/dist/cli/commands/wait.js +108 -14
  561. package/dist/cli/docs/agent-operations.d.ts +2 -2
  562. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  563. package/dist/cli/docs/agent-operations.js +27 -0
  564. package/dist/cli/types/api-responses.d.ts +131 -4
  565. package/dist/cli/types/api-responses.d.ts.map +1 -1
  566. package/dist/cli/types/index.d.ts +4 -0
  567. package/dist/cli/types/index.d.ts.map +1 -1
  568. package/dist/cli/utils/resource-resolvers.d.ts +0 -18
  569. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
  570. package/dist/cli/utils/resource-resolvers.js +1 -51
  571. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +65 -2
  572. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  573. package/dist/lib/polling/auto-yes-suppression-reason.js +36 -2
  574. package/dist/lib/prompt-observation/types.d.ts +13 -0
  575. package/dist/lib/prompt-observation/types.d.ts.map +1 -1
  576. package/dist/server/locales/en/worktree.json +2 -1
  577. package/dist/server/locales/ja/worktree.json +2 -1
  578. package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
  579. package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
  580. package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
  581. package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
  582. package/dist/server/src/lib/auto-yes-poller.js +468 -792
  583. package/dist/server/src/lib/auto-yes-state.js +50 -2
  584. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +107 -14
  585. package/dist/server/src/lib/db/chat-db.js +5 -1
  586. package/dist/server/src/lib/db/verification-db.js +23 -2
  587. package/dist/server/src/lib/detection/option-recommendation.js +120 -0
  588. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
  589. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +396 -268
  590. package/dist/server/src/lib/detection/prompt-detector.js +92 -21
  591. package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
  592. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
  593. package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
  594. package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
  595. package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
  596. package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
  597. package/dist/server/src/lib/hooks/permission-adjudication.js +26 -0
  598. package/dist/server/src/lib/hooks/permission-decision-service.js +49 -4
  599. package/dist/server/src/lib/hooks/permission-request-payload.js +20 -0
  600. package/dist/server/src/lib/hooks/sources/antigravity/source.js +21 -0
  601. package/dist/server/src/lib/hooks/sources/claude/source.js +3 -0
  602. package/dist/server/src/lib/hooks/sources/codex/source.js +2 -0
  603. package/dist/server/src/lib/hooks/sources/command-code/source.js +2 -0
  604. package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
  605. package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
  606. package/dist/server/src/lib/hooks/sources/legacy-relay.js +2 -0
  607. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
  608. package/dist/server/src/lib/hooks/sources/opencode/source.js +2 -0
  609. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +6 -0
  610. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +2 -0
  611. package/dist/server/src/lib/hooks/sources/pending-decisions.js +14 -2
  612. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +14 -3
  613. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +21 -1
  614. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
  615. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +117 -0
  616. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +1091 -0
  617. package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
  618. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
  619. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
  620. package/dist/server/src/lib/polling/auto-yes-ledger-records.js +143 -0
  621. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +122 -0
  622. package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
  623. package/dist/server/src/lib/polling/auto-yes-policy.js +46 -11
  624. package/dist/server/src/lib/polling/auto-yes-poller-capture.js +63 -0
  625. package/dist/server/src/lib/polling/auto-yes-poller-enter-fallback.js +37 -0
  626. package/dist/server/src/lib/polling/auto-yes-poller-generation.js +192 -0
  627. package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +324 -0
  628. package/dist/server/src/lib/polling/auto-yes-poller-state.js +193 -26
  629. package/dist/server/src/lib/polling/auto-yes-poller-steps.js +279 -0
  630. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +13 -2
  631. package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
  632. package/dist/server/src/lib/polling/auto-yes-resolver.js +117 -22
  633. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +36 -2
  634. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
  635. package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
  636. package/dist/server/src/lib/polling/response-checker-blank-response.js +30 -0
  637. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
  638. package/dist/server/src/lib/polling/response-checker.js +138 -53
  639. package/dist/server/src/lib/prompt-answer-sender.js +104 -10
  640. package/dist/server/src/lib/prompt-observation/appearance.js +165 -0
  641. package/dist/server/src/lib/push/notification-dedup.js +15 -2
  642. package/dist/server/src/lib/push/prompt-card-state.js +140 -19
  643. package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
  644. package/dist/server/src/lib/push/push-sender.js +23 -3
  645. package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
  646. package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
  647. package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
  648. package/dist/server/src/lib/session/agent-event-state.js +25 -5
  649. package/dist/server/src/lib/session/agent-event-turn.js +140 -46
  650. package/dist/server/src/lib/session/cli-session.js +21 -2
  651. package/dist/server/src/lib/session/current-output-builder.js +64 -11
  652. package/dist/server/src/lib/session/send-attempt-state.js +23 -7
  653. package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
  654. package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
  655. package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
  656. package/dist/server/src/lib/session/waiting-episode-state.js +307 -17
  657. package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
  658. package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
  659. package/dist/server/src/lib/tmux/tmux.js +54 -9
  660. package/dist/server/src/lib/verification/gate-runner.js +162 -13
  661. package/dist/server/src/lib/verification/machine-lock.js +5 -0
  662. package/dist/server/src/lib/ws-server.js +18 -3
  663. package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
  664. package/dist/server/src/types/auto-yes-decision.js +61 -0
  665. package/dist/server/src/types/auto-yes.js +6 -0
  666. package/dist/server/src/types/prompt-reading.js +32 -0
  667. package/dist/types/auto-yes-answer-mode.d.ts +35 -0
  668. package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
  669. package/dist/types/auto-yes-answer-mode.js +38 -0
  670. package/docs/en/user-guide/webapp-guide.md +33 -4
  671. package/package.json +2 -2
  672. package/public/sw.js +76 -4
  673. package/release-notes/0.47.1.json +20 -0
  674. package/release-notes/0.47.2.json +20 -0
  675. package/release-notes/0.48.0.json +57 -0
  676. package/scripts/hooks/cmate-agent-event.sh +22 -0
  677. package/.next/server/chunks/1331.js +0 -22
  678. package/.next/server/chunks/1559.js +0 -2
  679. package/.next/server/chunks/1836.js +0 -1
  680. package/.next/server/chunks/1944.js +0 -1
  681. package/.next/server/chunks/2328.js +0 -1
  682. package/.next/server/chunks/2460.js +0 -1
  683. package/.next/server/chunks/5292.js +0 -7
  684. package/.next/server/chunks/5595.js +0 -1
  685. package/.next/server/chunks/7166.js +0 -19
  686. package/.next/server/chunks/9051.js +0 -1
  687. package/.next/server/chunks/9199.js +0 -1
  688. package/.next/static/chunks/602-1c1488959215e140.js +0 -1
  689. package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
  690. package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
  691. package/.next/static/chunks/9465-e5a351baa941f31b.js +0 -1
  692. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
  693. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +0 -1
  694. package/.next/static/chunks/main-ac91ed6e71380841.js +0 -1
  695. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_buildManifest.js +0 -0
  696. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_ssgManifest.js +0 -0
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ /**
3
+ * The blank-response skips of `checkForResponse` (Issue #3784 split from
4
+ * response-checker.ts).
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.isBlankExtractedResponse = isBlankExtractedResponse;
8
+ exports.isBlankCleanedResponse = isBlankCleanedResponse;
9
+ exports.recordBlankResponseSkip = recordBlankResponseSkip;
10
+ const db_1 = require("../../lib/db");
11
+ const response_dedup_1 = require("./response-dedup");
12
+ /** True when the extracted response has no content. */
13
+ function isBlankExtractedResponse(response) {
14
+ return !response || response.trim() === '';
15
+ }
16
+ /** True when the cleaned response is empty or just "[No content]". */
17
+ function isBlankCleanedResponse(cleanedResponse) {
18
+ return !cleanedResponse || cleanedResponse.trim() === '' || cleanedResponse === '[No content]';
19
+ }
20
+ /**
21
+ * What a blank response leaves behind: the run of duplicate response ticks is
22
+ * over and the cursor moves to this capture. Written only by a tick that still
23
+ * owns the poller.
24
+ */
25
+ function recordBlankResponseSkip(db, worktreeId, cliToolId, resolvedInstanceId, pollerKey, lineCount, owns) {
26
+ if (owns) {
27
+ (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
28
+ (0, db_1.updateSessionState)(db, worktreeId, cliToolId, lineCount, resolvedInstanceId);
29
+ }
30
+ }
@@ -6,10 +6,13 @@
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.isWithheldForWantOfReceipt = isWithheldForWantOfReceipt;
9
+ exports.isAntigravityGenericReadingOnScreen = isAntigravityGenericReadingOnScreen;
9
10
  exports.isNumberedDialogVouched = isNumberedDialogVouched;
10
11
  const logger_1 = require("../../lib/logger");
11
12
  const logger = (0, logger_1.createLogger)('response-poller');
12
13
  const antigravity_receipt_episodes_1 = require("./antigravity-receipt-episodes");
14
+ const dialog_1 = require("../../lib/detection/tools/antigravity/dialog");
15
+ const auto_yes_option_effect_1 = require("./auto-yes-option-effect");
13
16
  // Issue #2457: the same rollout table, `hasDialogRules` cross-check and
14
17
  // `detectDialog` seam Auto-Yes reads, reached through the presence helper rather
15
18
  // than through `evaluateAutoYesDialogGate` — see `isNumberedDialogVouched`.
@@ -44,6 +47,42 @@ function isWithheldForWantOfReceipt(scope) {
44
47
  });
45
48
  return true;
46
49
  }
50
+ /**
51
+ * Does the screen itself show that the generic parser's agy reading is one
52
+ * CommandMate may answer? (Issue #3881, the second half: finding 8)
53
+ *
54
+ * Asked by the answering entry (`detectPromptOnCleanFrame` with a receipt
55
+ * scope) only for a reading agy's own reader did not take and
56
+ * `isAntigravityUnansweredNumberedScreen` let through — in practice a reply's
57
+ * plain `1. … N.` list (#1928's legacy reading). Before this, such a list was
58
+ * answered whenever agy's hook had recorded a tool call a moment earlier
59
+ * (#2849). The receipt says a tool call happened; it says nothing about
60
+ * whether THIS list is that call's approval UI, so on its own it is not
61
+ * evidence. The screen must show some:
62
+ *
63
+ * - agy's `/feedback` menu (its own footer under the options), the generic
64
+ * reading #2364 left in place;
65
+ * - option rows agy's measured permission wording reads as (`Yes`, `Yes, run
66
+ * command`, `Yes, and always allow …` — `auto-yes-option-effect`).
67
+ *
68
+ * The heading (`Requesting permission for:` / `Do you want to proceed?`), the
69
+ * `>` cursor and the `↑/↓ Navigate` footer are the other evidence, and a frame
70
+ * that shows them reaches no generic reading: agy's reader answers it, or
71
+ * `isAntigravityUnansweredNumberedScreen` declines it (#3808, #3818).
72
+ *
73
+ * A yes/no reading is not a numbered list and is left as it was.
74
+ *
75
+ * @param cleanOutput - The frame the reading came off (ANSI and box drawing stripped)
76
+ * @param reading - The generic parser's reading of it
77
+ */
78
+ function isAntigravityGenericReadingOnScreen(cleanOutput, reading) {
79
+ const promptData = reading.promptData;
80
+ if (promptData?.type !== 'multiple_choice')
81
+ return true;
82
+ if ((0, dialog_1.isAntigravityFeedbackMenuScreen)(cleanOutput))
83
+ return true;
84
+ return (0, auto_yes_option_effect_1.selectAllowOnceOption)(promptData.options, 'antigravity').kind !== 'not-a-permission-dialog';
85
+ }
47
86
  /**
48
87
  * Is the generic parser's numbered-list candidate a dialog the tool vouches for?
49
88
  * (Issue #2457)
@@ -64,8 +64,13 @@ const prompt_push_gate_1 = require("../../lib/push/prompt-push-gate");
64
64
  const failure_push_notifier_1 = require("../../lib/push/failure-push-notifier");
65
65
  const upstream_faults_1 = require("../../lib/detection/upstream-faults");
66
66
  const waiting_push_notifier_1 = require("../../lib/push/waiting-push-notifier");
67
+ const waiting_episode_binding_1 = require("../../lib/session/waiting-episode-binding");
67
68
  const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
69
+ const waiting_screen_reading_1 = require("../../lib/detection/waiting-screen-reading");
70
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
71
+ const auto_yes_poller_state_1 = require("./auto-yes-poller-state");
68
72
  const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
73
+ const response_checker_blank_response_1 = require("./response-checker-blank-response");
69
74
  /**
70
75
  * How many rows from the bottom of a capture the upstream-fault check reads
71
76
  * (Issue #2000).
@@ -153,6 +158,7 @@ function broadcastPromptSweptToAnswered(worktreeId) {
153
158
  // the one that calls `detectPrompt`, and only this file may import
154
159
  // `@/lib/tmux/tmux-capture-cache` (.eslintrc.json `no-restricted-imports`).
155
160
  const response_checker_extraction_result_1 = require("./response-checker-extraction-result");
161
+ const prompt_screen_reading_1 = require("./prompt-screen-reading");
156
162
  var response_checker_extraction_result_2 = require("./response-checker-extraction-result");
157
163
  Object.defineProperty(exports, "incompleteResult", { enumerable: true, get: function () { return response_checker_extraction_result_2.incompleteResult; } });
158
164
  Object.defineProperty(exports, "buildPromptExtractionResult", { enumerable: true, get: function () { return response_checker_extraction_result_2.buildPromptExtractionResult; } });
@@ -196,8 +202,10 @@ const response_checker_extraction_steps_1 = require("./response-checker-extracti
196
202
  * @param receiptScope - whose frame this is, when the caller answers it
197
203
  * automatically (Issue #2849). For agy only: a frame that reads as a prompt is
198
204
  * then handed back as no prompt unless agy asked CommandMate about a tool call
199
- * for that instance a moment ago. Omitted, the reading is not gated — which is
200
- * what every caller that only DISPLAYS the frame wants.
205
+ * for that instance a moment ago — and (Issue #3881) a generic numbered
206
+ * reading also needs evidence on the screen itself
207
+ * (`isAntigravityGenericReadingOnScreen`). Omitted, the reading is not gated —
208
+ * which is what every caller that only DISPLAYS the frame wants.
201
209
  * @param frame - the SAME tick's `normalizeFrame(raw, cliToolId)`, when the
202
210
  * caller built one (Issue #3183). The Auto-Yes poller builds it once and hands
203
211
  * the same object to the dialog gate, so the quotation veto below and the gate
@@ -234,7 +242,13 @@ function detectPromptOnCleanFrame(cleanOutput, cliToolId, precomputedLines, rawF
234
242
  // reads `> 1. Google OAuth` as an answerable option. Judged without the
235
243
  // footer, so a missing footer cannot reopen the generic path. The status
236
244
  // verdict publishes the same frame as unclassified (`tools/antigravity/detect.ts`).
237
- if ((0, dialog_1.isAntigravityUnvouchedNumberedScreen)(cleanOutput)) {
245
+ //
246
+ // Issue #3818: and by default — a numbered agy screen keeps the generic
247
+ // reading only as `/feedback` or as a reply's plain `1. … N.` list, so a
248
+ // run with a number missing or its `>` row off the pane is no prompt either.
249
+ // The status verdict keeps #3808's narrower rule: these frames still read
250
+ // as someone waiting there, they are only not answered from here.
251
+ if ((0, dialog_1.isAntigravityUnansweredNumberedScreen)(cleanOutput)) {
238
252
  return { isPrompt: false, cleanContent: cleanOutput.trim() };
239
253
  }
240
254
  }
@@ -292,6 +306,14 @@ function detectPromptOnCleanFrame(cleanOutput, cliToolId, precomputedLines, rawF
292
306
  if (cliToolId === 'antigravity' && result.isPrompt && (0, response_checker_dialog_gate_1.isWithheldForWantOfReceipt)(receiptScope)) {
293
307
  return { isPrompt: false, cleanContent: cleanOutput.trim() };
294
308
  }
309
+ // Issue #3881 (finding 8): and with a receipt, the receipt alone does not
310
+ // vouch for a generic reading — a reply's plain numbered list is answered
311
+ // only when the screen itself shows a known menu or agy's permission rows.
312
+ // Only for the caller that answers (a receipt scope); a display keeps it.
313
+ if (cliToolId === 'antigravity' && result.isPrompt && receiptScope !== undefined
314
+ && !(0, response_checker_dialog_gate_1.isAntigravityGenericReadingOnScreen)(cleanOutput, result)) {
315
+ return { isPrompt: false, cleanContent: cleanOutput.trim() };
316
+ }
295
317
  return result;
296
318
  }
297
319
  /**
@@ -614,6 +636,24 @@ function extractCompletedTurn(ctx, output, lastCapturedLine, owns) {
614
636
  }
615
637
  return { result, isFullScreenTui, lineCountIsCursor };
616
638
  }
639
+ /**
640
+ * The episode a committed prompt observation left this wait in (Issue #3798):
641
+ * the one kept or rebound, the one the commit just opened or put in place, or
642
+ * null when the commit changed nothing.
643
+ */
644
+ function committedEpisodeId(plan, committed) {
645
+ const obs = plan.observation;
646
+ switch (committed) {
647
+ case 'kept':
648
+ case 'rebound':
649
+ return plan.episodeId;
650
+ case 'opened':
651
+ case 'replaced':
652
+ return (0, waiting_episode_state_1.getWaitingEpisodeRecord)(obs.worktreeId, obs.cliToolId, obs.instanceId)?.episodeId ?? null;
653
+ default:
654
+ return null;
655
+ }
656
+ }
617
657
  /**
618
658
  * Save a live prompt as a prompt message, and raise what follows from it: the
619
659
  * task event, the push notification and the waiting episode.
@@ -626,9 +666,11 @@ function extractCompletedTurn(ctx, output, lastCapturedLine, owns) {
626
666
  * @param promptDetection - The detection that passed the #2457 gate
627
667
  * @param result - The complete extraction this tick made
628
668
  * @param isFullScreenTui - True for opencode and copilot, which keep polling after a prompt
669
+ * @param frameTime - When the frame this prompt was read on was fetched (Issue #3798)
670
+ * @param frame - The capture the prompt was read on, for the stored reading (Issue #3881)
629
671
  * @returns What `checkForResponse` returns for this tick
630
672
  */
631
- function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
673
+ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui, frameTime, frame) {
632
674
  const { db, worktree, worktreeId, cliToolId, instanceId, resolvedInstanceId, pollerKey } = ctx;
633
675
  // Issue #3701: the question #3663 / #3684 ask, for the prompt a tick retired
634
676
  // during the capture's `await` then finds on the pane — no row, broadcast,
@@ -645,6 +687,34 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
645
687
  });
646
688
  return false;
647
689
  }
690
+ // Issue #3798 (design 規則 8): what this prompt does to the waiting episode,
691
+ // decided BEFORE the dedup below registers its hash. A frame fetched before
692
+ // the close of the very confirmation it shows — an answer and a stop landed
693
+ // during the capture — is not a new wait: nothing is saved, registered or
694
+ // pushed, and the next tick's frame decides. Planned against the state as it
695
+ // is now (`freshPrompt`), not as the tick found it. With the Auto-Yes
696
+ // poller's last answer (PR 3): another confirmation in the wait it answered
697
+ // is a new wait (R1-7), with a hold of its own rather than the spent one.
698
+ const plan = (0, waiting_episode_binding_1.planWaitingObservation)({
699
+ worktreeId,
700
+ cliToolId,
701
+ instanceId,
702
+ observer: 'response-checker',
703
+ start: ctx.observationStart,
704
+ reading: (0, waiting_screen_reading_1.promptWaitingReading)(promptDetection.promptData ?? null),
705
+ ...frameTime,
706
+ freshPrompt: true,
707
+ lastAnswer: (0, auto_yes_poller_state_1.getAutoYesLastAnswer)((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)),
708
+ });
709
+ if (plan.action === 'ignored') {
710
+ logger.info('prompt-observation-stale', {
711
+ worktreeId,
712
+ cliToolId,
713
+ instanceId: resolvedInstanceId,
714
+ because: plan.ignoredBecause,
715
+ });
716
+ return false;
717
+ }
648
718
  // Issue #565: Content hash-based duplicate prompt prevention
649
719
  const promptContent = promptDetection.rawContent || promptDetection.cleanContent;
650
720
  const normalizedForDedup = (0, prompt_dedup_1.normalizePromptForDedup)(promptContent, cliToolId);
@@ -669,6 +739,9 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
669
739
  }
670
740
  return false;
671
741
  }
742
+ // Issue #3881 (review P2-1): whether the frame's first row is the pane's —
743
+ // the capture was taken with `CACHE_MAX_CAPTURE_LINES` (`checkForResponse`).
744
+ const captureTop = (0, prompt_screen_reading_1.captureTopOf)(frame, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES, cliToolId);
672
745
  // Issue #571: Clean TUI decorations from Copilot prompt content before saving
673
746
  let promptSaveContent = promptContent;
674
747
  if (cliToolId === 'copilot') {
@@ -682,7 +755,13 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
682
755
  role: 'assistant',
683
756
  content: promptSaveContent,
684
757
  messageType: 'prompt',
685
- promptData: promptDetection.promptData,
758
+ // Issue #3881: with what the frame was read as — the kind, the live rows,
759
+ // the target's completeness — so the chat transcript and every later
760
+ // reader take it as stated instead of deciding it again from the strings.
761
+ // Review P2-1: the capture window says whether the frame's top is the
762
+ // pane's (`captureTop`, and `top-unknown` on a target that reached a cut top),
763
+ // as the Auto-Yes poller reads its own frame.
764
+ promptData: (0, prompt_screen_reading_1.promptDataForStorage)(cliToolId, frame, (0, prompt_screen_reading_1.withCaptureTopCompleteness)(promptDetection, captureTop), captureTop),
686
765
  timestamp: new Date(),
687
766
  cliToolId,
688
767
  instanceId: resolvedInstanceId,
@@ -700,19 +779,19 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
700
779
  // Fire-and-forget — push is advisory and must never block/break the poller.
701
780
  //
702
781
  // Issue #1790: the wait is now named by #1786's episode rather than by the
703
- // prompt text. The two lines below are ordered, not incidental:
704
- //
705
- // 1. the notification is raised first, while it still has the prompt's
706
- // own question to quote — it records the episode in the dedup, so
707
- // whichever path reports the wait second says nothing;
708
- // 2. `observeWaitingEdge` then opens that same episode, which is what
709
- // lets the edge listener (and #1788's WebSocket frame) agree with this
710
- // call about *which* wait this is instead of raising a second one.
711
- //
712
- // Both use one timestamp so the episode the notification claims and the
713
- // episode the store opens are the same number.
714
- const promptObservedAt = Date.now();
715
- const promptWaitingSince = (0, waiting_episode_state_1.getWaitingEpisode)(worktreeId, cliToolId, instanceId)?.since ?? promptObservedAt;
782
+ // prompt text. Issue #3798: and by the episode's id, which the store gives
783
+ // a wait only when it opens or replaces one. So the observation is committed
784
+ // first and the notification raised with the id the commit settled on —
785
+ // the kept or rebound wait's, or the one just opened — inside
786
+ // `fanOutAfterCommit`, which holds the edge listener's own gate back until
787
+ // this fan-out is done: the notification that quotes the prompt's question
788
+ // still records the episode in the dedup first, and the listener (and
789
+ // #1788's WebSocket frame) agree with it about *which* wait this is — the
790
+ // same id to the gate's hold and suppression record, the dedup and the
791
+ // card's order. A commit that changed nothing (the episode moved since the
792
+ // plan) names no id, and the plan's `since` decides as before.
793
+ // No `await` from the plan to the commit.
794
+ const promptWaitingSince = plan.since ?? plan.at;
716
795
  // Issue #1999: Auto-Yes is a declaration that this session's prompts are
717
796
  // answered without a human, so notifying for one is telling the reader the
718
797
  // opposite of the truth. Only the notification is gated — the episode
@@ -720,30 +799,27 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
720
799
  // reminder all see the wait exactly as they did before. The gate runs
721
800
  // before the call rather than inside it because `shouldSendWaitingPush`
722
801
  // records the episode the moment it decides to send.
723
- if (!(0, prompt_push_gate_1.isPromptPushSuppressed)({
724
- worktreeId,
725
- cliToolId,
726
- instanceId,
727
- waitingSince: promptWaitingSince,
728
- })) {
729
- void (0, push_1.notifyPushSubscribers)({
802
+ (0, waiting_push_notifier_1.fanOutAfterCommit)({ worktreeId, cliToolId, instanceId }, () => (0, waiting_episode_binding_1.commitWaitingObservation)(plan), (committed) => {
803
+ const waitingEpisodeId = committedEpisodeId(plan, committed);
804
+ if (!(0, prompt_push_gate_1.isPromptPushSuppressed)({
730
805
  worktreeId,
731
- worktreeName: worktree.name,
732
- kind: 'prompt',
733
- agentName: resolvedInstanceId,
734
- instanceId: resolvedInstanceId,
735
- waitingKind: 'prompt',
806
+ cliToolId,
807
+ instanceId,
736
808
  waitingSince: promptWaitingSince,
737
- excerpt: promptDetection.promptData?.question ?? promptSaveContent,
738
- }).catch(() => { });
739
- }
740
- (0, waiting_episode_state_1.observeWaitingEdge)({
741
- worktreeId,
742
- cliToolId,
743
- instanceId,
744
- waiting: true,
745
- kind: 'prompt',
746
- now: promptObservedAt,
809
+ waitingEpisodeId,
810
+ })) {
811
+ void (0, push_1.notifyPushSubscribers)({
812
+ worktreeId,
813
+ worktreeName: worktree.name,
814
+ kind: 'prompt',
815
+ agentName: resolvedInstanceId,
816
+ instanceId: resolvedInstanceId,
817
+ waitingKind: 'prompt',
818
+ waitingSince: promptWaitingSince,
819
+ waitingEpisodeId,
820
+ excerpt: promptDetection.promptData?.question ?? promptSaveContent,
821
+ }).catch(() => { });
822
+ }
747
823
  });
748
824
  if (!isFullScreenTui) {
749
825
  (0, response_poller_core_1.stopPolling)(worktreeId, cliToolId, instanceId);
@@ -1202,7 +1278,18 @@ async function recordCompletedResponse(ctx, turn, claudeMetadata, cleanedRespons
1202
1278
  // API, and every later prompt would be folded into that stale episode and
1203
1279
  // silently deduped. Nothing to close is a no-op, and no notification is
1204
1280
  // raised for a closing edge.
1205
- (0, waiting_episode_state_1.observeWaitingEdge)({ worktreeId, cliToolId, instanceId, waiting: false });
1281
+ //
1282
+ // Issue #3798: only the episode this tick started against — one that opened
1283
+ // or moved while the reader and the log ran is not this reply's to end.
1284
+ (0, waiting_episode_binding_1.observeWaiting)({
1285
+ worktreeId,
1286
+ cliToolId,
1287
+ instanceId,
1288
+ observer: 'response-checker',
1289
+ start: ctx.observationStart,
1290
+ reading: { kind: 'not-waiting' },
1291
+ frameCapturedAt: 0,
1292
+ });
1206
1293
  // Web Push fan-out (Issue #1125): session completed (running → idle).
1207
1294
  // Fire-and-forget — push is advisory and must never block/break the poller.
1208
1295
  void (0, push_1.notifyPushSubscribers)({
@@ -1255,6 +1342,8 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1255
1342
  instanceId,
1256
1343
  resolvedInstanceId,
1257
1344
  pollerKey,
1345
+ // Issue #3798: before the tick's first `await`.
1346
+ observationStart: (0, waiting_episode_binding_1.startWaitingObservation)(worktreeId, cliToolId, instanceId),
1258
1347
  };
1259
1348
  // Check if CLI tool session is running
1260
1349
  const running = await (0, cli_session_1.isSessionRunning)(worktreeId, cliToolId, instanceId);
@@ -1319,7 +1408,9 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1319
1408
  // Capture current output. The requested width IS the capture window, so it is
1320
1409
  // taken from the same constant extractResponse() measures saturation against
1321
1410
  // (Issue #1670) — a literal here would silently decouple the two.
1322
- const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES, instanceId);
1411
+ // Issue #3798: dated by where that frame came from — from the cache, it may
1412
+ // be older than this tick.
1413
+ const { frame: output, frameTime } = await (0, waiting_episode_binding_1.captureObservedFrame)(() => (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES, instanceId));
1323
1414
  // Issue #3705: there is no `await` from here to the transcript reader
1324
1415
  // inside the save path, so this one answer covers every write in between —
1325
1416
  // the fault notifier, the TUI accumulator, the prompt sweep, the skip
@@ -1359,19 +1450,16 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1359
1450
  if (owns)
1360
1451
  (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
1361
1452
  // Asks for itself (#3701), before the prompt dedup.
1362
- return savePromptMessage(ctx, promptDetection, result, isFullScreenTui);
1453
+ return savePromptMessage(ctx, promptDetection, result, isFullScreenTui, frameTime, output);
1363
1454
  }
1364
1455
  // Issue #3538: a finished frame without a live prompt ends the run of
1365
1456
  // duplicate prompt ticks, as an unfinished one does in `extractCompletedTurn`.
1366
1457
  if (owns)
1367
1458
  (0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
1368
1459
  // Validate response content is not empty
1369
- if (!result.response || result.response.trim() === '') {
1460
+ if ((0, response_checker_blank_response_1.isBlankExtractedResponse)(result.response)) {
1370
1461
  // Issue #3552: an empty response is not the saved reply either.
1371
- if (owns) {
1372
- (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
1373
- (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
1374
- }
1462
+ (0, response_checker_blank_response_1.recordBlankResponseSkip)(db, worktreeId, cliToolId, resolvedInstanceId, pollerKey, result.lineCount, owns);
1375
1463
  return false;
1376
1464
  }
1377
1465
  // Parse Claude-specific metadata
@@ -1380,12 +1468,9 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1380
1468
  : undefined;
1381
1469
  const cleanedResponse = cleanCompletedResponse(cliToolId, result, pollerKey, owns);
1382
1470
  // If cleaned response is empty or just "[No content]", skip saving
1383
- if (!cleanedResponse || cleanedResponse.trim() === '' || cleanedResponse === '[No content]') {
1471
+ if ((0, response_checker_blank_response_1.isBlankCleanedResponse)(cleanedResponse)) {
1384
1472
  // Issue #3552: nor is one that cleans down to nothing.
1385
- if (owns) {
1386
- (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
1387
- (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
1388
- }
1473
+ (0, response_checker_blank_response_1.recordBlankResponseSkip)(db, worktreeId, cliToolId, resolvedInstanceId, pollerKey, result.lineCount, owns);
1389
1474
  // Left as it was (Issue #3705 sets it aside as harmless): nothing sets the
1390
1475
  // in-progress id to a non-null value or reads it today.
1391
1476
  (0, db_1.clearInProgressMessageId)(db, worktreeId, cliToolId, resolvedInstanceId);
@@ -665,7 +665,7 @@ async function recaptureAfterKeys(sessionName) {
665
665
  * @throws {MultiSelectAnswerRejectedError} whenever the question was not
666
666
  * committed; `keysSent` says whether the pane was touched.
667
667
  */
668
- async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted, stillCurrent) {
668
+ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted, stillCurrent, touch) {
669
669
  const cursor = promptData.options.find((option) => option.isDefault === true);
670
670
  if (cursor === undefined) {
671
671
  throw new MultiSelectAnswerRejectedError('cursor-unknown', false, wanted);
@@ -679,7 +679,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
679
679
  ...current.filter((n) => !wanted.includes(n)),
680
680
  ].sort((a, b) => a - b);
681
681
  if (toggles.length > 0) {
682
- await sendSpecialKeysWhileCurrent(sessionName, toggles.map(String), stillCurrent);
682
+ await sendSpecialKeysWhileCurrent(sessionName, toggles.map(String), stillCurrent, touch);
683
683
  }
684
684
  const keysSent = toggles.length > 0;
685
685
  // 2. Read the screen back and refuse unless it is the same question with
@@ -712,7 +712,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
712
712
  if (cursorNow === undefined) {
713
713
  throw new MultiSelectAnswerRejectedError('cursor-unknown', keysSent, wanted);
714
714
  }
715
- await sendSpecialKeysWhileCurrent(sessionName, [...downKeys(verified.options.length - cursorNow.number + 1), 'Enter'], stillCurrent);
715
+ await sendSpecialKeysWhileCurrent(sessionName, [...downKeys(verified.options.length - cursorNow.number + 1), 'Enter'], stillCurrent, touch);
716
716
  // 4. The second stage. `Submit` opens the Review page and the answer is sent
717
717
  // from there; `Next` advances to the following question, which IS the
718
718
  // commit for this one (its tab turns `✔`).
@@ -728,7 +728,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted,
728
728
  if (review.hasUnansweredWarning) {
729
729
  throw new MultiSelectAnswerRejectedError('review-unanswered', true, wanted);
730
730
  }
731
- await sendSpecialKeysWhileCurrent(sessionName, ['Enter'], stillCurrent);
731
+ await sendSpecialKeysWhileCurrent(sessionName, ['Enter'], stillCurrent, touch);
732
732
  return;
733
733
  }
734
734
  const next = (0, dialog_1.readCommandCodeQuestionDialog)(afterConfirm);
@@ -756,6 +756,50 @@ class PromptAnswerAbortedError extends Error {
756
756
  }
757
757
  }
758
758
  exports.PromptAnswerAbortedError = PromptAnswerAbortedError;
759
+ /**
760
+ * What the tmux call that failed did (Issue #3880), when the error came from
761
+ * the transport (`TmuxSendError`, by name: test doubles of `./tmux/tmux` need
762
+ * not export the class); null for any other error.
763
+ */
764
+ function transportDeliveryOf(error) {
765
+ if (!(error instanceof Error) || error.name !== 'TmuxSendError')
766
+ return null;
767
+ const delivery = error.delivery;
768
+ return delivery === 'not-started' || delivery === 'indeterminate' ? delivery : null;
769
+ }
770
+ /**
771
+ * A failure after a key reached the pane says so (Issue #3839): `keysSent: true`
772
+ * is put on it, as on {@link PromptAnswerAbortedError}, so Auto-Yes does not
773
+ * type the answer again over what is already there. An error that already
774
+ * names `keysSent` (the refusals and the stop above) keeps its own word, and a
775
+ * failure before any key is left as it was.
776
+ *
777
+ * Issue #3880: a transport failure also gets `answerDelivery` ({@link AnswerDelivery};
778
+ * the tmux error's own `delivery` is that one call's).
779
+ * `indeterminate` — the tmux call ended without an exit status, and its key may
780
+ * be on the pane — is NOT `keysSent: true` (no key is known to be there; the
781
+ * ledger counts it `failed`, #3820) but Auto-Yes holds it all the same. A
782
+ * transport refusal before any key is `keysSent: false`: known not sent, free
783
+ * to be sent again.
784
+ */
785
+ function withKeysSent(error, touch) {
786
+ if (!(error instanceof Error))
787
+ return error;
788
+ const transport = transportDeliveryOf(error);
789
+ if (transport !== null) {
790
+ const answerDelivery = transport === 'indeterminate' ? 'indeterminate' : touch.touched ? 'delivered' : 'not-started';
791
+ Object.assign(error, { answerDelivery });
792
+ }
793
+ if ('keysSent' in error)
794
+ return error;
795
+ if (touch.touched) {
796
+ Object.assign(error, { keysSent: true });
797
+ }
798
+ else if (transport === 'not-started') {
799
+ Object.assign(error, { keysSent: false });
800
+ }
801
+ return error;
802
+ }
759
803
  /** Stop here when the caller's `stillCurrent` says no (Issue #3706). */
760
804
  function assertStillCurrent(stillCurrent, keysSent) {
761
805
  if (stillCurrent && !stillCurrent())
@@ -766,13 +810,32 @@ function assertStillCurrent(stillCurrent, keysSent) {
766
810
  * gave one (Issue #3706). Without it the call is exactly the old two-argument
767
811
  * one, so manual answers and every other caller send as before.
768
812
  */
769
- async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent) {
813
+ async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent, touch) {
770
814
  if (!stillCurrent) {
771
- await (0, tmux_1.sendSpecialKeys)(sessionName, keys);
815
+ try {
816
+ await (0, tmux_1.sendSpecialKeys)(sessionName, keys);
817
+ }
818
+ catch (error) {
819
+ // Issue #3880: without `shouldContinue` the count comes from the error.
820
+ if (touch && keysDeliveredOf(error) > 0)
821
+ touch.touched = true;
822
+ throw error;
823
+ }
824
+ if (touch && keys.length > 0)
825
+ touch.touched = true;
772
826
  return;
773
827
  }
828
+ // Issue #3839: `shouldContinue` is asked after each key but the last, so the
829
+ // times it was asked are the keys known to have reached the pane when a
830
+ // later one fails.
831
+ let delivered = 0;
774
832
  try {
775
- await (0, tmux_1.sendSpecialKeys)(sessionName, keys, { shouldContinue: stillCurrent });
833
+ await (0, tmux_1.sendSpecialKeys)(sessionName, keys, {
834
+ shouldContinue: () => {
835
+ delivered++;
836
+ return stillCurrent();
837
+ },
838
+ });
776
839
  }
777
840
  catch (error) {
778
841
  // By name rather than `instanceof`: test doubles of `./tmux/tmux` need not
@@ -780,8 +843,22 @@ async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent) {
780
843
  if (error instanceof Error && error.name === 'SpecialKeysAbortedError') {
781
844
  throw new PromptAnswerAbortedError(true);
782
845
  }
846
+ if (touch && Math.max(delivered, keysDeliveredOf(error)) > 0)
847
+ touch.touched = true;
783
848
  throw error;
784
849
  }
850
+ if (touch && keys.length > 0)
851
+ touch.touched = true;
852
+ }
853
+ /**
854
+ * The keys a failed `sendSpecialKeys` says tmux took before the one that
855
+ * failed (Issue #3880, `TmuxSendError.keysDelivered`); 0 when it says none.
856
+ */
857
+ function keysDeliveredOf(error) {
858
+ if (!(error instanceof Error) || error.name !== 'TmuxSendError')
859
+ return 0;
860
+ const count = error.keysDelivered;
861
+ return typeof count === 'number' && Number.isFinite(count) && count > 0 ? count : 0;
785
862
  }
786
863
  /**
787
864
  * Send an answer to a tmux session, using cursor-key navigation for
@@ -791,8 +868,22 @@ async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent) {
791
868
  * This function unifies the logic previously duplicated in:
792
869
  * - src/app/api/worktrees/[id]/prompt-response/route.ts (L114-187)
793
870
  * - src/lib/auto-yes-manager.ts (L340-399)
871
+ *
872
+ * A failure after a key of the answer reached the pane carries `keysSent: true`
873
+ * (Issue #3839), and a transport failure its `answerDelivery` (Issue #3880);
874
+ * see {@link withKeysSent}.
794
875
  */
795
876
  async function sendPromptAnswer(params) {
877
+ const touch = { touched: false };
878
+ try {
879
+ await sendPromptAnswerKeys(params, touch);
880
+ }
881
+ catch (error) {
882
+ throw withKeysSent(error, touch);
883
+ }
884
+ }
885
+ /** {@link sendPromptAnswer}, noting in `touch` each key that reached the pane. */
886
+ async function sendPromptAnswerKeys(params, touch) {
796
887
  const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber, stillCurrent } = params;
797
888
  // Issue #2755: Command Code's checkbox question, before every guard below.
798
889
  // Its answer is a SET (`"1,3"`), which none of them can read — `/^\d+$/` is
@@ -803,7 +894,7 @@ async function sendPromptAnswer(params) {
803
894
  // a two-stage confirm, not a digit and an Enter.
804
895
  const multiSelect = readMultiSelectRequest(params);
805
896
  if (multiSelect !== null) {
806
- await sendCommandCodeMultiSelectAnswer(sessionName, multiSelect.promptData, multiSelect.wanted, stillCurrent);
897
+ await sendCommandCodeMultiSelectAnswer(sessionName, multiSelect.promptData, multiSelect.wanted, stillCurrent, touch);
807
898
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
808
899
  return;
809
900
  }
@@ -874,7 +965,7 @@ async function sendPromptAnswer(params) {
874
965
  keys.push(...buildNavigationKeys(downToNext));
875
966
  // 4. Enter to submit
876
967
  keys.push('Enter');
877
- await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent);
968
+ await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent, touch);
878
969
  }
879
970
  else {
880
971
  // Single-select: navigate and Enter to select
@@ -892,12 +983,15 @@ async function sendPromptAnswer(params) {
892
983
  const keys = (isAskUserQuestionPicker && offset === 0)
893
984
  ? ['Down', 'Up', 'Enter']
894
985
  : [...navigationKeys, 'Enter'];
895
- await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent);
986
+ await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent, touch);
896
987
  }
897
988
  }
898
989
  else {
899
990
  // Standard CLI prompt: send text + Enter (y/n, Approve?, etc.)
900
991
  await (0, tmux_1.sendKeys)(sessionName, answer, false);
992
+ // Issue #3839: the text is on the pane; a failed Enter after it says so.
993
+ if (answer !== '')
994
+ touch.touched = true;
901
995
  // Issue #616: Resolve submitMode and determine whether to suppress Enter
902
996
  const resolvedSubmitMode = resolveSubmitMode(params, dialog);
903
997
  if (!shouldSuppressEnter(params, resolvedSubmitMode, dialog)) {