commandmate 0.19.0 → 0.20.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 (765) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +252 -245
  3. package/.next/app-path-routes-manifest.json +31 -31
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/app/update/route.js +5 -3
  9. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  10. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update-check/route.js +1 -1
  12. package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  15. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  16. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  18. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  19. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/messages/route.js +1 -1
  21. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  22. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/assistant/session/route.js +1 -1
  24. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  25. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/assistant/start/route.js +1 -1
  27. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  28. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/assistant/terminal/route.js +1 -1
  30. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  31. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/assistant/tools/route.js +1 -1
  33. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  34. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/login/route.js +1 -1
  36. package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  37. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/auth/logout/route.js +1 -1
  39. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  40. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/auth/status/route.js +1 -1
  42. package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  43. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/daily-summary/route.js +1 -1
  45. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  46. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  48. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  49. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  51. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  52. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  54. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  55. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/external-apps/route.js +1 -1
  57. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  58. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/fs/browse/route.js +2 -2
  60. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  61. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/fs/recent-paths/route.js +2 -2
  63. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  64. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  66. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  67. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  69. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  70. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/metrics/vibe/route.js +2 -2
  72. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  73. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/ollama/models/route.js +1 -1
  75. package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
  76. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  78. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  79. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/push/vapid/route.js +1 -1
  81. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  82. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  84. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  87. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
  88. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  90. package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
  91. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  93. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  94. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/repositories/clone/route.js +1 -1
  96. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  97. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  99. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  100. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/repositories/restore/route.js +1 -1
  102. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  103. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/repositories/route.js +1 -1
  105. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  106. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/repositories/scan/route.js +1 -1
  108. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  109. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/repositories/sync/route.js +1 -1
  111. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  112. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  114. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  115. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/sidebar/group-order/route.js +2 -2
  117. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  118. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/skills/[id]/route.js +1 -1
  120. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/skills/installations/route.js +1 -1
  123. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  124. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/skills/operations/route.js +2 -2
  126. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  127. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/skills/reindex/route.js +1 -1
  129. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  130. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/skills/route.js +1 -1
  132. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  133. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/slash-commands/route.js +1 -1
  135. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  136. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +2 -2
  138. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  139. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/tasks/[taskId]/route.js +2 -2
  141. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  142. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/templates/[id]/route.js +2 -2
  144. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  145. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/templates/route.js +2 -2
  147. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  148. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/todos/route.js +1 -1
  150. package/.next/server/app/api/todos/route.js.nft.json +1 -1
  151. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  153. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/verification/runs/route.js +1 -1
  156. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  157. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  163. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  166. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  168. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  177. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  253. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  256. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
  261. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  262. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +6 -6
  264. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  274. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  285. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  291. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  298. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  313. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/[id]/skills/route.js +2 -2
  315. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  325. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  326. package/.next/server/app/api/worktrees/[id]/tasks/route.js +4 -4
  327. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  331. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  332. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  333. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  334. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  335. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  337. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  338. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  340. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  342. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  343. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  344. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  346. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  347. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  349. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  350. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  352. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  353. package/.next/server/app/api/worktrees/[id]/verify/route.js +2 -2
  354. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  355. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  356. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  357. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  358. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  359. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  360. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  361. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  362. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  363. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  364. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  365. package/.next/server/app/api/worktrees/route.js +1 -1
  366. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  367. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  368. package/.next/server/app/apple-icon.png/route.js +1 -1
  369. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
  370. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  371. package/.next/server/app/icon.png/route.js +1 -1
  372. package/.next/server/app/icon.png/route.js.nft.json +1 -1
  373. package/.next/server/app/icon1.png/route.js +1 -1
  374. package/.next/server/app/icon1.png/route.js.nft.json +1 -1
  375. package/.next/server/app/icon2.png/route.js +1 -1
  376. package/.next/server/app/icon2.png/route.js.nft.json +1 -1
  377. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  378. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  379. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  380. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  381. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  382. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  383. package/.next/server/app/page_client-reference-manifest.js +1 -1
  384. package/.next/server/app/proxy/[...path]/route.js +1 -1
  385. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  386. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  387. package/.next/server/app/repositories/page.js +1 -1
  388. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  389. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  390. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  391. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  392. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  393. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  394. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  395. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  396. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  397. package/.next/server/app/worktrees/[id]/page.js +8 -8
  398. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  399. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  400. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  401. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  402. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  403. package/.next/server/app-paths-manifest.json +31 -31
  404. package/.next/server/chunks/1029.js +1 -0
  405. package/.next/server/chunks/1068.js +1 -1
  406. package/.next/server/chunks/1598.js +4 -0
  407. package/.next/server/chunks/3042.js +1 -1
  408. package/.next/server/chunks/3417.js +1 -0
  409. package/.next/server/chunks/3451.js +1 -1
  410. package/.next/server/chunks/3543.js +1 -1
  411. package/.next/server/chunks/3753.js +21 -17
  412. package/.next/server/chunks/3945.js +1 -1
  413. package/.next/server/chunks/406.js +5 -5
  414. package/.next/server/chunks/{1185.js → 5048.js} +1 -1
  415. package/.next/server/chunks/5959.js +3 -3
  416. package/.next/server/chunks/{5381.js → 5998.js} +2 -2
  417. package/.next/server/chunks/6130.js +1 -1
  418. package/.next/server/chunks/6274.js +5 -5
  419. package/.next/server/chunks/6283.js +1 -1
  420. package/.next/server/chunks/6401.js +1 -0
  421. package/.next/server/chunks/641.js +1 -0
  422. package/.next/server/chunks/8536.js +1 -0
  423. package/.next/server/chunks/8543.js +1 -0
  424. package/.next/server/chunks/8807.js +157 -143
  425. package/.next/server/chunks/8856.js +2 -2
  426. package/.next/server/chunks/9058.js +1 -0
  427. package/.next/server/chunks/9067.js +1 -0
  428. package/.next/server/chunks/9123.js +1 -1
  429. package/.next/server/middleware-manifest.json +5 -5
  430. package/.next/server/pages/500.html +1 -1
  431. package/.next/server/server-reference-manifest.json +1 -1
  432. package/.next/server/src/middleware.js +1 -1
  433. package/.next/server/src/middleware.js.map +1 -1
  434. package/.next/static/chunks/{6488-2c412c29258637b6.js → 6488-3e7539550c3ef358.js} +1 -1
  435. package/.next/static/chunks/744-fa8c0ae444c8338c.js +1 -0
  436. package/.next/static/chunks/app/api/app/update/route-5bdd550ed6386f57.js +1 -0
  437. package/.next/static/chunks/app/api/app/update-check/route-5bdd550ed6386f57.js +1 -0
  438. package/.next/static/chunks/app/api/assistant/conversation/route-5bdd550ed6386f57.js +1 -0
  439. package/.next/static/chunks/app/api/assistant/current-output/route-5bdd550ed6386f57.js +1 -0
  440. package/.next/static/chunks/app/api/assistant/messages/route-5bdd550ed6386f57.js +1 -0
  441. package/.next/static/chunks/app/api/assistant/session/route-5bdd550ed6386f57.js +1 -0
  442. package/.next/static/chunks/app/api/assistant/start/route-5bdd550ed6386f57.js +1 -0
  443. package/.next/static/chunks/app/api/assistant/terminal/route-5bdd550ed6386f57.js +1 -0
  444. package/.next/static/chunks/app/api/assistant/tools/route-5bdd550ed6386f57.js +1 -0
  445. package/.next/static/chunks/app/api/auth/login/route-5bdd550ed6386f57.js +1 -0
  446. package/.next/static/chunks/app/api/auth/logout/route-5bdd550ed6386f57.js +1 -0
  447. package/.next/static/chunks/app/api/auth/status/route-5bdd550ed6386f57.js +1 -0
  448. package/.next/static/chunks/app/api/daily-summary/route-5bdd550ed6386f57.js +1 -0
  449. package/.next/static/chunks/app/api/daily-summary/status/route-5bdd550ed6386f57.js +1 -0
  450. package/.next/static/chunks/app/api/external-apps/[id]/health/route-5bdd550ed6386f57.js +1 -0
  451. package/.next/static/chunks/app/api/external-apps/[id]/route-5bdd550ed6386f57.js +1 -0
  452. package/.next/static/chunks/app/api/external-apps/route-5bdd550ed6386f57.js +1 -0
  453. package/.next/static/chunks/app/api/fs/browse/route-5bdd550ed6386f57.js +1 -0
  454. package/.next/static/chunks/app/api/fs/recent-paths/route-5bdd550ed6386f57.js +1 -0
  455. package/.next/static/chunks/app/api/hooks/agent-event/route-5bdd550ed6386f57.js +1 -0
  456. package/.next/static/chunks/app/api/hooks/claude-done/route-5bdd550ed6386f57.js +1 -0
  457. package/.next/static/chunks/app/api/metrics/vibe/route-5bdd550ed6386f57.js +1 -0
  458. package/.next/static/chunks/app/api/ollama/models/route-5bdd550ed6386f57.js +1 -0
  459. package/.next/static/chunks/app/api/push/subscriptions/route-5bdd550ed6386f57.js +1 -0
  460. package/.next/static/chunks/app/api/push/vapid/route-5bdd550ed6386f57.js +1 -0
  461. package/.next/static/chunks/app/api/repositories/[id]/route-5bdd550ed6386f57.js +1 -0
  462. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +1 -0
  463. package/.next/static/chunks/app/api/repositories/[id]/todos/route-5bdd550ed6386f57.js +1 -0
  464. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-5bdd550ed6386f57.js +1 -0
  465. package/.next/static/chunks/app/api/repositories/clone/route-5bdd550ed6386f57.js +1 -0
  466. package/.next/static/chunks/app/api/repositories/excluded/route-5bdd550ed6386f57.js +1 -0
  467. package/.next/static/chunks/app/api/repositories/restore/route-5bdd550ed6386f57.js +1 -0
  468. package/.next/static/chunks/app/api/repositories/route-5bdd550ed6386f57.js +1 -0
  469. package/.next/static/chunks/app/api/repositories/scan/route-5bdd550ed6386f57.js +1 -0
  470. package/.next/static/chunks/app/api/repositories/sync/route-5bdd550ed6386f57.js +1 -0
  471. package/.next/static/chunks/app/api/repositories/validate-path/route-5bdd550ed6386f57.js +1 -0
  472. package/.next/static/chunks/app/api/sidebar/group-order/route-5bdd550ed6386f57.js +1 -0
  473. package/.next/static/chunks/app/api/skills/[id]/route-5bdd550ed6386f57.js +1 -0
  474. package/.next/static/chunks/app/api/skills/installations/route-5bdd550ed6386f57.js +1 -0
  475. package/.next/static/chunks/app/api/skills/operations/route-5bdd550ed6386f57.js +1 -0
  476. package/.next/static/chunks/app/api/skills/reindex/route-5bdd550ed6386f57.js +1 -0
  477. package/.next/static/chunks/app/api/skills/route-5bdd550ed6386f57.js +1 -0
  478. package/.next/static/chunks/app/api/slash-commands/route-5bdd550ed6386f57.js +1 -0
  479. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-5bdd550ed6386f57.js +1 -0
  480. package/.next/static/chunks/app/api/tasks/[taskId]/route-5bdd550ed6386f57.js +1 -0
  481. package/.next/static/chunks/app/api/templates/[id]/route-5bdd550ed6386f57.js +1 -0
  482. package/.next/static/chunks/app/api/templates/route-5bdd550ed6386f57.js +1 -0
  483. package/.next/static/chunks/app/api/todos/route-5bdd550ed6386f57.js +1 -0
  484. package/.next/static/chunks/app/api/verification/runs/[runId]/route-5bdd550ed6386f57.js +1 -0
  485. package/.next/static/chunks/app/api/verification/runs/route-5bdd550ed6386f57.js +1 -0
  486. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-5bdd550ed6386f57.js +1 -0
  487. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-5bdd550ed6386f57.js +1 -0
  488. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-5bdd550ed6386f57.js +1 -0
  489. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-5bdd550ed6386f57.js +1 -0
  490. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-5bdd550ed6386f57.js +1 -0
  491. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-5bdd550ed6386f57.js +1 -0
  492. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-5bdd550ed6386f57.js +1 -0
  493. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-5bdd550ed6386f57.js +1 -0
  494. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-5bdd550ed6386f57.js +1 -0
  495. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-5bdd550ed6386f57.js +1 -0
  496. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-5bdd550ed6386f57.js +1 -0
  497. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-5bdd550ed6386f57.js +1 -0
  498. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-5bdd550ed6386f57.js +1 -0
  499. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-5bdd550ed6386f57.js +1 -0
  500. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-5bdd550ed6386f57.js +1 -0
  501. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-5bdd550ed6386f57.js +1 -0
  502. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-5bdd550ed6386f57.js +1 -0
  503. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-5bdd550ed6386f57.js +1 -0
  504. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-5bdd550ed6386f57.js +1 -0
  505. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-5bdd550ed6386f57.js +1 -0
  506. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-5bdd550ed6386f57.js +1 -0
  507. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-5bdd550ed6386f57.js +1 -0
  508. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-5bdd550ed6386f57.js +1 -0
  509. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-5bdd550ed6386f57.js +1 -0
  510. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-5bdd550ed6386f57.js +1 -0
  511. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-5bdd550ed6386f57.js +1 -0
  512. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-5bdd550ed6386f57.js +1 -0
  513. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-5bdd550ed6386f57.js +1 -0
  514. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-5bdd550ed6386f57.js +1 -0
  515. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-5bdd550ed6386f57.js +1 -0
  516. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-5bdd550ed6386f57.js +1 -0
  517. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-5bdd550ed6386f57.js +1 -0
  518. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-5bdd550ed6386f57.js +1 -0
  519. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-5bdd550ed6386f57.js +1 -0
  520. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-5bdd550ed6386f57.js +1 -0
  521. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-5bdd550ed6386f57.js +1 -0
  522. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-5bdd550ed6386f57.js +1 -0
  523. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-5bdd550ed6386f57.js +1 -0
  524. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-5bdd550ed6386f57.js +1 -0
  525. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-5bdd550ed6386f57.js +1 -0
  526. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-5bdd550ed6386f57.js +1 -0
  527. package/.next/static/chunks/app/api/worktrees/[id]/route-5bdd550ed6386f57.js +1 -0
  528. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-5bdd550ed6386f57.js +1 -0
  529. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-5bdd550ed6386f57.js +1 -0
  530. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-5bdd550ed6386f57.js +1 -0
  531. package/.next/static/chunks/app/api/worktrees/[id]/search/route-5bdd550ed6386f57.js +1 -0
  532. package/.next/static/chunks/app/api/worktrees/[id]/send/route-5bdd550ed6386f57.js +1 -0
  533. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-5bdd550ed6386f57.js +1 -0
  534. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-5bdd550ed6386f57.js +1 -0
  535. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-5bdd550ed6386f57.js +1 -0
  536. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-5bdd550ed6386f57.js +1 -0
  537. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-5bdd550ed6386f57.js +1 -0
  538. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-5bdd550ed6386f57.js +1 -0
  539. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-5bdd550ed6386f57.js +1 -0
  540. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-5bdd550ed6386f57.js +1 -0
  541. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-5bdd550ed6386f57.js +1 -0
  542. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-5bdd550ed6386f57.js +1 -0
  543. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-5bdd550ed6386f57.js +1 -0
  544. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-5bdd550ed6386f57.js +1 -0
  545. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-5bdd550ed6386f57.js +1 -0
  546. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +1 -0
  547. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-5bdd550ed6386f57.js +1 -0
  548. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-5bdd550ed6386f57.js +1 -0
  549. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-5bdd550ed6386f57.js +1 -0
  550. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-5bdd550ed6386f57.js +1 -0
  551. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-5bdd550ed6386f57.js +1 -0
  552. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-5bdd550ed6386f57.js +1 -0
  553. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-5bdd550ed6386f57.js +1 -0
  554. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-5bdd550ed6386f57.js +1 -0
  555. package/.next/static/chunks/app/api/worktrees/route-5bdd550ed6386f57.js +1 -0
  556. package/.next/static/chunks/app/manifest.webmanifest/route-5bdd550ed6386f57.js +1 -0
  557. package/.next/static/chunks/app/proxy/[...path]/route-5bdd550ed6386f57.js +1 -0
  558. package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +1 -0
  559. package/.next/static/chunks/app/worktrees/[id]/layout-5bdd550ed6386f57.js +1 -0
  560. package/.next/static/chunks/app/worktrees/[id]/page-214ee8b97dca856b.js +1 -0
  561. package/.next/trace +12 -12
  562. package/.next/types/routes.d.ts +2 -1
  563. package/.next/types/validator.ts +9 -0
  564. package/README.md +10 -1
  565. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  566. package/dist/cli/commands/auto-yes.js +3 -2
  567. package/dist/cli/commands/capture.d.ts.map +1 -1
  568. package/dist/cli/commands/capture.js +3 -2
  569. package/dist/cli/commands/ls.d.ts.map +1 -1
  570. package/dist/cli/commands/ls.js +9 -3
  571. package/dist/cli/commands/respond.d.ts.map +1 -1
  572. package/dist/cli/commands/respond.js +3 -2
  573. package/dist/cli/commands/send.d.ts.map +1 -1
  574. package/dist/cli/commands/send.js +4 -3
  575. package/dist/cli/commands/update.d.ts.map +1 -1
  576. package/dist/cli/commands/update.js +66 -0
  577. package/dist/cli/commands/wait.d.ts.map +1 -1
  578. package/dist/cli/commands/wait.js +2 -1
  579. package/dist/cli/config/agent-target-options.d.ts +46 -0
  580. package/dist/cli/config/agent-target-options.d.ts.map +1 -0
  581. package/dist/cli/config/agent-target-options.js +54 -0
  582. package/dist/cli/docs/agent-operations.d.ts +2 -2
  583. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  584. package/dist/cli/docs/agent-operations.js +47 -14
  585. package/dist/cli/utils/api-client.d.ts +4 -1
  586. package/dist/cli/utils/api-client.d.ts.map +1 -1
  587. package/dist/cli/utils/api-client.js +43 -5
  588. package/dist/cli/utils/npm-runner.d.ts +24 -0
  589. package/dist/cli/utils/npm-runner.d.ts.map +1 -1
  590. package/dist/cli/utils/npm-runner.js +51 -1
  591. package/dist/cli/utils/pid-manager.d.ts +12 -2
  592. package/dist/cli/utils/pid-manager.d.ts.map +1 -1
  593. package/dist/cli/utils/pid-manager.js +76 -13
  594. package/dist/server/server.js +107 -14
  595. package/dist/server/src/lib/auto-yes-state.js +64 -0
  596. package/dist/server/src/lib/db/db-repository.js +66 -2
  597. package/dist/server/src/lib/db/db.js +12 -3
  598. package/dist/server/src/lib/db/migrations/index.js +6 -0
  599. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  600. package/dist/server/src/lib/db/migrations/v53-worktree-aliases.js +53 -0
  601. package/dist/server/src/lib/db/migrations/v54-worktree-id-path-derived.js +204 -0
  602. package/dist/server/src/lib/db/migrations/v55-compact-churned-worktree-ids.js +207 -0
  603. package/dist/server/src/lib/db/migrations/worktree-id-rename.js +153 -0
  604. package/dist/server/src/lib/db/worktree-alias-db.js +155 -0
  605. package/dist/server/src/lib/db/worktree-db.js +53 -71
  606. package/dist/server/src/lib/detection/cli-patterns.js +86 -2
  607. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +10 -1
  608. package/dist/server/src/lib/git/worktree-id.js +145 -0
  609. package/dist/server/src/lib/git/worktree-redirect.js +155 -0
  610. package/dist/server/src/lib/git/worktrees.js +173 -27
  611. package/dist/server/src/lib/logger.js +13 -1
  612. package/dist/server/src/lib/polling/auto-yes-manager.js +3 -1
  613. package/dist/server/src/lib/polling/prompt-dedup.js +22 -0
  614. package/dist/server/src/lib/polling/response-checker.js +53 -13
  615. package/dist/server/src/lib/polling/response-dedup.js +22 -0
  616. package/dist/server/src/lib/polling/response-poller-core.js +107 -0
  617. package/dist/server/src/lib/polling/response-poller.js +4 -1
  618. package/dist/server/src/lib/response-extractor.js +22 -2
  619. package/dist/server/src/lib/session/claude-session.js +117 -35
  620. package/dist/server/src/lib/session/current-output-builder.js +14 -1
  621. package/dist/server/src/lib/session/session-start-error.js +125 -0
  622. package/dist/server/src/lib/session/worktree-session-reconcile.js +603 -0
  623. package/dist/server/src/lib/tasks/contract-parser.js +17 -1
  624. package/dist/server/src/lib/tasks/task-state-machine.js +23 -1
  625. package/dist/server/src/lib/tmux/control-mode-tmux-transport.js +7 -0
  626. package/dist/server/src/lib/tmux/read-mode.js +22 -2
  627. package/dist/server/src/lib/tmux/tmux-capture-cache.js +33 -0
  628. package/dist/server/src/lib/tmux/tmux-control-client.js +12 -0
  629. package/dist/server/src/lib/tmux/tmux-control-registry.js +55 -11
  630. package/dist/server/src/lib/tmux/tmux.js +61 -0
  631. package/dist/server/src/lib/ws-server.js +104 -1
  632. package/package.json +1 -1
  633. package/.next/server/chunks/1117.js +0 -1
  634. package/.next/server/chunks/1356.js +0 -4
  635. package/.next/server/chunks/1692.js +0 -1
  636. package/.next/server/chunks/4018.js +0 -1
  637. package/.next/server/chunks/4390.js +0 -1
  638. package/.next/server/chunks/8681.js +0 -1
  639. package/.next/static/chunks/744-d5e47fe16e7b9e06.js +0 -1
  640. package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +0 -1
  641. package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +0 -1
  642. package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +0 -1
  643. package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +0 -1
  644. package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +0 -1
  645. package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +0 -1
  646. package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +0 -1
  647. package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +0 -1
  648. package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +0 -1
  649. package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +0 -1
  650. package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +0 -1
  651. package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +0 -1
  652. package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +0 -1
  653. package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +0 -1
  654. package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +0 -1
  655. package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +0 -1
  656. package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +0 -1
  657. package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +0 -1
  658. package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +0 -1
  659. package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +0 -1
  660. package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +0 -1
  661. package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +0 -1
  662. package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +0 -1
  663. package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +0 -1
  664. package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +0 -1
  665. package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +0 -1
  666. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
  667. package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +0 -1
  668. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +0 -1
  669. package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +0 -1
  670. package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +0 -1
  671. package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +0 -1
  672. package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +0 -1
  673. package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +0 -1
  674. package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +0 -1
  675. package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +0 -1
  676. package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +0 -1
  677. package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +0 -1
  678. package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +0 -1
  679. package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +0 -1
  680. package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +0 -1
  681. package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +0 -1
  682. package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +0 -1
  683. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +0 -1
  684. package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +0 -1
  685. package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +0 -1
  686. package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +0 -1
  687. package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +0 -1
  688. package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
  689. package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +0 -1
  699. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +0 -1
  700. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +0 -1
  701. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +0 -1
  702. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +0 -1
  703. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +0 -1
  704. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +0 -1
  705. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +0 -1
  706. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +0 -1
  707. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +0 -1
  708. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +0 -1
  709. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +0 -1
  710. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +0 -1
  711. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +0 -1
  712. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +0 -1
  713. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +0 -1
  714. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +0 -1
  715. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +0 -1
  716. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +0 -1
  717. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +0 -1
  718. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +0 -1
  719. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +0 -1
  720. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +0 -1
  721. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +0 -1
  722. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +0 -1
  723. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +0 -1
  724. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +0 -1
  725. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +0 -1
  726. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +0 -1
  727. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +0 -1
  728. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +0 -1
  729. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +0 -1
  730. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +0 -1
  731. package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +0 -1
  732. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +0 -1
  733. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +0 -1
  734. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +0 -1
  735. package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +0 -1
  736. package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +0 -1
  737. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +0 -1
  738. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +0 -1
  739. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +0 -1
  740. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +0 -1
  741. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +0 -1
  742. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +0 -1
  743. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +0 -1
  744. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +0 -1
  745. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +0 -1
  746. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +0 -1
  747. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +0 -1
  748. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +0 -1
  749. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +0 -1
  750. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
  751. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +0 -1
  752. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +0 -1
  753. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +0 -1
  754. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +0 -1
  755. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +0 -1
  756. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
  757. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +0 -1
  758. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +0 -1
  759. package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +0 -1
  760. package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +0 -1
  761. package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +0 -1
  762. package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +0 -1
  763. package/.next/static/chunks/app/worktrees/[id]/page-f6e09d25cd3b56f9.js +0 -1
  764. /package/.next/static/{-E7I667pJDTBamyG8M_Z- → C01FQOE5FCmB3I_GhMa4_}/_buildManifest.js +0 -0
  765. /package/.next/static/{-E7I667pJDTBamyG8M_Z- → C01FQOE5FCmB3I_GhMa4_}/_ssgManifest.js +0 -0
