commandmate 0.26.1 → 0.27.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 (838) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +435 -407
  3. package/.next/app-path-routes-manifest.json +30 -26
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +6 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +24 -0
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  15. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  17. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  18. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js +1 -1
  20. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  21. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js +1 -1
  23. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  24. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js +1 -1
  26. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  27. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/assistant/terminal/route.js +2 -2
  29. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js +1 -1
  32. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  33. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/capabilities/route.js +1 -0
  38. package/.next/server/app/api/capabilities/route.js.nft.json +1 -0
  39. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -0
  40. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/fs/browse/route.js +2 -2
  46. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  47. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/fs/recent-paths/route.js +2 -2
  49. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  50. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  52. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  53. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/hooks/claude-done/route.js +19 -1
  55. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  56. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  58. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  59. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/push/escalation/route.js +1 -1
  63. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  64. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  66. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/push/vapid/route.js +1 -1
  68. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  69. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  72. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  74. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  76. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/clone/route.js +1 -1
  79. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/restore/route.js +1 -1
  83. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  84. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/repositories/route.js +1 -1
  86. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  87. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/repositories/scan/route.js +1 -1
  89. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  90. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/repositories/sync/route.js +1 -1
  92. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  93. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  95. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  96. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  106. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/todos/route.js +1 -1
  110. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  112. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/verification/runs/route.js +1 -1
  114. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  117. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  120. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -0
  122. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -0
  123. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -0
  124. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  128. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/current-output/route.js +2 -1
  130. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  131. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/env/route.js +2 -0
  133. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -0
  134. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -0
  135. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  141. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -0
  194. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -0
  195. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -0
  196. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  201. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -5
  203. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -6
  209. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/send/route.js +3 -1
  215. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  216. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  240. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/route.js +3 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  258. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/route.js +1 -1
  269. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  270. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/chat/page.js +2 -2
  272. package/.next/server/app/chat/page.js.nft.json +1 -1
  273. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/login/page.js +2 -2
  275. package/.next/server/app/login/page.js.nft.json +1 -1
  276. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/more/page.js +2 -2
  279. package/.next/server/app/more/page.js.nft.json +1 -1
  280. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/page.js +1 -1
  283. package/.next/server/app/page.js.nft.json +1 -1
  284. package/.next/server/app/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/repositories/page.js +2 -2
  287. package/.next/server/app/repositories/page.js.nft.json +1 -1
  288. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  289. package/.next/server/app/review/page.js +1 -1
  290. package/.next/server/app/review/page.js.nft.json +1 -1
  291. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  292. package/.next/server/app/sessions/page.js +1 -1
  293. package/.next/server/app/sessions/page.js.nft.json +1 -1
  294. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  295. package/.next/server/app/skills/[skillId]/page.js +2 -2
  296. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  297. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  298. package/.next/server/app/skills/installed/page.js +2 -2
  299. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  300. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  301. package/.next/server/app/skills/page.js +2 -2
  302. package/.next/server/app/skills/page.js.nft.json +1 -1
  303. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  304. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  305. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  306. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  307. package/.next/server/app/worktrees/[id]/page.js +9 -7
  308. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  309. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  310. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  311. package/.next/server/app-paths-manifest.json +30 -26
  312. package/.next/server/chunks/1029.js +1 -1
  313. package/.next/server/chunks/1068.js +3 -1
  314. package/.next/server/chunks/1296.js +1 -1
  315. package/.next/server/chunks/1538.js +7 -0
  316. package/.next/server/chunks/1601.js +2 -2
  317. package/.next/server/chunks/2119.js +1 -1
  318. package/.next/server/chunks/2404.js +3 -2
  319. package/.next/server/chunks/2445.js +1 -1
  320. package/.next/server/chunks/2546.js +1 -1
  321. package/.next/server/chunks/2689.js +13 -0
  322. package/.next/server/chunks/2759.js +8 -0
  323. package/.next/server/chunks/2839.js +1 -0
  324. package/.next/server/chunks/3241.js +1 -1
  325. package/.next/server/chunks/3292.js +1 -0
  326. package/.next/server/chunks/3417.js +1 -1
  327. package/.next/server/chunks/3480.js +1 -17
  328. package/.next/server/chunks/4393.js +1 -1
  329. package/.next/server/chunks/4423.js +1 -0
  330. package/.next/server/chunks/4444.js +22 -8
  331. package/.next/server/chunks/4565.js +3 -0
  332. package/.next/server/chunks/467.js +1 -0
  333. package/.next/server/chunks/4905.js +5 -0
  334. package/.next/server/chunks/5017.js +1 -0
  335. package/.next/server/chunks/5089.js +1 -0
  336. package/.next/server/chunks/5164.js +1 -1
  337. package/.next/server/chunks/5220.js +1 -0
  338. package/.next/server/chunks/5354.js +1 -0
  339. package/.next/server/chunks/552.js +19 -0
  340. package/.next/server/chunks/5571.js +1 -1
  341. package/.next/server/chunks/5998.js +3 -3
  342. package/.next/server/chunks/6130.js +1 -1
  343. package/.next/server/chunks/6274.js +11 -11
  344. package/.next/server/chunks/6285.js +1 -1
  345. package/.next/server/chunks/6401.js +1 -1
  346. package/.next/server/chunks/6781.js +1 -1
  347. package/.next/server/chunks/7472.js +1 -0
  348. package/.next/server/chunks/7506.js +1 -0
  349. package/.next/server/chunks/848.js +1 -1
  350. package/.next/server/chunks/8536.js +1 -1
  351. package/.next/server/chunks/880.js +1 -1
  352. package/.next/server/chunks/8807.js +5 -5
  353. package/.next/server/chunks/9067.js +1 -1
  354. package/.next/server/chunks/9284.js +1 -0
  355. package/.next/server/chunks/9358.js +1 -1
  356. package/.next/server/chunks/9508.js +1 -0
  357. package/.next/server/chunks/9938.js +1 -0
  358. package/.next/server/middleware-build-manifest.js +1 -1
  359. package/.next/server/middleware-manifest.json +5 -5
  360. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  361. package/.next/server/pages/500.html +1 -1
  362. package/.next/server/server-reference-manifest.json +1 -1
  363. package/.next/static/chunks/{2053-dfac2d49227cc942.js → 2053-c0e931eb4391baa1.js} +1 -1
  364. package/.next/static/chunks/3361-5d6e93fba8a92bc1.js +1 -0
  365. package/.next/static/chunks/3922.0d2e64daf9f187da.js +1 -0
  366. package/.next/static/chunks/{5229-35f9acab97a553c5.js → 5229-1f5f19740a8d6c11.js} +1 -1
  367. package/.next/static/chunks/{6381-0e097c0286155883.js → 6381-b7250e8ca7a44c6c.js} +1 -1
  368. package/.next/static/chunks/{8649-f551b0010dba4986.js → 8521-c43994fb58501d13.js} +1 -1
  369. package/.next/static/chunks/app/api/app/update/route-6add0d88e2828c23.js +1 -0
  370. package/.next/static/chunks/app/api/app/update-check/route-6add0d88e2828c23.js +1 -0
  371. package/.next/static/chunks/app/api/assistant/conversation/route-6add0d88e2828c23.js +1 -0
  372. package/.next/static/chunks/app/api/assistant/current-output/route-6add0d88e2828c23.js +1 -0
  373. package/.next/static/chunks/app/api/assistant/messages/route-6add0d88e2828c23.js +1 -0
  374. package/.next/static/chunks/app/api/assistant/session/route-6add0d88e2828c23.js +1 -0
  375. package/.next/static/chunks/app/api/assistant/start/route-6add0d88e2828c23.js +1 -0
  376. package/.next/static/chunks/app/api/assistant/terminal/route-6add0d88e2828c23.js +1 -0
  377. package/.next/static/chunks/app/api/assistant/tools/route-6add0d88e2828c23.js +1 -0
  378. package/.next/static/chunks/app/api/auth/login/route-6add0d88e2828c23.js +1 -0
  379. package/.next/static/chunks/app/api/auth/logout/route-6add0d88e2828c23.js +1 -0
  380. package/.next/static/chunks/app/api/auth/status/route-6add0d88e2828c23.js +1 -0
  381. package/.next/static/chunks/app/api/capabilities/route-6add0d88e2828c23.js +1 -0
  382. package/.next/static/chunks/app/api/daily-summary/route-6add0d88e2828c23.js +1 -0
  383. package/.next/static/chunks/app/api/daily-summary/status/route-6add0d88e2828c23.js +1 -0
  384. package/.next/static/chunks/app/api/external-apps/[id]/health/route-6add0d88e2828c23.js +1 -0
  385. package/.next/static/chunks/app/api/external-apps/[id]/route-6add0d88e2828c23.js +1 -0
  386. package/.next/static/chunks/app/api/external-apps/route-6add0d88e2828c23.js +1 -0
  387. package/.next/static/chunks/app/api/fs/browse/route-6add0d88e2828c23.js +1 -0
  388. package/.next/static/chunks/app/api/fs/recent-paths/route-6add0d88e2828c23.js +1 -0
  389. package/.next/static/chunks/app/api/hooks/agent-event/route-6add0d88e2828c23.js +1 -0
  390. package/.next/static/chunks/app/api/hooks/claude-done/route-6add0d88e2828c23.js +1 -0
  391. package/.next/static/chunks/app/api/hooks/permission-request/route-6add0d88e2828c23.js +1 -0
  392. package/.next/static/chunks/app/api/metrics/vibe/route-6add0d88e2828c23.js +1 -0
  393. package/.next/static/chunks/app/api/ollama/models/route-6add0d88e2828c23.js +1 -0
  394. package/.next/static/chunks/app/api/push/escalation/route-6add0d88e2828c23.js +1 -0
  395. package/.next/static/chunks/app/api/push/subscriptions/route-6add0d88e2828c23.js +1 -0
  396. package/.next/static/chunks/app/api/push/vapid/route-6add0d88e2828c23.js +1 -0
  397. package/.next/static/chunks/app/api/repositories/[id]/route-6add0d88e2828c23.js +1 -0
  398. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
  399. package/.next/static/chunks/app/api/repositories/[id]/todos/route-6add0d88e2828c23.js +1 -0
  400. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-6add0d88e2828c23.js +1 -0
  401. package/.next/static/chunks/app/api/repositories/clone/route-6add0d88e2828c23.js +1 -0
  402. package/.next/static/chunks/app/api/repositories/excluded/route-6add0d88e2828c23.js +1 -0
  403. package/.next/static/chunks/app/api/repositories/restore/route-6add0d88e2828c23.js +1 -0
  404. package/.next/static/chunks/app/api/repositories/route-6add0d88e2828c23.js +1 -0
  405. package/.next/static/chunks/app/api/repositories/scan/route-6add0d88e2828c23.js +1 -0
  406. package/.next/static/chunks/app/api/repositories/sync/route-6add0d88e2828c23.js +1 -0
  407. package/.next/static/chunks/app/api/repositories/validate-path/route-6add0d88e2828c23.js +1 -0
  408. package/.next/static/chunks/app/api/sidebar/group-order/route-6add0d88e2828c23.js +1 -0
  409. package/.next/static/chunks/app/api/skills/[id]/route-6add0d88e2828c23.js +1 -0
  410. package/.next/static/chunks/app/api/skills/installations/route-6add0d88e2828c23.js +1 -0
  411. package/.next/static/chunks/app/api/skills/operations/route-6add0d88e2828c23.js +1 -0
  412. package/.next/static/chunks/app/api/skills/reindex/route-6add0d88e2828c23.js +1 -0
  413. package/.next/static/chunks/app/api/skills/route-6add0d88e2828c23.js +1 -0
  414. package/.next/static/chunks/app/api/slash-commands/route-6add0d88e2828c23.js +1 -0
  415. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-6add0d88e2828c23.js +1 -0
  416. package/.next/static/chunks/app/api/tasks/[taskId]/route-6add0d88e2828c23.js +1 -0
  417. package/.next/static/chunks/app/api/templates/[id]/route-6add0d88e2828c23.js +1 -0
  418. package/.next/static/chunks/app/api/templates/route-6add0d88e2828c23.js +1 -0
  419. package/.next/static/chunks/app/api/todos/route-6add0d88e2828c23.js +1 -0
  420. package/.next/static/chunks/app/api/verification/runs/[runId]/route-6add0d88e2828c23.js +1 -0
  421. package/.next/static/chunks/app/api/verification/runs/route-6add0d88e2828c23.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-6add0d88e2828c23.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-6add0d88e2828c23.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-6add0d88e2828c23.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-6add0d88e2828c23.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-6add0d88e2828c23.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-6add0d88e2828c23.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/env/route-6add0d88e2828c23.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-6add0d88e2828c23.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-6add0d88e2828c23.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-6add0d88e2828c23.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-6add0d88e2828c23.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-6add0d88e2828c23.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-6add0d88e2828c23.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-6add0d88e2828c23.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-6add0d88e2828c23.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-6add0d88e2828c23.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-6add0d88e2828c23.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-6add0d88e2828c23.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-6add0d88e2828c23.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-6add0d88e2828c23.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-6add0d88e2828c23.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-6add0d88e2828c23.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-6add0d88e2828c23.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-6add0d88e2828c23.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-6add0d88e2828c23.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-6add0d88e2828c23.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-6add0d88e2828c23.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-6add0d88e2828c23.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-6add0d88e2828c23.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-6add0d88e2828c23.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-6add0d88e2828c23.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-6add0d88e2828c23.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-6add0d88e2828c23.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-6add0d88e2828c23.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-6add0d88e2828c23.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-6add0d88e2828c23.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-6add0d88e2828c23.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-6add0d88e2828c23.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-6add0d88e2828c23.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-6add0d88e2828c23.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-6add0d88e2828c23.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-6add0d88e2828c23.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-6add0d88e2828c23.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-6add0d88e2828c23.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/route-6add0d88e2828c23.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-6add0d88e2828c23.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-6add0d88e2828c23.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-6add0d88e2828c23.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/search/route-6add0d88e2828c23.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/send/route-6add0d88e2828c23.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-6add0d88e2828c23.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-6add0d88e2828c23.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-6add0d88e2828c23.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-6add0d88e2828c23.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-6add0d88e2828c23.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-6add0d88e2828c23.js +1 -0
  478. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-6add0d88e2828c23.js +1 -0
  479. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-6add0d88e2828c23.js +1 -0
  480. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-6add0d88e2828c23.js +1 -0
  481. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-6add0d88e2828c23.js +1 -0
  482. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-6add0d88e2828c23.js +1 -0
  483. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-6add0d88e2828c23.js +1 -0
  484. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-6add0d88e2828c23.js +1 -0
  485. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-6add0d88e2828c23.js +1 -0
  486. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-6add0d88e2828c23.js +1 -0
  487. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-6add0d88e2828c23.js +1 -0
  488. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-6add0d88e2828c23.js +1 -0
  489. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-6add0d88e2828c23.js +1 -0
  490. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-6add0d88e2828c23.js +1 -0
  491. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-6add0d88e2828c23.js +1 -0
  492. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-6add0d88e2828c23.js +1 -0
  493. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-6add0d88e2828c23.js +1 -0
  494. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-6add0d88e2828c23.js +1 -0
  495. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-6add0d88e2828c23.js +1 -0
  496. package/.next/static/chunks/app/api/worktrees/route-6add0d88e2828c23.js +1 -0
  497. package/.next/static/chunks/app/chat/{page-439b35c9cb90dbe0.js → page-231df45127e876c2.js} +1 -1
  498. package/.next/static/chunks/app/login/{page-eefd515d8c37e5ee.js → page-adc51f0f7cbb7ac6.js} +1 -1
  499. package/.next/static/chunks/app/manifest.webmanifest/route-6add0d88e2828c23.js +1 -0
  500. package/.next/static/chunks/app/more/{page-889b7546a8a553dc.js → page-3266dfa945972649.js} +1 -1
  501. package/.next/static/chunks/app/{page-a8d04ac0e3e4c9fc.js → page-0305431f43195431.js} +1 -1
  502. package/.next/static/chunks/app/proxy/[...path]/route-6add0d88e2828c23.js +1 -0
  503. package/.next/static/chunks/app/repositories/{page-f3c4d8839b1ca203.js → page-ae8fa55749976f79.js} +1 -1
  504. package/.next/static/chunks/app/review/{page-6dc88649fe88ac16.js → page-8f63aff862fee421.js} +1 -1
  505. package/.next/static/chunks/app/sessions/{page-2c9ed9e969097688.js → page-4d5382b257077c14.js} +1 -1
  506. package/.next/static/chunks/app/skills/[skillId]/{page-19beef6121c4c982.js → page-aaf0bcb1dfb558b9.js} +1 -1
  507. package/.next/static/chunks/app/skills/installed/{page-d5b9cef6d21fabda.js → page-dafc486410e839b7.js} +1 -1
  508. package/.next/static/chunks/app/skills/{page-06ef637e07dd9377.js → page-9e3c91da31514893.js} +1 -1
  509. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-5fed3984fafcd910.js → page-90f96977c741bbf8.js} +1 -1
  510. package/.next/static/chunks/app/worktrees/[id]/layout-6add0d88e2828c23.js +1 -0
  511. package/.next/static/chunks/app/worktrees/[id]/page-e4f28966b4fc0ce1.js +1 -0
  512. package/.next/static/chunks/{webpack-9d892a9ff07c289d.js → webpack-6a9668cf54a26eba.js} +1 -1
  513. package/.next/static/css/928e5a8830fbf997.css +1 -0
  514. package/.next/static/t0BoV4H46ZgKmTjSi7GIz/_buildManifest.js +1 -0
  515. package/.next/trace +13 -12
  516. package/.next/types/app/api/capabilities/route.ts +347 -0
  517. package/.next/types/app/api/worktrees/[id]/clear-composer/route.ts +347 -0
  518. package/.next/types/app/api/worktrees/[id]/env/route.ts +347 -0
  519. package/.next/types/app/api/worktrees/[id]/resolve-target/route.ts +347 -0
  520. package/.next/types/routes.d.ts +5 -1
  521. package/.next/types/validator.ts +36 -0
  522. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  523. package/dist/cli/commands/auto-yes.js +40 -2
  524. package/dist/cli/commands/capture.d.ts.map +1 -1
  525. package/dist/cli/commands/capture.js +28 -13
  526. package/dist/cli/commands/instances.d.ts +30 -18
  527. package/dist/cli/commands/instances.d.ts.map +1 -1
  528. package/dist/cli/commands/instances.js +32 -36
  529. package/dist/cli/commands/ls.d.ts.map +1 -1
  530. package/dist/cli/commands/ls.js +73 -1
  531. package/dist/cli/commands/respond.d.ts.map +1 -1
  532. package/dist/cli/commands/respond.js +18 -1
  533. package/dist/cli/commands/send.d.ts.map +1 -1
  534. package/dist/cli/commands/send.js +21 -15
  535. package/dist/cli/commands/status.d.ts.map +1 -1
  536. package/dist/cli/commands/status.js +38 -0
  537. package/dist/cli/commands/wait.d.ts +26 -0
  538. package/dist/cli/commands/wait.d.ts.map +1 -1
  539. package/dist/cli/commands/wait.js +390 -43
  540. package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
  541. package/dist/cli/config/cli-dependencies.js +16 -0
  542. package/dist/cli/config/cli-tool-ids.d.ts +11 -0
  543. package/dist/cli/config/cli-tool-ids.d.ts.map +1 -1
  544. package/dist/cli/config/cli-tool-ids.js +12 -1
  545. package/dist/cli/types/api-responses.d.ts +443 -2
  546. package/dist/cli/types/api-responses.d.ts.map +1 -1
  547. package/dist/cli/utils/api-client.d.ts +18 -0
  548. package/dist/cli/utils/api-client.d.ts.map +1 -1
  549. package/dist/cli/utils/api-client.js +22 -0
  550. package/dist/cli/utils/server-capabilities.d.ts +56 -0
  551. package/dist/cli/utils/server-capabilities.d.ts.map +1 -0
  552. package/dist/cli/utils/server-capabilities.js +166 -0
  553. package/dist/cli/utils/session-target.d.ts +70 -0
  554. package/dist/cli/utils/session-target.d.ts.map +1 -0
  555. package/dist/cli/utils/session-target.js +118 -0
  556. package/dist/lib/cli-tools/copilot-executable.d.ts +79 -0
  557. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -0
  558. package/dist/lib/cli-tools/copilot-executable.js +155 -0
  559. package/dist/lib/cli-tools/types.d.ts +61 -0
  560. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  561. package/dist/lib/cli-tools/types.js +41 -0
  562. package/dist/lib/detection/ansi.d.ts +2 -1
  563. package/dist/lib/detection/ansi.d.ts.map +1 -1
  564. package/dist/lib/detection/ansi.js +3 -2
  565. package/dist/lib/detection/tools/verified-against.d.ts +84 -0
  566. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -0
  567. package/dist/lib/detection/tools/verified-against.js +88 -0
  568. package/dist/lib/detection/version-probes.d.ts +207 -0
  569. package/dist/lib/detection/version-probes.d.ts.map +1 -0
  570. package/dist/lib/detection/version-probes.js +290 -0
  571. package/dist/lib/security/env-sanitizer.d.ts +198 -0
  572. package/dist/lib/security/env-sanitizer.d.ts.map +1 -0
  573. package/dist/lib/security/env-sanitizer.js +232 -0
  574. package/dist/server/locales/en/notifications.json +17 -6
  575. package/dist/server/locales/ja/notifications.json +17 -6
  576. package/dist/server/src/config/activity-bar-config.js +4 -0
  577. package/dist/server/src/config/cli-tool-timing-config.js +59 -2
  578. package/dist/server/src/config/copilot-constants.js +11 -1
  579. package/dist/server/src/config/detection-evidence-config.js +129 -0
  580. package/dist/server/src/config/schedule-config.js +56 -7
  581. package/dist/server/src/config/tmux-pane-config.js +18 -1
  582. package/dist/server/src/lib/auto-yes-poller.js +36 -0
  583. package/dist/server/src/lib/cli-tools/antigravity.js +4 -2
  584. package/dist/server/src/lib/cli-tools/base.js +131 -10
  585. package/dist/server/src/lib/cli-tools/capture-spec.js +56 -0
  586. package/dist/server/src/lib/cli-tools/claude.js +1 -1
  587. package/dist/server/src/lib/cli-tools/codex.js +6 -2
  588. package/dist/server/src/lib/cli-tools/composer-spec.js +96 -0
  589. package/dist/server/src/lib/cli-tools/copilot-executable.js +155 -0
  590. package/dist/server/src/lib/cli-tools/copilot.js +307 -81
  591. package/dist/server/src/lib/cli-tools/gemini.js +8 -6
  592. package/dist/server/src/lib/cli-tools/graceful-exit.js +181 -0
  593. package/dist/server/src/lib/cli-tools/index.js +11 -1
  594. package/dist/server/src/lib/cli-tools/manager.js +56 -4
  595. package/dist/server/src/lib/cli-tools/opencode-config.js +195 -24
  596. package/dist/server/src/lib/cli-tools/opencode.js +233 -30
  597. package/dist/server/src/lib/cli-tools/session-name.js +57 -0
  598. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +213 -30
  599. package/dist/server/src/lib/cli-tools/types.js +41 -0
  600. package/dist/server/src/lib/cli-tools/vibe-local.js +7 -3
  601. package/dist/server/src/lib/cmate-cli-tool-parser.js +29 -1
  602. package/dist/server/src/lib/cmate-parser.js +12 -4
  603. package/dist/server/src/lib/db/db.js +5 -1
  604. package/dist/server/src/lib/db/migrations/v41-push-subscriptions.js +11 -0
  605. package/dist/server/src/lib/db/push-subscriptions-db.js +60 -3
  606. package/dist/server/src/lib/detection/ansi.js +3 -2
  607. package/dist/server/src/lib/detection/cli-patterns.js +901 -67
  608. package/dist/server/src/lib/detection/composer-text.js +455 -0
  609. package/dist/server/src/lib/detection/idle-evidence-observation.js +51 -0
  610. package/dist/server/src/lib/detection/model-info-extractor.js +195 -4
  611. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +19 -0
  612. package/dist/server/src/lib/detection/status-detector.js +76 -675
  613. package/dist/server/src/lib/detection/status-reason.js +57 -0
  614. package/dist/server/src/lib/detection/tools/antigravity/detect.js +75 -0
  615. package/dist/server/src/lib/detection/tools/claude/detect.js +144 -0
  616. package/dist/server/src/lib/detection/tools/claude/patterns.js +98 -0
  617. package/dist/server/src/lib/detection/tools/claude/prompt.js +124 -0
  618. package/dist/server/src/lib/detection/tools/codex/detect.js +343 -0
  619. package/dist/server/src/lib/detection/tools/codex/prompt.js +104 -0
  620. package/dist/server/src/lib/detection/tools/copilot/detect.js +185 -0
  621. package/dist/server/src/lib/detection/tools/copilot/prompt.js +89 -0
  622. package/dist/server/src/lib/detection/tools/dialog-block.js +159 -0
  623. package/dist/server/src/lib/detection/tools/frame.js +47 -0
  624. package/dist/server/src/lib/detection/tools/opencode/detect.js +242 -0
  625. package/dist/server/src/lib/detection/tools/opencode/prompt.js +85 -0
  626. package/dist/server/src/lib/detection/tools/registry.js +58 -0
  627. package/dist/server/src/lib/detection/tools/run-detection.js +202 -0
  628. package/dist/server/src/lib/detection/tools/types.js +34 -0
  629. package/dist/server/src/lib/detection/tools/verified-against.js +88 -0
  630. package/dist/server/src/lib/hooks/agent-event-types.js +19 -1
  631. package/dist/server/src/lib/hooks/permission-adjudication.js +160 -0
  632. package/dist/server/src/lib/hooks/permission-decision-service.js +81 -14
  633. package/dist/server/src/lib/hooks/permission-decision-state.js +62 -0
  634. package/dist/server/src/lib/hooks/permission-request-payload.js +18 -1
  635. package/dist/server/src/lib/hooks/sources/antigravity/source.js +10 -0
  636. package/dist/server/src/lib/hooks/sources/claude/source.js +20 -0
  637. package/dist/server/src/lib/hooks/sources/codex/source.js +10 -0
  638. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +403 -50
  639. package/dist/server/src/lib/hooks/sources/copilot/source.js +40 -4
  640. package/dist/server/src/lib/hooks/sources/define-source.js +23 -1
  641. package/dist/server/src/lib/hooks/sources/event-mapper.js +29 -1
  642. package/dist/server/src/lib/hooks/sources/gemini/source.js +10 -0
  643. package/dist/server/src/lib/hooks/sources/index.js +3 -1
  644. package/dist/server/src/lib/hooks/sources/launch-command.js +96 -1
  645. package/dist/server/src/lib/hooks/sources/legacy-relay.js +12 -0
  646. package/dist/server/src/lib/hooks/sources/opencode/client.js +295 -32
  647. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +120 -42
  648. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +95 -3
  649. package/dist/server/src/lib/hooks/sources/opencode/ports.js +70 -9
  650. package/dist/server/src/lib/hooks/sources/opencode/runtime.js +62 -4
  651. package/dist/server/src/lib/hooks/sources/opencode/source.js +54 -3
  652. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +254 -26
  653. package/dist/server/src/lib/hooks/sources/opencode/turn-gate.js +119 -4
  654. package/dist/server/src/lib/hooks/sources/pending-decisions.js +40 -2
  655. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +67 -0
  656. package/dist/server/src/lib/hooks/tool-input-normalization.js +157 -0
  657. package/dist/server/src/lib/job-executor.js +16 -4
  658. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +184 -0
  659. package/dist/server/src/lib/polling/response-checker.js +243 -26
  660. package/dist/server/src/lib/push/failure-episode-state.js +127 -0
  661. package/dist/server/src/lib/push/failure-push-notifier.js +344 -0
  662. package/dist/server/src/lib/push/index.js +35 -1
  663. package/dist/server/src/lib/push/prompt-card-state.js +93 -0
  664. package/dist/server/src/lib/push/prompt-push-gate.js +130 -0
  665. package/dist/server/src/lib/push/push-sender.js +82 -7
  666. package/dist/server/src/lib/push/resolution-push-notifier.js +193 -0
  667. package/dist/server/src/lib/push/waiting-push-notifier.js +42 -0
  668. package/dist/server/src/lib/response-cleaner.js +93 -20
  669. package/dist/server/src/lib/response-extractor.js +98 -5
  670. package/dist/server/src/lib/security/env-sanitizer.js +179 -5
  671. package/dist/server/src/lib/session/agent-event-state.js +1038 -189
  672. package/dist/server/src/lib/session/agent-session-lifecycle.js +8 -0
  673. package/dist/server/src/lib/session/claude-executor.js +23 -3
  674. package/dist/server/src/lib/session/claude-session.js +11 -1
  675. package/dist/server/src/lib/session/composer-clear.js +95 -0
  676. package/dist/server/src/lib/session/current-output-builder.js +267 -25
  677. package/dist/server/src/lib/session/provisional-turn.js +310 -0
  678. package/dist/server/src/lib/session/resolve-session-target.js +156 -0
  679. package/dist/server/src/lib/session/send-user-message.js +14 -18
  680. package/dist/server/src/lib/session/session-start-error.js +53 -1
  681. package/dist/server/src/lib/session/status-evidence.js +217 -0
  682. package/dist/server/src/lib/session/structured-prompt.js +46 -4
  683. package/dist/server/src/lib/session/waiting-episode-state.js +24 -0
  684. package/dist/server/src/lib/tmux/key-sequence.js +120 -0
  685. package/dist/server/src/lib/tmux/tmux.js +91 -19
  686. package/dist/server/src/lib/tui-accumulator.js +68 -1
  687. package/dist/server/src/lib/verification/gate-runner.js +84 -1
  688. package/dist/server/src/lib/ws-server.js +8 -5
  689. package/dist/server/src/types/cli-tool-contracts.js +75 -0
  690. package/dist/server/src/types/terminal-keys.js +37 -0
  691. package/dist/types/cli-tool-contracts.d.ts +235 -0
  692. package/dist/types/cli-tool-contracts.d.ts.map +1 -0
  693. package/dist/types/cli-tool-contracts.js +75 -0
  694. package/package.json +3 -2
  695. package/public/sw.js +65 -2
  696. package/.next/server/chunks/1841.js +0 -1
  697. package/.next/server/chunks/233.js +0 -1
  698. package/.next/server/chunks/3022.js +0 -1
  699. package/.next/server/chunks/3270.js +0 -1
  700. package/.next/server/chunks/4455.js +0 -1
  701. package/.next/server/chunks/5959.js +0 -27
  702. package/.next/server/chunks/7458.js +0 -6
  703. package/.next/server/chunks/8730.js +0 -1
  704. package/.next/server/chunks/9058.js +0 -1
  705. package/.next/server/chunks/9687.js +0 -3
  706. package/.next/static/chunks/3898-ef488bfa804507d9.js +0 -1
  707. package/.next/static/chunks/9263.f2034ec525abcf72.js +0 -1
  708. package/.next/static/chunks/app/api/app/update/route-fae89f8d4cc3ff97.js +0 -1
  709. package/.next/static/chunks/app/api/app/update-check/route-fae89f8d4cc3ff97.js +0 -1
  710. package/.next/static/chunks/app/api/assistant/conversation/route-fae89f8d4cc3ff97.js +0 -1
  711. package/.next/static/chunks/app/api/assistant/current-output/route-fae89f8d4cc3ff97.js +0 -1
  712. package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +0 -1
  713. package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +0 -1
  714. package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +0 -1
  715. package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +0 -1
  716. package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +0 -1
  717. package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +0 -1
  718. package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +0 -1
  719. package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +0 -1
  720. package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +0 -1
  721. package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +0 -1
  722. package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +0 -1
  723. package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +0 -1
  724. package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +0 -1
  725. package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +0 -1
  726. package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +0 -1
  727. package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +0 -1
  728. package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +0 -1
  729. package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +0 -1
  730. package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +0 -1
  731. package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +0 -1
  732. package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +0 -1
  733. package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +0 -1
  734. package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +0 -1
  735. package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +0 -1
  736. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
  737. package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
  738. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +0 -1
  739. package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +0 -1
  740. package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +0 -1
  741. package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +0 -1
  742. package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +0 -1
  743. package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +0 -1
  744. package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +0 -1
  745. package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +0 -1
  746. package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +0 -1
  747. package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +0 -1
  748. package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +0 -1
  749. package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +0 -1
  750. package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +0 -1
  751. package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +0 -1
  752. package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
  753. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +0 -1
  754. package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +0 -1
  755. package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +0 -1
  756. package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +0 -1
  757. package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +0 -1
  758. package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
  759. package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +0 -1
  760. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +0 -1
  761. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +0 -1
  762. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +0 -1
  763. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +0 -1
  764. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +0 -1
  765. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +0 -1
  766. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +0 -1
  767. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  768. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +0 -1
  769. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +0 -1
  770. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +0 -1
  771. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +0 -1
  772. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +0 -1
  773. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +0 -1
  774. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +0 -1
  775. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +0 -1
  776. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +0 -1
  777. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +0 -1
  778. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +0 -1
  779. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +0 -1
  780. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +0 -1
  781. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +0 -1
  782. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +0 -1
  783. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +0 -1
  784. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +0 -1
  785. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +0 -1
  786. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +0 -1
  787. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +0 -1
  788. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +0 -1
  789. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +0 -1
  790. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +0 -1
  791. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +0 -1
  792. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +0 -1
  793. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +0 -1
  794. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +0 -1
  795. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +0 -1
  796. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +0 -1
  797. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +0 -1
  798. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +0 -1
  799. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +0 -1
  800. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +0 -1
  801. package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +0 -1
  802. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +0 -1
  803. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +0 -1
  804. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +0 -1
  805. package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +0 -1
  806. package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +0 -1
  807. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +0 -1
  808. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +0 -1
  809. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +0 -1
  810. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +0 -1
  811. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +0 -1
  812. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +0 -1
  813. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +0 -1
  814. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +0 -1
  815. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +0 -1
  816. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +0 -1
  817. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +0 -1
  818. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +0 -1
  819. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +0 -1
  820. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +0 -1
  821. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +0 -1
  822. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +0 -1
  823. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +0 -1
  824. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  825. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +0 -1
  826. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  827. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +0 -1
  828. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +0 -1
  829. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +0 -1
  830. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +0 -1
  831. package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +0 -1
  832. package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +0 -1
  833. package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +0 -1
  834. package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +0 -1
  835. package/.next/static/chunks/app/worktrees/[id]/page-fdfca039b7f5837e.js +0 -1
  836. package/.next/static/css/e865c4979a41aa03.css +0 -1
  837. package/.next/static/wyFLOpmKpr45BHZ4svYpE/_buildManifest.js +0 -1
  838. /package/.next/static/{wyFLOpmKpr45BHZ4svYpE → t0BoV4H46ZgKmTjSi7GIz}/_ssgManifest.js +0 -0
