commandmate 0.46.0 → 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 (743) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +417 -410
  3. package/.next/app-path-routes-manifest.json +22 -21
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +2 -2
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +8 -0
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update/route.js +4 -2
  14. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/capabilities/route.js +1 -1
  20. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/daily-summary/route.js +1 -1
  22. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  23. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  25. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  26. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  33. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route.js +9 -9
  36. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  37. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  39. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  40. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/push/escalation/route.js +1 -7
  44. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  45. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/push/vapid/route.js +1 -7
  48. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  49. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  51. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  52. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/relays/route.js +1 -1
  54. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  55. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  59. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  60. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/repositories/clone/route.js +1 -1
  62. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  63. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/restore/route.js +1 -1
  66. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/route.js +1 -1
  69. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/scan/route.js +1 -1
  72. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  73. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/repositories/sync/route.js +1 -1
  75. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  79. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  80. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  103. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  108. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  114. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  119. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  147. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  150. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/logs/route.js +9 -9
  156. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -0
  172. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
  173. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
  174. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  210. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  224. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  227. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/route.js +1 -1
  233. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  234. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  243. package/.next/server/app/sessions/page.js +1 -1
  244. package/.next/server/app/sessions/page.js.nft.json +1 -1
  245. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  248. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  250. package/.next/server/app/worktrees/[id]/page.js +11 -11
  251. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  252. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  253. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  254. package/.next/server/app-paths-manifest.json +22 -21
  255. package/.next/server/chunks/1210.js +1 -1
  256. package/.next/server/chunks/1501.js +2 -2
  257. package/.next/server/chunks/1559.js +1 -1
  258. package/.next/server/chunks/1601.js +7 -0
  259. package/.next/server/chunks/1836.js +1 -0
  260. package/.next/server/chunks/1945.js +14 -0
  261. package/.next/server/chunks/2119.js +1 -1
  262. package/.next/server/chunks/2404.js +1 -1
  263. package/.next/server/chunks/2422.js +1 -0
  264. package/.next/server/chunks/2445.js +1 -1
  265. package/.next/server/chunks/2460.js +1 -1
  266. package/.next/server/chunks/2534.js +1 -1
  267. package/.next/server/chunks/3241.js +1 -1
  268. package/.next/server/chunks/{3077.js → 4194.js} +12 -12
  269. package/.next/server/chunks/4207.js +1 -1
  270. package/.next/server/chunks/4248.js +1 -1
  271. package/.next/server/chunks/5209.js +1 -1
  272. package/.next/server/chunks/5292.js +3 -3
  273. package/.next/server/chunks/5595.js +1 -1
  274. package/.next/server/chunks/5845.js +1 -1
  275. package/.next/server/chunks/6130.js +1 -1
  276. package/.next/server/chunks/6401.js +1 -1
  277. package/.next/server/chunks/{2283.js → 6486.js} +7 -7
  278. package/.next/server/chunks/6722.js +1 -1
  279. package/.next/server/chunks/6781.js +1 -1
  280. package/.next/server/chunks/6793.js +2 -2
  281. package/.next/server/chunks/7166.js +19 -0
  282. package/.next/server/chunks/7905.js +1 -1
  283. package/.next/server/chunks/8581.js +12 -12
  284. package/.next/server/chunks/8728.js +2 -2
  285. package/.next/server/chunks/8791.js +1 -1
  286. package/.next/server/chunks/8918.js +6 -6
  287. package/.next/server/chunks/9199.js +1 -0
  288. package/.next/server/chunks/936.js +1 -0
  289. package/.next/server/chunks/9390.js +1 -1
  290. package/.next/server/chunks/9540.js +1 -0
  291. package/.next/server/chunks/9627.js +3 -2
  292. package/.next/server/chunks/9731.js +3 -3
  293. package/.next/server/middleware-build-manifest.js +1 -1
  294. package/.next/server/middleware-manifest.json +5 -5
  295. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  296. package/.next/server/pages/500.html +1 -1
  297. package/.next/server/server-reference-manifest.json +1 -1
  298. package/.next/static/chunks/{2407-acb644c5487e1720.js → 2407-b2f524f99f7fc353.js} +1 -1
  299. package/.next/static/chunks/{2717.21abf5b6bbd45520.js → 2717.1583400c272dc1d9.js} +1 -1
  300. package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
  301. package/.next/static/chunks/5794-80ac3f06f098ea29.js +1 -0
  302. package/.next/static/chunks/602-1c1488959215e140.js +1 -0
  303. package/.next/static/chunks/{8407-9a72e6f07c5d5458.js → 8407-155f84e5ba05f1d5.js} +1 -1
  304. package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
  305. package/.next/static/chunks/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  306. package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  307. package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  308. package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
  309. package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  310. package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
  311. package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
  312. package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
  313. package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
  314. package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
  315. package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
  316. package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
  317. package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
  318. package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
  319. package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
  320. package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
  321. package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
  322. package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
  323. package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
  324. package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
  325. package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
  326. package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
  327. package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
  328. package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
  329. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
  330. package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
  331. package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
  332. package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
  333. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
  334. package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
  335. package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
  336. package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
  337. package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
  338. package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
  339. package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
  340. package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
  341. package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
  342. package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
  343. package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
  344. package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
  345. package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
  346. package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
  347. package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
  348. package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
  349. package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
  350. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
  351. package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
  352. package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
  353. package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
  354. package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
  355. package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
  441. package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
  442. package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
  443. package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
  444. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
  445. package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
  446. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
  447. package/.next/static/chunks/{webpack-c0b821f340afdebf.js → webpack-468b7b33030234b3.js} +1 -1
  448. package/.next/trace +13 -13
  449. package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
  450. package/.next/types/routes.d.ts +2 -1
  451. package/.next/types/validator.ts +9 -0
  452. package/dist/cli/commands/auto-yes.d.ts +19 -0
  453. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  454. package/dist/cli/commands/auto-yes.js +45 -0
  455. package/dist/cli/commands/instances.d.ts.map +1 -1
  456. package/dist/cli/commands/instances.js +23 -18
  457. package/dist/cli/commands/ls.d.ts +15 -1
  458. package/dist/cli/commands/ls.d.ts.map +1 -1
  459. package/dist/cli/commands/ls.js +39 -3
  460. package/dist/cli/commands/prompt.d.ts +42 -0
  461. package/dist/cli/commands/prompt.d.ts.map +1 -0
  462. package/dist/cli/commands/prompt.js +211 -0
  463. package/dist/cli/commands/relays.d.ts.map +1 -1
  464. package/dist/cli/commands/relays.js +13 -1
  465. package/dist/cli/commands/respond-strict.d.ts +31 -0
  466. package/dist/cli/commands/respond-strict.d.ts.map +1 -0
  467. package/dist/cli/commands/respond-strict.js +214 -0
  468. package/dist/cli/commands/respond.d.ts.map +1 -1
  469. package/dist/cli/commands/respond.js +38 -0
  470. package/dist/cli/commands/send.d.ts.map +1 -1
  471. package/dist/cli/commands/send.js +41 -5
  472. package/dist/cli/commands/start.d.ts.map +1 -1
  473. package/dist/cli/commands/start.js +2 -1
  474. package/dist/cli/commands/status.d.ts.map +1 -1
  475. package/dist/cli/commands/status.js +18 -0
  476. package/dist/cli/commands/wait.d.ts +21 -1
  477. package/dist/cli/commands/wait.d.ts.map +1 -1
  478. package/dist/cli/commands/wait.js +113 -12
  479. package/dist/cli/docs/agent-operations.d.ts +1 -1
  480. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  481. package/dist/cli/docs/agent-operations.js +63 -1
  482. package/dist/cli/program.d.ts.map +1 -1
  483. package/dist/cli/program.js +6 -2
  484. package/dist/cli/types/api-responses.d.ts +62 -6
  485. package/dist/cli/types/api-responses.d.ts.map +1 -1
  486. package/dist/cli/types/index.d.ts +30 -0
  487. package/dist/cli/types/index.d.ts.map +1 -1
  488. package/dist/cli/types/index.js +12 -1
  489. package/dist/cli/utils/api-client.d.ts +13 -1
  490. package/dist/cli/utils/api-client.d.ts.map +1 -1
  491. package/dist/cli/utils/api-client.js +10 -2
  492. package/dist/cli/utils/daemon-factory.d.ts.map +1 -1
  493. package/dist/cli/utils/daemon-factory.js +3 -1
  494. package/dist/cli/utils/daemon.d.ts +38 -1
  495. package/dist/cli/utils/daemon.d.ts.map +1 -1
  496. package/dist/cli/utils/daemon.js +161 -8
  497. package/dist/cli/utils/paths.d.ts +12 -0
  498. package/dist/cli/utils/paths.d.ts.map +1 -1
  499. package/dist/cli/utils/paths.js +17 -0
  500. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +55 -1
  501. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  502. package/dist/lib/polling/auto-yes-suppression-reason.js +20 -0
  503. package/dist/lib/prompt-observation/kinds.d.ts +101 -0
  504. package/dist/lib/prompt-observation/kinds.d.ts.map +1 -0
  505. package/dist/lib/prompt-observation/kinds.js +123 -0
  506. package/dist/lib/prompt-observation/types.d.ts +271 -0
  507. package/dist/lib/prompt-observation/types.d.ts.map +1 -0
  508. package/dist/lib/prompt-observation/types.js +14 -0
  509. package/dist/lib/session/send-attempt-types.d.ts +66 -0
  510. package/dist/lib/session/send-attempt-types.d.ts.map +1 -0
  511. package/dist/lib/session/send-attempt-types.js +17 -0
  512. package/dist/server/locales/en/worktree.json +4 -0
  513. package/dist/server/locales/ja/worktree.json +4 -0
  514. package/dist/server/server.js +20 -1
  515. package/dist/server/src/config/auto-yes-config.js +11 -0
  516. package/dist/server/src/lib/assistant-response-saver.js +13 -0
  517. package/dist/server/src/lib/auto-yes-lifecycle.js +28 -2
  518. package/dist/server/src/lib/auto-yes-poller.js +593 -78
  519. package/dist/server/src/lib/auto-yes-shutdown-record.js +257 -0
  520. package/dist/server/src/lib/auto-yes-state.js +197 -4
  521. package/dist/server/src/lib/cli-tools/antigravity-startup-trust.js +135 -0
  522. package/dist/server/src/lib/cli-tools/antigravity.js +162 -29
  523. package/dist/server/src/lib/cli-tools/command-code.js +10 -2
  524. package/dist/server/src/lib/cli-tools/copilot.js +21 -10
  525. package/dist/server/src/lib/cli-tools/gemini.js +60 -13
  526. package/dist/server/src/lib/cli-tools/launch-dialog.js +203 -0
  527. package/dist/server/src/lib/cli-tools/launch-window.js +96 -0
  528. package/dist/server/src/lib/conversation-logger.js +14 -2
  529. package/dist/server/src/lib/db/chat-db.js +2 -1
  530. package/dist/server/src/lib/detection/selection-shape.js +35 -1
  531. package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
  532. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
  533. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
  534. package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
  535. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
  536. package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
  537. package/dist/server/src/lib/history/user-turn-recorder.js +14 -0
  538. package/dist/server/src/lib/hooks/sources/antigravity/history.js +28 -0
  539. package/dist/server/src/lib/hooks/sources/claude/history.js +7 -0
  540. package/dist/server/src/lib/hooks/sources/codex/history.js +7 -0
  541. package/dist/server/src/lib/hooks/sources/command-code/history.js +7 -0
  542. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
  543. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
  544. package/dist/server/src/lib/hooks/sources/transcript-history.js +34 -0
  545. package/dist/server/src/lib/log-manager.js +7 -2
  546. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
  547. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
  548. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
  549. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
  550. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +22 -3
  551. package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
  552. package/dist/server/src/lib/polling/auto-yes-poller-state.js +234 -0
  553. package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
  554. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
  555. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +20 -0
  556. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
  557. package/dist/server/src/lib/polling/pending-scraped-response.js +119 -3
  558. package/dist/server/src/lib/polling/poller-owner.js +110 -0
  559. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
  560. package/dist/server/src/lib/polling/response-checker.js +211 -39
  561. package/dist/server/src/lib/polling/response-dedup.js +8 -0
  562. package/dist/server/src/lib/polling/response-poller-core.js +226 -75
  563. package/dist/server/src/lib/polling/structured-history-gate.js +20 -1
  564. package/dist/server/src/lib/prompt-answer-sender.js +59 -12
  565. package/dist/server/src/lib/prompt-observation/kinds.js +123 -0
  566. package/dist/server/src/lib/prompt-observation/types.js +14 -0
  567. package/dist/server/src/lib/push/prompt-push-gate.js +195 -3
  568. package/dist/server/src/lib/push/waiting-push-notifier.js +74 -7
  569. package/dist/server/src/lib/realtime/terminal-broadcast.js +14 -0
  570. package/dist/server/src/lib/relay/relay-delivery-claims.js +46 -0
  571. package/dist/server/src/lib/relay/relay-delivery.js +76 -30
  572. package/dist/server/src/lib/schedule-manager.js +28 -0
  573. package/dist/server/src/lib/session/chat-turn-progress.js +57 -6
  574. package/dist/server/src/lib/session/cli-session.js +38 -3
  575. package/dist/server/src/lib/session/current-output-builder.js +19 -0
  576. package/dist/server/src/lib/session/send-attempt-state.js +155 -0
  577. package/dist/server/src/lib/session/send-attempt-types.js +17 -0
  578. package/dist/server/src/lib/session/send-user-message.js +46 -0
  579. package/dist/server/src/lib/session/worktree-session-reconcile.js +85 -11
  580. package/dist/server/src/lib/timer-manager.js +7 -0
  581. package/dist/server/src/lib/tmux/session-created-signal.js +76 -0
  582. package/dist/server/src/lib/tmux/tmux-capture-cache.js +58 -6
  583. package/dist/server/src/lib/tmux/tmux.js +28 -2
  584. package/dist/server/src/lib/verification/env-clean-gate.js +30 -2
  585. package/dist/server/src/lib/verification/scope-gate-format.js +100 -0
  586. package/dist/server/src/lib/verification/scope-gate-glob.js +185 -0
  587. package/dist/server/src/lib/verification/scope-gate.js +19 -271
  588. package/dist/server/src/lib/ws-server.js +48 -6
  589. package/docs/en/user-guide/cli-setup-guide.md +12 -1
  590. package/docs/en/user-guide/webapp-guide.md +2 -0
  591. package/package.json +1 -1
  592. package/release-notes/0.46.1.json +40 -0
  593. package/release-notes/0.47.0.json +118 -0
  594. package/.next/server/chunks/1789.js +0 -1
  595. package/.next/server/chunks/2908.js +0 -1
  596. package/.next/server/chunks/3718.js +0 -1
  597. package/.next/server/chunks/4837.js +0 -14
  598. package/.next/server/chunks/5625.js +0 -25
  599. package/.next/server/chunks/611.js +0 -1
  600. package/.next/server/chunks/850.js +0 -1
  601. package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
  602. package/.next/static/chunks/5371-a94ed618148287a0.js +0 -1
  603. package/.next/static/chunks/5794-947fb4934d8be193.js +0 -1
  604. package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
  605. package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
  606. package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
  607. package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
  608. package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
  609. package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
  610. package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
  611. package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
  612. package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
  613. package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
  614. package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
  615. package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
  616. package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
  617. package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
  618. package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
  619. package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
  620. package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
  621. package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
  622. package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
  623. package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
  624. package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
  625. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
  626. package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
  627. package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
  628. package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
  629. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
  630. package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
  631. package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
  632. package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
  633. package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
  634. package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
  635. package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
  636. package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
  637. package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
  638. package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
  639. package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
  640. package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
  641. package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
  642. package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
  643. package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
  644. package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
  645. package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
  646. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
  647. package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
  648. package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
  649. package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
  650. package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
  651. package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
  670. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
  671. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
  672. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
  673. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
  674. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
  675. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
  676. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
  677. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
  678. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
  679. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
  680. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
  681. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
  682. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
  683. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
  684. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
  685. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
  699. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
  700. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
  701. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
  702. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
  703. package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
  704. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
  705. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
  706. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
  707. package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
  708. package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
  709. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
  710. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
  711. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
  712. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
  713. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
  714. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
  715. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
  716. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
  717. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
  718. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
  719. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
  720. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
  721. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
  722. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
  723. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
  724. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
  725. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
  726. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
  727. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
  728. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
  729. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
  730. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
  731. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
  732. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
  733. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
  734. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
  735. package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
  736. package/.next/static/chunks/app/layout-ae30ce63569c22be.js +0 -1
  737. package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +0 -1
  738. package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +0 -1
  739. package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +0 -1
  740. package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +0 -1
  741. package/.next/static/chunks/app/worktrees/[id]/page-2eb1d0fd0a077b7e.js +0 -1
  742. /package/.next/static/{zI2nQ6WKboSbFbMF4EtrJ → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
  743. /package/.next/static/{zI2nQ6WKboSbFbMF4EtrJ → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
@@ -9,13 +9,17 @@ exports.stopPolling = stopPolling;
9
9
  exports.stopAllPolling = stopAllPolling;
10
10
  exports.getActivePollers = getActivePollers;
11
11
  exports.migrateResponsePollerWorktreeIds = migrateResponsePollerWorktreeIds;
12
- const async_hooks_1 = require("async_hooks");
13
12
  const logger_1 = require("../../lib/logger");
14
13
  const tui_accumulator_1 = require("../tui-accumulator");
15
14
  const prompt_dedup_1 = require("./prompt-dedup");
16
15
  const response_dedup_1 = require("./response-dedup");
17
16
  const prompt_dedup_state_1 = require("./prompt-dedup-state");
18
17
  const response_checker_1 = require("./response-checker");
18
+ // Issue #3663: the migration's own entry points into the held-scrape store,
19
+ // imported from the store itself rather than through `./response-checker`'s
20
+ // re-export (suites that replace the checker by path keep working unchanged).
21
+ const pending_scraped_response_1 = require("./pending-scraped-response");
22
+ const poller_owner_1 = require("./poller-owner");
19
23
  const terminal_broadcast_1 = require("../../lib/realtime/terminal-broadcast");
20
24
  const terminal_session_ownership_1 = require("../../lib/realtime/terminal-session-ownership");
21
25
  const session_name_1 = require("../../lib/cli-tools/session-name");
@@ -58,7 +62,7 @@ const coordinator = (0, global_state_1.getOrInitGlobal)('__responsePollerCoordin
58
62
  owners: new Map(),
59
63
  running: new Map(),
60
64
  pendingRestart: new Map(),
61
- ownerStorage: new async_hooks_1.AsyncLocalStorage(),
65
+ latestOwners: new Map(),
62
66
  generationCounter: 0,
63
67
  pausedOnPrompt: new Set(),
64
68
  }));
