commandmate 0.42.2 → 0.43.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 (421) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +148 -148
  3. package/.next/app-path-routes-manifest.json +25 -25
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update-check/route.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  21. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js.nft.json +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 +103 -1
  31. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  32. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  34. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  45. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  46. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/relays/route.js +1 -1
  48. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  49. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/clone/route.js +1 -1
  56. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/restore/route.js +1 -1
  60. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/route.js +1 -1
  63. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/scan/route.js +1 -1
  66. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/sync/route.js +1 -1
  69. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  73. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  74. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/[id]/route.js +1 -1
  78. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/skills/route.js +1 -1
  83. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/slash-commands/route.js +1 -1
  85. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
  104. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/route.js +1 -103
  173. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
  176. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
  179. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
  182. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
  186. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +104 -2
  189. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/route.js +1 -1
  225. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  230. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/worktrees/[id]/page.js +9 -9
  241. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  243. package/.next/server/app-paths-manifest.json +25 -25
  244. package/.next/server/chunks/1068.js +1 -1
  245. package/.next/server/chunks/1210.js +1 -1
  246. package/.next/server/chunks/1501.js +3 -3
  247. package/.next/server/chunks/1990.js +1 -1
  248. package/.next/server/chunks/2119.js +1 -1
  249. package/.next/server/chunks/22.js +1 -1
  250. package/.next/server/chunks/2328.js +1 -1
  251. package/.next/server/chunks/2404.js +4 -3
  252. package/.next/server/chunks/2445.js +1 -1
  253. package/.next/server/chunks/252.js +1 -1
  254. package/.next/server/chunks/2816.js +1 -1
  255. package/.next/server/chunks/3543.js +1 -1
  256. package/.next/server/chunks/3730.js +1 -1
  257. package/.next/server/chunks/3945.js +1 -1
  258. package/.next/server/chunks/4207.js +3 -3
  259. package/.next/server/chunks/5064.js +1 -1
  260. package/.next/server/chunks/5571.js +1 -1
  261. package/.next/server/chunks/5742.js +1 -1
  262. package/.next/server/chunks/5775.js +1 -1
  263. package/.next/server/chunks/611.js +1 -1
  264. package/.next/server/chunks/6130.js +1 -1
  265. package/.next/server/chunks/6285.js +1 -1
  266. package/.next/server/chunks/6491.js +103 -0
  267. package/.next/server/chunks/6661.js +1 -1
  268. package/.next/server/chunks/6781.js +1 -1
  269. package/.next/server/chunks/6793.js +1 -1
  270. package/.next/server/chunks/7491.js +3 -0
  271. package/.next/server/chunks/7685.js +1 -1
  272. package/.next/server/chunks/7905.js +1 -1
  273. package/.next/server/chunks/8581.js +2 -2
  274. package/.next/server/chunks/8673.js +6 -6
  275. package/.next/server/chunks/8728.js +2 -2
  276. package/.next/server/chunks/8791.js +1 -1
  277. package/.next/server/chunks/8800.js +4 -3
  278. package/.next/server/chunks/8918.js +5 -5
  279. package/.next/server/chunks/9130.js +3 -3
  280. package/.next/server/chunks/{8052.js → 9353.js} +4 -2
  281. package/.next/server/chunks/9390.js +3 -0
  282. package/.next/server/chunks/9627.js +3 -3
  283. package/.next/server/chunks/967.js +1 -0
  284. package/.next/server/chunks/9731.js +3 -3
  285. package/.next/server/chunks/9882.js +3 -3
  286. package/.next/server/middleware-manifest.json +5 -5
  287. package/.next/server/pages/500.html +1 -1
  288. package/.next/server/server-reference-manifest.json +1 -1
  289. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  290. package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-940df9b11fadafc6.js} +1 -1
  291. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  292. package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
  293. package/.next/static/chunks/7705-1f58d4c03d991fcf.js +1 -0
  294. package/.next/static/chunks/8165-3525fb42f1b4976e.js +1 -0
  295. package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-057c850cd0df978e.js} +1 -1
  296. package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
  297. package/.next/static/chunks/app/skills/[skillId]/page-74aac15286504ef4.js +1 -0
  298. package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
  299. package/.next/static/chunks/app/worktrees/[id]/page-eab0bf7564d3f9e2.js +1 -0
  300. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  301. package/.next/trace +13 -13
  302. package/README.md +3 -3
  303. package/dist/cli/commands/ask.d.ts.map +1 -1
  304. package/dist/cli/commands/ask.js +23 -149
  305. package/dist/cli/commands/reply.d.ts +40 -0
  306. package/dist/cli/commands/reply.d.ts.map +1 -0
  307. package/dist/cli/commands/reply.js +133 -0
  308. package/dist/cli/commands/wait.d.ts +5 -0
  309. package/dist/cli/commands/wait.d.ts.map +1 -1
  310. package/dist/cli/commands/wait.js +10 -1
  311. package/dist/cli/docs/agent-operations.d.ts +2 -2
  312. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  313. package/dist/cli/docs/agent-operations.js +13 -0
  314. package/dist/cli/program.d.ts.map +1 -1
  315. package/dist/cli/program.js +4 -0
  316. package/dist/cli/utils/reply-ledger.d.ts +95 -0
  317. package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
  318. package/dist/cli/utils/reply-ledger.js +187 -0
  319. package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
  320. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
  321. package/dist/lib/cli-tools/copilot-executable.js +21 -5
  322. package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
  323. package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
  324. package/dist/lib/cli-tools/opencode-executable.js +179 -0
  325. package/dist/lib/cli-tools/types.d.ts +1 -1
  326. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  327. package/dist/lib/cli-tools/types.js +5 -1
  328. package/dist/lib/detection/tools/verified-against.d.ts +15 -0
  329. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  330. package/dist/lib/detection/tools/verified-against.js +17 -1
  331. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  332. package/dist/lib/detection/version-probes.js +14 -1
  333. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
  334. package/dist/lib/session/tmux-session-surface.js +1 -1
  335. package/dist/server/locales/en/worktree.json +44 -14
  336. package/dist/server/locales/ja/worktree.json +44 -14
  337. package/dist/server/server.js +23 -0
  338. package/dist/server/src/config/cli-tool-timing-config.js +19 -1
  339. package/dist/server/src/config/detection-evidence-config.js +3 -0
  340. package/dist/server/src/config/schedule-config.js +55 -1
  341. package/dist/server/src/lib/auto-yes-poller.js +47 -4
  342. package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
  343. package/dist/server/src/lib/cli-tools/base.js +6 -2
  344. package/dist/server/src/lib/cli-tools/command-code.js +55 -1
  345. package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
  346. package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
  347. package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
  348. package/dist/server/src/lib/cli-tools/index.js +3 -1
  349. package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
  350. package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
  351. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  352. package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
  353. package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
  354. package/dist/server/src/lib/cli-tools/opencode.js +29 -5
  355. package/dist/server/src/lib/cli-tools/types.js +5 -1
  356. package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
  357. package/dist/server/src/lib/cmate-parser.js +12 -0
  358. package/dist/server/src/lib/cmate-validator.js +13 -1
  359. package/dist/server/src/lib/detection/cli-patterns.js +78 -2
  360. package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
  361. package/dist/server/src/lib/detection/status-detector.js +10 -1
  362. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
  363. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
  364. package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
  365. package/dist/server/src/lib/detection/tools/registry.js +2 -0
  366. package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
  367. package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
  368. package/dist/server/src/lib/detection/upstream-faults.js +8 -0
  369. package/dist/server/src/lib/detection/version-probes.js +14 -1
  370. package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
  371. package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
  372. package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
  373. package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
  374. package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
  375. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
  376. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
  377. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
  378. package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
  379. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
  380. package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
  381. package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
  382. package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
  383. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
  384. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
  385. package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
  386. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
  387. package/dist/server/src/lib/hooks/sources/registry.js +2 -0
  388. package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
  389. package/dist/server/src/lib/job-executor.js +2 -1
  390. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
  391. package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
  392. package/dist/server/src/lib/relay/relay-delivery.js +4 -1
  393. package/dist/server/src/lib/session/agent-event-state.js +24 -0
  394. package/dist/server/src/lib/session/claude-executor.js +184 -10
  395. package/dist/server/src/lib/session/current-output-builder.js +27 -3
  396. package/dist/server/src/lib/session/send-user-message.js +4 -0
  397. package/dist/server/src/lib/session/structured-prompt.js +54 -0
  398. package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
  399. package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
  400. package/dist/server/src/lib/tmux/tmux.js +48 -2
  401. package/dist/server/src/lib/verification/env-clean-gate.js +87 -5
  402. package/dist/server/src/types/cli-tool-contracts.js +10 -2
  403. package/dist/types/cli-tool-contracts.d.ts +16 -5
  404. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  405. package/dist/types/cli-tool-contracts.js +10 -2
  406. package/package.json +2 -1
  407. package/release-notes/0.43.0.json +130 -0
  408. package/scripts/hooks/cmate-agent-event.sh +14 -0
  409. package/scripts/opencode-v2/launch.sh +226 -0
  410. package/.next/server/chunks/4443.js +0 -3
  411. package/.next/server/chunks/5164.js +0 -1
  412. package/.next/server/chunks/650.js +0 -1
  413. package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
  414. package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
  415. package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
  416. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
  417. package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
  418. package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
  419. package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
  420. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_buildManifest.js +0 -0
  421. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → BVkBYdceLRvMROqQIqeBx}/_ssgManifest.js +0 -0