@@ -38,16 +38,34 @@
38
38
  * behind (detonating on the next send). The decision is now three-valued —
39
39
  * submitted / pending / replaced — and a `replaced` verdict clears the input
40
40
  * line and THROWS instead of resending Enter (see classifySubmit).
41
+ *
42
+ * Issue #1880 closes the hole on the OTHER side of the send. Everything above
43
+ * verifies what happens after Enter; nothing looked at what was already in the
44
+ * composer before the body was typed. `sendKeys` injects the body as plain
45
+ * keystrokes at the TUI's CURRENT CURSOR POSITION, so residual text is spliced
46
+ * into the body instead of being replaced by it. #1878 measured four shapes of
47
+ * that damage: content mutation (`echo PREFILLED` + body), slash-command
48
+ * demotion (a `/cost` body typed after residual is no longer `/`-initial),
49
+ * order inversion when the cursor sat at column 0, and — worst — total loss of
50
+ * the body when the RESIDUAL started with `/` (`/costZZTOP…` is an
51
+ * `Unknown command`, so the message never reaches the model at all). All four
52
+ * reported `exit 0` / `Message sent.` / `sessionStatus: ready`, i.e. they were
53
+ * indistinguishable from a clean send by every signal a caller has. The
54
+ * composer is therefore emptied and read back BEFORE the body is typed — see
55
+ * {@link clearComposerBeforeSend}.
41
56
  */
