commandmate 0.39.0 → 0.40.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 (657) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +457 -452
  3. package/.next/app-path-routes-manifest.json +32 -31
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +15 -15
  6. package/.next/react-loadable-manifest.json +3 -3
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +8 -0
  9. package/.next/server/app/_not-found/page.js +1 -1
  10. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/app/update-check/route.js +1 -1
  17. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/capabilities/route.js +1 -1
  22. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  31. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  45. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  49. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  50. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/clone/route.js +1 -1
  52. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  53. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/restore/route.js +1 -1
  56. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/route.js +1 -1
  59. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  60. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/repositories/scan/route.js +1 -1
  62. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  63. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/sync/route.js +1 -1
  65. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  66. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  69. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  70. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  87. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  90. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  93. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  97. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  98. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  101. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -0
  103. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -0
  104. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -0
  105. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  134. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  137. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  140. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  152. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  159. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  163. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/route.js +1 -1
  204. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/login/page.js +2 -2
  207. package/.next/server/app/login/page.js.nft.json +1 -1
  208. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/more/page.js +2 -2
  211. package/.next/server/app/more/page.js.nft.json +1 -1
  212. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  213. package/.next/server/app/offline/page.js +1 -1
  214. package/.next/server/app/offline/page.js.nft.json +1 -1
  215. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/page.js +1 -1
  217. package/.next/server/app/page.js.nft.json +1 -1
  218. package/.next/server/app/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/repositories/page.js +2 -2
  221. package/.next/server/app/repositories/page.js.nft.json +1 -1
  222. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  223. package/.next/server/app/review/page.js +1 -1
  224. package/.next/server/app/review/page.js.nft.json +1 -1
  225. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/sessions/page.js +1 -1
  227. package/.next/server/app/sessions/page.js.nft.json +1 -1
  228. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app/skills/[skillId]/page.js +2 -2
  230. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  231. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/skills/installed/page.js +2 -2
  233. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  234. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/skills/page.js +2 -2
  236. package/.next/server/app/skills/page.js.nft.json +1 -1
  237. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  239. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  240. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/worktrees/[id]/page.js +10 -10
  242. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  243. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  245. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  246. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app-paths-manifest.json +32 -31
  248. package/.next/server/chunks/{7086.js → 1674.js} +4 -4
  249. package/.next/server/chunks/2119.js +1 -1
  250. package/.next/server/chunks/2445.js +1 -1
  251. package/.next/server/chunks/252.js +1 -0
  252. package/.next/server/chunks/2816.js +1 -1
  253. package/.next/server/chunks/3241.js +1 -1
  254. package/.next/server/chunks/3323.js +1 -1
  255. package/.next/server/chunks/3543.js +1 -1
  256. package/.next/server/chunks/3945.js +1 -1
  257. package/.next/server/chunks/4443.js +1 -1
  258. package/.next/server/chunks/4802.js +1 -1
  259. package/.next/server/chunks/5164.js +1 -1
  260. package/.next/server/chunks/5742.js +1 -0
  261. package/.next/server/chunks/6130.js +1 -1
  262. package/.next/server/chunks/650.js +1 -1
  263. package/.next/server/chunks/6661.js +1 -1
  264. package/.next/server/chunks/6793.js +1 -1
  265. package/.next/server/chunks/7685.js +1 -1
  266. package/.next/server/chunks/7905.js +1 -1
  267. package/.next/server/chunks/8581.js +29 -29
  268. package/.next/server/chunks/8673.js +14 -0
  269. package/.next/server/chunks/8728.js +4 -3
  270. package/.next/server/chunks/8800.js +1 -1
  271. package/.next/server/chunks/9080.js +1 -1
  272. package/.next/server/chunks/9731.js +2 -2
  273. package/.next/server/chunks/9882.js +3 -3
  274. package/.next/server/middleware-build-manifest.js +1 -1
  275. package/.next/server/middleware-manifest.json +5 -5
  276. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  277. package/.next/server/pages/500.html +1 -1
  278. package/.next/server/server-reference-manifest.json +1 -1
  279. package/.next/static/chunks/1642-767aed8e7c61ef7f.js +1 -0
  280. package/.next/static/chunks/{2053-ce3fe896ad45e50f.js → 2053-611dd27d42721b79.js} +1 -1
  281. package/.next/static/chunks/{2407-8fe4e4d0bab1931a.js → 2407-e259744922e0834c.js} +1 -1
  282. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  283. package/.next/static/chunks/{3922.9c1ec01fff819c88.js → 3922.8e79fc89f593280b.js} +1 -1
  284. package/.next/static/chunks/4768-979c8a03bed218e7.js +1 -0
  285. package/.next/static/chunks/6192-a67df090838b9aad.js +1 -0
  286. package/.next/static/chunks/7705-25076b57224da370.js +1 -0
  287. package/.next/static/chunks/8165-8944f74c53f3021f.js +1 -0
  288. package/.next/static/chunks/8318-01e7d1e5ad0a15a3.js +1 -0
  289. package/.next/static/chunks/8407-9a72e6f07c5d5458.js +1 -0
  290. package/.next/static/chunks/8606-9a381b996f9b6834.js +1 -0
  291. package/.next/static/chunks/9619-22adf5367c4b7080.js +1 -0
  292. package/.next/static/chunks/app/api/agents/update/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  293. package/.next/static/chunks/app/api/agents/versions/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  294. package/.next/static/chunks/app/api/app/release-notes/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  295. package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +1 -0
  296. package/.next/static/chunks/app/api/app/update-check/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  297. package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +1 -0
  298. package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +1 -0
  299. package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +1 -0
  300. package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +1 -0
  301. package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +1 -0
  302. package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +1 -0
  303. package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +1 -0
  304. package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +1 -0
  305. package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +1 -0
  306. package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +1 -0
  307. package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +1 -0
  308. package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +1 -0
  309. package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +1 -0
  310. package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +1 -0
  311. package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +1 -0
  312. package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +1 -0
  313. package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +1 -0
  314. package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +1 -0
  315. package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +1 -0
  316. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +1 -0
  317. package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +1 -0
  318. package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +1 -0
  319. package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +1 -0
  320. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +1 -0
  321. package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +1 -0
  322. package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +1 -0
  323. package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +1 -0
  324. package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +1 -0
  325. package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +1 -0
  326. package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +1 -0
  327. package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +1 -0
  328. package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +1 -0
  329. package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +1 -0
  330. package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +1 -0
  331. package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +1 -0
  332. package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +1 -0
  333. package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +1 -0
  334. package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +1 -0
  335. package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +1 -0
  336. package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +1 -0
  337. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +1 -0
  338. package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +1 -0
  339. package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +1 -0
  340. package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +1 -0
  341. package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +1 -0
  342. package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +1 -0
  343. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +1 -0
  344. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +1 -0
  345. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +1 -0
  346. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +1 -0
  347. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +1 -0
  348. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +1 -0
  427. package/.next/static/chunks/app/layout-b90cce6a51c91f4c.js +1 -0
  428. package/.next/static/chunks/app/login/{page-269a9de3b91a45a2.js → page-38d401f553693b03.js} +1 -1
  429. package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +1 -0
  430. package/.next/static/chunks/app/more/page-30057cf1e0762ad2.js +1 -0
  431. package/.next/static/chunks/app/{page-0c1a29ff3609bd8b.js → page-8483ba400af011f5.js} +1 -1
  432. package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +1 -0
  433. package/.next/static/chunks/app/repositories/{page-e9ceeefacf87d470.js → page-6f7511f4ac8449e2.js} +1 -1
  434. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +1 -0
  435. package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +1 -0
  436. package/.next/static/chunks/app/skills/[skillId]/{page-6f62668eabb635f5.js → page-ab7e432b69fccb3b.js} +1 -1
  437. package/.next/static/chunks/app/skills/installed/{page-c6c4ac5e26c4e73e.js → page-e000102a01a42c98.js} +1 -1
  438. package/.next/static/chunks/app/skills/{page-bec1d4924004d4de.js → page-56b4fa11223e0cbd.js} +1 -1
  439. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-2e98f11956fe1aea.js → page-5445205c8dd80109.js} +1 -1
  440. package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +1 -0
  441. package/.next/static/chunks/app/worktrees/[id]/page-e9ebdcd317b62e4a.js +1 -0
  442. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  443. package/.next/static/chunks/{webpack-9f75198882fdaf08.js → webpack-7e5907979c182510.js} +1 -1
  444. package/.next/static/css/974314e796232f53.css +1 -0
  445. package/.next/trace +13 -13
  446. package/.next/types/app/api/worktrees/[id]/direct-input/route.ts +347 -0
  447. package/.next/types/routes.d.ts +2 -1
  448. package/.next/types/validator.ts +9 -0
  449. package/dist/cli/commands/ls.d.ts.map +1 -1
  450. package/dist/cli/commands/ls.js +9 -0
  451. package/dist/cli/commands/peers.d.ts.map +1 -1
  452. package/dist/cli/commands/peers.js +4 -0
  453. package/dist/cli/commands/send.d.ts.map +1 -1
  454. package/dist/cli/commands/send.js +20 -6
  455. package/dist/cli/config/model-validation.d.ts +22 -0
  456. package/dist/cli/config/model-validation.d.ts.map +1 -1
  457. package/dist/cli/config/model-validation.js +35 -1
  458. package/dist/cli/types/api-responses.d.ts +11 -0
  459. package/dist/cli/types/api-responses.d.ts.map +1 -1
  460. package/dist/lib/detection/status-reason.d.ts +13 -0
  461. package/dist/lib/detection/status-reason.d.ts.map +1 -1
  462. package/dist/lib/detection/status-reason.js +13 -0
  463. package/dist/lib/detection/tools/verified-against.d.ts +74 -5
  464. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  465. package/dist/lib/detection/tools/verified-against.js +74 -5
  466. package/dist/server/locales/en/worktree.json +58 -0
  467. package/dist/server/locales/ja/worktree.json +58 -0
  468. package/dist/server/src/config/claude-constants.js +27 -0
  469. package/dist/server/src/lib/cli-tools/base.js +2 -1
  470. package/dist/server/src/lib/cli-tools/claude.js +5 -1
  471. package/dist/server/src/lib/cli-tools/command-code.js +5 -1
  472. package/dist/server/src/lib/cli-tools/direct-input.js +22 -0
  473. package/dist/server/src/lib/cmate-cli-tool-parser.js +31 -0
  474. package/dist/server/src/lib/detection/cli-patterns.js +44 -5
  475. package/dist/server/src/lib/detection/selection-shape.js +274 -19
  476. package/dist/server/src/lib/detection/status-detector.js +2 -0
  477. package/dist/server/src/lib/detection/status-reason.js +13 -0
  478. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +67 -27
  479. package/dist/server/src/lib/detection/tools/codex/detect.js +18 -3
  480. package/dist/server/src/lib/detection/tools/command-code/detect.js +46 -0
  481. package/dist/server/src/lib/detection/tools/command-code/dialog.js +116 -25
  482. package/dist/server/src/lib/detection/tools/verified-against.js +74 -5
  483. package/dist/server/src/lib/detection/tui-detection-frame.js +18 -3
  484. package/dist/server/src/lib/polling/auto-yes-resolver.js +8 -0
  485. package/dist/server/src/lib/prompt-answer-sender.js +255 -1
  486. package/dist/server/src/lib/realtime-snippet.js +53 -0
  487. package/dist/server/src/lib/session/claude-session.js +19 -2
  488. package/dist/server/src/lib/session/current-output-builder.js +4 -1
  489. package/dist/server/src/lib/session/status-mapping.js +58 -8
  490. package/dist/server/src/lib/tmux/key-sequence.js +27 -1
  491. package/dist/server/src/lib/tmux/tmux-control-client.js +26 -3
  492. package/dist/server/src/lib/tmux/tmux.js +64 -3
  493. package/dist/server/src/types/direct-input.js +113 -0
  494. package/dist/server/src/types/sidebar.js +67 -7
  495. package/dist/server/src/types/terminal-keys.js +33 -1
  496. package/dist/types/terminal-keys.d.ts +28 -1
  497. package/dist/types/terminal-keys.d.ts.map +1 -1
  498. package/dist/types/terminal-keys.js +33 -1
  499. package/package.json +3 -2
  500. package/public/sw.js +5 -5
  501. package/release-notes/0.39.1.json +29 -0
  502. package/release-notes/0.40.0.json +69 -0
  503. package/.next/server/chunks/1707.js +0 -14
  504. package/.next/server/chunks/366.js +0 -1
  505. package/.next/server/chunks/8550.js +0 -1
  506. package/.next/static/chunks/1032-9e43405ac6bf6848.js +0 -1
  507. package/.next/static/chunks/3504-0100ab50762f591b.js +0 -1
  508. package/.next/static/chunks/4322-f54abdc5d16b7462.js +0 -1
  509. package/.next/static/chunks/4768-0ad5eb716bed5de9.js +0 -1
  510. package/.next/static/chunks/4949-a13ace141c0183d6.js +0 -1
  511. package/.next/static/chunks/5529-83e705fc4134a503.js +0 -1
  512. package/.next/static/chunks/6022-d2d7bd9373ff3ae9.js +0 -1
  513. package/.next/static/chunks/8019-cc6ac1cc033fd5f0.js +0 -1
  514. package/.next/static/chunks/8606-e893c1dab6fb81bc.js +0 -1
  515. package/.next/static/chunks/9619-c3c4c623b0a4f681.js +0 -1
  516. package/.next/static/chunks/998-292ebcd30f329eb1.js +0 -1
  517. package/.next/static/chunks/app/api/app/update/route-70779af8b4c8259a.js +0 -1
  518. package/.next/static/chunks/app/api/auth/login/route-70779af8b4c8259a.js +0 -1
  519. package/.next/static/chunks/app/api/auth/logout/route-70779af8b4c8259a.js +0 -1
  520. package/.next/static/chunks/app/api/auth/status/route-70779af8b4c8259a.js +0 -1
  521. package/.next/static/chunks/app/api/capabilities/route-70779af8b4c8259a.js +0 -1
  522. package/.next/static/chunks/app/api/daily-summary/route-70779af8b4c8259a.js +0 -1
  523. package/.next/static/chunks/app/api/daily-summary/status/route-70779af8b4c8259a.js +0 -1
  524. package/.next/static/chunks/app/api/external-apps/[id]/health/route-70779af8b4c8259a.js +0 -1
  525. package/.next/static/chunks/app/api/external-apps/[id]/route-70779af8b4c8259a.js +0 -1
  526. package/.next/static/chunks/app/api/external-apps/route-70779af8b4c8259a.js +0 -1
  527. package/.next/static/chunks/app/api/fs/browse/route-70779af8b4c8259a.js +0 -1
  528. package/.next/static/chunks/app/api/fs/recent-paths/route-70779af8b4c8259a.js +0 -1
  529. package/.next/static/chunks/app/api/hooks/agent-event/route-70779af8b4c8259a.js +0 -1
  530. package/.next/static/chunks/app/api/hooks/claude-done/route-70779af8b4c8259a.js +0 -1
  531. package/.next/static/chunks/app/api/hooks/permission-request/route-70779af8b4c8259a.js +0 -1
  532. package/.next/static/chunks/app/api/metrics/vibe/route-70779af8b4c8259a.js +0 -1
  533. package/.next/static/chunks/app/api/ollama/models/route-70779af8b4c8259a.js +0 -1
  534. package/.next/static/chunks/app/api/push/escalation/route-70779af8b4c8259a.js +0 -1
  535. package/.next/static/chunks/app/api/push/subscriptions/route-70779af8b4c8259a.js +0 -1
  536. package/.next/static/chunks/app/api/push/vapid/route-70779af8b4c8259a.js +0 -1
  537. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-70779af8b4c8259a.js +0 -1
  538. package/.next/static/chunks/app/api/relays/route-70779af8b4c8259a.js +0 -1
  539. package/.next/static/chunks/app/api/remote/pair/route-70779af8b4c8259a.js +0 -1
  540. package/.next/static/chunks/app/api/repositories/[id]/route-70779af8b4c8259a.js +0 -1
  541. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-70779af8b4c8259a.js +0 -1
  542. package/.next/static/chunks/app/api/repositories/clone/route-70779af8b4c8259a.js +0 -1
  543. package/.next/static/chunks/app/api/repositories/excluded/route-70779af8b4c8259a.js +0 -1
  544. package/.next/static/chunks/app/api/repositories/restore/route-70779af8b4c8259a.js +0 -1
  545. package/.next/static/chunks/app/api/repositories/route-70779af8b4c8259a.js +0 -1
  546. package/.next/static/chunks/app/api/repositories/scan/route-70779af8b4c8259a.js +0 -1
  547. package/.next/static/chunks/app/api/repositories/sync/route-70779af8b4c8259a.js +0 -1
  548. package/.next/static/chunks/app/api/repositories/validate-path/route-70779af8b4c8259a.js +0 -1
  549. package/.next/static/chunks/app/api/settings/default-agents/route-70779af8b4c8259a.js +0 -1
  550. package/.next/static/chunks/app/api/settings/default-surface-mode/route-70779af8b4c8259a.js +0 -1
  551. package/.next/static/chunks/app/api/sidebar/group-order/route-70779af8b4c8259a.js +0 -1
  552. package/.next/static/chunks/app/api/skills/[id]/route-70779af8b4c8259a.js +0 -1
  553. package/.next/static/chunks/app/api/skills/installations/route-70779af8b4c8259a.js +0 -1
  554. package/.next/static/chunks/app/api/skills/operations/route-70779af8b4c8259a.js +0 -1
  555. package/.next/static/chunks/app/api/skills/reindex/route-70779af8b4c8259a.js +0 -1
  556. package/.next/static/chunks/app/api/skills/route-70779af8b4c8259a.js +0 -1
  557. package/.next/static/chunks/app/api/slash-commands/route-70779af8b4c8259a.js +0 -1
  558. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-70779af8b4c8259a.js +0 -1
  559. package/.next/static/chunks/app/api/tasks/[taskId]/route-70779af8b4c8259a.js +0 -1
  560. package/.next/static/chunks/app/api/templates/[id]/route-70779af8b4c8259a.js +0 -1
  561. package/.next/static/chunks/app/api/templates/route-70779af8b4c8259a.js +0 -1
  562. package/.next/static/chunks/app/api/verification/runs/[runId]/route-70779af8b4c8259a.js +0 -1
  563. package/.next/static/chunks/app/api/verification/runs/route-70779af8b4c8259a.js +0 -1
  564. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-70779af8b4c8259a.js +0 -1
  565. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-70779af8b4c8259a.js +0 -1
  566. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-70779af8b4c8259a.js +0 -1
  567. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-70779af8b4c8259a.js +0 -1
  568. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-70779af8b4c8259a.js +0 -1
  569. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-70779af8b4c8259a.js +0 -1
  570. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-70779af8b4c8259a.js +0 -1
  571. package/.next/static/chunks/app/api/worktrees/[id]/env/route-70779af8b4c8259a.js +0 -1
  572. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-70779af8b4c8259a.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-70779af8b4c8259a.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-70779af8b4c8259a.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-70779af8b4c8259a.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-70779af8b4c8259a.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-70779af8b4c8259a.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-70779af8b4c8259a.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-70779af8b4c8259a.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-70779af8b4c8259a.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-70779af8b4c8259a.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-70779af8b4c8259a.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-70779af8b4c8259a.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-70779af8b4c8259a.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-70779af8b4c8259a.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-70779af8b4c8259a.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-70779af8b4c8259a.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-70779af8b4c8259a.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-70779af8b4c8259a.js +0 -1
  590. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-70779af8b4c8259a.js +0 -1
  591. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-70779af8b4c8259a.js +0 -1
  592. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-70779af8b4c8259a.js +0 -1
  593. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-70779af8b4c8259a.js +0 -1
  594. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-70779af8b4c8259a.js +0 -1
  595. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-70779af8b4c8259a.js +0 -1
  596. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-70779af8b4c8259a.js +0 -1
  597. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-70779af8b4c8259a.js +0 -1
  598. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-70779af8b4c8259a.js +0 -1
  599. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-70779af8b4c8259a.js +0 -1
  600. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-70779af8b4c8259a.js +0 -1
  601. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-70779af8b4c8259a.js +0 -1
  602. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-70779af8b4c8259a.js +0 -1
  603. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-70779af8b4c8259a.js +0 -1
  604. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-70779af8b4c8259a.js +0 -1
  605. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-70779af8b4c8259a.js +0 -1
  606. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-70779af8b4c8259a.js +0 -1
  607. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-70779af8b4c8259a.js +0 -1
  608. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-70779af8b4c8259a.js +0 -1
  609. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-70779af8b4c8259a.js +0 -1
  610. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-70779af8b4c8259a.js +0 -1
  611. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-70779af8b4c8259a.js +0 -1
  612. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-70779af8b4c8259a.js +0 -1
  613. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-70779af8b4c8259a.js +0 -1
  614. package/.next/static/chunks/app/api/worktrees/[id]/route-70779af8b4c8259a.js +0 -1
  615. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-70779af8b4c8259a.js +0 -1
  616. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-70779af8b4c8259a.js +0 -1
  617. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-70779af8b4c8259a.js +0 -1
  618. package/.next/static/chunks/app/api/worktrees/[id]/search/route-70779af8b4c8259a.js +0 -1
  619. package/.next/static/chunks/app/api/worktrees/[id]/send/route-70779af8b4c8259a.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-70779af8b4c8259a.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-70779af8b4c8259a.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-70779af8b4c8259a.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-70779af8b4c8259a.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-70779af8b4c8259a.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-70779af8b4c8259a.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-70779af8b4c8259a.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-70779af8b4c8259a.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-70779af8b4c8259a.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-70779af8b4c8259a.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-70779af8b4c8259a.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-70779af8b4c8259a.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-70779af8b4c8259a.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-70779af8b4c8259a.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-70779af8b4c8259a.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-70779af8b4c8259a.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-70779af8b4c8259a.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-70779af8b4c8259a.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-70779af8b4c8259a.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-70779af8b4c8259a.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-70779af8b4c8259a.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-70779af8b4c8259a.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-70779af8b4c8259a.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-70779af8b4c8259a.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-70779af8b4c8259a.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-70779af8b4c8259a.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/route-70779af8b4c8259a.js +0 -1
  647. package/.next/static/chunks/app/layout-f43045c9edbc4d1f.js +0 -1
  648. package/.next/static/chunks/app/manifest.webmanifest/route-70779af8b4c8259a.js +0 -1
  649. package/.next/static/chunks/app/more/page-3963a5e56e550442.js +0 -1
  650. package/.next/static/chunks/app/proxy/[...path]/route-70779af8b4c8259a.js +0 -1
  651. package/.next/static/chunks/app/review/page-3028fe95de490236.js +0 -1
  652. package/.next/static/chunks/app/sessions/page-3f39f99b878fdda0.js +0 -1
  653. package/.next/static/chunks/app/worktrees/[id]/layout-70779af8b4c8259a.js +0 -1
  654. package/.next/static/chunks/app/worktrees/[id]/page-0305d80c8ebda4cb.js +0 -1
  655. package/.next/static/css/2c63c5531f77719e.css +0 -1
  656. /package/.next/static/{CqFH31RhKQbrRZXsMNosJ → o3mZdwNhCks6IlcAOPinc}/_buildManifest.js +0 -0
  657. /package/.next/static/{CqFH31RhKQbrRZXsMNosJ → o3mZdwNhCks6IlcAOPinc}/_ssgManifest.js +0 -0