@@ -68,6 +72,7 @@ const coordinator = (0, global_state_1.getOrInitGlobal)('__responsePollerCoordin
68
72
  // `globalThis` across HMR, and a poller started before the reload would
69
73
  // otherwise crash the first tick after it.
70
74
  coordinator.pausedOnPrompt ??= new Set();
75
+ coordinator.latestOwners ??= new Map();
71
76
  /**
72
77
  * Active pollers map: "worktreeId:instanceId" -> NodeJS.Timeout
73
78
  *
@@ -101,11 +106,17 @@ exports.pollingStartTimes = coordinator.pollingStartTimes;
101
106
  * @param instanceId - Optional agent instance ID (defaults to cliToolId)
102
107
  */
103
108
  function getPollerKey(worktreeId, cliToolId, instanceId) {
104
- return `${worktreeId}:${instanceId ?? cliToolId}`;
109
+ // Issue #3705: spelled in `./poller-owner`, so the writers that ask whether a
110
+ // tick may still act for this key name it the same way without importing here.
111
+ return (0, poller_owner_1.pollerKeyOf)(worktreeId, cliToolId, instanceId);
105
112
  }
106
113
  /** Hand `pollerKey` to a brand-new chain, retiring whichever chain held it. */
107
114
  function takeOwnership(pollerKey) {
108
- const previous = coordinator.owners.get(pollerKey);
115
+ // Issue #3705: the newest chain the key ever had, not only the one holding it
116
+ // now. A chain that was stopped (a route, a migration that displaced it) has
117
+ // left `owners`, but a tick of it may still be in flight, and it has a
118
+ // successor from this moment on.
119
+ const previous = coordinator.owners.get(pollerKey) ?? coordinator.latestOwners.get(pollerKey);
109
120
  if (previous)
110
121
  previous.superseded = true;
111
122
  const owner = {
@@ -116,6 +127,7 @@ function takeOwnership(pollerKey) {
116
127
  selfStopped: false,
117
128
  };
118
129
  coordinator.owners.set(pollerKey, owner);
130
+ coordinator.latestOwners.set(pollerKey, owner);
119
131
  return owner;
120
132
  }
121
133
  /**
@@ -171,7 +183,7 @@ function startPolling(worktreeId, cliToolId, instanceId) {
171
183
  // previous turn.
172
184
  inFlight.owner.superseded = true;
173
185
  if (Date.now() - inFlight.since < exports.STALLED_TICK_TIMEOUT) {
174
- coordinator.pendingRestart.set(pollerKey, target);
186
+ coordinator.pendingRestart.set(pollerKey, { target, behind: inFlight.owner });
175
187
  return;
176
188
  }
177
189
  logger.warn('poller:restart-past-stalled-tick', {
@@ -293,7 +305,11 @@ async function runPollTick(target, owner) {
293
305
  // Check for response
294
306
  let recorded = false;
295
307
  try {
296
- recorded = await coordinator.ownerStorage.run(owner, () => (0, response_checker_1.checkForResponse)(target.worktreeId, target.cliToolId, target.instanceId));
308
+ // The token rides through `checkForResponse()` (`./poller-owner`), so a
309
+ // `stopPolling()` raised inside a superseded tick can be told apart from
310
+ // one raised by a route, `session-cleanup` or `kill-session` (#2223), and
311
+ // the held-scrape store can turn away a tick that was retired (#3663).
312
+ recorded = await poller_owner_1.pollerOwnerStorage.run(owner, () => (0, response_checker_1.checkForResponse)(target.worktreeId, target.cliToolId, target.instanceId));
297
313
  }
298
314
  catch (error) {
299
315
  logger.error('error:', { error: error instanceof Error ? error.message : String(error) });
@@ -310,8 +326,14 @@ async function runPollTick(target, owner) {
310
326
  // Issue #2223: skipped once another chain owns the key — a superseded tick
311
327
  // would push the previous turn's screen on top of the live one, and its
312
328
  // `version` counter would make the client drop the real frame that follows.
329
+ //
330
+ // Issue #3705: and the snapshot carries the owner explicitly
331
+ // (`snapshotOwnerStorage`), because this is only where it starts. Its
332
+ // capture and the writers inside `buildCurrentOutput` resume after awaits,
333
+ // and they ask again then (`maySnapshotPublish`): a successor that took the
334
+ // key in the meantime is not overwritten by the turn that ended.
313
335
  if (!owner.superseded) {
314
- void (0, terminal_broadcast_1.broadcastTerminalSnapshot)(target.worktreeId, target.cliToolId, target.instanceId);
336
+ void poller_owner_1.snapshotOwnerStorage.run(owner, () => (0, terminal_broadcast_1.broadcastTerminalSnapshot)(target.worktreeId, target.cliToolId, target.instanceId));
315
337
  }
316
338
  // Schedule next poll ONLY after current one completes
317
339
  // Guard: only if THIS chain is still the poller for the key (Issue #2223)
@@ -326,10 +348,15 @@ async function runPollTick(target, owner) {
326
348
  // Apply a restart that arrived while this tick was in flight. Doing it here
327
349
  // rather than in startPolling() is what keeps the old and new chains from
328
350
  // polling the same pane at the same time.
351
+ //
352
+ // Issue #3705: only the restart handed to THIS tick. One queued behind a
353
+ // later chain's tick belongs to that tick: applied here, by a tick that was
354
+ // cut loose past STALLED_TICK_TIMEOUT and came back, it would stop the chain
355
+ // whose tick is still running and start the next one beside it.
329
356
  const pending = coordinator.pendingRestart.get(pollerKey);
330
- if (pending) {
357
+ if (pending && pending.behind === owner) {
331
358
  coordinator.pendingRestart.delete(pollerKey);
332
- restartChain(pollerKey, pending);
359
+ restartChain(pollerKey, pending.target);
333
360
  }
334
361
  }
335
362
  }
@@ -391,7 +418,7 @@ function stopPollingByKey(pollerKey, options = {}) {
391
418
  // (worktree gone, session not running, prompt detected, TUI reply saved).
392
419
  // Honouring that verdict would kill the chain that replaced it — the old
393
420
  // tick is describing a turn that is already over.
394
- const caller = coordinator.ownerStorage.getStore();
421
+ const caller = poller_owner_1.pollerOwnerStorage.getStore();
395
422
  if (caller && caller.pollerKey === pollerKey && (caller.superseded || caller.stopped)) {
396
423
  logger.info('poller:stale-stop-ignored', {
397
424
  pollerKey,
@@ -506,54 +533,18 @@ function splitPollerKey(pollerKey) {
506
533
  instanceId: pollerKey.slice(separatorIndex + 1),
507
534
  };
508
535
  }
509
- /**
510
- * Move every running response poller from a renamed worktree ID to the new one
511
- * (Issue #1621 Phase 3).
512
- *
513
- * Re-keying the maps alone is **not** enough, and this is the subtle part: the
514
- * `setTimeout` chain in {@link scheduleNextResponsePoll} closes over
515
- * `worktreeId` and recomputes its key on every tick. A poller left running
516
- * would go on capturing `mcbd-<cli>-<OLD id>` (a session that no longer exists
517
- * after the rename), writing its messages against an ID no row carries, and
518
- * re-registering the old key the moment it fired. So each poller is torn down
519
- * and restarted under the new ID — ownership token included (Issue #2223), so a
520
- * tick already inside `checkForResponse()` cannot come back and act on the old
521
- * ID — with everything that represents *progress* carried across:
522
- *
523
- * - `pollingStartTimes`, so MAX_POLLING_DURATION still measures from when the
524
- * turn actually began rather than restarting the 30-minute budget;
525
- * - the prompt and response dedup hashes, so the screen currently on display is
526
- * not saved a second time as a new message, together with the prompt-skip
527
- * tally that explains those suppressions to `capture --json` (Issue #1695).
528
- *
529
- * The TUI accumulator (opencode / copilot only) is re-initialised empty at the
530
- * new key instead of carried over: `tui-accumulator.ts` exposes no way to write
531
- * a buffer back, and it is outside this Issue's allowed scope. The cost is that
532
- * one in-flight TUI response may be truncated at the rename boundary; the next
533
- * turn accumulates normally.
534
- *
535
- * Takes the whole batch because IDs can swap (A→B, B→A) or chain (A→B→C):
536
- * every source key is removed before any destination key is written. That
537
- * includes the dedup state (Issue #3553) — of running pollers and paused chains
538
- * alike — which is lifted off every source key in one pass and only then
539
- * written, so a pair handled early cannot overwrite a source handled later.
540
- *
541
- * @param renames - Worktree ID pairs being applied
542
- * @param resolveCliToolId - Maps a poller's (worktree, instance) back to its CLI
543
- * tool, which the poller key does not encode for alias instances. Callers pass
544
- * a roster-backed lookup; returning null skips that poller (it is stopped
545
- * rather than left pointing at a dead ID).
546
- * @returns One entry per poller that was moved
547
- */
548
- function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
536
+ /** Old worktree ID -> new worktree ID, skipping empty and no-op pairs. */
537
+ function collectRenameTargets(renames) {
549
538
  const targets = new Map();
550
539
  for (const { oldId, newId } of renames) {
551
540
  if (!oldId || !newId || oldId === newId)
552
541
  continue;
553
542
  targets.set(oldId, newId);
554
543
  }
555
- if (targets.size === 0)
556
- return [];
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) {
557
548
  const moves = [];
558
549
  const abandoned = [];
559
550
  for (const pollerKey of Array.from(exports.activePollers.keys())) {
@@ -565,7 +556,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
565
556
  continue;
566
557
  const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
567
558
  if (!cliToolId) {
568
- abandoned.push(pollerKey);
559
+ abandoned.push({ pollerKey, newWorktreeId });
569
560
  continue;
570
561
  }
571
562
  moves.push({
@@ -576,9 +567,10 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
576
567
  instanceId: parts.instanceId,
577
568
  });
578
569
  }
579
- // Phase 1: stop every affected timer and lift the state off the old keys.
580
- // Done for the whole batch before any write so a swap cannot self-collide.
581
- const carried = new Map();
570
+ return { moves, abandoned };
571
+ }
572
+ /** Phase 1 of the migration for the moved pollers (see the caller). */
573
+ function liftMovedPollers(moves, carried) {
582
574
  for (const move of moves) {
583
575
  const timerId = exports.activePollers.get(move.oldKey);
584
576
  if (timerId)
@@ -601,6 +593,145 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
601
593
  exports.pollingStartTimes.delete(move.oldKey);
602
594
  (0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
603
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
+ }
665
+ /**
666
+ * Move every running response poller from a renamed worktree ID to the new one
667
+ * (Issue #1621 Phase 3).
668
+ *
669
+ * Re-keying the maps alone is **not** enough, and this is the subtle part: the
670
+ * `setTimeout` chain in {@link scheduleNextResponsePoll} closes over
671
+ * `worktreeId` and recomputes its key on every tick. A poller left running
672
+ * would go on capturing `mcbd-<cli>-<OLD id>` (a session that no longer exists
673
+ * after the rename), writing its messages against an ID no row carries, and
674
+ * re-registering the old key the moment it fired. So each poller is torn down
675
+ * and restarted under the new ID — ownership token included (Issue #2223), so a
676
+ * tick already inside `checkForResponse()` cannot come back and act on the old
677
+ * ID — with everything that represents *progress* carried across:
678
+ *
679
+ * - `pollingStartTimes`, so MAX_POLLING_DURATION still measures from when the
680
+ * turn actually began rather than restarting the 30-minute budget;
681
+ * - the prompt and response dedup hashes, so the screen currently on display is
682
+ * not saved a second time as a new message, together with the prompt-skip
683
+ * tally that explains those suppressions to `capture --json` (Issue #1695).
684
+ *
685
+ * The TUI accumulator (opencode / copilot only) is re-initialised empty at the
686
+ * new key instead of carried over: `tui-accumulator.ts` exposes no way to write
687
+ * a buffer back, and it is outside this Issue's allowed scope. The cost is that
688
+ * one in-flight TUI response may be truncated at the rename boundary; the next
689
+ * turn accumulates normally.
690
+ *
691
+ * Takes the whole batch because IDs can swap (A→B, B→A) or chain (A→B→C):
692
+ * every source key is removed before any destination key is written. That
693
+ * includes the dedup state (Issue #3553) — of running pollers and paused chains
694
+ * alike — which is lifted off every source key in one pass and only then
695
+ * written, so a pair handled early cannot overwrite a source handled later.
696
+ *
697
+ * Issue #3663: the held scrapes (#2436) move too, by the same lift-then-place
698
+ * rule, keeping everything but their worktree ID, which becomes the new one.
699
+ * Every chain whose key changes hands is retired (`stopped`), so a tick still
700
+ * awaiting the transcript reader cannot come back and hold, drop or write
701
+ * under it: the moved chains' old owners, and a chain already running on a
702
+ * destination key that no source vacates — that one is stopped like any
703
+ * other, which writes its held scrape under the ID it carries before the moved
704
+ * one arrives. A chain that cannot be resolved has its held scrape written
705
+ * under the NEW ID: the old one is gone from the table, and a row for it fails
706
+ * the foreign key and is lost. A chain with a tick running at the moment of
707
+ * the migration does not hand its response hash on (see the dedup move below).
708
+ *
709
+ * @param renames - Worktree ID pairs being applied
710
+ * @param resolveCliToolId - Maps a poller's (worktree, instance) back to its CLI
711
+ * tool, which the poller key does not encode for alias instances. Callers pass
712
+ * a roster-backed lookup; returning null skips that poller (it is stopped
713
+ * rather than left pointing at a dead ID).
714
+ * @returns One entry per poller that was moved
715
+ */
716
+ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
717
+ const targets = collectRenameTargets(renames);
718
+ if (targets.size === 0)
719
+ return [];
720
+ const { moves, abandoned } = planRunningPollerMoves(targets, resolveCliToolId);
721
+ // Phase 1: stop every affected timer and lift the state off the old keys.
722
+ // Done for the whole batch before any write so a swap cannot self-collide.
723
+ const carried = new Map();
724
+ // Issue #3663: the moves whose chain has a tick running right now — read
725
+ // before anything below touches the coordinator. See the response hash below.
726
+ // The chain that holds the key now, not merely some tick under the key: a
727
+ // chain retired earlier leaves its `running` entry until its own tick
728
+ // returns (the epilogue removes it by owner), and the chain that replaced it
729
+ // may not have started a tick yet.
730
+ const midTick = moves.filter((move) => {
731
+ const inFlight = coordinator.running.get(move.oldKey);
732
+ return inFlight !== undefined && inFlight.owner === coordinator.owners.get(move.oldKey);
733
+ });
734
+ liftMovedPollers(moves, carried);
604
735
  // Stop the abandoned pollers before any dedup state is written: the stop
605
736
  // clears every cache under its key, and that key can be the destination of
606
737
  // another move in this batch (A:x paused → B:x while B:x is abandoned).
@@ -608,29 +739,56 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
608
739
  // An abandoned key is never a move source, so nothing still to be moved is
609
740
  // lost here; and the paused chains are collected after it, as before, so a
610
741
  // pause the stop ends is not carried.
611
- for (const pollerKey of abandoned) {
742
+ //
743
+ // Issue #3663: its held scrape is pointed at the new ID first, so the stop
744
+ // writes it there — the old ID is no longer in the table.
745
+ for (const { pollerKey, newWorktreeId } of abandoned) {
746
+ (0, pending_scraped_response_1.retargetPendingScrapedResponse)(pollerKey, newWorktreeId);
612
747
  stopPollingByKey(pollerKey);
613
748
  logger.warn('poller:migrate-abandoned', { pollerKey });
614
749
  }
750
+ const abandonedKeys = new Set(abandoned.map(({ pollerKey }) => pollerKey));
615
751
  // Issue #2230: a chain paused on a prompt has no timer, so the loops here
616
752
  // never see it — but it is holding the response hash for the turn it paused
617
753
  // on, and `/respond` will resume it under the NEW ID. Move the hash and the
618
754
  // pause mark with it; the chain itself stays paused until that resume.
619
- const pausedMoves = [];
620
- for (const pollerKey of Array.from(coordinator.pausedOnPrompt)) {
621
- const parts = splitPollerKey(pollerKey);
622
- if (!parts)
623
- continue;
624
- const newWorktreeId = targets.get(parts.worktreeId);
625
- if (!newWorktreeId)
626
- continue;
627
- pausedMoves.push({ oldKey: pollerKey, newKey: `${newWorktreeId}:${parts.instanceId}` });
628
- }
755
+ const pausedMoves = collectPausedMoves(targets);
756
+ // Issue #3663: every held scrape under a renamed worktree ID moves — a
757
+ // running chain's, a paused chain's, and one whose chain is already gone.
758
+ // The abandoned ones were written above and are no longer held.
759
+ const pendingMoves = collectPendingMoves(targets, abandonedKeys);
760
+ // Issue #3663: a destination a chain (running or paused) moves onto, that no
761
+ // source of this batch vacates, may already be held by another chain — B:x
762
+ // running while A:x moves to B:x. That chain loses the key, so it is stopped
763
+ // here like any other stop: its held scrape is written under the ID it
764
+ // carries (the current one), its owner is retired so its in-flight tick can
765
+ // no longer hold or drop anything, and its caches are cleared before the
766
+ // moved state is written. A destination nothing is on is left alone, and so
767
+ // is every other instance of the destination worktree.
768
+ stopDisplacedPollers(moves, pausedMoves, pendingMoves, abandonedKeys);
629
769
  // Issue #3553: the dedup state of the whole batch moves in one call per map
630
770
  // family, each lifting every source before writing any destination. Re-keyed
631
771
  // pair by pair, a swap left A with its own state and B empty.
772
+ //
773
+ // Issue #3663: except the response hash of a chain whose tick is running.
774
+ // That tick may have registered the hash of a reply it has not yet saved or
775
+ // held — it is awaiting the transcript reader, and the hold it comes back
776
+ // with is refused (its owner is retired above). Handed on, the hash would
777
+ // make the successor skip a reply nobody wrote. Dropped, the successor judges
778
+ // the screen itself and holds or saves it. The price, taken knowingly: a
779
+ // reply that tick HAD already saved may be saved once more by the successor
780
+ // — a duplicate row rather than a lost one, the trade #2436 makes. Deciding
781
+ // here, once, replaces marking the hash and taking it back later, whose
782
+ // lifetime every later move, resume and restart would have to carry.
783
+ // The prompt hash and the prompt-skip tally move as before.
784
+ // Dropped on the source key only, before the batch moves: the destination is
785
+ // left as the batch leaves it, so what another source of a many-to-one move
786
+ // brings there (a chain that saved its reply and is waiting) still stands.
787
+ for (const move of midTick)
788
+ (0, response_dedup_1.clearResponseHashCache)(move.oldKey);
632
789
  (0, prompt_dedup_1.renamePromptHashCacheKeys)(moves);
633
790
  (0, response_dedup_1.renameResponseHashCacheKeys)([...moves, ...pausedMoves]);
791
+ (0, pending_scraped_response_1.movePendingScrapedResponses)(pendingMoves);
634
792
  // Issue #1695: the prompt hash moved above, so the guard keeps suppressing
635
793
  // the prompt on screen under the new ID. Its tally has to move with it, or
636
794
  // `capture --json` reports zero skips for a session that is still skipping.
@@ -647,14 +805,7 @@ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
647
805
  : [];
648
806
  }));
649
807
  // Phase 2: restart each poller under its new identity.
650
- for (const move of moves) {
651
- const startedAt = carried.get(move.newKey)?.startedAt;
652
- exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
653
- if (isFullScreenTui(move.cliToolId)) {
654
- (0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
655
- }
656
- scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
657
- }
808
+ restartMovedPollers(moves, carried);
658
809
  // Issue #2230: the pause marks of the chains collected above follow their
659
810
  // hashes (moved with the batch). All removed before any is added, for the
660
811
  // same swap reason.
@@ -84,6 +84,7 @@ const tool_id_4 = require("../../lib/hooks/sources/command-code/tool-id");
84
84
  const registry_1 = require("../../lib/hooks/sources/registry");
85
85
  const relay_triggers_1 = require("../../lib/relay/relay-triggers");
86
86
  const global_state_1 = require("../global-state");
87
+ const poller_owner_1 = require("./poller-owner");
87
88
  const logger = (0, logger_1.createLogger)('lib/polling/structured-history-gate');
88
89
  /**
89
90
  * One in-flight capture per instance (Issue #2246).
@@ -382,7 +383,25 @@ async function captureStructuredHistoryTurn(worktreeId, cliToolId, instanceId, c
382
383
  // back. So a provisional capture announces nothing at all; the relay
383
384
  // keeps waiting on the deadline it already has, and the settled capture
384
385
  // that follows announces the finished body.
385
- if (captured && completion === 'settled') {
386
+ //
387
+ // Issue #3701: a poller tick retired while it awaited the reader
388
+ // announces nothing under the key it lost, and claims nothing, so its
389
+ // successor still announces this completion. Asked by the poller key
390
+ // (`getPollerKey`'s `worktreeId:instanceId`), not `captureKey`. The
391
+ // Stop hook runs outside any tick and is never refused. Issue #3705:
392
+ // what the reader itself writes during the `await` (rows, user rows,
393
+ // the cursor, agy's follow list) is asked the same question by the
394
+ // reader, after its own last `await` (`mayReaderWrite`).
395
+ const pollerKey = (0, poller_owner_1.pollerKeyOf)(worktreeId, cliToolId, resolvedInstanceId);
396
+ if (captured && completion === 'settled' && !(0, poller_owner_1.mayActForPollerKey)(pollerKey)) {
397
+ logger.info('structured-history-completion-refused', {
398
+ worktreeId,
399
+ cliToolId,
400
+ instanceId: resolvedInstanceId,
401
+ generation: (0, poller_owner_1.currentPollerOwner)()?.generation,
402
+ });
403
+ }
404
+ else if (captured && completion === 'settled') {
386
405
  if (claimCompletionAnnouncement(captureKey, readerReport.completionKey)) {
387
406
  (0, relay_triggers_1.onRelayTurnCompleted)(worktreeId, cliToolId, resolvedInstanceId, true);
388
407
  }
@@ -7,7 +7,7 @@
7
7
  * the promptType/defaultOptionNumber fallback introduced in Bug1).
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.MultiSelectAnswerRejectedError = exports.MULTI_SELECT_NOT_COMMITTED_REASON = exports.FreeTextAtChoiceOnlyPromptError = exports.FreeTextAnswerRejectedError = exports.FREE_TEXT_AT_MENU_ROW_REASON = exports.PromptAnswerRejectedError = exports.ANSWER_MODE_KEYS_REASON = void 0;
10
+ exports.PromptAnswerAbortedError = exports.MultiSelectAnswerRejectedError = exports.MULTI_SELECT_NOT_COMMITTED_REASON = exports.FreeTextAtChoiceOnlyPromptError = exports.FreeTextAnswerRejectedError = exports.FREE_TEXT_AT_MENU_ROW_REASON = exports.PromptAnswerRejectedError = exports.ANSWER_MODE_KEYS_REASON = void 0;
11
11
  exports.sendPromptAnswer = sendPromptAnswer;
12
12
  const tmux_1 = require("./tmux/tmux");
13
13
  const frame_1 = require("../lib/detection/tools/frame");
@@ -665,7 +665,7 @@ async function recaptureAfterKeys(sessionName) {
665
665
  * @throws {MultiSelectAnswerRejectedError} whenever the question was not
666
666
  * committed; `keysSent` says whether the pane was touched.
667
667
  */
668
- async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted) {
668
+ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted, stillCurrent) {
669
669
  const cursor = promptData.options.find((option) => option.isDefault === true);
670
670
  if (cursor === undefined) {
671
671
  throw new MultiSelectAnswerRejectedError('cursor-unknown', false, wanted);
@@ -679,12 +679,13 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
679
679
  ...current.filter((n) => !wanted.includes(n)),
680
680
  ].sort((a, b) => a - b);
681
681
  if (toggles.length > 0) {
682
- await (0, tmux_1.sendSpecialKeys)(sessionName, toggles.map(String));
682
+ await sendSpecialKeysWhileCurrent(sessionName, toggles.map(String), stillCurrent);
683
683
  }
684
684
  const keysSent = toggles.length > 0;
685
685
  // 2. Read the screen back and refuse unless it is the same question with
686
686
  // exactly the requested boxes ticked.
687
687
  const afterToggle = await recaptureAfterKeys(sessionName);
688
+ assertStillCurrent(stillCurrent, keysSent);
688
689
  if (afterToggle === null) {
689
690
  throw new MultiSelectAnswerRejectedError('recapture-failed', keysSent, wanted);
690
691
  }
@@ -711,14 +712,12 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
711
712
  if (cursorNow === undefined) {
712
713
  throw new MultiSelectAnswerRejectedError('cursor-unknown', keysSent, wanted);
713
714
  }
714
- await (0, tmux_1.sendSpecialKeys)(sessionName, [
715
- ...downKeys(verified.options.length - cursorNow.number + 1),
716
- 'Enter',
717
- ]);
715
+ await sendSpecialKeysWhileCurrent(sessionName, [...downKeys(verified.options.length - cursorNow.number + 1), 'Enter'], stillCurrent);
718
716
  // 4. The second stage. `Submit` opens the Review page and the answer is sent
719
717
  // from there; `Next` advances to the following question, which IS the
720
718
  // commit for this one (its tab turns `✔`).
721
719
  const afterConfirm = await recaptureAfterKeys(sessionName);
720
+ assertStillCurrent(stillCurrent, true);
722
721
  if (afterConfirm === null) {
723
722
  throw new MultiSelectAnswerRejectedError('recapture-failed', true, wanted);
724
723
  }
@@ -729,7 +728,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
729
728
  if (review.hasUnansweredWarning) {
730
729
  throw new MultiSelectAnswerRejectedError('review-unanswered', true, wanted);
731
730
  }
732
- await (0, tmux_1.sendSpecialKeys)(sessionName, ['Enter']);
731
+ await sendSpecialKeysWhileCurrent(sessionName, ['Enter'], stillCurrent);
733
732
  return;
734
733
  }
735
734
  const next = (0, dialog_1.readCommandCodeQuestionDialog)(afterConfirm);
@@ -740,6 +739,50 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
740
739
  throw new MultiSelectAnswerRejectedError('not-committed', true, wanted);
741
740
  }
742
741
  }