42
57
  Object.defineProperty(exports, "__esModule", { value: true });
43
58
  exports.classifySubmit = classifySubmit;
44
59
  exports.isSubmitted = isSubmitted;
60
+ exports.clearComposerBeforeSend = clearComposerBeforeSend;
45
61
  exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
46
62
  const tmux_1 = require("../tmux/tmux");
47
63
  const tmux_capture_cache_1 = require("../tmux/tmux-capture-cache");
64
+ const composer_spec_1 = require("./composer-spec");
48
65
  const cli_patterns_1 = require("../detection/cli-patterns");
49
66
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
50
67
  const logger_1 = require("../../lib/logger");
68
+ const composer_clear_1 = require("../../lib/session/composer-clear");
51
69
  const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
52
70
  /**
53
71
  * Version-resilient pasted-text placeholder.
@@ -72,13 +90,77 @@ const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
72
90
  */
73
91
  const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
74
92
  /**
75
- * Prompt input-line markers across the supported TUIs.
93
+ * Prompt input-line markers across the marker-drawing TUIs.
76
94
  * claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
77
95
  * vibe-local: `ctx:N% ❯`. Leading whitespace is tolerated (tmux padding).
96
+ *
97
+ * Issue #1906 scopes this to the tools whose {@link ComposerSpec.reader} is
98
+ * `input-line-marker`. opencode draws no marker at all, so applying it there was
99
+ * wrong in both directions — see {@link readComposer}.
78
100
  */