@@ -4,7 +4,7 @@
4
4
  * Provides functions to manage tmux sessions for Claude CLI integration
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.REPAINT_INVALIDATE_DELAY_MS = exports.NAVIGATION_KEY_VALUES = exports.SPECIAL_KEY_VALUES = void 0;
7
+ exports.DIRECT_INPUT_TEXT_CHUNK_BYTES = exports.REPAINT_INVALIDATE_DELAY_MS = exports.NAVIGATION_KEY_VALUES = exports.SPECIAL_KEY_VALUES = void 0;
8
8
  exports.exactTarget = exactTarget;
9
9
  exports.reconcileSessionGeometry = reconcileSessionGeometry;
10
10
  exports.isTmuxAvailable = isTmuxAvailable;
@@ -25,6 +25,7 @@ exports.clearInputLine = clearInputLine;
25
25
  exports.clearComposerLine = clearComposerLine;
26
26
  exports.isAllowedSpecialKey = isAllowedSpecialKey;
27
27
  exports.sendSpecialKeysAndInvalidate = sendSpecialKeysAndInvalidate;
28
+ exports.sendDirectInputAndInvalidate = sendDirectInputAndInvalidate;
28
29
  const child_process_1 = require("child_process");
29
30
  const util_1 = require("util");
30
31
  const tmux_capture_cache_1 = require("./tmux-capture-cache");
