commandmate 0.45.1 → 0.46.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 (296) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +302 -298
  3. package/.next/app-path-routes-manifest.json +15 -15
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +4 -4
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page.js +1 -1
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update/route_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_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
  69. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -3
  75. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -3
  118. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -3
  120. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  122. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/route.js +1 -1
  152. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/login/page.js +1 -1
  154. package/.next/server/app/login/page.js.nft.json +1 -1
  155. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/more/page.js +1 -1
  158. package/.next/server/app/more/page.js.nft.json +1 -1
  159. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/offline/page.js +1 -1
  161. package/.next/server/app/offline/page.js.nft.json +1 -1
  162. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  163. package/.next/server/app/page.js +1 -1
  164. package/.next/server/app/page.js.nft.json +1 -1
  165. package/.next/server/app/page_client-reference-manifest.js +1 -1
  166. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/repositories/page.js +2 -2
  168. package/.next/server/app/repositories/page.js.nft.json +1 -1
  169. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  170. package/.next/server/app/review/page.js +1 -1
  171. package/.next/server/app/review/page.js.nft.json +1 -1
  172. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  173. package/.next/server/app/sessions/page.js +1 -1
  174. package/.next/server/app/sessions/page.js.nft.json +1 -1
  175. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  176. package/.next/server/app/skills/[skillId]/page.js +1 -1
  177. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  178. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  179. package/.next/server/app/skills/installed/page.js +1 -1
  180. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  181. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  182. package/.next/server/app/skills/page.js +1 -1
  183. package/.next/server/app/skills/page.js.nft.json +1 -1
  184. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  185. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  186. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  187. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  188. package/.next/server/app/worktrees/[id]/page.js +12 -9
  189. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  190. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  191. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  192. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  193. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  194. package/.next/server/app-paths-manifest.json +15 -15
  195. package/.next/server/chunks/1341.js +1 -1
  196. package/.next/server/chunks/1501.js +2 -2
  197. package/.next/server/chunks/2119.js +1 -1
  198. package/.next/server/chunks/2283.js +15 -13
  199. package/.next/server/chunks/2404.js +4 -4
  200. package/.next/server/chunks/2445.js +1 -1
  201. package/.next/server/chunks/2560.js +1 -1
  202. package/.next/server/chunks/3543.js +1 -1
  203. package/.next/server/chunks/3945.js +1 -1
  204. package/.next/server/chunks/4072.js +15 -0
  205. package/.next/server/chunks/4207.js +1 -1
  206. package/.next/server/chunks/4718.js +3 -3
  207. package/.next/server/chunks/4837.js +3 -3
  208. package/.next/server/chunks/5625.js +1 -1
  209. package/.next/server/chunks/6130.js +1 -1
  210. package/.next/server/chunks/6345.js +1 -0
  211. package/.next/server/chunks/6401.js +1 -1
  212. package/.next/server/chunks/6722.js +1 -0
  213. package/.next/server/chunks/8098.js +1 -1
  214. package/.next/server/chunks/8356.js +1 -1
  215. package/.next/server/chunks/8581.js +25 -29
  216. package/.next/server/chunks/8728.js +1 -1
  217. package/.next/server/chunks/8800.js +4 -4
  218. package/.next/server/chunks/9731.js +1 -1
  219. package/.next/server/middleware-build-manifest.js +1 -1
  220. package/.next/server/middleware-manifest.json +5 -5
  221. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  222. package/.next/server/pages/500.html +1 -1
  223. package/.next/server/pages/_error.js +2 -2
  224. package/.next/server/server-reference-manifest.json +1 -1
  225. package/.next/static/chunks/{2407-86890b00eeecf391.js → 2407-acb644c5487e1720.js} +1 -1
  226. package/.next/static/chunks/{2619-a305ad4810f1393a.js → 2619-04bc32f026a0d946.js} +1 -1
  227. package/.next/static/chunks/2717.21abf5b6bbd45520.js +1 -0
  228. package/.next/static/chunks/2770-db80aedf6384d594.js +1 -0
  229. package/.next/static/chunks/2863-6a07ec82fb52f4dd.js +1 -0
  230. package/.next/static/chunks/3201-c01f1feed69020e6.js +1 -0
  231. package/.next/static/chunks/4768-ad6f82f034f21eae.js +1 -0
  232. package/.next/static/chunks/5371-a94ed618148287a0.js +1 -0
  233. package/.next/static/chunks/5794-947fb4934d8be193.js +1 -0
  234. package/.next/static/chunks/5927-54315d21f323e204.js +1 -0
  235. package/.next/static/chunks/602-25e45a2422d2a3ea.js +1 -0
  236. package/.next/static/chunks/6606-02ddc006686a6b7d.js +1 -0
  237. package/.next/static/chunks/6654-f3534f35f16644bc.js +1 -0
  238. package/.next/static/chunks/7730-011e137be64403ae.js +1 -0
  239. package/.next/static/chunks/8165-263172c17ae8e8c3.js +1 -0
  240. package/.next/static/chunks/8606-cf6bdbff44a764cf.js +1 -0
  241. package/.next/static/chunks/934-a37509667baa86ee.js +1 -0
  242. package/.next/static/chunks/9465-e5a351baa941f31b.js +1 -0
  243. package/.next/static/chunks/app/layout-ae30ce63569c22be.js +1 -0
  244. package/.next/static/chunks/app/repositories/page-71f5a5ac29b0370d.js +1 -0
  245. package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +1 -0
  246. package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +1 -0
  247. package/.next/static/chunks/app/skills/[skillId]/page-52ba58712faf3378.js +1 -0
  248. package/.next/static/chunks/app/worktrees/[id]/page-2eb1d0fd0a077b7e.js +1 -0
  249. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-c601f3b3ece6557e.js → page-373ea37b16d930c7.js} +1 -1
  250. package/.next/static/chunks/{webpack-ee3ccbe378c4aa06.js → webpack-c0b821f340afdebf.js} +1 -1
  251. package/.next/static/css/743f79ff19ab91e9.css +1 -0
  252. package/.next/trace +13 -13
  253. package/dist/server/locales/en/worktree.json +46 -16
  254. package/dist/server/locales/ja/worktree.json +46 -16
  255. package/dist/server/src/config/activity-bar-config.js +56 -9
  256. package/dist/server/src/lib/polling/prompt-dedup-state.js +26 -7
  257. package/dist/server/src/lib/polling/prompt-dedup.js +50 -22
  258. package/dist/server/src/lib/polling/response-checker.js +14 -1
  259. package/dist/server/src/lib/polling/response-dedup.js +104 -20
  260. package/dist/server/src/lib/polling/response-poller-core.js +47 -26
  261. package/dist/server/src/lib/session/next-action-helper.js +2 -15
  262. package/dist/server/src/lib/verification/env-clean-gate.js +14 -1
  263. package/dist/server/src/lib/verification/gate-runner.js +17 -11
  264. package/dist/server/src/lib/verification/scope-gate.js +169 -3
  265. package/dist/server/src/types/sidebar.js +1 -0
  266. package/docs/en/architecture.md +26 -14
  267. package/docs/en/user-guide/webapp-guide.md +31 -18
  268. package/package.json +1 -1
  269. package/release-notes/0.46.0.json +110 -0
  270. package/.next/server/chunks/1674.js +0 -15
  271. package/.next/server/chunks/6927.js +0 -1
  272. package/.next/server/chunks/9355.js +0 -1
  273. package/.next/static/chunks/1642-0f1bf8fb8161e10a.js +0 -1
  274. package/.next/static/chunks/2770-827a64760bab8a3a.js +0 -1
  275. package/.next/static/chunks/3922.0bc2e4e168d2b522.js +0 -1
  276. package/.next/static/chunks/4727-4c69d1aa4118cc09.js +0 -1
  277. package/.next/static/chunks/4768-fc0aa1d0891cac08.js +0 -1
  278. package/.next/static/chunks/5371-af1c2b68e983da61.js +0 -1
  279. package/.next/static/chunks/5521-c358c31f60e5e689.js +0 -1
  280. package/.next/static/chunks/6192-a67df090838b9aad.js +0 -1
  281. package/.next/static/chunks/6322-f1b30ed0ee43518f.js +0 -1
  282. package/.next/static/chunks/6654-ac431270fac1a283.js +0 -1
  283. package/.next/static/chunks/8165-3525fb42f1b4976e.js +0 -1
  284. package/.next/static/chunks/8318-01e7d1e5ad0a15a3.js +0 -1
  285. package/.next/static/chunks/8606-79c36d4c204bbd38.js +0 -1
  286. package/.next/static/chunks/9619-6c17a271f7f98fbb.js +0 -1
  287. package/.next/static/chunks/998-2eb5883186abd0bd.js +0 -1
  288. package/.next/static/chunks/app/layout-eaa6365f8f942e88.js +0 -1
  289. package/.next/static/chunks/app/repositories/page-6f7511f4ac8449e2.js +0 -1
  290. package/.next/static/chunks/app/review/page-95f749caae382f46.js +0 -1
  291. package/.next/static/chunks/app/sessions/page-ebfed2c80e916fb8.js +0 -1
  292. package/.next/static/chunks/app/skills/[skillId]/page-e4b14031f946c007.js +0 -1
  293. package/.next/static/chunks/app/worktrees/[id]/page-3372b78fde232b1f.js +0 -1
  294. package/.next/static/css/6faeb04a0b6819d4.css +0 -1
  295. /package/.next/static/{vYIpFRCU_Mt0wtG8F_3-6 → zI2nQ6WKboSbFbMF4EtrJ}/_buildManifest.js +0 -0
  296. /package/.next/static/{vYIpFRCU_Mt0wtG8F_3-6 → zI2nQ6WKboSbFbMF4EtrJ}/_ssgManifest.js +0 -0
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "agentStatus": {
3
- "moreAgents": "{count} more agents",
4
- "overflowTrigger": "More agents"
3
+ "overflowTrigger": "More agents",
4
+ "otherSessions": "{count} more",
5
+ "otherSessionsLabel": "{count} other sessions",
6
+ "otherSessionsWaitingLabel": "{count} other sessions, {waiting} waiting for your answer",
7
+ "otherSessionsList": "Other sessions",
8
+ "inSplit": "Split {index}",
9
+ "addSession": "Add session…"
5
10
  },
