commandmate 0.44.1 → 0.44.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +169 -169
  3. package/.next/app-path-routes-manifest.json +35 -35
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/react-loadable-manifest.json +0 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route.js +1 -1
  10. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/versions/route.js +1 -1
  12. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update/route.js +2 -2
  15. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/login/route.js +1 -1
  18. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/capabilities/route.js +1 -1
  22. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/route.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  28. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  31. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/route.js +1 -1
  33. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  37. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  40. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  41. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  43. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  44. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/push/escalation/route.js +1 -1
  48. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/push/subscriptions/route.js +2 -2
  50. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/push/vapid/route.js +1 -1
  52. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  54. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  55. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/relays/route.js +1 -1
  57. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  58. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  61. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  63. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/clone/route.js +1 -1
  66. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/restore/route.js +1 -1
  70. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/route.js +1 -1
  73. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/scan/route.js +1 -1
  76. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/sync/route.js +1 -1
  79. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  83. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  84. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  87. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/skills/[id]/route.js +1 -1
  89. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/route.js +1 -1
  94. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/[id]/route.js +2 -2
  99. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/templates/route.js +2 -2
  101. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -2
  192. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -2
  195. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  208. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +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 +2 -2
  211. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  214. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  240. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/route.js +1 -1
  264. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  267. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  269. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  270. package/.next/server/app/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  273. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/sessions/page.js +1 -1
  275. package/.next/server/app/sessions/page.js.nft.json +1 -1
  276. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/worktrees/[id]/page.js +11 -11
  282. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  283. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app-paths-manifest.json +35 -35
  286. package/.next/server/chunks/1191.js +2 -2
  287. package/.next/server/chunks/1210.js +1 -1
  288. package/.next/server/chunks/1559.js +2 -0
  289. package/.next/server/chunks/1789.js +1 -0
  290. package/.next/server/chunks/2119.js +1 -1
  291. package/.next/server/chunks/2404.js +1 -1
  292. package/.next/server/chunks/2445.js +1 -1
  293. package/.next/server/chunks/2460.js +1 -0
  294. package/.next/server/chunks/2710.js +1 -1
  295. package/.next/server/chunks/2908.js +1 -0
  296. package/.next/server/chunks/2980.js +1 -1
  297. package/.next/server/chunks/3241.js +1 -1
  298. package/.next/server/chunks/3480.js +1 -1
  299. package/.next/server/chunks/3718.js +1 -1
  300. package/.next/server/chunks/4207.js +2 -2
  301. package/.next/server/chunks/450.js +1 -1
  302. package/.next/server/chunks/4672.js +5 -0
  303. package/.next/server/chunks/{9353.js → 4718.js} +2 -2
  304. package/.next/server/chunks/4837.js +14 -0
  305. package/.next/server/chunks/5048.js +1 -1
  306. package/.next/server/chunks/5209.js +1 -0
  307. package/.next/server/chunks/5595.js +1 -0
  308. package/.next/server/chunks/5625.js +25 -0
  309. package/.next/server/chunks/5845.js +1 -0
  310. package/.next/server/chunks/611.js +1 -1
  311. package/.next/server/chunks/6130.js +1 -1
  312. package/.next/server/chunks/6401.js +1 -1
  313. package/.next/server/chunks/6781.js +1 -1
  314. package/.next/server/chunks/6793.js +3 -3
  315. package/.next/server/chunks/7491.js +2 -2
  316. package/.next/server/chunks/7905.js +1 -1
  317. package/.next/server/chunks/850.js +1 -0
  318. package/.next/server/chunks/8543.js +1 -1
  319. package/.next/server/chunks/8728.js +3 -3
  320. package/.next/server/chunks/8791.js +1 -1
  321. package/.next/server/chunks/8800.js +1 -1
  322. package/.next/server/chunks/8918.js +7 -7
  323. package/.next/server/chunks/9130.js +1 -5
  324. package/.next/server/chunks/9390.js +2 -3
  325. package/.next/server/chunks/9584.js +1 -1
  326. package/.next/server/chunks/9627.js +6 -6
  327. package/.next/server/chunks/9731.js +3 -3
  328. package/.next/server/middleware-manifest.json +5 -5
  329. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  330. package/.next/server/pages/500.html +1 -1
  331. package/.next/server/server-reference-manifest.json +1 -1
  332. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  333. package/.next/static/chunks/{2407-f1f258d4a1d92620.js → 2407-06d35bb1aa02de80.js} +1 -1
  334. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  335. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
  336. package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
  337. package/.next/static/chunks/app/{layout-da66300cc20244ed.js → layout-0d1750b833f5cc3e.js} +1 -1
  338. package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
  339. package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
  340. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  341. package/.next/static/css/057f64a65726c439.css +1 -0
  342. package/.next/trace +13 -13
  343. package/dist/cli/commands/ask.d.ts.map +1 -1
  344. package/dist/cli/commands/ask.js +120 -119
  345. package/dist/cli/commands/attach.d.ts +94 -0
  346. package/dist/cli/commands/attach.d.ts.map +1 -1
  347. package/dist/cli/commands/attach.js +145 -7
  348. package/dist/cli/commands/auto-yes.js +1 -1
  349. package/dist/cli/commands/capture.d.ts.map +1 -1
  350. package/dist/cli/commands/capture.js +10 -13
  351. package/dist/cli/commands/command-target.d.ts +23 -0
  352. package/dist/cli/commands/command-target.d.ts.map +1 -0
  353. package/dist/cli/commands/command-target.js +25 -0
  354. package/dist/cli/commands/instances.d.ts.map +1 -1
  355. package/dist/cli/commands/instances.js +41 -2
  356. package/dist/cli/commands/message-dispatch.d.ts +36 -0
  357. package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
  358. package/dist/cli/commands/message-dispatch.js +63 -0
  359. package/dist/cli/commands/reply.d.ts.map +1 -1
  360. package/dist/cli/commands/reply.js +2 -5
  361. package/dist/cli/commands/respond.d.ts.map +1 -1
  362. package/dist/cli/commands/respond.js +3 -6
  363. package/dist/cli/commands/send.d.ts.map +1 -1
  364. package/dist/cli/commands/send.js +149 -146
  365. package/dist/cli/commands/wait.d.ts.map +1 -1
  366. package/dist/cli/commands/wait.js +608 -416
  367. package/dist/cli/types/api-responses.d.ts +174 -27
  368. package/dist/cli/types/api-responses.d.ts.map +1 -1
  369. package/dist/cli/types/api-responses.js +4 -2
  370. package/dist/cli/utils/api-client.d.ts +25 -5
  371. package/dist/cli/utils/api-client.d.ts.map +1 -1
  372. package/dist/cli/utils/api-client.js +87 -55
  373. package/dist/cli/utils/server-url.d.ts +1 -0
  374. package/dist/cli/utils/server-url.d.ts.map +1 -1
  375. package/dist/cli/utils/server-url.js +7 -0
  376. package/dist/config/uat-isolation.d.ts +140 -0
  377. package/dist/config/uat-isolation.d.ts.map +1 -0
  378. package/dist/config/uat-isolation.js +246 -0
  379. package/dist/lib/global-state.d.ts +12 -0
  380. package/dist/lib/global-state.d.ts.map +1 -0
  381. package/dist/lib/global-state.js +16 -0
  382. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
  383. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
  384. package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
  385. package/dist/lib/session/prompt-view.d.ts +228 -0
  386. package/dist/lib/session/prompt-view.d.ts.map +1 -0
  387. package/dist/lib/session/prompt-view.js +290 -0
  388. package/dist/lib/session/status-evidence-type.d.ts +16 -0
  389. package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
  390. package/dist/lib/session/status-evidence-type.js +2 -0
  391. package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
  392. package/dist/lib/tmux/legacy-session-alias.js +2 -1
  393. package/dist/server/locales/en/worktree.json +3 -1
  394. package/dist/server/locales/ja/worktree.json +3 -1
  395. package/dist/server/server.js +5 -3
  396. package/dist/server/src/cli/types/api-responses.js +4 -2
  397. package/dist/server/src/config/cli-tool-timing-config.js +1 -6
  398. package/dist/server/src/config/uat-isolation.js +246 -0
  399. package/dist/server/src/lib/assistant-response-saver.js +62 -3
  400. package/dist/server/src/lib/auto-yes-lifecycle.js +139 -0
  401. package/dist/server/src/lib/auto-yes-poller.js +465 -160
  402. package/dist/server/src/lib/auto-yes-state.js +2 -2
  403. package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
  404. package/dist/server/src/lib/cli-tools/base.js +151 -0
  405. package/dist/server/src/lib/cli-tools/codex.js +44 -80
  406. package/dist/server/src/lib/cli-tools/command-code.js +24 -56
  407. package/dist/server/src/lib/cli-tools/copilot.js +25 -67
  408. package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
  409. package/dist/server/src/lib/cli-tools/gemini.js +23 -73
  410. package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
  411. package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
  412. package/dist/server/src/lib/cli-tools/opencode.js +21 -85
  413. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
  414. package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
  415. package/dist/server/src/lib/detection/cli-patterns.js +374 -3047
  416. package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
  417. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
  418. package/dist/server/src/lib/detection/prompt-detector.js +2 -35
  419. package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
  420. package/dist/server/src/lib/detection/selection-shape.js +32 -520
  421. package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
  422. package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
  423. package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
  424. package/dist/server/src/lib/detection/status-detector.js +1 -1
  425. package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
  426. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
  427. package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
  428. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
  429. package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
  430. package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
  431. package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
  432. package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
  433. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
  434. package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
  435. package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
  436. package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
  437. package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
  438. package/dist/server/src/lib/detection/tools/command-code/detect.js +19 -50
  439. package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
  440. package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
  441. package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
  442. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
  443. package/dist/server/src/lib/detection/tools/context-above.js +20 -0
  444. package/dist/server/src/lib/detection/tools/copilot/detect.js +13 -35
  445. package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
  446. package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
  447. package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
  448. package/dist/server/src/lib/detection/tools/frame.js +36 -2
  449. package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
  450. package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
  451. package/dist/server/src/lib/detection/tools/live-region.js +204 -0
  452. package/dist/server/src/lib/detection/tools/opencode/detect.js +11 -49
  453. package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
  454. package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
  455. package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
  456. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +10 -42
  457. package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
  458. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
  459. package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
  460. package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
  461. package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
  462. package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
  463. package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
  464. package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
  465. package/dist/server/src/lib/global-state.js +16 -0
  466. package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
  467. package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
  468. package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
  469. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
  470. package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
  471. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
  472. package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
  473. package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
  474. package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
  475. package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
  476. package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
  477. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
  478. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
  479. package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
  480. package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
  481. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
  482. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
  483. package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
  484. package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
  485. package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
  486. package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
  487. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
  488. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
  489. package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
  490. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
  491. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
  492. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
  493. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
  494. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
  495. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
  496. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
  497. package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
  498. package/dist/server/src/lib/hooks/sources/registry.js +3 -2
  499. package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
  500. package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
  501. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
  502. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
  503. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
  504. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
  505. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
  506. package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
  507. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
  508. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
  509. package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
  510. package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
  511. package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
  512. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
  513. package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
  514. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
  515. package/dist/server/src/lib/polling/response-checker.js +666 -1162
  516. package/dist/server/src/lib/polling/response-dedup.js +3 -4
  517. package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
  518. package/dist/server/src/lib/polling/response-poller-core.js +54 -20
  519. package/dist/server/src/lib/polling/startup-screen.js +142 -0
  520. package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
  521. package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
  522. package/dist/server/src/lib/prompt-answer-sender.js +6 -5
  523. package/dist/server/src/lib/push/failure-episode-state.js +2 -2
  524. package/dist/server/src/lib/push/notification-dedup.js +3 -4
  525. package/dist/server/src/lib/push/prompt-card-state.js +2 -2
  526. package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
  527. package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
  528. package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -2
  529. package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
  530. package/dist/server/src/lib/relay/relay-delivery.js +6 -2
  531. package/dist/server/src/lib/relay/relay-readiness.js +38 -1
  532. package/dist/server/src/lib/relay/relay-triggers.js +9 -0
  533. package/dist/server/src/lib/resource-cleanup.js +6 -4
  534. package/dist/server/src/lib/response-cleaner.js +24 -1
  535. package/dist/server/src/lib/response-extractor.js +16 -0
  536. package/dist/server/src/lib/schedule-manager.js +8 -10
  537. package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
  538. package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
  539. package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
  540. package/dist/server/src/lib/session/agent-event-model.js +562 -0
  541. package/dist/server/src/lib/session/agent-event-record.js +10 -0
  542. package/dist/server/src/lib/session/agent-event-state.js +106 -1854
  543. package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
  544. package/dist/server/src/lib/session/agent-event-turn.js +811 -0
  545. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
  546. package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
  547. package/dist/server/src/lib/session/claude-executor.js +45 -5
  548. package/dist/server/src/lib/session/claude-session.js +21 -65
  549. package/dist/server/src/lib/session/cli-session.js +17 -0
  550. package/dist/server/src/lib/session/current-output-builder.js +454 -1103
  551. package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
  552. package/dist/server/src/lib/session/current-output-types.js +9 -0
  553. package/dist/server/src/lib/session/detection-divergence.js +55 -0
  554. package/dist/server/src/lib/session/global-session-constants.js +2 -13
  555. package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
  556. package/dist/server/src/lib/session/layer-disagreement.js +2 -2
  557. package/dist/server/src/lib/session/opencode-session-store.js +2 -1
  558. package/dist/server/src/lib/session/prompt-view.js +290 -0
  559. package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
  560. package/dist/server/src/lib/session/provisional-turn.js +3 -1
  561. package/dist/server/src/lib/session/send-user-message.js +1 -1
  562. package/dist/server/src/lib/session/session-starting-state.js +4 -6
  563. package/dist/server/src/lib/session/status-evidence-type.js +2 -0
  564. package/dist/server/src/lib/session/status-evidence.js +2 -2
  565. package/dist/server/src/lib/session/structured-status-merge.js +335 -0
  566. package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
  567. package/dist/server/src/lib/session/waiting-kind.js +3 -0
  568. package/dist/server/src/lib/session-cleanup.js +6 -8
  569. package/dist/server/src/lib/skills/install-plan.js +2 -1
  570. package/dist/server/src/lib/skills/snapshot-store.js +2 -2
  571. package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
  572. package/dist/server/src/lib/timer-manager.js +6 -8
  573. package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
  574. package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
  575. package/dist/server/src/lib/tmux/session-hooks.js +2 -1
  576. package/dist/server/src/lib/tmux/session-status-options.js +3 -3
  577. package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
  578. package/dist/server/src/lib/tmux/tmux.js +33 -59
  579. package/dist/server/src/lib/tui-accumulator.js +2 -2
  580. package/dist/server/src/lib/version-checker.js +6 -6
  581. package/dist/server/src/lib/ws-server.js +47 -11
  582. package/docs/en/user-guide/webapp-guide.md +27 -3
  583. package/package.json +1 -1
  584. package/release-notes/0.44.2.json +33 -0
  585. package/release-notes/0.44.3.json +82 -0
  586. package/scripts/hooks/cmate-agent-event.sh +18 -0
  587. package/.next/server/chunks/1068.js +0 -1
  588. package/.next/server/chunks/434.js +0 -1
  589. package/.next/server/chunks/5775.js +0 -1
  590. package/.next/server/chunks/6474.js +0 -14
  591. package/.next/server/chunks/650.js +0 -1
  592. package/.next/server/chunks/6661.js +0 -1
  593. package/.next/server/chunks/8583.js +0 -1
  594. package/.next/server/chunks/964.js +0 -1
  595. package/.next/server/chunks/967.js +0 -1
  596. package/.next/server/chunks/9882.js +0 -25
  597. package/.next/static/chunks/591-308072f285c34787.js +0 -1
  598. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
  599. package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +0 -1
  600. package/.next/static/css/38070d879efa1371.css +0 -1
  601. package/dist/server/src/lib/cli-tools/index.js +0 -41
  602. package/dist/server/src/lib/polling/global-session-poller.js +0 -140
  603. /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
  604. /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
