commandmate 0.46.1 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +223 -216
  3. package/.next/app-path-routes-manifest.json +19 -18
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update/route.js +4 -2
  13. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/capabilities/route.js +1 -1
  19. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js +1 -1
  21. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  22. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  24. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  32. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  33. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  35. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  36. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  39. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/escalation/route.js +1 -7
  43. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  44. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/push/vapid/route.js +1 -7
  47. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  48. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  50. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  51. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/relays/route.js +1 -1
  53. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  54. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  58. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  59. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/clone/route.js +1 -1
  61. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  62. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/restore/route.js +1 -1
  65. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  66. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/route.js +1 -1
  68. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  69. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/scan/route.js +1 -1
  71. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/sync/route.js +1 -1
  74. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  78. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  79. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  96. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  99. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  102. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  107. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  110. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  113. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  149. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  152. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  162. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  165. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -0
  170. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
  171. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  191. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  208. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  225. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/route.js +1 -1
  231. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/sessions/page.js +1 -1
  242. package/.next/server/app/sessions/page.js.nft.json +1 -1
  243. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  245. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  248. package/.next/server/app/worktrees/[id]/page.js +11 -11
  249. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  250. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  251. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  252. package/.next/server/app-paths-manifest.json +19 -18
  253. package/.next/server/chunks/1210.js +1 -1
  254. package/.next/server/chunks/1559.js +1 -1
  255. package/.next/server/chunks/1601.js +7 -0
  256. package/.next/server/chunks/1836.js +1 -0
  257. package/.next/server/chunks/1945.js +14 -0
  258. package/.next/server/chunks/2119.js +1 -1
  259. package/.next/server/chunks/2404.js +1 -1
  260. package/.next/server/chunks/2422.js +1 -0
  261. package/.next/server/chunks/2445.js +1 -1
  262. package/.next/server/chunks/2460.js +1 -1
  263. package/.next/server/chunks/2534.js +1 -1
  264. package/.next/server/chunks/3241.js +1 -1
  265. package/.next/server/chunks/{3077.js → 4194.js} +12 -12
  266. package/.next/server/chunks/4207.js +1 -1
  267. package/.next/server/chunks/4248.js +1 -1
  268. package/.next/server/chunks/5209.js +1 -1
  269. package/.next/server/chunks/5292.js +1 -1
  270. package/.next/server/chunks/5595.js +1 -1
  271. package/.next/server/chunks/5845.js +1 -1
  272. package/.next/server/chunks/6130.js +1 -1
  273. package/.next/server/chunks/6401.js +1 -1
  274. package/.next/server/chunks/{2283.js → 6486.js} +7 -7
  275. package/.next/server/chunks/6722.js +1 -1
  276. package/.next/server/chunks/6781.js +1 -1
  277. package/.next/server/chunks/6793.js +2 -2
  278. package/.next/server/chunks/7166.js +19 -0
  279. package/.next/server/chunks/7905.js +1 -1
  280. package/.next/server/chunks/8581.js +10 -10
  281. package/.next/server/chunks/8728.js +2 -2
  282. package/.next/server/chunks/8791.js +1 -1
  283. package/.next/server/chunks/8918.js +4 -4
  284. package/.next/server/chunks/9199.js +1 -0
  285. package/.next/server/chunks/936.js +1 -0
  286. package/.next/server/chunks/9390.js +1 -1
  287. package/.next/server/chunks/9540.js +1 -0
  288. package/.next/server/chunks/9627.js +1 -1
  289. package/.next/server/chunks/9731.js +3 -3
  290. package/.next/server/middleware-manifest.json +5 -5
  291. package/.next/server/pages/500.html +1 -1
  292. package/.next/server/server-reference-manifest.json +1 -1
  293. package/.next/static/chunks/{2407-9703c569370b8a9d.js → 2407-b2f524f99f7fc353.js} +1 -1
  294. package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
  295. package/.next/static/chunks/{5794-4eee51ff1e878aa6.js → 5794-80ac3f06f098ea29.js} +1 -1
  296. package/.next/static/chunks/602-1c1488959215e140.js +1 -0
  297. package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
  298. package/.next/static/chunks/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  299. package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  300. package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  301. package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
  302. package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  303. package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
  304. package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
  305. package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
  306. package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
  307. package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
  308. package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
  309. package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
  310. package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
  311. package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
  312. package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
  313. package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
  314. package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
  315. package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
  316. package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
  317. package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
  318. package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
  319. package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
  320. package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
  321. package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
  322. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
  323. package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
  324. package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
  325. package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
  326. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
  327. package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
  328. package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
  329. package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
  330. package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
  331. package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
  332. package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
  333. package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
  334. package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
  335. package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
  336. package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
  337. package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
  338. package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
  339. package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
  340. package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
  341. package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
  342. package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
  343. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
  344. package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
  345. package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
  346. package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
  347. package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
  348. package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
  434. package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
  435. package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
  436. package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
  437. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
  438. package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
  439. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
  440. package/.next/trace +13 -13
  441. package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
  442. package/.next/types/routes.d.ts +2 -1
  443. package/.next/types/validator.ts +9 -0
  444. package/dist/cli/commands/auto-yes.d.ts +19 -0
  445. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  446. package/dist/cli/commands/auto-yes.js +45 -0
  447. package/dist/cli/commands/instances.d.ts.map +1 -1
  448. package/dist/cli/commands/instances.js +23 -18
  449. package/dist/cli/commands/ls.d.ts +15 -1
  450. package/dist/cli/commands/ls.d.ts.map +1 -1
  451. package/dist/cli/commands/ls.js +39 -3
  452. package/dist/cli/commands/prompt.d.ts +42 -0
  453. package/dist/cli/commands/prompt.d.ts.map +1 -0
  454. package/dist/cli/commands/prompt.js +211 -0
  455. package/dist/cli/commands/relays.d.ts.map +1 -1
  456. package/dist/cli/commands/relays.js +13 -1
  457. package/dist/cli/commands/respond-strict.d.ts +31 -0
  458. package/dist/cli/commands/respond-strict.d.ts.map +1 -0
  459. package/dist/cli/commands/respond-strict.js +214 -0
  460. package/dist/cli/commands/respond.d.ts.map +1 -1
  461. package/dist/cli/commands/respond.js +38 -0
  462. package/dist/cli/commands/send.d.ts.map +1 -1
  463. package/dist/cli/commands/send.js +41 -5
  464. package/dist/cli/commands/start.d.ts.map +1 -1
  465. package/dist/cli/commands/start.js +2 -1
  466. package/dist/cli/commands/status.d.ts.map +1 -1
  467. package/dist/cli/commands/status.js +18 -0
  468. package/dist/cli/commands/wait.d.ts +21 -1
  469. package/dist/cli/commands/wait.d.ts.map +1 -1
  470. package/dist/cli/commands/wait.js +108 -12
  471. package/dist/cli/docs/agent-operations.d.ts +1 -1
  472. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  473. package/dist/cli/docs/agent-operations.js +63 -1
  474. package/dist/cli/program.d.ts.map +1 -1
  475. package/dist/cli/program.js +6 -2
  476. package/dist/cli/types/api-responses.d.ts +54 -0
  477. package/dist/cli/types/api-responses.d.ts.map +1 -1
  478. package/dist/cli/types/index.d.ts +30 -0
  479. package/dist/cli/types/index.d.ts.map +1 -1
  480. package/dist/cli/types/index.js +12 -1
  481. package/dist/cli/utils/api-client.d.ts +13 -1
  482. package/dist/cli/utils/api-client.d.ts.map +1 -1
  483. package/dist/cli/utils/api-client.js +10 -2
  484. package/dist/cli/utils/daemon-factory.d.ts.map +1 -1
  485. package/dist/cli/utils/daemon-factory.js +3 -1
  486. package/dist/cli/utils/daemon.d.ts +38 -1
  487. package/dist/cli/utils/daemon.d.ts.map +1 -1
  488. package/dist/cli/utils/daemon.js +161 -8
  489. package/dist/cli/utils/paths.d.ts +12 -0
  490. package/dist/cli/utils/paths.d.ts.map +1 -1
  491. package/dist/cli/utils/paths.js +17 -0
  492. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +43 -1
  493. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  494. package/dist/lib/polling/auto-yes-suppression-reason.js +18 -1
  495. package/dist/lib/prompt-observation/kinds.d.ts +101 -0
  496. package/dist/lib/prompt-observation/kinds.d.ts.map +1 -0
  497. package/dist/lib/prompt-observation/kinds.js +123 -0
  498. package/dist/lib/prompt-observation/types.d.ts +271 -0
  499. package/dist/lib/prompt-observation/types.d.ts.map +1 -0
  500. package/dist/lib/prompt-observation/types.js +14 -0
  501. package/dist/lib/session/send-attempt-types.d.ts +66 -0
  502. package/dist/lib/session/send-attempt-types.d.ts.map +1 -0
  503. package/dist/lib/session/send-attempt-types.js +17 -0
  504. package/dist/server/locales/en/worktree.json +4 -0
  505. package/dist/server/locales/ja/worktree.json +4 -0
  506. package/dist/server/server.js +20 -1
  507. package/dist/server/src/config/auto-yes-config.js +11 -0
  508. package/dist/server/src/lib/auto-yes-lifecycle.js +28 -2
  509. package/dist/server/src/lib/auto-yes-poller.js +345 -28
  510. package/dist/server/src/lib/auto-yes-shutdown-record.js +257 -0
  511. package/dist/server/src/lib/auto-yes-state.js +197 -4
  512. package/dist/server/src/lib/cli-tools/antigravity-startup-trust.js +135 -0
  513. package/dist/server/src/lib/cli-tools/antigravity.js +162 -29
  514. package/dist/server/src/lib/cli-tools/command-code.js +10 -2
  515. package/dist/server/src/lib/cli-tools/copilot.js +21 -10
  516. package/dist/server/src/lib/cli-tools/gemini.js +60 -13
  517. package/dist/server/src/lib/cli-tools/launch-dialog.js +203 -0
  518. package/dist/server/src/lib/cli-tools/launch-window.js +96 -0
  519. package/dist/server/src/lib/detection/selection-shape.js +35 -1
  520. package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
  521. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
  522. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
  523. package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
  524. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
  525. package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
  526. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
  527. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
  528. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
  529. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
  530. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
  531. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
  532. package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
  533. package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
  534. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
  535. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +18 -1
  536. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
  537. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
  538. package/dist/server/src/lib/polling/response-checker.js +9 -0
  539. package/dist/server/src/lib/polling/response-poller-core.js +136 -104
  540. package/dist/server/src/lib/prompt-observation/kinds.js +123 -0
  541. package/dist/server/src/lib/prompt-observation/types.js +14 -0
  542. package/dist/server/src/lib/push/prompt-push-gate.js +195 -3
  543. package/dist/server/src/lib/push/waiting-push-notifier.js +74 -7
  544. package/dist/server/src/lib/relay/relay-delivery-claims.js +46 -0
  545. package/dist/server/src/lib/relay/relay-delivery.js +76 -30
  546. package/dist/server/src/lib/schedule-manager.js +28 -0
  547. package/dist/server/src/lib/session/cli-session.js +38 -3
  548. package/dist/server/src/lib/session/send-attempt-state.js +155 -0
  549. package/dist/server/src/lib/session/send-attempt-types.js +17 -0
  550. package/dist/server/src/lib/session/send-user-message.js +46 -0
  551. package/dist/server/src/lib/session/worktree-session-reconcile.js +2 -1
  552. package/dist/server/src/lib/tmux/session-created-signal.js +76 -0
  553. package/dist/server/src/lib/tmux/tmux-capture-cache.js +58 -6
  554. package/dist/server/src/lib/tmux/tmux.js +4 -0
  555. package/dist/server/src/lib/verification/scope-gate-format.js +100 -0
  556. package/dist/server/src/lib/verification/scope-gate-glob.js +185 -0
  557. package/dist/server/src/lib/verification/scope-gate.js +19 -271
  558. package/dist/server/src/lib/ws-server.js +48 -6
  559. package/docs/en/user-guide/cli-setup-guide.md +12 -1
  560. package/docs/en/user-guide/webapp-guide.md +2 -0
  561. package/package.json +1 -1
  562. package/release-notes/0.47.0.json +118 -0
  563. package/.next/server/chunks/1789.js +0 -1
  564. package/.next/server/chunks/2908.js +0 -1
  565. package/.next/server/chunks/2984.js +0 -25
  566. package/.next/server/chunks/3718.js +0 -1
  567. package/.next/server/chunks/4837.js +0 -14
  568. package/.next/server/chunks/611.js +0 -1
  569. package/.next/server/chunks/850.js +0 -1
  570. package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
  571. package/.next/static/chunks/5371-0dc947683e46e78c.js +0 -1
  572. package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
  573. package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
  574. package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
  575. package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
  576. package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
  577. package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
  578. package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
  579. package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
  580. package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
  581. package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
  582. package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
  583. package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
  584. package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
  585. package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
  586. package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
  587. package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
  588. package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
  589. package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
  590. package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
  591. package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
  592. package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
  593. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
  594. package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
  595. package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
  596. package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
  597. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
  598. package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
  599. package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
  600. package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
  601. package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
  602. package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
  603. package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
  604. package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
  605. package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
  606. package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
  607. package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
  608. package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
  609. package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
  610. package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
  611. package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
  612. package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
  613. package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
  614. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
  615. package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
  616. package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
  617. package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
  618. package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
  619. package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
  647. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
  648. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
  649. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
  650. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
  651. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
  670. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
  671. package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
  672. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
  673. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
  674. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
  675. package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
  676. package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
  677. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
  678. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
  679. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
  680. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
  681. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
  682. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
  683. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
  684. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
  685. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
  699. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
  700. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
  701. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
  702. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
  703. package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
  704. package/.next/static/chunks/app/layout-3e357690446cd2da.js +0 -1
  705. package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +0 -1
  706. package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +0 -1
  707. package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +0 -1
  708. package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +0 -1
  709. package/.next/static/chunks/app/worktrees/[id]/page-effbf0796881dd5a.js +0 -1
  710. /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
  711. /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