@@ -34,6 +35,7 @@ const tmux_pane_config_1 = require("../../config/tmux-pane-config");
34
35
  const logger_1 = require("../../lib/logger");
35
36
  const terminal_keys_1 = require("../../types/terminal-keys");
36
37
  Object.defineProperty(exports, "NAVIGATION_KEY_VALUES", { enumerable: true, get: function () { return terminal_keys_1.NAVIGATION_KEY_VALUES; } });
38
+ const direct_input_1 = require("../../types/direct-input");
37
39
  const key_sequence_1 = require("./key-sequence");
38
40
  const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
39
41
  const logger = (0, logger_1.createLogger)('tmux');
@@ -381,11 +383,17 @@ async function sendKeys(sessionName, keys, sendEnter = true, options) {
381
383
  }
382
384
  // execFile() passes arguments directly without shell interpretation,
383
385
  // so no shell-level escaping is needed
386
+ //
387
+ // Issue #2769: tmux is NOT a shell, but it does read each argument, and a `;`
388
+ // at the end of one is its command separator. Unescaped, `go;` + `C-m` makes
389
+ // tmux run `send-keys go` and then a command called `C-m` — which fails, so
390
+ // the whole call throws and nothing reaches the pane.
391
+ const legacyKeys = (0, key_sequence_1.escapeTrailingSemicolon)(keys);
384
392
  const args = options?.literal