@@ -44,6 +44,7 @@ var __importStar = (this && this.__importStar) || (function () {
44
44
  };
45
45
  })();
46
46
  Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.AUTO_YES_ENTER_FALLBACK_ANSWER = void 0;
47
48
  exports.getActivePollerCount = getActivePollerCount;
48
49
  exports.clearAllPollerStates = clearAllPollerStates;
49
50
  exports.getLastServerResponseTimestamp = getLastServerResponseTimestamp;
@@ -65,13 +66,17 @@ const antigravity_permission_receipts_1 = require("./polling/antigravity-permiss
65
66
  const auto_yes_resolver_1 = require("./polling/auto-yes-resolver");
66
67
  const auto_yes_policy_1 = require("./polling/auto-yes-policy");
67
68
  const detect_1 = require("./detection/tools/codex/detect");
69
+ const frame_1 = require("./detection/tools/frame");
68
70
  const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
69
71
  const auto_yes_dialog_gate_1 = require("./polling/auto-yes-dialog-gate");
72
+ const auto_yes_enter_fallback_1 = require("./polling/auto-yes-enter-fallback");
70
73
  const task_transition_service_1 = require("./tasks/task-transition-service");
71
74
  const db_instance_1 = require("./db/db-instance");
72
75
  const chat_db_1 = require("./db/chat-db");
73
76
  const worktree_session_ownership_1 = require("./cli-tools/worktree-session-ownership");
74
77
  const prompt_answer_sender_1 = require("./prompt-answer-sender");
78
+ const prompt_answer_semantic_1 = require("./prompt-answer-semantic");
79
+ const tmux_1 = require("./tmux/tmux");
75
80
  const manager_1 = require("./cli-tools/manager");
76
81
  const cli_patterns_1 = require("./detection/cli-patterns");
77
82
  const prompt_key_1 = require("./detection/prompt-key");
@@ -82,17 +87,16 @@ const logger_1 = require("../lib/logger");
82
87
  const logger = (0, logger_1.createLogger)('auto-yes-poller');
83
88
  const path_validator_1 = require("./security/path-validator");
84
89
  const auto_yes_state_1 = require("./auto-yes-state");
90
+ const global_state_1 = require("./global-state");
85
91
  /** In-memory storage for poller states (globalThis for hot reload persistence) */
86
- const autoYesPollerStates = globalThis.__autoYesPollerStates ??
87
- (globalThis.__autoYesPollerStates = new Map());
92
+ const autoYesPollerStates = (0, global_state_1.getOrInitGlobal)('__autoYesPollerStates', () => new Map());
88
93
  /**
89
94
  * When `antigravity-autoyes-withheld-no-hook-receipt` was last logged, per
90
95
  * compositeKey (Issue #2857). The poller re-reads a static pane every 2s, so the
91
96
  * line is limited to one per {@link WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS} per
92
97
  * instance. globalThis for the same reason as the poller states above.
93
98
  */
94
- const withheldNoReceiptLoggedAt = globalThis.__autoYesWithheldNoReceiptLoggedAt ??
95
- (globalThis.__autoYesWithheldNoReceiptLoggedAt = new Map());
99
+ const withheldNoReceiptLoggedAt = (0, global_state_1.getOrInitGlobal)('__autoYesWithheldNoReceiptLoggedAt', () => new Map());
96
100
  /** Least gap between two `antigravity-autoyes-withheld-no-hook-receipt` lines for one instance. */
97
101
  const WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS = 60_000;
98
102
  // =============================================================================
@@ -160,6 +164,8 @@ function updateLastServerResponseTimestamp(compositeKey, timestamp) {
160
164
  }
161
165
  /**
162
166
  * Reset error count for a poller and restore the default polling interval.
167
+ * Called after every poll that ran to the end without an error (Issue #3329)
168
+ * and after an answer is sent.
163
169
  *
164
170
  * @param compositeKey - Composite key
165
171
  */
@@ -182,6 +188,14 @@ function incrementErrorCount(compositeKey) {
182
188
  pollerState.consecutiveErrors++;
183
189
  pollerState.currentInterval = (0, auto_yes_state_1.calculateBackoffInterval)(pollerState.consecutiveErrors);
184
190
  // Issue #499 Item 5: Auto-stop after consecutive error threshold.
191
+ //
192
+ // Issue #3184: this is the `consecutive-errors` row of AUTO_YES_LIFECYCLE
193
+ // (`lib/auto-yes-lifecycle`) — disable with `consecutive_errors`, stop the
194
+ // poller — applied here directly rather than through `releaseAutoYes`:
195
+ // that module reaches this one through the auto-yes-manager barrel, so
196
+ // importing it back would be a cycle. `auto-yes-lifecycle-3184.test.ts`
197
+ // holds this call and the table row equal. A missing session never gets
198
+ // here (Issue #3329): `pollAutoYes` waits for it instead of counting it.
185
199
  if (pollerState.consecutiveErrors >= auto_yes_config_1.AUTO_STOP_ERROR_THRESHOLD) {
186
200
  const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
187
201
  const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
@@ -381,6 +395,366 @@ function logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, rea
381
395
  hint: 'hook の受信記録が直近に無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認',
382
396
  });
383
397
  }