@@ -533,6 +533,135 @@ function splitPollerKey(pollerKey) {
533
533
  instanceId: pollerKey.slice(separatorIndex + 1),
534
534
  };
535
535
  }
536
+ /** Old worktree ID -> new worktree ID, skipping empty and no-op pairs. */
537
+ function collectRenameTargets(renames) {
538
+ const targets = new Map();
539
+ for (const { oldId, newId } of renames) {
540
+ if (!oldId || !newId || oldId === newId)
541
+ continue;
542
+ targets.set(oldId, newId);
543
+ }
544
+ return targets;
545
+ }
546
+ /** Sort every running poller under a renamed ID into a move or an abandoned stop. */
547
+ function planRunningPollerMoves(targets, resolveCliToolId) {
548
+ const moves = [];
549
+ const abandoned = [];
550
+ for (const pollerKey of Array.from(exports.activePollers.keys())) {
551
+ const parts = splitPollerKey(pollerKey);
552
+ if (!parts)
553
+ continue;
554
+ const newWorktreeId = targets.get(parts.worktreeId);
555
+ if (!newWorktreeId)
556
+ continue;
557
+ const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
558
+ if (!cliToolId) {
559
+ abandoned.push({ pollerKey, newWorktreeId });
560
+ continue;
561
+ }
562
+ moves.push({
563
+ oldKey: pollerKey,
564
+ newKey: getPollerKey(newWorktreeId, cliToolId, parts.instanceId),
565
+ newWorktreeId,
566
+ cliToolId,
567
+ instanceId: parts.instanceId,
568
+ });
569
+ }
570
+ return { moves, abandoned };
571
+ }
572
+ /** Phase 1 of the migration for the moved pollers (see the caller). */
573
+ function liftMovedPollers(moves, carried) {
574
+ for (const move of moves) {
575
+ const timerId = exports.activePollers.get(move.oldKey);
576
+ if (timerId)
577
+ clearTimeout(timerId);
578
+ exports.activePollers.delete(move.oldKey);
579
+ // Issue #2223: retire the ownership token as well. A tick that is inside
580
+ // `checkForResponse()` right now cannot be cancelled by `clearTimeout`, and
581
+ // without this it would resume, find its key gone and — before #2223 —
582
+ // still be able to act on the old worktree ID. Marked superseded rather
583
+ // than merely stopped: Phase 2 below arms a replacement chain, so the old
584
+ // tick's snapshot would land on top of the new one's.
585
+ const retired = coordinator.owners.get(move.oldKey);
586
+ if (retired) {
587
+ retired.superseded = true;
588
+ retired.stopped = true;
589
+ coordinator.owners.delete(move.oldKey);
590
+ }
591
+ coordinator.pendingRestart.delete(move.oldKey);
592
+ carried.set(move.newKey, { startedAt: exports.pollingStartTimes.get(move.oldKey) });
593
+ exports.pollingStartTimes.delete(move.oldKey);
594
+ (0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
595
+ }
596
+ }
597
+ /** The paused chains under a renamed ID, keyed old -> new (see the caller). */
598
+ function collectPausedMoves(targets) {
599
+ const pausedMoves = [];
600
+ for (const pollerKey of Array.from(coordinator.pausedOnPrompt)) {
601
+ const parts = splitPollerKey(pollerKey);
602
+ if (!parts)
603
+ continue;
604
+ const newWorktreeId = targets.get(parts.worktreeId);
605
+ if (!newWorktreeId)
606
+ continue;
607
+ pausedMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}` });
608
+ }
609
+ return pausedMoves;
610
+ }
611
+ /** The held scrapes under a renamed ID, keyed old -> new (see the caller). */
612
+ function collectPendingMoves(targets, abandonedKeys) {
613
+ const pendingMoves = [];
614
+ for (const pollerKey of (0, pending_scraped_response_1.listPendingScrapedResponseKeys)()) {
615
+ if (abandonedKeys.has(pollerKey))
616
+ continue;
617
+ const parts = splitPollerKey(pollerKey);
618
+ if (!parts)
619
+ continue;
620
+ const newWorktreeId = targets.get(parts.worktreeId);
621
+ if (!newWorktreeId)
622
+ continue;
623
+ pendingMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}`, newWorktreeId });
624
+ }
625
+ return pendingMoves;
626
+ }
627
+ /** Stop the chains on destinations that no source vacates (see the caller). */
628
+ function stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys) {
629
+ const vacated = new Set([
630
+ ...moves.map((move) => move.oldKey),
631
+ ...pausedMoves.map((move) => move.oldKey),
632
+ ...pendingMoves.map((move) => move.oldKey),
633
+ ]);
634
+ // A held scrape moved on its own (no chain, no pause) changes the key's
635
+ // owner just the same, so its destination is handled alike (#3663 review).
636
+ const occupied = new Set([
637
+ ...moves.map((move) => move.newKey),
638
+ ...pausedMoves.map((move) => move.newKey),
639
+ ...pendingMoves.map((move) => move.newKey),
640
+ ]);
641
+ for (const pollerKey of occupied) {
642
+ if (vacated.has(pollerKey) || abandonedKeys.has(pollerKey))
643
+ continue;
644
+ const held = coordinator.owners.has(pollerKey) ||
645
+ exports.activePollers.has(pollerKey) ||
646
+ coordinator.pausedOnPrompt.has(pollerKey) ||
647
+ (0, pending_scraped_response_1.hasPendingScrapedResponse)(pollerKey);
648
+ if (!held)
649
+ continue;
650
+ stopPollingByKey(pollerKey);
651
+ logger.warn('poller:migrate-displaced', { pollerKey });
652
+ }
653
+ }
654
+ /** Phase 2 of the migration: restart each moved poller (see the caller). */
655
+ function restartMovedPollers(moves, carried) {
656
+ for (const move of moves) {
657
+ const startedAt = carried.get(move.newKey)?.startedAt;
658
+ exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
659
+ if (isFullScreenTui(move.cliToolId)) {
660
+ (0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
661
+ }
662
+ scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
663
+ }
664
+ }
536
665
  /**
537
666
  * Move every running response poller from a renamed worktree ID to the new one
538
667
  * (Issue #1621 Phase 3).
@@ -585,36 +714,10 @@ function splitPollerKey(pollerKey) {
585
714
  * @returns One entry per poller that was moved
586
715
  */
587
716
  function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
588
- const targets = new Map();
589
- for (const { oldId, newId } of renames) {
590
- if (!oldId || !newId || oldId === newId)
591
- continue;
592
- targets.set(oldId, newId);
593
- }
717
+ const targets = collectRenameTargets(renames);
594
718
  if (targets.size === 0)
595
719
  return [];
596
- const moves = [];
597
- const abandoned = [];
598
- for (const pollerKey of Array.from(exports.activePollers.keys())) {
599
- const parts = splitPollerKey(pollerKey);
600
- if (!parts)
601
- continue;
602
- const newWorktreeId = targets.get(parts.worktreeId);
603
- if (!newWorktreeId)
604
- continue;
605
- const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
606
- if (!cliToolId) {
607
- abandoned.push({ pollerKey, newWorktreeId });
608
- continue;
609
- }
610
- moves.push({
611
- oldKey: pollerKey,
612
- newKey: getPollerKey(newWorktreeId, cliToolId, parts.instanceId),
613
- newWorktreeId,
614
- cliToolId,
615
- instanceId: parts.instanceId,
616
- });
617
- }
720
+ const { moves, abandoned } = planRunningPollerMoves(targets, resolveCliToolId);
618
721
  // Phase 1: stop every affected timer and lift the state off the old keys.
619
722
  // Done for the whole batch before any write so a swap cannot self-collide.
620
723
  const carried = new Map();
@@ -628,28 +731,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
628
731
  const inFlight = coordinator.running.get(move.oldKey);
629
732
  return inFlight !== undefined && inFlight.owner === coordinator.owners.get(move.oldKey);
630
733
  });