742
+ /**
743
+ * The caller's `stillCurrent` said no after one of the send's waits
744
+ * (Issue #3706): the keys not yet sent were not sent. Keys already typed cannot
745
+ * be taken back, so {@link keysSent} says whether the pane was touched; either
746
+ * way the answer was NOT completed and must not be recorded as one.
747
+ */
748
+ class PromptAnswerAbortedError extends Error {
749
+ keysSent;
750
+ constructor(
751
+ /** Whether any key reached the pane before the stop. */
752
+ keysSent) {
753
+ super(`Prompt answer stopped by its caller (${keysSent ? 'some keys were sent' : 'no key was sent'})`);
754
+ this.keysSent = keysSent;
755
+ this.name = 'PromptAnswerAbortedError';
756
+ }
757
+ }
758
+ exports.PromptAnswerAbortedError = PromptAnswerAbortedError;
759
+ /** Stop here when the caller's `stillCurrent` says no (Issue #3706). */
760
+ function assertStillCurrent(stillCurrent, keysSent) {
761
+ if (stillCurrent && !stillCurrent())
762
+ throw new PromptAnswerAbortedError(keysSent);
763
+ }
764
+ /**
765
+ * `sendSpecialKeys`, asking `stillCurrent` between the keys when the caller
766
+ * gave one (Issue #3706). Without it the call is exactly the old two-argument
767
+ * one, so manual answers and every other caller send as before.
768
+ */
769
+ async function sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent) {
770
+ if (!stillCurrent) {
771
+ await (0, tmux_1.sendSpecialKeys)(sessionName, keys);
772
+ return;
773
+ }
774
+ try {
775
+ await (0, tmux_1.sendSpecialKeys)(sessionName, keys, { shouldContinue: stillCurrent });
776
+ }
777
+ catch (error) {
778
+ // By name rather than `instanceof`: test doubles of `./tmux/tmux` need not
779
+ // export the class.
780
+ if (error instanceof Error && error.name === 'SpecialKeysAbortedError') {
781
+ throw new PromptAnswerAbortedError(true);
782
+ }
783
+ throw error;
784
+ }
785
+ }
743
786
  /**
744
787
  * Send an answer to a tmux session, using cursor-key navigation for
745
788
  * Claude Code / Antigravity multiple-choice prompts and text input for
@@ -750,7 +793,7 @@ async function sendCommandCodeMultiSelectAnswer(sessionName, promptData, wanted)
750
793
  * - src/lib/auto-yes-manager.ts (L340-399)
751
794
  */