79
101
  const INPUT_LINE_MARKER = /^\s*(?:ctx:\d+%\s*)?[>❯›]/;
80
- /** Lines of pane tail to inspect when verifying submit. */
102
+ /**
103
+ * Lines of pane tail to inspect for the "is the tool generating?" signal.
104
+ *
105
+ * Distinct from `ComposerSpec.verifyCaptureLines`, which sizes the tmux
106
+ * capture: the busy marker of every tool lives in a status bar pinned to the
107
+ * bottom of the pane, so it is read from a short tail even when the capture
108
+ * itself is opencode's whole 200-row frame. Widening it to that frame would
109
+ * match `esc interrupt` printed inside a reply.
110
+ */
81
111
  const VERIFY_WINDOW_LINES = 12;
112
+ /**
113
+ * Read the composer out of a captured frame.
114
+ *
115
+ * Two readers, because the two families of TUI say "this is the input line" in
116
+ * incompatible ways:
117
+ *
118
+ * - **marker tools** (`reader: 'input-line-marker'`) draw a `>` / `❯` / `›` at
119
+ * the start of the row. Scanned bottom-up over the tail window so a status bar
120
+ * below the box does not hide it.
121
+ * - **opencode** draws a box with a gutter and no marker anywhere. Its buffer
122
+ * rows are located structurally by {@link findOpenCodeComposerRows} (#1911's
123
+ * chrome walk), and `Ask anything...` inside that box is opencode's own way of
124
+ * saying the buffer is empty (#1883) rather than a row of text.
125
+ *
126
+ * Before this split, opencode went through the marker reader, which is wrong
127
+ * both ways round. It never matched opencode's composer, so EVERY opencode send
128
+ * was classified `submitted` without evidence — #1471's "the Enter was
129
+ * swallowed" recovery has never once run on opencode. And when a `>` did land in
130
+ * the window from somewhere else (a Markdown quote in a reply), the reader
131
+ * treated that row as the input line and answered from it.
132
+ *
133
+ * Issue #1933 turned "which reader" from a `cliToolId === 'opencode'` test plus
134
+ * a set membership test into {@link ComposerSpec.reader}, so the answer is one
135
+ * declaration the tool owns rather than two tables a new tool has to be added
136
+ * to. `unreadable` is the third arm, and it is the one #1906 found opencode
137
+ * silently occupying: it means every send is classified `submitted` without
138
+ * evidence, so it is a state to declare knowingly, never to fall into.
139
+ */
140
+ function readComposer(reader, lines, windowLines) {
141
+ if (reader === 'opencode-box') {
142
+ const rows = (0, cli_patterns_1.findOpenCodeComposerRows)(lines);
143
+ if (rows === null)
144
+ return { kind: 'absent' };
145
+ // The placeholder is painted only while the buffer is empty, and only
146
+ // inside the box — hence matched on the raw, still-guttered row (#1883).
147
+ if (rows.some((row) => cli_patterns_1.OPENCODE_IDLE_COMPOSER_PATTERN.test(row)))
148
+ return { kind: 'empty' };
149
+ const first = rows.map(cli_patterns_1.stripOpenCodeGutter).find((row) => row.length > 0);
150
+ if (first === undefined)
151
+ return { kind: 'empty' };
152
+ return { kind: 'text', text: first, rows };
153
+ }
154
+ if (reader !== 'input-line-marker')
155
+ return { kind: 'absent' };
156
+ const inputLine = findInputLine(windowLines);
157
+ if (inputLine === null)
158
+ return { kind: 'absent' };
159
+ const stripped = stripInputMarker(inputLine);
160
+ if (stripped.length === 0)
161
+ return { kind: 'empty' };
162
+ return { kind: 'text', text: stripped, rows: [inputLine] };
163
+ }
82
164
  /** Default bounded read-back attempts before giving up (throwing). */