631
- for (const move of moves) {
632
- const timerId = exports.activePollers.get(move.oldKey);
633
- if (timerId)
634
- clearTimeout(timerId);
635
- exports.activePollers.delete(move.oldKey);
636
- // Issue #2223: retire the ownership token as well. A tick that is inside
637
- // `checkForResponse()` right now cannot be cancelled by `clearTimeout`, and
638
- // without this it would resume, find its key gone and — before #2223 —
639
- // still be able to act on the old worktree ID. Marked superseded rather
640
- // than merely stopped: Phase 2 below arms a replacement chain, so the old
641
- // tick's snapshot would land on top of the new one's.
642
- const retired = coordinator.owners.get(move.oldKey);
643
- if (retired) {
644
- retired.superseded = true;
645
- retired.stopped = true;
646
- coordinator.owners.delete(move.oldKey);
647
- }
648
- coordinator.pendingRestart.delete(move.oldKey);
649
- carried.set(move.newKey, { startedAt: exports.pollingStartTimes.get(move.oldKey) });
650
- exports.pollingStartTimes.delete(move.oldKey);
651
- (0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
652
- }
734
+ liftMovedPollers(moves, carried);
653
735
  // Stop the abandoned pollers before any dedup state is written: the stop
654
736
  // clears every cache under its key, and that key can be the destination of
655
737
  // another move in this batch (A:x paused → B:x while B:x is abandoned).
@@ -670,31 +752,11 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
670
752
  // never see it — but it is holding the response hash for the turn it paused
671
753
  // on, and `/respond` will resume it under the NEW ID. Move the hash and the
672
754
  // pause mark with it; the chain itself stays paused until that resume.
673
- const pausedMoves = [];
674
- for (const pollerKey of Array.from(coordinator.pausedOnPrompt)) {
675
- const parts = splitPollerKey(pollerKey);
676
- if (!parts)
677
- continue;
678
- const newWorktreeId = targets.get(parts.worktreeId);
679
- if (!newWorktreeId)
680
- continue;
681
- pausedMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}` });
682
- }
755
+ const pausedMoves = collectPausedMoves(targets);
683
756
  // Issue #3663: every held scrape under a renamed worktree ID moves — a
684
757
  // running chain's, a paused chain's, and one whose chain is already gone.
685
758
  // The abandoned ones were written above and are no longer held.
686
- const pendingMoves = [];
687
- for (const pollerKey of (0, pending_scraped_response_1.listPendingScrapedResponseKeys)()) {
688
- if (abandonedKeys.has(pollerKey))
689
- continue;
690
- const parts = splitPollerKey(pollerKey);
691
- if (!parts)
692
- continue;
693
- const newWorktreeId = targets.get(parts.worktreeId);
694
- if (!newWorktreeId)
695
- continue;
696
- pendingMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}`, newWorktreeId });
697
- }
759
+ const pendingMoves = collectPendingMoves(targets, abandonedKeys);
698
760
  // Issue #3663: a destination a chain (running or paused) moves onto, that no