@@ -35,12 +35,15 @@
35
35
  */
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
37
  exports.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH = exports.STRUCTURED_DECISION_OPTIONS = void 0;
38
+ exports.structuredDecisionOptionsFor = structuredDecisionOptionsFor;
38
39
  exports.isAddressableDecision = isAddressableDecision;
40
+ exports.hasApiAnswerableDecision = hasApiAnswerableDecision;
39
41
  exports.buildStructuredPromptQuestion = buildStructuredPromptQuestion;
40
42
  exports.buildStructuredPromptData = buildStructuredPromptData;
41
43
  exports.buildStructuredPromptHistoryRecord = buildStructuredPromptHistoryRecord;
42
44
  exports.isStructuredPromptWaitingData = isStructuredPromptWaitingData;
43
45
  const models_1 = require("../../types/models");
46
+ const decision_labels_1 = require("../../lib/hooks/sources/opencode-v2/decision-labels");
44
47
  /**
45
48
  * The three verdicts an approval dialog accepts, in the order `respond` numbers
46
49
  * them (Issue #1898).
@@ -67,6 +70,32 @@ exports.STRUCTURED_DECISION_OPTIONS = [
67
70
  // eslint-disable-next-line no-restricted-syntax -- CLI answer vocabulary, not display text
68
71
  { number: 3, label: 'Reject', reply: 'reject' },
69
72
  ];
73
+ /**
74
+ * A tool's own words for the approval verdicts, keyed by wire reply
75
+ * (Issue #2951). Only tools whose dialog words differ from
76
+ * {@link STRUCTURED_DECISION_OPTIONS} are here: OpenCode V2 draws `Always allow`
77
+ * where v1 draws `Allow always`.
78
+ */
79
+ const DECISION_LABELS_BY_TOOL = {
80
+ 'opencode-v2': decision_labels_1.OPENCODE_V2_DECISION_LABELS,
81
+ };
82
+ /**
83
+ * The approval verdicts in the words of the tool that asked (Issue #2951).
84
+ *
85
+ * What `capture --json` publishes as `decisionOptions` and what `respond`
86
+ * matches a label against, so both say what the tool's own dialog says. Only
87
+ * the LABEL differs per tool: the number and the wire reply are the shared
88
+ * list's, so `2` still means `always` everywhere. Every tool without its own
89
+ * words gets {@link STRUCTURED_DECISION_OPTIONS} itself (the same object).
90
+ *
91
+ * @param cliToolId - The tool the approval belongs to
92
+ */
93
+ function structuredDecisionOptionsFor(cliToolId) {
94
+ const labels = DECISION_LABELS_BY_TOOL[cliToolId];
95
+ if (!labels)
96
+ return exports.STRUCTURED_DECISION_OPTIONS;
97
+ return exports.STRUCTURED_DECISION_OPTIONS.map((option) => labels[option.reply] ? { ...option, label: labels[option.reply] } : option);
98
+ }
70
99
  /** Bound on the agent's `message`, which is prose and only ever displayed. */
