commandmate 0.42.2 → 0.44.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 (624) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +176 -176
  3. package/.next/app-path-routes-manifest.json +34 -34
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +15 -15
  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.js.nft.json +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
  11. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update/route.js +2 -2
  14. package/.next/server/app/api/app/update/route.js.nft.json +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.js.nft.json +1 -1
  18. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/capabilities/route.js +1 -1
  23. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js +1 -1
  25. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  26. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  29. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  31. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  33. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  35. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  37. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  39. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/hooks/agent-event/route.js +103 -1
  41. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  42. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  44. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  45. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  47. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  48. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  50. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/push/escalation/route.js +1 -1
  53. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  54. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  56. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/push/vapid/route.js +1 -1
  58. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  59. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  61. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  62. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/relays/route.js +1 -1
  64. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  65. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  70. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/clone/route.js +1 -1
  73. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/restore/route.js +1 -1
  78. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  79. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/route.js +1 -1
  81. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/scan/route.js +1 -1
  84. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/sync/route.js +1 -1
  87. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  88. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  90. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  92. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  93. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  95. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  97. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/skills/[id]/route.js +1 -1
  99. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  100. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/skills/installations/route.js +1 -1
  102. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  103. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/skills/operations/route.js +2 -2
  105. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  106. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/skills/reindex/route.js +1 -1
  108. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  109. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/skills/route.js +1 -1
  111. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  112. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/slash-commands/route.js +1 -1
  114. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  115. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  117. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  119. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  123. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  125. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  127. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  136. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  138. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  140. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -1
  142. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  143. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  149. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -1
  156. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  157. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  221. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +7 -7
  223. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  224. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  228. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  230. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  243. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  246. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/route.js +1 -103
  248. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +3 -1
  251. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +3 -1
  254. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  255. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -1
  257. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  258. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  261. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -103
  263. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  264. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +103 -1
  266. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  267. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  270. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  273. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  276. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  277. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  279. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  280. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  282. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  283. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  285. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  286. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  288. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  289. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  291. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  292. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  294. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  295. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  296. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/terminal/route.js +103 -1
  298. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  299. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  306. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  307. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  308. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  312. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  313. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  314. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  324. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  325. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  326. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  327. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  330. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  331. package/.next/server/app/api/worktrees/route.js +1 -1
  332. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  333. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  334. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  335. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  336. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  337. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  338. package/.next/server/app/page_client-reference-manifest.js +1 -1
  339. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  340. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  342. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  343. package/.next/server/app/sessions/page.js +1 -1
  344. package/.next/server/app/sessions/page.js.nft.json +1 -1
  345. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  346. package/.next/server/app/skills/[skillId]/page.js +1 -1
  347. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  348. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  349. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  350. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  351. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  352. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  353. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  354. package/.next/server/app/worktrees/[id]/page.js +9 -9
  355. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  356. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  357. package/.next/server/app/worktrees/[id]/terminal/page.js +1 -1
  358. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  359. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  360. package/.next/server/app-paths-manifest.json +34 -34
  361. package/.next/server/chunks/1068.js +1 -1
  362. package/.next/server/chunks/1210.js +1 -1
  363. package/.next/server/chunks/1501.js +3 -3
  364. package/.next/server/chunks/2119.js +1 -1
  365. package/.next/server/chunks/22.js +1 -1
  366. package/.next/server/chunks/2283.js +15 -0
  367. package/.next/server/chunks/2328.js +1 -1
  368. package/.next/server/chunks/2404.js +4 -3
  369. package/.next/server/chunks/2445.js +1 -1
  370. package/.next/server/chunks/252.js +1 -1
  371. package/.next/server/chunks/2816.js +1 -1
  372. package/.next/server/chunks/3543.js +1 -1
  373. package/.next/server/chunks/3730.js +1 -1
  374. package/.next/server/chunks/3945.js +1 -1
  375. package/.next/server/chunks/4207.js +3 -3
  376. package/.next/server/chunks/4802.js +1 -1
  377. package/.next/server/chunks/488.js +1 -0
  378. package/.next/server/chunks/5064.js +1 -1
  379. package/.next/server/chunks/5326.js +1 -1
  380. package/.next/server/chunks/5456.js +1 -1
  381. package/.next/server/chunks/5571.js +1 -1
  382. package/.next/server/chunks/5775.js +1 -1
  383. package/.next/server/chunks/611.js +1 -1
  384. package/.next/server/chunks/6130.js +1 -1
  385. package/.next/server/chunks/6285.js +1 -1
  386. package/.next/server/chunks/6401.js +1 -1
  387. package/.next/server/chunks/6474.js +14 -0
  388. package/.next/server/chunks/650.js +1 -1
  389. package/.next/server/chunks/6661.js +1 -1
  390. package/.next/server/chunks/6781.js +1 -1
  391. package/.next/server/chunks/6793.js +1 -1
  392. package/.next/server/chunks/6927.js +1 -0
  393. package/.next/server/chunks/7491.js +3 -0
  394. package/.next/server/chunks/7506.js +1 -1
  395. package/.next/server/chunks/7685.js +1 -1
  396. package/.next/server/chunks/7905.js +1 -1
  397. package/.next/server/chunks/8543.js +1 -1
  398. package/.next/server/chunks/8581.js +2 -2
  399. package/.next/server/chunks/8728.js +2 -2
  400. package/.next/server/chunks/8782.js +1 -0
  401. package/.next/server/chunks/8791.js +1 -1
  402. package/.next/server/chunks/8800.js +4 -3
  403. package/.next/server/chunks/8918.js +108 -6
  404. package/.next/server/chunks/9130.js +3 -3
  405. package/.next/server/chunks/{8052.js → 9353.js} +4 -2
  406. package/.next/server/chunks/9390.js +3 -0
  407. package/.next/server/chunks/9627.js +3 -3
  408. package/.next/server/chunks/967.js +1 -0
  409. package/.next/server/chunks/9731.js +3 -3
  410. package/.next/server/chunks/9882.js +3 -3
  411. package/.next/server/middleware-manifest.json +5 -5
  412. package/.next/server/pages/500.html +1 -1
  413. package/.next/server/pages-manifest.json +1 -1
  414. package/.next/server/server-reference-manifest.json +1 -1
  415. package/.next/server/src/middleware.js +2 -2
  416. package/.next/server/src/middleware.js.map +1 -1
  417. package/.next/static/chunks/2053-85a974ddfe7498fe.js +1 -0
  418. package/.next/static/chunks/{2407-6b9e12c099fa598c.js → 2407-340774f1a24f2b45.js} +1 -1
  419. package/.next/static/chunks/5449-6cb80bab2bd06b79.js +1 -0
  420. package/.next/static/chunks/5521-c358c31f60e5e689.js +1 -0
  421. package/.next/static/chunks/591-0a45801e83f26f24.js +1 -0
  422. package/.next/static/chunks/8165-3853772f6ae1299b.js +1 -0
  423. package/.next/static/chunks/{8566-a6a7c70558927410.js → 8566-aeda747542072ace.js} +1 -1
  424. package/.next/static/chunks/8811-29eaa24237f48558.js +1 -0
  425. package/.next/static/chunks/{9619-22adf5367c4b7080.js → 9619-84aced0846cbe3ac.js} +1 -1
  426. package/.next/static/chunks/app/{layout-5b95e1236dcd9ef6.js → layout-0fc249fb7de75a27.js} +1 -1
  427. package/.next/static/chunks/app/review/page-ff9efae3f86eb840.js +1 -0
  428. package/.next/static/chunks/app/sessions/page-55297155e7bf01b9.js +1 -0
  429. package/.next/static/chunks/app/skills/[skillId]/page-9ee7a381636e60cb.js +1 -0
  430. package/.next/static/chunks/app/skills/page-182e16168b2fc098.js +1 -0
  431. package/.next/static/chunks/app/worktrees/[id]/page-d2103e0c25be83c8.js +1 -0
  432. package/.next/static/css/38070d879efa1371.css +1 -0
  433. package/.next/trace +13 -13
  434. package/README.md +58 -620
  435. package/dist/cli/commands/ask.d.ts.map +1 -1
  436. package/dist/cli/commands/ask.js +23 -149
  437. package/dist/cli/commands/capture.d.ts.map +1 -1
  438. package/dist/cli/commands/capture.js +11 -1
  439. package/dist/cli/commands/docs.d.ts.map +1 -1
  440. package/dist/cli/commands/docs.js +5 -0
  441. package/dist/cli/commands/remote.d.ts +24 -1
  442. package/dist/cli/commands/remote.d.ts.map +1 -1
  443. package/dist/cli/commands/remote.js +155 -6
  444. package/dist/cli/commands/reply.d.ts +40 -0
  445. package/dist/cli/commands/reply.d.ts.map +1 -0
  446. package/dist/cli/commands/reply.js +133 -0
  447. package/dist/cli/commands/respond.d.ts.map +1 -1
  448. package/dist/cli/commands/respond.js +255 -112
  449. package/dist/cli/commands/stop.d.ts.map +1 -1
  450. package/dist/cli/commands/stop.js +53 -1
  451. package/dist/cli/commands/sync.js +3 -3
  452. package/dist/cli/commands/wait.d.ts +5 -0
  453. package/dist/cli/commands/wait.d.ts.map +1 -1
  454. package/dist/cli/commands/wait.js +10 -1
  455. package/dist/cli/docs/agent-operations.d.ts +2 -2
  456. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  457. package/dist/cli/docs/agent-operations.js +13 -0
  458. package/dist/cli/docs/setup-guide.d.ts +14 -0
  459. package/dist/cli/docs/setup-guide.d.ts.map +1 -0
  460. package/dist/cli/docs/setup-guide.js +366 -0
  461. package/dist/cli/program.d.ts.map +1 -1
  462. package/dist/cli/program.js +4 -0
  463. package/dist/cli/types/api-responses.d.ts +11 -0
  464. package/dist/cli/types/api-responses.d.ts.map +1 -1
  465. package/dist/cli/types/index.d.ts +2 -0
  466. package/dist/cli/types/index.d.ts.map +1 -1
  467. package/dist/cli/utils/daemon.d.ts +42 -2
  468. package/dist/cli/utils/daemon.d.ts.map +1 -1
  469. package/dist/cli/utils/daemon.js +222 -40
  470. package/dist/cli/utils/docs-reader.d.ts +6 -0
  471. package/dist/cli/utils/docs-reader.d.ts.map +1 -1
  472. package/dist/cli/utils/docs-reader.js +14 -13
  473. package/dist/cli/utils/npm-runner.d.ts +12 -0
  474. package/dist/cli/utils/npm-runner.d.ts.map +1 -1
  475. package/dist/cli/utils/npm-runner.js +36 -0
  476. package/dist/cli/utils/process-inspect.d.ts +55 -0
  477. package/dist/cli/utils/process-inspect.d.ts.map +1 -0
  478. package/dist/cli/utils/process-inspect.js +214 -0
  479. package/dist/cli/utils/remote-pairing.d.ts +68 -0
  480. package/dist/cli/utils/remote-pairing.d.ts.map +1 -0
  481. package/dist/cli/utils/remote-pairing.js +117 -0
  482. package/dist/cli/utils/reply-ledger.d.ts +95 -0
  483. package/dist/cli/utils/reply-ledger.d.ts.map +1 -0
  484. package/dist/cli/utils/reply-ledger.js +187 -0
  485. package/dist/cli/utils/server-identity.d.ts +50 -0
  486. package/dist/cli/utils/server-identity.d.ts.map +1 -0
  487. package/dist/cli/utils/server-identity.js +118 -0
  488. package/dist/cli/utils/server-ready.d.ts +13 -0
  489. package/dist/cli/utils/server-ready.d.ts.map +1 -1
  490. package/dist/cli/utils/server-ready.js +16 -0
  491. package/dist/lib/cli-tools/copilot-executable.d.ts +9 -0
  492. package/dist/lib/cli-tools/copilot-executable.d.ts.map +1 -1
  493. package/dist/lib/cli-tools/copilot-executable.js +21 -5
  494. package/dist/lib/cli-tools/opencode-executable.d.ts +103 -0
  495. package/dist/lib/cli-tools/opencode-executable.d.ts.map +1 -0
  496. package/dist/lib/cli-tools/opencode-executable.js +179 -0
  497. package/dist/lib/cli-tools/types.d.ts +1 -1
  498. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  499. package/dist/lib/cli-tools/types.js +5 -1
  500. package/dist/lib/detection/tools/verified-against.d.ts +15 -0
  501. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  502. package/dist/lib/detection/tools/verified-against.js +17 -1
  503. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  504. package/dist/lib/detection/version-probes.js +14 -1
  505. package/dist/lib/security/pairing-code.d.ts +2 -1
  506. package/dist/lib/security/pairing-code.d.ts.map +1 -1
  507. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -1
  508. package/dist/lib/session/tmux-session-surface.js +1 -1
  509. package/dist/server/locales/en/worktree.json +72 -20
  510. package/dist/server/locales/ja/worktree.json +72 -20
  511. package/dist/server/server.js +23 -0
  512. package/dist/server/src/config/cli-tool-timing-config.js +19 -1
  513. package/dist/server/src/config/detection-evidence-config.js +3 -0
  514. package/dist/server/src/config/image-extensions.js +1 -0
  515. package/dist/server/src/config/schedule-config.js +55 -1
  516. package/dist/server/src/lib/auto-yes-poller.js +69 -4
  517. package/dist/server/src/lib/cli-tools/agent-mode-spec.js +54 -2
  518. package/dist/server/src/lib/cli-tools/base.js +6 -2
  519. package/dist/server/src/lib/cli-tools/command-code-plan-review.js +175 -0
  520. package/dist/server/src/lib/cli-tools/command-code.js +81 -2
  521. package/dist/server/src/lib/cli-tools/composer-spec.js +10 -0
  522. package/dist/server/src/lib/cli-tools/copilot-executable.js +21 -5
  523. package/dist/server/src/lib/cli-tools/graceful-exit.js +15 -1
  524. package/dist/server/src/lib/cli-tools/index.js +3 -1
  525. package/dist/server/src/lib/cli-tools/install-hints.js +9 -3
  526. package/dist/server/src/lib/cli-tools/liveness-spec.js +19 -0
  527. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  528. package/dist/server/src/lib/cli-tools/opencode-executable.js +179 -0
  529. package/dist/server/src/lib/cli-tools/opencode-v2.js +369 -0
  530. package/dist/server/src/lib/cli-tools/opencode.js +29 -5
  531. package/dist/server/src/lib/cli-tools/types.js +5 -1
  532. package/dist/server/src/lib/cmate-cli-tool-parser.js +65 -7
  533. package/dist/server/src/lib/cmate-parser.js +12 -0
  534. package/dist/server/src/lib/cmate-validator.js +13 -1
  535. package/dist/server/src/lib/detection/cli-patterns.js +172 -3
  536. package/dist/server/src/lib/detection/model-info-extractor.js +79 -7
  537. package/dist/server/src/lib/detection/status-detector.js +10 -1
  538. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +2 -1
  539. package/dist/server/src/lib/detection/tools/codex/detect.js +26 -0
  540. package/dist/server/src/lib/detection/tools/command-code/plan-review-state.js +75 -0
  541. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +253 -0
  542. package/dist/server/src/lib/detection/tools/opencode-v2/dialog-title.js +48 -0
  543. package/dist/server/src/lib/detection/tools/registry.js +2 -0
  544. package/dist/server/src/lib/detection/tools/run-detection.js +9 -0
  545. package/dist/server/src/lib/detection/tools/verified-against.js +17 -1
  546. package/dist/server/src/lib/detection/upstream-faults.js +8 -0
  547. package/dist/server/src/lib/detection/version-probes.js +14 -1
  548. package/dist/server/src/lib/hooks/agent-session-telemetry.js +36 -1
  549. package/dist/server/src/lib/hooks/sources/claude/transcript.js +33 -1
  550. package/dist/server/src/lib/hooks/sources/opencode/log-diagnosis.js +105 -0
  551. package/dist/server/src/lib/hooks/sources/opencode/source.js +7 -1
  552. package/dist/server/src/lib/hooks/sources/opencode-v2/client.js +422 -0
  553. package/dist/server/src/lib/hooks/sources/opencode-v2/decision-labels.js +24 -0
  554. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +421 -0
  555. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +271 -0
  556. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +165 -0
  557. package/dist/server/src/lib/hooks/sources/opencode-v2/payloads.js +351 -0
  558. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +230 -0
  559. package/dist/server/src/lib/hooks/sources/opencode-v2/reattach.js +149 -0
  560. package/dist/server/src/lib/hooks/sources/opencode-v2/runtime.js +180 -0
  561. package/dist/server/src/lib/hooks/sources/opencode-v2/secrets.js +182 -0
  562. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +295 -0
  563. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +455 -0
  564. package/dist/server/src/lib/hooks/sources/opencode-v2/tool-id.js +18 -0
  565. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +214 -0
  566. package/dist/server/src/lib/hooks/sources/registry.js +2 -0
  567. package/dist/server/src/lib/hooks/structured-decision-response.js +14 -5
  568. package/dist/server/src/lib/job-executor.js +2 -1
  569. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +15 -1
  570. package/dist/server/src/lib/polling/structured-history-gate.js +19 -5
  571. package/dist/server/src/lib/relay/relay-delivery.js +4 -1
  572. package/dist/server/src/lib/session/agent-event-state.js +24 -0
  573. package/dist/server/src/lib/session/claude-executor.js +186 -12
  574. package/dist/server/src/lib/session/claude-session.js +131 -15
  575. package/dist/server/src/lib/session/current-output-builder.js +27 -3
  576. package/dist/server/src/lib/session/send-user-message.js +4 -0
  577. package/dist/server/src/lib/session/session-start-error.js +20 -0
  578. package/dist/server/src/lib/session/structured-prompt.js +54 -0
  579. package/dist/server/src/lib/session/tmux-session-surface.js +1 -1
  580. package/dist/server/src/lib/skills/agent-state-paths.js +39 -0
  581. package/dist/server/src/lib/skills/compatibility-matrix.js +65 -0
  582. package/dist/server/src/lib/skills/receipt-owned-paths.js +118 -0
  583. package/dist/server/src/lib/tmux/tmux.js +73 -2
  584. package/dist/server/src/lib/verification/env-clean-gate.js +281 -10
  585. package/dist/server/src/lib/verification/gate-runner.js +29 -2
  586. package/dist/server/src/lib/verification/scope-gate.js +58 -4
  587. package/dist/server/src/types/cli-tool-contracts.js +10 -2
  588. package/dist/types/cli-tool-contracts.d.ts +16 -5
  589. package/dist/types/cli-tool-contracts.d.ts.map +1 -1
  590. package/dist/types/cli-tool-contracts.js +10 -2
  591. package/docs/en/architecture.md +722 -0
  592. package/docs/en/user-guide/agents-guide.md +306 -0
  593. package/docs/en/user-guide/cli-setup-guide.md +676 -0
  594. package/docs/en/user-guide/cmate-schedules-guide.md +388 -0
  595. package/docs/en/user-guide/commands-guide.md +467 -0
  596. package/docs/en/user-guide/quick-start.md +231 -0
  597. package/docs/en/user-guide/webapp-guide.md +1020 -0
  598. package/docs/en/user-guide/workflow-examples.md +463 -0
  599. package/package.json +19 -7
  600. package/release-notes/0.43.0.json +130 -0
  601. package/release-notes/0.44.0.json +82 -0
  602. package/scripts/hooks/cmate-agent-event.sh +14 -0
  603. package/scripts/opencode-v2/launch.sh +226 -0
  604. package/.next/server/chunks/1990.js +0 -103
  605. package/.next/server/chunks/3707.js +0 -15
  606. package/.next/server/chunks/4443.js +0 -3
  607. package/.next/server/chunks/5164.js +0 -1
  608. package/.next/server/chunks/5742.js +0 -1
  609. package/.next/server/chunks/7004.js +0 -1
  610. package/.next/server/chunks/8673.js +0 -14
  611. package/.next/static/chunks/2039-117a361f795ddc4b.js +0 -1
  612. package/.next/static/chunks/2053-611dd27d42721b79.js +0 -1
  613. package/.next/static/chunks/3778-56f41fc2cecb8c43.js +0 -1
  614. package/.next/static/chunks/5449-550bd273dccc3ae4.js +0 -1
  615. package/.next/static/chunks/7705-2a2936551b0cf9a3.js +0 -1
  616. package/.next/static/chunks/8165-934ee7ff3b4ddfd4.js +0 -1
  617. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +0 -1
  618. package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +0 -1
  619. package/.next/static/chunks/app/skills/[skillId]/page-ab7e432b69fccb3b.js +0 -1
  620. package/.next/static/chunks/app/skills/page-56b4fa11223e0cbd.js +0 -1
  621. package/.next/static/chunks/app/worktrees/[id]/page-59f5337e031518c6.js +0 -1
  622. package/.next/static/css/b3f433d52b8ed5c8.css +0 -1
  623. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_buildManifest.js +0 -0
  624. /package/.next/static/{MXZXkcFAnpELZnxxHB4iJ → wu7SUiHTirFcrpo5teyZ3}/_ssgManifest.js +0 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * Which part of Command Code's plan review overlay has the keyboard
