commandmate 0.18.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 (793) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +230 -223
  3. package/.next/app-path-routes-manifest.json +32 -32
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  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 +32 -32
  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 +23 -23
  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 +6 -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 +397 -378
  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-109e3825c7249e47.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 +12 -4
  567. package/dist/cli/commands/capture.d.ts +1 -0
  568. package/dist/cli/commands/capture.d.ts.map +1 -1
  569. package/dist/cli/commands/capture.js +115 -4
  570. package/dist/cli/commands/instances.d.ts +24 -0
  571. package/dist/cli/commands/instances.d.ts.map +1 -1
  572. package/dist/cli/commands/instances.js +44 -0
  573. package/dist/cli/commands/ls.d.ts.map +1 -1
  574. package/dist/cli/commands/ls.js +9 -3
  575. package/dist/cli/commands/respond.d.ts.map +1 -1
  576. package/dist/cli/commands/respond.js +13 -4
  577. package/dist/cli/commands/send.d.ts.map +1 -1
  578. package/dist/cli/commands/send.js +24 -14
  579. package/dist/cli/commands/update.d.ts.map +1 -1
  580. package/dist/cli/commands/update.js +66 -0
  581. package/dist/cli/commands/wait.d.ts +4 -1
  582. package/dist/cli/commands/wait.d.ts.map +1 -1
  583. package/dist/cli/commands/wait.js +82 -7
  584. package/dist/cli/config/agent-target-options.d.ts +46 -0
  585. package/dist/cli/config/agent-target-options.d.ts.map +1 -0
  586. package/dist/cli/config/agent-target-options.js +54 -0
  587. package/dist/cli/docs/agent-operations.d.ts +2 -2
  588. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  589. package/dist/cli/docs/agent-operations.js +47 -14
  590. package/dist/cli/types/index.d.ts +16 -0
  591. package/dist/cli/types/index.d.ts.map +1 -1
  592. package/dist/cli/utils/api-client.d.ts +4 -1
  593. package/dist/cli/utils/api-client.d.ts.map +1 -1
  594. package/dist/cli/utils/api-client.js +43 -5
  595. package/dist/cli/utils/npm-runner.d.ts +24 -0
  596. package/dist/cli/utils/npm-runner.d.ts.map +1 -1
  597. package/dist/cli/utils/npm-runner.js +51 -1
  598. package/dist/cli/utils/pager.d.ts +28 -0
  599. package/dist/cli/utils/pager.d.ts.map +1 -0
  600. package/dist/cli/utils/pager.js +57 -0
  601. package/dist/cli/utils/pid-manager.d.ts +12 -2
  602. package/dist/cli/utils/pid-manager.d.ts.map +1 -1
  603. package/dist/cli/utils/pid-manager.js +76 -13
  604. package/dist/lib/detection/ansi.d.ts +30 -0
  605. package/dist/lib/detection/ansi.d.ts.map +1 -0
  606. package/dist/lib/detection/ansi.js +39 -0
  607. package/dist/lib/tmux/transcript-squeeze.d.ts +76 -0
  608. package/dist/lib/tmux/transcript-squeeze.d.ts.map +1 -0
  609. package/dist/lib/tmux/transcript-squeeze.js +96 -0
  610. package/dist/server/server.js +125 -14
  611. package/dist/server/src/config/tmux-pane-config.js +33 -1
  612. package/dist/server/src/lib/auto-yes-state.js +64 -0
  613. package/dist/server/src/lib/cli-tools/antigravity.js +2 -1
  614. package/dist/server/src/lib/cli-tools/codex.js +3 -2
  615. package/dist/server/src/lib/cli-tools/copilot.js +2 -2
  616. package/dist/server/src/lib/cli-tools/gemini.js +2 -2
  617. package/dist/server/src/lib/cli-tools/opencode.js +2 -2
  618. package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
  619. package/dist/server/src/lib/db/agent-instances-db.js +53 -0
  620. package/dist/server/src/lib/db/db-repository.js +66 -2
  621. package/dist/server/src/lib/db/db.js +12 -3
  622. package/dist/server/src/lib/db/migrations/index.js +8 -0
  623. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  624. package/dist/server/src/lib/db/migrations/v52-orphaned-worktree-children.js +76 -0
  625. package/dist/server/src/lib/db/migrations/v53-worktree-aliases.js +53 -0
  626. package/dist/server/src/lib/db/migrations/v54-worktree-id-path-derived.js +204 -0
  627. package/dist/server/src/lib/db/migrations/v55-compact-churned-worktree-ids.js +207 -0
  628. package/dist/server/src/lib/db/migrations/worktree-child-tables.js +119 -0
  629. package/dist/server/src/lib/db/migrations/worktree-id-rename.js +153 -0
  630. package/dist/server/src/lib/db/worktree-alias-db.js +155 -0
  631. package/dist/server/src/lib/db/worktree-db.js +82 -77
  632. package/dist/server/src/lib/detection/cli-patterns.js +109 -2
  633. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +10 -1
  634. package/dist/server/src/lib/detection/status-detector.js +52 -2
  635. package/dist/server/src/lib/git/worktree-id.js +145 -0
  636. package/dist/server/src/lib/git/worktree-redirect.js +155 -0
  637. package/dist/server/src/lib/git/worktrees.js +173 -27
  638. package/dist/server/src/lib/logger.js +13 -1
  639. package/dist/server/src/lib/polling/auto-yes-manager.js +3 -1
  640. package/dist/server/src/lib/polling/prompt-dedup.js +22 -0
  641. package/dist/server/src/lib/polling/response-checker.js +53 -13
  642. package/dist/server/src/lib/polling/response-dedup.js +22 -0
  643. package/dist/server/src/lib/polling/response-poller-core.js +107 -0
  644. package/dist/server/src/lib/polling/response-poller.js +4 -1
  645. package/dist/server/src/lib/response-extractor.js +22 -2
  646. package/dist/server/src/lib/session/claude-session.js +121 -37
  647. package/dist/server/src/lib/session/current-output-builder.js +14 -1
  648. package/dist/server/src/lib/session/session-start-error.js +125 -0
  649. package/dist/server/src/lib/session/worktree-session-reconcile.js +603 -0
  650. package/dist/server/src/lib/tasks/contract-parser.js +17 -1
  651. package/dist/server/src/lib/tasks/task-state-machine.js +23 -1
  652. package/dist/server/src/lib/tmux/control-mode-tmux-transport.js +7 -0
  653. package/dist/server/src/lib/tmux/read-mode-pager.js +161 -0
  654. package/dist/server/src/lib/tmux/read-mode.js +347 -0
  655. package/dist/server/src/lib/tmux/tmux-capture-cache.js +33 -0
  656. package/dist/server/src/lib/tmux/tmux-control-client.js +12 -0
  657. package/dist/server/src/lib/tmux/tmux-control-registry.js +55 -11
  658. package/dist/server/src/lib/tmux/tmux.js +104 -5
  659. package/dist/server/src/lib/ws-server.js +104 -1
  660. package/package.json +1 -1
  661. package/.next/server/chunks/1117.js +0 -1
  662. package/.next/server/chunks/1356.js +0 -4
  663. package/.next/server/chunks/1692.js +0 -1
  664. package/.next/server/chunks/4018.js +0 -1
  665. package/.next/server/chunks/4390.js +0 -1
  666. package/.next/server/chunks/8681.js +0 -1
  667. package/.next/static/chunks/744-d5e47fe16e7b9e06.js +0 -1
  668. package/.next/static/chunks/app/api/app/update/route-8440b6c72bed83a1.js +0 -1
  669. package/.next/static/chunks/app/api/app/update-check/route-8440b6c72bed83a1.js +0 -1
  670. package/.next/static/chunks/app/api/assistant/conversation/route-8440b6c72bed83a1.js +0 -1
  671. package/.next/static/chunks/app/api/assistant/current-output/route-8440b6c72bed83a1.js +0 -1
  672. package/.next/static/chunks/app/api/assistant/messages/route-8440b6c72bed83a1.js +0 -1
  673. package/.next/static/chunks/app/api/assistant/session/route-8440b6c72bed83a1.js +0 -1
  674. package/.next/static/chunks/app/api/assistant/start/route-8440b6c72bed83a1.js +0 -1
  675. package/.next/static/chunks/app/api/assistant/terminal/route-8440b6c72bed83a1.js +0 -1
  676. package/.next/static/chunks/app/api/assistant/tools/route-8440b6c72bed83a1.js +0 -1
  677. package/.next/static/chunks/app/api/auth/login/route-8440b6c72bed83a1.js +0 -1
  678. package/.next/static/chunks/app/api/auth/logout/route-8440b6c72bed83a1.js +0 -1
  679. package/.next/static/chunks/app/api/auth/status/route-8440b6c72bed83a1.js +0 -1
  680. package/.next/static/chunks/app/api/daily-summary/route-8440b6c72bed83a1.js +0 -1
  681. package/.next/static/chunks/app/api/daily-summary/status/route-8440b6c72bed83a1.js +0 -1
  682. package/.next/static/chunks/app/api/external-apps/[id]/health/route-8440b6c72bed83a1.js +0 -1
  683. package/.next/static/chunks/app/api/external-apps/[id]/route-8440b6c72bed83a1.js +0 -1
  684. package/.next/static/chunks/app/api/external-apps/route-8440b6c72bed83a1.js +0 -1
  685. package/.next/static/chunks/app/api/fs/browse/route-8440b6c72bed83a1.js +0 -1
  686. package/.next/static/chunks/app/api/fs/recent-paths/route-8440b6c72bed83a1.js +0 -1
  687. package/.next/static/chunks/app/api/hooks/agent-event/route-8440b6c72bed83a1.js +0 -1
  688. package/.next/static/chunks/app/api/hooks/claude-done/route-8440b6c72bed83a1.js +0 -1
  689. package/.next/static/chunks/app/api/metrics/vibe/route-8440b6c72bed83a1.js +0 -1
  690. package/.next/static/chunks/app/api/ollama/models/route-8440b6c72bed83a1.js +0 -1
  691. package/.next/static/chunks/app/api/push/subscriptions/route-8440b6c72bed83a1.js +0 -1
  692. package/.next/static/chunks/app/api/push/vapid/route-8440b6c72bed83a1.js +0 -1
  693. package/.next/static/chunks/app/api/repositories/[id]/route-8440b6c72bed83a1.js +0 -1
  694. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
  695. package/.next/static/chunks/app/api/repositories/[id]/todos/route-8440b6c72bed83a1.js +0 -1
  696. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8440b6c72bed83a1.js +0 -1
  697. package/.next/static/chunks/app/api/repositories/clone/route-8440b6c72bed83a1.js +0 -1
  698. package/.next/static/chunks/app/api/repositories/excluded/route-8440b6c72bed83a1.js +0 -1
  699. package/.next/static/chunks/app/api/repositories/restore/route-8440b6c72bed83a1.js +0 -1
  700. package/.next/static/chunks/app/api/repositories/route-8440b6c72bed83a1.js +0 -1
  701. package/.next/static/chunks/app/api/repositories/scan/route-8440b6c72bed83a1.js +0 -1
  702. package/.next/static/chunks/app/api/repositories/sync/route-8440b6c72bed83a1.js +0 -1
  703. package/.next/static/chunks/app/api/repositories/validate-path/route-8440b6c72bed83a1.js +0 -1
  704. package/.next/static/chunks/app/api/sidebar/group-order/route-8440b6c72bed83a1.js +0 -1
  705. package/.next/static/chunks/app/api/skills/[id]/route-8440b6c72bed83a1.js +0 -1
  706. package/.next/static/chunks/app/api/skills/installations/route-8440b6c72bed83a1.js +0 -1
  707. package/.next/static/chunks/app/api/skills/operations/route-8440b6c72bed83a1.js +0 -1
  708. package/.next/static/chunks/app/api/skills/reindex/route-8440b6c72bed83a1.js +0 -1
  709. package/.next/static/chunks/app/api/skills/route-8440b6c72bed83a1.js +0 -1
  710. package/.next/static/chunks/app/api/slash-commands/route-8440b6c72bed83a1.js +0 -1
  711. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-8440b6c72bed83a1.js +0 -1
  712. package/.next/static/chunks/app/api/tasks/[taskId]/route-8440b6c72bed83a1.js +0 -1
  713. package/.next/static/chunks/app/api/templates/[id]/route-8440b6c72bed83a1.js +0 -1
  714. package/.next/static/chunks/app/api/templates/route-8440b6c72bed83a1.js +0 -1
  715. package/.next/static/chunks/app/api/todos/route-8440b6c72bed83a1.js +0 -1
  716. package/.next/static/chunks/app/api/verification/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
  717. package/.next/static/chunks/app/api/verification/runs/route-8440b6c72bed83a1.js +0 -1
  718. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8440b6c72bed83a1.js +0 -1
  719. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8440b6c72bed83a1.js +0 -1
  720. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8440b6c72bed83a1.js +0 -1
  721. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8440b6c72bed83a1.js +0 -1
  722. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8440b6c72bed83a1.js +0 -1
  723. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8440b6c72bed83a1.js +0 -1
  724. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8440b6c72bed83a1.js +0 -1
  725. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8440b6c72bed83a1.js +0 -1
  726. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8440b6c72bed83a1.js +0 -1
  727. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8440b6c72bed83a1.js +0 -1
  728. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8440b6c72bed83a1.js +0 -1
  729. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8440b6c72bed83a1.js +0 -1
  730. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8440b6c72bed83a1.js +0 -1
  731. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8440b6c72bed83a1.js +0 -1
  732. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8440b6c72bed83a1.js +0 -1
  733. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8440b6c72bed83a1.js +0 -1
  734. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8440b6c72bed83a1.js +0 -1
  735. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8440b6c72bed83a1.js +0 -1
  736. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8440b6c72bed83a1.js +0 -1
  737. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8440b6c72bed83a1.js +0 -1
  738. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8440b6c72bed83a1.js +0 -1
  739. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8440b6c72bed83a1.js +0 -1
  740. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8440b6c72bed83a1.js +0 -1
  741. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8440b6c72bed83a1.js +0 -1
  742. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8440b6c72bed83a1.js +0 -1
  743. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8440b6c72bed83a1.js +0 -1
  744. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8440b6c72bed83a1.js +0 -1
  745. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8440b6c72bed83a1.js +0 -1
  746. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8440b6c72bed83a1.js +0 -1
  747. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8440b6c72bed83a1.js +0 -1
  748. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8440b6c72bed83a1.js +0 -1
  749. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8440b6c72bed83a1.js +0 -1
  750. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8440b6c72bed83a1.js +0 -1
  751. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8440b6c72bed83a1.js +0 -1
  752. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8440b6c72bed83a1.js +0 -1
  753. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8440b6c72bed83a1.js +0 -1
  754. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8440b6c72bed83a1.js +0 -1
  755. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8440b6c72bed83a1.js +0 -1
  756. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8440b6c72bed83a1.js +0 -1
  757. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8440b6c72bed83a1.js +0 -1
  758. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8440b6c72bed83a1.js +0 -1
  759. package/.next/static/chunks/app/api/worktrees/[id]/route-8440b6c72bed83a1.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8440b6c72bed83a1.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8440b6c72bed83a1.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8440b6c72bed83a1.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/search/route-8440b6c72bed83a1.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/send/route-8440b6c72bed83a1.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-8440b6c72bed83a1.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8440b6c72bed83a1.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8440b6c72bed83a1.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8440b6c72bed83a1.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8440b6c72bed83a1.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8440b6c72bed83a1.js +0 -1
  771. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8440b6c72bed83a1.js +0 -1
  772. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8440b6c72bed83a1.js +0 -1
  773. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8440b6c72bed83a1.js +0 -1
  774. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-8440b6c72bed83a1.js +0 -1
  775. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8440b6c72bed83a1.js +0 -1
  776. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8440b6c72bed83a1.js +0 -1
  777. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8440b6c72bed83a1.js +0 -1
  778. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8440b6c72bed83a1.js +0 -1
  779. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8440b6c72bed83a1.js +0 -1
  780. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8440b6c72bed83a1.js +0 -1
  781. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8440b6c72bed83a1.js +0 -1
  782. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8440b6c72bed83a1.js +0 -1
  783. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-8440b6c72bed83a1.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-8440b6c72bed83a1.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-8440b6c72bed83a1.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8440b6c72bed83a1.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/route-8440b6c72bed83a1.js +0 -1
  788. package/.next/static/chunks/app/manifest.webmanifest/route-8440b6c72bed83a1.js +0 -1
  789. package/.next/static/chunks/app/proxy/[...path]/route-8440b6c72bed83a1.js +0 -1
  790. package/.next/static/chunks/app/repositories/page-1ed1e5a542ecc168.js +0 -1
  791. package/.next/static/chunks/app/worktrees/[id]/page-12b3c5f32fc6094e.js +0 -1
  792. /package/.next/static/{-BSmW0Ae2YsxyCl_ue7_d → C01FQOE5FCmB3I_GhMa4_}/_buildManifest.js +0 -0
  793. /package/.next/static/{-BSmW0Ae2YsxyCl_ue7_d → C01FQOE5FCmB3I_GhMa4_}/_ssgManifest.js +0 -0
