commandmate 0.44.3 → 0.45.1

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 (352) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +293 -292
  3. package/.next/app-path-routes-manifest.json +21 -21
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/next-server.js.nft.json +1 -1
  6. package/.next/prerender-manifest.json +9 -9
  7. package/.next/react-loadable-manifest.json +29 -29
  8. package/.next/required-server-files.json +1 -1
  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_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/capabilities/route.js +1 -1
  19. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  28. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  29. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  31. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  32. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  34. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  35. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/route.js +1 -1
  45. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  46. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  50. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  51. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/restore/route.js +1 -1
  57. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  58. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/route.js +1 -1
  60. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/scan/route.js +1 -1
  63. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/sync/route.js +1 -1
  66. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  70. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  71. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  88. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  91. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  103. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  135. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  138. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  141. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  145. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  158. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  170. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/route.js +1 -1
  204. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  207. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  210. package/.next/server/app/page_client-reference-manifest.js +1 -1
  211. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  213. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  214. package/.next/server/app/sessions/page.js +1 -1
  215. package/.next/server/app/sessions/page.js.nft.json +1 -1
  216. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/skills/[skillId]/page.js +2 -2
  218. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  219. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  220. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  223. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  224. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  225. package/.next/server/app/worktrees/[id]/page.js +5 -5
  226. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  227. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app-paths-manifest.json +21 -21
  230. package/.next/server/chunks/1503.js +2 -2
  231. package/.next/server/chunks/1559.js +2 -2
  232. package/.next/server/chunks/1944.js +1 -1
  233. package/.next/server/chunks/2119.js +1 -1
  234. package/.next/server/chunks/22.js +1 -1
  235. package/.next/server/chunks/2335.js +1 -0
  236. package/.next/server/chunks/2404.js +1 -1
  237. package/.next/server/chunks/2445.js +1 -1
  238. package/.next/server/chunks/2460.js +1 -1
  239. package/.next/server/chunks/2710.js +2 -2
  240. package/.next/server/chunks/2908.js +1 -1
  241. package/.next/server/chunks/3241.js +1 -1
  242. package/.next/server/chunks/4243.js +1 -0
  243. package/.next/server/chunks/4837.js +3 -3
  244. package/.next/server/chunks/5048.js +1 -1
  245. package/.next/server/chunks/5064.js +1 -1
  246. package/.next/server/chunks/5209.js +1 -1
  247. package/.next/server/chunks/5292.js +7 -0
  248. package/.next/server/chunks/5625.js +3 -3
  249. package/.next/server/chunks/5737.js +1 -1
  250. package/.next/server/chunks/6065.js +1 -1
  251. package/.next/server/chunks/6130.js +1 -1
  252. package/.next/server/chunks/6401.js +1 -1
  253. package/.next/server/chunks/6927.js +1 -1
  254. package/.next/server/chunks/850.js +1 -1
  255. package/.next/server/chunks/8728.js +2 -2
  256. package/.next/server/chunks/8918.js +4 -6
  257. package/.next/server/chunks/9051.js +1 -1
  258. package/.next/server/chunks/9130.js +1 -1
  259. package/.next/server/chunks/9355.js +1 -0
  260. package/.next/server/chunks/9390.js +1 -1
  261. package/.next/server/chunks/9584.js +1 -1
  262. package/.next/server/chunks/9731.js +1 -1
  263. package/.next/server/chunks/9862.js +1 -0
  264. package/.next/server/middleware-build-manifest.js +1 -1
  265. package/.next/server/middleware-manifest.json +5 -5
  266. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  267. package/.next/server/pages/500.html +1 -1
  268. package/.next/server/server-reference-manifest.json +1 -1
  269. package/.next/static/chunks/{7485.442b21101fca7257.js → 1111.5ab4f0ffb0d944e5.js} +4 -4
  270. package/.next/static/chunks/1464.09cd37fee202ec4b.js +1 -0
  271. package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-0f1bf8fb8161e10a.js} +1 -1
  272. package/.next/static/chunks/{2407-06d35bb1aa02de80.js → 2407-86890b00eeecf391.js} +1 -1
  273. package/.next/static/chunks/{2751-9ef0f4b450bd4ef0.js → 2751-5f0b2702accd164d.js} +1 -1
  274. package/.next/static/chunks/{282.6b6f2e31a96674dd.js → 282.a1013532fd9a61b4.js} +1 -1
  275. package/.next/static/chunks/3237.94c29281d9ec122e.js +1 -0
  276. package/.next/static/chunks/3480.2e21f62e5e9d3ba5.js +1 -0
  277. package/.next/static/chunks/3662-5a27ee39a3ecba49.js +1 -0
  278. package/.next/static/chunks/3922.0bc2e4e168d2b522.js +1 -0
  279. package/.next/static/chunks/4290.c06dbe243819fea0.js +66 -0
  280. package/.next/static/chunks/4541-b0ce0bf829ae79b7.js +1 -0
  281. package/.next/static/chunks/4727-4c69d1aa4118cc09.js +1 -0
  282. package/.next/static/chunks/{5222.305dc0ebba9c0784.js → 5222.39e2034d3fce233c.js} +1 -1
  283. package/.next/static/chunks/5371-af1c2b68e983da61.js +1 -0
  284. package/.next/static/chunks/6288-09feba367cc2c65e.js +1 -0
  285. package/.next/static/chunks/{7095.8c869e553133a40e.js → 7095.87323a4fdf426341.js} +1 -1
  286. package/.next/static/chunks/953.31c52a251deda22d.js +1 -0
  287. package/.next/static/chunks/app/{layout-0d1750b833f5cc3e.js → layout-eaa6365f8f942e88.js} +1 -1
  288. package/.next/static/chunks/app/sessions/{page-2af68c63211c751f.js → page-ebfed2c80e916fb8.js} +1 -1
  289. package/.next/static/chunks/app/skills/[skillId]/page-e4b14031f946c007.js +1 -0
  290. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +1 -0
  291. package/.next/static/chunks/app/worktrees/[id]/page-3372b78fde232b1f.js +1 -0
  292. package/.next/static/chunks/{webpack-021f0741f22dd16a.js → webpack-ee3ccbe378c4aa06.js} +1 -1
  293. package/.next/static/css/{057f64a65726c439.css → 6faeb04a0b6819d4.css} +1 -1
  294. package/.next/trace +13 -13
  295. package/dist/cli/commands/skill-format.d.ts +8 -0
  296. package/dist/cli/commands/skill-format.d.ts.map +1 -1
  297. package/dist/cli/commands/skill-format.js +13 -3
  298. package/dist/cli/commands/wait.d.ts.map +1 -1
  299. package/dist/cli/commands/wait.js +71 -3
  300. package/dist/cli/types/api-responses.d.ts +7 -10
  301. package/dist/cli/types/api-responses.d.ts.map +1 -1
  302. package/dist/cli/utils/verify-runner.d.ts +21 -0
  303. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  304. package/dist/cli/utils/verify-runner.js +38 -1
  305. package/dist/server/locales/en/worktree.json +7 -2
  306. package/dist/server/locales/ja/worktree.json +7 -2
  307. package/dist/server/src/lib/auto-yes-poller.js +16 -163
  308. package/dist/server/src/lib/detection/model-info-extractor.js +57 -3
  309. package/dist/server/src/lib/detection/status-detector.js +1 -1
  310. package/dist/server/src/lib/git/git-exec.js +23 -5
  311. package/dist/server/src/lib/hooks/sources/claude/self-resume.js +213 -0
  312. package/dist/server/src/lib/hooks/sources/claude/source.js +24 -7
  313. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +1 -1
  314. package/dist/server/src/lib/polling/auto-yes-poller-state.js +52 -0
  315. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +125 -0
  316. package/dist/server/src/lib/polling/prompt-dedup.js +93 -2
  317. package/dist/server/src/lib/polling/response-checker.js +40 -2
  318. package/dist/server/src/lib/polling/response-dedup.js +62 -1
  319. package/dist/server/src/lib/session/agent-event-dedup.js +2 -2
  320. package/dist/server/src/lib/session/agent-event-state.js +2 -1
  321. package/dist/server/src/lib/session/agent-event-turn.js +51 -0
  322. package/dist/server/src/lib/session/current-output-builder.js +0 -5
  323. package/dist/server/src/lib/skills/install-plan.js +1 -0
  324. package/dist/server/src/lib/skills/preview-diff.js +24 -3
  325. package/dist/server/src/lib/skills/uninstall-plan.js +1 -0
  326. package/dist/server/src/lib/verification/env-clean-gate.js +6 -5
  327. package/docs/en/user-guide/commands-guide.md +0 -1
  328. package/package.json +3 -2
  329. package/release-notes/0.45.0.json +41 -0
  330. package/release-notes/0.45.1.json +38 -0
  331. package/scripts/hooks/cmate-agent-event.sh +20 -0
  332. package/.next/server/chunks/364.js +0 -1
  333. package/.next/server/chunks/4672.js +0 -5
  334. package/.next/server/chunks/4802.js +0 -1
  335. package/.next/server/chunks/488.js +0 -1
  336. package/.next/server/chunks/5326.js +0 -1
  337. package/.next/static/chunks/2053-85a974ddfe7498fe.js +0 -1
  338. package/.next/static/chunks/3922.f45dcfc1e7da552a.js +0 -1
  339. package/.next/static/chunks/4290.6cf86f68d73b6e77.js +0 -82
  340. package/.next/static/chunks/4459.a94b52985a76509a.js +0 -1
  341. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +0 -1
  342. package/.next/static/chunks/5951.616956b6aa5df63f.js +0 -1
  343. package/.next/static/chunks/8283-26ad31a4670ea52d.js +0 -1
  344. package/.next/static/chunks/8566-aeda747542072ace.js +0 -1
  345. package/.next/static/chunks/8811-29eaa24237f48558.js +0 -1
  346. package/.next/static/chunks/953.19e4c8178c9eac4c.js +0 -1
  347. package/.next/static/chunks/9856.15463dd58437e2ac.js +0 -1
  348. package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +0 -1
  349. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-5445205c8dd80109.js +0 -1
  350. package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +0 -1
  351. /package/.next/static/{tWwHQzmvc-rv9KKUtDWfQ → vYIpFRCU_Mt0wtG8F_3-6}/_buildManifest.js +0 -0
  352. /package/.next/static/{tWwHQzmvc-rv9KKUtDWfQ → vYIpFRCU_Mt0wtG8F_3-6}/_ssgManifest.js +0 -0