752
795
  async function sendPromptAnswer(params) {
753
- const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber } = params;
796
+ const { sessionName, answer, cliToolId, promptData, fallbackPromptType, fallbackDefaultOptionNumber, stillCurrent } = params;
754
797
  // Issue #2755: Command Code's checkbox question, before every guard below.
755
798
  // Its answer is a SET (`"1,3"`), which none of them can read — `/^\d+$/` is
756
799
  // how all three ask "is this a number?", so a set would be judged as free
@@ -760,7 +803,7 @@ async function sendPromptAnswer(params) {
760
803
  // a two-stage confirm, not a digit and an Enter.
761
804
  const multiSelect = readMultiSelectRequest(params);
762
805
  if (multiSelect !== null) {
763
- await sendCommandCodeMultiSelectAnswer(sessionName, multiSelect.promptData, multiSelect.wanted);
806
+ await sendCommandCodeMultiSelectAnswer(sessionName, multiSelect.promptData, multiSelect.wanted, stillCurrent);
764
807
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
765
808
  return;
766
809
  }
@@ -781,6 +824,8 @@ async function sendPromptAnswer(params) {
781
824
  // the Enter after them confirms that row — so the cursor has to be checked
782
825
  // here too, before the branch.
783
826
  assertFreeTextCursorIsOnTheField(params);
827
+ // Issue #3706: the guard above may have read the pane; nothing is typed yet.
828
+ assertStillCurrent(stillCurrent, false);
784
829
  // Determine if this is an arrow-key-navigated multiple-choice prompt.
785
830
  // Claude Code and Antigravity (agy) both render selection menus that only
786
831
  // respond to cursor navigation + Enter, not to typed option numbers
@@ -829,7 +874,7 @@ async function sendPromptAnswer(params) {
829
874
  keys.push(...buildNavigationKeys(downToNext));
830
875
  // 4. Enter to submit
831
876
  keys.push('Enter');
832
- await (0, tmux_1.sendSpecialKeys)(sessionName, keys);
877
+ await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent);
833
878
  }
834
879
  else {
835
880
  // Single-select: navigate and Enter to select
@@ -847,7 +892,7 @@ async function sendPromptAnswer(params) {
847
892
  const keys = (isAskUserQuestionPicker && offset === 0)
848
893
  ? ['Down', 'Up', 'Enter']
849
894
  : [...navigationKeys, 'Enter'];
850
- await (0, tmux_1.sendSpecialKeys)(sessionName, keys);
895
+ await sendSpecialKeysWhileCurrent(sessionName, keys, stillCurrent);
851
896
  }
852
897
  }
853
898
  else {
@@ -858,6 +903,8 @@ async function sendPromptAnswer(params) {
858
903
  if (!shouldSuppressEnter(params, resolvedSubmitMode, dialog)) {
859
904
  // Wait a moment for the input to be processed
860
905
  await new Promise(resolve => setTimeout(resolve, cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS));
906
+ // Issue #3706: the text is typed; the Enter that submits it is not.
907
+ assertStillCurrent(stillCurrent, true);
861
908
  // Send Enter
862
909
  await (0, tmux_1.sendKeys)(sessionName, '', true);
863
910
  }