6
11
  "toc": {
7
12
  "title": "Contents",
@@ -508,6 +513,7 @@
508
513
  },
509
514
  "terminal": {
510
515
  "historyLabel": "History",
516
+ "actionBarMore": "Show hidden items",
511
517
  "filesLabel": "Open Files",
512
518
  "showHistory": "Show history",
513
519
  "hideHistory": "Hide history",
@@ -515,8 +521,6 @@
515
521
  "hideFiles": "Hide open files",
516
522
  "equalizeWidths": "Equal widths",
517
523
  "equalizeWidthsHint": "Equalize terminal widths and reset History width",
518
- "addSplit": "Add split",
519
- "removeSplit": "Remove split",
520
524
  "selectInstance": "Select agent instance for {split}",
521
525
  "moreActions": "More actions",
522
526
  "searchTerminal": "Search terminal",
@@ -531,7 +535,13 @@
531
535
  "maximizeShortcutHint": "⌘ / Ctrl + Shift + Enter",
532
536
  "maximizedStatus": "Split {split} maximized",
533
537
  "loading": "Loading…",
534
- "sessionEnded": "The session has ended. Send a message to start a new session."
538
+ "sessionEnded": "The session has ended. Send a message to start a new session.",
539
+ "layoutGroupLabel": "Split layout",
540
+ "layoutSplits": "Split layout: {count}",
541
+ "composerTarget": "To: {agent} · {branch}",
542
+ "composerTargetNoBranch": "To: {agent}",
543
+ "composerTargetLabel": "This input sends to {agent} on {branch}",
544
+ "composerTargetLabelNoBranch": "This input sends to {agent}"
535
545
  },
