commandmate 0.37.0 → 0.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +176 -176
  3. package/.next/app-path-routes-manifest.json +33 -33
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_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.nft.json +1 -1
  14. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  16. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/messages/route.js +1 -1
  18. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  19. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/session/route.js +1 -1
  21. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  22. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/assistant/start/route.js +1 -1
  24. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  25. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/assistant/terminal/route.js +1 -1
  27. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  28. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/capabilities/route.js +1 -1
  35. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/daily-summary/route.js +1 -1
  37. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  38. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  40. package/.next/server/app/api/daily-summary/status/route.js.nft.json +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_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  48. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  49. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  51. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  52. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  54. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  55. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/push/escalation/route.js +1 -1
  59. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  60. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/push/vapid/route.js +1 -1
  63. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  64. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  66. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  68. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/remote/pair/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_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  74. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/clone/route.js +1 -1
  77. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  78. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/restore/route.js +1 -1
  81. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/route.js +1 -1
  84. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/scan/route.js +1 -1
  87. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  88. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/repositories/sync/route.js +1 -1
  90. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  91. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  94. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  114. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  117. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  122. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  125. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +4 -3
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  157. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  159. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -6
  182. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -7
  188. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  225. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/route.js +1 -1
  231. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/sessions/page.js +1 -1
  243. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  245. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  248. package/.next/server/app/worktrees/[id]/page.js +11 -9
  249. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  250. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  251. package/.next/server/app-paths-manifest.json +33 -33
  252. package/.next/server/chunks/1467.js +1 -1
  253. package/.next/server/chunks/1707.js +1 -1
  254. package/.next/server/chunks/1886.js +2 -2
  255. package/.next/server/chunks/2119.js +1 -1
  256. package/.next/server/chunks/2445.js +1 -1
  257. package/.next/server/chunks/3480.js +1 -18
  258. package/.next/server/chunks/3730.js +1 -1
  259. package/.next/server/chunks/4207.js +5 -0
  260. package/.next/server/chunks/4443.js +1 -1
  261. package/.next/server/chunks/5164.js +1 -1
  262. package/.next/server/chunks/6130.js +1 -1
  263. package/.next/server/chunks/650.js +1 -1
  264. package/.next/server/chunks/6661.js +1 -1
  265. package/.next/server/chunks/6677.js +2 -2
  266. package/.next/server/chunks/6793.js +13 -0
  267. package/.next/server/chunks/7075.js +1 -1
  268. package/.next/server/chunks/8052.js +74 -0
  269. package/.next/server/chunks/8728.js +2 -2
  270. package/.next/server/chunks/9080.js +1 -1
  271. package/.next/server/middleware-manifest.json +5 -5
  272. package/.next/server/pages/500.html +1 -1
  273. package/.next/server/server-reference-manifest.json +1 -1
  274. package/.next/static/chunks/{2407-c4b1d2aae7e3f59b.js → 2407-be448eda70bc19b6.js} +1 -1
  275. package/.next/static/chunks/4388-a778968d9c4e9327.js +1 -0
  276. package/.next/static/chunks/4949-fa93029d6e05db0d.js +1 -0
  277. package/.next/static/chunks/998-292ebcd30f329eb1.js +1 -0
  278. package/.next/static/chunks/app/sessions/page-fe42c8f6fd59b9e7.js +1 -0
  279. package/.next/static/chunks/app/worktrees/[id]/page-1eb4297af22afac8.js +1 -0
  280. package/.next/static/css/ed092b853e52b5eb.css +1 -0
  281. package/.next/trace +14 -14
  282. package/dist/cli/commands/ls.d.ts +64 -0
  283. package/dist/cli/commands/ls.d.ts.map +1 -1
  284. package/dist/cli/commands/ls.js +238 -30
  285. package/dist/cli/commands/respond.d.ts.map +1 -1
  286. package/dist/cli/commands/respond.js +14 -0
  287. package/dist/cli/commands/status.d.ts.map +1 -1
  288. package/dist/cli/commands/status.js +154 -15
  289. package/dist/cli/docs/agent-operations.d.ts +1 -1
  290. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  291. package/dist/cli/docs/agent-operations.js +37 -1
  292. package/dist/cli/types/api-responses.d.ts.map +1 -1
  293. package/dist/cli/utils/server-url.d.ts +27 -0
  294. package/dist/cli/utils/server-url.d.ts.map +1 -1
  295. package/dist/cli/utils/server-url.js +48 -6
  296. package/dist/lib/cli-tools/types.d.ts +22 -1
  297. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  298. package/dist/lib/detection/tools/verified-against.d.ts +8 -0
  299. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  300. package/dist/lib/detection/tools/verified-against.js +8 -0
  301. package/dist/server/locales/en/worktree.json +23 -1
  302. package/dist/server/locales/ja/worktree.json +23 -1
  303. package/dist/server/src/lib/cli-tools/agent-mode-spec.js +327 -0
  304. package/dist/server/src/lib/cli-tools/base.js +22 -0
  305. package/dist/server/src/lib/cmate-parser.js +26 -6
  306. package/dist/server/src/lib/cmate-validator.js +354 -0
  307. package/dist/server/src/lib/detection/cli-patterns.js +40 -2
  308. package/dist/server/src/lib/detection/model-info-extractor.js +40 -3
  309. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +44 -0
  310. package/dist/server/src/lib/detection/tools/antigravity/detect.js +9 -0
  311. package/dist/server/src/lib/detection/tools/command-code/detect.js +14 -3
  312. package/dist/server/src/lib/detection/tools/command-code/permission.js +104 -0
  313. package/dist/server/src/lib/detection/tools/verified-against.js +8 -0
  314. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +20 -2
  315. package/dist/server/src/lib/prompt-answer-sender.js +339 -16
  316. package/dist/server/src/lib/session/claude-executor.js +190 -17
  317. package/dist/server/src/types/cli-tool-contracts.js +75 -1
  318. package/dist/types/cli-tool-contracts.d.ts +162 -0
  319. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  320. package/dist/types/cli-tool-contracts.js +75 -1
  321. package/package.json +1 -1
  322. package/.next/server/chunks/6337.js +0 -1
  323. package/.next/server/chunks/663.js +0 -79
  324. package/.next/static/chunks/4388-410b1d8ed0d8d98b.js +0 -1
  325. package/.next/static/chunks/4949-5b97d1eb769482d2.js +0 -1
  326. package/.next/static/chunks/998-ac0ded6d5eeb4dc0.js +0 -1
  327. package/.next/static/chunks/app/sessions/page-b8651c3f17c36800.js +0 -1
  328. package/.next/static/chunks/app/worktrees/[id]/page-f993ca88fe758599.js +0 -1
  329. package/.next/static/css/c511ecdf1e7f18a0.css +0 -1
  330. /package/.next/static/{0WNCXbrakAsDUEgDarN8N → DryXJ1-iHfWxfrHkkWVy8}/_buildManifest.js +0 -0
  331. /package/.next/static/{0WNCXbrakAsDUEgDarN8N → DryXJ1-iHfWxfrHkkWVy8}/_ssgManifest.js +0 -0