385
393
  ? (0, key_sequence_1.keySequenceArgs)(exactTarget(sessionName), { kind: 'literal', text: keys })
386
394
  : sendEnter
387
- ? ['send-keys', '-t', exactTarget(sessionName), keys, 'C-m']
388
- : ['send-keys', '-t', exactTarget(sessionName), keys];
395
+ ? ['send-keys', '-t', exactTarget(sessionName), legacyKeys, 'C-m']
396
+ : ['send-keys', '-t', exactTarget(sessionName), legacyKeys];
389
397
  try {
390
398
  await execFileAsync('tmux', args, { timeout: DEFAULT_TIMEOUT });
391
399
  }
@@ -494,6 +502,11 @@ const ALLOWED_SPECIAL_KEYS = new Set([
494
502
  // from user-controlled text.
495
503
  'C-x', 'C-p', 'C-t',
496
504
  'a', 'l', 'n', 't', 'm', 'g', 'u', 'r', 'c',
505
+ // Issue #2760: Command Code's plan review is approved with ctrl+a and with
506
+ // nothing else. Deliverable for every session, declared by Command Code alone
507
+ // (`COMMAND_CODE_NAVIGATION_KEY_VALUES`), so the route answers 400 for every
508
+ // other tool — the same arrangement as `s` above.
509
+ 'C-a',
497
510
  ]);