536
546
  "surfaceMode": {
537
547
  "groupLabel": "Output surface for {split}",
@@ -1063,7 +1073,6 @@
1063
1073
  }
1064
1074
  },
1065
1075
  "activityBar": {
1066
- "toggleSidebar": "Toggle sidebar",
1067
1076
  "label": "Activity Bar",
1068
1077
  "files": "File Tree",
1069
1078
  "git": "Git",
@@ -1075,7 +1084,6 @@
1075
1084
  "skills": "Skills",
1076
1085
  "verification": "Verification",
1077
1086
  "env": "Env",
1078
- "settings": "Settings",
1079
1087
  "settingsMenu": {
1080
1088
  "settings": "Settings",
1081
1089
  "skills": "Skills",
@@ -1089,6 +1097,11 @@
1089
1097
  "version": "CommandMate {version}"
1090
1098
  }
1091
1099
  },
1100
+ "headerTools": {
1101
+ "label": "Worktree tools",
1102
+ "more": "More tools",
1103
+ "moreActive": "More tools ({label} is open)"
1104
+ },
1092
1105
  "branchMismatch": {
1093
1106
  "changedFrom": "Branch changed from",
1094
1107
  "to": "to",
@@ -1169,7 +1182,10 @@
1169
1182
  },
1170
1183
  "desktopLayout": {
1171
1184
  "activityPane": "Activity pane",
1172
- "terminalPane": "Terminal pane"
1185
+ "terminalPane": "Terminal pane",
1186
+ "pinPane": "Pin beside the terminal",
1187
+ "unpinPane": "Unpin (show over the terminal)",
1188
+ "closePane": "Close panel"
1173
1189
  },
1174
1190
  "worktreeStatus": {
1175
1191
  "notSet": "Not set",
@@ -1178,13 +1194,6 @@
1178
1194
  "inReview": "In Review",
1179
1195
  "done": "Done"
1180
1196
  },
1181
- "card": {
1182
- "main": "Main",
1183
- "description": "Description",
1184
- "link": "Link",
1185
- "openLink": "Open link in new tab",
1186
- "updated": "Updated {time}"
1187
- },
1188
1197
  "detail": {
1189
1198
  "worktree": "Worktree",
1190
1199
  "repository": "Repository",
@@ -1218,7 +1227,8 @@
1218
1227
  "subTabGit": "Git",
1219
1228
  "statusPillWithModel": "{label}: {status} — model {model}",
1220
1229
  "statusPillWithUsage": "{base} — {usage}",
1221
- "statusPillWithSource": "{base} — {source}"
1230
+ "statusPillWithSource": "{base} — {source}",
1231
+ "openRepositories": "{repository} — open Repositories"
1222
1232
  },