@@ -17,6 +17,7 @@ const claude_output_1 = require("../../lib/claude-output");
17
17
  const cli_patterns_1 = require("../../lib/detection/cli-patterns");
18
18
  const logger_1 = require("../../lib/logger");
19
19
  const thinking_constants_1 = require("../../config/thinking-constants");
20
+ const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
20
21
  const logger = (0, logger_1.createLogger)('response-poller');
21
22
  // Sub-module imports
22
23
  const response_extractor_1 = require("../response-extractor");
@@ -52,10 +53,12 @@ function incompleteResult(lineCount) {
52
53
  * @param bufferReset - External buffer reset flag
53
54
  * @param cliToolId - CLI tool identifier
54
55
  * @param findRecentUserPromptIndex - Callback to locate the most recent user prompt
56
+ * @param promptDetection - Prompt detection result to carry on the extraction result
57
+ * @param captureWindowSaturated - True when the capture was clipped by the capture window (#1670)
55
58
  * @returns ExtractionResult with isComplete: true and ANSI-stripped response
56
59
  */
57
- function buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection) {
58
- const startIndex = (0, response_extractor_1.resolveExtractionStartIndex)(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex);
60
+ function buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection, captureWindowSaturated = false) {
61
+ const startIndex = (0, response_extractor_1.resolveExtractionStartIndex)(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, captureWindowSaturated);
59
62
  const extractedLines = lines.slice(startIndex);
60
63
  return {
61
64
  response: (0, cli_patterns_1.stripAnsi)(extractedLines.join('\n')),
@@ -63,6 +66,7 @@ function buildPromptExtractionResult(lines, lastCapturedLine, totalLines, buffer
63
66
  lineCount: totalLines,
64
67
  promptDetection,
65
68
  bufferReset,
69
+ captureWindowSaturated,
66
70
  };
67
71
  }
68
72
  /**
@@ -89,9 +93,12 @@ function detectPromptWithOptions(output, cliToolId) {
89
93
  * @param output - Full tmux output
90
94
  * @param lastCapturedLine - Number of lines previously captured
91
95
  * @param cliToolId - CLI tool ID (claude, codex, gemini)
96
+ * @param captureWindowLines - Size of the capture window `output` was produced with.
97
+ * Used only to decide whether the capture came back clipped (Issue #1670);
98
+ * defaults to the window `checkForResponse()` uses.
92
99
  * @returns Extracted response or null if incomplete
93
100
  */
94
- function extractResponse(output, lastCapturedLine, cliToolId) {
101
+ function extractResponse(output, lastCapturedLine, cliToolId, captureWindowLines = tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES) {
95
102
  // Trim trailing empty lines from the output before processing
96
103
  const rawLines = output.split('\n');
97
104
  let trimmedLength = rawLines.length;
@@ -100,6 +107,12 @@ function extractResponse(output, lastCapturedLine, cliToolId) {
100
107
  }
101
108
  const lines = rawLines.slice(0, trimmedLength);
102
109
  const totalLines = lines.length;
110
+ // Issue #1670: measured on the RAW capture, before the trailing-blank trim —
111
+ // the clip happens in sliceOutput(), so it is the untrimmed row count that
112
+ // reveals it. Once this is true the line count is pinned at the window size and
113
+ // `lastCapturedLine` stops being a position in `lines`; see
114
+ // isCaptureWindowSaturated() for why raising the window only relocates it.
115
+ const captureWindowSaturated = (0, tmux_capture_cache_1.isCaptureWindowSaturated)(rawLines.length, captureWindowLines);
103
116
  // Issue #1289: Claude Code pins a footer (rotating hint row, input box, status
104
117
  // bar) to the bottom of the pane. It is chrome, not transcript, and its hint
105
118
  // row rotates while the conversation is idle — so letting it reach the saved
@@ -164,21 +177,29 @@ function extractResponse(output, lastCapturedLine, cliToolId) {
164
177
  const fullOutput = lines.join('\n');
165
178
  const promptDetection = detectPromptWithOptions(fullOutput, cliToolId);
166
179
  if (promptDetection.isPrompt) {
167
- return buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection);
180
+ return buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection, captureWindowSaturated);
168
181
  }
169
182
  }
170
183
  // Strip ANSI codes before pattern matching
171
184
  const cleanOutputToCheck = (0, cli_patterns_1.stripAnsi)(outputToCheck);
172
185
  const hasPrompt = promptPattern.test(cleanOutputToCheck);
173
186
  const hasSeparator = separatorPattern.test(cleanOutputToCheck);
174
- const isThinking = thinkingPattern.test(cleanOutputToCheck);
187
+ // Issue #1671: Codex's activity markers are past-tense transcript records that
188
+ // never leave the scrollback, so testing them against this fixed tail window
189
+ // reports "still thinking" for a finished turn whenever its final message was
190
+ // short enough to keep the last "• Ran <cmd>" row inside the window. Codex gets
191
+ // a liveness check that keys off the status line it repaints above the composer
192
+ // instead; every other tool keeps the tail-window match.
193
+ const isThinking = cliToolId === 'codex'
194
+ ? (0, cli_patterns_1.isCodexTurnActive)(lines, checkLineCount)
195
+ : thinkingPattern.test(cleanOutputToCheck);
175
196
  // Prompt-based completion logic
176
197
  const isPromptBasedComplete = (cliToolId === 'codex' || cliToolId === 'gemini' || cliToolId === 'vibe-local' || cliToolId === 'copilot' || cliToolId === 'antigravity') && hasPrompt && !isThinking;
177
198
  const isClaudeComplete = cliToolId === 'claude' && hasPrompt && hasSeparator && !isThinking;
178
199
  const isOpenCodeDone = cliToolId === 'opencode' && (0, response_extractor_1.isOpenCodeComplete)(cleanOutputToCheck);
179
200
  if (isPromptBasedComplete || isClaudeComplete || isOpenCodeDone) {
180
201
  const responseLines = [];
181
- const startIndex = (0, response_extractor_1.resolveExtractionStartIndex)(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex);
202
+ const startIndex = (0, response_extractor_1.resolveExtractionStartIndex)(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, captureWindowSaturated);
182
203
  let endIndex = totalLines;
183
204
  // `contentEnd` bounds the content only; `endIndex` keeps reporting the full
184
205
  // buffer so lineCount bookkeeping in session_states is unchanged (#1289).
@@ -274,6 +295,7 @@ function extractResponse(output, lastCapturedLine, cliToolId) {
274
295
  isComplete: true,
275
296
  lineCount: endIndex,
276
297
  bufferReset,
298
+ captureWindowSaturated,
277
299
  };
278
300
  }
279
301
  // Check if this is an interactive prompt
@@ -281,13 +303,16 @@ function extractResponse(output, lastCapturedLine, cliToolId) {
281
303
  const fullOutput = lines.join('\n');
282
304
  const promptDetection = detectPromptWithOptions(fullOutput, cliToolId);
283
305
  if (promptDetection.isPrompt) {
284
- return buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection);
306
+ return buildPromptExtractionResult(lines, lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, promptDetection, captureWindowSaturated);
285
307
  }
286
308
  }
287
309
  // Partial response in progress
288
310
  const responseLines = [];
289
311
  const endIndex = totalLines;
290
- const partialBufferReset = bufferReset || lastCapturedLine >= endIndex - 5;
312
+ // Issue #1670: a saturated window makes lastCapturedLine meaningless here too
313
+ // starting the partial slice at it would stream an arbitrary tail fragment
314
+ // instead of the turn so far. Re-anchor on the echoed user prompt.
315
+ const partialBufferReset = bufferReset || captureWindowSaturated || lastCapturedLine >= endIndex - 5;
291
316
  const recentPromptIndex = partialBufferReset ? findRecentUserPromptIndex(80) : -1;
292
317
  const startIndex = partialBufferReset
293
318
  ? (recentPromptIndex >= 0 ? recentPromptIndex + 1 : Math.max(0, endIndex - 80))
@@ -351,15 +376,17 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
351
376
  // Get session state (last captured line count)
352
377
  const sessionState = (0, db_1.getSessionState)(db, worktreeId, resolvedInstanceId);
353
378
  const lastCapturedLine = sessionState?.lastCapturedLine || 0;
354
- // Capture current output
355
- const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, 10000, instanceId);
379
+ // Capture current output. The requested width IS the capture window, so it is
380
+ // taken from the same constant extractResponse() measures saturation against
381
+ // (Issue #1670) — a literal here would silently decouple the two.
382
+ const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES, instanceId);
356
383
  // Layer 2: Accumulate TUI content for full-screen TUI tools (for overlap tracking only).