398
+ /**
399
+ * Issue #3214: the form the four suppression exits of `detectAndRespondToPrompt`
400
+ * share. Records why Auto-Yes left the prompt alone (`recordPolicySuppression`,
401
+ * not throttled), then prints the WARN once per frame (`warnOncePerFrame`).
402
+ *
403
+ * @param suppression - Handed to `recordPolicySuppression` as is
404
+ * @param warnFrameKey - Handed to `warnOncePerFrame` as is: the prompt's
405
+ * `frameKey` plus the exit's own detail
406
+ * @param event - The WARN's log name
407
+ * @param detail - The WARN's fields after `worktreeId`, `cliToolId` and `instanceId`
408
+ */
409
+ function suppressAndWarnOnce(prompt, suppression, warnFrameKey, event, detail) {
410
+ const { worktreeId, cliToolId, instanceId } = prompt;
411
+ (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, suppression);
412
+ warnOncePerFrame(prompt.pollerState, warnFrameKey, event, {
413
+ worktreeId,
414
+ cliToolId,
415
+ instanceId,
416
+ ...detail,
417
+ });
418
+ }
419
+ /**
420
+ * Issue #3214: steps 3, 3.2 and 3.5 of `detectAndRespondToPrompt` -- the frames
421
+ * that read as a prompt and are still not Auto-Yes's to answer, judged in the
422
+ * order they always were. "The detection above" in the comments below is that
423
+ * function's step 1.
424
+ *
425
+ * Issue #3397: step 3.5 no longer records its refusal here. It hands the gate's
426
+ * verdict back so `tryEnterFallback` can look at the frame first, and records
427
+ * through {@link suppressUnclassifiedFrame} when that sends nothing. Steps 3 and
428
+ * 3.2 still win: an Enter never reaches codex's launch dialogs or its `/model`
429
+ * picker.
430
+ *
431
+ * @param frame - The tick's one normalised frame (Issue #3183)
432
+ */
433
+ function suppressIfNotOursToAnswer(prompt, frame) {
434
+ const { cliToolId, promptData, frameKey } = prompt;
435
+ // 3. Issue #1829: codex's own launch dialogs are CodexTool.waitForReady()'s
436
+ // to answer, not the poller's. Every one of them defaults to option 1, and
437
+ // the base rules answer the default:
438
+ //
439
+ // "Hooks need review" -> 1. Review hooks (undoes Issue #1760; the pane
440
+ // then sits two screens deep in a review UI that
441
+ // only `t`/`esc` leave, reported as `running`)
442
+ // "Update available" -> 1. Update now (undoes Issue #890; runs
443
+ // `npm install -g @openai/codex`, killing codex)
444
+ // "Do you trust …" -> 1. Yes, continue
445
+ //
446
+ // waitForReady answers the same screens deliberately and differently ('3',
447
+ // '2', '1' — each without a trailing Enter), but only during startSession,
448
+ // while this poller runs on its own 2s phase for the life of the session.
449
+ // Whichever sees the dialog first decides, so the fix is to leave them all
450
+ // to the tool. Auto-answer layer only: the detection above still reports the
451
+ // prompt, so the human keeps seeing the screen and the response poller
452
+ // still notifies them about it.
453
+ const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
454
+ if (launchDialog) {
455
+ // Recorded through the #1684 channel so `capture --json` and `cmate wait`
456
+ // can name the reason instead of showing a worker that went quiet.
457
+ suppressAndWarnOnce(prompt, { reason: 'agent-launch-dialog', mode: null, promptType: promptData.type }, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', { dialog: launchDialog, promptType: promptData.type });
458
+ return { kind: 'left-alone' };
459
+ }
460
+ // 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
461
+ // answer. A digit there is an immediate decision, so the base rules'
462
+ // default would choose the model and effort for the operator. Judged by the
463
+ // picker's own footer, not by `kind: picker`, which the hooks screens share.
464
+ // The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
465
+ // (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
466
+ // recognised the frame and deliberately declined it.
467
+ if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
468
+ suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', { promptType: promptData.type });
469
+ return { kind: 'left-alone' };
470
+ }
471
+ // 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
472
+ // not enough to send an answer. The detection above judges the ROWS, and the
473
+ // rows of an agent's own reply can be indistinguishable from a dialog's --
474
+ // opencode 1.18 answering "list three options and ask which one" is the
475
+ // reported case (#1896), and the `1` this poller sent in reply was not
476
+ // answering anything, it was SENT AS A USER UTTERANCE. What separates the two
477
+ // is position and chrome, which only the tool's own module knows, so the
478
+ // decision is delegated to `detectDialog` (the seam #1927 declared).
479
+ //
480
+ // Per tool, and only for tools whose dialogs were measured from their own
481
+ // live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
482
+ // reaches `allowed: true` without being judged, which is the pre-#1928
483
+ // behaviour and the right one where nobody has measured anything.
484
+ //
485
+ // Recorded through the #1684 channel with the reason code #1924 landed for
486
+ // exactly this position, so `capture --json` and `cmate wait` can name the
487
+ // gap instead of showing a worker that silently went quiet.
488
+ const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptData.type, frame);
489
+ if (!dialogGate.allowed) {
490
+ return { kind: 'dialog-gate-refused', dialogGate };
491
+ }
492
+ return { kind: 'ours' };
493
+ }
494
+ /**
495
+ * Step 3.5's record: the tool's dialog detector did not vouch for the frame and
496
+ * nothing was sent (Issue #1928). Split out of `suppressIfNotOursToAnswer` by
497
+ * Issue #3397, unchanged, so it runs after `tryEnterFallback` declined.
498
+ */
499
+ function suppressUnclassifiedFrame(prompt, dialogGate) {
500
+ const { promptData, frameKey } = prompt;
501
+ suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
502
+ promptType: promptData.type,
503
+ dialogKind: dialogGate.dialog?.kind ?? null,
504
+ answerMode: dialogGate.dialog?.answerMode ?? null,
505
+ gateMode: dialogGate.mode,
506
+ });
507
+ }
508
+ /**
509
+ * The audit row's `answer` for the Enter (Issue #3397): not a digit, so the
510
+ * History reads as "Auto-Yes pressed Enter" rather than as a chosen option.
511
+ */
512
+ exports.AUTO_YES_ENTER_FALLBACK_ANSWER = '[Enter]';
513
+ /**
514
+ * Issue #3397: is the fresh capture still the screen the Enter was decided for?
515
+ * Re-reads it the way one tick does — prompt reading, the same `promptFrameKey`,
516
+ * codex's launch dialogs and `/model` picker, the dialog gate refusing with no
517
+ * dialog vouched for, and `judgeEnterFallback` (input box off screen, tool
518
+ * alive, not thinking). The policy and the checkbox rule read `promptData`,
519
+ * which the equal `promptFrameKey` already pins (type, question, options).
520
+ */
521
+ function isStillEnterFallbackScreen(prompt, fresh) {
522
+ const { worktreeId, cliToolId, instanceId, frameKey } = prompt;
523
+ const clean = (0, cli_patterns_1.stripBoxDrawing)((0, cli_patterns_1.stripAnsi)(fresh));
524
+ const frame = (0, frame_1.normalizeFrame)(fresh, cliToolId);
525
+ const detection = (0, response_checker_1.detectPromptOnCleanFrame)(clean, cliToolId, clean.split('\n'), fresh, { worktreeId, instanceId }, frame);
526
+ if (!detection.isPrompt || !detection.promptData)
527
+ return false;
528
+ if (promptFrameKey(detection.promptData) !== frameKey)
529
+ return false;
530
+ if (cliToolId === 'codex' && ((0, cli_patterns_1.getCodexLifecycleDialog)(frame) || (0, detect_1.isCodexModelPickerFrame)(frame))) {
531
+ return false;
532
+ }
533
+ const gate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, detection.promptData.type, frame);
534
+ if (gate.allowed || gate.dialog !== null)
535
+ return false;
536
+ return (0, auto_yes_enter_fallback_1.judgeEnterFallback)(cliToolId, fresh).eligible;
537
+ }
538
+ /**
539
+ * Issue #3397: a frame the dialog gate refused may still be a choice screen
540
+ * CommandMate cannot read — the one the prompt window offers direct input for.
541
+ * Send ONE Enter there (confirm whatever is selected), under every condition
542
+ * `judgeEnterFallback` and this function check; otherwise record the refusal as
543
+ * step 3.5 always did.
544
+ *
545
+ * Order, each one able to stop the Enter:
546
+ * 1. `judgeEnterFallback` (rollout table, refusal, composer off screen, tool
547
+ * alive, not thinking) — and the gate must not have vouched for a dialog it
548
+ * refused to type into (opencode's `keys` strip, #1893);
549
+ * 2. the screen already had its Enter: record `no-effect`, send nothing;
550
+ * 3. the contract policy, exactly as step 4 applies it (mode, allow-listed
551
+ * types, deny patterns over the question, options and `approvalTarget`);
552
+ * a prompt the base rules would not answer (multi-select, typed text) gets
553
+ * nothing either;
554
+ * 4. the screen must have been eligible on the previous tick as well;
555
+ * 5. the session must be this server's (#2865);
556
+ * 6. a capture taken now, past the capture cache, must still be that screen
557
+ * ({@link isStillEnterFallbackScreen}).
558
+ *
559
+ * @returns true when the Enter was sent; the caller returns `responded`
560
+ */
561
+ async function tryEnterFallback(prompt, promptDetection, dialogGate, rawOutput) {
562
+ const { worktreeId, cliToolId, instanceId, pollerState, promptData, frameKey } = prompt;
563
+ const judgement = dialogGate.dialog === null ? (0, auto_yes_enter_fallback_1.judgeEnterFallback)(cliToolId, rawOutput) : null;
564
+ if (judgement === null || !judgement.eligible) {
565
+ pollerState.enterFallbackCandidateKey = null;
566
+ suppressUnclassifiedFrame(prompt, dialogGate);
567
+ return false;
568
+ }
569
+ const screenKey = (0, auto_yes_enter_fallback_1.enterFallbackScreenKey)(promptData);
570
+ // 2. The Enter did not move the screen on. Another one would be a guess.
571
+ if (pollerState.enterFallbackSentKey === frameKey) {
572
+ pollerState.enterFallbackCandidateKey = null;
573
+ (0, auto_yes_enter_fallback_1.recordEnterFallbackNoEffect)(worktreeId, cliToolId, instanceId, screenKey);
574
+ suppressUnclassifiedFrame(prompt, dialogGate);
575
+ warnOncePerFrame(pollerState, `${frameKey}\u0000enter-fallback-no-effect`, 'poller:auto-yes-enter-fallback-no-effect', {
576
+ worktreeId,
577
+ cliToolId,
578
+ instanceId,
579
+ promptType: promptData.type,
580
+ refusalReason: judgement.refusalReason,
581
+ });
582
+ return false;
583
+ }
584
+ // 3. The contract policy, as step 4 reads it.
585
+ const policy = (0, auto_yes_policy_1.getSessionAutoYesPolicy)(worktreeId, cliToolId, instanceId);
586
+ const resolution = (0, auto_yes_resolver_1.resolveAutoAnswerWithPolicy)(promptData, policy);
587
+ if (resolution.suppressedBy) {
588
+ pollerState.enterFallbackCandidateKey = null;
589
+ suppressAndWarnOnce(prompt, {
590
+ reason: resolution.suppressedBy,
591
+ mode: policy?.mode ?? null,
592
+ promptType: promptData.type,
593
+ pattern: resolution.pattern,
594
+ }, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
595
+ reason: resolution.suppressedBy,
596
+ mode: policy?.mode ?? null,
597
+ pattern: resolution.pattern,
598
+ promptType: promptData.type,
599
+ enterFallback: true,
600
+ });
601
+ return false;
602
+ }
603
+ // A checkbox list is out of scope whatever the parser's flag says: the
604
+ // labels' boxes (`[ ]` / `[x]` / `[X]` / `[✔]`, the one reading in
605
+ // `prompt-answer-semantic` the sender shares) count too, so an Enter never
606
+ // submits a half-ticked list (Issue #3397; the base rules' #2755 reading
607
+ // covers `multiSelect` only).
608
+ if (resolution.answer === null ||
609
+ (promptData.type === 'multiple_choice' && (0, prompt_answer_semantic_1.isMultiSelectPrompt)(promptData))) {
610
+ pollerState.enterFallbackCandidateKey = null;
611
+ suppressUnclassifiedFrame(prompt, dialogGate);
612
+ return false;
613
+ }
614
+ // 4. Seen once: wait for the next tick to see the same screen again.
615
+ // Nothing is recorded as withheld here: Auto-Yes is about to answer, and a
616
+ // fresh `lastSuppression` would make `cmate wait` report the prompt to a
617
+ // human at once instead of holding for Auto-Yes (#2463).
618
+ if (pollerState.enterFallbackCandidateKey !== frameKey) {
619
+ pollerState.enterFallbackCandidateKey = frameKey;
620
+ logger.debug('poller:auto-yes-enter-fallback-candidate', {
621
+ worktreeId,
622
+ cliToolId,
623
+ instanceId,
624
+ promptType: promptData.type,
625
+ });
626
+ return false;
627
+ }
628
+ // 5. Never another server's session (Issue #2865).
629
+ const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
630
+ const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName);
631
+ if (ownership === null || ownership.verdict === 'foreign') {
632
+ warnOncePerFrame(pollerState, `${frameKey}\u0000${sessionName}\u0000${ownership ? 'foreign' : 'worktree_not_found'}`, 'poller:auto-yes-skipped-foreign-session', {
633
+ worktreeId,
634
+ cliToolId,
635
+ instanceId,
636
+ sessionName,
637
+ sessionPath: ownership?.sessionPath ?? null,
638
+ reason: ownership ? 'foreign' : 'worktree_not_found',
639
+ enterFallback: true,
640
+ });
641
+ return false;
642
+ }
643
+ // 6. The last look before the key, at a capture taken NOW. The two ticks of
644
+ // step 4 read through the capture cache, whose TTL is longer than the poll
645
+ // interval, so "seen twice" can be one stale frame read twice: a redraw caught
646
+ // with its input box missing (#2457's repaint) while the real pane already
647
+ // has the box back. Everything that decided the Enter is judged again on the
648
+ // fresh frame; any difference sends nothing, and the next tick starts over.
649
+ const fresh = await (0, cli_session_1.captureSessionOutputFresh)(worktreeId, cliToolId, (rawOutput ?? '').split('\n').length, instanceId);
650
+ if (!isStillEnterFallbackScreen(prompt, fresh)) {
651
+ pollerState.enterFallbackCandidateKey = null;
652
+ logger.debug('poller:auto-yes-enter-fallback-fresh-frame-differs', {
653
+ worktreeId,
654
+ cliToolId,
655
+ instanceId,
656
+ promptType: promptData.type,
657
+ });
658
+ return false;
659
+ }
660
+ try {
661
+ await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
662
+ }
663
+ finally {
664
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
665
+ }
666
+ pollerState.enterFallbackSentKey = frameKey;
667
+ pollerState.enterFallbackCandidateKey = null;
668
+ (0, auto_yes_enter_fallback_1.recordEnterFallbackSent)(worktreeId, cliToolId, instanceId, {
669
+ promptType: promptData.type,
670
+ refusalReason: judgement.refusalReason,
671
+ screenKey,
672
+ });
673
+ logger.info('poller:auto-yes-enter-fallback-sent', {
674
+ worktreeId,
675
+ cliToolId,
676
+ instanceId,
677
+ promptType: promptData.type,
678
+ refusalReason: judgement.refusalReason,
679
+ composerState: judgement.composerState,
680
+ });
681
+ await finishAnsweredPrompt(prompt, promptDetection, exports.AUTO_YES_ENTER_FALLBACK_ANSWER);
682
+ return true;
683
+ }
684
+ /**
685
+ * Issue #3214: steps 6 and 7 of `detectAndRespondToPrompt` and everything after
686
+ * them -- what is done once the answer has reached tmux, in the order it always
687
+ * ran. Awaited inside that function's `try`, so a throw here still ends the
688
+ * tick as `error`.
689
+ *
690
+ * @param promptDetection - The detection `prompt.promptData` was read from; its
691
+ * content becomes the audit row's
692
+ * @param answer - The answer that was sent
693
+ */
694
+ async function finishAnsweredPrompt(prompt, promptDetection, answer) {
695
+ const { worktreeId, cliToolId, instanceId, compositeKey, pollerState, promptData, promptKey } = prompt;
696
+ // 6. Update timestamp and reset error count
697
+ updateLastServerResponseTimestamp(compositeKey, Date.now());
698
+ resetErrorCount(compositeKey);
699
+ // 7. Record answered prompt key and timestamp
700
+ pollerState.lastAnsweredPromptKey = promptKey;
701
+ pollerState.lastAnsweredAt = Date.now();
702
+ pollerState.lastSkipWarnKey = null;
703
+ logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
704
+ // Issue #1548: the prompt was answered without a human. Raised only after
705
+ // the keys actually reached tmux, so a send that threw is not logged as an
706
+ // answer. No-ops when this instance is not running a contract.
707
+ (0, task_transition_service_1.applyEventToActiveTask)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId,
708
+ // Undefined means the primary instance, which the task lookup identifies
709
+ // by the tool id itself (see getActiveTaskForInstance).
710
+ instanceId ?? cliToolId, 'prompt_answered_auto', { promptType: promptData.type });
711
+ // Issue #1685: persist question/options/answer to chat history so the audit
712
+ // trail survives even when the answer landed inside the response poller's
713
+ // interval and the prompt was never saved as a pending message. Must never
714
+ // fail the answer that already reached tmux.
715
+ let auditRecord = null;
716
+ try {
717
+ auditRecord = (0, chat_db_1.recordAnsweredPrompt)((0, db_instance_1.getDbInstance)(), {
718
+ worktreeId,
719
+ cliToolId,
720
+ instanceId: instanceId ?? cliToolId,
721
+ promptData,
722
+ answer,
723
+ answeredBy: 'auto',
724
+ content: promptDetection.rawContent || promptDetection.cleanContent,
725
+ });
726
+ }
727
+ catch (recordError) {
728
+ logger.warn('poller:prompt-audit-record-failed', {
729
+ worktreeId,
730
+ cliToolId,
731
+ instanceId,
732
+ error: (0, errors_1.getErrorMessage)(recordError),
733
+ });
734
+ }
735
+ if (auditRecord) {
736
+ const record = auditRecord;
737
+ // Fire-and-forget on purpose: the WS push is advisory, and awaiting a
738
+ // cold ws-server module load inside the poll path would make its
739
+ // completion timing nondeterministic for a side effect it doesn't
740
+ // depend on (the audit row is already committed above).
741
+ void Promise.resolve().then(() => __importStar(require('../lib/ws-server'))).then(({ broadcastMessage }) => {
742
+ broadcastMessage(record.created ? 'message' : 'message_updated', {
743
+ worktreeId,
744
+ message: record.message,
745
+ });
746
+ })
747
+ .catch(() => { });
748
+ }
749
+ // Dynamic imports avoid a module cycle through terminal-broadcast ->
750
+ // current-output-builder -> auto-yes-manager -> this poller.
751
+ const [{ startPolling: startResponsePolling }, { broadcastTerminalSnapshotAfterInteraction }] = await Promise.all([
752
+ Promise.resolve().then(() => __importStar(require('../lib/polling/response-poller'))),
753
+ Promise.resolve().then(() => __importStar(require('../lib/realtime/terminal-broadcast'))),
754
+ ]);
755
+ startResponsePolling(worktreeId, cliToolId, instanceId);
756
+ void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
757
+ }
384
758
  /**
385
759
  * Detect prompt in terminal output, resolve auto-answer, and send response.
386
760
  *
@@ -438,12 +812,28 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
438
812
  // machine whose hook does not reach us. The price is that Auto-Yes leaves
439
813
  // such a machine's dialogs alone, which is why `logIfWithheldForWantOfReceipt`
440
814
  // says so.
815
+ // Issue #3397: a session begun since the last tick (a relaunch the poller
816
+ // outlived) starts with no screen that had its Enter.
817
+ const epoch = (0, auto_yes_enter_fallback_1.getEnterFallbackSessionEpoch)(compositeKey);
818
+ if ((pollerState.enterFallbackEpoch ?? 0) !== epoch) {
819
+ pollerState.enterFallbackSentKey = null;
820
+ pollerState.enterFallbackCandidateKey = null;
821
+ pollerState.enterFallbackEpoch = epoch;
822
+ }
441
823
  const receiptScope = { worktreeId, instanceId };
442
- const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope);
824
+ // Issue #3183: the ONE frame every judgement below reads — normalised once,
825
+ // from the capture as captured (the input-box markers are rule rows the
826
+ // cleaned spelling has blanked), and handed as the same object to the
827
+ // prompt reading, the codex launch guards and the dialog gate. That is what
828
+ // makes "the status chain and Auto-Yes read the same live region" a fact
829
+ // rather than a hope: there is no second normalisation to disagree with.
830
+ const frame = (0, frame_1.normalizeFrame)(rawOutput ?? cleanOutput, cliToolId);
831
+ const promptDetection = (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput, receiptScope, frame);
443
832
  if (!promptDetection.isPrompt || !promptDetection.promptData) {
444
833
  pollerState.lastAnsweredPromptKey = null;
445
834
  pollerState.lastAnsweredAt = null;
446
835
  pollerState.lastSkipWarnKey = null;
836
+ pollerState.enterFallbackCandidateKey = null;
447
837
  if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
448
838
  logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
449
839
  }
@@ -455,97 +845,31 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
455
845
  if (isDuplicatePrompt(pollerState, promptKey)) {
456
846
  return 'duplicate';
457
847
  }
458
- // 3. Issue #1829: codex's own launch dialogs are CodexTool.waitForReady()'s
459
- // to answer, not the poller's. Every one of them defaults to option 1, and
460
- // the base rules answer the default:
461
- //
462
- // "Hooks need review" -> 1. Review hooks (undoes Issue #1760; the pane
463
- // then sits two screens deep in a review UI that
464
- // only `t`/`esc` leave, reported as `running`)
465
- // "Update available" -> 1. Update now (undoes Issue #890; runs
466
- // `npm install -g @openai/codex`, killing codex)
467
- // "Do you trust …" -> 1. Yes, continue
468
- //
469
- // waitForReady answers the same screens deliberately and differently ('3',
470
- // '2', '1' — each without a trailing Enter), but only during startSession,
471
- // while this poller runs on its own 2s phase for the life of the session.
472
- // Whichever sees the dialog first decides, so the fix is to leave them all
473
- // to the tool. Auto-answer layer only: the detection above still reports the
474
- // prompt, so the human keeps seeing the screen and the response poller
475
- // still notifies them about it.
476
- const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(cleanOutput) : null;
477
- if (launchDialog) {
478
- // Recorded through the #1684 channel so `capture --json` and `cmate wait`
479
- // can name the reason instead of showing a worker that went quiet.
480
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
481
- reason: 'agent-launch-dialog',
482
- mode: null,
483
- promptType: promptDetection.promptData.type,
484
- });
485
- warnOncePerFrame(pollerState, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', {
486
- worktreeId,
487
- cliToolId,
488
- instanceId,
489
- dialog: launchDialog,
490
- promptType: promptDetection.promptData.type,
491
- });
492
- return 'no_answer';
848
+ const judged = {
849
+ worktreeId,
850
+ cliToolId,
851
+ instanceId,
852
+ compositeKey,
853
+ pollerState,
854
+ promptData: promptDetection.promptData,
855
+ promptKey,
856
+ frameKey,
857
+ };
858
+ // 3., 3.2., 3.5. Frames that are not Auto-Yes's to answer: see
859
+ // `suppressIfNotOursToAnswer`.
860
+ const notOurs = suppressIfNotOursToAnswer(judged, frame);
861
+ if (notOurs.kind !== 'dialog-gate-refused') {
862
+ pollerState.enterFallbackCandidateKey = null;
493
863
  }
494
- // 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
495
- // answer. A digit there is an immediate decision, so the base rules'
496
- // default would choose the model and effort for the operator. Judged by the
497
- // picker's own footer, not by `kind: picker`, which the hooks screens share.
498
- // The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
499
- // (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
500
- // recognised the frame and deliberately declined it.
501
- if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(cleanOutput)) {
502
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
503
- reason: 'unclassified-frame',
504
- mode: null,
505
- promptType: promptDetection.promptData.type,
506
- });
507
- warnOncePerFrame(pollerState, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', {
508
- worktreeId,
509
- cliToolId,
510
- instanceId,
511
- promptType: promptDetection.promptData.type,
512
- });
864
+ if (notOurs.kind === 'left-alone') {
513
865
  return 'no_answer';
514
866
  }
515
- // 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
516
- // not enough to send an answer. The detection above judges the ROWS, and the
517
- // rows of an agent's own reply can be indistinguishable from a dialog's --
518
- // opencode 1.18 answering "list three options and ask which one" is the
519
- // reported case (#1896), and the `1` this poller sent in reply was not
520
- // answering anything, it was SENT AS A USER UTTERANCE. What separates the two
521
- // is position and chrome, which only the tool's own module knows, so the
522
- // decision is delegated to `detectDialog` (the seam #1927 declared).
523
- //
524
- // Per tool, and only for tools whose dialogs were measured from their own
525
- // live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
526
- // reaches `allowed: true` without being judged, which is the pre-#1928
527
- // behaviour and the right one where nobody has measured anything.
528
- //
529
- // Recorded through the #1684 channel with the reason code #1924 landed for
530
- // exactly this position, so `capture --json` and `cmate wait` can name the
531
- // gap instead of showing a worker that silently went quiet.
532
- const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptDetection.promptData.type, cleanOutput);
533
- if (!dialogGate.allowed) {
534
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
535
- reason: 'unclassified-frame',
536
- mode: null,
537
- promptType: promptDetection.promptData.type,
538
- });
539
- warnOncePerFrame(pollerState, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
540
- worktreeId,
541
- cliToolId,
542
- instanceId,
543
- promptType: promptDetection.promptData.type,
544
- dialogKind: dialogGate.dialog?.kind ?? null,
545
- answerMode: dialogGate.dialog?.answerMode ?? null,
546
- gateMode: dialogGate.mode,
547
- });
548
- return 'no_answer';
867
+ // 3.6. Issue #3397: a refused frame may be a choice screen CommandMate
868
+ // cannot read; with Auto-Yes on it gets one Enter. See `tryEnterFallback`.
869
+ if (notOurs.kind === 'dialog-gate-refused') {
870
+ return (await tryEnterFallback(judged, promptDetection, notOurs.dialogGate, rawOutput))
871
+ ? 'responded'
872
+ : 'no_answer';
549
873
  }
550
874
  // 4. Resolve auto answer under the execution contract's policy (Issue #1547).
551
875
  // Auto-Yes reads the frame itself instead of going through status-detector
@@ -559,16 +883,12 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
559
883
  // Issue #1684: the log line alone leaves a CLI-driven pipeline blind to
560
884
  // why its worker stalled. Record the suppression so buildCurrentOutput
561
885
  // can publish it (`autoYes.lastSuppression` in capture --json).
562
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
886
+ suppressAndWarnOnce(judged, {
563
887
  reason: resolution.suppressedBy,
564
888
  mode: policy?.mode ?? null,
565
889
  promptType: promptDetection.promptData.type,
566
890
  pattern: resolution.pattern,
567
- });
568
- warnOncePerFrame(pollerState, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
569
- worktreeId,
570
- cliToolId,
571
- instanceId,
891
+ }, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
572
892
  reason: resolution.suppressedBy,
573
893
  mode: policy?.mode ?? null,
574
894
  pattern: resolution.pattern,
@@ -608,67 +928,8 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
608
928
  finally {
609
929
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
610
930
  }
611
- // 6. Update timestamp and reset error count
612
- updateLastServerResponseTimestamp(compositeKey, Date.now());
613
- resetErrorCount(compositeKey);
614
- // 7. Record answered prompt key and timestamp
615
- pollerState.lastAnsweredPromptKey = promptKey;
616
- pollerState.lastAnsweredAt = Date.now();
617
- pollerState.lastSkipWarnKey = null;
618
- logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
619
- // Issue #1548: the prompt was answered without a human. Raised only after
620
- // the keys actually reached tmux, so a send that threw is not logged as an
621
- // answer. No-ops when this instance is not running a contract.
622
- (0, task_transition_service_1.applyEventToActiveTask)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId,
623
- // Undefined means the primary instance, which the task lookup identifies
624
- // by the tool id itself (see getActiveTaskForInstance).
625
- instanceId ?? cliToolId, 'prompt_answered_auto', { promptType: promptDetection.promptData.type });
626
- // Issue #1685: persist question/options/answer to chat history so the audit
627
- // trail survives even when the answer landed inside the response poller's
628
- // interval and the prompt was never saved as a pending message. Must never
629
- // fail the answer that already reached tmux.
630
- let auditRecord = null;
631
- try {
632
- auditRecord = (0, chat_db_1.recordAnsweredPrompt)((0, db_instance_1.getDbInstance)(), {
633
- worktreeId,
634
- cliToolId,
635
- instanceId: instanceId ?? cliToolId,
636
- promptData: promptDetection.promptData,
637
- answer,
638
- answeredBy: 'auto',
639
- content: promptDetection.rawContent || promptDetection.cleanContent,
640
- });
641
- }
642
- catch (recordError) {
643
- logger.warn('poller:prompt-audit-record-failed', {
644
- worktreeId,
645
- cliToolId,
646
- instanceId,
647
- error: (0, errors_1.getErrorMessage)(recordError),
648
- });
649
- }
650
- if (auditRecord) {
651
- const record = auditRecord;
652
- // Fire-and-forget on purpose: the WS push is advisory, and awaiting a
653
- // cold ws-server module load inside the poll path would make its
654
- // completion timing nondeterministic for a side effect it doesn't
655
- // depend on (the audit row is already committed above).
656
- void Promise.resolve().then(() => __importStar(require('../lib/ws-server'))).then(({ broadcastMessage }) => {
657
- broadcastMessage(record.created ? 'message' : 'message_updated', {
658
- worktreeId,
659
- message: record.message,
660
- });
661
- })
662
- .catch(() => { });
663
- }
664
- // Dynamic imports avoid a module cycle through terminal-broadcast ->
665
- // current-output-builder -> auto-yes-manager -> this poller.
666
- const [{ startPolling: startResponsePolling }, { broadcastTerminalSnapshotAfterInteraction }] = await Promise.all([
667
- Promise.resolve().then(() => __importStar(require('../lib/polling/response-poller'))),
668
- Promise.resolve().then(() => __importStar(require('../lib/realtime/terminal-broadcast'))),
669
- ]);
670
- startResponsePolling(worktreeId, cliToolId, instanceId);
671
- void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
931
+ // 6., 7. The answer reached tmux: see `finishAnsweredPrompt`.
932
+ await finishAnsweredPrompt(judged, promptDetection, answer);
672
933
  return 'responded';
673
934
  }
674
935
  catch {
@@ -703,6 +964,10 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
703
964
  // so a dialog anchored on box drawing is not invisible to the one path that
704
965
  // can answer it without a human.
705
966
  const { raw: rawOutput, clean: cleanOutput } = await capturePollerFrame(worktreeId, cliToolId, captureLines, instanceId);
967
+ if (pollerState.waitingForSession) {
968
+ pollerState.waitingForSession = false;
969
+ logger.info('poller:session-appeared', { worktreeId, cliToolId, instanceId });
970
+ }
706
971
  const lines = cleanOutput.split('\n');
707
972
  // 3. Stop condition delta check (Issue #314)
708
973
  if (processStopConditionDelta(compositeKey, pollerState, cleanOutput)) {
@@ -710,6 +975,13 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
710
975
  }
711
976
  // 4. Detect and respond to prompt
712
977
  const result = await detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, cleanOutput, lines, instanceId, rawOutput);
978
+ // Issue #3329: a poll that ran to the end ends the run of errors, so only
979
+ // failures in a row reach AUTO_STOP_ERROR_THRESHOLD — not ones scattered
980
+ // over hours. Not on 'error': a capture that works followed by an answer
981
+ // that fails every time must still back off and stop.
982
+ if (result !== 'error') {
983
+ resetErrorCount(compositeKey);
984
+ }
713
985
  if (result === 'responded') {
714
986
  scheduleNextPoll(worktreeId, cliToolId, instanceId, auto_yes_state_1.COOLDOWN_INTERVAL_MS);
715
987
  return;
@@ -724,11 +996,37 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
724
996
  }
725
997
  }
726
998
  catch (error) {
999
+ // Issue #3329: no session is not an error. Auto-Yes lives independently of
1000
+ // the session it answers for (`auto-yes-lifecycle`), and `send --auto-yes`
1001
+ // enables it before the session starts — so wait until `expiresAt`, at the
1002
+ // backoff cap, instead of counting toward `consecutive_errors`.
1003
+ if (await isSessionMissing(worktreeId, cliToolId, instanceId)) {
1004
+ if (!pollerState.waitingForSession) {
1005
+ pollerState.waitingForSession = true;
1006
+ logger.info('poller:waiting-for-session', { worktreeId, cliToolId, instanceId });
1007
+ }
1008
+ scheduleNextPoll(worktreeId, cliToolId, instanceId, auto_yes_state_1.MAX_BACKOFF_MS);
1009
+ return;
1010
+ }
727
1011
  incrementErrorCount(compositeKey);
728
1012
  logger.warn('poller:poll-error', { worktreeId, cliToolId, instanceId, error: (0, errors_1.getErrorMessage)(error) });
729
1013
  }
730
1014
  scheduleNextPoll(worktreeId, cliToolId, instanceId);
731
1015
  }
1016
+ /**
1017
+ * Whether a failed capture failed because the session does not exist
1018
+ * (Issue #3329). Asked of tmux (`has-session`'s exit code), not read off the
1019
+ * error text. `unknown` — tmux timed out or could not be run — is not "absent":
1020
+ * the failure is counted as before, so a broken tmux still stops Auto-Yes.
1021
+ */
1022
+ async function isSessionMissing(worktreeId, cliToolId, instanceId) {
1023
+ try {
1024
+ return (await (0, cli_session_1.getSessionPresence)(worktreeId, cliToolId, instanceId)) === 'absent';
1025
+ }
1026
+ catch {
1027
+ return false;
1028
+ }
1029
+ }
732
1030
  /**
733
1031
  * Schedule the next polling iteration
734
1032
  *
@@ -820,6 +1118,10 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
820
1118
  * @param compositeKey - Composite key (worktreeId:cliToolId)
821
1119
  */