1223
1233
  "detailStatus": {
1224
1234
  "idle": "Idle - No active session",
@@ -1476,6 +1486,7 @@
1476
1486
  "failingGates": "Gates that did not pass: {gates}",
1477
1487
  "gatesPassed": "All {count} gates passed",
1478
1488
  "openHint": "Open the Verification pane",
1489
+ "closeHint": "Close the Verification pane",
1479
1490
  "dash": "—",
1480
1491
  "unverified": "Not verified",
1481
1492
  "noTask": "No execution contract has been sent to this branch",
@@ -1670,5 +1681,24 @@
1670
1681
  "noteInstanceFlag": "--instance is how a command names its target. --agent is only for starting an ad-hoc session the roster does not know, and wait has no --agent at all.",
1671
1682
  "noteWaitOnPrompt": "wait carries --on-prompt human so it keeps waiting when the agent asks something. Without it the default (agent) exits 10 the moment a prompt is detected.",
1672
1683
  "noteRespondNumber": "respond does not interpret its answer. Send the NUMBER of the option: \"yes\" is typed, ignored, and followed by Enter, which picks whatever the default option happens to be."
1684
+ },
1685
+ "agentAdd": {
1686
+ "button": "Add agent",
1687
+ "title": "Add agent",
1688
+ "tool": "Agent",
1689
+ "notInstalled": "{name} (not installed)",
1690
+ "installedUnknown": "Could not check which agents are installed; every agent is listed.",
1691
+ "name": "Name (optional)",
1692
+ "namePlaceholder": "e.g. Review",
1693
+ "placement": "Open in",
1694
+ "placementNewSplit": "New split",
1695
+ "placementReplace": "Replace the current split",
1696
+ "placementRosterOnly": "Add only",
1697
+ "placementNewSplitFull": "All {max} splits are in use",
1698
+ "startHint": "The session starts when you send the first message.",
1699
+ "submit": "Add",
1700
+ "cancel": "Cancel",
1701
+ "saveError": "Could not add the agent.",
1702
+ "maxReached": "Up to {max} agents per branch"
1673
1703
  }
1674
1704
  }
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "agentStatus": {
3
- "moreAgents": "他 {count} 件のエージェント",
4
- "overflowTrigger": "他のエージェント"
3
+ "overflowTrigger": "他のエージェント",
4
+ "otherSessions": "ほか {count}",
5
+ "otherSessionsLabel": "ほかのセッション {count} 件",
6
+ "otherSessionsWaitingLabel": "ほかのセッション {count} 件(うち {waiting} 件が応答待ち)",
7
+ "otherSessionsList": "ほかのセッション",
8
+ "inSplit": "分割 {index}",
9
+ "addSession": "セッションを追加…"
5
10
  },
6
11
  "toc": {
7
12
  "title": "目次",
@@ -508,6 +513,7 @@
508
513
  },
509
514
  "terminal": {
510
515
  "historyLabel": "履歴",
516
+ "actionBarMore": "隠れている項目を表示",
511
517
  "filesLabel": "開いているファイル",
512
518
  "showHistory": "履歴を表示",
513
519
  "hideHistory": "履歴を非表示",
@@ -515,8 +521,6 @@
515
521
  "hideFiles": "開いているファイルを非表示",
516
522
  "equalizeWidths": "均等幅",
517
523
  "equalizeWidthsHint": "ターミナル幅を均等にし、履歴幅を初期値に戻す",
518
- "addSplit": "分割を追加",
519
- "removeSplit": "分割を削除",
520
524
  "selectInstance": "{split} のエージェントインスタンスを選択",
521
525
  "moreActions": "その他の操作",
522
526
  "searchTerminal": "ターミナル内を検索",
@@ -531,7 +535,13 @@
531
535
  "maximizeShortcutHint": "⌘ / Ctrl + Shift + Enter",
532
536
  "maximizedStatus": "{split} を最大化中",
533
537
  "loading": "読込中...",
534
- "sessionEnded": "セッションは終了しています。送信すると新しいセッションが起動します。"
538
+ "sessionEnded": "セッションは終了しています。送信すると新しいセッションが起動します。",
539
+ "layoutGroupLabel": "分割の並べ方",
540
+ "layoutSplits": "{count} 分割",
541
+ "composerTarget": "To: {agent} · {branch}",
542
+ "composerTargetNoBranch": "To: {agent}",
543
+ "composerTargetLabel": "この入力欄は {branch} の {agent} に送信します",
544
+ "composerTargetLabelNoBranch": "この入力欄は {agent} に送信します"
535
545
  },
536
546
  "surfaceMode": {
537
547
  "groupLabel": "{split} の出力面",
@@ -1063,7 +1073,6 @@
1063
1073
  }
1064
1074
  },
1065
1075
  "activityBar": {
1066
- "toggleSidebar": "サイドバーを切り替え",
1067
1076
  "label": "アクティビティバー",
1068
1077
  "files": "ファイルツリー",
1069
1078
  "git": "Git",
@@ -1075,7 +1084,6 @@
1075
1084
  "skills": "スキル",
1076
1085
  "verification": "検証",
1077
1086
  "env": "環境変数",
1078
- "settings": "設定",
1079
1087
  "settingsMenu": {
1080
1088
  "settings": "設定",
1081
1089
  "skills": "スキル",
@@ -1089,6 +1097,11 @@
1089
1097
  "version": "CommandMate {version}"
1090
1098
  }
1091
1099
  },
1100
+ "headerTools": {
1101
+ "label": "ワークツリーの道具",
1102
+ "more": "ほかの道具",
1103
+ "moreActive": "ほかの道具({label} を表示中)"
1104
+ },
1092
1105
  "branchMismatch": {
1093
1106
  "changedFrom": "ブランチが",
1094
1107
  "to": "から",
@@ -1169,7 +1182,10 @@
1169
1182
  },
1170
1183
  "desktopLayout": {
1171
1184
  "activityPane": "アクティビティペイン",
1172
- "terminalPane": "ターミナルペイン"
1185
+ "terminalPane": "ターミナルペイン",
1186
+ "pinPane": "ターミナルの横に固定",
1187
+ "unpinPane": "固定を解除(ターミナルの上に重ねる)",
1188
+ "closePane": "パネルを閉じる"
1173
1189
  },