@@ -69,6 +69,13 @@ class ControlModeTmuxTransport {
69
69
  getSubscriberCount(sessionName) {
70
70
  return this.registry.getSubscriberCount(sessionName);
71
71
  }
72
+ /**
73
+ * Re-file a live control-mode attach after the tmux session was renamed
74
+ * (Issue #1621 Phase 3). See TmuxControlRegistry.renameSession.
75
+ */
76
+ renameSession(oldName, newName) {
77
+ return this.registry.renameSession(oldName, newName);
78
+ }
72
79
  async killSession(sessionName) {
73
80
  return (0, tmux_1.killSession)(sessionName);
74
81
  }
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ /**
3
+ * The shell pager that `prefix+g` opens inside a tmux popup (Issue #1623, 案A).
4
+ *
5
+ * ## Why the script is embedded here instead of shipped as a file
6
+ *
7
+ * `package.json`'s `files` list publishes `bin/`, `dist/`, `.next/`, `public/`,
8
+ * `scripts/hooks/` and `.env.example` — NOT `scripts/`. A path into the repo
9
+ * therefore does not exist in a global install, and an `npx` install lives in a
10
+ * cache directory npm may garbage-collect out from under a long-lived `bind-key`.
11
+ * Embedding the text and materializing it into `~/.commandmate/bin/` gives the
12
+ * binding one absolute path that is stable across global / local / npx installs.
13
+ *
14
+ * ## Why the squeeze is reimplemented in awk
15
+ *
16
+ * The popup must not depend on the CommandMate server, a node binary, or a built
17
+ * `dist/` — it only has tmux and a shell. awk is present everywhere those are.
18
+ * The duplication is not left to trust: `tests/unit/lib/tmux/transcript-squeeze.test.ts`
19
+ * runs THIS awk program over real captures and asserts byte equality with
20
+ * `squeezeTranscript()`, so the two cannot drift apart silently.
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.PAGER_SCRIPT = exports.PAGER_SCRIPT_FILENAME = exports.SQUEEZE_AWK_PROGRAM = exports.SQUEEZE_AWK_LOCALE = void 0;
24
+ /**
25
+ * Locale the squeeze awk program MUST run under.
26
+ *
27
+ * Not cosmetic — the program is byte-oriented by construction, and `%c` is the
28
+ * one place where awk implementations disagree about what a "character" is:
29
+ *
30
+ * | awk | `sprintf("%c", 194)` |
31
+ * |-------------------------|----------------------|
32
+ * | mawk, BWK awk | byte `0xC2` |
33
+ * | gawk, `LC_ALL=C` | byte `0xC2` |
34
+ * | gawk, `*.UTF-8` locale | U+00C2 -> `C3 82` |
35
+ *
36
+ * `NBSP` below is assembled from bytes `C2 A0`, so under gawk in a UTF-8 locale
37
+ * it becomes a four-byte string that can never match a real NBSP — NBSP-only
38
+ * rows stop counting as blank and the frame comes back unsqueezed. That is not
39
+ * hypothetical: it is exactly how this shipped broken, green on macOS (BWK awk)
40
+ * and red on `ubuntu-latest`, whose `/usr/bin/awk` is gawk (Debian ranks the
41
+ * gawk alternative above mawk) under a UTF-8 locale.
42
+ *
43
+ * Pinning the locale — rather than making the regex match both encodings — is
44
+ * deliberate: an alternation covering the character form
45
+ * (`sprintf("%c%c",194,160) "|" sprintf("%c",160)`) fixes gawk but makes BWK awk
46
+ * abort with `multibyte conversion failure` in a UTF-8 locale. Measured on all
47
+ * three implementations, `LC_ALL=C` is the only setting where every one of them
48
+ * agrees, and it is byte-transparent: the same 1000-row fixture comes out with
49
+ * an identical sha256 from BWK awk, mawk and gawk.
50
+ *
51
+ * Scoped to the awk process alone, so `less` and tmux keep the user's locale and
52
+ * still render UTF-8 box drawing.
53
+ */
54
+ exports.SQUEEZE_AWK_LOCALE = 'C';
55
+ /**
56
+ * awk implementation of {@link import('./transcript-squeeze').squeezeTranscript}.
57
+ *
58
+ * Mirrors the TypeScript rules exactly:
59
+ * - `ANSI` is built from `sprintf("%c")` rather than a regex literal because
60
+ * `\033` / `\a` escapes inside a regex literal are not portable across awk
61
+ * implementations (macOS ships BWK awk, Linux usually gawk/mawk).
62
+ * - NBSP (UTF-8 `C2 A0`) is folded to a space before trimming, because
63
+ * JavaScript's `.trim()` treats U+00A0 as whitespace and awk's `[ \t]` does not.
64
+ * Without this the two implementations disagree on NBSP-only rows. This is the
65
+ * line that requires {@link SQUEEZE_AWK_LOCALE} — read that doc before editing.
66
+ * - Leading/trailing blank runs are dropped, runs of 1-2 kept verbatim, runs of
67
+ * 3+ collapsed to a single row carrying the run's ANSI sequences.
68
+ */
69
+ exports.SQUEEZE_AWK_PROGRAM = `BEGIN {
70
+ ESC = sprintf("%c", 27); BEL = sprintf("%c", 7); NBSP = sprintf("%c%c", 194, 160)
71
+ ANSI = ESC "\\\\[[0-9;]*[a-zA-Z]|" ESC "\\\\][^" BEL "]*" BEL "|\\\\[[0-9;]*m"
72
+ n = 0
73
+ }
74
+ { line[++n] = $0 }
75
+ END {
76
+ for (i = 1; i <= n; i++) {
77
+ s = line[i]; gsub(ANSI, "", s); gsub(NBSP, " ", s)
78
+ gsub(/^[ \\t\\r\\f\\v]+|[ \\t\\r\\f\\v]+$/, "", s)
79
+ blank[i] = (s == "")
80
+ }
81
+ seen = 0; i = 1
82
+ while (i <= n) {
83
+ if (!blank[i]) { print line[i]; seen = 1; i++; continue }
84
+ j = i; while (j <= n && blank[j]) j++
85
+ if (seen && j <= n) {
86
+ if (j - i <= 2) { for (k = i; k < j; k++) print line[k] }
87
+ else {
88
+ joined = ""; for (k = i; k < j; k++) joined = joined line[k]
89
+ keep = ""
90
+ while (match(joined, ANSI)) {
91
+ keep = keep substr(joined, RSTART, RLENGTH); joined = substr(joined, RSTART + RLENGTH)
92
+ }
93
+ print keep
94
+ }
95
+ }
96
+ i = j
97
+ }
98
+ }`;
99
+ /** Basename of the materialized script. */
100
+ exports.PAGER_SCRIPT_FILENAME = 'cm-read-pane.sh';
101
+ /**
102
+ * Full text of the pager script.
103
+ *
104
+ * Session resolution is done INSIDE the script on purpose. `display-popup` does
105
+ * NOT expand tmux formats in its shell-command (measured on 3.5a: a literal
106
+ * `#{session_name}` reaches the shell unexpanded), so the session cannot be baked
107
+ * into the binding. `tmux display-message -p` inside the popup returns the correct
108
+ * session and client, which is what makes one global binding serve every session.
109
+ *
110
+ * `=NAME:` is the exact-match target form required by Issue #1156 — a bare name
111
+ * prefix-matches and would show the `-2` instance's pane while the primary is
112
+ * stopped.
113
+ */
114
+ exports.PAGER_SCRIPT = `#!/bin/sh
115
+ # CommandMate reading mode (Issue #1623) — generated file, edits are overwritten.
116
+ #
117
+ # Renders the transcript of a CommandMate tmux session with layout-only blank rows
118
+ # squeezed away, so a pager lands on the composer instead of hundreds of rows of
119
+ # padding. Invoked by \`prefix+g\` through \`display-popup -E\`; also runnable by hand:
120
+ #
121
+ # sh ~/.commandmate/bin/${exports.PAGER_SCRIPT_FILENAME} mcbd-claude-my-worktree
122
+ #
123
+ # The popup is a SNAPSHOT. Press the key again to refresh it.
124
+ set -u
125
+
126
+ SESSION="\${1:-}"
127
+ if [ -z "$SESSION" ]; then
128
+ SESSION=$(tmux display-message -p '#{session_name}' 2>/dev/null) || SESSION=""
129
+ fi
130
+ if [ -z "$SESSION" ]; then
131
+ echo "cm-read-pane: no tmux session given and none could be resolved" >&2
132
+ exit 1
133
+ fi
134
+
135
+ LINES_BACK="\${CM_READ_LINES:-1000}"
136
+ case "$LINES_BACK" in
137
+ ''|*[!0-9]*) LINES_BACK=1000 ;;
138
+ esac
139
+
140
+ if [ -n "\${CM_READ_PAGER:-}" ]; then
141
+ PAGER_CMD="$CM_READ_PAGER"
142
+ elif command -v less >/dev/null 2>&1; then
143
+ PAGER_CMD="less -R +G"
144
+ else
145
+ PAGER_CMD="cat"
146
+ fi
147
+
148
+ # LC_ALL is pinned for awk ONLY (not for less, which still renders UTF-8 box
149
+ # drawing in the user's locale). Under gawk in a UTF-8 locale, sprintf("%c",194)
150
+ # yields U+00C2 rather than the byte 0xC2 and the NBSP fold below silently stops
151
+ # matching. See SQUEEZE_AWK_LOCALE in read-mode-pager.ts.
152
+ tmux capture-pane -pe -t "=$SESSION:" -S "-$LINES_BACK" -E - \\
153
+ | LC_ALL=${exports.SQUEEZE_AWK_LOCALE} awk '${exports.SQUEEZE_AWK_PROGRAM}' \\
154
+ | $PAGER_CMD
155
+
156
+ # Without a pager the popup would close before anything could be read.
157
+ if [ "$PAGER_CMD" = "cat" ]; then
158
+ printf '\\n[CommandMate] end of transcript — press Enter to close.' >&2
159
+ read -r _unused || true
160
+ fi
161
+ `;
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+ /**
3
+ * Reading mode: `prefix+g` opens a squeezed transcript in a tmux popup (Issue #1623, 案A).
4
+ *
5
+ * Attaching to a CommandMate session shows nothing readable. The pane is pinned to
6
+ * 200x1000 (Issue #1163), the agent draws its composer at the bottom and its
7
+ * transcript at the top, and tmux follows the cursor — which sits at row 997.
8
+ * Measured on a live session: an attached 72-row client sees ZERO transcript rows.
9
+ * This module adds an on-demand way to read, WITHOUT touching the geometry that
10
+ * status detection, Auto-Yes and the response saver depend on.
11
+ *
12
+ * ## This module mutates state CommandMate does not own — read before changing it
13
+ *
14
+ * `bind-key` writes the tmux server's GLOBAL prefix key table. Every session on
15
+ * that server inherits it, including ones CommandMate knows nothing about. Four
16
+ * guards keep that intervention honest, and all four are load-bearing:
17
+ *
18
+ * 1. **Capability probe.** `display-popup` is tmux 3.2+. Measured on 3.5a:
19
+ * `tmux list-commands <unknown>` exits 0 with EMPTY stdout, so the exit code is
20
+ * useless as a probe — the presence of output is the signal. Older tmux gets
21
+ * no binding at all (a genuine no-op), and the CLI viewer is the fallback.
22
+ * 2. **Conflict check.** `list-keys -T prefix <key>` exits 1 with `unknown key`
23
+ * when the key is free and exits 0 printing the binding when it is taken. A key
24
+ * already bound to something that is not ours is left ALONE. The Issue's claim
25
+ * that `prefix+g` is unbound on stock tmux 3.5a is true here, but says nothing
26
+ * about a user's own `.tmux.conf`.
27
+ * ORDER IS LOAD-BEARING: guard 1 runs first, and must keep doing so. On tmux
28
+ * 3.0 and older `list-keys` takes no key argument either (`usage: list-keys
29
+ * [-T key-table]`, measured in #1641), so this check degrades to "the key is
30
+ * always free" there. It is harmless only because those versions never reach
31
+ * it — guard 1 has already returned `unsupported-tmux`.
32
+ * 3. **Session-name guard.** The binding fires `if-shell -F '#{m:mcbd-*,...}'`, so
33
+ * pressing the key in a non-CommandMate session does nothing (measured: the
34
+ * format yields 1 for `mcbd-*` sessions and 0 for everything else).
35
+ * 4. **Opt-out that converges.** `CM_READ_MODE=off` does not merely skip
36
+ * installation — it REMOVES a binding a previous run installed. That is the
37
+ * uninstall path, and it is why shutdown does not unbind (see below).
38
+ *
39
+ * ## Why shutdown does not unbind
40
+ *
41
+ * CommandMate supports several servers at once (`commandmate start --issue N`),
42
+ * all sharing one tmux server. Unbinding when one of them stops would rip the key
43
+ * out from under the others, and the popup needs no CommandMate server to work —
44
+ * it only shells out to tmux. Removal is therefore an explicit user action
45
+ * (`CM_READ_MODE=off` + restart), not a shutdown side effect.
46
+ */
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.DEFAULT_READ_MODE_KEY = exports.MCBD_SESSION_PREFIX = void 0;
49
+ exports.getPagerScriptPath = getPagerScriptPath;
50
+ exports.isReadModeEnabled = isReadModeEnabled;
51
+ exports.resolveReadModeKey = resolveReadModeKey;
52
+ exports.quoteForTmuxCommand = quoteForTmuxCommand;
53
+ exports.buildBindKeyArgs = buildBindKeyArgs;
54
+ exports.supportsDisplayPopup = supportsDisplayPopup;
55
+ exports.readExistingBinding = readExistingBinding;
56
+ exports.materializePagerScript = materializePagerScript;
57
+ exports.buildUnbindKeyArgs = buildUnbindKeyArgs;
58
+ exports.reconcileReadModeBinding = reconcileReadModeBinding;
59
+ exports.initReadMode = initReadMode;
60
+ const child_process_1 = require("child_process");
61
+ const util_1 = require("util");
62
+ const os_1 = require("os");
63
+ const path_1 = require("path");
64
+ const fs_1 = require("fs");
65
+ const read_mode_pager_1 = require("./read-mode-pager");
66
+ const logger_1 = require("../logger");
67
+ const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
68
+ const logger = (0, logger_1.createLogger)('tmux-read-mode');
69
+ /** tmux calls here are interactive-latency, not long-running. */
70
+ const TMUX_TIMEOUT = 5000;
71
+ /**
72
+ * Session-name prefix every CommandMate tmux session carries.
73
+ *
74
+ * Not imported from `cli-tools/base.ts` because it is a template literal there,
75
+ * not a constant. `tests/unit/lib/tmux/read-mode.test.ts` asserts that a real
76
+ * `getSessionName()` still starts with this, so a rename breaks the test instead
77
+ * of silently turning the guard into a permanent "never fire".
78
+ */
79
+ exports.MCBD_SESSION_PREFIX = 'mcbd-';
80
+ /** Key bound under the prefix table when `CM_READ_MODE_KEY` is unset. */
81
+ exports.DEFAULT_READ_MODE_KEY = 'g';
82
+ /**
83
+ * Accepted `CM_READ_MODE_KEY` values: a single alphanumeric, an F-key, either
84
+ * optionally with a `C-` / `M-` / `S-` modifier. Deliberately narrow — a typo
85
+ * should be rejected loudly rather than bound to something surprising in the
86
+ * user's global key table.
87
+ */
88
+ const READ_MODE_KEY_PATTERN = /^(?:[CMS]-)?(?:[A-Za-z0-9]|F(?:[1-9]|1[0-2]))$/;
89
+ /** Popup geometry. Large enough to read, small enough to still see it is a popup. */
90
+ const POPUP_WIDTH = '90%';
91
+ const POPUP_HEIGHT = '85%';
92
+ /**
93
+ * Absolute path of the materialized pager script.
94
+ *
95
+ * Always under `~/.commandmate/`, never the install directory and never the cwd:
96
+ * `bind-key` is server-global and long-lived, so the path it names has to outlive
97
+ * a `npx` cache eviction or a `cd`.
98
+ */
99
+ function getPagerScriptPath() {
100
+ return (0, path_1.join)((0, os_1.homedir)(), '.commandmate', 'bin', read_mode_pager_1.PAGER_SCRIPT_FILENAME);
101
+ }
102
+ /** True unless the user set `CM_READ_MODE=off` (or `0` / `false`). */
103
+ function isReadModeEnabled() {
104
+ const raw = (process.env.CM_READ_MODE ?? '').trim().toLowerCase();
105
+ return raw !== 'off' && raw !== '0' && raw !== 'false';
106
+ }
107
+ /**
108
+ * Resolve the configured key, or undefined when it is malformed.
109
+ * @returns The key to bind, or undefined if `CM_READ_MODE_KEY` fails validation
110
+ */
111
+ function resolveReadModeKey() {
112
+ const raw = (process.env.CM_READ_MODE_KEY ?? '').trim();
113
+ if (raw === '')
114
+ return exports.DEFAULT_READ_MODE_KEY;
115
+ return READ_MODE_KEY_PATTERN.test(raw) ? raw : undefined;
116
+ }
117
+ /**
118
+ * Quote a path for the shell-command tmux stores in a binding.
119
+ *
120
+ * tmux lexes the stored command itself before handing words to `/bin/sh`, so the
121
+ * quoting has to survive that pass. POSIX `'...'` with `'\''` for embedded quotes
122
+ * satisfies both. Returns undefined for a path that cannot be represented (a
123
+ * newline has no single-quoted form tmux will parse), which callers treat as
124
+ * "do not install".
125
+ */
126
+ function quoteForTmuxCommand(path) {
127
+ if (path.includes('\n') || path.includes('\r'))
128
+ return undefined;
129
+ return `'${path.replace(/'/g, "'\\''")}'`;
130
+ }
131
+ /**
132
+ * The exact `bind-key` argument vector for a given key and script path.
133
+ * Exported so tests assert the wire form rather than a paraphrase of it.
134
+ */
135
+ function buildBindKeyArgs(key, quotedScriptPath) {
136
+ return [
137
+ 'bind-key',
138
+ '-T',
139
+ 'prefix',
140
+ key,
141
+ 'if-shell',
142
+ '-F',
143
+ `#{m:${exports.MCBD_SESSION_PREFIX}*,#{session_name}}`,
144
+ `display-popup -w ${POPUP_WIDTH} -h ${POPUP_HEIGHT} -E ${quotedScriptPath}`,
145
+ ];
146
+ }
147
+ /**
148
+ * Whether this tmux understands `display-popup` (3.2+).
149
+ *
150
+ * Probes on OUTPUT, not exit status. Measured against real binaries in
151
+ * containers (Issue #1641; harness: `scripts/verify-legacy-tmux-readmode.sh`):
152
+ *
153
+ * | tmux | `list-commands display-popup` | verdict |
154
+ * |---|---|---|
155
+ * | 2.8 / 3.0a | exit 1, `usage: list-commands [-F format]` | false |
156
+ * | 3.1c | exit 0, EMPTY stdout | false |
157
+ * | 3.3a / 3.5a | exit 0, the command's help line | true |
158
+ *
159
+ * Two different reasons produce the same right answer, and only the output test
160
+ * covers both: an exit-code probe calls 3.1c capable, and a stderr probe calls
161
+ * 3.3a incapable.
162
+ *
163
+ * NOT a general-purpose capability prober. On tmux 3.0 and older `list-commands`
164
+ * takes no command argument at all, so it answers `usage:` for names that tmux
165
+ * DOES support — reusing this shape for a command that predates 3.1 would report
166
+ * a false negative on every old tmux.
167
+ */
168
+ async function supportsDisplayPopup() {
169
+ try {
170
+ const { stdout } = await execFileAsync('tmux', ['list-commands', 'display-popup'], {
171
+ timeout: TMUX_TIMEOUT,
172
+ });
173
+ return stdout.trim() !== '';
174
+ }
175
+ catch {
176
+ return false;
177
+ }
178
+ }
179
+ /**
180
+ * Current prefix-table binding for `key`, or undefined when the key is free.
181
+ *
182
+ * @param key - tmux key name
183
+ * @returns The `bind-key ...` line tmux reports, or undefined if unbound
184
+ */
185
+ async function readExistingBinding(key) {
186
+ try {
187
+ const { stdout } = await execFileAsync('tmux', ['list-keys', '-T', 'prefix', key], {
188
+ timeout: TMUX_TIMEOUT,
189
+ });
190
+ const line = stdout.trim();
191
+ return line === '' ? undefined : line;
192
+ }
193
+ catch {
194
+ // Exit 1 + `unknown key: <k>` on stderr is how tmux reports "not bound".
195
+ return undefined;
196
+ }
197
+ }
198
+ /**
199
+ * Write the pager script to {@link getPagerScriptPath}, if its content changed.
200
+ *
201
+ * Idempotent by content comparison so a restart does not churn the file's mtime,
202
+ * and re-executable after a `chmod` accident because the mode is re-applied.
203
+ *
204
+ * @returns The absolute path written
205
+ */
206
+ function materializePagerScript() {
207
+ const scriptPath = getPagerScriptPath();
208
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(scriptPath), { recursive: true });
209
+ let current;
210
+ if ((0, fs_1.existsSync)(scriptPath)) {
211
+ try {
212
+ current = (0, fs_1.readFileSync)(scriptPath, 'utf-8');
213
+ }
214
+ catch {
215
+ current = undefined;
216
+ }
217
+ }
218
+ if (current !== read_mode_pager_1.PAGER_SCRIPT) {
219
+ (0, fs_1.writeFileSync)(scriptPath, read_mode_pager_1.PAGER_SCRIPT, { mode: 0o755 });
220
+ }
221
+ (0, fs_1.chmodSync)(scriptPath, 0o755);
222
+ return scriptPath;
223
+ }
224
+ /**
225
+ * The exact argument vector that removes the binding again.
226
+ *
227
+ * Paired with {@link buildBindKeyArgs} and exported for the same reason: the
228
+ * install and uninstall paths are asserted against these builders rather than
229
+ * against re-typed literals, so a test cannot drift from what actually runs —
230
+ * and `tests/unit/config/tmux-live-test-safety.test.ts` keeps its meaning,
231
+ * because the mutating verbs appear in exactly one place, here in `src/`.
232
+ */
233
+ function buildUnbindKeyArgs(key) {
234
+ return ['unbind-key', '-T', 'prefix', key];
235
+ }
236
+ /**
237
+ * Remove the binding, but ONLY when it is still the one we installed.
238
+ *
239
+ * A user who rebound the key after us owns it now; clobbering that would be the
240
+ * same rudeness the conflict check exists to avoid.
241
+ */
242
+ async function removeOwnBinding(key, scriptPath) {
243
+ const existing = await readExistingBinding(key);
244
+ if (existing === undefined)
245
+ return 'not-installed';
246
+ if (!existing.includes(scriptPath))
247
+ return 'key-conflict';
248
+ await execFileAsync('tmux', buildUnbindKeyArgs(key), { timeout: TMUX_TIMEOUT });
249
+ return 'removed';
250
+ }
251
+ /**
252
+ * Reconcile the tmux prefix key table with the configured reading-mode state.
253
+ *
254
+ * Safe to call on every server start: installing twice is a no-op, and the
255
+ * disabled path removes what an earlier run installed. Never throws — reading
256
+ * mode is a convenience, and no failure here may keep the server from starting.
257
+ *
258
+ * @returns What was done, for logging and for tests
259
+ */
260
+ async function reconcileReadModeBinding() {
261
+ const key = resolveReadModeKey();
262
+ const scriptPath = getPagerScriptPath();
263
+ if (key === undefined) {
264
+ return {
265
+ installed: false,
266
+ outcome: 'invalid-key',
267
+ key: process.env.CM_READ_MODE_KEY ?? '',
268
+ scriptPath,
269
+ detail: 'CM_READ_MODE_KEY must be a single alphanumeric or F-key, optionally with a C-/M-/S- modifier',
270
+ };
271
+ }
272
+ try {
273
+ if (!isReadModeEnabled()) {
274
+ const outcome = await removeOwnBinding(key, scriptPath);
275
+ return { installed: false, outcome, key, scriptPath, detail: 'CM_READ_MODE=off' };
276
+ }
277
+ if (!(await supportsDisplayPopup())) {
278
+ return {
279
+ installed: false,
280
+ outcome: 'unsupported-tmux',
281
+ key,
282
+ scriptPath,
283
+ detail: 'display-popup requires tmux 3.2+; use `commandmate capture <id> --pane` instead',
284
+ };
285
+ }
286
+ const quoted = quoteForTmuxCommand(scriptPath);
287
+ if (quoted === undefined) {
288
+ return { installed: false, outcome: 'unsafe-script-path', key, scriptPath };
289
+ }
290
+ const existing = await readExistingBinding(key);
291
+ if (existing !== undefined && !existing.includes(scriptPath)) {
292
+ return {
293
+ installed: false,
294
+ outcome: 'key-conflict',
295
+ key,
296
+ scriptPath,
297
+ detail: `prefix+${key} is already bound: ${existing}`,
298
+ };
299
+ }
300
+ materializePagerScript();
301
+ await execFileAsync('tmux', buildBindKeyArgs(key, quoted), { timeout: TMUX_TIMEOUT });
302
+ return {
303
+ installed: true,
304
+ outcome: existing === undefined ? 'installed' : 'already-installed',
305
+ key,
306
+ scriptPath,
307
+ };
308
+ }
309
+ catch (error) {
310
+ return {
311
+ installed: false,
312
+ outcome: 'error',
313
+ key,
314
+ scriptPath,
315
+ detail: error instanceof Error ? error.message : String(error),
316
+ };
317
+ }
318
+ }
319
+ /**
320
+ * Startup entry point: reconcile and log the outcome once.
321
+ *
322
+ * `server.ts` must reach this through `await import()`, never a top-level static
323
+ * import — pulling module graphs into server.ts's eval-time graph perturbs Next's
324
+ * AsyncLocalStorage bootstrap under `tsx server.ts` and the first request that
325
+ * compiles middleware dies (see the Skill reconciler note in server.ts).
326
+ */
327
+ async function initReadMode() {
328
+ const status = await reconcileReadModeBinding();
329
+ switch (status.outcome) {
330
+ case 'installed':
331
+ case 'already-installed':
332
+ logger.info('read-mode:ready', { key: status.key, scriptPath: status.scriptPath });
333
+ break;
334
+ case 'removed':
335
+ case 'not-installed':
336
+ case 'disabled':
337
+ logger.info('read-mode:disabled', { key: status.key, outcome: status.outcome });
338
+ break;
339
+ default:
340
+ logger.warn('read-mode:not-installed', {
341
+ outcome: status.outcome,
342
+ key: status.key,
343
+ detail: status.detail,
344
+ });
345
+ }
346
+ return status;
347
+ }
@@ -20,6 +20,7 @@
20
20
  */
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.CACHE_MAX_CAPTURE_LINES = exports.CACHE_MAX_ENTRIES = exports.CACHE_TTL_MS = void 0;
23
+ exports.isCaptureWindowSaturated = isCaptureWindowSaturated;
23
24
  exports.sliceOutput = sliceOutput;