@@ -34,6 +34,7 @@
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.claudeAgentEventSource = void 0;
36
36
  exports.encodeClaudeVerdict = encodeClaudeVerdict;
37
+ exports.extractClaudeEventDetail = extractClaudeEventDetail;
37
38
  const uat_isolation_1 = require("../../../../config/uat-isolation");
38
39
  const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
39
40
  const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
@@ -44,6 +45,7 @@ const event_mapper_1 = require("../event-mapper");
44
45
  const hook_event_vocabulary_1 = require("../hook-event-vocabulary");
45
46
  const model_switch_1 = require("./model-switch");
46
47
  const queued_notice_1 = require("./queued-notice");
48
+ const self_resume_1 = require("./self-resume");
47
49
  const tool_id_1 = require("./tool-id");
48
50
  /**
49
51
  * The no-decision body, byte for byte what the #1721 spike returned for D5.
@@ -85,6 +87,20 @@ function encodeClaudeVerdict(verdict) {
85
87
  },
86
88
  };
87
89
  }
90
+ /**
91
+ * The subtype of one Claude event.
92
+ *
93
+ * Every event but `stop` is the shared snake_case reading (S2). A `stop` is
94
+ * {@link SELF_RESUME_PENDING_DETAIL} when the session's transcript shows
95
+ * background work that has not been notified yet (Issue #3430), and has no
96
+ * subtype otherwise — which is what every Claude `stop` had before.
97
+ */
98
+ function extractClaudeEventDetail(event, payload) {
99
+ if (event === 'stop' && (0, self_resume_1.claudeStopLeavesBackgroundWork)(payload)) {
100
+ return agent_event_types_1.SELF_RESUME_PENDING_DETAIL;
101
+ }
102
+ return (0, hook_event_vocabulary_1.extractSnakeCaseEventDetail)(event, payload);
103
+ }
88
104
  /**
89
105
  * Claude Code as an event source.
90
106
  *
@@ -127,11 +143,12 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
127
143
  // JSONL when the poller asks (#2121); the gate dispatches on this word
128
144
  // rather than on the tool id.
129
145
  transcriptHistory: 'pull',
130
- // Issue #2614. Claude Code does resume itself (background tasks, session
131
- // crons), and its `Stop` payload carries `background_tasks` /
132
- // `session_crons` — but only the empty form has been captured, so nothing
133
- // reads them yet and this stays false until a non-empty one is measured.
134
- stopReportsSelfResume: false,
146
+ // Issue #3430 (#2614 for Claude). A `Stop` whose transcript shows a
147
+ // background `Bash` / `Monitor` / subagent not yet notified carries
148
+ // `SELF_RESUME_PENDING_DETAIL`: the notification opens the next turn by
149
+ // itself. The payload's `background_tasks` is still unread — only its empty
150
+ // form has been captured. See `./self-resume` and `extractDetail` below.
151
+ stopReportsSelfResume: true,
135
152
  },
136
153
  // S1. A plain name table is enough *for this tool* — one native name, one
137
154
  // word, no predicates — so it is expressed as rules built from the table
@@ -163,8 +180,8 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
163
180
  // Issue #3330. A background-task notice attached to the running turn fires
164
181
  // `UserPromptSubmit` too, and continues that turn rather than opening one.
165
182
  promptJoinsOpenTurn: queued_notice_1.isClaudeQueuedNoticePrompt,
166
- // S2.
167
- extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
183
+ // S2, plus the `Stop` that leaves background work behind (Issue #3430).
184
+ extractDetail: extractClaudeEventDetail,
168
185
  // S7. Both parsers are strict and answer null for anything they cannot vouch
169
186
  // for; the callers turn null into "no structured data", which degrades to the
170
187
  // behaviour of a machine without hooks rather than into a guess.
@@ -30,7 +30,7 @@ const global_state_1 = require("../global-state");
30
30
  * What tells two prompts apart for the published record: the type, the
31
31
  * question and the option labels.
32
32
  *
33
- * Not the poller's `promptFrameKey`: that one also carries the cursor and
33
+ * Not the poller's `promptFrameKey` (in `auto-yes-poller-state.ts`): that one also carries the cursor and
34
34
  * `approvalTarget`, and the status API reads a different number of rows than
35
35
  * the poller does, so `approvalTarget` can differ between the two readings of
36
36
  * one screen. The record is matched against the status API's prompt (to say
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * Auto-Yes poller state and its once-per-frame WARN (Issue #3411).
4
+ *
5
+ * Moved out of auto-yes-poller.ts unchanged; the poller re-exports
6
+ * `AutoYesPollerState`. Must not import auto-yes-poller.ts (cycle).
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.promptFrameKey = promptFrameKey;
10
+ exports.warnOncePerFrame = warnOncePerFrame;
11
+ const prompt_key_1 = require("../detection/prompt-key");
12
+ const logger_1 = require("../../lib/logger");
13
+ const logger = (0, logger_1.createLogger)('auto-yes-poller');
14
+ /**
15
+ * Issue #2995: what makes two ticks "the same prompt" for `warnOncePerFrame`.
16
+ *
17
+ * `generatePromptKey` alone is type + question, and the question the detector
18
+ * extracts from an agent's reply is often a fixed line above the list, so two
19
+ * different lists would share it. The option rows (and where the cursor sits)
20
+ * plus `approvalTarget` -- the current prompt's own panel, which leaves out
21
+ * scrollback and footers that change while the prompt does not -- separate them.
22
+ * Not the whole pane: a status bar that ticks every second would defeat it.
23
+ */
24
+ function promptFrameKey(promptData) {
25
+ const options = promptData.type === 'multiple_choice'
26
+ ? promptData.options.map((o) => `${o.isDefault ? '>' : ''}${o.number}.${o.label}`).join('\n')
27
+ : '';
28
+ return [(0, prompt_key_1.generatePromptKey)(promptData), options, promptData.approvalTarget ?? ''].join('\u0000');
29
+ }
30
+ /**
31
+ * Issue #2995: print a "did not answer" line as WARN once per frame.
32
+ *
33
+ * The poller re-reads a static pane every 2s, so a frame Auto-Yes leaves alone
34
+ * (a reply quoting `1. Yes / 2. No`, a launch dialog, a policy-withheld prompt,
35
+ * a foreign session) would otherwise print the same WARN on every tick. The
36
+ * first one stays WARN -- it is what tells a silently stalled worker apart --
37
+ * and repeats for the same frame drop to `debug`. The frame is identified by
38
+ * the event, `promptFrameKey()` and the event's own detail; a different
39
+ * prompt, a different reason, or a tick with no prompt / an answer sent (both
40
+ * clear the key) makes the next line WARN again.
41
+ * `recordPolicySuppression()` is not throttled: `capture --json` and `wait`
42
+ * read the latest record, not the log.
43
+ */
44
+ function warnOncePerFrame(pollerState, frameKey, event, fields) {
45
+ const key = `${event}\u0000${frameKey}`;
46
+ if (pollerState.lastSkipWarnKey === key) {
47
+ logger.debug(event, { ...fields, repeated: true });
48
+ return;
49
+ }
50
+ pollerState.lastSkipWarnKey = key;
51
+ logger.warn(event, fields);
52
+ }
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ /**
3
+ * The suppression exits of `detectAndRespondToPrompt` (Issue #3214), moved out
4
+ * of auto-yes-poller.ts unchanged (Issue #3411). Must not import
5
+ * auto-yes-poller.ts (cycle) or `../tmux/tmux` (tmux import allowlist).
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.suppressAndWarnOnce = suppressAndWarnOnce;
9
+ exports.suppressIfNotOursToAnswer = suppressIfNotOursToAnswer;
10
+ exports.suppressUnclassifiedFrame = suppressUnclassifiedFrame;
11
+ const detect_1 = require("../detection/tools/codex/detect");
12
+ const cli_patterns_1 = require("../detection/cli-patterns");
13
+ const auto_yes_suppression_state_1 = require("./auto-yes-suppression-state");
14
+ const auto_yes_dialog_gate_1 = require("./auto-yes-dialog-gate");
15
+ const auto_yes_poller_state_1 = require("./auto-yes-poller-state");
16
+ /**
17
+ * Issue #3214: the form the four suppression exits of `detectAndRespondToPrompt`
18
+ * share. Records why Auto-Yes left the prompt alone (`recordPolicySuppression`,
19
+ * not throttled), then prints the WARN once per frame (`warnOncePerFrame`).
20
+ *
21
+ * @param suppression - Handed to `recordPolicySuppression` as is
22
+ * @param warnFrameKey - Handed to `warnOncePerFrame` as is: the prompt's
23
+ * `frameKey` plus the exit's own detail
24
+ * @param event - The WARN's log name
25
+ * @param detail - The WARN's fields after `worktreeId`, `cliToolId` and `instanceId`
26
+ */
27
+ function suppressAndWarnOnce(prompt, suppression, warnFrameKey, event, detail) {
28
+ const { worktreeId, cliToolId, instanceId } = prompt;
29
+ (0, auto_yes_suppression_state_1.recordPolicySuppression)(worktreeId, cliToolId, instanceId, suppression);
30
+ (0, auto_yes_poller_state_1.warnOncePerFrame)(prompt.pollerState, warnFrameKey, event, {
31
+ worktreeId,
32
+ cliToolId,
33
+ instanceId,
34
+ ...detail,
35
+ });
36
+ }
37
+ /**
38
+ * Issue #3214: steps 3, 3.2 and 3.5 of `detectAndRespondToPrompt` -- the frames
39
+ * that read as a prompt and are still not Auto-Yes's to answer, judged in the
40
+ * order they always were. "The detection above" in the comments below is that
41
+ * function's step 1.
42
+ *
43
+ * Issue #3397: step 3.5 no longer records its refusal here. It hands the gate's
44
+ * verdict back so `tryEnterFallback` can look at the frame first, and records
45
+ * through {@link suppressUnclassifiedFrame} when that sends nothing. Steps 3 and
46
+ * 3.2 still win: an Enter never reaches codex's launch dialogs or its `/model`
47
+ * picker.
48
+ *
49
+ * @param frame - The tick's one normalised frame (Issue #3183)
50
+ */
51
+ function suppressIfNotOursToAnswer(prompt, frame) {
52
+ const { cliToolId, promptData, frameKey } = prompt;
53
+ // 3. Issue #1829: codex's own launch dialogs are CodexTool.waitForReady()'s
54
+ // to answer, not the poller's. Every one of them defaults to option 1, and
55
+ // the base rules answer the default:
56
+ //
57
+ // "Hooks need review" -> 1. Review hooks (undoes Issue #1760; the pane
58
+ // then sits two screens deep in a review UI that
59
+ // only `t`/`esc` leave, reported as `running`)
60
+ // "Update available" -> 1. Update now (undoes Issue #890; runs
61
+ // `npm install -g @openai/codex`, killing codex)
62
+ // "Do you trust …" -> 1. Yes, continue
63
+ //
64
+ // waitForReady answers the same screens deliberately and differently ('3',
65
+ // '2', '1' — each without a trailing Enter), but only during startSession,
66
+ // while this poller runs on its own 2s phase for the life of the session.
67
+ // Whichever sees the dialog first decides, so the fix is to leave them all
68
+ // to the tool. Auto-answer layer only: the detection above still reports the
69
+ // prompt, so the human keeps seeing the screen and the response poller
70
+ // still notifies them about it.
71
+ const launchDialog = cliToolId === 'codex' ? (0, cli_patterns_1.getCodexLifecycleDialog)(frame) : null;
72
+ if (launchDialog) {
73
+ // Recorded through the #1684 channel so `capture --json` and `cmate wait`
74
+ // can name the reason instead of showing a worker that went quiet.
75
+ suppressAndWarnOnce(prompt, { reason: 'agent-launch-dialog', mode: null, promptType: promptData.type }, `${frameKey}\u0000${launchDialog}`, 'poller:auto-yes-skipped-launch-dialog', { dialog: launchDialog, promptType: promptData.type });
76
+ return { kind: 'left-alone' };
77
+ }
78
+ // 3.2. Issue #3062: codex's `/model` picker (both stages) is not ours to
79
+ // answer. A digit there is an immediate decision, so the base rules'
80
+ // default would choose the model and effort for the operator. Judged by the
81
+ // picker's own footer, not by `kind: picker`, which the hooks screens share.
82
+ // The tool's `detectPrompt` still reports the prompt, so `/prompt-response`
83
+ // (the human's answer) is unaffected. Reuses `unclassified-frame`: the tool
84
+ // recognised the frame and deliberately declined it.
85
+ if (cliToolId === 'codex' && (0, detect_1.isCodexModelPickerFrame)(frame)) {
86
+ suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000codex-model-picker`, 'poller:auto-yes-skipped-model-picker', { promptType: promptData.type });
87
+ return { kind: 'left-alone' };
88
+ }
89
+ // 3.5. Issue #1928 (§4 D1 decision 4): the generic numbered-list inference is
90
+ // not enough to send an answer. The detection above judges the ROWS, and the
91
+ // rows of an agent's own reply can be indistinguishable from a dialog's --
92
+ // opencode 1.18 answering "list three options and ask which one" is the
93
+ // reported case (#1896), and the `1` this poller sent in reply was not
94
+ // answering anything, it was SENT AS A USER UTTERANCE. What separates the two
95
+ // is position and chrome, which only the tool's own module knows, so the
96
+ // decision is delegated to `detectDialog` (the seam #1927 declared).
97
+ //
98
+ // Per tool, and only for tools whose dialogs were measured from their own
99
+ // live captures -- see AUTO_YES_DIALOG_GATE_DEFAULT_MODE. An ungated tool
100
+ // reaches `allowed: true` without being judged, which is the pre-#1928
101
+ // behaviour and the right one where nobody has measured anything.
102
+ //
103
+ // Recorded through the #1684 channel with the reason code #1924 landed for
104
+ // exactly this position, so `capture --json` and `cmate wait` can name the
105
+ // gap instead of showing a worker that silently went quiet.
106
+ const dialogGate = (0, auto_yes_dialog_gate_1.evaluateAutoYesDialogGate)(cliToolId, promptData.type, frame);
107
+ if (!dialogGate.allowed) {
108
+ return { kind: 'dialog-gate-refused', dialogGate };
109
+ }
110
+ return { kind: 'ours' };
111
+ }
112
+ /**
113
+ * Step 3.5's record: the tool's dialog detector did not vouch for the frame and
114
+ * nothing was sent (Issue #1928). Split out of `suppressIfNotOursToAnswer` by
115
+ * Issue #3397, unchanged, so it runs after `tryEnterFallback` declined.
116
+ */
117
+ function suppressUnclassifiedFrame(prompt, dialogGate) {
118
+ const { promptData, frameKey } = prompt;
119
+ suppressAndWarnOnce(prompt, { reason: 'unclassified-frame', mode: null, promptType: promptData.type }, `${frameKey}\u0000${dialogGate.dialog?.kind ?? ''}\u0000${dialogGate.mode}`, 'poller:auto-yes-skipped-unclassified-frame', {
120
+ promptType: promptData.type,
121
+ dialogKind: dialogGate.dialog?.kind ?? null,
122
+ answerMode: dialogGate.dialog?.answerMode ?? null,
123
+ gateMode: dialogGate.mode,
124
+ });
125
+ }
@@ -6,15 +6,53 @@
6
6
  * Uses SHA-256 content hash with an in-memory cache (Map<pollerKey, hash>).
7
7
  * Design decision [DR1-006]: In-memory only (no DB layer).
8
8
  * Process restart may cause a single duplicate, which is acceptable (KISS).
9
+ *
10
+ * ## How often the skip says so (Issue #3538)
11
+ *
12
+ * A full-screen TUI (copilot, opencode) keeps polling while it sits on a
13
+ * prompt, so the same prompt is a duplicate on every 2 s tick until it is
14
+ * answered, and `duplicate-prompt-skipped` used to be logged on each of them.
15
+ * The run of duplicate ticks is counted here, the same way `response-dedup`
16
+ * counts `duplicate-response-skipped` (#3519): the line is written on the first
17
+ * tick of a run and then once per {@link DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL}
18
+ * ticks. The count is about one particular cached hash, so it never outlives
19
+ * it — the functions below that drop or move the hash drop or move the count
20
+ * too. The one exception runs the other way: a tick that reads a frame with no
21
+ * live prompt on it ends the run without touching the hash
22
+ * ({@link resetDuplicatePromptSkipStreak}), because the prompt left the screen
23
+ * while the guard still has to keep it from being saved twice. A returning
24
+ * prompt is then still suppressed, but its first duplicate logs as the first
25
+ * of a new run.
26
+ *
27
+ * Only the log line is thinned. `recordPromptDedupSkip` (#1695) is still called
28
+ * on every duplicate tick; its tally is what `capture --json` reports.
9
29
  */
10
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL = void 0;
11
32
  exports.isDuplicatePrompt = isDuplicatePrompt;
33
+ exports.claimDuplicatePromptSkipLog = claimDuplicatePromptSkipLog;
34
+ exports.resetDuplicatePromptSkipStreak = resetDuplicatePromptSkipStreak;
12
35
  exports.clearPromptHashCache = clearPromptHashCache;
13
36
  exports.renamePromptHashCacheKey = renamePromptHashCacheKey;
14
37
  exports.normalizePromptForDedup = normalizePromptForDedup;
15
38
  const crypto_1 = require("crypto");
16
39
  const global_state_1 = require("../global-state");
40
+ const response_dedup_1 = require("./response-dedup");
17
41
  const promptHashCache = (0, global_state_1.getOrInitGlobal)('__promptHashCache', () => new Map());
42
+ /**
43
+ * In-memory cache: pollerKey -> how many duplicate ticks in a row the current
44
+ * cached prompt hash has been skipped (Issue #3538). Absence means none yet.
45
+ *
46
+ * On `globalThis` for the same reason `promptHashCache` is, and cleared and
47
+ * moved at exactly the same moments — see the module comment.
48
+ */
49
+ const duplicatePromptSkipStreak = (0, global_state_1.getOrInitGlobal)('__duplicatePromptSkipStreak', () => new Map());
50
+ /**
51
+ * How many duplicate ticks separate two `duplicate-prompt-skipped` lines
52
+ * (Issue #3538). Shared with `duplicate-response-skipped` (#3519): one line a
53
+ * minute at the poller's 2 s tick.
54
+ */
55
+ exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL = response_dedup_1.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL;
18
56
  /**
19
57
  * Check if the given prompt content is a duplicate of the last saved prompt
20
58
  * for the same pollerKey. If not a duplicate, updates the cache.
@@ -29,8 +67,46 @@ function isDuplicatePrompt(pollerKey, content) {
29
67
  return true;
30
68
  }
31
69
  promptHashCache.set(pollerKey, hash);
70
+ // Issue #3538: a new prompt starts a new run of duplicate ticks.
71
+ duplicatePromptSkipStreak.delete(pollerKey);
32
72
  return false;
33
73
  }
74
+ /**
75
+ * Count one duplicate prompt tick for this pollerKey and say whether it should
76
+ * be logged (Issue #3538).
77
+ *
78
+ * A claim: it advances the count, so call it exactly once per duplicate tick.
79
+ * Logs on the first tick of a run and then on every
80
+ * {@link DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL}th tick after it (ticks 1,
81
+ * 1+N, 1+2N, …).
82
+ *
83
+ * @param pollerKey - Poller key ("worktreeId:cliToolId")
84
+ * @returns Whether to log, the run length so far, and the ticks left unlogged
85
+ * since the previous line
86
+ */
87
+ function claimDuplicatePromptSkipLog(pollerKey) {
88
+ const consecutive = (duplicatePromptSkipStreak.get(pollerKey) ?? 0) + 1;
89
+ duplicatePromptSkipStreak.set(pollerKey, consecutive);
90
+ const log = (consecutive - 1) % exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL === 0;
91
+ const suppressed = consecutive === 1 ? 0 : exports.DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL - 1;
92
+ return { log, consecutive, suppressed };
93
+ }
94
+ /**
95
+ * End the current run of duplicate prompt ticks for this pollerKey without
96
+ * touching the cached hash (Issue #3538).
97
+ *
98
+ * Called by `response-checker` on every tick that does not reach the prompt
99
+ * guard with a live prompt — a working screen, an unfinished frame, a reply.
100
+ * The prompt is no longer on screen, so if the same prompt comes back the next
101
+ * duplicate is the first of a new run and logs. The hash stays: whether the
102
+ * returning prompt is saved again is the guard's question (#565), and this
103
+ * Issue only thins the log line.
104
+ *
105
+ * @param pollerKey - Poller key ("worktreeId:cliToolId")
106
+ */
107
+ function resetDuplicatePromptSkipStreak(pollerKey) {
108
+ duplicatePromptSkipStreak.delete(pollerKey);
109
+ }
34
110
  /**
35
111
  * Clear the prompt hash cache for a specific pollerKey.
36
112
  * Called during session cleanup / stopPolling.
@@ -39,6 +115,8 @@ function isDuplicatePrompt(pollerKey, content) {
39
115
  */
40
116
  function clearPromptHashCache(pollerKey) {
41
117
  promptHashCache.delete(pollerKey);
118
+ // Issue #3538: the skip count is about the same hash.
119
+ duplicatePromptSkipStreak.delete(pollerKey);
42
120
  }
43
121
  /**
44
122
  * Move the cached hash from one pollerKey to another.
@@ -57,9 +135,22 @@ function renamePromptHashCacheKey(oldKey, newKey) {
57
135
  if (oldKey === newKey)
58
136
  return;
59
137
  const hash = promptHashCache.get(oldKey);
138
+ const streak = duplicatePromptSkipStreak.get(oldKey);
60
139
  promptHashCache.delete(oldKey);
61
- if (hash !== undefined)
62
- promptHashCache.set(newKey, hash);
140
+ duplicatePromptSkipStreak.delete(oldKey);
141
+ if (hash === undefined)
142
+ return;
143
+ promptHashCache.set(newKey, hash);
144
+ // Issue #3538: the skip count moves with the hash, so a rename mid-run does
145
+ // not restart the thinning and log as if a new run had begun. Whenever the
146
+ // hash under `newKey` is replaced, so is its count — a count left over from
147
+ // the hash that was there before is about a different prompt.
148
+ if (streak !== undefined) {
149
+ duplicatePromptSkipStreak.set(newKey, streak);
150
+ }
151
+ else {
152
+ duplicatePromptSkipStreak.delete(newKey);
153
+ }
63
154
  }
64
155
  /**
65
156
  * Normalize prompt content before deduplication check.
@@ -491,6 +491,15 @@ function extractCompletedTurn(ctx, output, lastCapturedLine) {
491
491
  // Extract response
492
492
  const result = extractResponse(output, lastCapturedLine, cliToolId, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES);
493
493
  if (!result || !result.isComplete) {
494
+ // Issue #3538: an unfinished frame was read and carries no live prompt (the
495
+ // early prompt check in `extractResponse` would have returned it complete),
496
+ // so a run of duplicate prompt ticks is over; the hash is kept — see the
497
+ // helper. Only when the frame WAS read: a null result is extraction being
498
+ // skipped on the line count ("no new output"), which says nothing about
499
+ // whether the prompt is still on screen, and neither do the cursor returns
500
+ // further down.
501
+ if (result)
502
+ (0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
494
503
  // DR-004 windowing: Only check tail lines
495
504
  const { thinkingPattern } = (0, cli_patterns_1.getCliToolPatterns)(cliToolId);
496
505
  const cleanOutput = (0, cli_patterns_1.stripAnsi)(output);
@@ -565,7 +574,19 @@ function savePromptMessage(ctx, promptDetection, result, isFullScreenTui) {
565
574
  // classified (#1676) look identical from the CLI — both say "nothing was
566
575
  // recorded". Count the skip so the payload can tell them apart.
567
576
  (0, prompt_dedup_state_1.recordPromptDedupSkip)(worktreeId, cliToolId, instanceId);
568
- logger.info('duplicate-prompt-skipped', { worktreeId, cliToolId });
577
+ // Issue #3538: the tally above is counted on every tick; the log line is
578
+ // not. A full-screen TUI sits on its prompt for as long as it stays
579
+ // unanswered, a duplicate every 2 s. The first tick of a run logs exactly
580
+ // as before; after that one line per `DUPLICATE_PROMPT_SKIP_LOG_TICK_INTERVAL`
581
+ // ticks, with the run length and how many ticks went unlogged (#3519).
582
+ const skipLog = (0, prompt_dedup_1.claimDuplicatePromptSkipLog)(pollerKey);
583
+ if (skipLog.log) {
584
+ logger.info('duplicate-prompt-skipped', {
585
+ worktreeId,
586
+ cliToolId,
587
+ ...(skipLog.consecutive > 1 ? { consecutive: skipLog.consecutive, suppressed: skipLog.suppressed } : {}),
588
+ });
589
+ }
569
590
  return false;
570
591
  }
571
592
  // Issue #571: Clean TUI decorations from Copilot prompt content before saving
@@ -723,7 +744,21 @@ async function recheckDuplicateResponse(ctx, result, claudeMetadata) {
723
744
  // logged nothing at all, so a reply that never reached History left no
724
745
  // trace anywhere. Same action name shape as its sibling so both skips
725
746
  // are found by one grep.
726
- logger.info('duplicate-response-skipped', { worktreeId, cliToolId, instanceId: resolvedInstanceId });
747
+ //
748
+ // Issue #3519: but not on every tick. A finished screen that stays up is a
749
+ // duplicate on each of the cycle's 900 ticks, and logging all of them was
750
+ // 51,933 lines a day. The first tick of a run logs exactly as before; after
751
+ // that one line per `DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL` ticks, with
752
+ // the run length and how many ticks went unlogged since the last line.
753
+ const skipLog = (0, response_dedup_1.claimDuplicateResponseSkipLog)(pollerKey);
754
+ if (skipLog.log) {
755
+ logger.info('duplicate-response-skipped', {
756
+ worktreeId,
757
+ cliToolId,
758
+ instanceId: resolvedInstanceId,
759
+ ...(skipLog.consecutive > 1 ? { consecutive: skipLog.consecutive, suppressed: skipLog.suppressed } : {}),
760
+ });
761
+ }
727
762
  (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
728
763
  // Issue #2399: the skip above is about the SCREEN, and until this Issue
729
764
  // it also ended the tick for the TRANSCRIPT READER 100 lines below —
@@ -1156,6 +1191,9 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1156
1191
  if (promptIsLive) {
1157
1192
  return savePromptMessage(ctx, promptDetection, result, isFullScreenTui);
1158
1193
  }
1194
+ // Issue #3538: a finished frame without a live prompt ends the run of
1195
+ // duplicate prompt ticks, as an unfinished one does in `extractCompletedTurn`.
1196
+ (0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
1159
1197
  // Validate response content is not empty
1160
1198
  if (!result.response || result.response.trim() === '') {
1161
1199
  (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
@@ -39,10 +39,22 @@
39
39
  * hash, and the worktree rename all have to treat the two the same, and the
40
40
  * only way to guarantee that without touching `response-poller-core` (which
41
41
  * owns those three calls) is for one function to clear both.
42
+ *
43
+ * ## The third cache: how often the skip says so (#3519)
44
+ *
45
+ * The skip logs `duplicate-response-skipped` so a reply missing from History
46
+ * leaves a grep-able trace (#1695). Logged on every tick, a screen that stays
47
+ * up writes that line every 2 s for the whole cycle — 51,933 lines in 24 h,
48
+ * 80% of the server log. The run of duplicate ticks is counted here so the line
49
+ * is written on the first tick of a run and then once per
50
+ * {@link DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL} ticks. The count is about
51
+ * one particular cached hash, so it lives and dies with it for the same reason
52
+ * the recheck does.
42
53
  */
43
54
  Object.defineProperty(exports, "__esModule", { value: true });
44
- exports.STRUCTURED_HISTORY_RECHECK_TICK_INTERVAL = void 0;
55
+ exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL = exports.STRUCTURED_HISTORY_RECHECK_TICK_INTERVAL = void 0;
45
56
  exports.isDuplicateResponse = isDuplicateResponse;
57
+ exports.claimDuplicateResponseSkipLog = claimDuplicateResponseSkipLog;
46
58
  exports.markStructuredHistoryRecheckPending = markStructuredHistoryRecheckPending;
47
59
  exports.settleStructuredHistoryRecheck = settleStructuredHistoryRecheck;
48
60
  exports.claimStructuredHistoryRecheck = claimStructuredHistoryRecheck;
@@ -79,6 +91,25 @@ const structuredHistoryRecheckCache = (0, global_state_1.getOrInitGlobal)('__str
79
91
  * or the cycle ends, the entry is gone.
80
92
  */
81
93
  exports.STRUCTURED_HISTORY_RECHECK_TICK_INTERVAL = 3;
94
+ /**
95
+ * In-memory cache: pollerKey -> how many duplicate ticks in a row the current
96
+ * cached hash has been skipped (Issue #3519). Absence means none yet.
97
+ *
98
+ * On `globalThis` for the same reason `responseHashCache` is, and cleared and
99
+ * moved at exactly the same moments — see the module comment. A new
100
+ * (non-duplicate) response restarts it in {@link isDuplicateResponse}.
101
+ */
102
+ const duplicateResponseSkipStreak = (0, global_state_1.getOrInitGlobal)('__duplicateResponseSkipStreak', () => new Map());
103
+ /**
104
+ * How many duplicate ticks separate two `duplicate-response-skipped` lines
105
+ * (Issue #3519).
106
+ *
107
+ * At the poller's 2 s tick this is one line a minute while a finished screen
108
+ * stays up, so a 900-tick cycle writes 30 lines instead of 899. The first tick
109
+ * of a run always logs, so the #1695 trace — "this reply was skipped, at this
110
+ * time" — is still there for every run; what is dropped is the repetition.
111
+ */
112
+ exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL = 30;
82
113
  /**
83
114
  * Check whether the given response content was already saved during the current
84
115
  * polling cycle for the same pollerKey. If it is new, updates the cache.
@@ -93,8 +124,30 @@ function isDuplicateResponse(pollerKey, content) {
93
124
  return true;
94
125
  }
95
126
  responseHashCache.set(pollerKey, hash);
127
+ // Issue #3519: a new response starts a new run of duplicate ticks.
128
+ duplicateResponseSkipStreak.delete(pollerKey);
96
129
  return false;
97
130
  }
131
+ /**
132
+ * Count one duplicate tick for this pollerKey and say whether it should be
133
+ * logged (Issue #3519).
134
+ *
135
+ * A claim, like {@link claimStructuredHistoryRecheck}: it advances the count, so
136
+ * call it exactly once per duplicate tick. Logs on the first tick of a run and
137
+ * then on every {@link DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL}th tick after
138
+ * it (ticks 1, 1+N, 1+2N, …).
139
+ *
140
+ * @param pollerKey - Poller key ("worktreeId:instanceId")
141
+ * @returns Whether to log, the run length so far, and the ticks left unlogged
142
+ * since the previous line
143
+ */
144
+ function claimDuplicateResponseSkipLog(pollerKey) {
145
+ const consecutive = (duplicateResponseSkipStreak.get(pollerKey) ?? 0) + 1;
146
+ duplicateResponseSkipStreak.set(pollerKey, consecutive);
147
+ const log = (consecutive - 1) % exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL === 0;
148
+ const suppressed = consecutive === 1 ? 0 : exports.DUPLICATE_RESPONSE_SKIP_LOG_TICK_INTERVAL - 1;
149
+ return { log, consecutive, suppressed };
150
+ }
98
151
  /**
99
152
  * Note that the transcript reader has unfinished business for this pollerKey
100
153
  * (Issue #2399).
@@ -177,6 +230,8 @@ function claimStructuredHistoryRecheck(pollerKey) {
177
230
  function clearResponseHashCache(pollerKey) {
178
231
  responseHashCache.delete(pollerKey);
179
232
  structuredHistoryRecheckCache.delete(pollerKey);
233
+ // Issue #3519: the skip count is about the same hash.
234
+ duplicateResponseSkipStreak.delete(pollerKey);
180
235
  }
181
236
  /**
182
237
  * Move the cached hash from one pollerKey to another.
@@ -206,4 +261,10 @@ function renameResponseHashCacheKey(oldKey, newKey) {
206
261
  structuredHistoryRecheckCache.delete(oldKey);
207
262
  if (ticksToWait !== undefined)
208
263
  structuredHistoryRecheckCache.set(newKey, ticksToWait);
264
+ // Issue #3519: the skip count moves with the hash too, so a rename mid-run
265
+ // does not restart the thinning and log as if a new run had begun.
266
+ const streak = duplicateResponseSkipStreak.get(oldKey);
267
+ duplicateResponseSkipStreak.delete(oldKey);
268
+ if (streak !== undefined)
269
+ duplicateResponseSkipStreak.set(newKey, streak);
209
270
  }
@@ -322,8 +322,8 @@ function shortSessionTag(sessionId) {
322
322
  /**
323
323
  * Forget every `stop` one session of one instance has claimed (Issue #3289).
324
324
  *
325
- * Every subtype: antigravity posts `stop` / `self_resume_pending` (#2614)
326
- * beside the plain one.
325
+ * Every subtype: antigravity (#2614) and claude (#3430) post `stop` /
326
+ * `self_resume_pending` beside the plain one.
327
327
  */
328
328
  function releaseStopClaims(composite, sessionId) {
329
329
  releaseClaims(composite, ['stop'], sessionId);
@@ -39,7 +39,7 @@
39
39
  * @module lib/session/agent-event-state
40
40
  */
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
- exports.STRUCTURED_PROMPT_PROVISIONAL_MAX_AGE_MS = exports.recordAskUserQuestion = exports.getAskUserQuestion = exports.clearAskUserQuestion = exports.isAwaitingInstruction = exports.getAwaitingInstruction = exports.STRUCTURED_STATE_MAX_AGE_MS = exports.getStructuredSessionState = exports.observeScraperCompletionEvidence = exports.joinOpenTurnFromDuplicate = exports.getPublishedAgentTurn = exports.getPendingDecisions = exports.getAgentTurn = exports.closeAgentTurn = exports.recordCapturedModelInfo = exports.recordAgentReportedModel = exports.recordAgentReportedEffort = exports.onAgentModelChange = exports.isSameAgentModelName = exports.getResolvedAgentModelInfo = exports.getLastReportedAgentEffort = exports.getLastKnownAgentModel = exports.getLastKnownAgentEffort = exports.getLastCapturedModelInfo = exports.getAgentModelBaseline = exports.AGENT_MODEL_EFFORT_SUFFIX_PATTERN = exports.shortSessionTag = exports.LIFECYCLE_AGENT_EVENT_TYPES = exports.isDuplicateAgentEvent = exports.getRecentEventKeyCount = exports.getRecentEventIdentityCount = exports.getAgentEventDropCounts = exports.classifyAgentEventDelivery = exports.agentEventKeyClaimedAt = exports.AGENT_EVENT_DEDUP_WINDOW_MS = void 0;
42
+ exports.STRUCTURED_PROMPT_PROVISIONAL_MAX_AGE_MS = exports.recordAskUserQuestion = exports.getAskUserQuestion = exports.clearAskUserQuestion = exports.isAwaitingInstruction = exports.getAwaitingInstruction = exports.STRUCTURED_STATE_MAX_AGE_MS = exports.getStructuredSessionState = exports.observeScraperCompletionEvidence = exports.joinOpenTurnFromDuplicate = exports.isPreToolUseOutsideTurn = exports.getPublishedAgentTurn = exports.getPendingDecisions = exports.getAgentTurn = exports.closeAgentTurn = exports.recordCapturedModelInfo = exports.recordAgentReportedModel = exports.recordAgentReportedEffort = exports.onAgentModelChange = exports.isSameAgentModelName = exports.getResolvedAgentModelInfo = exports.getLastReportedAgentEffort = exports.getLastKnownAgentModel = exports.getLastKnownAgentEffort = exports.getLastCapturedModelInfo = exports.getAgentModelBaseline = exports.AGENT_MODEL_EFFORT_SUFFIX_PATTERN = exports.shortSessionTag = exports.LIFECYCLE_AGENT_EVENT_TYPES = exports.isDuplicateAgentEvent = exports.getRecentEventKeyCount = exports.getRecentEventIdentityCount = exports.getAgentEventDropCounts = exports.classifyAgentEventDelivery = exports.agentEventKeyClaimedAt = exports.AGENT_EVENT_DEDUP_WINDOW_MS = void 0;
43
43
  exports.recordAgentStopEvent = recordAgentStopEvent;
44
44
  exports.getLastStopEventAt = getLastStopEventAt;
45
45
  exports.recordAgentEvent = recordAgentEvent;
@@ -92,6 +92,7 @@ Object.defineProperty(exports, "closeAgentTurn", { enumerable: true, get: functi
92
92
  Object.defineProperty(exports, "getAgentTurn", { enumerable: true, get: function () { return agent_event_turn_2.getAgentTurn; } });
93
93
  Object.defineProperty(exports, "getPendingDecisions", { enumerable: true, get: function () { return agent_event_turn_2.getPendingDecisions; } });
94
94
  Object.defineProperty(exports, "getPublishedAgentTurn", { enumerable: true, get: function () { return agent_event_turn_2.getPublishedAgentTurn; } });
95
+ Object.defineProperty(exports, "isPreToolUseOutsideTurn", { enumerable: true, get: function () { return agent_event_turn_2.isPreToolUseOutsideTurn; } });
95
96
  Object.defineProperty(exports, "joinOpenTurnFromDuplicate", { enumerable: true, get: function () { return agent_event_turn_2.joinOpenTurnFromDuplicate; } });
96
97
  Object.defineProperty(exports, "observeScraperCompletionEvidence", { enumerable: true, get: function () { return agent_event_turn_2.observeScraperCompletionEvidence; } });
97
98
  var agent_event_structured_state_2 = require("../../lib/session/agent-event-structured-state");