1174
1190
  "worktreeStatus": {
1175
1191
  "notSet": "未設定",
@@ -1178,13 +1194,6 @@
1178
1194
  "inReview": "レビュー中",
1179
1195
  "done": "完了"
1180
1196
  },
1181
- "card": {
1182
- "main": "メイン",
1183
- "description": "説明",
1184
- "link": "リンク",
1185
- "openLink": "リンクを新しいタブで開く",
1186
- "updated": "更新 {time}"
1187
- },
1188
1197
  "detail": {
1189
1198
  "worktree": "ワークツリー",
1190
1199
  "repository": "リポジトリ",
@@ -1218,7 +1227,8 @@
1218
1227
  "subTabGit": "Git",
1219
1228
  "statusPillWithModel": "{label}: {status} — モデル {model}",
1220
1229
  "statusPillWithUsage": "{base} — {usage}",
1221
- "statusPillWithSource": "{base} — {source}"
1230
+ "statusPillWithSource": "{base} — {source}",
1231
+ "openRepositories": "{repository} — リポジトリの画面を開く"
1222
1232
  },
1223
1233
  "detailStatus": {
1224
1234
  "idle": "アイドル - セッションなし",
@@ -1476,6 +1486,7 @@
1476
1486
  "failingGates": "不合格ゲート: {gates}",
1477
1487
  "gatesPassed": "全 {count} ゲート合格",
1478
1488
  "openHint": "検証ペインを開く",
1489
+ "closeHint": "検証ペインを閉じる",
1479
1490
  "dash": "—",
1480
1491
  "unverified": "未検証",
1481
1492
  "noTask": "このブランチには実行契約が送られていません",
@@ -1670,5 +1681,24 @@
1670
1681
  "noteInstanceFlag": "送り先を指定するのは --instance です。--agent は roster に無いインスタンスをアドホックに起動するためのもので、wait には --agent 自体がありません。",
1671
1682
  "noteWaitOnPrompt": "wait には --on-prompt human を付けてあります。付けないと既定の agent モードになり、プロンプトを検出した時点で exit 10 で即座に終了します。",
1672
1683
  "noteRespondNumber": "respond は回答を意味解決しません。選択肢は番号で送ってください。「yes」は入力されたあと無視され、続く Enter がその時点の既定選択を選んでしまいます。"
1684
+ },
1685
+ "agentAdd": {
1686
+ "button": "エージェントを追加",
1687
+ "title": "エージェントを追加",
1688
+ "tool": "エージェント",
1689
+ "notInstalled": "{name}(未インストール)",
1690
+ "installedUnknown": "インストール済みかを確認できなかったため、すべてのエージェントを表示しています。",
1691
+ "name": "名前(任意)",
1692
+ "namePlaceholder": "例: レビュー",
1693
+ "placement": "開く場所",
1694
+ "placementNewSplit": "新しい分割",
1695
+ "placementReplace": "今の分割を置き換え",
1696
+ "placementRosterOnly": "追加だけ",
1697
+ "placementNewSplitFull": "分割は {max} つすべて使用中です",
1698
+ "startHint": "セッションは最初のメッセージを送ったときに起動します。",
1699
+ "submit": "追加",
1700
+ "cancel": "キャンセル",
1701
+ "saveError": "エージェントを追加できませんでした。",
1702
+ "maxReached": "1 つのブランチに追加できるのは {max} 件までです"
1673
1703
  }
1674
1704
  }
@@ -5,22 +5,26 @@
5
5
  * Defines the VS Code-style Activity Bar identifiers and metadata.
6
6
  * This module is consumed by:
7
7
  * - `src/hooks/useActivityBarState.ts`