83
165
  const DEFAULT_VERIFY_ATTEMPTS = 4;
84
166
  /**
@@ -136,47 +218,59 @@ function inputMatchesBody(strippedInput, message) {
136
218
  *
137
219
  * Version-independent by design — does NOT require the paste placeholder:
138
220
  * A. The tool is generating a response -> submitted.
139
- * B. No input line, or the input line is empty -> submitted.
140
- * C. A paste placeholder is folded on the input line -> pending (Enter eaten).
141
- * D. The body is still verbatim on the input line -> pending (resend Enter).
142
- * E. A DIFFERENT slash command is on the input line -> replaced (TUI popup
221
+ * B. No composer, or the composer is empty -> submitted.
222
+ * C. A paste placeholder is folded in the composer -> pending (Enter eaten).
223
+ * D. The body is still verbatim in the composer -> pending (resend Enter).
224
+ * E. A DIFFERENT slash command is in the composer -> replaced (TUI popup
143
225
  * autocompleted the command; clear the line and throw, never resend Enter).
144
226
  * F. Any other non-empty text (idle placeholder/hint) -> submitted (unchanged
145
227
  * pre-#1501 permissive default, so normal sends never spuriously fail).
146
228
  *
147
- * C–F are scoped to the input line only, so the user-message echo that a TUI
229
+ * C–F are scoped to the composer only, so the user-message echo that a TUI
148
230
  * prints into its history above the prompt never causes a false verdict.
231
+ *
232
+ * Issue #1906: "the composer" is read per tool by {@link readComposer} rather
233
+ * than by looking for a `>` in the last twelve rows. For opencode — which draws
234
+ * no marker — that read was unreachable, so every send reached F (in fact B) and
235
+ * this function has never returned anything but `submitted` for it.
236
+ *
237
+ * @param output - Captured pane, ANSI intact. For opencode this must be the
238
+ * whole pane; {@link ComposerSpec.verifyCaptureLines} is what asks tmux for it.
239
+ * @param cliToolId - CLI tool id, for the "generating" detector
240
+ * @param message - The body that was typed
241
+ * @param composer - The tool's composer description (Issue #1933). Defaults to
242
+ * the tool's own, so every existing three-argument caller is unchanged.
149
243
  */
150
- function classifySubmit(output, cliToolId, message) {
244
+ function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
151
245
  const clean = (0, cli_patterns_1.stripAnsi)(output);
152
- const windowLines = clean.split('\n').slice(-VERIFY_WINDOW_LINES);
246
+ const lines = clean.split('\n');
247
+ const windowLines = lines.slice(-VERIFY_WINDOW_LINES);
153
248
  const windowStr = windowLines.join('\n');
154
- // A. Actively generating a response => the message was accepted.
249
+ // A. Actively generating a response => the message was accepted. Read from the
250
+ // tail window for every tool: each one's busy marker lives in a status bar
251
+ // pinned to the bottom of the pane, and widening it to opencode's whole
252
+ // frame would match `esc interrupt` printed inside a reply.
155
253
  if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
156
254
  return 'submitted';
157
255
  }