24
25
  exports.getCachedCapture = getCachedCapture;
25
26
  exports.setCachedCapture = setCachedCapture;
@@ -45,6 +46,38 @@ exports.CACHE_TTL_MS = 5000;
45
46
  exports.CACHE_MAX_ENTRIES = 100;
46
47
  /** Maximum capture lines for cache storage */
47
48
  exports.CACHE_MAX_CAPTURE_LINES = 10000;
49
+ // =========================================================================
50
+ // isCaptureWindowSaturated()
51
+ // =========================================================================
52
+ /**
53
+ * Whether a capture came back clipped by the capture window (Issue #1670).
54
+ *
55
+ * Every capture in this app is a SLIDING WINDOW over the tail of the pane, not a
56
+ * view of the whole buffer: `captureSessionOutput()` asks tmux for
57
+ * `-S -CACHE_MAX_CAPTURE_LINES` and `sliceOutput()` then keeps only the last
58
+ * `requestedLines` rows. So the returned line count is
59
+ * `min(pane_scrollback + pane_height, windowLines)`.
60
+ *
61
+ * While the pane holds fewer rows than the window, that count GROWS with the
62
+ * transcript, which is what makes `session_states.last_captured_line` usable as a
63
+ * "how far have I read" cursor. Once the pane outgrows the window the count is
64
+ * pinned at `windowLines` forever and the window merely slides: a line index
65
+ * recorded earlier no longer denotes the same line, and no later capture can ever
66
+ * report a larger count. Callers must stop trusting the cursor at that point —
67
+ * see `usesAlternateScreen` in lib/cli-tools/types.ts for the sibling condition
68
+ * (#1268), where the same thing happens at `pane_height` instead.
69
+ *
70
+ * Raising `windowLines` does not avoid this; it only moves where it happens
71
+ * (`TMUX_HISTORY_LIMIT` is the hard ceiling), which is why the check is written
72
+ * against the window in use rather than against a specific constant.
73
+ *
74
+ * @param capturedLineCount - Number of lines the capture actually returned
75
+ * @param windowLines - Size of the capture window that produced it
76
+ * @returns True when the capture was clipped, i.e. the line count is no longer a cursor
77
+ */
78
+ function isCaptureWindowSaturated(capturedLineCount, windowLines = exports.CACHE_MAX_CAPTURE_LINES) {
79
+ return windowLines > 0 && capturedLineCount >= windowLines;
80
+ }
48
81
  function getCache() {
49
82
  return (globalThis.__tmuxCaptureCache ??= new Map());
50
83
  }