4
+ * (Issue #3125).
5
+ *
6
+ * The detector already says THAT the overlay is up
7
+ * (`command_code_plan_review`, see `detect.ts`). Answering it needs one more
8
+ * fact, because the same keys mean different things depending on where the
9
+ * focus is — measured on 1.58.0 (`tests/fixtures/command-code-plan-review-2763/`)
10
+ * and unchanged in the 1.74.0 rows #3059 observed
11
+ * (`tests/fixtures/command-code-plan-review-3125/`):
12
+ *
13
+ * | phase | hint bar (last content row) | `Enter` does |
14
+ * |------------------|----------------------------------------------|-------------------------|
15
+ * | `body` | `type + enter to comment · …` | opens / pins a comment |
16
+ * | `comment-box` | `enter to pin · esc discard` | pins what is typed |
17
+ * | `action-focus` | `↑/↓ choose · enter to run` (a `❯` on a row) | RUNS the focused action |
18
+ * | `approve-choice` | `←/→ choose · enter confirm · esc back` | confirms the approval |
19
+ *
20
+ * The body cursor itself is drawn by background colour alone and cannot be read
21
+ * off a plain capture; the hint bar and the `❯` can, which is all this needs.
22
+ *
23
+ * Browser-safe and pure, like `selection-shape.ts` it builds on.
24
+ *
25
+ * @module lib/detection/tools/command-code/plan-review-state
26
+ */
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.readCommandCodePlanReviewState = readCommandCodePlanReviewState;
29
+ const ansi_1 = require("../../ansi");
30
+ const selection_shape_1 = require("../../selection-shape");
31
+ /** Rows read from the end of the frame — the same 15 the detector reads. */
32
+ const TAIL_CONTENT_ROWS = 15;
33
+ const BODY_HINT = /^\s*type \+ enter to comment\b/i;
34
+ const COMMENT_BOX_HINT = /^\s*enter to pin\s*·\s*esc discard\s*$/i;
35
+ const ACTION_FOCUS_HINT = /^\s*↑\/↓ choose\s*·\s*enter to run\s*$/i;
36
+ const FOCUSED_ACTION_ROW = /^\s*❯ +(?:Submit review\b|Approve\s+ctrl\+a\b|Cancel\s+esc\b)/im;
37
+ const PENDING_BADGE = /^\s*REVIEW\s+(\d+)\s+pending comments?\b/im;
38
+ const APPROVE_WITH_COMMENTS_SELECTED = /\(•\)\s+with\s+\d+\s+comments?\s+as\s+notes/i;
39
+ /**
40
+ * Read the plan review overlay's focus off a capture.
41
+ *
42
+ * @param frame - a raw `capture-pane` frame, ANSI intact or stripped
43
+ * @returns null when the overlay is not at the bottom of this frame
44
+ */
45
+ function readCommandCodePlanReviewState(frame) {
46
+ if (!frame)
47
+ return null;
48
+ const rows = (0, ansi_1.stripAnsi)(frame.replace(/\r\n/g, '\n'))
49
+ .split('\n')
50
+ .filter((row) => row.trim() !== '')
51
+ .slice(-TAIL_CONTENT_ROWS);
52
+ if (rows.length === 0)
53
+ return null;
54
+ const tail = rows.join('\n');
55
+ const pendingMatch = PENDING_BADGE.exec(tail);
56
+ const pendingComments = pendingMatch ? Number(pendingMatch[1]) : 0;
57
+ if ((0, selection_shape_1.isCommandCodePlanApproveChoice)(tail)) {
58
+ return {
59
+ phase: 'approve-choice',
60
+ pendingComments,
61
+ approveChoice: APPROVE_WITH_COMMENTS_SELECTED.test(tail) ? 'with-comments' : 'discard-comments',
62
+ };
63
+ }
64
+ if (!(0, selection_shape_1.hasCommandCodePlanReviewFooterAtBottom)(tail))
65
+ return null;
66
+ const hint = rows[rows.length - 1];
67
+ let phase = 'unknown';
68
+ if (FOCUSED_ACTION_ROW.test(tail) || ACTION_FOCUS_HINT.test(hint))
69
+ phase = 'action-focus';
70
+ else if (COMMENT_BOX_HINT.test(hint))
71
+ phase = 'comment-box';
72
+ else if (BODY_HINT.test(hint))
73
+ phase = 'body';
74
+ return { phase, pendingComments, approveChoice: null };
75
+ }
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ /**
3
+ * OpenCode V2 screen detector — the fallback reader (Issue #2934, Phase 1).
4
+ *
5
+ * OpenCode V2's state comes from its server's SSE stream
6
+ * (`@/lib/hooks/sources/opencode-v2`); this module is what decides when that
7
+ * stream is not there (a pane launched `--standalone`, a subscription that has
8
+ * not reattached yet). It reads, in this order:
9
+ *
10
+ * - the approval dialog's button strip (`Allow once Always allow Reject`)
11
+ * → `waiting` (Issue #2965);
12
+ * - the question form's key hints (`↑↓ select enter submit esc dismiss`)
13
+ * → `waiting` (Issue #2965);
14
+ * - a dialog's title row (`Select variant … esc`, the model / variant
15
+ * pickers, Commands, Sessions, Select agent) anywhere on the pane
16
+ * → `waiting` (Issue #2971);
17
+ * - the footer's `esc interrupt` hint → `running`;
18
+ * - the completion row (`Build · <model> · 3.5s · 11.2 tok/s`) as the last
19
+ * transcript row → `ready` (Issue #2965);
20
+ * - the gutter-anchored empty composer (`┃ Ask anything…`) → `ready`;
21
+ * - otherwise the footer without that hint (`… 8.6K (1%) ctrl+p commands`,
22
+ * the frame after a turn, whose composer is a bare gutter) → `ready`.
23
+ *
24
+ * Both dialogs are drawn INSIDE the composer's `┃` gutter and replace the
25
+ * footer altogether (measured on 2.0.18, 80x200, 2026-09-29:
26
+ * `tests/fixtures/opencode-v2-live-2945/permission-required.txt` /
27
+ * `question.txt`), so before #2965 they reached the floor as `running` /
28
+ * `default` — an unclassified frame, which is what wrote the "could not parse
29
+ * it" row into the chat while the structured layer held the very approval.
30
+ *
31
+ * v1's opencode detector is deliberately not reused: its dialog rule keys on
32
+ * v1's wording (`Allow always`, the reverse word order) and would misread v2.
33
+ *
34
+ * `detectDialog` (Issue #2984) reads the same three surfaces for the Auto-Yes
35
+ * gate (`polling/auto-yes-dialog-gate`), measured on 2.0.18 at 80x200
36
+ * (2026-09-29, `tests/fixtures/opencode-v2-dialogs-2984/`): the approval strip
37
+ * (`keys` — a typed digit leaves it open), the question form (`numbered`,
38
+ * `answer_only` — a typed `2` alone submitted `Blue`) and a dialog title
39
+ * (`keys` — a digit goes into the filter). v2's approvals and questions are
40
+ * still answered through the agent's own API (#2945); what the gate needs from
41
+ * this module is the NO — an agent's reply that quotes a `❯ 1. Yes` dialog is
42
+ * none of the three, so Auto-Yes does not type into the composer for it.
43
+ *
44
+ * @module lib/detection/tools/opencode-v2/detect
45
+ */
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.opencodeV2StatusDetector = exports.OPENCODE_V2_PERMISSION_OPTIONS = exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = exports.OPENCODE_V2_QUESTION_PATTERN = exports.OPENCODE_V2_PERMISSION_PATTERN = exports.VERIFIED_AGAINST = void 0;
48
+ exports.endsWithTurnComplete = endsWithTurnComplete;
49
+ const cli_patterns_1 = require("../../cli-patterns");
50
+ const status_reason_1 = require("../../status-reason");
51
+ const run_detection_1 = require("../run-detection");
52
+ const verified_against_1 = require("../verified-against");
53
+ exports.VERIFIED_AGAINST = verified_against_1.OPENCODE_V2_VERIFIED_AGAINST;
54
+ /**
55
+ * The approval dialog's button strip, on the composer's own `┃` gutter:
56
+ * `┃ Allow once Always allow Reject ctrl+f fullscreen ⇆ select enter con…`
57
+ * (2.0.18). The gutter anchor keeps the same words reaching the pane inside a
58
+ * reply from being read as a dialog, as v1's `OPENCODE_PERMISSION_PATTERN`
59
+ * does; the word order is v2's own (`Always allow`, not v1's `Allow always`).
60
+ */
61
+ exports.OPENCODE_V2_PERMISSION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*Allow once[^\S\n]{2,}Always allow[^\S\n]{2,}Reject\b/m;
62
+ /**
63
+ * The question form's key hints, on the composer's gutter:
64
+ * `┃ ↑↓ select enter submit esc dismiss` (2.0.18, below the numbered
65
+ * choices and `Type your own answer`).
66
+ */
67
+ exports.OPENCODE_V2_QUESTION_PATTERN = /^[^\S\n]*[│┃][^\S\n]*↑↓ select[^\S\n]+enter submit[^\S\n]+esc dismiss\b/m;
68
+ /**
69
+ * The row that closes a finished turn: `Build · <model> · 3.5s · 11.2 tok/s`
70
+ * (2.0.18). Transcript rows carry no gutter; the composer's model bar
71
+ * (`┃ Build · <model> OpenCode Zen`) does and has no duration, so neither it
72
+ * nor v1's `▣` row matches. A duration is required — the row without one is not
73
+ * a completion (the lesson v1's #1893 learned).
74
+ */
75
+ exports.OPENCODE_V2_TURN_COMPLETE_PATTERN = /^[^\S\n│┃]*[A-Za-z][\w-]*(?: [\w-]+)* · [^\n]+? · \d+(?:\.\d+)?(?:ms|s|m(?: \d+s)?)(?: · [\d.]+ tok\/s)?[^\S\n]*$/;
76
+ /** The approval strip's buttons, in the order it draws them (2.0.18). */
77
+ exports.OPENCODE_V2_PERMISSION_OPTIONS = ['Allow once', 'Always allow', 'Reject'];
78
+ /** A row of the composer's gutter (`┃ …`). The question form is drawn entirely on it. */
79
+ const GUTTER_ROW_PATTERN = /^[^\S\n]*[│┃]/;
80
+ /** One choice of the question form: `┃ 1. Red` (2.0.18). */
81
+ const QUESTION_OPTION_ROW_PATTERN = /^[^\S\n]*[│┃][^\S\n]*(\d+)\.[^\S\n]+(\S.*?)[^\S\n]*$/;
82
+ /**
83
+ * The question form as a dialog (Issue #2984): the choices on the gutter rows
84
+ * above its key hints, numbered 1..n without a gap. `null` when the hints row
85
+ * is not in the status window or fewer than two choices can be read.
86
+ *
87
+ * `numbered` / `answer_only` because that is what the form does with a digit:
88
+ * measured on 2.0.18, typing `2` with no Enter submitted `Blue`
89
+ * (`tests/fixtures/opencode-v2-dialogs-2984/question-answered-by-digit.txt`).
90
+ */
91
+ function readQuestionDialog(frame) {
92
+ if (!exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines))
93
+ return null;
94
+ const lines = frame.contentLines;
95
+ let hints = -1;
96
+ for (let i = lines.length - 1; i >= 0; i--) {
97
+ if (exports.OPENCODE_V2_QUESTION_PATTERN.test(lines[i])) {
98
+ hints = i;
99
+ break;
100
+ }
101
+ }
102
+ if (hints < 0)
103
+ return null;
104
+ const options = [];
105
+ for (let i = hints - 1; i >= 0 && GUTTER_ROW_PATTERN.test(lines[i]); i--) {
106
+ const match = QUESTION_OPTION_ROW_PATTERN.exec(lines[i]);
107
+ if (match)
108
+ options.unshift(`${match[1]}. ${match[2]}`);
109
+ }
110
+ if (options.length < 2)
111
+ return null;
112
+ if (!options.every((option, index) => option.startsWith(`${index + 1}. `)))
113
+ return null;
114
+ return { kind: 'question', options, answerMode: 'numbered', submitMode: 'answer_only' };
115
+ }
116
+ /** Rows below the transcript that are chrome: gutter padding, the model bar, the rule, the footer, the version. */
117
+ function isChromeRow(line) {
118
+ if (/^[\s│┃╹▀]*$/.test(line))
119
+ return true;
120
+ // The composer's model bar: gutter, then `<Agent> · <model> <provider>` with no second `·`.
121
+ if (/^[^\S\n]*[│┃][^\S\n]*[A-Za-z][\w-]* · [^·\n]+$/.test(line))
122
+ return true;
123
+ if (cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(line))
124
+ return true;
125
+ return /^\s*\d+\.\d+\.\d+\s*$/.test(line);
126
+ }
127
+ /**
128
+ * Whether the last transcript row — the first row above the composer's chrome —
129
+ * is the completion row. Only the LAST row counts: the completion row of an
130
+ * earlier turn stays on the pane behind the next turn and behind a dialog.
131
+ */
132
+ function endsWithTurnComplete(frame) {
133
+ const lines = frame.contentLines;
134
+ for (let i = lines.length - 1; i >= 0; i--) {
135
+ if (isChromeRow(lines[i]))
136
+ continue;
137
+ return exports.OPENCODE_V2_TURN_COMPLETE_PATTERN.test(lines[i]);
138
+ }
139
+ return false;
140
+ }
141
+ exports.opencodeV2StatusDetector = (0, run_detection_1.createToolStatusDetector)({
142
+ tool: 'opencode-v2',
143
+ verifiedAgainst: exports.VERIFIED_AGAINST,
144
+ // Issue #2991: every v2 dialog is recognised by `beforePrompt` below, so a
145
+ // numbered list that reaches the generic parser is text in a reply (the UAT
146
+ // frame: `❯ 1. Yes / 2. No` quoted in the answer). Unvouched by
147
+ // `detectDialog`, it is not published as `waiting` — which had left the
148
+ // session refusing every send with nothing on screen to answer.
149
+ requireVouchedPrompt: true,
150
+ // Issue #2965: the two dialogs, ahead of everything. Each is the agent
151
+ // blocked on a human whatever else is on the pane — the question frame keeps
152
+ // the previous turn's completion row above it — and ahead of the generic
153
+ // numbered-list parser too, because the question's `1. Red / 2. Blue` is
154
+ // driven by ↑↓ + Enter (hence `hasActivePrompt: false` and a reason from
155
+ // `SELECTION_LIST_REASONS`, which draws the arrow keys instead of offering to
156
+ // type a number). Issue #2984 measured that a typed digit also commits it,
157
+ // with no Enter — see `detectDialog` below.
158
+ beforePrompt(frame) {
159
+ if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
160
+ return {
161
+ status: 'waiting',
162
+ confidence: 'high',
163
+ reason: status_reason_1.STATUS_REASON.OPENCODE_PERMISSION_PROMPT,
164
+ hasActivePrompt: false,
165
+ evidence: 'positive',
166
+ };
167
+ }
168
+ if (exports.OPENCODE_V2_QUESTION_PATTERN.test(frame.lastLines)) {
169
+ return {
170
+ status: 'waiting',
171
+ confidence: 'high',
172
+ reason: status_reason_1.STATUS_REASON.OPENCODE_SELECTION_LIST,
173
+ hasActivePrompt: false,
174
+ evidence: 'positive',
175
+ };
176
+ }
177
+ // Issue #2971: a dialog opened over the composer keeps the footer (and
178
+ // often the placeholder) on screen, so every rule below read it as `ready`
179
+ // and `wait` completed a turn that never started. Its title row sits ~150
180
+ // rows above the bottom of an 80x200 pane, outside `lastLines`, so the
181
+ // whole frame is read. The reason is v1's (#2112): the same kind of
182
+ // overlay, driven by ↑↓ + Enter and closed with `esc` — no number answers
183
+ // it, hence `hasActivePrompt: false`.
184
+ if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
185
+ return {
186
+ status: 'waiting',
187
+ confidence: 'high',
188
+ reason: status_reason_1.STATUS_REASON.OPENCODE_MODAL_OVERLAY,
189
+ hasActivePrompt: false,
190
+ evidence: 'positive',
191
+ };
192
+ }
193
+ return null;
194
+ },
195
+ afterThinking(frame) {
196
+ if ((0, cli_patterns_1.detectThinking)('opencode-v2', frame.lastLines)) {
197
+ return {
198
+ status: 'running',
199
+ confidence: 'high',
200
+ reason: status_reason_1.STATUS_REASON.THINKING_INDICATOR,
201
+ hasActivePrompt: false,
202
+ evidence: 'positive',
203
+ };
204
+ }
205
+ // Issue #2965: the completion row as the last transcript row, with no
206
+ // `esc interrupt` (ruled out just above) — a finished turn, whether or not
207
+ // the footer made it into the capture.
208
+ if (endsWithTurnComplete(frame)) {
209
+ return {
210
+ status: 'ready',
211
+ confidence: 'high',
212
+ reason: status_reason_1.STATUS_REASON.OPENCODE_RESPONSE_COMPLETE,
213
+ hasActivePrompt: false,
214
+ evidence: 'positive',
215
+ };
216
+ }
217
+ // The placeholder against the ANSI-stripped frame with its box drawing
218
+ // intact (the pattern anchors on the `┃` gutter). The footer is on every
219
+ // frame, and the running hint was ruled out just above.
220
+ if (cli_patterns_1.OPENCODE_V2_IDLE_COMPOSER_PATTERN.test((0, cli_patterns_1.stripAnsi)(frame.raw)) ||
221
+ cli_patterns_1.OPENCODE_V2_FOOTER_PATTERN.test(frame.lastLines)) {
222
+ return {
223
+ status: 'ready',
224
+ confidence: 'high',
225
+ reason: status_reason_1.STATUS_REASON.INPUT_PROMPT,
226
+ hasActivePrompt: false,
227
+ evidence: 'positive',
228
+ };
229
+ }
230
+ return null;
231
+ },
232
+ // Issue #2984: the seam the Auto-Yes gate and `respond` read. The same three
233
+ // rules `beforePrompt` reports `waiting` on, in the same order, so the gate
234
+ // and the status API agree about which frames carry a dialog.
235
+ //
236
+ // The strip and the question form are anchored on the composer's `┃` gutter,
237
+ // which `stripBoxDrawing` removes: on the spelling the Auto-Yes poller judges
238
+ // they answer `null` (v1's #1893 precedent). For Auto-Yes `null` and `keys`
239
+ // both send nothing, and the question form never reaches the gate anyway —
240
+ // it draws no `❯` for the generic parser to key on.
241
+ detectDialog(frame) {
242
+ if (exports.OPENCODE_V2_PERMISSION_PATTERN.test(frame.lastLines)) {
243
+ return { kind: 'permission', options: exports.OPENCODE_V2_PERMISSION_OPTIONS, answerMode: 'keys' };
244
+ }
245
+ const question = readQuestionDialog(frame);
246
+ if (question !== null)
247
+ return question;
248
+ if ((0, cli_patterns_1.findOpencodeV2DialogTitle)((0, cli_patterns_1.stripAnsi)(frame.raw)) !== null) {
249
+ return { kind: 'picker', options: [], answerMode: 'keys' };
250
+ }
251
+ return null;
252
+ },
253
+ });
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * OpenCode V2's dialog title row — a pure, dependency-free leaf (Issue #2983).
4
+ *
5
+ * Moved out of `cli-patterns.ts` (which re-exports both names) so a client
6
+ * component can read the same row the detector reads without pulling the
7
+ * logger and the tool registry into the browser bundle: the chat surface's
8
+ * dialog card draws v2's model keys only while one of these dialogs is open,
9
+ * because each of those keys closes the dialog with `Escape` before it is sent.
10
+ *
11
+ * @module lib/detection/tools/opencode-v2/dialog-title
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = void 0;
15
+ exports.findOpencodeV2DialogTitle = findOpencodeV2DialogTitle;
16
+ /**
17
+ * The title row of an OpenCode V2 dialog opened over the composer: the model
18
+ * picker (`ctrl+x m`), the variant picker it opens next, the Commands palette
19
+ * (`ctrl+p`), Sessions (`ctrl+x l`) and Select agent (`ctrl+x a`) — Issue #2971.
20
+ *
21
+ * Measured on 2.0.18 at 80x200 (2026-09-29,
22
+ * `tests/fixtures/opencode-v2-live-2971/`): every one of them opens with a row
23
+ * ` <Title> esc`, the dismiss hint
24
+ * right-aligned after a wide gap, with no `┃` gutter in front. The row BELOW it
25
+ * is the filter (`Search`, or whatever was typed into it) and changes; the
26
+ * title row does not. The footer (`… ctrl+p commands`) stays drawn under every
27
+ * one of them, which is why the footer alone cannot say the composer is free.
28
+ *
29
+ * Not matched: the running footer (`esc interrupt ctrl+p commands`, `esc` not
30
+ * last) and the question form's `┃ ↑↓ select enter submit esc dismiss`
31
+ * (gutter, `esc` not last). Match against the ANSI-stripped frame; the title
32
+ * sits far above the 15-line status window (row 52 of 200), so pass the whole
33
+ * capture.
34
+ */
35
+ exports.OPENCODE_V2_DIALOG_TITLE_PATTERN = /^[^\S\n]*[^\s\u2502\u2503\u2579\u2580][^\n]*?[^\S\n]{8,}esc[^\S\n]*$/m;
36
+ /**
37
+ * The title of the OpenCode V2 dialog open on the pane (`Select variant`), or
38
+ * `null` when none is (Issue #2971). A send must not type while one is open:
39
+ * the text lands in the dialog's filter, not in the composer.
40
+ *
41
+ * @param text - ANSI-stripped capture of the whole pane
42
+ */
43
+ function findOpencodeV2DialogTitle(text) {
44
+ const match = exports.OPENCODE_V2_DIALOG_TITLE_PATTERN.exec(text);
45
+ if (match === null)
46
+ return null;
47
+ return match[0].trim().replace(/\s+esc$/, '');
48
+ }
@@ -18,6 +18,7 @@ const detect_3 = require("./codex/detect");
18
18
  const detect_4 = require("./command-code/detect");