@@ -16,7 +16,8 @@
16
16
  "removeAttachment": "添付を削除",
17
17
  "showSlashCommands": "スラッシュコマンドを表示",
18
18
  "attachImage": "画像を添付",
19
- "sendMessage": "メッセージを送信"
19
+ "sendMessage": "メッセージを送信",
20
+ "resizeHandle": "入力欄の高さを変更します。上下の矢印キーで調整し、ダブルクリックで自動の高さに戻します。"
20
21
  },
21
22
  "interrupt": {
22
23
  "stopProcessing": "処理を中断"
@@ -1080,6 +1081,27 @@
1080
1081
  "changedRecently": "変更あり",
1081
1082
  "changedRecentlyDetail": "モデルが {from} から {to} に変わりました。タップで閉じます。"
1082
1083
  },
1084
+ "agentMode": {
1085
+ "label": "モード",
1086
+ "cycleAria": "エージェントの権限モードを切り替える (shift+tab)",
1087
+ "cycleFromAria": "エージェントの権限モードを切り替える。現在は {mode}。(shift+tab)",
1088
+ "note": {
1089
+ "codexModelCoupled": "Codex はモードと連動してモデルと推論の強さも変わります。"
1090
+ },
1091
+ "noteShort": {
1092
+ "codexModelCoupled": "モデルも変わる"
1093
+ },
1094
+ "mode": {
1095
+ "default": "default",
1096
+ "manual": "manual",
1097
+ "accept-edits": "accept edits",
1098
+ "plan": "plan",
1099
+ "auto": "auto",
1100
+ "autopilot": "autopilot",
1101
+ "bypass": "permission bypass",
1102
+ "dont-ask": "don't-ask"
1103
+ }
1104
+ },
1083
1105
  "sessionNote": {
1084
1106
  "menuItem": "セッションメモ",
1085
1107
  "placeholder": "このセッションで何をしているか",
@@ -0,0 +1,327 @@
1
+ "use strict";
2
+ /**
3
+ * How each CLI cycles its permission mode, and how that mode is read off the
4
+ * pane (Issue #2592).
5
+ *
6
+ * `BaseCLITool.agentModeSpec()` answers from this table, the way it already
7
+ * answers `describeComposer()` from `./composer-spec`, `captureSpec()` from
8
+ * `./capture-spec` and `livenessSpec()` from `./liveness-spec`. Nothing outside
9
+ * `src/lib/cli-tools/**` branches on a `CLIToolType` to find a mode.
10
+ *
11
+ * ## What `shift+tab` is, per tool (measured 2026-09-16, Issue #2592)
12
+ *
13
+ * Eight tools were driven on a private tmux socket at 200x60 from a repository
14
+ * root, pressing `BTab` until the display returned to where it started:
15
+ *
16
+ * | tool | version | what `shift+tab` does | measured cycle |
17
+ * |----------------|----------|----------------------------------|-----------------------------------------------|
18
+ * | claude | 2.1.273 | permission-mode cycle | auto → manual → accept edits → plan → auto |
19
+ * | command-code | 1.53.1 | permission-mode cycle | default → accept edits → plan → default |
20
+ * | codex | 0.154.0 | two-value toggle | Default ⇄ Plan |
21
+ * | copilot | 1.0.83 | mode cycle | default → plan → autopilot → default |
22
+ * | | 1.0.85 | (UAT) autopilot may read `autopilot (limited)` | same cycle |
23
+ * | antigravity | 1.2.4 | mode cycle | default → accept-edits → plan → default |
24
+ * | gemini | 0.58.0 | `app.cycleApprovalMode` (docs) | **NOT MEASURED** — see below |
25
+ * | opencode | 1.18.30 | agent switch, not a mode | — (already shipped as #2046's quick keys) |
26
+ * | vibe-local | — | nothing (5 presses, no change) | — (`-y` AUTO-APPROVE is fixed) |
27
+ *
28
+ * ## The three tools this table deliberately leaves out
29
+ *
30
+ * - **opencode.** `BTab` there is `agent_cycle_reverse`, and it already has a
31
+ * UI — `OpencodeQuickKeys`' `agentPrev` button (#2046). Giving opencode a
32
+ * mode spec would put a second button on the same key with a different
33
+ * promise. The separation is a DECLARATION (no entry here), not a tool-id
34
+ * check in the UI.
35
+ * - **vibe-local.** Five presses produced a byte-identical frame. There is no
36
+ * mode to cycle; the wrapper fixes `-y`.
37
+ * - **gemini.** Its bundled `docs/reference/keyboard-shortcuts.md` does bind
38
+ * `app.cycleApprovalMode`, so the binding is not in doubt — the *footer
39
+ * spelling* is, because sign-in failed with `This client is no longer
40
+ * supported for Gemini Code Assist for individuals` and the TUI was never
41
+ * reached. Drawing a button means promising to say what happens when it is
42
+ * pressed, and for gemini nothing here could. Adding it is a follow-up for
43
+ * whoever has an account that signs in.
44
+ *
45
+ * ## Why the indicators are patterns on a windowed tail and not positions
46
+ *
47
+ * The five declaring tools put the mode in five structurally different places —
48
+ * a dedicated footer row (claude), an independent row above the shortcut hint
49
+ * (Command Code 1.53.1) or *replacing* it (1.49.0), the right end of a status
50
+ * bar (codex), a word spliced into a hint bar whose element count changes with
51
+ * the mode (copilot), and a right-aligned footer segment plus a banner inside
52
+ * the composer box (agy). No column index, no row offset and no "nth segment"
53
+ * rule survives that set, so each tool declares what its row LOOKS like and the
54
+ * reader scans a small window of non-blank tail rows for it.
55
+ *
56
+ * @module lib/cli-tools/agent-mode-spec
57
+ */
58
+ Object.defineProperty(exports, "__esModule", { value: true });
59
+ exports.AGENT_MODE_TOOL_IDS = void 0;
60
+ exports.resolveAgentModeSpec = resolveAgentModeSpec;
61
+ /**
62
+ * claude's permission-mode footer row.
63
+ *
64
+ * The four spellings are #1927's measurement table (claude-cli 2.1.240, 200x1000),
65
+ * re-confirmed by #2592 on 2.1.273 and visible verbatim in the live captures
66
+ * this repository already keeps — `tests/fixtures/claude-live-2247/*.txt` and
67
+ * `tests/unit/lib/tmux/fixtures/capture-claude-*.txt` carry the `auto` and
68
+ * `manual` rows respectively:
69
+ *
70
+ * ` ⏸ manual mode on · ? for shortcuts · ← for agents /rc · focus`
71
+ * ` ⏵⏵ auto mode on (shift+tab to cycle) · ← for agents /rc · focus`
72
+ * ` ⏸ plan mode on (shift+tab to cycle) · ⇥ for agents`
73
+ * ` ⏵⏵ accept edits on (shift+tab to cycle) · ⇥ for agents`
74
+ *
75
+ * The leading glyph is REQUIRED in every pattern, and that is what separates a
76
+ * footer from a permission dialog quoting the same words: `tests/fixtures/canary/
77
+ * permission-hook-no-decision.raw.txt:33` reads
78
+ * `2. Yes, and switch to accept edits (auto-approve …) for this session (shift+tab)`,
79
+ * which contains "accept edits" and must never be read as a mode.
80
+ *
81
+ * claude has no `default`: `manual` IS its base mode and it prints a row for it,
82
+ * which is why claude is the one declaring tool whose every cycle member is
83
+ * readable.
84
+ */
85
+ const CLAUDE_MODE_SPEC = {
86
+ key: 'BTab',
87
+ cycle: ['auto', 'manual', 'accept-edits', 'plan'],
88
+ indicators: [
89
+ { mode: 'accept-edits', pattern: /⏵⏵\s*accept edits on\b/ },
90
+ { mode: 'auto', pattern: /⏵⏵\s*auto mode on\b/ },
91
+ { mode: 'plan', pattern: /⏸\s*plan mode on\b/ },
92
+ { mode: 'manual', pattern: /⏸\s*manual mode on\b/ },
93
+ ],
94
+ // The row is the LAST content row of every measured frame (row 1000 of a
95
+ // 200x1000 alternate-screen capture). Three rows of slack for the `/rc · focus`
96
+ // continuation and for a build that grows a row under it; not more, because
97
+ // claude renders in the alternate screen and a wider window reaches nothing
98
+ // new anyway.
99
+ tailRows: 3,
100
+ noteId: null,
101
+ };
102
+ /**
103
+ * Command Code's mode row.
104
+ *
105
+ * Two shapes, nine minor versions apart, and the reader has to answer both:
106
+ *
107
+ * - **1.49.0** (`tests/fixtures/command-code-live-2250/README.md`): `ModeIndicator`
108
+ * REPLACES the shortcut hint, so the footer is one row that reads
109
+ * `? for shortcuts · taste on` in default and `» accept edits on` /
110
+ * `plan mode` / `» permission bypass on` / `» don't-ask on` otherwise.
111
+ * - **1.53.1** (#2592): the mode is its OWN row directly above the
112
+ * `? for shortcuts` row, spelled `» accept edits on [shift+tab]` /
113
+ * `plan mode [shift+tab]`.
114
+ *
115
+ * One consequence drives the ordering below. On 1.53.1 `? for shortcuts` is
116
+ * drawn in EVERY mode, so an indicator that reads it as `default` is only
117
+ * correct once every mode row has been checked first — hence `default` last.
118
+ * `bypass` and `dont-ask` are checked even though `shift+tab` skips them
119
+ * (#2592 measured the cycle as default → accept edits → plan), because without
120
+ * them a 1.53.1 pane sitting in `permission bypass` would fall through to
121
+ * `? for shortcuts` and publish `default`.
122
+ *
123
+ * The spellings are `cli-patterns.ts`'s `COMMAND_CODE_FOOTER_PATTERN`
124
+ * alternatives, which is the same list read off the same bundle.
125
+ */
126
+ const COMMAND_CODE_MODE_SPEC = {
127
+ key: 'BTab',
128
+ cycle: ['default', 'accept-edits', 'plan'],
129
+ indicators: [
130
+ { mode: 'accept-edits', pattern: /»\s*accept edits on\b/ },
131
+ { mode: 'bypass', pattern: /»\s*permission bypass on\b/ },
132
+ { mode: 'dont-ask', pattern: /»\s*don't-ask on\b/ },
133
+ { mode: 'plan', pattern: /^[^\S\n]*plan mode\b/ },
134
+ // LAST, and the only positive reading of a base mode in this file. It is a
135
+ // row Command Code actually draws, not the absence of one: #2592 §3's
136
+ // "default が無表示" applies to codex / copilot / agy, not here.
137
+ { mode: 'default', pattern: /\?\s+for\s+shortcuts\b/ },
138
+ ],
139
+ // Command Code renders INLINE — #2250 measured `alternate_on` 0 and a pane
140
+ // that keeps its scrollback — so a 1000-row capture holds every footer the
141
+ // session has ever drawn. Four rows covers 1.53.1's `mode row + rule +
142
+ // shortcut row` stack and nothing above it.
143
+ tailRows: 4,
144
+ noteId: null,
145
+ };
146
+ /**
147
+ * codex's Plan-mode badge, at the right end of the status bar.
148
+ *
149
+ * `Plan mode (shift+tab to cycle)`, measured on 0.154.0. **There is no default
150
+ * indicator, on purpose.** codex prints nothing at all in Default — #2592
151
+ * §「設計に効く事実」3 — so the only honest answer for a Default pane is
152
+ * `unknown`, and the chip is not drawn. Reading Default off the absence of the
153
+ * badge would publish `default` for every frame captured mid-repaint and for
154
+ * every future build that renames the badge.
155
+ *
156
+ * Note the footer's LEFT segment is not consulted either, although it moves with
157
+ * the mode: `tests/fixtures/codex-live-2310/idle-composer.txt` ends
158
+ * `gpt-5.6-sol default · /private/tmp/…`, and that `default` is the reasoning
159
+ * preset `CODEX_FOOTER_MODEL_PATTERN` already reads as a model/effort pair. Two
160
+ * readers on one token is how one of them ends up publishing the other's value.
161
+ */
162
+ const CODEX_MODE_SPEC = {
163
+ key: 'BTab',
164
+ cycle: ['default', 'plan'],
165
+ indicators: [
166
+ { mode: 'plan', pattern: /\bPlan mode\s*\(shift\+tab to cycle\)/i },
167
+ ],
168
+ tailRows: 3,
169
+ // #2592 §4: codex couples the mode to the model tier and reasoning effort
170
+ // (xhigh ⇄ medium, measured). One press of a button labelled "mode" therefore
171
+ // also moves the model, and the UI has to say so rather than let it be found.
172
+ noteId: 'codexModelCoupled',
173
+ };
174
+ /**
175
+ * One mode-naming segment of a status bar (Issue #2592).
176
+ *
177
+ * copilot and antigravity both put the mode into a row that is otherwise their
178
+ * status bar, as one segment among `·`-separated others, and neither puts it in
179
+ * a fixed place. The grammar, as measured on the live frames under
180
+ * `tests/fixtures/agent-mode-2592/`:
181
+ *
182
+ * left boundary start of row | `·` | a column gap (two spaces)
183
+ * the word `plan`, `accept-edits`, `autopilot` (+ an optional ` mode`)
184
+ * qualifier optional ` (limited)` — copilot 1.0.85 prints
185
+ * `autopilot (limited)` after the user answers its permission
186
+ * dialog with "Continue with limited permissions"
187
+ * right boundary `·` | a column gap | end of row
188
+ *
189
+ * The column gap on the LEFT is what agy 1.2.4 needs, and what the first cut of
190
+ * this file did not accept: agy draws `? for shortcuts` and the right-aligned
191
+ * `accept-edits · Gemini 3.8 Flash · hi` on the SAME row, 150 columns apart, so
192
+ * the mode word is preceded by spaces and nothing else. The first fixture had
193
+ * been built from the Issue's prose with the segment on a row of its own, where
194
+ * `^` matched — and the live UAT read `unknown` on every agy step.
195
+ *
196
+ * The gap is exactly two spaces immediately before the word rather than "two or
197
+ * more then any": each alternative is anchored at one position (`^`, a `·`, or
198
+ * the last two columns of a run), so the scan stays linear in the row width
199
+ * instead of re-walking every run of padding from every start position. A single
200
+ * space is deliberately NOT a boundary — that is what keeps prose such as
201
+ * `Follow the plan` from reading as a mode.
202
+ *
203
+ * @param word - Regex source for the mode word (no capture groups)
204
+ */
205
+ function statusBarSegment(word) {
206
+ const gap = '[^\\S\\n]';
207
+ return new RegExp(`(?:^${gap}*|·${gap}*|${gap}{2})${word}` +
208
+ `(?:${gap}\\([^()\\n]{1,32}\\))?` +
209
+ `(?:${gap}*·|${gap}{2}|${gap}*$)`, 'i');
210
+ }
211
+ /**
212
+ * copilot's mode word, spliced into the hint bar.
213
+ *
214
+ * The bar is the last content row of the pane — `readCopilotBarRow` in
215
+ * `lib/detection/model-info-extractor.ts` relies on exactly that, and
216
+ * `tests/fixtures/tool-liveness-2070/copilot-ready-1080.txt:1001` shows it:
217
+ *
218
+ * ` … · ← open sidebar · / commands · ? help · tab next tab GPT-5.6 Terra`
219
+ *
220
+ * #2592 measured `default → plan → autopilot → default` on 1.0.83, with the mode
221
+ * word inserted as a `·`-delimited segment of that bar and `? help` DISAPPEARING
222
+ * in autopilot — i.e. the bar's element count is itself mode-dependent, which is
223
+ * why the patterns below are delimiter-anchored rather than positional and why
224
+ * nothing here requires `? help` to be present.
225
+ *
226
+ * The UAT on 1.0.85 (`tests/fixtures/agent-mode-2592/copilot-*.txt`) placed the
227
+ * word directly after `← open sidebar`:
228
+ *
229
+ * ` ← open sidebar · plan · / commands · ? help · tab next tab GPT-5.6 Terra`
230
+ * ` ← open sidebar · autopilot (limited) · / commands · tab next tab GPT-5.6 Terra`
231
+ *
232
+ * The second is what copilot draws for the rest of the session once its
233
+ * autopilot permission dialog is answered "Continue with limited permissions";
234
+ * it is still autopilot, so {@link statusBarSegment} reads the parenthetical as a
235
+ * qualifier rather than as a different mode. Before the UAT it was read as
236
+ * nothing, and every autopilot step of the cycle published `unknown`.
237
+ *
238
+ * No default indicator: the measurement found no word for it.
239
+ */
240
+ const COPILOT_MODE_SPEC = {
241
+ key: 'BTab',
242
+ cycle: ['default', 'plan', 'autopilot'],
243
+ indicators: [
244
+ { mode: 'autopilot', pattern: statusBarSegment('autopilot') },
245
+ { mode: 'plan', pattern: statusBarSegment('plan(?:[^\\S\\n]mode)?') },
246
+ ],
247
+ // The bar is the last content row. Two rows of slack and no more: copilot
248
+ // renders in the alternate screen, and its transcript is measured (#1885 /
249
+ // #1897) to repeat its own status-bar vocabulary as body text — position is
250
+ // the only thing that separates the bar from a sentence about it.
251
+ tailRows: 2,
252
+ noteId: null,
253
+ };
254
+ /**
255
+ * antigravity's mode segment, at the right end of the footer.
256
+ *
257
+ * agy's footer is the last content row. On 1.2.4 it is ONE row holding both the
258
+ * shortcut hint at the left edge and the model chip at the right, with the mode
259
+ * spliced in front of the chip (`tests/fixtures/agent-mode-2592/antigravity-*.txt`,
260
+ * captured live in the #2592 UAT, row 20, 200 columns):
261
+ *
262
+ * `? for shortcuts … accept-edits · Gemini 3.8 Flash · hi`
263
+ * `? for shortcuts … plan · Gemini 3.8 Flash · hi`
264
+ * `? for shortcuts … Gemini 3.8 Flash · hig`
265
+ *
266
+ * Nothing is drawn for default. The segment is preceded by a column gap and not
267
+ * by a `·`, which is the case {@link statusBarSegment}'s left boundary had to
268
+ * learn; see there.
269
+ *
270
+ * agy ALSO paints a mode banner inside its composer box
271
+ * (`> Plan mode: research & plan only (shift+tab to cycle)`), and that is
272
+ * deliberately not read here: one row, the footer, is enough. The banner matters
273
+ * to STATUS detection instead — it replaces the bare `>` the idle rule looks for,
274
+ * which is why `ANTIGRAVITY_PROMPT_PATTERN` in `lib/detection/cli-patterns.ts`
275
+ * accepts it — and it is the region `extractComposerText` walks. (It cannot
276
+ * collide with that today — agy is not
277
+ * in `SUPPORTED_COMPOSER_TOOLS`, so `extractComposerText` short-circuits to
278
+ * `unsupported_tool` and `UnsentComposerBar` can never draw for it. #2592's
279
+ * §「設計に効く事実」5 is therefore answered by construction, and
280
+ * `tests/unit/lib/detection/agent-mode-2592.test.ts` pins it so a future
281
+ * widening of that set has to face the question.)
282
+ */
283
+ const ANTIGRAVITY_MODE_SPEC = {
284
+ key: 'BTab',
285
+ cycle: ['default', 'accept-edits', 'plan'],
286
+ indicators: [
287
+ { mode: 'accept-edits', pattern: statusBarSegment('accept-edits') },
288
+ { mode: 'plan', pattern: statusBarSegment('plan(?:[^\\S\\n]mode)?') },
289
+ ],
290
+ tailRows: 2,
291
+ noteId: null,
292
+ };
293
+ /**
294
+ * The declarations, keyed by tool.
295
+ *
296
+ * A `Partial` rather than a total record on purpose: "this tool has no mode on
297
+ * `shift+tab`" is a statement three tools make, and making it by ABSENCE keeps
298
+ * `resolveAgentModeSpec` from needing a sentinel value that a caller could
299
+ * mistake for a spec.
300
+ */
301
+ const AGENT_MODE_SPECS = {
302
+ claude: CLAUDE_MODE_SPEC,
303
+ 'command-code': COMMAND_CODE_MODE_SPEC,
304
+ codex: CODEX_MODE_SPEC,
305
+ copilot: COPILOT_MODE_SPEC,
306
+ antigravity: ANTIGRAVITY_MODE_SPEC,
307
+ };
308
+ /**
309
+ * How one CLI cycles its permission mode, or `null` when it does not have one.
310
+ *
311
+ * @param cliToolId - CLI tool identifier
312
+ * @returns That tool's {@link AgentModeSpec}, or `null`
313
+ */
314
+ function resolveAgentModeSpec(cliToolId) {
315
+ return AGENT_MODE_SPECS[cliToolId] ?? null;
316
+ }
317
+ /**
318
+ * The tool ids that declare a mode cycle, for a reader that cannot call
319
+ * `ICLITool.agentModeSpec()`.
320
+ *
321
+ * The browser is such a reader: `ICLITool` lives behind the CLITool gateway on
322
+ * the server (§4 D4). This is the same arrangement — and the same hazard —
323
+ * `SESSION_SCOPE_KEY_TOOL_IDS` has carried since #2297, so it is pinned against
324
+ * the real registry the same way, by
325
+ * `tests/unit/lib/cli-tools/agent-mode-declaration-2592.test.ts`.
326
+ */
327
+ exports.AGENT_MODE_TOOL_IDS = Object.keys(AGENT_MODE_SPECS);
@@ -15,6 +15,7 @@ const session_name_1 = require("./session-name");
15
15
  const tmux_1 = require("../tmux/tmux");
16
16
  const composer_spec_1 = require("./composer-spec");
17
17
  const capture_spec_1 = require("./capture-spec");
18
+ const agent_mode_spec_1 = require("./agent-mode-spec");
18
19
  const graceful_exit_1 = require("./graceful-exit");
19
20
  const liveness_spec_1 = require("./liveness-spec");
20
21
  const session_liveness_1 = require("./session-liveness");
@@ -596,6 +597,27 @@ class BaseCLITool {
596
597
  navigationKeys() {
597
598
  return { keys: terminal_keys_1.NAVIGATION_KEY_VALUES, leaderKey: null };
598
599
  }
600
+ /**
601
+ * Declare how this tool cycles its permission mode (Issue #2592).
602
+ *
603
+ * The default is `null` — "this tool has no mode on `shift+tab`" — and that is
604
+ * the answer for three of the eight: opencode (whose `BTab` switches AGENTS,
605
+ * and already has `OpencodeQuickKeys`' `agentPrev` button from #2046),
606
+ * vibe-local (measured: five presses, byte-identical frame) and gemini (its
607
+ * own docs bind `app.cycleApprovalMode`, but sign-in refused the CLI and the
608
+ * footer spelling was never measured — a button is a promise about what
609
+ * happens when it is pressed).
610
+ *
611
+ * The five that DO declare one are answered from `./agent-mode-spec`, the same
612
+ * §4 D4 arrangement `describeComposer()` / `captureSpec()` / `livenessSpec()`
613
+ * already take. Nothing overrides this method today; a tool would only need to
614
+ * if its mode could not be expressed as "a row that looks like this".
615
+ *
616
+ * @returns This tool's {@link AgentModeSpec}, or `null`
617
+ */
618
+ agentModeSpec() {
619
+ return (0, agent_mode_spec_1.resolveAgentModeSpec)(this.id);
620
+ }
599
621
  }
600
622
  exports.BaseCLITool = BaseCLITool;
601
623
  /**
@@ -26,6 +26,7 @@ const promises_1 = require("fs/promises");
26
26
  const path_1 = __importDefault(require("path"));
27
27
  const types_1 = require("../lib/cli-tools/types");
28
28
  const cmate_cli_tool_parser_1 = require("../lib/cmate-cli-tool-parser");
29
+ const cmate_validator_1 = require("../lib/cmate-validator");
29
30
  const schedule_config_1 = require("../config/schedule-config");
30
31
  const cmate_constants_1 = require("../config/cmate-constants");
31
32
  Object.defineProperty(exports, "CMATE_FILENAME", { enumerable: true, get: function () { return cmate_constants_1.CMATE_FILENAME; } });
@@ -192,9 +193,7 @@ function parseSchedulesSection(rows) {
192
193
  continue;
193
194
  }
194
195
  // Parse enabled (default: true)
195
- const enabled = enabledStr === undefined ||
196
- enabledStr === '' ||
197
- enabledStr.toLowerCase() === 'true';
196
+ const enabled = (0, cmate_validator_1.isScheduleEnabled)(enabledStr);
198
197
  // Parse and validate CLI tool column via shared pipeline (DR1-007)
199
198
  const { result: parsed, errors: cliToolErrors } = (0, cmate_cli_tool_parser_1.parseAndValidateCliToolColumn)(rawCliTool || '');
200
199
  if (cliToolErrors.length > 0) {
@@ -231,9 +230,10 @@ function parseSchedulesSection(rows) {
231
230
  // Issue #2454: the column vocabulary is the six-value
232
231
  // COMMAND_CODE_SCHEDULE_PERMISSIONS, not the five `--permission-mode`
233
232
  // choices. An empty cell therefore resolves to `yolo` through
234
- // `defaultPermission` above, which is the only value that lets
235
- // `commandcode -p` write anything -- the five modes all leave print mode
236
- // read-only while still reporting success.
233
+ // `defaultPermission` above, which is the only value that lifts
234
+ // `commandcode -p`'s print gate -- with any of the five modes the write
235
+ // tools the agent calls directly are rejected while the run still
236
+ // reports success (Issue #2576 warns about those rows below).
237
237
  case 'command-code':
238
238
  allowedValues = schedule_config_1.COMMAND_CODE_SCHEDULE_PERMISSIONS;
239
239
  break;
@@ -259,6 +259,26 @@ function parseSchedulesSection(rows) {
259
259
  logger.warn('parse:invalid-permission', { name: sanitizedName, cliToolId: resolvedCliToolId, permission, defaultPermission });
260
260
  permission = defaultPermission;
261
261
  }
262
+ // Issue #2576: CMATE.md edited by hand never shows the dialog note, so the
263
+ // one reader every schedule goes through says it here. A warning, not a
264
+ // skip -- a run that only reports its final answer is a legitimate use.
265
+ // Disabled rows do not run, so they are not warned about (the same rule as
266
+ // `collectScheduleWarnings`). schedule-manager re-parses when CMATE.md's
267
+ // mtime changes (and when its mtime cache is empty, e.g. at startup), not on
268
+ // every sync, so this does not repeat every minute.
269
+ //
270
+ // Dependency direction: this server-only module imports the fs-free
271
+ // cmate-validator, never the reverse -- the validator is bundled into
272
+ // client components.
273
+ if (enabled && (0, cmate_validator_1.isCommandCodeDirectWriteToolsDenied)(resolvedCliToolId, permission)) {
274
+ logger.warn('parse:command-code-direct-write-tools-denied', {
275
+ code: cmate_validator_1.COMMAND_CODE_DIRECT_WRITE_TOOLS_DENIED,
276
+ name: sanitizedName,
277
+ cliToolId: resolvedCliToolId,
278
+ permission,
279
+ deniedTools: [...cmate_validator_1.COMMAND_CODE_PRINT_GATED_TOOLS],
280
+ });
281
+ }
262
282
  entries.push({
263
283
  name: sanitizedName,
264
284
  cronExpression: cronExpression.trim(),