498
511
  /**
499
512
  * Type guard for "sendSpecialKeys() will actually deliver this key" (Issue #2032).
@@ -890,3 +903,51 @@ async function sendSpecialKeysAndInvalidate(sessionName, keys) {
890
903
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
891
904
  scheduleRepaintInvalidation(sessionName);
892
905
  }
906
+ /**
907
+ * Bytes of `text` per `send-keys -H` invocation (Issue #2765).
908
+ *
909
+ * `-H` takes one argv entry per byte, so a 4096-character paste sent as one
910
+ * command would be thousands of arguments. 256 keeps every invocation small and
911
+ * the number of invocations for the longest accepted paste in the dozens.
912
+ */
913
+ exports.DIRECT_INPUT_TEXT_CHUNK_BYTES = 256;
914
+ /**
915
+ * Deliver direct-input events to a pane, in order (Issue #2765).
916
+ *
917
+ * - a `key` event is a tmux key NAME from `DIRECT_INPUT_KEY_VALUES`, sent as
918
+ * `send-keys -t <target> -- <name>` so tmux translates it for the pane's
919
+ * current keypad / cursor mode;
920
+ * - a `text` event is sent as `send-keys -t <target> -H <hex bytes>`, NOT as
921
+ * `-l`: measured on tmux 3.5a, `send-keys -l -- 'a;'` delivers `a` and drops
922
+ * the trailing `;` (tmux takes it for a command separator), and `-l -- ';'`
923
+ * delivers nothing at all. `-H` has no such rule and carries UTF-8 unchanged.
924
+ *
925
+ * Every event is re-validated here, so nothing unvalidated reaches `execFile`
926
+ * even if a caller forgot to: a key outside the vocabulary throws before any
927
+ * tmux process is started.
928
+ */
929
+ async function sendDirectInputAndInvalidate(sessionName, events) {
930
+ for (const event of events) {
931
+ if (!(0, direct_input_1.isDirectInputEvent)(event)) {
932
+ throw new Error('Invalid direct input event');
933
+ }
934
+ }
935
+ const target = exactTarget(sessionName);
936
+ for (const event of events) {
937
+ if (event.type === 'key') {
938
+ await execFileAsync('tmux', ['send-keys', '-t', target, '--', event.key], {
939
+ timeout: DEFAULT_TIMEOUT,
940
+ });
941
+ continue;
942
+ }
943
+ const bytes = Buffer.from(event.text, 'utf8');
944
+ for (let offset = 0; offset < bytes.length; offset += exports.DIRECT_INPUT_TEXT_CHUNK_BYTES) {
945
+ const hex = Array.from(bytes.subarray(offset, offset + exports.DIRECT_INPUT_TEXT_CHUNK_BYTES), (byte) => byte.toString(16).padStart(2, '0'));
946
+ await execFileAsync('tmux', ['send-keys', '-t', target, '-H', ...hex], {
947
+ timeout: DEFAULT_TIMEOUT,
948
+ });
949
+ }
950
+ }
951
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
952
+ scheduleRepaintInvalidation(sessionName);
953
+ }
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ /**
3
+ * Direct terminal input vocabulary (Issue #2764).
4
+ *
5
+ * The "direct input" mode sends what the user types straight to an agent's tmux
6
+ * pane, without asking the detection layer what is on screen. It exists for the
7
+ * frames detection cannot read: an overlay that needs a key no button offers
8
+ * (Command Code's plan review wants `ctrl+a`) used to leave the session with no
9
+ * way forward from the browser.
10
+ *
11
+ * Values and pure functions only — no tmux, no DOM — so this module is safe to
12
+ * import from the server, the CLI and the browser bundle alike, the same
13
+ * property `terminal-keys.ts` keeps.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.MAX_DIRECT_INPUT_TEXT_LENGTH = exports.MAX_DIRECT_INPUT_EVENTS = exports.DIRECT_INPUT_KEY_VALUES = exports.DIRECT_INPUT_CTRL_KEY_VALUES = exports.DIRECT_INPUT_NAMED_KEY_VALUES = void 0;
17
+ exports.isDirectInputKey = isDirectInputKey;
18
+ exports.isDirectInputEvent = isDirectInputEvent;
19
+ exports.encodeKeyEvent = encodeKeyEvent;
20
+ /** tmux key names direct input may send. Each one was measured on tmux 3.5a. */
21
+ exports.DIRECT_INPUT_NAMED_KEY_VALUES = [
22
+ 'Enter', 'Escape', 'Tab', 'BTab', 'BSpace', 'DC',
23
+ 'Up', 'Down', 'Left', 'Right',
24
+ 'Home', 'End', 'PageUp', 'PageDown',
25
+ ];
26
+ /** `C-a` … `C-z`. tmux 3.5a delivers these as 0x01 … 0x1a. */
27
+ exports.DIRECT_INPUT_CTRL_KEY_VALUES = [
28
+ 'C-a', 'C-b', 'C-c', 'C-d', 'C-e', 'C-f', 'C-g', 'C-h', 'C-i', 'C-j', 'C-k', 'C-l', 'C-m',
29
+ 'C-n', 'C-o', 'C-p', 'C-q', 'C-r', 'C-s', 'C-t', 'C-u', 'C-v', 'C-w', 'C-x', 'C-y', 'C-z',
30
+ ];
31
+ exports.DIRECT_INPUT_KEY_VALUES = [
32
+ ...exports.DIRECT_INPUT_NAMED_KEY_VALUES,
33
+ ...exports.DIRECT_INPUT_CTRL_KEY_VALUES,
34
+ ];
35
+ /** Most events one request may carry. */
36
+ exports.MAX_DIRECT_INPUT_EVENTS = 32;
37
+ /** Longest `text` one event may carry, in UTF-16 code units (a paste). */
38
+ exports.MAX_DIRECT_INPUT_TEXT_LENGTH = 4096;
39
+ function isDirectInputKey(value) {
40
+ return typeof value === 'string' && exports.DIRECT_INPUT_KEY_VALUES.includes(value);
41
+ }
42
+ function isDirectInputEvent(value) {
43
+ if (typeof value !== 'object' || value === null)
44
+ return false;
45
+ const event = value;
46
+ if (event.type === 'key')
47
+ return isDirectInputKey(event.key);
48
+ if (event.type === 'text') {
49
+ return (typeof event.text === 'string' &&
50
+ event.text.length > 0 &&
51
+ event.text.length <= exports.MAX_DIRECT_INPUT_TEXT_LENGTH);
52
+ }
53
+ return false;
54
+ }
55
+ /**
56
+ * The `keyCode` every browser gives a keydown the IME is handling. No physical
57
+ * key maps to it, so treating it as "not ours" costs ordinary typing nothing.
58
+ */
59
+ const IME_PROCESS_KEY_CODE = 229;
60
+ const NAMED_KEY_BY_DOM_KEY = {
61
+ Enter: 'Enter',
62
+ Escape: 'Escape',
63
+ Backspace: 'BSpace',
64
+ Delete: 'DC',
65
+ ArrowUp: 'Up',
66
+ ArrowDown: 'Down',
67
+ ArrowLeft: 'Left',
68
+ ArrowRight: 'Right',
69
+ Home: 'Home',
70
+ End: 'End',
71
+ PageUp: 'PageUp',
72
+ PageDown: 'PageDown',
73
+ };
74
+ /**
75
+ * Turn one keydown into the event to send, or `null` to leave it to the browser.
76
+ *
77
+ * `null` is an answer, not a failure: the caller must NOT `preventDefault()` on
78
+ * it, so Cmd+C / Cmd+V / Cmd+R, IME composition and function keys keep working.
79
+ *
80
+ * IME is checked twice because `isComposing` alone misses the key that matters
81
+ * most (Issue #2801). Safari before WebKit 310826@main fires the Enter that
82
+ * commits a composition AFTER `compositionend`, with `isComposing: false` — so
83
+ * the committed text would reach the pane followed by an Enter the user meant
84
+ * for the IME, submitting the composer or confirming a dialog's highlighted
85
+ * option. That keydown still carries `keyCode` 229, the same test
86
+ * `MessageInput` uses.
87
+ */
88
+ function encodeKeyEvent(event) {
89
+ if (event.isComposing === true || event.keyCode === IME_PROCESS_KEY_CODE)
90
+ return null;
91
+ if (event.metaKey || event.altKey)
92
+ return null;
93
+ if (event.key === 'Tab') {
94
+ if (event.ctrlKey)
95
+ return null;
96
+ return { type: 'key', key: event.shiftKey ? 'BTab' : 'Tab' };
97
+ }
98
+ if (event.ctrlKey) {
99
+ if (event.key.length !== 1)
100
+ return null;
101
+ const candidate = `C-${event.key.toLowerCase()}`;
102
+ return isDirectInputKey(candidate) ? { type: 'key', key: candidate } : null;
103
+ }
104
+ const named = NAMED_KEY_BY_DOM_KEY[event.key];
105
+ if (named !== undefined)
106
+ return { type: 'key', key: named };
107
+ // A printable key: `KeyboardEvent.key` is the character itself, which is one
108
+ // code point (one or two UTF-16 units). `Dead`, `Shift`, `F5`, `Process`,
109
+ // `Unidentified` … are all longer than one code point and fall through.
110
+ if ([...event.key].length === 1)
111
+ return { type: 'text', text: event.key };
112
+ return null;
113
+ }
@@ -5,9 +5,10 @@
5
5
  * Types for sidebar components and branch status display
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.EXITED_STATUS_REASON = exports.deriveCliStatus = void 0;
8
+ exports.UNCLASSIFIED_STATUS_WORD = exports.EXITED_STATUS_REASON = exports.isUnclassifiedCliStatus = exports.deriveCliStatus = void 0;
9
9
  exports.aggregateCliStatus = aggregateCliStatus;
10
10
  exports.formatCliStatusBreakdown = formatCliStatusBreakdown;
11
+ exports.isBranchUnclassified = isBranchUnclassified;
11
12
  exports.deriveWorktreeWaitingDetail = deriveWorktreeWaitingDetail;
12
13
  exports.calculateHasUnread = calculateHasUnread;
13
14
  exports.toBranchItem = toBranchItem;
@@ -15,6 +16,7 @@ const types_1 = require("../lib/cli-tools/types");
15
16
  const default_agents_1 = require("../config/default-agents");
16
17
  const status_mapping_1 = require("../lib/session/status-mapping");
17
18
  Object.defineProperty(exports, "deriveCliStatus", { enumerable: true, get: function () { return status_mapping_1.deriveCliStatus; } });
19
+ Object.defineProperty(exports, "isUnclassifiedCliStatus", { enumerable: true, get: function () { return status_mapping_1.isUnclassifiedCliStatus; } });
18
20
  const next_action_helper_1 = require("../lib/session/next-action-helper");
19
21
  /**
20
22
  * The `sessionStatusReason` token that means "the pane is there, the agent is
@@ -28,6 +30,18 @@ const next_action_helper_1 = require("../lib/session/next-action-helper");
28
30
  * restatement cannot drift.
29
31
  */
30
32
  exports.EXITED_STATUS_REASON = 'exited';
33
+ /**
34
+ * The status word the breakdown tooltip prints for an instance whose frame no
35
+ * rule could classify (Issue #2775), in place of the `ready` its triple derives.
36
+ *
37
+ * Not a `BranchStatus` member, and deliberately so: a sixth value would ripple
38
+ * into the colours, the sort order (`STATUS_PRIORITY`) and the emphasis tiers,
39
+ * which is the cost #2070 declined for `exited` too. The instance keeps its
40
+ * `ready` in `cliStatus`; `unclassifiedInstanceIds` says which `ready` is a
41
+ * fallback. Raw English like the other words in the breakdown, which prints
42
+ * `BranchStatus` tokens verbatim.
43
+ */
44
+ exports.UNCLASSIFIED_STATUS_WORD = 'unknown';
31
45
  /**
32
46
  * `BranchStatus` → `SessionStatus`, so the sidebar can reuse `getNextAction`
33
47
  * (Issue #1787) instead of growing a second next-action table.
@@ -93,19 +107,48 @@ function aggregateCliStatus(cliStatus) {
93
107
  * because the word is user-facing and therefore localized, and this module
94
108
  * runs on the server where `t()` cannot be called (the same rule
95
109
  * `NEXT_ACTION_KEYS` follows).
110
+ * @param unclassifiedInstanceIds - Instances whose `ready` is a fallback for a
111
+ * frame nothing could read (Issue #2775). Their status word becomes
112
+ * {@link UNCLASSIFIED_STATUS_WORD} — `Codex: unknown` — because the `ready`
113
+ * the entry carries is exactly what is not known. Only a `ready` entry is
114
+ * rewritten, so a caller cannot relabel a real reading with it.
96
115
  * @returns Comma-separated "Label: status" string ('' when empty/absent)
97
116
  */
