commandmate 0.45.0 → 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 (236) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +265 -264
  3. package/.next/app-path-routes-manifest.json +18 -18
  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_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  62. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/route.js +1 -1
  148. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  150. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  152. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  153. package/.next/server/app/page_client-reference-manifest.js +1 -1
  154. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  156. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  157. package/.next/server/app/sessions/page.js +1 -1
  158. package/.next/server/app/sessions/page.js.nft.json +1 -1
  159. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  160. package/.next/server/app/skills/[skillId]/page.js +2 -2
  161. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  162. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  163. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  164. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  165. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  166. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  167. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  168. package/.next/server/app/worktrees/[id]/page.js +4 -4
  169. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  170. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  171. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  172. package/.next/server/app-paths-manifest.json +18 -18
  173. package/.next/server/chunks/2119.js +1 -1
  174. package/.next/server/chunks/2335.js +1 -0
  175. package/.next/server/chunks/2404.js +1 -1
  176. package/.next/server/chunks/2445.js +1 -1
  177. package/.next/server/chunks/2460.js +1 -1
  178. package/.next/server/chunks/{4802.js → 4243.js} +1 -1
  179. package/.next/server/chunks/4837.js +3 -3
  180. package/.next/server/chunks/5209.js +1 -1
  181. package/.next/server/chunks/5625.js +2 -2
  182. package/.next/server/chunks/6130.js +1 -1
  183. package/.next/server/chunks/6401.js +1 -1
  184. package/.next/server/chunks/6927.js +1 -1
  185. package/.next/server/chunks/8728.js +1 -1
  186. package/.next/server/chunks/9355.js +1 -0
  187. package/.next/server/chunks/9862.js +1 -0
  188. package/.next/server/middleware-build-manifest.js +1 -1
  189. package/.next/server/middleware-manifest.json +5 -5
  190. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  191. package/.next/server/pages/500.html +1 -1
  192. package/.next/server/server-reference-manifest.json +1 -1
  193. package/.next/static/chunks/{7485.8a2a9d7c5396aa26.js → 1111.5ab4f0ffb0d944e5.js} +2 -2
  194. package/.next/static/chunks/{1642-767aed8e7c61ef7f.js → 1642-0f1bf8fb8161e10a.js} +1 -1
  195. package/.next/static/chunks/{2407-dd4a0f04f1349221.js → 2407-86890b00eeecf391.js} +1 -1
  196. package/.next/static/chunks/3662-5a27ee39a3ecba49.js +1 -0
  197. package/.next/static/chunks/3922.0bc2e4e168d2b522.js +1 -0
  198. package/.next/static/chunks/4541-b0ce0bf829ae79b7.js +1 -0
  199. package/.next/static/chunks/4727-4c69d1aa4118cc09.js +1 -0
  200. package/.next/static/chunks/5371-af1c2b68e983da61.js +1 -0
  201. package/.next/static/chunks/6288-09feba367cc2c65e.js +1 -0
  202. package/.next/static/chunks/953.31c52a251deda22d.js +1 -0
  203. package/.next/static/chunks/app/{layout-07d040cb3d3ea657.js → layout-eaa6365f8f942e88.js} +1 -1
  204. package/.next/static/chunks/app/sessions/{page-2af68c63211c751f.js → page-ebfed2c80e916fb8.js} +1 -1
  205. package/.next/static/chunks/app/skills/[skillId]/page-e4b14031f946c007.js +1 -0
  206. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +1 -0
  207. package/.next/static/chunks/app/worktrees/[id]/page-3372b78fde232b1f.js +1 -0
  208. package/.next/static/chunks/{webpack-165d8df9acd1c5d4.js → webpack-ee3ccbe378c4aa06.js} +1 -1
  209. package/.next/static/css/{057f64a65726c439.css → 6faeb04a0b6819d4.css} +1 -1
  210. package/.next/trace +13 -13
  211. package/dist/server/locales/en/worktree.json +2 -1
  212. package/dist/server/locales/ja/worktree.json +2 -1
  213. package/dist/server/src/lib/auto-yes-poller.js +16 -163
  214. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +1 -1
  215. package/dist/server/src/lib/polling/auto-yes-poller-state.js +52 -0
  216. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +125 -0
  217. package/dist/server/src/lib/polling/prompt-dedup.js +93 -2
  218. package/dist/server/src/lib/polling/response-checker.js +40 -2
  219. package/dist/server/src/lib/polling/response-dedup.js +62 -1
  220. package/package.json +1 -1
  221. package/release-notes/0.45.1.json +38 -0
  222. package/.next/server/chunks/364.js +0 -1
  223. package/.next/server/chunks/488.js +0 -1
  224. package/.next/server/chunks/5326.js +0 -1
  225. package/.next/static/chunks/2053-390e77fce43b555c.js +0 -1
  226. package/.next/static/chunks/3922.f45dcfc1e7da552a.js +0 -1
  227. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +0 -1
  228. package/.next/static/chunks/8283-26ad31a4670ea52d.js +0 -1
  229. package/.next/static/chunks/8566-aeda747542072ace.js +0 -1
  230. package/.next/static/chunks/8811-29eaa24237f48558.js +0 -1
  231. package/.next/static/chunks/953.19e4c8178c9eac4c.js +0 -1
  232. package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +0 -1
  233. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-5445205c8dd80109.js +0 -1
  234. package/.next/static/chunks/app/worktrees/[id]/page-35f0e31a725d1c89.js +0 -1
  235. /package/.next/static/{TPWbZB3zBp3Zv_eFEOlmt → vYIpFRCU_Mt0wtG8F_3-6}/_buildManifest.js +0 -0
  236. /package/.next/static/{TPWbZB3zBp3Zv_eFEOlmt → vYIpFRCU_Mt0wtG8F_3-6}/_ssgManifest.js +0 -0