19
19
  const detect_5 = require("./copilot/detect");
20
20
  const detect_6 = require("./opencode/detect");
21
+ const detect_7 = require("./opencode-v2/detect");
21
22
  const run_detection_1 = require("./run-detection");
22
23
  const verified_against_1 = require("./verified-against");
23
24
  /**
@@ -43,6 +44,7 @@ const DETECTORS = {
43
44
  opencode: detect_6.opencodeStatusDetector,
44
45
  antigravity: detect_1.antigravityStatusDetector,
45
46
  'command-code': detect_4.commandCodeStatusDetector,
47
+ 'opencode-v2': detect_7.opencodeV2StatusDetector,
46
48
  gemini: geminiStatusDetector,
47
49
  'vibe-local': vibeLocalStatusDetector,
48
50
  };
@@ -99,6 +99,15 @@ function runToolDetection(spec, frame, context = {}) {
99
99
  // and let the chain continue to the tool's running/idle branches.
100
100
  promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
101
101
  }
102
+ else if (spec.requireVouchedPrompt && context.isPromptVouched?.(promptDetection) === false) {
103
+ // Issue #2991: a numbered list the tool's own dialog rules do not vouch
104
+ // for — the agent's reply quoting `❯ 1. Yes / 2. No`. Auto-Yes (#2984)
105
+ // and History (#2457) already refuse it; publishing `waiting` for it
106
+ // left the session unanswerable (no dialog to answer) and unwritable (the
107
+ // send guard refused every message). Neutralised the same way as the
108
+ // stale block above, so the tool's own branches decide the status.
109
+ promptDetection = { ...promptDetection, isPrompt: false, promptData: undefined };
110
+ }
102
111
  else {
103
112
  return {
104
113
  status: 'waiting',
@@ -26,7 +26,7 @@
26
26
  * instead of importing it.
27
27
  */
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.COMMAND_CODE_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
29
+ exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.OPENCODE_V2_VERIFIED_AGAINST = exports.COMMAND_CODE_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
30
30
  /** claude these rules were read off (#1708 / #1927 fixtures). */