8
- * - `src/components/worktree/ActivityBar.tsx`
8
+ * - `src/components/worktree/HeaderToolBar.tsx` (PC, Issue #3591)
9
9
  * - `src/components/worktree/ActivityPane.tsx`
10
10
  * - `src/components/worktree/WorktreeDetailRefactored.tsx`
11
11
  *
12
- * The Activity Bar is a 48px-wide vertical bar that hosts the activities below.
12
+ * The Activity Bar was a 48px-wide vertical bar that hosted the activities
13
+ * below. Issue #3591: on PC they are icons at the right of the worktree header
14
+ * ({@link HEADER_TOOLS}) and the Verification chip; the names below keep the
15
+ * "activity bar" wording (storage keys, test helpers).
13
16
  * Re-clicking the active icon toggles the ActivityPane closed (null).
14
17
  */
15
18
  Object.defineProperty(exports, "__esModule", { value: true });
16
- exports.ACTIVITY_CLOSED_SENTINEL = exports.ACTIVITY_BAR_STORAGE_KEY_PREFIX = exports.DEFAULT_ACTIVITY = exports.VALID_ACTIVITY_IDS = exports.ACTIVITIES = void 0;
19
+ exports.ACTIVITY_PANE_PINNED_STORAGE_KEY = exports.ACTIVITY_CLOSED_SENTINEL = exports.ACTIVITY_BAR_STORAGE_KEY_PREFIX = exports.INITIAL_ACTIVITY = exports.DEFAULT_ACTIVITY = exports.VALID_ACTIVITY_IDS = exports.HEADER_TOOLS = exports.CHIP_ACTIVITY_ID = exports.ACTIVITIES = void 0;
17
20
  exports.getActivityBarStorageKey = getActivityBarStorageKey;
18
21
  exports.isActivityId = isActivityId;
19
22
  const lucide_react_1 = require("lucide-react");
20
23
  /**
21
- * Ordered list of activities rendered top-to-bottom in the Activity Bar.
22
- * The order here is the visual order in the ActivityBar UI and the keyboard
23
- * navigation order (ArrowDown/ArrowUp).
24
+ * Ordered list of activities. The order here is the visual order of the
25
+ * header tools ({@link HEADER_TOOLS}, drawn by `HeaderToolBar.tsx`) and the
26
+ * keyboard navigation order (ArrowLeft/ArrowRight in the header). The mobile
27
+ * tab bar has its own list and does not follow it.
24
28
  */
25
29
  exports.ACTIVITIES = [
26
30
  // Issue #2616: the two-sheet `Files`, not the single-sheet `File` — at 20px
@@ -44,14 +48,43 @@ exports.ACTIVITIES = [
44
48
  // both users and tests, so an insert would silently renumber every tab.
45
49
  { id: 'env', labelKey: 'activityBar.env', icon: lucide_react_1.KeyRound },
46
50
  ];
51
+ /**
52
+ * The activity whose entry point is not a header tool (Issue #3591): the
53
+ * Verification pane opens from the Verification chip on the second row
54
+ * (`VerificationStatusChip`, #3590), which already says where the branch
55
+ * stands. It stays in {@link ACTIVITIES} — the pane, its label and the stored
56
+ * state are unchanged — and is only left out of {@link HEADER_TOOLS}.
57
+ */
58
+ exports.CHIP_ACTIVITY_ID = 'verification';
59
+ /**
60
+ * The tools drawn at the right of the PC worktree header (Issue #3591), in
61
+ * {@link ACTIVITIES} order — the order of the ←/→ keys. Every activity except
62
+ * {@link CHIP_ACTIVITY_ID}. On a narrow header the trailing ones fold behind a
63
+ * "…" button (`useDesktopHeaderFit`).
64
+ */
65
+ exports.HEADER_TOOLS = exports.ACTIVITIES.filter((activity) => activity.id !== exports.CHIP_ACTIVITY_ID);
47
66
  /**
48
67
  * Set of valid ActivityId values for runtime validation.
49
68
  */
50
69
  exports.VALID_ACTIVITY_IDS = new Set(exports.ACTIVITIES.map((a) => a.id));
51
70
  /**
52
- * Default activity selected on first visit / fallback when persisted value is invalid.
71
+ * The first activity — where keyboard focus lands when no activity is open
72
+ * (`HeaderToolBar`'s roving tabindex).
73
+ *
74
+ * Issue #3589: no longer what an unvisited worktree opens. That is
75
+ * {@link INITIAL_ACTIVITY} (closed), so the terminal starts at full width.
53
76
  */
54
77
  exports.DEFAULT_ACTIVITY = 'files';
78
+ /**
79
+ * What the worktree screen shows when nothing is stored for the worktree (or
80
+ * the stored value is not a known activity) — Issue #3589: `null`, the pane
81
+ * starts closed. Before #3589 this was {@link DEFAULT_ACTIVITY} ('files'),
82
+ * which took ~18% of the body away from the terminal on every first visit.
83
+ *
84
+ * A stored value (an activity or {@link ACTIVITY_CLOSED_SENTINEL}) is still
85
+ * honoured as-is.
86
+ */
87
+ exports.INITIAL_ACTIVITY = null;
55
88
  /**
56
89
  * localStorage key prefix used by `useActivityBarState` (Issue #858).
57
90
  *
@@ -72,8 +105,8 @@ exports.ACTIVITY_BAR_STORAGE_KEY_PREFIX = 'commandmate.worktree.activeActivity-'
72
105
  * Unlike the pre-#858 behavior — which intentionally did NOT persist the closed
73
106
  * state — the closed state is now stored so that hiding the pane on one branch
74
107
  * survives a round-trip to another branch and back. It is distinct from "no
75
- * stored value" (an unvisited worktree), which still defaults to
76
- * {@link DEFAULT_ACTIVITY}.
108
+ * stored value" (an unvisited worktree), which defaults to
109
+ * {@link INITIAL_ACTIVITY} (closed since Issue #3589).
77
110
  */
78
111
  exports.ACTIVITY_CLOSED_SENTINEL = '__closed__';
79
112
  /**
@@ -88,3 +121,17 @@ function getActivityBarStorageKey(worktreeId) {
88
121
  function isActivityId(value) {
89
122
  return typeof value === 'string' && exports.VALID_ACTIVITY_IDS.has(value);
90
123
  }
124
+ /**
125
+ * localStorage key for whether the activity pane is pinned (Issue #3589).
126
+ *
127
+ * - `'true'` → pinned: the pane sits beside the body and narrows it (the
128
+ * pre-#3589 layout).
129
+ * - anything else / absent → not pinned: the pane is laid OVER the body, which
130
+ * keeps its width, and closes on Esc / × / a re-click of its icon / an
131
+ * outside click / opening a file.
132
+ *
133
+ * One global key, not one per worktree: pinning is a choice about how the
134
+ * screen is laid out, so it carries across worktrees. Read and written by
135
+ * `usePanePinnedState` in `src/hooks/useActivityPaneOverlay.ts`.
136
+ */
137
+ exports.ACTIVITY_PANE_PINNED_STORAGE_KEY = 'commandmate.worktree.activityPanePinned';
@@ -37,6 +37,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
37
37
  exports.recordPromptDedupSkip = recordPromptDedupSkip;
38
38
  exports.getPromptDedupSkips = getPromptDedupSkips;
39
39
  exports.renamePromptDedupSkips = renamePromptDedupSkips;
40
+ exports.renamePromptDedupSkipsBatch = renamePromptDedupSkipsBatch;
40
41
  exports.clearPromptDedupSkips = clearPromptDedupSkips;
41
42
  const auto_yes_state_1 = require("../../lib/auto-yes-state");
42
43
  const global_state_1 = require("../global-state");
@@ -80,13 +81,31 @@ function getPromptDedupSkips(worktreeId, cliToolId, instanceId) {
80
81
  * No-op when the IDs match or nothing is recorded under the old one.
81
82
  */
82
83
  function renamePromptDedupSkips(oldWorktreeId, newWorktreeId, cliToolId, instanceId) {
83
- if (oldWorktreeId === newWorktreeId)
84
- return;
85
- const oldKey = (0, auto_yes_state_1.buildCompositeKey)(oldWorktreeId, cliToolId, instanceId);
86
- const record = promptDedupSkips.get(oldKey);
87
- promptDedupSkips.delete(oldKey);
88
- if (record !== undefined) {
89
- promptDedupSkips.set((0, auto_yes_state_1.buildCompositeKey)(newWorktreeId, cliToolId, instanceId), record);
84
+ renamePromptDedupSkipsBatch([{ oldWorktreeId, newWorktreeId, cliToolId, instanceId }]);
85
+ }
86
+ /**
87
+ * Carry the tallies of a whole batch of sessions across a worktree-ID rename
88
+ * (Issue #3553).
89
+ *
90
+ * Every source tally is lifted before any is written, so a swap (A→B, B→A) or
91
+ * a chain (A→B→C) cannot overwrite a tally that has not moved yet. Per entry
92
+ * this is exactly {@link renamePromptDedupSkips}.
93
+ */
94
+ function renamePromptDedupSkipsBatch(renames) {
95
+ const lifted = [];
96
+ for (const { oldWorktreeId, newWorktreeId, cliToolId, instanceId } of renames) {
97
+ if (oldWorktreeId === newWorktreeId)
98
+ continue;
99
+ const oldKey = (0, auto_yes_state_1.buildCompositeKey)(oldWorktreeId, cliToolId, instanceId);
100
+ lifted.push({
101
+ newKey: (0, auto_yes_state_1.buildCompositeKey)(newWorktreeId, cliToolId, instanceId),
102
+ record: promptDedupSkips.get(oldKey),
103
+ });
104
+ promptDedupSkips.delete(oldKey);
105
+ }
106
+ for (const { newKey, record } of lifted) {
107
+ if (record !== undefined)
108
+ promptDedupSkips.set(newKey, record);
90
109
  }
91
110
  }
92
111
  /** Drop every recorded tally. Test seam. */
@@ -34,6 +34,7 @@ exports.claimDuplicatePromptSkipLog = claimDuplicatePromptSkipLog;
34
34
  exports.resetDuplicatePromptSkipStreak = resetDuplicatePromptSkipStreak;
35
35
  exports.clearPromptHashCache = clearPromptHashCache;
36
36
  exports.renamePromptHashCacheKey = renamePromptHashCacheKey;
37
+ exports.renamePromptHashCacheKeys = renamePromptHashCacheKeys;
37
38
  exports.normalizePromptForDedup = normalizePromptForDedup;
38
39
  const crypto_1 = require("crypto");
39
40
  const global_state_1 = require("../global-state");
@@ -95,10 +96,14 @@ function claimDuplicatePromptSkipLog(pollerKey) {
95
96
  * End the current run of duplicate prompt ticks for this pollerKey without
96
97
  * touching the cached hash (Issue #3538).
97
98
  *
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
99
+ * Called by `response-checker` in two places: `extractCompletedTurn`, when the
100
+ * frame was read and is unfinished (a working screen), and `checkForResponse`,
101
+ * when a finished frame carries no live prompt (a reply). The prompt is no
102
+ * longer on screen, so if the same prompt comes back the next duplicate is the
103
+ * first of a new run and logs. Not called on a tick that skipped extraction on
104
+ * the line count (a null result) or returned on the cursor, nor on a tick that
105
+ * ended before extraction: none of them says the prompt has left the screen,
106
+ * so the run carries on through them. The hash stays: whether the
102
107
  * returning prompt is saved again is the guard's question (#565), and this
103
108
  * Issue only thins the log line.
104
109
  *
@@ -126,30 +131,53 @@ function clearPromptHashCache(pollerKey) {
126
131
  * re-save the prompt it is currently sitting on as a fresh message, which is
127
132
  * the duplicate this module exists to prevent.
128
133
  *
129
- * No-op when nothing is cached under `oldKey`.
134
+ * No-op when nothing is cached under `oldKey`. A batch of renames whose keys
135
+ * overlap must go through {@link renamePromptHashCacheKeys} instead.
130
136
  *
131
137
  * @param oldKey - Poller key the cache entry lives under
132
138
  * @param newKey - Poller key it should live under
133
139
  */
134
140
  function renamePromptHashCacheKey(oldKey, newKey) {
135
- if (oldKey === newKey)
136
- return;
137
- const hash = promptHashCache.get(oldKey);
138
- const streak = duplicatePromptSkipStreak.get(oldKey);
139
- promptHashCache.delete(oldKey);
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);
141
+ renamePromptHashCacheKeys([{ oldKey, newKey }]);
142
+ }
143
+ /**
144
+ * Move the prompt hash and its skip count for a whole batch of pollerKeys
145
+ * (Issue #3553).
146
+ *
147
+ * Every source key is lifted before any destination is written, so a swap
148
+ * (A→B, B→A) or a chain (A→B→C) cannot overwrite a source that has not moved
149
+ * yet. Per pair this is exactly {@link renamePromptHashCacheKey}: nothing
150
+ * happens at the destination when the source held no hash.
151
+ *
152
+ * @param renames - Poller key moves applied together; `oldKey === newKey` is ignored
153
+ */
154
+ function renamePromptHashCacheKeys(renames) {
155
+ const lifted = [];
156
+ for (const { oldKey, newKey } of renames) {
157
+ if (oldKey === newKey)
158
+ continue;
159
+ lifted.push({
160
+ newKey,
161
+ hash: promptHashCache.get(oldKey),
162
+ streak: duplicatePromptSkipStreak.get(oldKey),
163
+ });
164
+ promptHashCache.delete(oldKey);
165
+ duplicatePromptSkipStreak.delete(oldKey);
150
166
  }
151
- else {
152
- duplicatePromptSkipStreak.delete(newKey);
167
+ for (const { newKey, hash, streak } of lifted) {
168
+ if (hash === undefined)
169
+ continue;
170
+ promptHashCache.set(newKey, hash);
171
+ // Issue #3538: the skip count moves with the hash, so a rename mid-run does
172
+ // not restart the thinning and log as if a new run had begun. Whenever the
173
+ // hash under `newKey` is replaced, so is its count — a count left over from
174
+ // the hash that was there before is about a different prompt.
175
+ if (streak !== undefined) {
176
+ duplicatePromptSkipStreak.set(newKey, streak);
177
+ }
178
+ else {
179
+ duplicatePromptSkipStreak.delete(newKey);
180
+ }
153
181
  }
154
182
  }
155
183
  /**
@@ -498,8 +498,13 @@ function extractCompletedTurn(ctx, output, lastCapturedLine) {
498
498
  // skipped on the line count ("no new output"), which says nothing about
499
499
  // whether the prompt is still on screen, and neither do the cursor returns
500
500
  // further down.
501
- if (result)
501
+ //
502
+ // Issue #3552: the same frame ends a run of duplicate response ticks for
503
+ // the same reason — an unfinished frame is not the saved reply.
504
+ if (result) {
502
505
  (0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
506
+ (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
507
+ }
503
508
  // DR-004 windowing: Only check tail lines
504
509
  const { thinkingPattern } = (0, cli_patterns_1.getCliToolPatterns)(cliToolId);
505
510
  const cleanOutput = (0, cli_patterns_1.stripAnsi)(output);
@@ -1189,6 +1194,10 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1189
1194
  // has lost the position `detectDialog` judges by.
1190
1195
  const promptIsLive = promptDetection.isPrompt && (0, response_checker_dialog_gate_1.isNumberedDialogVouched)(cliToolId, promptDetection, output);
1191
1196
  if (promptIsLive) {
1197
+ // Issue #3552: a live prompt is not the saved reply, so a run of
1198
+ // duplicate response ticks is over; the response hash is kept (a resume
1199
+ // after the answer must not re-save the reply underneath, #2230).
1200
+ (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
1192
1201
  return savePromptMessage(ctx, promptDetection, result, isFullScreenTui);
1193
1202
  }
1194
1203
  // Issue #3538: a finished frame without a live prompt ends the run of
@@ -1196,6 +1205,8 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1196
1205
  (0, prompt_dedup_1.resetDuplicatePromptSkipStreak)(pollerKey);
1197
1206
  // Validate response content is not empty
1198
1207
  if (!result.response || result.response.trim() === '') {
1208
+ // Issue #3552: an empty response is not the saved reply either.
1209
+ (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
1199
1210
  (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
1200
1211
  return false;
1201
1212
  }
@@ -1206,6 +1217,8 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
1206
1217
  const cleanedResponse = cleanCompletedResponse(cliToolId, result, pollerKey);
1207
1218
  // If cleaned response is empty or just "[No content]", skip saving
1208
1219
  if (!cleanedResponse || cleanedResponse.trim() === '' || cleanedResponse === '[No content]') {
1220
+ // Issue #3552: nor is one that cleans down to nothing.
1221
+ (0, response_dedup_1.resetDuplicateResponseSkipStreak)(pollerKey);
1209
1222
  (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
1210
1223
  (0, db_1.clearInProgressMessageId)(db, worktreeId, cliToolId, resolvedInstanceId);
1211
1224
  return false;