822
1120
  function stopAutoYesPolling(compositeKey) {
1121
+ // Issue #3397: before the early return — the disable route and the session
1122
+ // cleanup call this for an instance whose poller may already be gone, and the
1123
+ // Enter record must not outlive the grant or the session either way.
1124
+ (0, auto_yes_enter_fallback_1.forgetEnterFallback)(compositeKey);
823
1125
  const pollerState = getPollerState(compositeKey);
824
1126
  if (!pollerState)
825
1127
  return;
@@ -842,6 +1144,7 @@ function stopAllAutoYesPolling() {
842
1144
  logger.info('poller:stopped', { compositeKey: key, reason: 'shutdown' });
843
1145
  }
844
1146
  autoYesPollerStates.clear();
1147
+ (0, auto_yes_enter_fallback_1.clearEnterFallbacks)();
845
1148
  }
846
1149
  /**
847
1150
  * Get all composite keys that have active auto-yes poller entries.
@@ -865,6 +1168,8 @@ function getAutoYesPollerCompositeKeys() {
865
1168
  function stopAutoYesPollingByWorktree(worktreeId) {
866
1169
  const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId);
867
1170
  pollerKeys.forEach(key => stopAutoYesPolling(key));
1171
+ // Issue #3397: and the records of instances whose poller had already stopped.
1172
+ (0, auto_yes_enter_fallback_1.forgetEnterFallbacksByWorktree)(worktreeId);
868
1173
  }
869
1174
  /**
870
1175
  * Check if any auto-yes poller is active for a given worktreeId.