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,133 @@
1
+ "use strict";
2
+ /**
3
+ * reply Command - read an agent session's latest reply (Issue #3039)
4
+ *
5
+ * commandmate reply <worktree-id> [--instance <id|alias>] [--agent <tool>]
6
+ * [--since <iso8601>] [--json]
7
+ *
8
+ * ## Why this exists next to ask / capture
9
+ *
10
+ * `ask` reads the reply to the turn IT sent. A supervisor that nudged a worker
11
+ * with a plain `send` ("stop and report") had no way to read the answer short
12
+ * of opening the tool's transcript file itself — which works for Claude, whose
13
+ * path is computable from the cwd, and not for Command Code, whose project slug
14
+ * is not. `capture` is no substitute: the pane also holds the nudge's own echo,
15
+ * and a pane line cannot be attributed to a turn.
16
+ *
17
+ * The server already has the reply: the transcript readers write each turn into
18
+ * the chat ledger keyed `<tool>-turn:<id>`, and `ask` reads it from there. This
19
+ * command is that read on its own, through the same shared rules
20
+ * (`utils/reply-ledger`), so the two can never disagree about what a reply is.
21
+ *
22
+ * ## What it deliberately does not do
23
+ *
24
+ * - No pane fallback. A row off the screen is exactly what cannot be attributed
25
+ * to a turn; returning it would re-introduce the problem this command solves.
26
+ * Only transcript-reader rows count, for every tool.
27
+ * - No wait. It is one read; "no reply yet" is an answer (exit 0, empty stdout,
28
+ * `reply: null`), not an error, so a caller can poll or give up on its terms.
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.createReplyCommand = createReplyCommand;
32
+ const commander_1 = require("commander");
33
+ const types_1 = require("../types");
34
+ const api_client_1 = require("../utils/api-client");
35
+ const command_helpers_1 = require("../utils/command-helpers");
36
+ const cli_tool_ids_1 = require("../config/cli-tool-ids");
37
+ const agent_target_options_1 = require("../config/agent-target-options");
38
+ const instances_1 = require("./instances");
39
+ const reply_ledger_1 = require("../utils/reply-ledger");
40
+ /**
41
+ * A date-time that starts with a calendar date. Date.parse alone would also
42
+ * take "1" or "Sep 30", which is a typo more often than an intent.
43
+ */
44
+ const ISO_DATE_PREFIX = /^\d{4}-\d{2}-\d{2}/;
45
+ /**
46
+ * Parse `--since <iso8601>` into epoch ms. No value means "any time".
47
+ *
48
+ * @param raw - Raw option value, if the user passed one
49
+ */
50
+ function parseSince(raw) {
51
+ if (raw === undefined)
52
+ return Number.NEGATIVE_INFINITY;
53
+ const value = Date.parse(raw);
54
+ if (!ISO_DATE_PREFIX.test(raw) || !Number.isFinite(value)) {
55
+ console.error('Error: --since must be an ISO 8601 date-time (e.g. 2026-09-30T12:00:00Z).');
56
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
57
+ }
58
+ return value;
59
+ }
60
+ function createReplyCommand() {
61
+ const cmd = new commander_1.Command('reply');
62
+ cmd
63
+ .description('Print the latest reply an agent session wrote (from its transcript; '
64
+ + 'exit 0 with empty stdout when there is none yet)')
65
+ .argument('<worktree-id>', 'Worktree ID')
66
+ .option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
67
+ .option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
68
+ .option('--since <iso8601>', 'Only a reply written at or after this time')
69
+ .option('--json', 'Print { worktreeId, instanceId, cliToolId, reply, requestId, at }')
70
+ .option('--token <token>', command_helpers_1.TOKEN_WARNING)
71
+ .addHelpText('after', `
72
+ Only rows a transcript reader wrote (<tool>-turn:<id>) count as a reply, the
73
+ same rule \`ask\` uses; the pane is never read. Tools with a transcript reader:
74
+ claude, codex, antigravity, command-code, opencode.
75
+
76
+ No reply yet (or none after --since) is not an error: stdout is empty, stderr
77
+ says so in one line, and the exit code is 0. --json prints "reply": null.
78
+ `)
79
+ .action(async (worktreeId, options) => {
80
+ try {
81
+ if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
82
+ console.error('Error: Invalid worktree ID format.');
83
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
84
+ }
85
+ if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
86
+ console.error(`Error: Invalid agent. Must be one of: ${cli_tool_ids_1.CLI_TOOL_IDS.join(', ')}`);
87
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
88
+ }
89
+ if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
90
+ console.error(instances_1.INSTANCE_SELECTOR_ERROR);
91
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
92
+ }
93
+ const since = parseSince(options.since);
94
+ const client = new api_client_1.ApiClient({ token: options.token });
95
+ // Resolved exactly as `ask` resolves it: `--agent` alone names that
96
+ // tool's primary instance (Issue #2479).
97
+ const selector = options.instance ?? options.agent;
98
+ const target = selector
99
+ ? await (0, instances_1.resolveInstanceTarget)(client, worktreeId, selector, options.agent)
100
+ : null;
101
+ const cliToolId = target ? target.cliToolId : options.agent;
102
+ const instanceId = target?.instanceId;
103
+ // Unlike `ask`, a failed read is not swallowed: there is no turn this
104
+ // command completed that a fallback would be protecting.
105
+ const messages = await (0, reply_ledger_1.requestRecentMessages)(client, worktreeId, instanceId);
106
+ const latest = (0, reply_ledger_1.pickLatestReply)((0, reply_ledger_1.replyCandidates)(messages, since), true);
107
+ if (options.json) {
108
+ const payload = {
109
+ worktreeId,
110
+ instanceId: instanceId ?? null,
111
+ cliToolId: cliToolId ?? null,
112
+ reply: latest?.content ?? null,
113
+ requestId: latest?.requestId ?? null,
114
+ at: latest?.at ?? null,
115
+ };
116
+ console.log(JSON.stringify(payload, null, 2));
117
+ }
118
+ else if (latest) {
119
+ console.log(latest.content);
120
+ }
121
+ if (!latest) {
122
+ console.error(options.since
123
+ ? `No reply since ${options.since} (no transcript row yet).`
124
+ : 'No reply yet (no transcript row yet).');
125
+ }
126
+ process.exit(types_1.ExitCode.SUCCESS);
127
+ }
128
+ catch (error) {
129
+ (0, command_helpers_1.handleCommandError)(error);
130
+ }
131
+ });
132
+ return cmd;
133
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2JpC,wBAAgB,oBAAoB,IAAI,OAAO,CA4L9C"}
1
+ {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8apC,wBAAgB,oBAAoB,IAAI,OAAO,CA6F9C"}
@@ -120,6 +120,240 @@ async function answerSolePendingDecision(client, worktreeId, body) {
120
120
  throw error;
121
121
  }
122
122
  }