357
384
  if (cliToolId === 'opencode' || cliToolId === 'copilot') {
358
385
  const pollerKey = (0, response_poller_core_1.getPollerKey)(worktreeId, cliToolId, instanceId);
359
386
  (0, tui_accumulator_1.accumulateTuiContent)(pollerKey, output, cliToolId);
360
387
  }
361
388
  // Extract response
362
- const result = extractResponse(output, lastCapturedLine, cliToolId);
389
+ const result = extractResponse(output, lastCapturedLine, cliToolId, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES);
363
390
  if (!result || !result.isComplete) {
364
391
  // DR-004 windowing: Only check tail lines
365
392
  const { thinkingPattern } = (0, cli_patterns_1.getCliToolPatterns)(cliToolId);
@@ -381,7 +408,15 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
381
408
  // `lineCount <= lastCapturedLine` and drop the response forever — leaving
382
409
  // History stuck on "Waiting for response..." while the terminal shows the
383
410
  // reply. Those tools dedup on response content instead (see below).
384
- const lineCountIsCursor = !(0, types_1.usesAlternateScreen)(cliToolId);
411
+ //
412
+ // Issue #1670: the scrollback tools reach the SAME dead end from the other
413
+ // side. Their buffer does grow — but only until it outgrows the capture
414
+ // window, after which the capture is clipped, the count is pinned at the
415
+ // window size, and the cursor can never be overtaken again. #1268 fixed
416
+ // saturation at pane height; this is saturation at the capture window, and it
417
+ // disables the cursor for exactly as long as the clipping lasts (a session
418
+ // restart or a cleared pane un-saturates it and the cursor comes back).
419
+ const lineCountIsCursor = !(0, types_1.usesAlternateScreen)(cliToolId) && !result.captureWindowSaturated;
385
420
  // Duplicate prevention
386
421
  if (lineCountIsCursor && !result.bufferReset && result.lineCount === lastCapturedLine && !sessionState?.inProgressMessageId) {
387
422
  return false;
@@ -483,7 +518,12 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
483
518
  // every subsequent poll re-extracts byte-identical content; save it once.
484
519
  // The cache is cleared by stopPolling(), i.e. per polling cycle, so an
485
520
  // identical response in a later turn is still recorded.
486
- if ((0, types_1.usesAlternateScreen)(cliToolId)) {
521
+ //
522
+ // Issue #1670: keyed off `lineCountIsCursor` rather than the tool trait, so a
523
+ // scrollback tool whose capture window has saturated gets the same substitute.
524
+ // Without this the disabled cursor would leave nothing suppressing re-saves and
525
+ // the poller would append the same finished reply every 2 s.
526
+ if (!lineCountIsCursor) {
487
527
  const pollerKey = (0, response_poller_core_1.getPollerKey)(worktreeId, cliToolId, instanceId);
488
528
  if ((0, response_dedup_1.isDuplicateResponse)(pollerKey, cleanedResponse)) {
489
529
  (0, db_1.updateSessionState)(db, worktreeId, cliToolId, result.lineCount, resolvedInstanceId);
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.isDuplicateResponse = isDuplicateResponse;
23
23
  exports.clearResponseHashCache = clearResponseHashCache;
24
+ exports.renameResponseHashCacheKey = renameResponseHashCacheKey;
24
25
  const crypto_1 = require("crypto");
25
26
  /**
26
27
  * In-memory cache: pollerKey -> SHA-256 hash of the last saved response content.
@@ -52,3 +53,24 @@ function isDuplicateResponse(pollerKey, content) {
52
53
  function clearResponseHashCache(pollerKey) {
53
54
  responseHashCache.delete(pollerKey);
54
55
  }
56
+ /**
57
+ * Move the cached hash from one pollerKey to another.
58
+ *
59
+ * Used when a worktree ID is renamed underneath a running poller
60
+ * (Issue #1621 Phase 3). The cache answers "did I already save this screen
61
+ * during THIS turn?", and the turn does not end just because the ID moved —
62
+ * dropping it would re-save the screen currently on display.
63
+ *
64
+ * No-op when nothing is cached under `oldKey`.
65
+ *
66
+ * @param oldKey - Poller key the cache entry lives under
67
+ * @param newKey - Poller key it should live under
68
+ */
69
+ function renameResponseHashCacheKey(oldKey, newKey) {
70
+ if (oldKey === newKey)
71
+ return;
72
+ const hash = responseHashCache.get(oldKey);
73
+ responseHashCache.delete(oldKey);
74
+ if (hash !== undefined)
75
+ responseHashCache.set(newKey, hash);
76
+ }
@@ -8,6 +8,7 @@ exports.scheduleNextResponsePoll = scheduleNextResponsePoll;
8
8
  exports.stopPolling = stopPolling;
9
9
  exports.stopAllPolling = stopAllPolling;
10
10
  exports.getActivePollers = getActivePollers;
11
+ exports.migrateResponsePollerWorktreeIds = migrateResponsePollerWorktreeIds;
11
12
  const logger_1 = require("../../lib/logger");
12
13
  const tui_accumulator_1 = require("../tui-accumulator");
13
14
  const prompt_dedup_1 = require("./prompt-dedup");
@@ -176,3 +177,109 @@ function stopAllPolling() {
176
177
  function getActivePollers() {
177
178
  return Array.from(exports.activePollers.keys());
178
179
  }
180
+ /** Split a poller key into its worktree and instance halves. */
181
+ function splitPollerKey(pollerKey) {
182
+ const separatorIndex = pollerKey.indexOf(':');
183
+ // A worktree ID never contains ':' (isValidWorktreeId), so the first one is
184
+ // always the boundary.
185
+ if (separatorIndex <= 0 || separatorIndex === pollerKey.length - 1)
186
+ return null;
187
+ return {
188
+ worktreeId: pollerKey.slice(0, separatorIndex),
189
+ instanceId: pollerKey.slice(separatorIndex + 1),
190
+ };
191
+ }
192
+ /**
193
+ * Move every running response poller from a renamed worktree ID to the new one
194
+ * (Issue #1621 Phase 3).
195
+ *
196
+ * Re-keying the maps alone is **not** enough, and this is the subtle part: the
197
+ * `setTimeout` chain in {@link scheduleNextResponsePoll} closes over
198
+ * `worktreeId` and recomputes its key on every tick. A poller left running
199
+ * would go on capturing `mcbd-<cli>-<OLD id>` (a session that no longer exists
200
+ * after the rename), writing its messages against an ID no row carries, and
201
+ * re-registering the old key the moment it fired. So each poller is torn down
202
+ * and restarted under the new ID, with everything that represents *progress*
203
+ * carried across:
204
+ *
205
+ * - `pollingStartTimes`, so MAX_POLLING_DURATION still measures from when the
206
+ * turn actually began rather than restarting the 30-minute budget;
207
+ * - the prompt and response dedup hashes, so the screen currently on display is
208
+ * not saved a second time as a new message.
209
+ *
210
+ * The TUI accumulator (opencode / copilot only) is re-initialised empty at the
211
+ * new key instead of carried over: `tui-accumulator.ts` exposes no way to write
212
+ * a buffer back, and it is outside this Issue's allowed scope. The cost is that
213
+ * one in-flight TUI response may be truncated at the rename boundary; the next
214
+ * turn accumulates normally.
215
+ *
216
+ * Takes the whole batch because IDs can swap (A→B, B→A): every source key is
217
+ * removed before any destination key is written.
218
+ *
219
+ * @param renames - Worktree ID pairs being applied
220
+ * @param resolveCliToolId - Maps a poller's (worktree, instance) back to its CLI
221
+ * tool, which the poller key does not encode for alias instances. Callers pass
222
+ * a roster-backed lookup; returning null skips that poller (it is stopped
223
+ * rather than left pointing at a dead ID).
224
+ * @returns One entry per poller that was moved
225
+ */
226
+ function migrateResponsePollerWorktreeIds(renames, resolveCliToolId) {
227
+ const targets = new Map();
228
+ for (const { oldId, newId } of renames) {
229
+ if (!oldId || !newId || oldId === newId)
230
+ continue;
231
+ targets.set(oldId, newId);
232
+ }
233
+ if (targets.size === 0)
234
+ return [];
235
+ const moves = [];
236
+ const abandoned = [];
237
+ for (const pollerKey of Array.from(exports.activePollers.keys())) {
238
+ const parts = splitPollerKey(pollerKey);
239
+ if (!parts)
240
+ continue;
241
+ const newWorktreeId = targets.get(parts.worktreeId);
242
+ if (!newWorktreeId)
243
+ continue;
244
+ const cliToolId = resolveCliToolId(parts.worktreeId, parts.instanceId);
245
+ if (!cliToolId) {
246
+ abandoned.push(pollerKey);
247
+ continue;
248
+ }
249
+ moves.push({
250
+ oldKey: pollerKey,
251
+ newKey: getPollerKey(newWorktreeId, cliToolId, parts.instanceId),
252
+ newWorktreeId,
253
+ cliToolId,
254
+ instanceId: parts.instanceId,
255
+ });
256
+ }
257
+ // Phase 1: stop every affected timer and lift the state off the old keys.
258
+ // Done for the whole batch before any write so a swap cannot self-collide.
259
+ const carried = new Map();
260
+ for (const move of moves) {
261
+ const timerId = exports.activePollers.get(move.oldKey);
262
+ if (timerId)
263
+ clearTimeout(timerId);
264
+ exports.activePollers.delete(move.oldKey);
265
+ carried.set(move.newKey, { startedAt: exports.pollingStartTimes.get(move.oldKey) });
266
+ exports.pollingStartTimes.delete(move.oldKey);
267
+ (0, prompt_dedup_1.renamePromptHashCacheKey)(move.oldKey, move.newKey);
268
+ (0, response_dedup_1.renameResponseHashCacheKey)(move.oldKey, move.newKey);
269
+ (0, tui_accumulator_1.clearTuiAccumulator)(move.oldKey);
270
+ }
271
+ for (const pollerKey of abandoned) {
272
+ stopPollingByKey(pollerKey);
273
+ logger.warn('poller:migrate-abandoned', { pollerKey });
274
+ }
275
+ // Phase 2: restart each poller under its new identity.
276
+ for (const move of moves) {
277
+ const startedAt = carried.get(move.newKey)?.startedAt;
278
+ exports.pollingStartTimes.set(move.newKey, startedAt ?? Date.now());
279
+ if (move.cliToolId === 'opencode' || move.cliToolId === 'copilot') {
280
+ (0, tui_accumulator_1.initTuiAccumulator)(move.newKey);
281
+ }
282
+ scheduleNextResponsePoll(move.newWorktreeId, move.cliToolId, move.instanceId);
283
+ }
284
+ return moves;
285
+ }
@@ -10,7 +10,7 @@
10
10
  * @internal functions from being unintentionally exposed.
11
11
  */
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- exports.normalizePromptForDedup = exports.clearPromptHashCache = exports.isDuplicatePrompt = exports.clearTuiAccumulator = exports.getAccumulatedContent = exports.accumulateTuiContent = exports.initTuiAccumulator = exports.findOverlapIndex = exports.normalizeCopilotLine = exports.extractCopilotContentLines = exports.extractTuiContentLines = exports.truncateMessage = exports.cleanCopilotResponse = exports.cleanOpenCodeResponse = exports.cleanGeminiResponse = exports.cleanClaudeResponse = exports.isOpenCodeComplete = exports.resolveExtractionStartIndex = exports.getActivePollers = exports.stopAllPolling = exports.stopPolling = exports.startPolling = void 0;
13
+ exports.normalizePromptForDedup = exports.renamePromptHashCacheKey = exports.clearPromptHashCache = exports.isDuplicatePrompt = exports.clearTuiAccumulator = exports.getAccumulatedContent = exports.accumulateTuiContent = exports.initTuiAccumulator = exports.findOverlapIndex = exports.normalizeCopilotLine = exports.extractCopilotContentLines = exports.extractTuiContentLines = exports.truncateMessage = exports.cleanCopilotResponse = exports.cleanOpenCodeResponse = exports.cleanGeminiResponse = exports.cleanClaudeResponse = exports.isOpenCodeComplete = exports.resolveExtractionStartIndex = exports.migrateResponsePollerWorktreeIds = exports.getActivePollers = exports.stopAllPolling = exports.stopPolling = exports.startPolling = void 0;
14
14
  // ============================================================================
15
15
  // Named re-exports from sub-modules (barrel pattern, D4-001: no export *)
16
16
  // ============================================================================
@@ -20,6 +20,8 @@ Object.defineProperty(exports, "startPolling", { enumerable: true, get: function
20
20
  Object.defineProperty(exports, "stopPolling", { enumerable: true, get: function () { return response_poller_core_1.stopPolling; } });
21
21
  Object.defineProperty(exports, "stopAllPolling", { enumerable: true, get: function () { return response_poller_core_1.stopAllPolling; } });
22
22
  Object.defineProperty(exports, "getActivePollers", { enumerable: true, get: function () { return response_poller_core_1.getActivePollers; } });
23
+ // Issue #1621 Phase 3: follow a worktree ID rename without dropping the turn
24
+ Object.defineProperty(exports, "migrateResponsePollerWorktreeIds", { enumerable: true, get: function () { return response_poller_core_1.migrateResponsePollerWorktreeIds; } });
23
25
  // response-extractor public API
24
26
  var response_extractor_1 = require("../response-extractor");
25
27
  Object.defineProperty(exports, "resolveExtractionStartIndex", { enumerable: true, get: function () { return response_extractor_1.resolveExtractionStartIndex; } });
@@ -45,4 +47,5 @@ Object.defineProperty(exports, "clearTuiAccumulator", { enumerable: true, get: f
45
47
  var prompt_dedup_1 = require("./prompt-dedup");
46
48
  Object.defineProperty(exports, "isDuplicatePrompt", { enumerable: true, get: function () { return prompt_dedup_1.isDuplicatePrompt; } });
47
49
  Object.defineProperty(exports, "clearPromptHashCache", { enumerable: true, get: function () { return prompt_dedup_1.clearPromptHashCache; } });
50
+ Object.defineProperty(exports, "renamePromptHashCacheKey", { enumerable: true, get: function () { return prompt_dedup_1.renamePromptHashCacheKey; } });
48
51
  Object.defineProperty(exports, "normalizePromptForDedup", { enumerable: true, get: function () { return prompt_dedup_1.normalizePromptForDedup; } });
@@ -34,9 +34,10 @@ function isOpenCodeComplete(output) {
34
34
  * Determine the start index for response extraction based on buffer state.
35
35
  * Shared between normal response extraction and prompt detection paths.
36
36
  *
37
- * Implements a 5-branch decision tree for startIndex determination:
37
+ * Implements a 6-branch decision tree for startIndex determination:
38
38
  * 1. bufferWasReset -> findRecentUserPromptIndex(40) + 1, or 0 if not found
39
39
  * 2a. cliToolId === 'opencode' | 'copilot' -> findRecentUserPromptIndex(totalLines) + 1, or 0
40
+ * 2a''. captureWindowSaturated -> findRecentUserPromptIndex(totalLines) + 1, or 0
40
41
  * 2a'. cliToolId === 'antigravity' -> findRecentUserPromptIndex(totalLines) + 1, or lastCapturedLine
41
42
  * 2b. cliToolId === 'codex' -> Math.max(0, lastCapturedLine)
42
43
  * 3. lastCapturedLine >= totalLines - 5 (scroll boundary) ->
@@ -64,11 +65,14 @@ function isOpenCodeComplete(output) {
64
65
  * @param findRecentUserPromptIndex - Callback that searches the tmux buffer backwards
65
66
  * for the most recent user prompt line within a given window size.
66
67
  * Returns the line index (>= 0) if found, or -1 if not found.
68
+ * @param captureWindowSaturated - True when the capture came back clipped by the capture
69
+ * window (Issue #1670), i.e. `lastCapturedLine` no longer indexes into `lines`.
70
+ * Defaults to false so existing callers keep their behavior.
67
71
  * @returns The 0-based line index from which response extraction should begin.
68
72
  *
69
73
  * @internal Exported for testing only
70
74
  */
71
- function resolveExtractionStartIndex(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex) {
75
+ function resolveExtractionStartIndex(lastCapturedLine, totalLines, bufferReset, cliToolId, findRecentUserPromptIndex, captureWindowSaturated = false) {
72
76
  // Defensive validation: clamp negative values to 0 (Stage 4 SF-001)
73
77
  lastCapturedLine = Math.max(0, lastCapturedLine);
74
78
  // Branch 2a (highest priority for OpenCode): OpenCode runs in alternate screen mode
@@ -80,6 +84,22 @@ function resolveExtractionStartIndex(lastCapturedLine, totalLines, bufferReset,
80
84
  const foundUserPrompt = findRecentUserPromptIndex(totalLines);
81
85
  return foundUserPrompt >= 0 ? foundUserPrompt + 1 : 0;
82
86
  }
87
+ // Branch 2a'' (Issue #1670): the capture window is saturated, so the buffer no
88
+ // longer grows under the cursor — it slides. `lastCapturedLine` was recorded
89
+ // against a window that has since scrolled by an unknown amount, so it is not a
90
+ // position in `lines` any more and using it would slice off an arbitrary prefix
91
+ // of the turn. Anchor on the newest echoed user prompt instead, exactly as the
92
+ // alternate-screen branch above does for the same reason (#1268), and fall back
93
+ // to the whole window when the echo has scrolled out (a single turn longer than
94
+ // the window) — dropping it would be the very defect this branch fixes.
95
+ //
96
+ // Placed AFTER the opencode/copilot branch so the #1268 path is untouched, and
97
+ // BEFORE the antigravity branch because the two agree wherever an echo exists;
98
+ // only agy's `lastCapturedLine` fallback would still trust the stale cursor.
99
+ if (captureWindowSaturated) {
100
+ const foundUserPrompt = findRecentUserPromptIndex(totalLines);
101
+ return foundUserPrompt >= 0 ? foundUserPrompt + 1 : 0;
102
+ }
83
103
  // Branch 2a' (Antigravity / agy, Issue #988): agy is inline-rendered (scrollback
84
104
  // retained, like Codex), so lastCapturedLine is meaningful. But the user echo
85
105
  // ("> <message>") is reliably present in the captured buffer and gives a cleaner
@@ -26,6 +26,7 @@ const promises_1 = require("fs/promises");
26
26
  const logger_1 = require("../../lib/logger");
27
27
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
28
28
  const types_1 = require("../../lib/cli-tools/types");
29
+ const session_start_error_1 = require("../../lib/session/session-start-error");
29
30
  const logger = (0, logger_1.createLogger)('claude-session');
30
31
  const execAsync = (0, util_1.promisify)(child_process_1.exec);
31
32
  // ----- Helper Functions -----
@@ -71,9 +72,35 @@ const SHELL_PROMPT_ENDINGS = ['$', '%', '#'];
71
72
  * This timeout also covers trust dialog auto-response time (typically <1s).
72
73
  * When reducing this value, consider dialog response overhead.
73
74
  *
74
- * 15 seconds provides headroom for slower networks or cold starts.
75
+ * Issue #1637: raised from 15s to 60s. Measured on the reporter's machine
76
+ * (macOS, Claude Code v2, private tmux socket, the same detection predicates
77
+ * this module uses — `Yes, I trust this folder` for the dialog and
78
+ * CLAUDE_PROMPT_PATTERN for readiness):
79
+ *
80
+ * - idle, already-trusted repository worktree : 1443 / 1470 ms
81
+ * - idle, fresh directory (trust dialog shown): 1885 / 1896 / 1902 ms
82
+ * (dialog visible at ~940 ms, prompt ~950 ms after it is answered)
83
+ * - six cold starts launched concurrently : 2845 / 3450 / 3488 / 4206 /
84
+ * 4215 / 4850 ms
85
+ *
86
+ * So a healthy cold start costs ~2s idle and ~5s at six-way concurrency, and
87
+ * 15s left under 4x headroom over the concurrent case. That is what the six
88
+ * production failures spent: the machine was running an orchestration (several
89
+ * agent sessions plus test suites and builds), and the Issue's own reproduction
90
+ * — re-send ~30s later succeeds — puts the real ready time in that run above
91
+ * 15s and at or below ~45s. 60s covers it with margin and is the same order of
92
+ * magnitude as the window Codex already allows (3s + 30 x 1s polls ≈ 33s).
93
+ *
94
+ * Waiting longer costs nothing on the healthy path (the loop exits as soon as
95
+ * the prompt appears) and a session whose output already shows a terminal error
96
+ * fails immediately rather than consuming the budget — see the error-pattern
97
+ * check in startClaudeSession().
98
+ *
99
+ * This is the *first start* budget only. Sending to a session that already
100
+ * exists is bounded separately by CLAUDE_SEND_PROMPT_WAIT_TIMEOUT (10s), which
101
+ * is unchanged.
75
102
  */
76
- exports.CLAUDE_INIT_TIMEOUT = 15000;
103
+ exports.CLAUDE_INIT_TIMEOUT = 60000;
77
104
  /**
78
105
  * Initialization polling interval (milliseconds)
79
106
  *
@@ -117,7 +144,7 @@ exports.CLAUDE_PROMPT_WAIT_TIMEOUT = 5000;
117
144
  * Relationship to other timeout constants:
118
145
  * - CLAUDE_PROMPT_WAIT_TIMEOUT (5000ms): Default for waitForPrompt()
119
146
  * - CLAUDE_SEND_PROMPT_WAIT_TIMEOUT (10000ms): sendMessageToClaude() specific
120
- * - CLAUDE_INIT_TIMEOUT (15000ms): Session initialization timeout
147
+ * - CLAUDE_INIT_TIMEOUT (60000ms): first-start initialization budget (Issue #1637)
121
148
  *
122
149
  * @see Issue #187 - Constant unification for sendMessageToClaude timeout
123
150
  */
@@ -256,6 +283,39 @@ async function getCleanPaneOutput(sessionName, lines = 50) {
256
283
  const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -lines });
257
284
  return (0, cli_patterns_1.stripAnsi)(output);
258
285
  }
286
+ /**
287
+ * The terminal error pattern visible in the tail of `cleanOutput`, or null.
288
+ *
289
+ * Extracted from isSessionHealthy() so the initialization loop can apply the
290
+ * same judgement (Issue #1637): with a 60s start budget, a session that has
291
+ * already printed "Claude Code cannot be launched inside another Claude Code
292
+ * session" must not sit there burning the whole budget before saying so.
293
+ *
294
+ * Only the last {@link HEALTH_CHECK_ERROR_TAIL_LINES} lines are searched, so a
295
+ * historical error that has scrolled up cannot condemn a session that recovered.
296
+ *
297
+ * @param cleanOutput - ANSI-stripped pane output
298
+ * @returns The matched pattern (or regex source) for the log, or null
299
+ */
300
+ function findSessionErrorPattern(cleanOutput) {
301
+ const allLines = cleanOutput
302
+ .trim()
303
+ .split('\n')
304
+ .filter((line) => line.trim() !== '');
305
+ const tailText = allLines.slice(-HEALTH_CHECK_ERROR_TAIL_LINES).join('\n');
306
+ // MF-001: Check error patterns from cli-patterns.ts (SRP - pattern management centralized)
307
+ for (const pattern of cli_patterns_1.CLAUDE_SESSION_ERROR_PATTERNS) {
308
+ if (tailText.includes(pattern)) {
309
+ return pattern;
310
+ }
311
+ }
312
+ for (const regex of cli_patterns_1.CLAUDE_SESSION_ERROR_REGEX_PATTERNS) {
313
+ if (regex.test(tailText)) {
314
+ return regex.source;
315
+ }
316
+ }
317
+ return null;
318
+ }
259
319
  /**
260
320
  * Verify that Claude CLI is actually running inside a tmux session
261
321
  * Detects broken sessions where tmux exists but Claude failed to start
@@ -291,18 +351,9 @@ async function isSessionHealthy(sessionName) {
291
351
  // Only the last HEALTH_CHECK_ERROR_TAIL_LINES lines are searched, so
292
352
  // historical errors that have scrolled up do not trigger false negatives.
293
353
  const allLines = trimmed.split('\n').filter(line => line.trim() !== '');
294
- const tailLines = allLines.slice(-HEALTH_CHECK_ERROR_TAIL_LINES);
295
- const tailText = tailLines.join('\n');
296
- // MF-001: Check error patterns from cli-patterns.ts (SRP - pattern management centralized)
297
- for (const pattern of cli_patterns_1.CLAUDE_SESSION_ERROR_PATTERNS) {
298
- if (tailText.includes(pattern)) {
299
- return { healthy: false, reason: `error pattern: ${pattern}` };
300
- }
301
- }
302
- for (const regex of cli_patterns_1.CLAUDE_SESSION_ERROR_REGEX_PATTERNS) {
303
- if (regex.test(tailText)) {
304
- return { healthy: false, reason: `error pattern: ${regex.source}` };
305
- }
354
+ const errorPattern = findSessionErrorPattern(trimmed);
355
+ if (errorPattern !== null) {
356
+ return { healthy: false, reason: `error pattern: ${errorPattern}` };
306
357
  }
307
358
  // S2-F002: Extract last line after empty line filtering
308
359
  const lastLine = allLines[allLines.length - 1]?.trim() ?? '';
@@ -525,35 +576,57 @@ async function startClaudeSession(options) {
525
576
  let trustDialogHandled = false;
526
577
  while (Date.now() - startTime < maxWaitTime) {
527
578
  await new Promise((resolve) => setTimeout(resolve, pollInterval));
579
+ // SF-001: Use getCleanPaneOutput helper (DRY)
580
+ let cleanOutput = null;
528
581
  try {
529
- // SF-001: Use getCleanPaneOutput helper (DRY)
530
- const cleanOutput = await getCleanPaneOutput(sessionName);
531
- // Claude is ready when we see the prompt (DRY-001)
532
- // Use CLAUDE_PROMPT_PATTERN from cli-patterns.ts for consistency
533
- // Note: CLAUDE_SEPARATOR_PATTERN was removed from initialization check (Issue #187, P1-1)
534
- if (cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
535
- // Wait for stability after prompt detection (CONS-007, DOC-001)
536
- await new Promise((resolve) => setTimeout(resolve, exports.CLAUDE_POST_PROMPT_DELAY));
537
- logger.info('claude-initialized-in');
538
- initialized = true;
539
- break;
540
- }
541
- // Issue #201: Detect trust dialog and auto-respond with Enter
542
- // Condition order: CLAUDE_PROMPT_PATTERN (above) is checked first for shortest path
543
- if (!trustDialogHandled && cli_patterns_1.CLAUDE_TRUST_DIALOG_PATTERN.test(cleanOutput)) {
582
+ cleanOutput = await getCleanPaneOutput(sessionName);
583
+ }
584
+ catch {
585
+ // Ignore capture errors during initialization
586
+ }
587
+ if (cleanOutput === null) {
588
+ continue;
589
+ }
590
+ // Claude is ready when we see the prompt (DRY-001)
591
+ // Use CLAUDE_PROMPT_PATTERN from cli-patterns.ts for consistency
592
+ // Note: CLAUDE_SEPARATOR_PATTERN was removed from initialization check (Issue #187, P1-1)
593
+ if (cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
594
+ // Wait for stability after prompt detection (CONS-007, DOC-001)
595
+ await new Promise((resolve) => setTimeout(resolve, exports.CLAUDE_POST_PROMPT_DELAY));
596
+ logger.info('claude-initialized-in');
597
+ initialized = true;
598
+ break;
599
+ }
600
+ // Issue #201: Detect trust dialog and auto-respond with Enter
601
+ // Condition order: CLAUDE_PROMPT_PATTERN (above) is checked first for shortest path
602
+ if (!trustDialogHandled && cli_patterns_1.CLAUDE_TRUST_DIALOG_PATTERN.test(cleanOutput)) {
603
+ try {
544
604
  await (0, tmux_1.sendKeys)(sessionName, '', true);
545
605
  trustDialogHandled = true;
546
606
  logger.info('trust-dialog-detected');
547
- // Continue polling to wait for prompt detection
548
607
  }
608
+ catch {
609
+ // Left unhandled so the next poll answers the dialog again
610
+ }
611
+ // Continue polling to wait for prompt detection
549
612
  }
550
- catch {
551
- // Ignore capture errors during initialization
613
+ // Issue #1637: fail fast on a start that cannot succeed. The budget is
614
+ // 60s of patience for a *slow* start; a session already showing a
615
+ // terminal error is not slow, and waiting out the budget would only
616
+ // delay the same answer by 45 more seconds. Checked after the trust
617
+ // dialog so a dialog still on screen is answered first.
618
+ const errorPattern = findSessionErrorPattern(cleanOutput);
619
+ if (errorPattern !== null) {
620
+ throw new session_start_error_1.SessionStartFailedError('Claude Code', sessionName, errorPattern);
552
621
  }
553
622
  }
554
- // Throw error on timeout instead of silently continuing (CONS-005, IMP-001)
623
+ // Issue #1637: not "failed to start" the session and the CLI process both
624
+ // exist and are still initializing, and they are deliberately left running
625
+ // so the retry the caller is about to make is cheap. The distinction is
626
+ // carried to the caller by the error type rather than lost in a generic
627
+ // message (CONS-005, IMP-001).
555
628
  if (!initialized) {
556
- throw new Error(`Claude initialization timeout (${exports.CLAUDE_INIT_TIMEOUT}ms)`);
629
+ throw new session_start_error_1.SessionStartTimeoutError('Claude Code', sessionName, exports.CLAUDE_INIT_TIMEOUT);
557
630
  }
558
631
  logger.info('started-claude-session:sessionname');
559
632
  }
@@ -562,6 +635,15 @@ async function startClaudeSession(options) {
562
635
  clearCachedClaudePath();
563
636
  // SEC-SF-002: Log detailed error server-side, throw generic message to client
564
637
  logger.error('session:start-failed', { error: error instanceof Error ? error.message : String(error) });
638
+ // Issue #1637: the one exception to SEC-SF-002. These two messages are
639
+ // assembled from a tool name, the tmux session name, a fixed pattern string
640
+ // and a number — no filesystem path, no captured CLI output — so they are
641
+ // safe to hand to the caller, and they are the whole reason the caller can
642
+ // tell "still starting" from "broken" instead of being told to read a log
643
+ // it may not have.
644
+ if ((0, session_start_error_1.isSafeSessionStartError)(error)) {
645
+ throw error;
646
+ }
565
647
  throw new Error('Failed to start Claude session');
566
648
  }
567
649
  }
@@ -15,6 +15,7 @@ const cli_session_1 = require("../../lib/session/cli-session");
15
15
  const status_detector_1 = require("../../lib/detection/status-detector");
16
16
  const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
17
17
  const status_capture_config_1 = require("../../config/status-capture-config");
18
+ const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
18
19
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
19
20
  /**
20
21
  * Build the current-output payload for a worktree session.
@@ -46,7 +47,19 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
46
47
  const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
47
48
  const lines = output.split('\n');
48
49
  const totalLines = lines.length;
49
- const newLines = lines.slice(Math.max(0, lastCapturedLine));
50
+ // Issue #1670: `content` is "everything the poller has not saved yet", which
51
+ // only works while `lastCapturedLine` indexes into `lines`. Once the capture is
52
+ // clipped by the window the cursor is stale by an unknown amount, and slicing at
53
+ // it collapses `content` to the last row or two — which is what `commandmate
54
+ // capture <id>` prints, so a long-lived codex session returned an empty capture.
55
+ // The window can only have slid forward, so 0 is the sole safe clamp; the result
56
+ // is a superset (it may repeat already-saved rows) and never drops new output.
57
+ //
58
+ // The effective window is the smaller of what this path asks for and what the
59
+ // capture layer will ever fetch — captureSessionOutput() reads at most
60
+ // CACHE_MAX_CAPTURE_LINES regardless of the request.
61
+ const captureWindowSaturated = (0, tmux_capture_cache_1.isCaptureWindowSaturated)(totalLines, Math.min(status_capture_config_1.STATUS_CAPTURE_LINES, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES));
62
+ const newLines = captureWindowSaturated ? lines : lines.slice(Math.max(0, lastCapturedLine));
50
63
  const newContent = newLines.join('\n');
51
64
  const compositeKey = (0, auto_yes_manager_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
52
65
  const lastServerResponseTimestamp = (0, auto_yes_manager_1.getLastServerResponseTimestamp)(compositeKey);