699
761
  // source of this batch vacates, may already be held by another chain — B:x
700
762
  // running while A:x moves to B:x. That chain loses the key, so it is stopped
@@ -703,30 +765,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
703
765
  // no longer hold or drop anything, and its caches are cleared before the
704
766
  // moved state is written. A destination nothing is on is left alone, and so
705
767
  // is every other instance of the destination worktree.
706
- const vacated = new Set([
707
- ...moves.map((move) => move.oldKey),
708
- ...pausedMoves.map((move) => move.oldKey),
709
- ...pendingMoves.map((move) => move.oldKey),
710
- ]);
711
- // A held scrape moved on its own (no chain, no pause) changes the key's
712
- // owner just the same, so its destination is handled alike (#3663 review).
713
- const occupied = new Set([
714
- ...moves.map((move) => move.newKey),
715
- ...pausedMoves.map((move) => move.newKey),
716
- ...pendingMoves.map((move) => move.newKey),
717
- ]);
718
- for (const pollerKey of occupied) {
719
- if (vacated.has(pollerKey) || abandonedKeys.has(pollerKey))
720
- continue;
721
- const held = coordinator.owners.has(pollerKey) ||
722
- exports.activePollers.has(pollerKey) ||
723
- coordinator.pausedOnPrompt.has(pollerKey) ||
724
- (0, pending_scraped_response_1.hasPendingScrapedResponse)(pollerKey);
725
- if (!held)
726
- continue;
727
- stopPollingByKey(pollerKey);
728
- logger.warn('poller:migrate-displaced', { pollerKey });
729
- }
768
+ stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys);
730
769
  // Issue #3553: the dedup state of the whole batch moves in one call per map