158
- const inputLine = findInputLine(windowLines);
159
- // B. No input line visible => the prompt scrolled off / moved on => submitted.
160
- if (!inputLine) {
161
- return 'submitted';
162
- }
163
- const strippedInput = stripInputMarker(inputLine);
164
- // B. Empty input line => the message left the box => submitted.
165
- if (strippedInput.length === 0) {
256
+ const composer = readComposer(composerSpec.reader, lines, windowLines);
257
+ // B. No composer visible (scrolled off / dialog / still starting), or the
258
+ // composer is empty => the message left the box => submitted.
259
+ if (composer.kind !== 'text') {
166
260
  return 'submitted';
167
261
  }
168
- // C. A paste placeholder is still folded on the input line => body is there.
169
- if (PASTE_PLACEHOLDER_PATTERN.test(inputLine)) {
262
+ // C. A paste placeholder is still folded into the composer => body is there.
263
+ if (composer.rows.some((row) => PASTE_PLACEHOLDER_PATTERN.test(row))) {
170
264
  return 'pending';
171
265
  }
172
- // D. The typed body is still sitting on the input line => resend Enter.
173
- if (inputMatchesBody(strippedInput, message)) {
266
+ // D. The typed body is still sitting in the composer => resend Enter.
267
+ if (inputMatchesBody(composer.text, message)) {
174
268
  return 'pending';
175
269
  }
176
- // E. A different slash command is on the input line => a completion popup
270
+ // E. A different slash command is in the composer => a completion popup
177
271
  // replaced what we typed. (Scoped to `/…` so idle-prompt placeholders that
178
272
  // some TUIs paint on an empty composer are never mistaken for this.)
179
- if (REPLACEMENT_COMMAND_PATTERN.test(strippedInput)) {
273
+ if (REPLACEMENT_COMMAND_PATTERN.test(composer.text)) {
180
274
  return 'replaced';
181
275
  }
182
276
  // F. Non-empty, non-command steady-state text (idle placeholder / hint) =>
@@ -187,8 +281,84 @@ function classifySubmit(output, cliToolId, message) {
187
281
  * Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
188
282
  * A `replaced` verdict is NOT "submitted", so this returns false for it too.
189
283
  */
190
- function isSubmitted(output, cliToolId, message) {
191
- return classifySubmit(output, cliToolId, message) === 'submitted';
284
+ function isSubmitted(output, cliToolId, message, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
285
+ return classifySubmit(output, cliToolId, message, composerSpec) === 'submitted';
286
+ }
287
+ /**
288
+ * Empty the composer before the body is typed into it (Issue #1880).
289
+ *
290
+ * Delegates the how to {@link clearComposer} (#1879), which already sends
291
+ * `C-e`+`C-u` — the `C-e` is what makes a column-0 cursor clearable — in a
292
+ * read-back-verified loop, so a multi-row residual is not left half-eaten and
293
+ * claude's dim ghost suggestions do not spin it to its cap. This function is the
294
+ * policy layer on top: which tools take part, and which outcomes are failures.
295
+ *
296
+ * Exactly one outcome is a failure: **a participating tool still reporting
297
+ * `content` after the pass cap**. That is a composer this code demonstrably
298
+ * could not empty, so typing into it would splice the body into whatever is
299
+ * there and then report success — the defect #1880 exists to remove. Everything
300
+ * else proceeds:
301
+ *
302
+ * - `unsupported_tool` — never reached (a tool only enters this path when
303
+ * its `ComposerSpec.clearBeforeSend` is true),
304
+ * but it means "this layer cannot read that box", not "the box is dirty".
305
+ * - `no_composer` — the input box is not on screen (a full-screen dialog, a
306
+ * pager, a session still starting). Nothing was inspected and nothing was
307
+ * sent; refusing here would invent a second way for sends to stall, on a
308
+ * frame that carries no evidence of residual text. On codex this is also the
309
+ * verdict for every dialog frame, which is what keeps a `C-e`+`C-u` volley
310
+ * off an approval screen (Issue #1890).
311
+ * - `empty` / `ghost` — verified clean, with or without passes.
312
+ *
313
+ * A throw from {@link clearComposer} itself is a tmux failure (`capture-pane` or
314
+ * `send-keys` returned non-zero) and is deliberately NOT caught: the very next
315
+ * thing this module does is drive the same tmux binary against the same session,
316
+ * and swallowing it would mean typing into a composer whose contents are
317
+ * unknown while still reporting success.
318
+ *
319
+ * Which tools take part is {@link ComposerSpec.clearBeforeSend} since Issue
320
+ * #1933. The gate is `extractComposerText`'s reach, not a preference: it
321
+ * short-circuits every unmeasured tool to `unsupported_tool`, so for
322
+ * gemini/copilot/opencode/vibe-local/antigravity {@link clearComposer} can never
323
+ * observe an empty box and always returns `cleared: false`. Reading that as "the
324
+ * clear failed" and refusing to send would take every one of those tools offline
325
+ * while claude kept working and the unit tests stayed green — so those tools do
326
+ * not enter the clear path at all: no read-back capture, no `C-e`+`C-u`, no new
327
+ * failure mode. Byte-for-byte the pre-#1880 send. codex joined in #1890, and the
328
+ * fix there was to measure codex's input box, not to relax the gate: adding the
329
+ * next tool means a live 200x1000 capture of its box, its idle placeholder and
330
+ * its dialogs, pinned as fixtures.
331
+ *
332
+ * @throws Error when the composer still holds text after the pass cap.
333
+ */
334
+ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0, composer_spec_1.resolveComposerSpec)(cliToolId)) {
335
+ if (!composerSpec.clearBeforeSend)
336
+ return;
337
+ const result = await (0, composer_clear_1.clearComposer)(sessionName, cliToolId);
338
+ if (result.state === 'content') {
339
+ logger.error('pre-send-composer-clear-failed', {
340
+ sessionName,
341
+ cliToolId,
342
+ passes: result.passes,
343
+ remainingLength: result.remainingText.length,
344
+ remainingText: result.remainingText,
345
+ });
346
+ throw new Error(`Composer for session ${sessionName} still holds unsent text after ${result.passes} clear passes; ` +
347
+ 'refusing to type the message, which would be concatenated with it (Issue #1880).');
348
+ }
349
+ if (result.passes > 0) {
350
+ // The only record of what was thrown away. `remainingText` is the FINAL
351
+ // read and is empty on this path by definition, which is why clearComposer
352
+ // reports `discardedText` separately.
353
+ logger.warn('pre-send-composer-cleared', {
354
+ sessionName,
355
+ cliToolId,
356
+ passes: result.passes,
357
+ state: result.state,
358
+ discardedLength: result.discardedText.length,
359
+ discardedText: result.discardedText,
360
+ });
361
+ }
192
362
  }
193
363
  /**
194
364
  * Type a message body and submit it, then verify the submit actually happened.
@@ -203,9 +373,22 @@ function isSubmitted(output, cliToolId, message) {
203
373
  * @throws Error when submit cannot be confirmed within the bounded attempts.
204
374
  */
205
375
  async function sendMessageWithSubmitVerification(params) {
206
- const { sessionName, message, cliToolId, textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, submitEnterCount = 1, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, } = params;
376
+ const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, } = params;
377
+ const submitEnterCount = params.submitEnterCount ?? composer.submitEnterCount;
378
+ // 0. Empty the composer first (Issue #1880). The body below is typed at the
379
+ // TUI's current cursor position, so anything already in the box would be
380
+ // spliced into it. Throws for a claude composer that could not be emptied.
381
+ await clearComposerBeforeSend(sessionName, cliToolId, composer);
207
382
  // 1. Type the body only — never send Enter in the same tmux command.
208
- await (0, tmux_1.sendKeys)(sessionName, message, false);
383
+ //
384
+ // `{ literal: true }` is Issue #1933 受入条件 S9 and it is not decoration.
385
+ // `tmux send-keys` resolves its argument against the key table first, so
386
+ // until this flag existed a message body of exactly `Escape` interrupted
387
+ // the agent (`1b`), `Enter` submitted an empty composer (`0d`) and `C-c`
388
+ // sent SIGINT — and a body starting with `-` was eaten by getopt and sent
389
+ // nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
390
+ // built in `lib/tmux/key-sequence.ts`, which carries the table.
391
+ await (0, tmux_1.sendKeys)(sessionName, message, false, { literal: true });
209
392
  // 2. Let the TUI register the input before pressing Enter.
210
393
  await new Promise((resolve) => setTimeout(resolve, textInputWaitMs));
211
394
  // 3. Submit as a separate command (double Enter for vibe-local's IME mode).
@@ -220,8 +403,8 @@ async function sendMessageWithSubmitVerification(params) {
220
403
  const attempts = Math.max(1, verifyAttempts);
221
404
  for (let attempt = 0; attempt < attempts; attempt++) {
222
405
  await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
223
- const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -VERIFY_WINDOW_LINES });
224
- const state = classifySubmit(output, cliToolId, message);
406
+ const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
407
+ const state = classifySubmit(output, cliToolId, message, composer);
225
408
  if (state === 'submitted') {
226
409
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
227
410
  return;
@@ -5,6 +5,7 @@
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.OLLAMA_MODEL_PATTERN = exports.VIBE_LOCAL_CONTEXT_WINDOW_MAX = exports.VIBE_LOCAL_CONTEXT_WINDOW_MIN = exports.CLI_TOOL_DISPLAY_NAMES = exports.MAX_INSTANCE_ID_LENGTH = exports.INSTANCE_ID_PATTERN = exports.MAX_AGENT_ALIAS_LENGTH = exports.MAX_AGENT_INSTANCES = exports.CLI_TOOL_IDS = void 0;
7
7
  exports.usesAlternateScreen = usesAlternateScreen;
8
+ exports.capturedLineCountIsCursor = capturedLineCountIsCursor;
8
9
  exports.isValidInstanceId = isValidInstanceId;
9
10
  exports.getPrimaryInstanceId = getPrimaryInstanceId;
10
11
  exports.isPrimaryInstance = isPrimaryInstance;
@@ -54,6 +55,46 @@ const ALTERNATE_SCREEN_CLI_TOOLS = new Set([
54
55
  function usesAlternateScreen(cliToolId) {
55
56
  return ALTERNATE_SCREEN_CLI_TOOLS.has(cliToolId);
56
57
  }
58
+ /**
59
+ * Whether a stored `last_captured_line` still indexes into THIS capture, i.e.
60
+ * whether it may be used as a "how far have I read" cursor (Issue #1910).
61
+ *
62
+ * Two independent things pin a captured line count so it stops growing with the
63
+ * transcript, and a caller that slices at the stored cursor has to survive both:
64
+ *
65
+ * - **the tool renders in the alternate screen** ({@link usesAlternateScreen}):
66
+ * tmux keeps no scrollback, every capture returns exactly `pane_height` rows,
67
+ * and the count is pinned there from the very first frame (Issue #1268);
68
+ * - **the capture window saturated** (`isCaptureWindowSaturated` in
69
+ * `lib/tmux/tmux-capture-cache.ts`): the pane outgrew the sliding window the
70
+ * capture is taken through, so the count is pinned at the window size and the
71
+ * window merely slides (Issue #1670).
72
+ *
73
+ * Either one makes a previously stored index denote a different line — or no
74
+ * line at all — so `lines.slice(cursor)` silently yields nothing. That is
75
+ * Issue #1910: `commandmate capture <id>` printed a single empty byte for every
76
+ * alternate-screen session that had taken one turn, because the poller had
77
+ * stored the pane height (1000 on copilot / claude, 200 on opencode) and the
78
+ * next frame is exactly that many rows.
79
+ *
80
+ * A caller that reads `false` must fall back to the WHOLE capture: repeating
81
+ * rows the reader has already seen is harmless, dropping new output is not.
82
+ *
83
+ * The two conditions are stated together here rather than at each call site
84
+ * because they are one rule — "is the count a cursor?" — reached from two
85
+ * sides, and #1670 fixed only the second one in
86
+ * `src/lib/session/current-output-builder.ts` while `src/lib/polling/
87
+ * response-checker.ts` (which spells the same expression inline as
88
+ * `lineCountIsCursor`) already had both. Folding that second copy in here is
89
+ * left to the next change that touches the poller.
90
+ *
91
+ * @param cliToolId - CLI tool the capture came from
92
+ * @param captureWindowSaturated - Whether this capture came back clipped by the window
93
+ * @returns True when the stored line count is still a usable cursor
94
+ */
95
+ function capturedLineCountIsCursor(cliToolId, captureWindowSaturated) {
96
+ return !usesAlternateScreen(cliToolId) && !captureWindowSaturated;
97
+ }
57
98
  // ============================================================================
58
99
  // Agent Instances (Issue #868: multi-session foundation)
59
100
  // ============================================================================
@@ -19,6 +19,7 @@ const db_instance_1 = require("../db/db-instance");
19
19
  const db_1 = require("../db");
20
20
  const logger_1 = require("../../lib/logger");
21
21
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
22
+ const session_start_error_1 = require("../session/session-start-error");
22
23
  const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
23
24
  /**
24
25
  * Extract error message from unknown error type (DRY)
@@ -53,10 +54,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
53
54
  * @param worktreeId - Worktree ID
54
55
  * @param worktreePath - Worktree path
55
56
  */
56
- async startSession(worktreeId, worktreePath, instanceId) {
57
+ async launchSession(worktreeId, worktreePath, instanceId) {
57
58
  const vibeLocalAvailable = await this.isInstalled();
58
59
  if (!vibeLocalAvailable) {
59
- throw new Error('vibe-local is not installed or not in PATH');
60
+ throw new session_start_error_1.SessionStartUnavailableError(this.name, 'vibe-local is not installed or not in PATH');
60
61
  }
61
62
  const sessionName = this.getSessionName(worktreeId, instanceId);
62
63
  const exists = await (0, tmux_1.hasSession)(sessionName);
@@ -129,7 +130,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
129
130
  sessionName,
130
131
  message,
131
132
  cliToolId: 'vibe-local',
132
- submitEnterCount: 2,
133
+ // Issue #1933: the double Enter is `ComposerSpec.submitEnterCount`, so
134
+ // the IME quirk is declared once on the tool rather than re-passed by
135
+ // the one call site that knew about it.
136
+ composer: this.describeComposer(),
133
137
  interEnterWaitMs: cli_tool_timing_config_1.VIBE_LOCAL_DOUBLE_ENTER_WAIT_MS,
134
138
  });
135
139
  // Issue #405: Invalidate cache after sending message
@@ -29,8 +29,24 @@ const antigravity_constants_1 = require("../config/antigravity-constants");
29
29
  * This Set controls which tools accept the --model option in the CMATE.md schedule table.
30
30
  * vibe-local model is managed via DB (worktree.vibe_local_model), not CMATE.md.
31
31
  * To add CMATE.md --model support for a new tool, add it here (DR1-006).
32
+ *
33
+ * ## `opencode` (Issue #1914)
34
+ *
35
+ * `claude-executor.ts` has carried an `opencode run -m <model>` branch since
36
+ * Issue #379, and it had never once executed: the only caller that supplies a
37
+ * model for a schedule is `job-executor.resolveModelOption()`, which answered
38
+ * `undefined` for every tool but copilot and vibe-local, and the other reachable
39
+ * caller (`daily-summary-generator`) is gated by `SUMMARY_ALLOWED_TOOLS`, which
40
+ * has no opencode either. Adding the id here is one half of making that branch
41
+ * reachable; `resolveModelOption()` reads this Set for the other half, so the
42
+ * two cannot drift apart again.
43
+ *
44
+ * The value is passed through **verbatim** as `provider/model`, which is the
45
+ * format `opencode run --help` documents for `-m, --model` (measured on
46
+ * opencode 1.18.21). It is not prefixed with `ollama/` — see
47
+ * `buildCliArgs()` for why that prefix went away.
32
48
  */
33
- exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot']);
49
+ exports.TOOLS_WITH_MODEL_SUPPORT = new Set(['copilot', 'opencode']);
34
50
  // =============================================================================
35
51
  // Parse Functions
36
52
  // =============================================================================
@@ -78,6 +94,18 @@ function parseCliToolColumn(raw) {
78
94
  * Validate a Copilot model name using the reject approach (no sanitization).
79
95
  * Shared between send API, CLI send, parser, and validator (DR1-003).
80
96
  *
97
+ * Issue #1914: this is also what validates an **opencode** `provider/model`
98
+ * value, and the pattern already fits — `MODEL_NAME_PATTERN` allows `/` and `:`
99
+ * and requires a leading alphanumeric, so `ollama/qwen3:8b` and
100
+ * `anthropic/claude-sonnet-4-5` pass while a leading `-` (the CLI-option
101
+ * injection case DR4-001 is about) does not. The name is kept because the export
102
+ * is reached from the send API and `commandmate send`, which are outside this
103
+ * Issue's scope; what is deliberately **not** added is a `provider/model` shape
104
+ * requirement. Two probes against opencode 1.18.21 in an isolated `HOME` — one
105
+ * with `-m totallynotaprovider/some-model`, one with `-m barewordmodel` — both
106
+ * exited 1 with the same opaque `UnknownError`, so the CLI gives no signal that
107
+ * would let this layer reject a bare name without guessing.
108
+ *
81
109
  * @param modelName - Model name to validate
82
110
  * @returns Validation result with optional reason for rejection
83
111
  */
@@ -209,6 +209,9 @@ function parseSchedulesSection(rows) {
209
209
  // Validate permission against allowed values
210
210
  let allowedValues;
211
211
  switch (resolvedCliToolId) {
212
+ case 'claude':
213
+ allowedValues = schedule_config_1.CLAUDE_PERMISSIONS;
214
+ break;
212
215
  case 'codex':
213
216
  allowedValues = schedule_config_1.CODEX_SANDBOXES;
214
217
  break;
@@ -220,16 +223,21 @@ function parseSchedulesSection(rows) {
220
223
  break;
221
224
  case 'gemini':
222
225
  case 'vibe-local':
223
- // No permission flags for gemini/vibe-local; only empty string is valid
226
+ case 'opencode':
227
+ // Issue #1914: `default` sits with the no-flag tools, not with claude.
228
+ // It used to resolve to CLAUDE_PERMISSIONS, so `opencode` -- which has no
229
+ // permission flag at all -- accepted `acceptEdits`/`bypassPermissions`
230
+ // and handed them to a CLI that has no such option. A tool added to
231
+ // CLI_TOOL_IDS without its own case above now inherits "no permission
232
+ // flags" instead of Claude's --permission-mode vocabulary.
233
+ default:
234
+ // No permission flags for these tools; only empty string is valid
224
235
  allowedValues = [];
225
236
  if (permission) {
226
237
  logger.warn('parse:permission-ignored', { name: sanitizedName, cliToolId: resolvedCliToolId, permission });
227
238
  permission = '';
228
239
  }
229
240
  break;
230
- default:
231
- allowedValues = schedule_config_1.CLAUDE_PERMISSIONS;
232
- break;
233
241
  }
234
242
  if (allowedValues.length > 0 && permission && !allowedValues.includes(permission)) {
235
243
  logger.warn('parse:invalid-permission', { name: sanitizedName, cliToolId: resolvedCliToolId, permission, defaultPermission });
@@ -12,7 +12,7 @@
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.setInProgressMessageId = exports.updateSessionState = exports.getSessionState = exports.getMessagesByDateRange = exports.ACTIVE_FILTER = exports.recordAnsweredPrompt = exports.markPendingPromptsAsAnswered = exports.updatePromptData = exports.getMessageById = exports.recomputeLastUserMessage = exports.clearLastUserMessage = exports.updateLastUserMessage = exports.deleteMessagesByInstance = exports.deleteMessagesByCliTool = exports.deleteMessageById = exports.deleteAllMessages = exports.getLastMessage = exports.getLastUserMessage = exports.getMessages = exports.updateMessageContent = exports.createMessage = exports.getLastAssistantMessageAt = exports.getAliasedWorktreeIds = exports.getAllWorktreeAliases = exports.getWorktreeAliases = exports.resolveWorktreeIdWithAlias = exports.recordWorktreeAlias = exports.deleteWorktreesByIds = exports.deleteRepositoryWorktrees = exports.migrateWorktreeIdPreservingChildren = exports.getAllWorktreePathIds = exports.getAllWorktreeIds = exports.getWorktreesByRepository = exports.getWorktreeIdsByRepository = exports.getInitialBranch = exports.saveInitialBranch = exports.updateVibeLocalContextWindow = exports.updateVibeLocalModel = exports.updateSelectedAgents = exports.updateCliToolId = exports.updateStatus = exports.updateFavorite = exports.updateLastViewedAt = exports.updateWorktreeLink = exports.updateWorktreeDescription = exports.upsertWorktree = exports.getWorktreeById = exports.getRepositories = exports.getWorktrees = exports.initDatabase = void 0;
14
14
  exports.createAssistantMessage = exports.updateAssistantConversation = exports.createAssistantConversation = exports.getAssistantConversationByRepositoryAndCliTool = exports.getAssistantConversationById = exports.updateDailyReportContent = exports.saveDailyReport = exports.getDailyReport = exports.recoverStuckSendingTimers = exports.clearTimerHistory = exports.cleanupOldTimers = exports.getPendingTimerCountByWorktree = exports.cancelTimersByWorktree = exports.cancelTimer = exports.updateTimerStatus = exports.getPendingTimers = exports.getTimerById = exports.getTimersByWorktree = exports.createTimer = exports.WORKTREE_TODO_STATUSES = exports.isWorktreeTodoStatus = exports.reorderWorktreeTodos = exports.deleteWorktreeTodo = exports.updateWorktreeTodo = exports.createWorktreeTodo = exports.getWorktreeTodoById = exports.getTodosByWorktreeId = exports.deleteTodo = exports.updateTodo = exports.createTodo = exports.getTodoById = exports.getAllTodos = exports.getTodosByRepositoryId = exports.MemoDbError = exports.reorderMemos = exports.deleteMemo = exports.updateMemo = exports.createMemo = exports.getMemoById = exports.getMemosByWorktreeId = exports.InvalidAgentInstanceError = exports.AgentInstanceLimitError = exports.removeAgentInstance = exports.addAgentInstance = exports.setAgentInstances = exports.countAgentInstances = exports.getAgentInstance = exports.getAgentInstances = exports.deleteSessionState = exports.clearInProgressMessageId = void 0;
15
- exports.listTaskEvents = exports.ACTIVE_TASK_STATUSES = exports.TERMINAL_TASK_STATUSES = exports.TASK_STATUSES = exports.isTerminalTaskStatus = exports.getActiveTaskForInstance = exports.getActiveTask = exports.listTasks = exports.getTask = exports.createTask = exports.VERIFICATION_GATE_SOURCES = exports.VERIFICATION_TRIGGERS = exports.MAX_RUN_HISTORY_DAYS = exports.MAX_RUN_HISTORY_LIMIT = exports.DEFAULT_RUN_HISTORY_LIMIT = exports.listVerificationRunsForPeriod = exports.listRunningVerificationRuns = exports.getRunningVerificationRun = exports.listVerificationRuns = exports.getVerificationRun = exports.finishGateResult = exports.createGateResult = exports.finishVerificationRun = exports.createVerificationRun = exports.deletePushSubscriptionByEndpoint = exports.updatePushSubscriptionPreferences = exports.getPushSubscriptionsForKind = exports.getAllPushSubscriptions = exports.getPushSubscriptionByEndpoint = exports.upsertPushSubscription = exports.deleteAssistantSessionState = exports.updateAssistantSessionState = exports.getAssistantSessionState = exports.listRunningAssistantExecutions = exports.getRunningAssistantExecutionByConversation = exports.getLatestAssistantExecutionByConversation = exports.getAssistantExecutionById = exports.updateAssistantExecution = exports.createAssistantExecution = exports.archiveAssistantMessagesFrom = exports.archiveAllAssistantMessages = exports.getAssistantMessageById = exports.getAssistantMessages = exports.updateAssistantMessageStatus = void 0;
15
+ exports.listTaskEvents = exports.ACTIVE_TASK_STATUSES = exports.TERMINAL_TASK_STATUSES = exports.TASK_STATUSES = exports.isTerminalTaskStatus = exports.getActiveTaskForInstance = exports.getActiveTask = exports.listTasks = exports.getTask = exports.createTask = exports.VERIFICATION_GATE_SOURCES = exports.VERIFICATION_TRIGGERS = exports.MAX_RUN_HISTORY_DAYS = exports.MAX_RUN_HISTORY_LIMIT = exports.DEFAULT_RUN_HISTORY_LIMIT = exports.listVerificationRunsForPeriod = exports.listRunningVerificationRuns = exports.getRunningVerificationRun = exports.listVerificationRuns = exports.getVerificationRun = exports.finishGateResult = exports.createGateResult = exports.finishVerificationRun = exports.createVerificationRun = exports.NEW_SUBSCRIPTION_DEFAULTS = exports.deletePushSubscriptionByEndpoint = exports.updatePushSubscriptionPreferences = exports.countPushSubscriptionsForKind = exports.getPushSubscriptionsForKind = exports.getAllPushSubscriptions = exports.getPushSubscriptionByEndpoint = exports.upsertPushSubscription = exports.deleteAssistantSessionState = exports.updateAssistantSessionState = exports.getAssistantSessionState = exports.listRunningAssistantExecutions = exports.getRunningAssistantExecutionByConversation = exports.getLatestAssistantExecutionByConversation = exports.getAssistantExecutionById = exports.updateAssistantExecution = exports.createAssistantExecution = exports.archiveAssistantMessagesFrom = exports.archiveAllAssistantMessages = exports.getAssistantMessageById = exports.getAssistantMessages = exports.updateAssistantMessageStatus = void 0;
16
16
  // init-db
17
17
  var init_db_1 = require("./init-db");
18
18
  Object.defineProperty(exports, "initDatabase", { enumerable: true, get: function () { return init_db_1.initDatabase; } });
@@ -158,8 +158,12 @@ Object.defineProperty(exports, "upsertPushSubscription", { enumerable: true, get
158
158
  Object.defineProperty(exports, "getPushSubscriptionByEndpoint", { enumerable: true, get: function () { return push_subscriptions_db_1.getPushSubscriptionByEndpoint; } });
159
159
  Object.defineProperty(exports, "getAllPushSubscriptions", { enumerable: true, get: function () { return push_subscriptions_db_1.getAllPushSubscriptions; } });
160
160
  Object.defineProperty(exports, "getPushSubscriptionsForKind", { enumerable: true, get: function () { return push_subscriptions_db_1.getPushSubscriptionsForKind; } });
161
+ // Issue #2001: how many devices are in the acting bucket, without reading them.
162
+ Object.defineProperty(exports, "countPushSubscriptionsForKind", { enumerable: true, get: function () { return push_subscriptions_db_1.countPushSubscriptionsForKind; } });
161
163
  Object.defineProperty(exports, "updatePushSubscriptionPreferences", { enumerable: true, get: function () { return push_subscriptions_db_1.updatePushSubscriptionPreferences; } });
162
164
  Object.defineProperty(exports, "deletePushSubscriptionByEndpoint", { enumerable: true, get: function () { return push_subscriptions_db_1.deletePushSubscriptionByEndpoint; } });
165
+ // Issue #2000: the per-kind state a *new* subscription is created with.
166
+ Object.defineProperty(exports, "NEW_SUBSCRIPTION_DEFAULTS", { enumerable: true, get: function () { return push_subscriptions_db_1.NEW_SUBSCRIPTION_DEFAULTS; } });
163
167
  // verification-db (verification gate runs, Issue #1542)
164
168
  var verification_db_1 = require("./verification-db");
165
169
  Object.defineProperty(exports, "createVerificationRun", { enumerable: true, get: function () { return verification_db_1.createVerificationRun; } });
@@ -5,6 +5,17 @@
5
5
  * One row per browser push subscription (device). `endpoint` is the natural key
6
6
  * (unique) used for upsert and for 410-Gone auto-removal. Per-type toggles let a
7
7
  * device opt in/out of "prompt waiting" and "completion" notifications independently.
8
+ *
9
+ * Issue #2000 — do not read `enabled_completion DEFAULT 1` as the product default.
10
+ * `upsertPushSubscription()` is the only INSERT into this table and it binds both
11
+ * toggle columns explicitly, so neither DEFAULT is ever applied. The live default
12
+ * for a new subscription is `NEW_SUBSCRIPTION_DEFAULTS` in
13
+ * `src/lib/db/push-subscriptions-db.ts`, which #2000 set to
14
+ * `enabledCompletion: false`. The declaration is left at 1 on purpose: SQLite
15
+ * cannot ALTER a column default, so changing it means rebuilding the table and
16
+ * copying every row — real risk to live subscriptions, bought for a value nothing
17
+ * reads. Changing it would also NOT have moved existing rows, which is what the
18
+ * adjudication on #2000 required.
8
19
  */
9
20
  Object.defineProperty(exports, "__esModule", { value: true });
10
21
  exports.v41_migrations = void 0;
@@ -8,13 +8,54 @@
8
8
  * be logged — callers pass these straight through without logging.
9
9
  */
10
10
  Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.NEW_SUBSCRIPTION_DEFAULTS = void 0;
11
12
  exports.upsertPushSubscription = upsertPushSubscription;
12
13
  exports.getPushSubscriptionByEndpoint = getPushSubscriptionByEndpoint;
13
14
  exports.getAllPushSubscriptions = getAllPushSubscriptions;
14
15
  exports.getPushSubscriptionsForKind = getPushSubscriptionsForKind;
16
+ exports.countPushSubscriptionsForKind = countPushSubscriptionsForKind;
15
17
  exports.updatePushSubscriptionPreferences = updatePushSubscriptionPreferences;
16
18
  exports.deletePushSubscriptionByEndpoint = deletePushSubscriptionByEndpoint;
17
19
  const crypto_1 = require("crypto");
20
+ /**
21
+ * Which stored toggle governs each kind (Issue #2000).
22
+ *
23
+ * The table keeps two columns on purpose. The Issue's own proposal is two
24
+ * buckets — "you need to act" and "for information" — and a prompt waiting, a
25
+ * failed verification, an upstream fault and a session that could not start are
26
+ * all the first one. A third column would have to be migrated, surfaced in the
27
+ * UI and explained, to split a bucket nobody has asked to split. Written as an
28
+ * exhaustive Record so a new kind fails the type check here rather than
29
+ * silently landing in the completion bucket.
30
+ */
31
+ const KIND_COLUMN = {
32
+ prompt: 'enabled_prompt',
33
+ failure: 'enabled_prompt',
34
+ completion: 'enabled_completion',
35
+ };
36
+ /**
37
+ * Per-kind state a **newly created** subscription starts in (Issue #2000).
38
+ *
39
+ * `enabledCompletion: false` is the whole of the Issue's default change. It is
40
+ * applied here, in the INSERT, and NOT as a schema DEFAULT or a migration:
41
+ *
42
+ * - the INSERT below has always bound these two columns explicitly, so the
43
+ * `DEFAULT 1` v41 declares is dead code on this path (measured: it is the
44
+ * only INSERT into this table in `src/`);
45
+ * - existing rows must not move. Turning a live subscriber's completions off
46
+ * behind their back reads as "notifications broke", which is indistinguishable
47
+ * from a genuine fault. The adjudication on Issue #2000 is explicit: new
48
+ * subscriptions only, existing rows untouched.
49
+ *
50
+ * The `ON CONFLICT` clause below preserves per-type preferences, so a device
51
+ * that re-subscribes with the same endpoint keeps whatever it had — the new
52
+ * default reaches an existing reader only when their endpoint changes (another
53
+ * browser, another device, or a full unsubscribe/re-register).
54
+ */
55
+ exports.NEW_SUBSCRIPTION_DEFAULTS = {
56
+ enabledPrompt: true,
57
+ enabledCompletion: false,
58
+ };
18
59
  function mapRow(row) {
19
60
  return {
20
61
  id: row.id,
@@ -50,14 +91,14 @@ function upsertPushSubscription(db, input) {
50
91
  id, endpoint, p256dh, auth, device_label,
51
92
  enabled_prompt, enabled_completion, locale, created_at, updated_at
52
93
  )
53
- VALUES (?, ?, ?, ?, ?, 1, 1, ?, ?, ?)
94
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
54
95
  ON CONFLICT(endpoint) DO UPDATE SET
55
96
  p256dh = excluded.p256dh,
56
97
  auth = excluded.auth,
57
98
  device_label = excluded.device_label,
58
99
  locale = COALESCE(excluded.locale, push_subscriptions.locale),
59
100
  updated_at = excluded.updated_at
60
- `).run((0, crypto_1.randomUUID)(), input.endpoint, input.p256dh, input.auth, deviceLabel, locale, now, now);
101
+ `).run((0, crypto_1.randomUUID)(), input.endpoint, input.p256dh, input.auth, deviceLabel, exports.NEW_SUBSCRIPTION_DEFAULTS.enabledPrompt ? 1 : 0, exports.NEW_SUBSCRIPTION_DEFAULTS.enabledCompletion ? 1 : 0, locale, now, now);
61
102
  const record = getPushSubscriptionByEndpoint(db, input.endpoint);
62
103
  if (!record) {
63
104
  throw new Error('Failed to persist push subscription');
@@ -80,12 +121,28 @@ function getAllPushSubscriptions(db) {
80
121
  }
81
122
  /** Subscriptions that have opted into a given notification kind. */
82
123
  function getPushSubscriptionsForKind(db, kind) {
83
- const column = kind === 'prompt' ? 'enabled_prompt' : 'enabled_completion';
124
+ const column = KIND_COLUMN[kind];
84
125
  const rows = db
85
126
  .prepare(`SELECT ${SELECT_COLUMNS} FROM push_subscriptions WHERE ${column} = 1 ORDER BY created_at ASC`)
86
127
  .all();
87
128
  return rows.map(mapRow);
88
129
  }
130
+ /**
131
+ * How many subscriptions have opted into a given kind (Issue #2001).
132
+ *
133
+ * Separate from {@link getPushSubscriptionsForKind} because the cross-device
134
+ * dismissal asks a question about the *fleet*, not about the rows: "is there a
135
+ * second device that could still be holding a stale card?". Counting in SQL
136
+ * keeps that decision from materialising — and from logging the shape of — a
137
+ * table of endpoints and encryption keys it has no use for.
138
+ */
139
+ function countPushSubscriptionsForKind(db, kind) {
140
+ const column = KIND_COLUMN[kind];
141
+ const row = db
142
+ .prepare(`SELECT COUNT(*) AS total FROM push_subscriptions WHERE ${column} = 1`)
143
+ .get();
144
+ return row.total;
145
+ }
89
146
  /** Update per-type preferences for a subscription. Returns the updated record or null. */
90
147
  function updatePushSubscriptionPreferences(db, endpoint, prefs) {
91
148
  const assignments = ['updated_at = ?'];