123
+ /** Reason `/prompt-response` gives when no dialog is on screen any more. */
124
+ const PROMPT_NO_LONGER_ACTIVE = 'prompt_no_longer_active';
125
+ /**
126
+ * Issue #3125: what `--plan-review` takes. Restated rather than imported from
127
+ * `src/lib` (the CLI build does not reach it); the server validates the same set.
128
+ */
129
+ const PLAN_REVIEW_ACTIONS = ['comment', 'submit', 'approve', 'cancel'];
130
+ /** Reasons the server gives for a plan review answer it refused before any key. */
131
+ function isPlanReviewRefusal(reason) {
132
+ return reason.startsWith('plan_review_');
133
+ }
134
+ /** ` --instance <id>` as the caller spelled it, or nothing. */
135
+ function instanceFlag(instance) {
136
+ return instance ? ` --instance ${instance}` : '';
137
+ }
138
+ /**
139
+ * `textFollowUp` from a `/prompt-response` success (Issue #3093), read
140
+ * defensively: an older server omits it, and the route's mirror type is not
141
+ * this command's to widen.
142
+ */
143
+ function readTextFollowUp(result) {
144
+ const value = result?.textFollowUp;
145
+ if (typeof value !== 'object' || value === null)
146
+ return null;
147
+ const { optionNumber, optionLabel } = value;
148
+ if (typeof optionNumber !== 'number' || typeof optionLabel !== 'string')
149
+ return null;
150
+ return { optionNumber, optionLabel };
151
+ }
152
+ /** Argument checks; returns whether --default was chosen. A mocked `process.exit` returns, so nothing here stops early. */
153
+ function validateRespondArgs(worktreeId, answer, options) {
154
+ // [SEC4-04] Validate worktree ID
155
+ if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
156
+ console.error('Error: Invalid worktree ID format.');
157
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
158
+ }
159
+ // Validate agent if provided
160
+ if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
161
+ console.error('Error: Invalid agent.');
162
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
163
+ }
164
+ // Issue #868 / #2376: an instance id or a roster alias.
165
+ if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
166
+ console.error(instances_1.INSTANCE_SELECTOR_ERROR);
167
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
168
+ }
169
+ // Issue #1681: exactly one of <answer> / --default
170
+ const useDefault = options.default === true;
171
+ // Issue #3125: Command Code's plan review. `approve` / `cancel` take no text,
172
+ // `comment` needs it, and `submit` takes an optional comment to send first.
173
+ const planReview = options.planReview;
174
+ if (planReview !== undefined) {
175
+ if (!PLAN_REVIEW_ACTIONS.includes(planReview)) {
176
+ console.error(`Error: --plan-review must be one of: ${PLAN_REVIEW_ACTIONS.join(', ')}.`);
177
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
178
+ }
179
+ if (useDefault) {
180
+ console.error('Error: --plan-review and --default are mutually exclusive.');
181
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
182
+ }
183
+ if ((planReview === 'approve' || planReview === 'cancel') && answer !== undefined) {
184
+ console.error(`Error: --plan-review ${planReview} takes no <answer>.`);
185
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
186
+ }
187
+ if (planReview === 'comment' && (answer === undefined || !answer.trim())) {
188
+ console.error('Error: --plan-review comment needs the comment text as <answer>.');
189
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
190
+ }
191
+ return false;
192
+ }
193
+ if (useDefault && answer !== undefined) {
194
+ console.error('Error: <answer> and --default are mutually exclusive.');
195
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
196
+ }
197
+ if (!useDefault && (answer === undefined || !answer.trim())) {
198
+ console.error('Error: Answer cannot be empty. Provide an answer or --default.');
199
+ process.exit(types_1.ExitCode.CONFIG_ERROR);
200
+ }
201
+ return useDefault;
202
+ }
203
+ /** The `/prompt-response` request body. */
204
+ function buildPromptResponseBody(useDefault, answer, agent, instanceId, planReview) {
205
+ // [DR2-06] Use prompt-response API with cliTool (not cliToolId)
206
+ const body = useDefault ? { useDefault: true } : { answer };
207
+ // Issue #3125: Command Code's plan review action.
208
+ if (planReview !== undefined) {
209
+ body.planReviewAction = planReview;
210
+ }
211
+ if (agent) {
212
+ body.cliTool = agent;
213
+ }
214
+ // Issue #868: target a specific agent instance
215
+ if (instanceId) {
216
+ body.instanceId = instanceId;
217
+ }
218
+ return body;
219
+ }
220
+ /** Reports a `success: false` result and sets the exit code. */
221
+ function reportFailedResponse(result, worktreeId, answer, useDefault, options) {
222
+ // [DR2-06] Check reason for failure
223
+ const reason = result.reason || 'unknown';
224
+ // Issue #1681 / #1726: these mean the server refused BEFORE sending,
225
+ // so the terminal is untouched — worth saying plainly, because the
226
+ // other reasons leave the answer's fate unknown. Issue #2486 adds
227
+ // `unsupported_dialog_layout`: a picker IS on screen but its layout
228
+ // could not be verified, and the server's message says what to do.
229
+ // Issue #3125 adds the `plan_review_*` refusals: the plan review overlay was
230
+ // read and the request did not fit its current focus, so nothing was typed.
231
+ const refusedBeforeSending = reason === 'unresolvable_answer' ||
232
+ reason === 'answer_out_of_range' ||
233
+ reason === 'unsupported_dialog_layout' ||
234
+ isPlanReviewRefusal(reason);
235
+ // Issue #1898: the verdict was addressed to the agent's own API and
236
+ // the POST did not land. Distinct from the two above — the answer was
237
+ // resolved and an attempt was made — and distinct from a keystroke,
238
+ // whose fate is never knowable.
239
+ if (reason === 'decision_not_delivered') {
240
+ console.error(`Error: The approval could not be delivered to the agent (reason: ${reason}). ` +
241
+ 'The dialog is still open; answer it in the terminal.');
242
+ process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
243
+ }
244
+ if (refusedBeforeSending) {
245
+ console.error(`Error: Answer was not sent. Reason: ${reason}${result.message ? ` (${result.message})` : ''}`);
246
+ // Issue #2583: the operator who lands here typed WORDS at a dialog
247
+ // that only takes a choice — a claude / agy Bash approval refused as
248
+ // free text, or #2573's "No, tell … what to do differently" row. The
249
+ // server's sentence ends with "answer with the option number", and
250
+ // this is that command with the ids already filled in, so the next
251
+ // step is a paste rather than a trip to the docs while a dialog sits
252
+ // open. Printed only for the reason that means "this answer could not
253
+ // be mapped onto a choice", and only when the answer was not already
254
+ // a number (where the number itself is what was wrong).
255
+ if (reason === 'unresolvable_answer' && answer !== undefined && !/^\d+$/.test(answer.trim())) {
256
+ const target = options.instance ? ` --instance ${options.instance}` : '';
257
+ console.error(`Hint: answer with the option number — \`commandmate respond ${worktreeId} <number>${target}\` ` +
258
+ `(\`commandmate capture ${worktreeId}${target}\` prints the dialog and its numbers).`);
259
+ }
260
+ }
261
+ else {
262
+ console.error(`Warning: Response may not have been applied. Reason: ${reason}`);
263
+ // Issue #3093: the usual way here is the second half of a "No, tell
264
+ // … what to do differently" answer — the row closed the dialog and
265
+ // the agent is waiting for the reason in its input box, which
266
+ // `respond` (dialogs only) cannot reach and `send` can.
267
+ if (reason === PROMPT_NO_LONGER_ACTIVE && !useDefault && answer !== undefined && !/^\d+$/.test(answer.trim())) {
268
+ console.error('Hint: no dialog is open, so this text was not delivered. If you just chose an option that asks ' +
269
+ 'for text (e.g. "No, tell … what to do differently"), the agent is waiting for it in its input box — ' +
270
+ `send it with \`commandmate send ${worktreeId} "<text>"${instanceFlag(options.instance)}\`.`);
271
+ }
272
+ }
273
+ // Issue #1726: an option number the agent's own payload does not offer
274
+ // is a bad argument, so it exits with the input-error code the rest of
275
+ // this command already uses for a malformed worktree id or agent.
276
+ process.exit(reason === 'answer_out_of_range' ? types_1.ExitCode.CONFIG_ERROR : types_1.ExitCode.UNEXPECTED_ERROR);
277
+ }
278
+ /**
279
+ * What was done on Command Code's plan review (Issue #3125), and the next step:
280
+ * a pinned comment is not delivered to the agent until the review is submitted.
281
+ */
282
+ function printPlanReviewOutcome(result, worktreeId, options) {
283
+ const planReview = result.planReview;
284
+ if (!planReview)
285
+ return;
286
+ const target = instanceFlag(options.instance);
287
+ switch (planReview.action) {
288
+ case 'comment':
289
+ console.log(`Plan review: pinned comment "${planReview.comment ?? ''}".`);
290
+ console.error(`Next: send the review with \`commandmate respond ${worktreeId} --plan-review submit${target}\` ` +
291
+ `(ctrl+r), or approve with \`--plan-review approve\` (comments go along as notes).`);
292
+ break;
293
+ case 'submit':
294
+ console.log(planReview.comment
295
+ ? `Plan review: pinned comment "${planReview.comment}" and submitted the review (ctrl+r).`
296
+ : 'Plan review: submitted the review (ctrl+r).');
297
+ break;
298
+ case 'approve':
299
+ if (planReview.phase === 'approve-choice') {
300
+ console.log(`Plan review: confirmed the approval (${planReview.approveChoice === 'discard-comments' ? 'discarding' : 'with'} the pending comments).`);
301
+ }
302
+ else {
303
+ console.log('Plan review: approved the plan (ctrl+a).');
304
+ if (planReview.pendingCommentsBefore > 0) {
305
+ console.error('Note: with pending comments Command Code may ask how to approve — confirm with ' +
306
+ `\`commandmate respond ${worktreeId} --plan-review approve${target}\` again, or go back with \`--plan-review cancel\`.`);
307
+ }
308
+ }
309
+ break;
310
+ case 'cancel':
311
+ console.log(planReview.phase === 'approve-choice'
312
+ ? 'Plan review: went back from the approval choice (esc).'
313
+ : 'Plan review: cancelled the plan (esc).');
314
+ if (planReview.phase !== 'approve-choice' && planReview.pendingCommentsBefore > 0) {
315
+ console.error(`Note: ${planReview.pendingCommentsBefore} pending comment(s) were discarded with it.`);
316
+ }
317
+ break;
318
+ }
319
+ }
320
+ /** Audit trail of which option was actually selected. */
321
+ function printResolvedAudit(result, answer) {
322
+ // Issue #1681: audit trail — print which option was actually selected.
323
+ const resolved = result?.resolved;
324
+ if (resolved) {
325
+ if (resolved.via === 'structured-decision') {
326
+ // Issue #1898: no key was sent. The verdict went to the agent's own
327
+ // API by decision id, which is the only way an opencode approval can
328
+ // be answered at all — worth saying, because "Response sent." on
329
+ // this path would read as "a 1 was typed into the pane".
330
+ console.log(`Answered approval ${resolved.decisionId ?? '(unknown id)'} with ` +
331
+ `option ${resolved.optionNumber}: ${resolved.optionLabel}`);
332
+ }
333
+ else if (resolved.via === 'structured-question') {
334
+ // Issue #2040: a question, answered over `POST /question/:id/reply`.
335
+ // What is printed is what reached the AGENT — the labels — rather
336
+ // than the number that was typed: `respond <id> 2` at a question is
337
+ // a position in the agent's own list, and an operator reconciling
338
+ // what they meant against what was sent needs the other end of that
339
+ // mapping. `freeText` prints the text for the same reason.
340
+ const chosen = resolved.optionLabels ?? [];
341
+ console.log(`Answered question ${resolved.decisionId ?? '(unknown id)'} with ` +
342
+ (chosen.length > 0
343
+ ? chosen.map((label, index) => `${resolved.optionNumbers?.[index] ?? '?'}: ${label}`).join(', ')
344
+ : `free text: ${(resolved.answers?.[0] ?? []).join(', ')}`));
345
+ }
346
+ else if (resolved.via === 'semantic') {
347
+ console.log(`Resolved "${answer}" to option ${resolved.optionNumber}: ${resolved.optionLabel}`);
348
+ }
349
+ else if (resolved.optionNumber !== undefined) {
350
+ console.log(`Selected default option ${resolved.optionNumber}: ${resolved.optionLabel}`);
351
+ }
352
+ else {
353
+ console.log(`Selected default answer: ${resolved.optionLabel}`);
354
+ }
355
+ }
356
+ }
123
357
  function createRespondCommand() {
124
358
  const cmd = new commander_1.Command('respond');
125
359
  cmd
@@ -127,36 +361,14 @@ function createRespondCommand() {
127
361
  .argument('<worktree-id>', 'Worktree ID')
128
362
  .argument('[answer]', 'Response answer (yes, no, number, or free text)')
129
363
  .option('--default', "Select the prompt's default option (mutually exclusive with <answer>)")
364
+ .option('--plan-review <action>', 'Command Code plan review: comment | submit | approve | cancel ' +
365
+ '(text alone is a comment; submit takes an optional comment; approve/cancel take no <answer>)')
130
366
  .option('--instance <id>', `${agent_target_options_1.INSTANCE_OPTION_DESCRIPTION} ${instances_1.INSTANCE_ALIAS_HELP_SUFFIX}`)
131
367
  .option('--agent <agent>', agent_target_options_1.AGENT_OPTION_DESCRIPTION)
132
368
  .option('--token <token>', command_helpers_1.TOKEN_WARNING)
133
369
  .action(async (worktreeId, answer, options) => {
134
370
  try {
135
- // [SEC4-04] Validate worktree ID
136
- if (!(0, api_client_1.isValidWorktreeId)(worktreeId)) {
137
- console.error('Error: Invalid worktree ID format.');
138
- process.exit(types_1.ExitCode.CONFIG_ERROR);
139
- }
140
- // Validate agent if provided
141
- if (options.agent && !(0, cli_tool_ids_1.isCliToolId)(options.agent)) {
142
- console.error('Error: Invalid agent.');
143
- process.exit(types_1.ExitCode.CONFIG_ERROR);
144
- }
145
- // Issue #868 / #2376: an instance id or a roster alias.
146
- if (options.instance && !(0, instances_1.isInstanceSelector)(options.instance)) {
147
- console.error(instances_1.INSTANCE_SELECTOR_ERROR);
148
- process.exit(types_1.ExitCode.CONFIG_ERROR);
149
- }
150
- // Issue #1681: exactly one of <answer> / --default
151
- const useDefault = options.default === true;
152
- if (useDefault && answer !== undefined) {
153
- console.error('Error: <answer> and --default are mutually exclusive.');
154
- process.exit(types_1.ExitCode.CONFIG_ERROR);
155
- }
156
- if (!useDefault && (answer === undefined || !answer.trim())) {
157
- console.error('Error: Answer cannot be empty. Provide an answer or --default.');
158
- process.exit(types_1.ExitCode.CONFIG_ERROR);
159
- }
371
+ const useDefault = validateRespondArgs(worktreeId, answer, options);
160
372
  const client = new api_client_1.ApiClient({ token: options.token });
161
373
  // Issue #1629: /prompt-response derives the session name from cliTool
162
374
  // and falls back to the worktree default, so `--instance codex` alone
@@ -168,15 +380,7 @@ function createRespondCommand() {
168
380
  const agent = target ? target.cliToolId : options.agent;
169
381
  // Issue #2376: the resolved id. /prompt-response reads instance ids.
170
382
  const instanceId = target?.instanceId;
171
- // [DR2-06] Use prompt-response API with cliTool (not cliToolId)
172
- const body = useDefault ? { useDefault: true } : { answer };
173
- if (agent) {
174
- body.cliTool = agent;
175
- }
176
- // Issue #868: target a specific agent instance
177
- if (instanceId) {
178
- body.instanceId = instanceId;
179
- }
383
+ const body = buildPromptResponseBody(useDefault, answer, agent, instanceId, options.planReview);
180
384
  // Issue #2040: for an agent that publishes per-decision ids (opencode
181
385
  // today, and only opencode), a bare `respond <worktree> 3` names the ONE
182
386
  // decision that agent is holding, and the number is resolved against
@@ -189,7 +393,11 @@ function createRespondCommand() {
189
393
  // the structured path refuses it (`answerStructuredDecision` says so in
190
394
  // as many words) — while Enter at a `keys` dialog is a real answer that
191
395
  // this command has always been able to give.
192
- const structured = !useDefault && (await addressesDecisionsById(client, worktreeId, agent, instanceId));
396
+ //
397
+ // Issue #3125: a plan review action names no decision, so it skips this.
398
+ const structured = !useDefault &&
399
+ options.planReview === undefined &&
400
+ (await addressesDecisionsById(client, worktreeId, agent, instanceId));
193
401
  let result = null;
194
402
  if (structured) {
195
403
  const outcome = await answerSolePendingDecision(client, worktreeId, body);
@@ -205,85 +413,20 @@ function createRespondCommand() {
205
413
  result = await client.post(`/api/worktrees/${worktreeId}/prompt-response`, body);
206
414
  }
207
415
  if (result && !result.success) {
208
- // [DR2-06] Check reason for failure
209
- const reason = result.reason || 'unknown';
210
- // Issue #1681 / #1726: these mean the server refused BEFORE sending,
211
- // so the terminal is untouched — worth saying plainly, because the
212
- // other reasons leave the answer's fate unknown. Issue #2486 adds
213
- // `unsupported_dialog_layout`: a picker IS on screen but its layout
214
- // could not be verified, and the server's message says what to do.
215
- const refusedBeforeSending = reason === 'unresolvable_answer' ||
216
- reason === 'answer_out_of_range' ||
217
- reason === 'unsupported_dialog_layout';
218
- // Issue #1898: the verdict was addressed to the agent's own API and
219
- // the POST did not land. Distinct from the two above — the answer was
220
- // resolved and an attempt was made — and distinct from a keystroke,
221
- // whose fate is never knowable.
222
- if (reason === 'decision_not_delivered') {
223
- console.error(`Error: The approval could not be delivered to the agent (reason: ${reason}). ` +
224
- 'The dialog is still open; answer it in the terminal.');
225
- process.exit(types_1.ExitCode.UNEXPECTED_ERROR);
226
- }
227
- if (refusedBeforeSending) {
228
- console.error(`Error: Answer was not sent. Reason: ${reason}${result.message ? ` (${result.message})` : ''}`);
229
- // Issue #2583: the operator who lands here typed WORDS at a dialog
230
- // that only takes a choice — a claude / agy Bash approval refused as
231
- // free text, or #2573's "No, tell … what to do differently" row. The
232
- // server's sentence ends with "answer with the option number", and
233
- // this is that command with the ids already filled in, so the next
234
- // step is a paste rather than a trip to the docs while a dialog sits
235
- // open. Printed only for the reason that means "this answer could not
236
- // be mapped onto a choice", and only when the answer was not already
237
- // a number (where the number itself is what was wrong).
238
- if (reason === 'unresolvable_answer' && answer !== undefined && !/^\d+$/.test(answer.trim())) {
239
- const target = options.instance ? ` --instance ${options.instance}` : '';
240
- console.error(`Hint: answer with the option number — \`commandmate respond ${worktreeId} <number>${target}\` ` +
241
- `(\`commandmate capture ${worktreeId}${target}\` prints the dialog and its numbers).`);
242
- }
243
- }
244
- else {
245
- console.error(`Warning: Response may not have been applied. Reason: ${reason}`);
246
- }
247
- // Issue #1726: an option number the agent's own payload does not offer
248
- // is a bad argument, so it exits with the input-error code the rest of
249
- // this command already uses for a malformed worktree id or agent.
250
- process.exit(reason === 'answer_out_of_range' ? types_1.ExitCode.CONFIG_ERROR : types_1.ExitCode.UNEXPECTED_ERROR);
251
- }
252
- // Issue #1681: audit trail — print which option was actually selected.
253
- const resolved = result?.resolved;
254
- if (resolved) {
255
- if (resolved.via === 'structured-decision') {
256
- // Issue #1898: no key was sent. The verdict went to the agent's own
257
- // API by decision id, which is the only way an opencode approval can
258
- // be answered at all — worth saying, because "Response sent." on
259
- // this path would read as "a 1 was typed into the pane".
260
- console.log(`Answered approval ${resolved.decisionId ?? '(unknown id)'} with ` +
261
- `option ${resolved.optionNumber}: ${resolved.optionLabel}`);
262
- }
263
- else if (resolved.via === 'structured-question') {
264
- // Issue #2040: a question, answered over `POST /question/:id/reply`.
265
- // What is printed is what reached the AGENT — the labels — rather
266
- // than the number that was typed: `respond <id> 2` at a question is
267
- // a position in the agent's own list, and an operator reconciling
268
- // what they meant against what was sent needs the other end of that
269
- // mapping. `freeText` prints the text for the same reason.
270
- const chosen = resolved.optionLabels ?? [];
271
- console.log(`Answered question ${resolved.decisionId ?? '(unknown id)'} with ` +
272
- (chosen.length > 0
273
- ? chosen.map((label, index) => `${resolved.optionNumbers?.[index] ?? '?'}: ${label}`).join(', ')
274
- : `free text: ${(resolved.answers?.[0] ?? []).join(', ')}`));
275
- }
276
- else if (resolved.via === 'semantic') {
277
- console.log(`Resolved "${answer}" to option ${resolved.optionNumber}: ${resolved.optionLabel}`);
278
- }
279
- else if (resolved.optionNumber !== undefined) {
280
- console.log(`Selected default option ${resolved.optionNumber}: ${resolved.optionLabel}`);
281
- }
282
- else {
283
- console.log(`Selected default answer: ${resolved.optionLabel}`);
284
- }
416
+ reportFailedResponse(result, worktreeId, answer, useDefault, options);
285
417
  }
418
+ printResolvedAudit(result, answer);
419
+ if (result && 'planReview' in result)
420
+ printPlanReviewOutcome(result, worktreeId, options);
286
421
  console.error('Response sent.');
422
+ // Issue #3093: the option just chosen continues as typed text, which the
423
+ // dialog no longer takes — name the command that does deliver it.
424
+ const followUp = readTextFollowUp(result);
425
+ if (followUp) {
426
+ console.error(`Next: option ${followUp.optionNumber} ("${followUp.optionLabel}") asks for your text, and the dialog ` +
427
+ 'is closed now, so `respond` cannot deliver it — send it with ' +
428
+ `\`commandmate send ${worktreeId} "<text>"${instanceFlag(options.instance)}\`.`);
429
+ }
287
430
  }
288
431
  catch (error) {
289
432
  (0, command_helpers_1.handleCommandError)(error);
@@ -1 +1 @@
1
- {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AASlE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAyFrE"}
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/stop.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,WAAW,EAA6B,MAAM,UAAU,CAAC;AA8ClE;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GrE"}
@@ -14,7 +14,39 @@ const daemon_1 = require("../utils/daemon");
14
14
  const security_logger_1 = require("../utils/security-logger");
15
15
  const env_setup_1 = require("../utils/env-setup");
16
16
  const input_validators_1 = require("../utils/input-validators");
17
+ const server_ready_1 = require("../utils/server-ready");
18
+ const server_url_1 = require("../utils/server-url");
19
+ const process_inspect_1 = require("../utils/process-inspect");
17
20
  const logger = new logger_1.CLILogger();
21
+ /**
22
+ * Issue #3087: with nothing recorded to stop, make sure nothing answers on the configured port
23
+ * either. A server whose PID file is gone (an orphan from an earlier start, or a file removed by
24
+ * a failed run) still serves there, and "Status: Stopped" would be false. Such a process cannot
25
+ * be proven to be ours, so it is reported, never killed.
26
+ *
27
+ * Only the main server's .env port is known here; a worktree server's port is not re-derived.
28
+ *
29
+ * @returns true when the configured port is free
30
+ */
31
+ async function ensureConfiguredPortFree(daemonManager, serverLabel) {
32
+ const endpoint = (0, server_url_1.resolveServerEndpoint)(daemonManager.getEffectiveEnv());
33
+ const host = endpoint.bind === '0.0.0.0' ? '127.0.0.1' : endpoint.bind;
34
+ if (!(await (0, server_ready_1.isPortInUse)(host, endpoint.port))) {
35
+ return true;
36
+ }
37
+ const listeners = (0, process_inspect_1.describeListeners)(endpoint.port);
38
+ logger.error(`${serverLabel} has no running process on record, but something is answering on ${host}:${endpoint.port}` +
39
+ `${listeners ? `: ${listeners}` : ''}.`);
40
+ logger.info('It was not started through this PID file, so it was not stopped. ' +
41
+ 'If it is an earlier CommandMate server, stop it yourself (e.g. kill <PID>).');
42
+ (0, security_logger_1.logSecurityEvent)({
43
+ timestamp: new Date().toISOString(),
44
+ command: 'stop',
45
+ action: 'failure',
46
+ details: `Unrecorded listener on port ${endpoint.port}${listeners ? ` (${listeners})` : ''}`,
47
+ });
48
+ return false;
49
+ }
18
50
  /**
19
51
  * Execute stop command
20
52
  * Issue #125: Use getPidFilePath for correct path resolution
@@ -44,10 +76,30 @@ async function stopCommand(options) {
44
76
  const status = await daemonManager.getStatus();
45
77
  if (status === null) {
46
78
  logger.info(`${serverLabel} is not running (no PID file found)`);
47
- logger.info('Status: Stopped');
48
79
  }
49
80
  else {
50
81
  logger.info(`${serverLabel} is not running (stale PID file)`);
82
+ // Issue #3087: the recorded npm process can be gone while the server it launched still
83
+ // listens as an orphan. stop() finds that process group and stops it, and only reports
84
+ // failure when something is left behind.
85
+ if (!(await daemonManager.stop(options.force))) {
86
+ logger.error(`Failed to stop ${serverLabel}: its processes or port are still in use`);
87
+ (0, security_logger_1.logSecurityEvent)({
88
+ timestamp: new Date().toISOString(),
89
+ command: 'stop',
90
+ action: 'failure',
91
+ details: `Failed to stop orphaned server of PID ${status.pid ?? 'unknown'}${options.issue !== undefined ? ` (Issue #${options.issue})` : ''}`,
92
+ });
93
+ process.exit(types_1.ExitCode.STOP_FAILED);
94
+ return;
95
+ }
96
+ }
97
+ if (options.issue === undefined && !(await ensureConfiguredPortFree(daemonManager, serverLabel))) {
98
+ process.exit(types_1.ExitCode.STOP_FAILED);
99
+ return;
100
+ }
101
+ if (status === null) {
102
+ logger.info('Status: Stopped');
51
103
  }
52
104
  process.exit(types_1.ExitCode.SUCCESS);
53
105
  return;
@@ -39,9 +39,9 @@ function createSyncCommand() {
39
39
  }
40
40
  }
41
41
  catch (error) {
42
- // The route's only 400 is "No repositories configured..." — the server's
43
- // wording names the fix (WORKTREE_REPOS / CM_ROOT_DIR), so pass it
44
- // through instead of the generic "Bad request" mapping.
42
+ // The route's only 400 is "No repositories are registered yet..." — the
43
+ // server's wording names the fix (Web UI Add Repository / WORKTREE_REPOS),
44
+ // so pass it through instead of the generic "Bad request" mapping.
45
45
  if (error instanceof api_client_1.ApiError && error.statusCode === 400 && error.payload?.error) {
46
46
  console.error(`Error: ${error.payload.error}`);
47
47
  process.exit(types_1.ExitCode.CONFIG_ERROR);
@@ -124,6 +124,11 @@ export interface PollWorktreeOptions extends WaitOptions {
124
124
  export declare function pollWorktree(client: ApiClient, worktreeId: string, options: PollWorktreeOptions): Promise<{
125
125
  exitCode: number;
126
126
  output?: WaitPromptOutput;
127
+ /** Set with exit 11: which upstream fault was on the frame (Issue #3011). */
128
+ upstreamFault?: {
129
+ id: string;
130
+ matchedText: string;
131
+ };
127
132
  }>;
128
133
  export declare function createWaitCommand(): Command;
129
134
  //# sourceMappingURL=wait.d.ts.map