71
100
  exports.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH = 500;
72
101
  /**
@@ -89,6 +118,31 @@ exports.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH = 500;
89
118
  function isAddressableDecision(value) {
90
119
  return typeof value === 'string' && value !== '';
91
120
  }
121
+ /**
122
+ * Whether the agent is holding a decision this server can answer over the
123
+ * agent's own API right now (Issue #2965).
124
+ *
125
+ * The gate on the two "the detection layer could not read this" rows — the
126
+ * unclassified-frame row and the structured-prompt row
127
+ * ({@link buildStructuredPromptQuestion}). Both exist to record a dialog nobody
128
+ * could answer; while this is true somebody can, by id, and the row is a
129
+ * meaningless line in the chat (OpenCode V2 approvals and questions, #2945;
130
+ * v1 opencode's approvals, which carry the same `permission-id`). All three
131
+ * conjuncts are required, and each failing one puts the row back — the safe
132
+ * side:
133
+ *
134
+ * - the source publishes per-decision ids (`eventIdentity: 'permission-id'`);
135
+ * - a pending decision carries one ({@link isAddressableDecision});
136
+ * - its delivery window has not expired (a verdict can still reach the agent).
137
+ *
138
+ * @param eventIdentity - `capabilities.eventIdentity` of the tool's event source
139
+ * @param pendingDecisions - the decisions the turn is holding, as published
140
+ */
141
+ function hasApiAnswerableDecision(eventIdentity, pendingDecisions) {
142
+ if (eventIdentity !== 'permission-id')
143
+ return false;
144
+ return pendingDecisions.some((decision) => isAddressableDecision(decision.id) && !decision.deliveryExpired);
145
+ }
92
146
  /** How each source reads in the one-line question. */