@@ -101,6 +101,18 @@ class TmuxControlClient {
101
101
  isStarted() {
102
102
  return this.started;
103
103
  }
104
+ /**
105
+ * Point this client's bookkeeping at a session that has been renamed
106
+ * underneath it (Issue #1621 Phase 3).
107
+ *
108
+ * The attach itself needs no repair: `attach-session` binds to the session
109
+ * object, not to its name, so a `rename-session` leaves the child process,
110
+ * its pipe and its scrollback untouched (measured in #1621). Only the name
111
+ * this client reports in its logs would otherwise go stale.
112
+ */
113
+ setSessionName(sessionName) {
114
+ this.sessionName = sessionName;
115
+ }
104
116
  emit(event) {
105
117
  for (const handler of this.handlers) {
106
118
  handler(event);
@@ -70,6 +70,45 @@ class TmuxControlRegistry {
70
70
  this.handlers.clear();
71
71
  this.updateMetrics();
72
72
  }
73
+ /**
74
+ * Re-file a live control-mode attach under a session's new name
75
+ * (Issue #1621 Phase 3).
76
+ *
77
+ * `rename-session` does not disturb an attached control client, so the child
78
+ * process, its pipe and its scrollback all survive — what breaks is this
79
+ * registry, which is keyed by name. Without re-keying, `sendInput(newName)`
80
+ * throws "No control client registered" while a perfectly healthy attach sits
81
+ * under the old key: the session is alive but input no longer reaches it.
82
+ * Re-keying is therefore strictly better than tearing the attach down and
83
+ * re-establishing it, and it keeps every subscriber connected.
84
+ *
85
+ * @returns true when an entry was moved; false when nothing was registered
86
+ * under `oldName`, or when `newName` is already registered (the
87
+ * existing attach wins — clobbering it would strand a live child
88
+ * process with no way to stop it)
89
+ */
90
+ renameSession(oldName, newName) {
91
+ if (oldName === newName)
92
+ return false;
93
+ const entry = this.entries.get(oldName);
94
+ if (!entry)
95
+ return false;
96
+ if (this.entries.has(newName)) {
97
+ logger.warn('rename:destination-occupied', { oldName, newName });
98
+ return false;
99
+ }
100
+ this.entries.delete(oldName);
101
+ entry.sessionName = newName;
102
+ this.entries.set(newName, entry);
103
+ entry.client.setSessionName(newName);
104
+ const handlers = this.handlers.get(oldName);
105
+ if (handlers) {
106
+ this.handlers.delete(oldName);
107
+ this.handlers.set(newName, handlers);
108
+ }
109
+ logger.debug('rename', { oldName, newName });
110
+ return true;
111
+ }
73
112
  ensureEntry(sessionName) {
74
113
  const existing = this.entries.get(sessionName);
75
114
  if (existing) {
@@ -77,23 +116,26 @@ class TmuxControlRegistry {
77
116
  }
78
117
  const client = this.createClient(sessionName);
79
118
  client.start(sessionName);
80
- const unsubscribeClientEvent = client.onEvent((event) => {
81
- const handlers = this.handlers.get(sessionName);
119
+ const entry = {
120
+ client,
121
+ subscribers: new Set(),
122
+ // Replaced immediately below; the entry has to exist first so the event
123
+ // handler can read its current name rather than capture the old one.
124
+ unsubscribeClientEvent: () => { },
125
+ idleTimer: null,
126
+ sessionName,
127
+ };
128
+ entry.unsubscribeClientEvent = client.onEvent((event) => {
129
+ const handlers = this.handlers.get(entry.sessionName);
82
130
  if (handlers) {
83
131
  for (const handler of handlers) {
84
132
  handler(event);
85
133
  }
86
134
  }
87
135
  if (event.type === 'exit' || event.type === 'error') {
88
- this.deleteEntry(sessionName);
136
+ this.deleteEntry(entry.sessionName);
89
137
  }
90
138
  });
91
- const entry = {
92
- client,
93
- subscribers: new Set(),
94
- unsubscribeClientEvent,
95
- idleTimer: null,
96
- };
97
139
  this.entries.set(sessionName, entry);
98
140
  this.updateMetrics();
99
141
  return entry;
@@ -116,8 +158,10 @@ class TmuxControlRegistry {
116
158
  }
117
159
  this.cancelIdleCleanup(entry);
118
160
  entry.idleTimer = setTimeout(() => {
119
- logger.debug('idle-cleanup', { sessionName });
120
- this.deleteEntry(sessionName);
161
+ // entry.sessionName, not the captured `sessionName`: the session may have
162
+ // been renamed while this timer was pending (see renameSession).
163
+ logger.debug('idle-cleanup', { sessionName: entry.sessionName });
164
+ this.deleteEntry(entry.sessionName);
121
165
  }, this.idleTimeoutMs);
122
166
  }
123
167
  cancelIdleCleanup(entry) {