731
770
  // family, each lifting every source before writing any destination. Re-keyed
732
771
  // pair by pair, a swap left A with its own state and B empty.
@@ -766,14 +805,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
766
805
  : [];
767
806
  }));
768
807
  // Phase 2: restart each poller under its new identity.
769
- for (const move of moves) {
770
- const startedAt = carried.get(move.newKey)?.startedAt;
771
- exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
772
- if (isFullScreenTui(move.cliToolId)) {
773
- (0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
774
- }
775
- scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
776
- }
808
+ restartMovedPollers(moves, carried);
777
809
  // Issue #2230: the pause marks of the chains collected above follow their
778
810
  // hashes (moved with the batch). All removed before any is added, for the
779
811
  // same swap reason.
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ /**
3
+ * The screen kinds a prompt observation publishes (Issue #3755, #3746 A-3).
4
+ *
5
+ * ## Why a vocabulary of its own
6
+ *
7
+ * `promptData.type` (`yes_no` / `multiple_choice` / `unclassified`) says how a
8
+ * parsed prompt is answered, and agy's status detector
9
+ * (`detection/tools/antigravity/detect.ts`) publishes the folder-trust screen,
10
+ * the `/model` picker and the slash popup under ONE reason
11
+ * (`antigravity_selection_list`). Neither can say "this is the trust screen and
12
+ * not the picker", which is exactly what a caller about to answer one of them
13
+ * has to be sure of (#3746 P4-1). So the values a caller may branch on — and
14
+ * that the strict `respond` (#3756) may make a send condition — live here, and
15
+ * are never mixed into `promptData.type` or read back from the detector's
16
+ * reason.
17
+ *
18
+ * A kind is added only for a screen whose reading is pinned to a measured
19
+ * frame. Everything else that waits on a human is `unknown`: an unmeasured
20
+ * screen must not borrow a measured screen's name.
21
+ *
22
+ * ## No imports, on purpose
23
+ *
24
+ * The CLI (`tsconfig.cli.json`) compiles with `"paths": {}` and reaches a
25
+ * module under `src/lib` only by a relative path whose graph uses no `@/`
26
+ * alias (the arrangement `lib/session/prompt-view` documents). `prompt` and
27
+ * `wait` import these values from here rather than restating them.
28
+ *
29
+ * @module lib/prompt-observation/kinds
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.EXITING_STRICT_ANSWERS = exports.UNNUMBERED_STRICT_RESPOND_KINDS = exports.STRICT_RESPOND_KINDS = exports.NO_PROMPT_OBSERVATION_KINDS = exports.PROMPT_OBSERVATION_KINDS = exports.PROMPT_OBSERVATION_SCHEMA_VERSION = void 0;
33
+ exports.isPromptObservationKind = isPromptObservationKind;
34
+ exports.isDecisionKind = isDecisionKind;
35
+ exports.isStrictRespondKind = isStrictRespondKind;
36
+ exports.isExitingStrictAnswer = isExitingStrictAnswer;
37
+ /** `schemaVersion` of the observation payload. Bumped when a field changes meaning. */
38
+ exports.PROMPT_OBSERVATION_SCHEMA_VERSION = 1;
39
+ /**
40
+ * Every kind an observation can publish.
41
+ *
42
+ * - `antigravity-trust` — agy's first-run folder trust screen (`Do you trust
43
+ * the contents of this project?` over `> Yes, I trust this folder` /
44
+ * `No, exit`). Unnumbered; Enter confirms the highlighted row.
45
+ * - `antigravity-model-picker` — agy's `/model` picker (`Switch Model`): the
46
+ * 1.1.27 layout (`antigravity-live-2364/picker-switch-model.txt`) and the
47
+ * 1.4 one with a search box (`prompt-observation-3797/`, Issue #3797).
48
+ * - `antigravity-permission` — agy's numbered permission dialog (command
49
+ * execution, file creation; `tests/fixtures/antigravity-live-2364/dialog-*`),
50
+ * ending on its `tab Amend` footer. agy's numbered login-method screen is
51
+ * not one (`unknown`).
52
+ * - `antigravity-slash-menu` — agy's slash-command popup.
53
+ * - `composer` — no confirmation: the agent sits at its input box.
54
+ * - `none` — no confirmation, and not at the input box either (working).
55
+ * - `unknown` — something waits on a human and no measured reading names it.
56
+ */
57
+ exports.PROMPT_OBSERVATION_KINDS = [
58
+ 'antigravity-trust',
59
+ 'antigravity-model-picker',
60
+ 'antigravity-permission',
61
+ 'antigravity-slash-menu',
62
+ 'composer',
63
+ 'none',
64
+ 'unknown',
65
+ ];
66
+ /** The two kinds that mean "nothing on screen is asking for a decision". */
67
+ exports.NO_PROMPT_OBSERVATION_KINDS = ['composer', 'none'];
68
+ /** Whether `value` is one of {@link PROMPT_OBSERVATION_KINDS}. */
69
+ function isPromptObservationKind(value) {
70
+ return typeof value === 'string' && exports.PROMPT_OBSERVATION_KINDS.includes(value);
71
+ }
72
+ /** Whether `kind` is a screen that asks for a decision (neither `composer` nor `none`). */
73
+ function isDecisionKind(kind) {
74
+ return !exports.NO_PROMPT_OBSERVATION_KINDS.includes(kind);
75
+ }
76
+ /**
77
+ * The kinds the strict `respond` (Issue #3756) answers. Every other kind is
78
+ * refused before a key: the `/model` picker's effort slider is not read, the
79
+ * slash popup is a menu of the composer, and `unknown` is never answered.
80
+ */
81
+ exports.STRICT_RESPOND_KINDS = ['antigravity-trust', 'antigravity-permission'];
82
+ /** Whether `kind` is one of {@link STRICT_RESPOND_KINDS}. */
83
+ function isStrictRespondKind(kind) {
84
+ return typeof kind === 'string' && exports.STRICT_RESPOND_KINDS.includes(kind);
85
+ }
86
+ /**
87
+ * Strict kinds whose rows carry no number: answered only by a label, which is
88
+ * sent as ↑/↓ and Enter. An option number or `--default` is refused there.
89
+ */
90
+ exports.UNNUMBERED_STRICT_RESPOND_KINDS = ['antigravity-trust'];
91
+ /**
92
+ * Per strict kind, the answer whose consequence is the agent exiting (Issue
93
+ * #3788): its 1-based position, valid only on a screen that shows exactly
94
+ * `optionCount` options AND whose row at that position reads `label`. agy's
95
+ * trust screen offers `Yes, I trust this folder` then `No, exit` (measured:
96
+ * `tests/fixtures/prompt-observation-3755/antigravity-trust.txt`,
97
+ * `antigravity-live-2364/trust-dialog.txt`), and agy exits on the second.
98
+ *
99
+ * The three conditions only narrow: a screen drawn in another order, with
100
+ * another number of rows, or with another wording has no exiting answer, and
101
+ * its outcome stays `indeterminate` (exit 41).
102
+ *
103
+ * Only after such an answer may a shell back in front of the pane be read as
104
+ * the session having ended: after any other answer it is the agent falling
105
+ * over (a crash, a failed start), which the answer did not ask for. A kind
106
+ * absent here has no exiting answer.
107
+ */
108
+ exports.EXITING_STRICT_ANSWERS = {
109
+ // eslint-disable-next-line no-restricted-syntax -- agy's drawn option row, matched against the screen, not display text
110
+ 'antigravity-trust': { position: 2, optionCount: 2, label: 'No, exit' },
111
+ };
112
+ /**
113
+ * Whether answering option `position` (1-based) of a `kind` screen showing
114
+ * `options` (labels in draw order) exits the agent: the declared position, the
115
+ * declared number of options, and the declared label at that position (runs of
116
+ * spaces folded, ends trimmed; case kept).
117
+ */
118
+ function isExitingStrictAnswer(kind, position, options) {
119
+ const exiting = exports.EXITING_STRICT_ANSWERS[kind];
120
+ if (exiting === undefined || exiting.position !== position || exiting.optionCount !== options.length)
121
+ return false;
122
+ return options[position - 1].replace(/\s+/g, ' ').trim() === exiting.label;
123
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ /**
3
+ * The payload of one prompt observation (Issue #3755): what
4
+ * `GET /api/worktrees/:id/current-output?observe=1` adds as `promptObservation`,
5
+ * what `commandmate prompt --json` prints, and what `commandmate wait` adds to
6
+ * its exit-10 payload as `observation`.
7
+ *
8
+ * Types only, and importable from the CLI for the reason `./kinds` gives: the
9
+ * two imports outside this directory (`polling/auto-yes-suppression-reason`,
10
+ * `session/send-attempt-types`) have no imports of their own.
11
+ *
12
+ * @module lib/prompt-observation/types
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -56,6 +56,43 @@
56
56
  * it resolves in seconds, and the reminder below is what catches it when it
57
57
  * does not.
58
58
  *
59
+ * ## "About to answer" has a deadline (Issue #3757)
60
+ *
61
+ * Nothing recorded is not proof that Auto-Yes is answering. A screen the poller
62
+ * cannot read at all (agy's folder-trust screen was the measured case: the
63
+ * poller read no prompt, so it recorded nothing) looked exactly like the
64
+ * common case above, and the wait was held silent until the ten-minute
65
+ * reminder. So the hold lasts {@link AUTO_YES_ANSWER_GRACE_MS} — time for the
66
+ * poller to answer or to record why it did not — and a wait still open after
67
+ * that notifies as `auto-yes-not-answered`. `waiting-push-notifier` asks again
68
+ * when the hold ends.
69
+ *
70
+ * The hold is NOT counted from `waitingSince`. That is the wait's identity,
71
+ * not when anyone saw it: it can be a hook's timestamp older than the probe
72
+ * that opened the edge, and it stays frozen across several prompts of one
73
+ * episode. It is counted from {@link autoYesHoldStartedAt}: the later of the
74
+ * moment the gate first held this episode and the poller's last answer, so a
75
+ * second prompt right after an answer gets a full hold of its own. Both
76
+ * producers ask through {@link decideAndLogPromptPush} and share that origin.
77
+ *
78
+ * ## The hold reaches the session wait's tick (Issue #3791)
79
+ *
80
+ * The 9 s assume the poller's next tick is at most a cooldown away. Its ticks
81
+ * are a poll interval, a cooldown or the thinking interval (5 s) apart — inside
82
+ * the 9 s — with two exceptions. An error backoff (up to `MAX_BACKOFF_MS`) is
83
+ * not waited for: a poller failing in a row is the least likely to answer, and
84
+ * a broken Auto-Yes is when a human most needs the notification. The session
85
+ * wait is: a capture that found no session puts the next tick `MAX_BACKOFF_MS`
86
+ * away, and a session started meanwhile (`send --auto-yes` enables Auto-Yes
87
+ * before the session exists) gets its first prompt answered on that tick. So
88
+ * when the hold begins while that tick is pending, it lasts until the tick plus
89
+ * two ticks (answer, or the Enter fallback's second look):
90
+ * {@link autoYesHoldEndsAt}. The tick is read once, and only counts while the
91
+ * poller that scheduled it is still the one running — a poller stopped or
92
+ * replaced meanwhile will not tick. Issue #3796: the session's creation brings
93
+ * that tick forward to a poll interval, and the hold follows it — the tick is
94
+ * only ever read earlier than it was when the hold began.
95
+ *
59
96
  * ## The reminder is never muted
60
97
  *
61
98
  * `runEscalationTick` has already established that the wait is still open — it
@@ -71,12 +108,141 @@
71
108
  * @module lib/push/prompt-push-gate
72
109
  */
73
110
  Object.defineProperty(exports, "__esModule", { value: true });
111
+ exports.AUTO_YES_HOLD_MAX_AGE_MS = exports.AUTO_YES_ANSWER_AFTER_TICK_MS = exports.AUTO_YES_ANSWER_GRACE_MS = void 0;
112
+ exports.autoYesHoldStartedAt = autoYesHoldStartedAt;
113
+ exports.autoYesHoldEndsAt = autoYesHoldEndsAt;
114
+ exports.forgetAutoYesHold = forgetAutoYesHold;
115
+ exports.clearAutoYesHolds = clearAutoYesHolds;
74
116
  exports.decidePromptPush = decidePromptPush;
75
117
  exports.isPromptPushSuppressed = isPromptPushSuppressed;
118
+ exports.decideAndLogPromptPush = decideAndLogPromptPush;
76
119
  const auto_yes_state_1 = require("../../lib/auto-yes-state");
77
120
  const logger_1 = require("../../lib/logger");
78
121
  const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
122
+ const global_state_1 = require("../../lib/global-state");
79
123
  const logger = (0, logger_1.createLogger)('push/prompt-gate');
124
+ /**
125
+ * How long a wait with nothing recorded about it is held as "Auto-Yes is
126
+ * answering" (Issue #3757), from {@link autoYesHoldStartedAt}. The poller
127
+ * answers a prompt it can read on the tick that sees it and records a reason
128
+ * on the same tick when it will not, but that tick can be a cooldown away
129
+ * (`COOLDOWN_INTERVAL_MS` after an answer, as long while thinking), and the
130
+ * Enter fallback needs one more tick: a cooldown plus two ticks, 9 s.
131
+ */
132
+ exports.AUTO_YES_ANSWER_GRACE_MS = Math.max(3 * auto_yes_state_1.POLLING_INTERVAL_MS, auto_yes_state_1.COOLDOWN_INTERVAL_MS + 2 * auto_yes_state_1.POLLING_INTERVAL_MS);
133
+ /** compositeKey -> the hold of that session's current episode. globalThis per #1736. */
134
+ const autoYesHolds = (0, global_state_1.getOrInitGlobal)('__promptPushAutoYesHolds', () => new Map());
135
+ /**
136
+ * Where this wait's `auto-yes-answering` hold is counted from (Issue #3757):
137
+ * the later of the moment the gate first held this episode (recorded here on
138
+ * the first call) and the Auto-Yes poller's last answer to this session.
139
+ *
140
+ * The poller's answer is read off its state on `globalThis`
141
+ * (`__autoYesPollerStates`, `lastServerResponseTimestamp`) rather than through
142
+ * `auto-yes-poller`, which imports `response-checker`, which imports this gate.
143
+ *
144
+ * @param now - Epoch ms of the decision; recorded as the start of a new hold
145
+ */
146
+ function autoYesHoldStartedAt(input, now) {
147
+ const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
148
+ sweepStaleAutoYesHolds(now);
149
+ let hold = autoYesHolds.get(key);
150
+ if (hold === undefined || hold.since !== input.waitingSince) {
151
+ hold = { since: input.waitingSince, firstHeldAt: now, sessionWaitTick: pendingSessionWaitTick(key, now) };
152
+ autoYesHolds.set(key, hold);
153
+ }
154
+ // Issue #3770: Auto-Yes switched off and on again inside one episode starts a
155
+ // fresh hold; the old origin would read the poller's silence while it was off
156
+ // as "did not answer".
157
+ const enabledAt = (0, auto_yes_state_1.getAutoYesState)(input.worktreeId, input.cliToolId, input.instanceId)?.enabledAt;
158
+ if (enabledAt !== undefined && enabledAt > hold.firstHeldAt && enabledAt <= now)
159
+ hold.firstHeldAt = enabledAt;
160
+ const lastAnswer = globalThis.__autoYesPollerStates?.get(key)?.lastServerResponseTimestamp ?? null;
161
+ return lastAnswer !== null ? Math.max(hold.firstHeldAt, lastAnswer) : hold.firstHeldAt;
162
+ }
163
+ /**
164
+ * How long after the poller's tick the hold still lasts (Issue #3791): that
165
+ * tick answers, or records why not, and the Enter fallback answers on the tick
166
+ * after it — the "two ticks" of {@link AUTO_YES_ANSWER_GRACE_MS}.
167
+ */
168
+ exports.AUTO_YES_ANSWER_AFTER_TICK_MS = 2 * auto_yes_state_1.POLLING_INTERVAL_MS;
169
+ /**
170
+ * The Auto-Yes poller's pending session-wait tick (Issue #3791), read off its
171
+ * state on `globalThis` for the same reason as `lastServerResponseTimestamp`.
172
+ * Only a tick due after `now`, and no further than the session wait puts it.
173
+ */
174
+ function pendingSessionWaitTick(key, now) {
175
+ const poller = globalThis.__autoYesPollerStates?.get(key);
176
+ const at = poller?.sessionWaitTickAt;
177
+ if (poller === undefined || at === undefined || at <= now)
178
+ return undefined;
179
+ return { at: Math.min(at, now + auto_yes_state_1.MAX_BACKOFF_MS), poller, heldAt: now };
180
+ }
181
+ /**
182
+ * Issue #3796: when the session wait's tick the hold counts on actually comes.
183
+ * The tick read when the hold began, brought forward when the poller ticked
184
+ * early — its session was created, and it rescheduled the tick a poll interval
185
+ * away (`sessionWaitTickAt`), or already ran it (`sessionWaitTickRanAt`,
186
+ * `sessionAppearedAt`) — only times since the hold began count. Only
187
+ * ever earlier: a session wait scheduled after the hold began does not extend
188
+ * it (#3791).
189
+ */
190
+ function effectiveSessionWaitTickAt(tick) {
191
+ let at = tick.at;
192
+ for (const t of [tick.poller.sessionWaitTickAt, tick.poller.sessionWaitTickRanAt, tick.poller.sessionAppearedAt]) {
193
+ if (t !== undefined && t >= tick.heldAt && t < at)
194
+ at = t;
195
+ }
196
+ return at;
197
+ }
198
+ /**
199
+ * When this wait's `auto-yes-answering` hold ends (Issue #3791): a full
200
+ * {@link AUTO_YES_ANSWER_GRACE_MS} after {@link autoYesHoldStartedAt}, and not
201
+ * before {@link AUTO_YES_ANSWER_AFTER_TICK_MS} past the session wait's tick
202
+ * pending when the hold began — while the poller that scheduled it still runs.
203
+ *
204
+ * @param now - Epoch ms of the decision; recorded as the start of a new hold
205
+ */
206
+ function autoYesHoldEndsAt(input, now) {
207
+ const startedAt = autoYesHoldStartedAt(input, now);
208
+ const key = (0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId);
209
+ const tick = autoYesHolds.get(key)?.sessionWaitTick;
210
+ const graceEndsAt = startedAt + exports.AUTO_YES_ANSWER_GRACE_MS;
211
+ // A poller stopped or replaced since (disable, off → on) will not tick.
212
+ if (tick === undefined || globalThis.__autoYesPollerStates?.get(key) !== tick.poller)
213
+ return graceEndsAt;
214
+ // Kept on the hold: an earlier tick once adopted is not lost when the poller
215
+ // later reschedules (an ordinary tick after a failed capture, a new session
216
+ // wait) — the hold never moves back out.
217
+ tick.at = effectiveSessionWaitTickAt(tick);
218
+ return Math.max(graceEndsAt, tick.at + exports.AUTO_YES_ANSWER_AFTER_TICK_MS);
219
+ }
220
+ /** A hold older than this is dropped (Issue #3770): its episode is long over. */
221
+ exports.AUTO_YES_HOLD_MAX_AGE_MS = 60 * 60 * 1000;
222
+ function sweepStaleAutoYesHolds(now) {
223
+ for (const [key, hold] of autoYesHolds) {
224
+ if (now - hold.firstHeldAt >= exports.AUTO_YES_HOLD_MAX_AGE_MS)
225
+ autoYesHolds.delete(key);
226
+ }
227
+ }
228
+ /**
229
+ * Drop the hold of one session (Issue #3770): Auto-Yes went off, or the
230
+ * episode closed.
231
+ *
232
+ * @param since - Issue #3776: drop it only when it is this episode's hold. A
233
+ * caller retiring one episode must not take the next episode's origin with it
234
+ * (that hold would start over, and its notification come up to a hold late).
235
+ * Omitted, the session's hold goes whatever its episode.
236
+ */
237
+ function forgetAutoYesHold(key, since) {
238
+ if (since !== undefined && autoYesHolds.get(key)?.since !== since)
239
+ return;
240
+ autoYesHolds.delete(key);
241
+ }
242
+ /** Forget every hold. Test seam. */
243
+ function clearAutoYesHolds() {
244
+ autoYesHolds.clear();
245
+ }
80
246
  /**
81
247
  * Decide whether this prompt notification is worth a human's attention.
82
248
  *
@@ -97,6 +263,10 @@ function decidePromptPush(input) {
97
263
  if (input.escalated === true) {
98
264
  return { suppress: false, reason: 'escalation-reminder' };
99
265
  }
266
+ const holdEndsAt = input.holdEndsAt ?? (input.holdStartedAt !== undefined ? input.holdStartedAt + exports.AUTO_YES_ANSWER_GRACE_MS : undefined);
267
+ if (holdEndsAt !== undefined && (input.now ?? Date.now()) >= holdEndsAt) {
268
+ return { suppress: false, reason: 'auto-yes-not-answered' };
269
+ }
100
270
  return { suppress: true, reason: 'auto-yes-answering' };
101
271
  }
102
272
  /**
@@ -111,7 +281,23 @@ function decidePromptPush(input) {
111
281
  * so the line is only there for the "why did this one ring?" question.
112
282
  */
113
283
  function isPromptPushSuppressed(input) {
114
- const decision = decidePromptPush(input);
284
+ return decideAndLogPromptPush(input).suppress;
285
+ }
286
+ /**
287
+ * {@link isPromptPushSuppressed}, with the whole decision handed back — for the
288
+ * caller that has to ask again when an `auto-yes-answering` hold ends
289
+ * (`waiting-push-notifier`, Issue #3757).
290
+ */
291
+ function decideAndLogPromptPush(input, options = {}) {
292
+ let decision = decidePromptPush(input);
293
+ if (decision.reason === 'auto-yes-inactive') {
294
+ forgetAutoYesHold((0, auto_yes_state_1.buildCompositeKey)(input.worktreeId, input.cliToolId, input.instanceId));
295
+ }
296
+ // Issue #3757: only a wait that reached the hold gets an origin recorded.
297
+ if (decision.reason === 'auto-yes-answering' && input.holdStartedAt === undefined && input.holdEndsAt === undefined) {
298
+ const now = input.now ?? Date.now();
299
+ decision = decidePromptPush({ ...input, now, holdEndsAt: autoYesHoldEndsAt(input, now) });
300
+ }
115
301
  const context = {
116
302
  worktreeId: input.worktreeId,
117
303
  cliToolId: input.cliToolId,
@@ -122,9 +308,15 @@ function isPromptPushSuppressed(input) {
122
308
  ...(decision.stopReason !== undefined ? { stopReason: decision.stopReason } : {}),
123
309
  ...(decision.suppressedBy !== undefined ? { suppressedBy: decision.suppressedBy } : {}),
124
310
  };
125
- if (decision.suppress)
311
+ // A re-ask at the end of a hold (Issue #3757) that holds again was already
312
+ // logged when the hold began.
313
+ if (decision.suppress && options.recheck === true)
314
+ logger.debug('prompt-push-suppressed', context);
315
+ else if (decision.suppress)
126
316
  logger.info('prompt-push-suppressed', context);
317
+ else if (decision.reason === 'auto-yes-not-answered')
318
+ logger.info('prompt-push-allowed', context);
127
319
  else
128
320
  logger.debug('prompt-push-allowed', context);
129
- return decision.suppress;
321
+ return decision;
130
322
  }