98
- function formatCliStatusBreakdown(cliStatus, labels, exitedSuffix) {
117
+ function formatCliStatusBreakdown(cliStatus, labels, exitedSuffix, unclassifiedInstanceIds) {
99
118
  if (!cliStatus)
100
119
  return '';
101
120
  return Object.entries(cliStatus)
102
121
  .map(([instanceId, status]) => {
103
122
  const label = labels?.[instanceId] ?? (0, types_1.getCliToolDisplayNameSafe)(instanceId, instanceId);
104
123
  const suffix = exitedSuffix?.(instanceId);
105
- return `${label}: ${status ?? 'idle'}${suffix ? ` (${suffix})` : ''}`;
124
+ const word = status === 'ready' && unclassifiedInstanceIds?.has(instanceId)
125
+ ? exports.UNCLASSIFIED_STATUS_WORD
126
+ : (status ?? 'idle');
127
+ return `${label}: ${word}${suffix ? ` (${suffix})` : ''}`;
106
128
  })
107
129
  .join(', ');
108
130
  }
131
+ /**
132
+ * Whether the sidebar's ONE aggregated dot should read "cannot tell"
133
+ * (Issue #2775).
134
+ *
135
+ * True when the aggregate is `ready` and at least one of the instances that
136
+ * made it `ready` is only `ready` because its frame could not be read. The
137
+ * precedence this gives is waiting > running/generating > cannot-tell > ready
138
+ * > idle: a reading of work in progress outranks a blind spot, but a blind spot
139
+ * outranks a sibling that is merely idle — the unreadable pane is the one a
140
+ * human should look at, and it may well be hiding a dialog.
141
+ *
142
+ * @param cliStatus - Per-instance status map (`SidebarBranchItem.cliStatus`)
143
+ * @param unclassifiedInstanceIds - `SidebarBranchItem.unclassifiedInstanceIds`
144
+ */
145
+ function isBranchUnclassified(cliStatus, unclassifiedInstanceIds) {
146
+ if (!cliStatus || !unclassifiedInstanceIds || unclassifiedInstanceIds.length === 0)
147
+ return false;
148
+ if (aggregateCliStatus(cliStatus) !== 'ready')
149
+ return false;
150
+ return unclassifiedInstanceIds.some((id) => cliStatus[id] === 'ready');
151
+ }
109
152
  /** Precedence for folding per-instance kinds: answerable-now wins (Issue #1786). */
110
153
  const WAITING_KIND_PRECEDENCE = [
111
154
  'prompt',
@@ -200,6 +243,7 @@ function deriveSidebarCliStatus(worktree) {
200
243
  const cliStatus = {};
201
244
  const cliStatusLabels = {};
202
245
  const exitedInstanceIds = [];
246
+ const unclassifiedInstanceIds = [];
203
247
  const byInstance = worktree.sessionStatusByInstance;
204
248
  // Legacy fallback: no per-instance data → key by selectedAgents / CLI tool.
205
249
  if (!byInstance) {
@@ -210,8 +254,11 @@ function deriveSidebarCliStatus(worktree) {
210
254
  if (worktree.sessionStatusByCli?.[agent]?.sessionStatusReason === exports.EXITED_STATUS_REASON) {
211
255
  exitedInstanceIds.push(agent);
212
256
  }
257
+ if ((0, status_mapping_1.isUnclassifiedCliStatus)(worktree.sessionStatusByCli?.[agent])) {
258
+ unclassifiedInstanceIds.push(agent);
259
+ }
213
260
  }
214
- return { cliStatus, cliStatusLabels, exitedInstanceIds };
261
+ return { cliStatus, cliStatusLabels, exitedInstanceIds, unclassifiedInstanceIds };
215
262
  }
216
263
  // Configured roster: explicit agentInstances, else primaries per selectedAgents.
217
264
  const roster = worktree.agentInstances && worktree.agentInstances.length > 0
@@ -225,6 +272,9 @@ function deriveSidebarCliStatus(worktree) {
225
272
  if (byInstance[instance.id]?.sessionStatusReason === exports.EXITED_STATUS_REASON) {
226
273
  exitedInstanceIds.push(instance.id);
227
274
  }
275
+ if ((0, status_mapping_1.isUnclassifiedCliStatus)(byInstance[instance.id])) {
276
+ unclassifiedInstanceIds.push(instance.id);
277
+ }
228
278
  }
229
279
  // Surface any RUNNING instance missing from the roster (e.g. a `claude`
230
280
  // session started even though claude is not in selectedAgents) so the
@@ -237,8 +287,11 @@ function deriveSidebarCliStatus(worktree) {
237
287
  continue;
238
288
  cliStatus[instanceId] = derived;
239
289
  cliStatusLabels[instanceId] = labelForUnknownInstance(instanceId);
290
+ if ((0, status_mapping_1.isUnclassifiedCliStatus)(status)) {
291
+ unclassifiedInstanceIds.push(instanceId);
292
+ }
240
293
  }
241
- return { cliStatus, cliStatusLabels, exitedInstanceIds };
294
+ return { cliStatus, cliStatusLabels, exitedInstanceIds, unclassifiedInstanceIds };
242
295
  }
243
296
  /**
244
297
  * Convert Worktree to SidebarBranchItem for display
@@ -261,11 +314,15 @@ function toBranchItem(worktree) {
261
314
  // agentInstances) so instances outside selectedAgents and alias instances are
262
315
  // reflected. Falls back to the legacy selectedAgents path when no per-instance
263
316
  // data is present.
264
- const { cliStatus, cliStatusLabels, exitedInstanceIds } = deriveSidebarCliStatus(worktree);
317
+ const { cliStatus, cliStatusLabels, exitedInstanceIds, unclassifiedInstanceIds } = deriveSidebarCliStatus(worktree);
265
318
  // Issue #1787: the row's emphasis and its "what do I do next" label both come
266
319
  // from the AGGREGATED status, matching the single dot the row renders.
267
320
  const aggregated = aggregateCliStatus(cliStatus);
268
321
  const { waitingKind, awaitingInstruction } = deriveWorktreeWaitingDetail(worktree);
322
+ // Issue #2775: when that dot reads "cannot tell", so does the next action.
323
+ // `getNextAction` would answer "Send message" for the `ready` underneath,
324
+ // which is advice about a state nobody observed.
325
+ const unclassified = isBranchUnclassified(cliStatus, unclassifiedInstanceIds);
269
326
  return {
270
327
  id: worktree.id,
271
328
  name: worktree.name,
@@ -277,6 +334,7 @@ function toBranchItem(worktree) {
277
334
  cliStatus,
278
335
  cliStatusLabels,
279
336
  exitedInstanceIds,
337
+ unclassifiedInstanceIds,
280
338
  worktreePath: worktree.path,
281
339
  waitingKind,
282
340
  awaitingInstruction,
@@ -287,6 +345,8 @@ function toBranchItem(worktree) {
287
345
  // would be a bug the user cannot explain. `isStalled` is server-only
288
346
  // (`isWorktreeStalled` needs the detector's timers), so the sidebar never
289
347
  // claims "Check stalled".
290
- nextActionKey: (0, next_action_helper_1.getNextAction)(BRANCH_STATUS_TO_SESSION_STATUS[aggregated], aggregated === 'waiting' ? 'approval' : null, false),
348
+ nextActionKey: unclassified
349
+ ? undefined
350
+ : (0, next_action_helper_1.getNextAction)(BRANCH_STATUS_TO_SESSION_STATUS[aggregated], aggregated === 'waiting' ? 'approval' : null, false),
291
351
  };
292
352
  }
@@ -19,7 +19,7 @@
19
19
  * Values only — no tmux process access — so this module is safe from any layer.
20
20
  */
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.SESSION_SCOPE_KEY_TOOL_IDS = exports.CLAUDE_NAVIGATION_KEY_VALUES = exports.NAVIGATION_KEY_VALUES = exports.SESSION_SCOPE_KEY = exports.ANSWER_KEY_VALUES = void 0;
22
+ exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.PLAN_APPROVE_KEY_TOOL_IDS = exports.COMMAND_CODE_NAVIGATION_KEY_VALUES = exports.PLAN_APPROVE_KEY = exports.SESSION_SCOPE_KEY_TOOL_IDS = exports.CLAUDE_NAVIGATION_KEY_VALUES = exports.NAVIGATION_KEY_VALUES = exports.SESSION_SCOPE_KEY = exports.ANSWER_KEY_VALUES = void 0;
23
23
  /**
24
24
  * The characters a dialog is answered WITH rather than navigated by (Issue #2254).
25
25
  *
@@ -141,6 +141,36 @@ exports.CLAUDE_NAVIGATION_KEY_VALUES = [
141
141
  * the "values only, safe from any layer" property its header depends on.
142
142
  */
143
143
  exports.SESSION_SCOPE_KEY_TOOL_IDS = ['claude', 'command-code'];
144
+ /**
145
+ * The key that approves Command Code's plan review (Issue #2760).
146
+ *
147
+ * That overlay ends in `Approve ctrl+a executes the plan` / `Cancel esc`, and
148
+ * ctrl+a is the ONLY way to approve it (measured on 1.58.0 at 200x1000). A tmux
149
+ * key name, delivered as 0x01.
150
+ *
151
+ * In neither the shared pad nor the claude-family pad: on claude's composer
152
+ * ctrl+a is "move to the start of the line", so there is no screen of claude's
153
+ * that a button for it could serve.
154
+ */
155
+ exports.PLAN_APPROVE_KEY = 'C-a';
156
+ /**
157
+ * What a Command Code pane may be sent: the claude-family pad plus
158
+ * {@link PLAN_APPROVE_KEY}.
159
+ *
160
+ * Returned by `CommandCodeTool.navigationKeys()`. `CLAUDE_NAVIGATION_KEY_VALUES`
161
+ * itself is untouched, so claude's vocabulary does not widen by a single key.
162
+ */
163
+ exports.COMMAND_CODE_NAVIGATION_KEY_VALUES = [
164
+ ...exports.CLAUDE_NAVIGATION_KEY_VALUES,
165
+ exports.PLAN_APPROVE_KEY,
166
+ ];
167
+ /**
168
+ * The tool ids whose `navigationKeys()` carry {@link PLAN_APPROVE_KEY}.
169
+ *
170
+ * Read by the chat surface, which cannot call `navigationKeys()` — the same
171
+ * reason and the same shape as {@link SESSION_SCOPE_KEY_TOOL_IDS}.
172
+ */
173
+ exports.PLAN_APPROVE_KEY_TOOL_IDS = ['command-code'];
144
174
  // ---------------------------------------------------------------------------
145
175
  // Per-tool vocabularies (Issue #2046)
146
176
  // ---------------------------------------------------------------------------
@@ -226,6 +256,8 @@ exports.TERMINAL_KEY_VALUES = [
226
256
  ...exports.NAVIGATION_KEY_VALUES,
227
257
  // Issue #2297: claude / Command Code declare it; nothing else does.
228
258
  exports.SESSION_SCOPE_KEY,
259
+ // Issue #2760: Command Code alone declares it.
260
+ exports.PLAN_APPROVE_KEY,
229
261
  exports.OPENCODE_LEADER_KEY,
230
262
  ...exports.OPENCODE_DIRECT_KEY_VALUES,
231
263
  // Issue #2254: `n` is in the base pad now — see OPENCODE_CHORD_ONLY_VALUES.
@@ -128,6 +128,33 @@ export declare const CLAUDE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left
128
128
  * the "values only, safe from any layer" property its header depends on.
129
129
  */
130
130
  export declare const SESSION_SCOPE_KEY_TOOL_IDS: readonly ["claude", "command-code"];
131
+ /**
132
+ * The key that approves Command Code's plan review (Issue #2760).
133
+ *
134
+ * That overlay ends in `Approve ctrl+a executes the plan` / `Cancel esc`, and
135
+ * ctrl+a is the ONLY way to approve it (measured on 1.58.0 at 200x1000). A tmux
136
+ * key name, delivered as 0x01.
137
+ *
138
+ * In neither the shared pad nor the claude-family pad: on claude's composer
139
+ * ctrl+a is "move to the start of the line", so there is no screen of claude's
140
+ * that a button for it could serve.
141
+ */
142
+ export declare const PLAN_APPROVE_KEY = "C-a";
143
+ /**
144
+ * What a Command Code pane may be sent: the claude-family pad plus
145
+ * {@link PLAN_APPROVE_KEY}.
146
+ *
147
+ * Returned by `CommandCodeTool.navigationKeys()`. `CLAUDE_NAVIGATION_KEY_VALUES`
148
+ * itself is untouched, so claude's vocabulary does not widen by a single key.
149
+ */
150
+ export declare const COMMAND_CODE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n", "s", "C-a"];
151
+ /**
152
+ * The tool ids whose `navigationKeys()` carry {@link PLAN_APPROVE_KEY}.
153
+ *
154
+ * Read by the chat surface, which cannot call `navigationKeys()` — the same
155
+ * reason and the same shape as {@link SESSION_SCOPE_KEY_TOOL_IDS}.
156
+ */
157
+ export declare const PLAN_APPROVE_KEY_TOOL_IDS: readonly ["command-code"];
131
158
  /**
132
159
  * opencode's leader prefix — the first half of a two-step chord.
133
160
  *
@@ -180,7 +207,7 @@ export declare const OPENCODE_NAVIGATION_KEY_VALUES: readonly ["Up", "Down", "Le
180
207
  * `tests/unit/cli-tools/navigation-keys-declaration-2046.test.ts` pin both
181
208
  * halves.
182
209
  */
183
- export declare const TERMINAL_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n", "s", "C-x", "C-p", "C-t", "a", "l", "t", "m", "g", "u", "r", "c"];
210
+ export declare const TERMINAL_KEY_VALUES: readonly ["Up", "Down", "Left", "Right", "Enter", "Escape", "Tab", "BTab", "PageUp", "PageDown", "Home", "End", "q", "1", "2", "3", "4", "5", "6", "7", "8", "9", "y", "n", "s", "C-a", "C-x", "C-p", "C-t", "a", "l", "t", "m", "g", "u", "r", "c"];
184
211
  /** Any key name a tool may declare in its {@link NavigationKeySpec}. */
185
212
  export type TerminalKey = typeof TERMINAL_KEY_VALUES[number];
186
213
  //# sourceMappingURL=terminal-keys.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-keys.d.ts","sourceRoot":"","sources":["../../src/types/terminal-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,iBAAiB,kEAGpB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,6KAQxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,4BAA4B,kLAG/B,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,qCAAsC,CAAC;AAM9E;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,4BAA4B,wDAE/B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,yBAA0B,CAAC;AAsBlE;;;GAGG;AACH,eAAO,MAAM,8BAA8B,0OAKjC,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,+OAQtB,CAAC;AAEX,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"terminal-keys.d.ts","sourceRoot":"","sources":["../../src/types/terminal-keys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,iBAAiB,kEAGpB,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,6KAQxB,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,OAAO,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,4BAA4B,kLAG/B,CAAC;AAEX;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,qCAAsC,CAAC;AAE9E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AAEtC;;;;;;GAMG;AACH,eAAO,MAAM,kCAAkC,yLAGrC,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,2BAA4B,CAAC;AAMnE;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,4BAA4B,wDAE/B,CAAC;AAEX;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,yBAA0B,CAAC;AAsBlE;;;GAGG;AACH,eAAO,MAAM,8BAA8B,0OAKjC,CAAC;AAEX;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,mBAAmB,sPAUtB,CAAC;AAEX,wEAAwE;AACxE,MAAM,MAAM,WAAW,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC"}
@@ -19,7 +19,7 @@
19
19
  * Values only — no tmux process access — so this module is safe from any layer.
20
20
  */
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
- exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.SESSION_SCOPE_KEY_TOOL_IDS = exports.CLAUDE_NAVIGATION_KEY_VALUES = exports.NAVIGATION_KEY_VALUES = exports.SESSION_SCOPE_KEY = exports.ANSWER_KEY_VALUES = void 0;
22
+ exports.TERMINAL_KEY_VALUES = exports.OPENCODE_NAVIGATION_KEY_VALUES = exports.OPENCODE_DIRECT_KEY_VALUES = exports.OPENCODE_LEADER_CHORD_VALUES = exports.OPENCODE_LEADER_KEY = exports.PLAN_APPROVE_KEY_TOOL_IDS = exports.COMMAND_CODE_NAVIGATION_KEY_VALUES = exports.PLAN_APPROVE_KEY = exports.SESSION_SCOPE_KEY_TOOL_IDS = exports.CLAUDE_NAVIGATION_KEY_VALUES = exports.NAVIGATION_KEY_VALUES = exports.SESSION_SCOPE_KEY = exports.ANSWER_KEY_VALUES = void 0;
23
23
  /**
24
24
  * The characters a dialog is answered WITH rather than navigated by (Issue #2254).
25
25
  *
@@ -141,6 +141,36 @@ exports.CLAUDE_NAVIGATION_KEY_VALUES = [
141
141
  * the "values only, safe from any layer" property its header depends on.
142
142
  */
143
143
  exports.SESSION_SCOPE_KEY_TOOL_IDS = ['claude', 'command-code'];
144
+ /**
145
+ * The key that approves Command Code's plan review (Issue #2760).
146
+ *
147
+ * That overlay ends in `Approve ctrl+a executes the plan` / `Cancel esc`, and
148
+ * ctrl+a is the ONLY way to approve it (measured on 1.58.0 at 200x1000). A tmux
149
+ * key name, delivered as 0x01.
150
+ *
151
+ * In neither the shared pad nor the claude-family pad: on claude's composer
152
+ * ctrl+a is "move to the start of the line", so there is no screen of claude's
153
+ * that a button for it could serve.
154
+ */
155
+ exports.PLAN_APPROVE_KEY = 'C-a';
156
+ /**
157
+ * What a Command Code pane may be sent: the claude-family pad plus
158
+ * {@link PLAN_APPROVE_KEY}.
159
+ *
160
+ * Returned by `CommandCodeTool.navigationKeys()`. `CLAUDE_NAVIGATION_KEY_VALUES`
161
+ * itself is untouched, so claude's vocabulary does not widen by a single key.
162
+ */
163
+ exports.COMMAND_CODE_NAVIGATION_KEY_VALUES = [
164
+ ...exports.CLAUDE_NAVIGATION_KEY_VALUES,
165
+ exports.PLAN_APPROVE_KEY,
166
+ ];
167
+ /**
168
+ * The tool ids whose `navigationKeys()` carry {@link PLAN_APPROVE_KEY}.
169
+ *
170
+ * Read by the chat surface, which cannot call `navigationKeys()` — the same
171
+ * reason and the same shape as {@link SESSION_SCOPE_KEY_TOOL_IDS}.
172
+ */
173
+ exports.PLAN_APPROVE_KEY_TOOL_IDS = ['command-code'];
144
174
  // ---------------------------------------------------------------------------
145
175
  // Per-tool vocabularies (Issue #2046)
146
176
  // ---------------------------------------------------------------------------
@@ -226,6 +256,8 @@ exports.TERMINAL_KEY_VALUES = [
226
256
  ...exports.NAVIGATION_KEY_VALUES,
227
257
  // Issue #2297: claude / Command Code declare it; nothing else does.
228
258
  exports.SESSION_SCOPE_KEY,
259
+ // Issue #2760: Command Code alone declares it.
260
+ exports.PLAN_APPROVE_KEY,
229
261
  exports.OPENCODE_LEADER_KEY,
230
262
  ...exports.OPENCODE_DIRECT_KEY_VALUES,
231
263
  // Issue #2254: `n` is in the base pad now — see OPENCODE_CHORD_ONLY_VALUES.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.39.0",
3
+ "version": "0.40.0",
4
4
  "description": "A local control plane for agent CLIs — orchestration and visibility for Claude Code, Codex, Gemini CLI, and more across Git worktrees",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -44,7 +44,8 @@
44
44
  "build:all": "npm run build && npm run build:cli && npm run build:server",
45
45
  "prepublishOnly": "npm run build:all",
46
46
  "start": "NODE_ENV=production node dist/server/server.js",
47
- "lint": "eslint src --ext .js,.jsx,.ts,.tsx",
47
+ "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.mjs,.cjs",
48
+ "lint:sh": "shellcheck -x -P scripts --severity=style --exclude=SC2086,SC2317,SC2116 $(find scripts tests/scripts .claude/lib -name '*.sh')",
48
49
  "check:tracking": "./scripts/check-commandmate-tracking.sh",
49
50
  "check:detector-freshness": "tsx scripts/check-detector-freshness.ts",
50
51
  "test": "NODE_ENV=test vitest",
package/public/sw.js CHANGED
@@ -108,7 +108,7 @@ async function offlineFallback(request) {
108
108
  // Navigation responses are intentionally NOT cached: they may contain
109
109
  // authenticated content. Only the offline fallback page is served on error.
110
110
  return await fetch(request);
111
- } catch (err) {
111
+ } catch {
112
112
  const cache = await caches.open(CACHE_NAME);
113
113
  const offline = await cache.match(OFFLINE_URL);
114
114
  return offline || Response.error();
@@ -123,7 +123,7 @@ self.addEventListener('fetch', function (event) {
123
123
  let url;
124
124
  try {
125
125
  url = new URL(request.url);
126
- } catch (err) {
126
+ } catch {
127
127
  return;
128
128
  }
129
129
 
@@ -197,7 +197,7 @@ function replaceStaleNotifications(title, options) {
197
197
  stale[i].close();
198
198
  }
199
199
  })
200
- .catch(function (err) {
200
+ .catch(function (_err) {
201
201
  // A registration that cannot enumerate its notifications still has to
202
202
  // show one. Showing the replacement below is what keeps the promise;
203
203
  // on this path the tag alone collapses the stale card on most engines.
@@ -213,7 +213,7 @@ self.addEventListener('push', function (event) {
213
213
  var payload = {};
214
214
  try {
215
215
  payload = event.data ? event.data.json() : {};
216
- } catch (err) {
216
+ } catch {
217
217
  payload = {};
218
218
  }
219
219
 
@@ -275,7 +275,7 @@ self.addEventListener('notificationclick', function (event) {
275
275
  if (new URL(client.url).pathname === targetUrl && 'focus' in client) {
276
276
  return client.focus();
277
277
  }
278
- } catch (err) {
278
+ } catch {
279
279
  // ignore malformed client URL
280
280
  }
281
281
  }
@@ -0,0 +1,29 @@
1
+ {
2
+ "version": "0.39.1",
3
+ "date": "2026-09-20",
4
+ "highlight": {
5
+ "ja": "パソコンでは設定がダイアログで開くようになり、画面を移動せずに変更できます。モーダルが背景のクリックで閉じない問題も直しました。",
6
+ "en": "On a computer, settings now open in a dialog so you can change them without leaving the page. Clicking outside a dialog to close it also works again."
7
+ },
8
+ "added": [
9
+ {
10
+ "ja": "サイドバーの下部から設定を開けるようになりました。",
11
+ "en": "You can now open settings from the bottom of the sidebar."
12
+ },
13
+ {
14
+ "ja": "パソコンでは、設定が画面を移動せずダイアログで開くようになりました。",
15
+ "en": "On a computer, settings now open in a dialog instead of moving you to another page."
16
+ }
17
+ ],
18
+ "improved": [],
19
+ "fixed": [
20
+ {
21
+ "ja": "ダイアログの外側をクリックしても閉じないことがある問題を直しました。",
22
+ "en": "Fixed dialogs sometimes not closing when you clicked outside them."
23
+ },
24
+ {
25
+ "ja": "スマートフォンで、画面下のナビゲーションに本文がわずかに重なる問題を直しました。",
26
+ "en": "Fixed content slightly overlapping the bottom navigation bar on phones."
27
+ }
28
+ ]
29
+ }