93
147
  const SOURCE_LABEL = {
94
148
  notification: 'Notification(permission_prompt)',
@@ -343,7 +343,7 @@ function isLiveAttachEligibleSession(sessionName) {
343
343
  * `tests/unit/tmux/session-surface-2317.test.ts`, so a tool moving in or out of
344
344
  * the alternate screen breaks a test rather than silently dropping the hint.
345
345
  */
346
- exports.ALT_SCREEN_TOOLS = ['claude', 'opencode', 'copilot'];
346
+ exports.ALT_SCREEN_TOOLS = ['claude', 'opencode', 'copilot', 'opencode-v2'];
347
347
  /** Whether `attach` should warn that a bare attach shows no transcript. */
348
348
  function usesAltScreen(cliToolId) {
349
349
  return exports.ALT_SCREEN_TOOLS.includes(cliToolId);
@@ -81,6 +81,7 @@ const NOT_MEASURED_SKIP_REASON_KEY = 'skills.compatibility.skipReason.notMeasure
81
81
  exports.AGENT_RELOAD_MESSAGE_KEYS = {
82
82
  SESSION_RESTART: 'skills.compatibility.reload.sessionRestart',
83
83
  SESSION_RESTART_NO_SLASH: 'skills.compatibility.reload.sessionRestartNoSlash',
84
+ PICKED_UP_LIVE: 'skills.compatibility.reload.pickedUpLive',
84
85
  UNKNOWN: 'skills.compatibility.reload.unknown',
85
86
  };
86
87
  /** Known limitation keys attached to an axis outcome. */
@@ -113,6 +114,15 @@ const MEASURED_DATE_2026_09_05 = '2026-09-05';
113
114
  * deliberately *not* recorded as a row — see the `gemini` entry below.
114
115
  */
115
116
  const OTHER_AGENTS_EVIDENCE_SOURCE = 'https://github.com/Kewton/CommandMate/blob/main/docs/reference/skill-agent-compatibility.md#9-gemini--copilot-probe-log-issue-2302';
117
+ /**
118
+ * Evidence reference for the OpenCode V2 (opencode2) 2.0.18 measurement
119
+ * (Issue #2975).
120
+ *
121
+ * The reference doc carries the harness, the controls and the raw
122
+ * `GET /api/skill` / message output.
123
+ */
124
+ const OPENCODE_V2_EVIDENCE_SOURCE = 'https://github.com/Kewton/CommandMate/blob/main/docs/reference/skill-agent-compatibility.md#10-opencode-v2-probe-log-issue-2975';
125
+ const MEASURED_DATE_2026_09_29 = '2026-09-29';
116
126
  function unmeasuredEntry(agent) {
117
127
  return {
118
128
  agent,
@@ -345,6 +355,61 @@ const AGENT_DISCOVERY_MATRIX = [
345
355
  reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.SESSION_RESTART,
346
356
  skipReasonKey: null,
347
357
  },
358
+ {
359
+ agent: 'opencode-v2',
360
+ // Issue #2975, opencode2 2.0.18. Measured on its own rather than copied off
361
+ // the v1 row: the values happen to match v1's, but the release, the day and
362
+ // the route that makes invocation work are different.
363
+ //
364
+ // Ten probe Skills were planted, one per candidate root, each told to
365
+ // answer a unique token. `GET /api/skill` returned eight of them with their
366
+ // absolute SKILL.md paths — project `.opencode/skills`, `.opencode/skill`,
367
+ // `.claude/skills`, `.agents/skills`; home `.claude/skills`,
368
+ // `.agents/skills`, `.config/opencode/skills`, `.config/opencode/skill` —
369
+ // and not the two negative controls (`.github/skills`,
370
+ // `$HOME/.opencode/skills`). Both CommandMate install roots are among the
371
+ // eight, and the byte-identical dual-root install is listed once.
372
+ discoveryRoots: [constants_1.SKILL_INSTALL_ROOT_PREFIX, constants_1.SKILL_CLAUDE_INSTALL_ROOT_PREFIX],
373
+ discovery: {
374
+ outcome: 'verified',
375
+ evidenceKind: 'mechanical',
376
+ labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
377
+ evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
378
+ limitationKey: null,
379
+ },
380
+ invocation: {
381
+ // Submitting `/probe-agents-root ` produced a `skill` tool part with
382
+ // `input.id: "probe-agents-root"` and the Skill's absolute directory in
383
+ // its metadata, and the agent answered `PROBE_OK_probe-agents-root`;
384
+ // `.claude/skills` did the same with its own token. Unlike v1 the TUI
385
+ // does not expand the Skill — the user message is the literal
386
+ // `/probe-agents-root ` (a markdown command, by contrast, is replaced by
387
+ // its template) — so it is the model calling the `skill` tool. The tool
388
+ // part is the discriminator, not the token: `/probe-home-dotopencode-root`
389
+ // (never discovered) came back with a *different* Skill's token.
390
+ //
391
+ // The limitation is the same as v1's: typing the name after `/` shows
392
+ // "No matching commands" (positive control `/rev` → `/review`, negative
393
+ // control `/zzzznotacommand` → nothing), and the `ctrl+p` palette has no
394
+ // row for it either. What v2 adds is an `@` completion — `@probe` lists
395
+ // every discovered Skill tagged `skill`, and the `/skills` picker inserts
396
+ // `@name` — so v2 does have its own way in, just not a slash command.
397
+ outcome: 'verified',
398
+ evidenceKind: 'mechanical',
399
+ labelKey: exports.AGENT_AXIS_OUTCOME_LABEL_KEYS.verified,
400
+ evidenceKindKey: exports.AGENT_EVIDENCE_KIND_LABEL_KEYS.mechanical,
401
+ limitationKey: exports.AGENT_LIMITATION_MESSAGE_KEYS.NO_SLASH_COMMAND,
402
+ },
403
+ testedVersion: '2.0.18',
404
+ testedDate: MEASURED_DATE_2026_09_29,
405
+ evidenceSource: OPENCODE_V2_EVIDENCE_SOURCE,
406
+ // Also measured, and the opposite of v1: the server does NOT need a
407
+ // restart. A Skill planted while it ran appeared in `GET /api/skill` within
408
+ // seconds, and one planted into `$HOME/.agents/skills` mid-session was run
409
+ // in that same session — so the guidance is "no new session needed".
410
+ reloadKey: exports.AGENT_RELOAD_MESSAGE_KEYS.PICKED_UP_LIVE,
411
+ skipReasonKey: null,
412
+ },
348
413
  ];
349
414
  /** The measured matrix, in CLI-tool declaration order. */
350
415
  function getSkillAgentMatrix() {
@@ -254,6 +254,33 @@ async function listSessions() {
254
254
  return [];
255
255
  }
256
256
  }
257
+ /**
258
+ * Issue #2958: what window 0 of a new session runs until `createSession`
259
+ * replaces it with the login shell. Two words so tmux execs it directly (a
260
+ * single word would be run through `default-shell -c`); it never exits on its
261
+ * own and dies with the SIGHUP the replacement sends.
262
+ */
263
+ const PLACEHOLDER_PANE_COMMAND = ['sleep', '2147483647'];
264
+ /**
265
+ * Fallback for a failed window rebuild: swap the placeholder in window 0 for
266
+ * the login shell tmux would have started (`default-shell`, as a login shell).
267
+ *
268
+ * A bare `respawn-pane` would re-run the pane's creation command — the
269
+ * placeholder — so the shell is named explicitly.
270
+ */
271
+ async function respawnLoginShell(sessionName, workingDirectory) {
272
+ let shell = '';
273
+ try {
274
+ const { stdout } = await execFileAsync('tmux', ['show-options', '-gv', 'default-shell'], { timeout: DEFAULT_TIMEOUT });
275
+ shell = stdout.trim();
276
+ }
277
+ catch {
278
+ // Fall through to the environment's shell.
279
+ }
280
+ if (!shell)
281
+ shell = process.env.SHELL || '/bin/sh';
282
+ await execFileAsync('tmux', ['respawn-pane', '-k', '-t', `${exactTarget(sessionName)}0`, '-c', workingDirectory, shell, '-l'], { timeout: DEFAULT_TIMEOUT });
283
+ }
257
284
  /**
258
285
  * Create a new tmux session
259
286
  *
@@ -300,7 +327,23 @@ async function createSession(sessionNameOrOptions, cwd) {
300
327
  try {
301
328
  // Create session with explicit window size to avoid 80x24 default
302
329
  // This is critical for TUI tools (Copilot, OpenCode) that use alternate screen
303
- await execFileAsync('tmux', ['new-session', '-d', '-s', sessionName, '-c', workingDirectory, '-x', String(windowWidth), '-y', String(windowHeight)], { timeout: DEFAULT_TIMEOUT });
330
+ //
331
+ // Issue #2958: window 0 runs a PLACEHOLDER, not the login shell, because it
332
+ // is thrown away by the `new-window -k` below a few milliseconds later. A
333
+ // shell killed that early is still inside its rc files, and pyenv's
334
+ // `pyenv init -` (`command pyenv rehash`) can die holding its lock file
335
+ // (`$PYENV_ROOT/shims/.pyenv-shim`). The NEXT shell then spins in
336
+ // `pyenv rehash` for its 60s lock timeout before running the launch command,
337
+ // so the agent missed the 60s initialization wait (exit 99). Measured on tmux
338
+ // 3.5a / pyenv 2.6.0: 7 of 40 shell-first creations left the lock behind and
339
+ // the replacement pane ran its first command after 61s; 0 of 40 with the
340
+ // placeholder. Two argv words make tmux exec it directly, so no shell (and
341
+ // no rc file) is started for window 0 at all.
342
+ await execFileAsync('tmux', [
343
+ 'new-session', '-d', '-s', sessionName, '-c', workingDirectory,
344
+ '-x', String(windowWidth), '-y', String(windowHeight),
345
+ ...PLACEHOLDER_PANE_COMMAND,
346
+ ], { timeout: DEFAULT_TIMEOUT });
304
347
  // Issue #1624: `history-limit` must be set BEFORE the pane that uses it exists.
305
348
  //
306
349
  // It is a session option, but a pane sizes its scrollback buffer ONCE, from
@@ -324,7 +367,9 @@ async function createSession(sessionNameOrOptions, cwd) {
324
367
  // cwd instead). Omitting it silently launches every agent in the wrong repo.
325
368
  //
326
369
  // Best-effort, matching the geometry step below: if this fails the session is
327
- // still usable, just with tmux's default 2000-line scrollback.
370
+ // still usable, just with tmux's default 2000-line scrollback. Window 0 is
371
+ // only a placeholder (Issue #2958), so the fallback must still put the login
372
+ // shell into it — see respawnLoginShell().
328
373
  try {
329
374
  await execFileAsync('tmux', ['new-window', '-k', '-t', `${exactTarget(sessionName)}0`, '-c', workingDirectory], { timeout: DEFAULT_TIMEOUT });
330
375
  }
@@ -334,6 +379,7 @@ async function createSession(sessionNameOrOptions, cwd) {
334
379
  historyLimit,
335
380
  error: error instanceof Error ? error.message : String(error),
336
381
  });
382
+ await respawnLoginShell(sessionName, workingDirectory);
337
383
  }
338
384
  // Issue #1163: Pin the pane to a fixed height so alternate-screen TUIs
339
385
  // (Claude/Codex/etc.) keep enough visible rows for capture-pane.
@@ -31,10 +31,12 @@
31
31
  * @module lib/verification/env-clean-gate
32
32
  */
33
33
  Object.defineProperty(exports, "__esModule", { value: true });
34
- exports.ENV_CLEAN_GUIDANCE = exports.MAX_REPORTED_ENV_CHANGES = exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT = exports.REQUIRE_ENV_CLEAN_SOURCE_CONFIG = void 0;
34
+ exports.ENV_CLEAN_GUIDANCE = exports.MAX_REPORTED_ENV_CHANGES = exports.readLivePidCwd = exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT = exports.REQUIRE_ENV_CLEAN_SOURCE_CONFIG = void 0;
35
35
  exports.resolveRequireEnvClean = resolveRequireEnvClean;
36
36
  exports.attributeSessionName = attributeSessionName;
37
37
  exports.attributeAnchor = attributeAnchor;
38
+ exports.demoVitestPid = demoVitestPid;
39
+ exports.attributeHomeEntry = attributeHomeEntry;
38
40
  exports.resolveTaskSessionName = resolveTaskSessionName;
39
41
  exports.recordTaskSession = recordTaskSession;
40
42
  exports.readTaskSession = readTaskSession;
@@ -46,6 +48,8 @@ exports.diffEnvSnapshots = diffEnvSnapshots;
46
48
  exports.formatEnvCleanReport = formatEnvCleanReport;
47
49
  exports.envCleanNoBaseline = envCleanNoBaseline;
48
50
  exports.evaluateEnvClean = evaluateEnvClean;
51
+ const child_process_1 = require("child_process");
52
+ const fs_1 = require("fs");
49
53
  const path_1 = require("path");
50
54
  const session_name_1 = require("../../lib/cli-tools/session-name");
51
55
  const types_1 = require("../../lib/cli-tools/types");
@@ -138,16 +142,92 @@ function attributeAnchor(anchor, worktreePath) {
138
142
  return 'other';
139
143
  return 'unattributed';
140
144
  }
141
- function attributeEntry(probeId, entry, context) {
145
+ /** Bounded like the snapshot probes: a hung `lsof` must not hold a run open. */
146
+ const PID_CWD_TIMEOUT_MS = 5_000;
147
+ /**
148
+ * Read a process's cwd from the machine: `/proc/<pid>/cwd` on Linux, `lsof` on
149
+ * macOS (which has no procfs). A dead pid, a process owned by someone this user
150
+ * cannot inspect, or a missing `lsof` all answer null — which leaves the entry
151
+ * unattributed, the strict verdict.
152
+ */
153
+ const readLivePidCwd = (pid) => {
154
+ try {
155
+ process.kill(pid, 0);
156
+ }
157
+ catch (error) {
158
+ // EPERM means the process exists but belongs to another user.
159
+ if (error.code !== 'EPERM')
160
+ return null;
161
+ }
162
+ if (process.platform === 'linux') {
163
+ try {
164
+ return (0, fs_1.readlinkSync)(`/proc/${pid}/cwd`);
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ }
170
+ try {
171
+ const out = (0, child_process_1.execFileSync)('lsof', ['-a', '-d', 'cwd', '-p', String(pid), '-F', 'n'], {
172
+ encoding: 'utf8',
173
+ timeout: PID_CWD_TIMEOUT_MS,
174
+ stdio: ['ignore', 'pipe', 'ignore'],
175
+ });
176
+ const line = out.split('\n').find((field) => field.startsWith('n'));
177
+ return line ? line.slice(1) : null;
178
+ }
179
+ catch {
180
+ return null;
181
+ }
182
+ };
183
+ exports.readLivePidCwd = readLivePidCwd;
184
+ /**
185
+ * `tests/unit/skills/demo-video/env-scripts.test.ts` creates
186
+ * `~/.commandmate-demo-vitest-<pid>` for the length of its run — in the real
187
+ * `$HOME`, because `env-up.sh` refuses `/tmp` and `/var` (#2954). The name
188
+ * carries the pid of the test process that made it, which is the one `$HOME`
189
+ * entry whose owner can be established.
190
+ */
191
+ const DEMO_VITEST_HOME_ENTRY = /^\.commandmate-demo-vitest-([1-9]\d*)$/;
192
+ /** The pid a `.commandmate-demo-vitest-<pid>` name carries; null for any other name. */
193
+ function demoVitestPid(name) {
194
+ const match = DEMO_VITEST_HOME_ENTRY.exec(name);
195
+ if (!match)
196
+ return null;
197
+ const pid = Number(match[1]);
198
+ return Number.isSafeInteger(pid) ? pid : null;
199
+ }
200
+ /**
201
+ * Attribute a `$HOME` entry (#2954).
202
+ *
203
+ * Only `.commandmate-demo-vitest-<pid>` can be attributed, and only while its
204
+ * pid is alive: the test process's cwd is then judged exactly as a listener's
205
+ * is ({@link attributeAnchor}), so a parallel worktree's test run is `other`.
206
+ * A dead pid, an unreadable cwd, or a cwd inside this worktree leave it
207
+ * unattributed — a directory this worker's own tests failed to remove is still
208
+ * caught.
209
+ */
210
+ function attributeHomeEntry(name, worktreePath, resolvePidCwd = exports.readLivePidCwd) {
211
+ const pid = demoVitestPid(name);
212
+ if (pid === null)
213
+ return 'unattributed';
214
+ const owner = attributeAnchor(resolvePidCwd(pid), worktreePath);
215
+ // `self` is not an excuse for an addition, and a file has no self to report.
216
+ return owner === 'other' ? 'other' : 'unattributed';
217
+ }
218
+ function attributeEntry(probeId, entry, context, resolvePidCwd) {
142
219
  switch (probeId) {
143
220
  case 'tmux-sessions':
144
221
  return attributeSessionName(entry.key, context.worktreeId);
145
222
  case 'listeners':
146
223
  return attributeAnchor(entry.anchor, context.worktreePath);
224
+ case 'home-entries':
225
+ return attributeHomeEntry(entry.key, context.worktreePath, resolvePidCwd);
147
226
  default:
148
227
  // A file has no owner. `$HOME` and `~/.commandmate` are shared, so an
149
228
  // entry appearing there is a violation for whoever is being judged — the
150
- // rule the Issue's incident list is made of.
229
+ // rule the Issue's incident list is made of. The one `$HOME` exception is
230
+ // above (#2954).
151
231
  return 'unattributed';
152
232
  }
153
233
  }
@@ -305,6 +385,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
305
385
  const taskSession = readTaskSession(baseline);
306
386
  const otherServerSessions = readOtherServerSessions(baseline);
307
387
  const ignoredHomeEntries = new Set(options.ignoreHomeEntries ?? []);
388
+ const resolvePidCwd = options.resolvePidCwd ?? exports.readLivePidCwd;
308
389
  const probes = env_snapshot_1.ENV_PROBE_IDS.map((probeId) => {
309
390
  const before = baseline.probes[probeId];
310
391
  const after = final.probes[probeId];
@@ -346,7 +427,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
346
427
  for (const entry of after.entries) {
347
428
  if (beforeKeys.has(entry.key))
348
429
  continue;
349
- const owner = attributeEntry(probeId, entry, context);
430
+ const owner = attributeEntry(probeId, entry, context, resolvePidCwd);
350
431
  if (isIgnoredByConfig(entry)) {
351
432
  ignoredByConfig.push(toChange(entry, owner));
352
433
  continue;
@@ -370,7 +451,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
370
451
  for (const entry of before.entries) {
371
452
  if (afterKeys.has(entry.key))
372
453
  continue;
373
- const change = toChange(entry, attributeEntry(probeId, entry, context));
454
+ const change = toChange(entry, attributeEntry(probeId, entry, context, resolvePidCwd));
374
455
  if (isIgnoredByConfig(entry)) {
375
456
  ignoredByConfig.push(change);
376
457
  }
@@ -552,6 +633,7 @@ async function evaluateEnvClean(input) {
552
633
  }
553
634
  const diff = diffEnvSnapshots(input.baseline, final, input, {
554
635
  ignoreHomeEntries: input.ignoreHomeEntries,
636
+ resolvePidCwd: input.resolvePidCwd,
555
637
  });
556
638
  const header = `${verify_config_1.ENV_CLEAN_GATE_ID}: baseline=${new Date(input.baseline.capturedAt).toISOString()} ` +
557
639
  `status=${diff.status} task-session=${describeTaskSession(diff.taskSession)}`;
@@ -96,11 +96,18 @@ exports.GRACEFUL_EXIT_FAILURE_REASONS = ['graceful_exit_timeout', 'port_orphaned
96
96
  * | `manual` | claude | `⏸ manual mode on` |
97
97
  * | `auto` | claude | `⏵⏵ auto mode on` |
98
98
  * | `accept-edits` | claude / Command Code / agy | `⏵⏵ accept edits on`, `» accept edits on`, `accept-edits ·` |
99
- * | `plan` | all five | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan` |
99
+ * | `plan` | all six | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan`, `┃ Plan · <model>` |
100
100
  * | `autopilot` | copilot | `autopilot` in the hint bar |
101
101
  * | `bypass` | Command Code (NOT in its cycle) | `» permission bypass on` |
102
102
  * | `dont-ask` | Command Code (NOT in its cycle) | `» don't-ask on` |
103
103
  * | `default` | Command Code | `? for shortcuts` (its own row) |
104
+ * | `build` | OpenCode V2 (Issue #3038) | `┃ Build · <model>` under the composer |
105
+ *
106
+ * `build` is OpenCode V2's AGENT, not a permission mode, and it is its own id
107
+ * rather than `default` on purpose: the chip says what the pane says (#2592).
108
+ * OpenCode V2's `shift+tab` toggles `Build` ⇄ `Plan` agents, and the button
109
+ * carries the `opencodeAgentSwitch` note so the "permission mode" wording of
110
+ * its aria label is not the whole story.
104
111
  *
105
112
  * `bypass` and `dont-ask` are declared even though `shift+tab` cannot REACH
106
113
  * them, and that is the point: a user who put Command Code in one of those from
@@ -118,6 +125,7 @@ exports.AGENT_MODE_IDS = [
118
125
  'autopilot',
119
126
  'bypass',
120
127
  'dont-ask',
128
+ 'build',
121
129
  ];
122
130
  /**
123
131
  * The verdict for a frame nothing in {@link AgentModeSpec.indicators} matched.
@@ -146,4 +154,4 @@ function isAgentModeId(value) {
146
154
  * translated (`.eslintrc.json`'s i18n rule, Issue #1271), and because the tool
147
155
  * declaring it has no way to call `useTranslations()`.
148
156
  */
149
- exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled'];
157
+ exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled', 'opencodeAgentSwitch'];
@@ -418,11 +418,18 @@ export type ToolLivenessVerdict = {
418
418
  * | `manual` | claude | `⏸ manual mode on` |
419
419
  * | `auto` | claude | `⏵⏵ auto mode on` |
420
420
  * | `accept-edits` | claude / Command Code / agy | `⏵⏵ accept edits on`, `» accept edits on`, `accept-edits ·` |
421
- * | `plan` | all five | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan` |
421
+ * | `plan` | all six | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan`, `┃ Plan · <model>` |
422
422
  * | `autopilot` | copilot | `autopilot` in the hint bar |
423
423
  * | `bypass` | Command Code (NOT in its cycle) | `» permission bypass on` |
424
424
  * | `dont-ask` | Command Code (NOT in its cycle) | `» don't-ask on` |
425
425
  * | `default` | Command Code | `? for shortcuts` (its own row) |
426
+ * | `build` | OpenCode V2 (Issue #3038) | `┃ Build · <model>` under the composer |
427
+ *
428
+ * `build` is OpenCode V2's AGENT, not a permission mode, and it is its own id
429
+ * rather than `default` on purpose: the chip says what the pane says (#2592).
430
+ * OpenCode V2's `shift+tab` toggles `Build` ⇄ `Plan` agents, and the button
431
+ * carries the `opencodeAgentSwitch` note so the "permission mode" wording of
432
+ * its aria label is not the whole story.
426
433
  *
427
434
  * `bypass` and `dont-ask` are declared even though `shift+tab` cannot REACH
428
435
  * them, and that is the point: a user who put Command Code in one of those from
@@ -431,7 +438,7 @@ export type ToolLivenessVerdict = {
431
438
  * 1.53.1, where `? for shortcuts` is drawn in every mode, that fall-through is
432
439
  * a chip that says `default` while the agent bypasses permissions.
433
440
  */
434
- export declare const AGENT_MODE_IDS: readonly ["default", "manual", "accept-edits", "plan", "auto", "autopilot", "bypass", "dont-ask"];
441
+ export declare const AGENT_MODE_IDS: readonly ["default", "manual", "accept-edits", "plan", "auto", "autopilot", "bypass", "dont-ask", "build"];
435
442
  /** One permission mode a supported CLI can be in. */
436
443
  export type AgentModeId = typeof AGENT_MODE_IDS[number];
437
444
  /**
@@ -482,7 +489,7 @@ export interface AgentModeIndicator {
482
489
  * translated (`.eslintrc.json`'s i18n rule, Issue #1271), and because the tool
483
490
  * declaring it has no way to call `useTranslations()`.
484
491
  */
485
- export declare const AGENT_MODE_NOTE_IDS: readonly ["codexModelCoupled"];
492
+ export declare const AGENT_MODE_NOTE_IDS: readonly ["codexModelCoupled", "opencodeAgentSwitch"];
486
493
  /** Which caution one tool's mode button carries, if any. */
487
494
  export type AgentModeNoteId = typeof AGENT_MODE_NOTE_IDS[number];
488
495
  /**
@@ -516,7 +523,7 @@ export type AgentModeNoteId = typeof AGENT_MODE_NOTE_IDS[number];
516
523
  */
517
524
  export interface AgentModeSpec {
518
525
  /**
519
- * The key that advances the cycle — `BTab` for all five declaring tools.
526
+ * The key that advances the cycle — `BTab` for all six declaring tools.
520
527
  *
521
528
  * Declared rather than hard-coded so the invariant above is checkable, and so
522
529
  * a tool that moves its binding changes one line.
@@ -554,10 +561,14 @@ export interface AgentModeSpec {
554
561
  /**
555
562
  * A caution this tool's button must carry, or `null`.
556
563
  *
557
- * codex alone today: its modes are coupled to the model and reasoning effort
564
+ * codex: its modes are coupled to the model and reasoning effort
558
565
  * (`xhigh` ⇄ `medium`, measured 2026-09-16), so one press of a button labelled
559
566
  * "mode" also moves the model tier. Issue #2592 §「設計に効く事実」4 requires
560
567
  * that be visible rather than discovered.
568
+ *
569
+ * OpenCode V2 (Issue #3038): its `shift+tab` switches the AGENT (`Build`,
570
+ * which edits, ⇄ `Plan`, which only reads) rather than a permission mode, so
571
+ * the note says what the button actually switches.
561
572
  */
562
573
  readonly noteId: AgentModeNoteId | null;
563
574
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-tool-contracts.d.ts","sourceRoot":"","sources":["../../src/types/cli-tool-contracts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-tool-contracts.d.ts","sourceRoot":"","sources":["../../src/types/cli-tool-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAMnD;;;;;;;;GAQG;AACH,eAAO,MAAM,sBAAsB,mDAAoD,CAAC;AAExF,2DAA2D;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,MAAM,WAAW,GACnB;IACE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,GACD;IACE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEN,wBAAwB;AACxB,wBAAgB,OAAO,CACrB,IAAI,EAAE,kBAAkB,EACxB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAEvC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAI3C;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,GAChB,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAEnD;AAED,yDAAyD;AACzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC,CAE1F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,kBAAkB,CAE7E;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI,CAAC;CACxC;AAMD;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG,cAAc,GAAG,YAAY,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;CACvC;AAMD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,qDAAsD,CAAC;AAEjG,4EAA4E;AAC5E,MAAM,MAAM,yBAAyB,GAAG,OAAO,6BAA6B,CAAC,MAAM,CAAC,CAAC;AAErF;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAMvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IAChD,qEAAqE;IACrE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C;;;OAGG;IACH,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,6EAA6E;IAC7E,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,qEAAqE;IACrE,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/C;;;;;;;;OAQG;IACH,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GACxB;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAMvD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,cAAc,4GAUjB,CAAC;AAEX,qDAAqD;AACrD,MAAM,MAAM,WAAW,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAExD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,OAAO,kBAAkB,CAAC;AAEhE,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,WAAW,CAEjE;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,uDAAwD,CAAC;AAEzF,4DAA4D;AAC5D,MAAM,MAAM,eAAe,GAAG,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAEjE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAC;IAC1B;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,CAAC;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;CACzC"}
@@ -96,11 +96,18 @@ exports.GRACEFUL_EXIT_FAILURE_REASONS = ['graceful_exit_timeout', 'port_orphaned
96
96
  * | `manual` | claude | `⏸ manual mode on` |
97
97
  * | `auto` | claude | `⏵⏵ auto mode on` |
98
98
  * | `accept-edits` | claude / Command Code / agy | `⏵⏵ accept edits on`, `» accept edits on`, `accept-edits ·` |
99
- * | `plan` | all five | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan` |
99
+ * | `plan` | all six | `⏸ plan mode on`, `plan mode`, `Plan mode (shift+tab to cycle)`, `plan`, `┃ Plan · <model>` |
100
100
  * | `autopilot` | copilot | `autopilot` in the hint bar |
101
101
  * | `bypass` | Command Code (NOT in its cycle) | `» permission bypass on` |
102
102
  * | `dont-ask` | Command Code (NOT in its cycle) | `» don't-ask on` |
103
103
  * | `default` | Command Code | `? for shortcuts` (its own row) |
104
+ * | `build` | OpenCode V2 (Issue #3038) | `┃ Build · <model>` under the composer |
105
+ *
106
+ * `build` is OpenCode V2's AGENT, not a permission mode, and it is its own id
107
+ * rather than `default` on purpose: the chip says what the pane says (#2592).
108
+ * OpenCode V2's `shift+tab` toggles `Build` ⇄ `Plan` agents, and the button
109
+ * carries the `opencodeAgentSwitch` note so the "permission mode" wording of
110
+ * its aria label is not the whole story.
104
111
  *
105
112
  * `bypass` and `dont-ask` are declared even though `shift+tab` cannot REACH
106
113
  * them, and that is the point: a user who put Command Code in one of those from
@@ -118,6 +125,7 @@ exports.AGENT_MODE_IDS = [
118
125
  'autopilot',
119
126
  'bypass',
120
127
  'dont-ask',
128
+ 'build',
121
129
  ];
122
130
  /**
123
131
  * The verdict for a frame nothing in {@link AgentModeSpec.indicators} matched.
@@ -146,4 +154,4 @@ function isAgentModeId(value) {
146
154
  * translated (`.eslintrc.json`'s i18n rule, Issue #1271), and because the tool
147
155
  * declaring it has no way to call `useTranslations()`.
148
156
  */
149
- exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled'];
157
+ exports.AGENT_MODE_NOTE_IDS = ['codexModelCoupled', 'opencodeAgentSwitch'];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.42.2",
3
+ "version": "0.43.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",
@@ -33,6 +33,7 @@
33
33
  "!.next/cache",
34
34
  "public/",
35
35
  "scripts/hooks/",
36
+ "scripts/opencode-v2/",
36
37
  ".env.example",
37
38
  "release-notes/"
38
39
  ],