commandmate 0.44.2 → 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 (581) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +149 -149
  3. package/.next/app-path-routes-manifest.json +21 -21
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  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 -1
  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 -1
  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 +2 -2
  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 +21 -21
  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 -1
  294. package/.next/server/chunks/2710.js +1 -1
  295. package/.next/server/chunks/2908.js +1 -1
  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 -1
  308. package/.next/server/chunks/5625.js +25 -0
  309. package/.next/server/chunks/611.js +1 -1
  310. package/.next/server/chunks/6130.js +1 -1
  311. package/.next/server/chunks/6401.js +1 -1
  312. package/.next/server/chunks/6781.js +1 -1
  313. package/.next/server/chunks/6793.js +3 -3
  314. package/.next/server/chunks/7491.js +2 -2
  315. package/.next/server/chunks/7905.js +1 -1
  316. package/.next/server/chunks/850.js +1 -1
  317. package/.next/server/chunks/8728.js +3 -3
  318. package/.next/server/chunks/8791.js +1 -1
  319. package/.next/server/chunks/8800.js +1 -1
  320. package/.next/server/chunks/8918.js +7 -7
  321. package/.next/server/chunks/9130.js +1 -1
  322. package/.next/server/chunks/9390.js +2 -2
  323. package/.next/server/chunks/9584.js +1 -1
  324. package/.next/server/chunks/9627.js +6 -6
  325. package/.next/server/chunks/9731.js +3 -3
  326. package/.next/server/middleware-manifest.json +5 -5
  327. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  328. package/.next/server/pages/500.html +1 -1
  329. package/.next/server/server-reference-manifest.json +1 -1
  330. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  331. package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-06d35bb1aa02de80.js} +1 -1
  332. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  333. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
  334. package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
  335. package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-0d1750b833f5cc3e.js} +1 -1
  336. package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
  337. package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
  338. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  339. package/.next/static/css/057f64a65726c439.css +1 -0
  340. package/.next/trace +13 -13
  341. package/dist/cli/commands/ask.d.ts.map +1 -1
  342. package/dist/cli/commands/ask.js +120 -119
  343. package/dist/cli/commands/attach.d.ts +94 -0
  344. package/dist/cli/commands/attach.d.ts.map +1 -1
  345. package/dist/cli/commands/attach.js +145 -7
  346. package/dist/cli/commands/auto-yes.js +1 -1
  347. package/dist/cli/commands/capture.d.ts.map +1 -1
  348. package/dist/cli/commands/capture.js +3 -5
  349. package/dist/cli/commands/command-target.d.ts +23 -0
  350. package/dist/cli/commands/command-target.d.ts.map +1 -0
  351. package/dist/cli/commands/command-target.js +25 -0
  352. package/dist/cli/commands/instances.d.ts.map +1 -1
  353. package/dist/cli/commands/instances.js +41 -2
  354. package/dist/cli/commands/message-dispatch.d.ts +36 -0
  355. package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
  356. package/dist/cli/commands/message-dispatch.js +63 -0
  357. package/dist/cli/commands/reply.d.ts.map +1 -1
  358. package/dist/cli/commands/reply.js +2 -5
  359. package/dist/cli/commands/respond.d.ts.map +1 -1
  360. package/dist/cli/commands/respond.js +3 -6
  361. package/dist/cli/commands/send.d.ts.map +1 -1
  362. package/dist/cli/commands/send.js +149 -146
  363. package/dist/cli/commands/wait.d.ts.map +1 -1
  364. package/dist/cli/commands/wait.js +589 -431
  365. package/dist/cli/types/api-responses.d.ts +159 -27
  366. package/dist/cli/types/api-responses.d.ts.map +1 -1
  367. package/dist/cli/types/api-responses.js +4 -2
  368. package/dist/cli/utils/api-client.d.ts +25 -5
  369. package/dist/cli/utils/api-client.d.ts.map +1 -1
  370. package/dist/cli/utils/api-client.js +87 -55
  371. package/dist/cli/utils/server-url.d.ts +1 -0
  372. package/dist/cli/utils/server-url.d.ts.map +1 -1
  373. package/dist/cli/utils/server-url.js +7 -0
  374. package/dist/config/uat-isolation.d.ts +140 -0
  375. package/dist/config/uat-isolation.d.ts.map +1 -0
  376. package/dist/config/uat-isolation.js +246 -0
  377. package/dist/lib/global-state.d.ts +12 -0
  378. package/dist/lib/global-state.d.ts.map +1 -0
  379. package/dist/lib/global-state.js +16 -0
  380. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
  381. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
  382. package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
  383. package/dist/lib/session/prompt-view.d.ts +26 -3
  384. package/dist/lib/session/prompt-view.d.ts.map +1 -1
  385. package/dist/lib/session/prompt-view.js +26 -3
  386. package/dist/lib/session/status-evidence-type.d.ts +16 -0
  387. package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
  388. package/dist/lib/session/status-evidence-type.js +2 -0
  389. package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
  390. package/dist/lib/tmux/legacy-session-alias.js +2 -1
  391. package/dist/server/locales/en/worktree.json +3 -1
  392. package/dist/server/locales/ja/worktree.json +3 -1
  393. package/dist/server/src/cli/types/api-responses.js +4 -2
  394. package/dist/server/src/config/cli-tool-timing-config.js +1 -6
  395. package/dist/server/src/config/uat-isolation.js +246 -0
  396. package/dist/server/src/lib/assistant-response-saver.js +62 -3
  397. package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
  398. package/dist/server/src/lib/auto-yes-poller.js +450 -160
  399. package/dist/server/src/lib/auto-yes-state.js +2 -2
  400. package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
  401. package/dist/server/src/lib/cli-tools/base.js +151 -0
  402. package/dist/server/src/lib/cli-tools/codex.js +44 -80
  403. package/dist/server/src/lib/cli-tools/command-code.js +24 -56
  404. package/dist/server/src/lib/cli-tools/copilot.js +25 -67
  405. package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
  406. package/dist/server/src/lib/cli-tools/gemini.js +23 -73
  407. package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
  408. package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
  409. package/dist/server/src/lib/cli-tools/opencode.js +21 -85
  410. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
  411. package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
  412. package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
  413. package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
  414. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
  415. package/dist/server/src/lib/detection/prompt-detector.js +2 -35
  416. package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
  417. package/dist/server/src/lib/detection/selection-shape.js +32 -520
  418. package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
  419. package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
  420. package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
  421. package/dist/server/src/lib/detection/tools/antigravity/detect.js +5 -29
  422. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
  423. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
  424. package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
  425. package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
  426. package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
  427. package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
  428. package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
  429. package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
  430. package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
  431. package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
  432. package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
  433. package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
  434. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
  435. package/dist/server/src/lib/detection/tools/context-above.js +20 -0
  436. package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
  437. package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
  438. package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
  439. package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
  440. package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
  441. package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
  442. package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
  443. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
  444. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
  445. package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
  446. package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
  447. package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
  448. package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
  449. package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
  450. package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
  451. package/dist/server/src/lib/global-state.js +16 -0
  452. package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
  453. package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
  454. package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
  455. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
  456. package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
  457. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
  458. package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
  459. package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
  460. package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
  461. package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
  462. package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
  463. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
  464. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
  465. package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
  466. package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
  467. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
  468. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
  469. package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
  470. package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
  471. package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
  472. package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
  473. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
  474. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
  475. package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
  476. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
  477. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
  478. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
  479. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
  480. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
  481. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
  482. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
  483. package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
  484. package/dist/server/src/lib/hooks/sources/registry.js +3 -2
  485. package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
  486. package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
  487. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
  488. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
  489. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
  490. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
  491. package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
  492. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
  493. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
  494. package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
  495. package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
  496. package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
  497. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
  498. package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
  499. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
  500. package/dist/server/src/lib/polling/response-checker.js +641 -1142
  501. package/dist/server/src/lib/polling/response-dedup.js +3 -4
  502. package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
  503. package/dist/server/src/lib/polling/response-poller-core.js +54 -20
  504. package/dist/server/src/lib/polling/startup-screen.js +142 -0
  505. package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
  506. package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
  507. package/dist/server/src/lib/prompt-answer-sender.js +5 -4
  508. package/dist/server/src/lib/push/failure-episode-state.js +2 -2
  509. package/dist/server/src/lib/push/notification-dedup.js +3 -4
  510. package/dist/server/src/lib/push/prompt-card-state.js +2 -2
  511. package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
  512. package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
  513. package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
  514. package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
  515. package/dist/server/src/lib/relay/relay-delivery.js +3 -2
  516. package/dist/server/src/lib/relay/relay-readiness.js +38 -1
  517. package/dist/server/src/lib/response-cleaner.js +24 -1
  518. package/dist/server/src/lib/response-extractor.js +16 -0
  519. package/dist/server/src/lib/schedule-manager.js +8 -10
  520. package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
  521. package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
  522. package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
  523. package/dist/server/src/lib/session/agent-event-model.js +562 -0
  524. package/dist/server/src/lib/session/agent-event-record.js +10 -0
  525. package/dist/server/src/lib/session/agent-event-state.js +106 -1854
  526. package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
  527. package/dist/server/src/lib/session/agent-event-turn.js +811 -0
  528. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
  529. package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
  530. package/dist/server/src/lib/session/claude-executor.js +45 -5
  531. package/dist/server/src/lib/session/claude-session.js +21 -65
  532. package/dist/server/src/lib/session/cli-session.js +17 -0
  533. package/dist/server/src/lib/session/current-output-builder.js +450 -1103
  534. package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
  535. package/dist/server/src/lib/session/current-output-types.js +9 -0
  536. package/dist/server/src/lib/session/detection-divergence.js +55 -0
  537. package/dist/server/src/lib/session/global-session-constants.js +2 -13
  538. package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
  539. package/dist/server/src/lib/session/layer-disagreement.js +2 -2
  540. package/dist/server/src/lib/session/opencode-session-store.js +2 -1
  541. package/dist/server/src/lib/session/prompt-view.js +26 -3
  542. package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
  543. package/dist/server/src/lib/session/provisional-turn.js +3 -1
  544. package/dist/server/src/lib/session/send-user-message.js +1 -1
  545. package/dist/server/src/lib/session/session-starting-state.js +4 -6
  546. package/dist/server/src/lib/session/status-evidence-type.js +2 -0
  547. package/dist/server/src/lib/session/status-evidence.js +2 -2
  548. package/dist/server/src/lib/session/structured-status-merge.js +335 -0
  549. package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
  550. package/dist/server/src/lib/session-cleanup.js +1 -5
  551. package/dist/server/src/lib/skills/install-plan.js +2 -1
  552. package/dist/server/src/lib/skills/snapshot-store.js +2 -2
  553. package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
  554. package/dist/server/src/lib/timer-manager.js +6 -8
  555. package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
  556. package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
  557. package/dist/server/src/lib/tmux/session-hooks.js +2 -1
  558. package/dist/server/src/lib/tmux/session-status-options.js +3 -3
  559. package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
  560. package/dist/server/src/lib/tmux/tmux.js +33 -59
  561. package/dist/server/src/lib/tui-accumulator.js +2 -2
  562. package/dist/server/src/lib/version-checker.js +6 -6
  563. package/dist/server/src/lib/ws-server.js +47 -11
  564. package/docs/en/user-guide/webapp-guide.md +27 -3
  565. package/package.json +1 -1
  566. package/release-notes/0.44.3.json +82 -0
  567. package/scripts/hooks/cmate-agent-event.sh +18 -0
  568. package/.next/server/chunks/1068.js +0 -1
  569. package/.next/server/chunks/4372.js +0 -5
  570. package/.next/server/chunks/6474.js +0 -14
  571. package/.next/server/chunks/967.js +0 -1
  572. package/.next/server/chunks/9798.js +0 -2
  573. package/.next/server/chunks/9882.js +0 -25
  574. package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
  575. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
  576. package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
  577. package/.next/static/css/38070d879efa1371.css +0 -1
  578. package/dist/server/src/lib/cli-tools/index.js +0 -41
  579. package/dist/server/src/lib/polling/global-session-poller.js +0 -140
  580. /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
  581. /package/.next/static/{QlCqLjorauDDBXPa-C7TK → 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;
@@ -68,11 +69,14 @@ const detect_1 = require("./detection/tools/codex/detect");
68
69
  const frame_1 = require("./detection/tools/frame");
69
70
  const auto_yes_suppression_state_1 = require("./polling/auto-yes-suppression-state");
70
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");
71
73
  const task_transition_service_1 = require("./tasks/task-transition-service");
72
74
  const db_instance_1 = require("./db/db-instance");
73
75
  const chat_db_1 = require("./db/chat-db");
74
76
  const worktree_session_ownership_1 = require("./cli-tools/worktree-session-ownership");
75
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");
76
80
  const manager_1 = require("./cli-tools/manager");
77
81
  const cli_patterns_1 = require("./detection/cli-patterns");
78
82
  const prompt_key_1 = require("./detection/prompt-key");
@@ -83,17 +87,16 @@ const logger_1 = require("../lib/logger");
83
87
  const logger = (0, logger_1.createLogger)('auto-yes-poller');
84
88
  const path_validator_1 = require("./security/path-validator");
85
89
  const auto_yes_state_1 = require("./auto-yes-state");
90
+ const global_state_1 = require("./global-state");
86
91
  /** In-memory storage for poller states (globalThis for hot reload persistence) */
87
- const autoYesPollerStates = globalThis.__autoYesPollerStates ??
88
- (globalThis.__autoYesPollerStates = new Map());
92
+ const autoYesPollerStates = (0, global_state_1.getOrInitGlobal)('__autoYesPollerStates', () => new Map());
89
93
  /**
90
94
  * When `antigravity-autoyes-withheld-no-hook-receipt` was last logged, per
91
95
  * compositeKey (Issue #2857). The poller re-reads a static pane every 2s, so the
92
96
  * line is limited to one per {@link WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS} per
93
97
  * instance. globalThis for the same reason as the poller states above.
94
98
  */
95
- const withheldNoReceiptLoggedAt = globalThis.__autoYesWithheldNoReceiptLoggedAt ??
96
- (globalThis.__autoYesWithheldNoReceiptLoggedAt = new Map());
99
+ const withheldNoReceiptLoggedAt = (0, global_state_1.getOrInitGlobal)('__autoYesWithheldNoReceiptLoggedAt', () => new Map());
97
100
  /** Least gap between two `antigravity-autoyes-withheld-no-hook-receipt` lines for one instance. */
98
101
  const WITHHELD_NO_RECEIPT_LOG_INTERVAL_MS = 60_000;
99
102
  // =============================================================================
@@ -161,6 +164,8 @@ function updateLastServerResponseTimestamp(compositeKey, timestamp) {
161
164
  }
162
165
  /**
163
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.
164
169
  *
165
170
  * @param compositeKey - Composite key
166
171
  */
@@ -189,7 +194,8 @@ function incrementErrorCount(compositeKey) {
189
194
  // poller — applied here directly rather than through `releaseAutoYes`:
190
195
  // that module reaches this one through the auto-yes-manager barrel, so
191
196
  // importing it back would be a cycle. `auto-yes-lifecycle-3184.test.ts`
192
- // holds this call and the table row equal.
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.
193
199
  if (pollerState.consecutiveErrors >= auto_yes_config_1.AUTO_STOP_ERROR_THRESHOLD) {
194
200
  const worktreeId = (0, auto_yes_state_1.extractWorktreeId)(compositeKey);
195
201
  const cliToolId = (0, auto_yes_state_1.extractCliToolId)(compositeKey);
@@ -389,6 +395,366 @@ function logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, rea
389
395
  hint: 'hook の受信記録が直近に無いため Auto-Yes は答えなかった。~/.gemini/config/hooks.json の向き先(#2622)を確認',
390
396
  });
391
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
+ }
392
758
  /**
393
759
  * Detect prompt in terminal output, resolve auto-answer, and send response.
394
760
  *
@@ -446,6 +812,14 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
446
812
  // machine whose hook does not reach us. The price is that Auto-Yes leaves
447
813
  // such a machine's dialogs alone, which is why `logIfWithheldForWantOfReceipt`
448
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
+ }
449
823
  const receiptScope = { worktreeId, instanceId };
450
824
  // Issue #3183: the ONE frame every judgement below reads — normalised once,
451
825
  // from the capture as captured (the input-box markers are rule rows the
@@ -459,6 +833,7 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
459
833
  pollerState.lastAnsweredPromptKey = null;
460
834
  pollerState.lastAnsweredAt = null;
461
835
  pollerState.lastSkipWarnKey = null;
836
+ pollerState.enterFallbackCandidateKey = null;
462
837
  if (cliToolId === 'antigravity' && !promptDetection.isPrompt) {
463
838
  logIfWithheldForWantOfReceipt(worktreeId, instanceId, compositeKey, () => (0, response_checker_1.detectPromptOnCleanFrame)(cleanOutput, cliToolId, precomputedLines, rawOutput));
464
839
  }
@@ -470,97 +845,31 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
470
845
  if (isDuplicatePrompt(pollerState, promptKey)) {
471
846
  return 'duplicate';
472
847
  }
473
- // 3. Issue #1829: codex's own launch dialogs are CodexTool.waitForReady()'s
474
- // to answer, not the poller's. Every one of them defaults to option 1, and
475
- // the base rules answer the default:
476
- //
477
- // "Hooks need review" -> 1. Review hooks (undoes Issue #1760; the pane
478
- // then sits two screens deep in a review UI that
479
- // only `t`/`esc` leave, reported as `running`)
480
- // "Update available" -> 1. Update now (undoes Issue #890; runs
481
- // `npm install -g @openai/codex`, killing codex)
482
- // "Do you trust …" -> 1. Yes, continue
483
- //
484
- // waitForReady answers the same screens deliberately and differently ('3',
485
- // '2', '1' — each without a trailing Enter), but only during startSession,
486
- // while this poller runs on its own 2s phase for the life of the session.
487
- // Whichever sees the dialog first decides, so the fix is to leave them all
488
- // to the tool. Auto-answer layer only: the detection above still reports the
489
- // prompt, so the human keeps seeing the screen and the response poller
490
- // still notifies them about it.
491
- const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
492
- if (launchDialog) {
493
- // Recorded through the #1684 channel so `capture --json` and `cmate wait`
494
- // can name the reason instead of showing a worker that went quiet.
495
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
496
- reason: 'agent-launch-dialog',
497
- mode: null,
498
- promptType: promptDetection.promptData.type,
499
- });
500
- warnOncePerFrame(pollerState, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', {
501
- worktreeId,
502
- cliToolId,
503
- instanceId,
504
- dialog: launchDialog,
505
- promptType: promptDetection.promptData.type,
506
- });
507
- 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;
508
863
  }
509
- // 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
510
- // answer. A digit there is an immediate decision, so the base rules'
511
- // default would choose the model and effort for the operator. Judged by the
512
- // picker's own footer, not by `kind: picker`, which the hooks screens share.
513
- // The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
514
- // (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
515
- // recognised the frame and deliberately declined it.
516
- if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
517
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
518
- reason: 'unclassified-frame',
519
- mode: null,
520
- promptType: promptDetection.promptData.type,
521
- });
522
- warnOncePerFrame(pollerState, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', {
523
- worktreeId,
524
- cliToolId,
525
- instanceId,
526
- promptType: promptDetection.promptData.type,
527
- });
864
+ if (notOurs.kind === 'left-alone') {
528
865
  return 'no_answer';
529
866
  }
530
- // 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
531
- // not enough to send an answer. The detection above judges the ROWS, and the
532
- // rows of an agent's own reply can be indistinguishable from a dialog's --
533
- // opencode 1.18 answering "list three options and ask which one" is the
534
- // reported case (#1896), and the `1` this poller sent in reply was not
535
- // answering anything, it was SENT AS A USER UTTERANCE. What separates the two
536
- // is position and chrome, which only the tool's own module knows, so the
537
- // decision is delegated to `detectDialog` (the seam #1927 declared).
538
- //
539
- // Per tool, and only for tools whose dialogs were measured from their own
540
- // live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
541
- // reaches `allowed: true` without being judged, which is the pre-#1928
542
- // behaviour and the right one where nobody has measured anything.
543
- //
544
- // Recorded through the #1684 channel with the reason code #1924 landed for
545
- // exactly this position, so `capture --json` and `cmate wait` can name the
546
- // gap instead of showing a worker that silently went quiet.
547
- const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptDetection.promptData.type, frame);
548
- if (!dialogGate.allowed) {
549
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
550
- reason: 'unclassified-frame',
551
- mode: null,
552
- promptType: promptDetection.promptData.type,
553
- });
554
- warnOncePerFrame(pollerState, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
555
- worktreeId,
556
- cliToolId,
557
- instanceId,
558
- promptType: promptDetection.promptData.type,
559
- dialogKind: dialogGate.dialog?.kind ?? null,
560
- answerMode: dialogGate.dialog?.answerMode ?? null,
561
- gateMode: dialogGate.mode,
562
- });
563
- 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';
564
873
  }
565
874
  // 4. Resolve auto answer under the execution contract's policy (Issue #1547).
566
875
  // Auto-Yes reads the frame itself instead of going through status-detector
@@ -574,16 +883,12 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
574
883
  // Issue #1684: the log line alone leaves a CLI-driven pipeline blind to
575
884
  // why its worker stalled. Record the suppression so buildCurrentOutput
576
885
  // can publish it (`autoYes.lastSuppression` in capture --json).
577
- (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, {
886
+ suppressAndWarnOnce(judged, {
578
887
  reason: resolution.suppressedBy,
579
888
  mode: policy?.mode ?? null,
580
889
  promptType: promptDetection.promptData.type,
581
890
  pattern: resolution.pattern,
582
- });
583
- warnOncePerFrame(pollerState, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
584
- worktreeId,
585
- cliToolId,
586
- instanceId,
891
+ }, `${frameKey}\u0000${resolution.suppressedBy}\u0000${policy?.mode ?? ''}\u0000${resolution.pattern ?? ''}`, 'poller:auto-yes-suppressed-by-policy', {
587
892
  reason: resolution.suppressedBy,
588
893
  mode: policy?.mode ?? null,
589
894
  pattern: resolution.pattern,
@@ -623,67 +928,8 @@ async function detectAndRespondToPrompt(worktreeId, pollerState, cliToolId, clea
623
928
  finally {
624
929
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
625
930
  }
626
- // 6. Update timestamp and reset error count
627
- updateLastServerResponseTimestamp(compositeKey, Date.now());
628
- resetErrorCount(compositeKey);
629
- // 7. Record answered prompt key and timestamp
630
- pollerState.lastAnsweredPromptKey = promptKey;
631
- pollerState.lastAnsweredAt = Date.now();
632
- pollerState.lastSkipWarnKey = null;
633
- logger.info('poller:response-sent', { worktreeId, cliToolId, instanceId });
634
- // Issue #1548: the prompt was answered without a human. Raised only after
635
- // the keys actually reached tmux, so a send that threw is not logged as an
636
- // answer. No-ops when this instance is not running a contract.
637
- (0, task_transition_service_1.applyEventToActiveTask)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId,
638
- // Undefined means the primary instance, which the task lookup identifies
639
- // by the tool id itself (see getActiveTaskForInstance).
640
- instanceId ?? cliToolId, 'prompt_answered_auto', { promptType: promptDetection.promptData.type });
641
- // Issue #1685: persist question/options/answer to chat history so the audit
642
- // trail survives even when the answer landed inside the response poller's
643
- // interval and the prompt was never saved as a pending message. Must never
644
- // fail the answer that already reached tmux.
645
- let auditRecord = null;
646
- try {
647
- auditRecord = (0, chat_db_1.recordAnsweredPrompt)((0, db_instance_1.getDbInstance)(), {
648
- worktreeId,
649
- cliToolId,
650
- instanceId: instanceId ?? cliToolId,
651
- promptData: promptDetection.promptData,
652
- answer,
653
- answeredBy: 'auto',
654
- content: promptDetection.rawContent || promptDetection.cleanContent,
655
- });
656
- }
657
- catch (recordError) {
658
- logger.warn('poller:prompt-audit-record-failed', {
659
- worktreeId,
660
- cliToolId,
661
- instanceId,
662
- error: (0, errors_1.getErrorMessage)(recordError),
663
- });
664
- }
665
- if (auditRecord) {
666
- const record = auditRecord;
667
- // Fire-and-forget on purpose: the WS push is advisory, and awaiting a
668
- // cold ws-server module load inside the poll path would make its
669
- // completion timing nondeterministic for a side effect it doesn't
670
- // depend on (the audit row is already committed above).
671
- void Promise.resolve().then(() => __importStar(require('../lib/ws-server'))).then(({ broadcastMessage }) => {
672
- broadcastMessage(record.created ? 'message' : 'message_updated', {
673
- worktreeId,
674
- message: record.message,
675
- });
676
- })
677
- .catch(() => { });
678
- }
679
- // Dynamic imports avoid a module cycle through terminal-broadcast ->
680
- // current-output-builder -> auto-yes-manager -> this poller.
681
- const [{ startPolling: startResponsePolling }, { broadcastTerminalSnapshotAfterInteraction }] = await Promise.all([
682
- Promise.resolve().then(() => __importStar(require('../lib/polling/response-poller'))),
683
- Promise.resolve().then(() => __importStar(require('../lib/realtime/terminal-broadcast'))),
684
- ]);
685
- startResponsePolling(worktreeId, cliToolId, instanceId);
686
- void broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId, instanceId);
931
+ // 6., 7. The answer reached tmux: see `finishAnsweredPrompt`.
932
+ await finishAnsweredPrompt(judged, promptDetection, answer);
687
933
  return 'responded';
688
934
  }
689
935
  catch {
@@ -718,6 +964,10 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
718
964
  // so a dialog anchored on box drawing is not invisible to the one path that
719
965
  // can answer it without a human.
720
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
+ }
721
971
  const lines = cleanOutput.split('\n');
722
972
  // 3. Stop condition delta check (Issue #314)
723
973
  if (processStopConditionDelta(compositeKey, pollerState, cleanOutput)) {
@@ -725,6 +975,13 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
725
975
  }
726
976
  // 4. Detect and respond to prompt
727
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
+ }
728
985
  if (result === 'responded') {
729
986
  scheduleNextPoll(worktreeId, cliToolId, instanceId, auto_yes_state_1.COOLDOWN_INTERVAL_MS);
730
987
  return;
@@ -739,11 +996,37 @@ async function pollAutoYes(worktreeId, cliToolId, instanceId) {
739
996
  }
740
997
  }
741
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
+ }
742
1011
  incrementErrorCount(compositeKey);
743
1012
  logger.warn('poller:poll-error', { worktreeId, cliToolId, instanceId, error: (0, errors_1.getErrorMessage)(error) });
744
1013
  }
745
1014
  scheduleNextPoll(worktreeId, cliToolId, instanceId);
746
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
+ }
747
1030
  /**
748
1031
  * Schedule the next polling iteration
749
1032
  *
@@ -835,6 +1118,10 @@ function startAutoYesPolling(worktreeId, cliToolId, instanceId) {
835
1118
  * @param compositeKey - Composite key (worktreeId:cliToolId)
836
1119
  */
837
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);
838
1125
  const pollerState = getPollerState(compositeKey);
839
1126
  if (!pollerState)
840
1127
  return;
@@ -857,6 +1144,7 @@ function stopAllAutoYesPolling() {
857
1144
  logger.info('poller:stopped', { compositeKey: key, reason: 'shutdown' });
858
1145
  }
859
1146
  autoYesPollerStates.clear();
1147
+ (0, auto_yes_enter_fallback_1.clearEnterFallbacks)();
860
1148
  }
861
1149
  /**
862
1150
  * Get all composite keys that have active auto-yes poller entries.
@@ -880,6 +1168,8 @@ function getAutoYesPollerCompositeKeys() {
880
1168
  function stopAutoYesPollingByWorktree(worktreeId) {
881
1169
  const pollerKeys = (0, auto_yes_state_1.filterCompositeKeysByWorktree)(Array.from(autoYesPollerStates.keys()), worktreeId);
882
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);
883
1173
  }
884
1174
  /**
885
1175
  * Check if any auto-yes poller is active for a given worktreeId.