@@ -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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.45.0",
3
+ "version": "0.45.1",
4
4
  "description": "No long blocks of time? Run an AI team from your phone. Git worktree sessions, task contracts and verification gates for Claude Code, Codex, Gemini CLI, Copilot, OpenCode, Antigravity and Command Code.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -0,0 +1,38 @@
1
+ {
2
+ "version": "0.45.1",
3
+ "date": "2026-10-10",
4
+ "highlight": {
5
+ "ja": "チャットと履歴で mermaid の図が描かれるようになり、履歴検索の強調が正しい位置に当たるようになりました。",
6
+ "en": "Mermaid diagrams now render in chat and History, and History search highlights now land on the right text."
7
+ },
8
+ "added": [
9
+ {
10
+ "ja": "チャットの回答と履歴で、mermaid のコードが図として表示されるようになりました(ダークテーマにも対応)。",
11
+ "en": "Mermaid code in chat answers and History is now drawn as a diagram, including in the dark theme."
12
+ },
13
+ {
14
+ "ja": "ファイルを単独で開いたページでも、mermaid のコードが図として表示されるようになりました。",
15
+ "en": "Mermaid code is now drawn as a diagram when a file is opened on its own page."
16
+ }
17
+ ],
18
+ "improved": [
19
+ {
20
+ "ja": "画面が止まっている間に同じ内容のログが繰り返し出ていたのを減らし、サーバーのログ量を大きく減らしました。",
21
+ "en": "The server log no longer repeats the same line while a screen stays unchanged, which greatly reduces its size."
22
+ }
23
+ ],
24
+ "fixed": [
25
+ {
26
+ "ja": "履歴検索の強調が、太字やリンクなどの記法の文字数だけずれていた問題を直しました。",
27
+ "en": "Fixed History search highlights being shifted by the length of formatting such as bold text and links."
28
+ },
29
+ {
30
+ "ja": "履歴検索で、mermaid の図の中のヒットが強調されないことがある問題を直しました。",
31
+ "en": "Fixed History search sometimes not highlighting matches inside mermaid diagrams."
32
+ },
33
+ {
34
+ "ja": "スキルのフォルダに説明ファイルが無いだけで、サーバーのログにエラーが出ていた問題を直しました。",
35
+ "en": "Fixed the server log reporting an error for skill folders that simply have no description file."
36
+ }
37
+ ]
38
+ }