31
31
  exports.CLAUDE_VERIFIED_AGAINST = {
32
32
  version: '2.1.240',
@@ -224,6 +224,21 @@ exports.COMMAND_CODE_VERIFIED_AGAINST = {
224
224
  capturedAt: '2026-09-20',
225
225
  paneGeometry: '200x1000',
226
226
  };
227
+ /**
228
+ * OpenCode V2 (`opencode2`, npm `@opencode/cli`) — Issue #2934, Epic #2370
229
+ * Phase 1.
230
+ *
231
+ * 2.0.18 is the build Phase 0 and Phase 1 were measured on (2026-09-28, pane
232
+ * 80x200): the SSE vocabulary the state is read from, and the composer / footer
233
+ * rows the send path and the fallback reader match. OpenCode V2 shipped 18
234
+ * releases in its first two weeks, so this stamp is expected to go `stale`
235
+ * quickly — which is the freshness probe doing its job, not a defect.
236
+ */
237
+ exports.OPENCODE_V2_VERIFIED_AGAINST = {
238
+ version: '2.0.18',
239
+ capturedAt: '2026-09-28',
240
+ paneGeometry: '80x200',
241
+ };
227
242
  /**
228
243
  * The stamp for a tool whose frames nobody has captured yet.
229
244
  *
@@ -251,6 +266,7 @@ exports.DETECTOR_VERIFIED_AGAINST = {
251
266
  opencode: exports.OPENCODE_VERIFIED_AGAINST,
252
267
  antigravity: exports.ANTIGRAVITY_VERIFIED_AGAINST,
253
268
  'command-code': exports.COMMAND_CODE_VERIFIED_AGAINST,
269
+ 'opencode-v2': exports.OPENCODE_V2_VERIFIED_AGAINST,
254
270
  gemini: exports.UNMEASURED_VERIFIED_AGAINST,
255
271
  'vibe-local': exports.UNMEASURED_VERIFIED_AGAINST,
256
272
  };
@@ -46,6 +46,14 @@ const excerpt_1 = require("./excerpt");
46
46
  exports.UPSTREAM_FAULTS = [
47
47
  { id: 'overloaded', pattern: /\b5\d{2}\s+Overloaded\b/i, selfRetrying: true },
48
48
  { id: 'retrying', pattern: /Retrying in \d+s\s*[·•]\s*attempt \d+\/\d+/i, selfRetrying: true },
49
+ {
50
+ // The conversation outgrew the model's window (Issue #3011). Command Code
51
+ // prints `400 This model's maximum context length is N tokens. However, you
52
+ // requested M tokens`; retrying the same session cannot succeed.
53
+ id: 'context-limit',
54
+ pattern: /\bmaximum context length is \d+ tokens\b/i,
55
+ selfRetrying: false,
56
+ },
49
57
  { id: 'limit-reached', pattern: /\blimit reached\b/i, selfRetrying: false },
50
58
  { id: 'api-error', pattern: /\bAPI Error(?::|\s+\d{3})/i, selfRetrying: false },
51
59
  ];
@@ -104,6 +104,7 @@ exports.getDetectorStalenessSnapshot = getDetectorStalenessSnapshot;
104
104
  exports.clearDetectorVersionProbeCache = clearDetectorVersionProbeCache;
105
105
  const child_process_1 = require("child_process");
106
106
  const copilot_executable_1 = require("../cli-tools/copilot-executable");
107
+ const opencode_executable_1 = require("../cli-tools/opencode-executable");
107
108
  const env_sanitizer_1 = require("../security/env-sanitizer");
108
109
  const verified_against_1 = require("./tools/verified-against");
109
110
  /** Budget for one `<cli> --version`. Matches the catalog probe and copilot-executable. */
@@ -202,7 +203,19 @@ exports.DETECTOR_VERSION_PROBES = {
202
203
  codex: { kind: 'execFile', command: 'codex', args: ['--version'] },
203
204
  antigravity: { kind: 'execFile', command: 'agy', args: ['--version'] },
204
205
  'command-code': { kind: 'execFile', command: 'commandcode', args: ['--version'] },
205
- opencode: { kind: 'execFile', command: 'opencode', args: ['--version'] },
206
+ // Issue #2939: both OpenCodes are delegated, like copilot. `opencode` may be
207
+ // OpenCode V2 (npm `@opencode/cli` registers it next to `opencode2`), so the
208
+ // row reads the version of the binary each tool would launch — the same
209
+ // resolution `isInstalled()` and the launch line use, never `opencode v2.x`
210
+ // filed as OpenCode 1.x's version.
211
+ opencode: {
212
+ kind: 'delegated',
213
+ probe: async () => (await (0, opencode_executable_1.resolveOpencodeV1Executable)()).executable?.version ?? null,
214
+ },
215
+ 'opencode-v2': {
216
+ kind: 'delegated',
217
+ probe: async () => (await (0, opencode_executable_1.resolveOpencodeV2Executable)()).executable?.version ?? null,
218
+ },
206
219
  gemini: { kind: 'execFile', command: 'gemini', args: ['--version'] },
207
220
  copilot: {
208
221
  kind: 'delegated',
@@ -61,6 +61,17 @@
61
61
  * its own — see {@link AgentSessionContextUsage} and
62
62
  * `docs/design/opencode-server-live-verification.md` §14.
63
63
  *
64
+ * ## OpenCode V2 (Issue #2981)
65
+ *
66
+ * `opencode-v2` fills both records too, with the same meanings — measured on
67
+ * 2.0.18 (`tests/fixtures/opencode-v2-usage-2981`): `GET /api/session/{id}`
68
+ * carries the session's cumulative `cost` / `tokens` (the running total
69
+ * `session.usage.updated` announces), while the TUI's `6.3K (1%)` is the last
70
+ * assistant message's footprint. The writer is
71
+ * `./sources/opencode-v2/usage`, which asks its own server with its own port
72
+ * and password; {@link ensureAgentSessionContextUsage} leaves those instances
73
+ * alone.
74
+ *
64
75
  * @module lib/hooks/agent-session-telemetry
65
76
  */
66
77
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -70,6 +81,7 @@ exports.getAgentSessionTelemetry = getAgentSessionTelemetry;
70
81
  exports.forgetAgentSessionTelemetry = forgetAgentSessionTelemetry;
71
82
  exports.resetAgentSessionTelemetry = resetAgentSessionTelemetry;
72
83
  exports.readOpencodeSessionFrame = readOpencodeSessionFrame;
84
+ exports.readOpencodeSessionInfo = readOpencodeSessionInfo;
73
85
  exports.agentSessionContextPercent = agentSessionContextPercent;
74
86
  exports.getAgentSessionContextUsage = getAgentSessionContextUsage;
75
87
  exports.recordAgentSessionContextUsage = recordAgentSessionContextUsage;
@@ -190,7 +202,25 @@ function readOpencodeSessionFrame(frame, at) {
190
202
  const properties = isPlainObject(frame.properties) ? frame.properties : null;
191
203
  if (!properties)
192
204
  return null;
193
- const info = isPlainObject(properties.info) ? properties.info : null;
205
+ return readOpencodeSessionInfo(properties.info, at);
206
+ }
207
+ /**
208
+ * Read one `Session` object, or answer null (Issue #2981).
209
+ *
210
+ * Split out of {@link readOpencodeSessionFrame} because OpenCode V2 serves the
211
+ * same fields — `Session.Info` in 2.0.18's `GET /openapi.json` declares `id`,
212
+ * `parentID`, `title`, `agent`, `model: { id, providerID, variant? }`, `cost`
213
+ * and `tokens: { input, output, reasoning, cache: { read, write } }` — from
214
+ * `GET /api/session/{id}` instead of on a frame. One reader keeps the two
215
+ * versions from disagreeing about what "verbatim" means, and the sub-agent
216
+ * refusal above applies to both.
217
+ *
218
+ * @param value - The `Session` object, unvalidated
219
+ * @param at - Epoch ms it was received
220
+ * @returns The record to store, or null when this is not one to store
221
+ */
222
+ function readOpencodeSessionInfo(value, at) {
223
+ const info = isPlainObject(value) ? value : null;
194
224
  if (!info)
195
225
  return null;
196
226
  if (typeof info.parentID === 'string' && info.parentID.length > 0)
@@ -276,6 +306,11 @@ function ensureAgentSessionContextUsage(target, record) {
276
306
  // close is what retires it, the same lifetime the record itself has.
277
307
  if (!record || !record.id)
278
308
  return cached;
309
+ // Issue #2981: OpenCode V2 measures its own context in the same refresh that
310
+ // writes the record (`./sources/opencode-v2/usage`), with its own port and
311
+ // password. The v1 fetch below would dial v1's port map for a v2 instance.
312
+ if (target.cliToolId === 'opencode-v2')
313
+ return cached;
279
314
  if (cached && cached.sessionAt === record.at)
280
315
  return cached;
281
316
  if (contextRefreshes.has(key))
@@ -59,6 +59,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
59
59
  exports.CLAUDE_END_TURN_STOP_REASON = exports.CLAUDE_HUMAN_PROMPT_SOURCES = exports.CLAUDE_HUMAN_ORIGIN_KIND = exports.CLAUDE_SLASH_COMMAND_PREFIX = exports.CLAUDE_THINKING_LABEL = exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH = exports.MAX_CLAUDE_TURN_BLOCKS = exports.CLAUDE_TURN_TRUNCATION_MARKER = exports.MAX_CLAUDE_TURN_BODY_LENGTH = exports.CLAUDE_PROJECTS_DIR_SEGMENTS = void 0;
60
60
  exports.claudeProjectSlug = claudeProjectSlug;
61
61
  exports.claudeSlashCommandPrompt = claudeSlashCommandPrompt;
62
+ exports.claudePastedContentPrompt = claudePastedContentPrompt;
62
63
  exports.readClaudeContentBlock = readClaudeContentBlock;
63
64
  exports.readClaudeTranscriptRecord = readClaudeTranscriptRecord;
64
65
  exports.parseClaudeTranscript = parseClaudeTranscript;
@@ -210,6 +211,37 @@ function claudeSlashCommandPrompt(text) {
210
211
  const args = CLAUDE_COMMAND_ARGS_PATTERN.exec(trimmed)?.[1].trim() ?? '';
211
212
  return args.length === 0 ? name : `${name} ${args}`;
212
213
  }
214
+ /**
215
+ * A paste's wrapper: `<pasted_content id="X">` … `</pasted_content id="X">`.
216
+ *
217
+ * The closing tag repeats the opening tag's id (`\1`), so a pair whose ids
218
+ * differ — or a tag only mentioned in prose — is not a wrapper and is left alone.
219
+ * One newline just inside each tag is the wrapper's own framing, not the body's.
220
+ */
221
+ const CLAUDE_PASTED_CONTENT_PATTERN = /<pasted_content id="([^"<>\s]+)">\n?([\s\S]*?)\n?<\/pasted_content id="\1">/g;
222
+ /**
223
+ * The text a person sent, with Claude Code's paste wrapper taken off (Issue #3102).
224
+ *
225
+ * Claude Code records a multi-line message that arrived as a paste — which is
226
+ * what CommandMate's tmux send looks like to it — with the body wrapped in
227
+ * `<pasted_content id="X">…</pasted_content id="X">`. `recordUserTurn` compares
228
+ * the transcript's text with the `/send` row (and a relay row) byte for byte, so
229
+ * the wrapper made every such prompt look like a different message and a second
230
+ * `user` row was written. Unwrapping here lets the existing adoption rules match.
231
+ *
232
+ * Every wrapper in the text is replaced by its body, including one inside a
233
+ * sentence the person typed around a paste. When the result is empty the original
234
+ * is returned, so this never turns a record into a blank prompt.
235
+ *
236
+ * @param text - The record's text, as {@link ClaudeTranscriptRecord.text} holds it
237
+ * @returns The text without wrappers, or `text` itself when there is none to remove
238
+ */
239
+ function claudePastedContentPrompt(text) {
240
+ if (!text.includes('<pasted_content id='))
241
+ return text;
242
+ const unwrapped = text.replace(CLAUDE_PASTED_CONTENT_PATTERN, (_match, _id, body) => body);
243
+ return unwrapped.trim().length === 0 ? text : unwrapped;
244
+ }
213
245
  /**
214
246
  * Read one `message.content` element.
215
247
  *
@@ -517,7 +549,7 @@ function createClaudeTurn(record, sessionId) {
517
549
  // A slash command's record is XML and the operator typed a line; #2265 puts
518
550
  // the line on the turn so that the `user` row reads `/release v0.30.1` and
519
551
  // the `/send` row holding those same bytes is adopted rather than doubled.
520
- promptText: claudeSlashCommandPrompt(record.text) ?? record.text,
552
+ promptText: claudeSlashCommandPrompt(record.text) ?? claudePastedContentPrompt(record.text),
521
553
  promptIsOperatorInput: isClaudeOperatorPromptRecord(record),
522
554
  blocks: [],
523
555
  assistantRecords: 0,