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,187 @@
1
+ "use strict";
2
+ /**
3
+ * Reading an agent's reply out of the chat ledger (Issue #2376 / #2386 / #3039)
4
+ *
5
+ * `ask` reads the reply after its own turn; `reply` (Issue #3039) reads the
6
+ * latest reply of a turn somebody else sent — a worker told to "stop and
7
+ * report" by a supervisor nudge. Both mean the same thing by "the reply", so
8
+ * the rules live here once rather than in two commands that can drift:
9
+ *
10
+ * - only assistant rows in `GET /api/worktrees/:id/messages` are candidates,
11
+ * prompt rows excluded;
12
+ * - CommandMate's own furniture (`relay-sys:` / `model-changed:`) is never an
13
+ * answer;
14
+ * - a row a transcript reader wrote (`<tool>-turn:<id>`) wins over a scrape;
15
+ * - ANSI escapes and control bytes are dropped before the text is returned.
16
+ *
17
+ * What differs between the two callers — how long to hold out for a turn row,
18
+ * and whether an unmarked row may stand in for one — stays with the caller.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.TRANSCRIPT_READER_TOOLS = exports.REPLY_LOOKBACK_MESSAGES = void 0;
22
+ exports.sanitizeReply = sanitizeReply;
23
+ exports.replyCandidates = replyCandidates;
24
+ exports.pickLatestReply = pickLatestReply;
25
+ exports.requestRecentMessages = requestRecentMessages;
26
+ exports.fetchRecentMessages = fetchRecentMessages;
27
+ /**
28
+ * Chat rows read back per request.
29
+ *
30
+ * Bounded because only the tail matters and an unbounded read of a long-running
31
+ * worktree's history is a large response for one line of answer. Generous
32
+ * enough that a turn which wrote several assistant rows (a tool-use narration
33
+ * followed by the summary) still has its last one inside the window.
34
+ */
35
+ exports.REPLY_LOOKBACK_MESSAGES = 30;
36
+ /**
37
+ * The `request_id` namespace every transcript reader mints for a turn.
38
+ *
39
+ * `codex-turn:<turn_id>`, `claude-turn:<uuid>`, `antigravity-turn:<id>`,
40
+ * `command-code-turn:<id>` and opencode's `oc-turn:<msg id>` — mirrored here as
41
+ * a shape rather than imported: the CLI bundle keeps its own copies of API
42
+ * strings instead of pulling `src/types/agent-transcript.ts` and its dependents
43
+ * into `build:cli`. Matching the shape rather than a list of five literals is
44
+ * also what stops the sixth reader from silently landing outside the filter.
45
+ *
46
+ * A `:` cannot appear in any of the ids themselves, so this cannot match a row
47
+ * that merely CONTAINS the text.
48
+ */
49
+ const TURN_REQUEST_ID_PATTERN = /-turn:/;
50
+ /**
51
+ * Request-id namespaces CommandMate writes about a session, not for it.
52
+ *
53
+ * `chat_messages` has no `system` role, so "the model changed" (Issue #2357)
54
+ * and "reply from X" (Issue #2377) are both stored as ASSISTANT rows and told
55
+ * apart by their request id. Neither is anything the other session said, and
56
+ * delivering the relay notice back as an answer is the smallest possible loop —
57
+ * `findWorkerReply` steps over the same rows for the same reason.
58
+ */
59
+ const SYSTEM_ROW_REQUEST_ID_PREFIXES = ['relay-sys:', 'model-changed:'];
60
+ /**
61
+ * Tools whose reply CommandMate reads out of a transcript rather than a screen.
62
+ *
63
+ * For these five the ledger is authoritative and a row with no turn marker is
64
+ * by definition not the answer. For every other tool (copilot / gemini /
65
+ * vibe-local) the scraper's row is the only record there will ever be.
66
+ *
67
+ * Mirrors the five readers that live under `src/lib/hooks/sources/`.
68
+ */
69
+ exports.TRANSCRIPT_READER_TOOLS = new Set([
70
+ 'claude',
71
+ 'codex',
72
+ 'antigravity',
73
+ 'command-code',
74
+ 'opencode',
75
+ ]);
76
+ /**
77
+ * ANSI escape sequences, as a pattern built from escapes rather than literals.
78
+ *
79
+ * `scripts/check-control-chars.mjs` fails the build on a raw C0 byte in `src/`
80
+ * (Issue #1432), and a raw ESC here would be one.
81
+ */
82
+ const ANSI_ESCAPE_PATTERN = /[\u001B\u009B][[\]()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PR-TZcf-nqry=><]/g;
83
+ /** Remaining C0/C1 control bytes, once the sequences above are gone. */
84
+ const CONTROL_CHAR_PATTERN = /[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g;
85
+ /**
86
+ * A reply body fit to print, or `''` if nothing survived.
87
+ *
88
+ * Issue #2386 asked for this as a belt to the braces: the row the junk came
89
+ * from held RAW ANSI, and a caller that pipes a reply into a report or a commit
90
+ * message should never have to strip escape codes out of an agent's sentence.
91
+ *
92
+ * @param raw - Reply text as it arrived
93
+ */
94
+ function sanitizeReply(raw) {
95
+ return raw.replace(ANSI_ESCAPE_PATTERN, '').replace(CONTROL_CHAR_PATTERN, '').trim();
96
+ }
97
+ /** Whether a row's `request_id` says a transcript reader wrote it. */
98
+ function isTurnRow(requestId) {
99
+ return typeof requestId === 'string' && TURN_REQUEST_ID_PATTERN.test(requestId);
100
+ }
101
+ /** Whether a row is CommandMate's own furniture rather than the agent's words. */
102
+ function isSystemRow(requestId) {
103
+ return typeof requestId === 'string'
104
+ && SYSTEM_ROW_REQUEST_ID_PREFIXES.some((prefix) => requestId.startsWith(prefix));
105
+ }
106
+ /**
107
+ * The rows that could be a reply written at or after `since`, oldest first.
108
+ *
109
+ * @param messages - Rows as the messages route serialized them
110
+ * @param since - Epoch ms; rows stamped earlier are not candidates
111
+ */
112
+ function replyCandidates(messages, since) {
113
+ const candidates = [];
114
+ for (const m of messages) {
115
+ if (m.role !== 'assistant')
116
+ continue;
117
+ if (m.messageType === 'prompt')
118
+ continue;
119
+ if (typeof m.content !== 'string')
120
+ continue;
121
+ if (!(Date.parse(m.timestamp) >= since))
122
+ continue;
123
+ if (isSystemRow(m.requestId))
124
+ continue;
125
+ const content = sanitizeReply(m.content);
126
+ if (content === '')
127
+ continue;
128
+ candidates.push({
129
+ content,
130
+ fromTranscript: isTurnRow(m.requestId),
131
+ requestId: typeof m.requestId === 'string' ? m.requestId : null,
132
+ at: m.timestamp,
133
+ });
134
+ }
135
+ return candidates;
136
+ }
137
+ /**
138
+ * The newest reply among `candidates`, or null.
139
+ *
140
+ * Newest first among the rows a reader wrote: a turn that emitted several
141
+ * assistant rows (a narration then the summary) still ends on its summary.
142
+ * When `turnRowsOnly` is false and no reader wrote anything, the newest row of
143
+ * any kind is taken — the only record a tool without a transcript has.
144
+ *
145
+ * @param candidates - Output of {@link replyCandidates}
146
+ * @param turnRowsOnly - Whether an unmarked (scraped) row may stand in
147
+ */
148
+ function pickLatestReply(candidates, turnRowsOnly) {
149
+ for (let i = candidates.length - 1; i >= 0; i -= 1) {
150
+ if (candidates[i].fromTranscript)
151
+ return candidates[i];
152
+ }
153
+ if (turnRowsOnly)
154
+ return null;
155
+ return candidates[candidates.length - 1] ?? null;
156
+ }
157
+ /**
158
+ * The recent chat rows for this instance. Throws what the API client throws.
159
+ *
160
+ * @param client - API client
161
+ * @param worktreeId - Worktree ID
162
+ * @param instanceId - Resolved instance ID, or undefined for every instance
163
+ */
164
+ async function requestRecentMessages(client, worktreeId, instanceId) {
165
+ const query = new URLSearchParams({ limit: String(exports.REPLY_LOOKBACK_MESSAGES) });
166
+ if (instanceId)
167
+ query.set('instance', instanceId);
168
+ // PromptMessageResponse is the CLI's mirror of a serialized chat row; the
169
+ // `messageType: 'prompt'` filter is the caller's, not the type's, so it is
170
+ // the right shape for reading normal rows too.
171
+ const messages = await client.get(`/api/worktrees/${worktreeId}/messages?${query.toString()}`);
172
+ return Array.isArray(messages) ? messages : [];
173
+ }
174
+ /**
175
+ * {@link requestRecentMessages}, or null if the rows cannot be read.
176
+ *
177
+ * For a caller whose turn already completed: a daemon that cannot serve the
178
+ * ledger is a reason to fall back, not a reason to lose the turn.
179
+ */
180
+ async function fetchRecentMessages(client, worktreeId, instanceId) {
181
+ try {
182
+ return await requestRecentMessages(client, worktreeId, instanceId);
183
+ }
184
+ catch {
185
+ return null;
186
+ }
187
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Launched-server identity check
3
+ * Issue #3087: `remote` published whatever answered on the port
4
+ *
5
+ * A TCP connect only proves that SOMETHING listens. In #3087 an orphaned server from an
6
+ * earlier `start --daemon` (no authentication) kept the port, the server `remote` launched
7
+ * died on EADDRINUSE, and `remote` put the orphan behind a public tunnel.
8
+ *
9
+ * Before anything is published, this asks the endpoint two questions over plain HTTP(S):
10
+ *
11
+ * 1. A request carrying a token nobody holds must be refused with 401. Anything else means
12
+ * authentication is off (or the answer is not CommandMate's middleware), so the server
13
+ * would be reachable without pairing.
14
+ * 2. A request carrying the session token `remote` minted moments ago must succeed. Only
15
+ * the server launched with that token's hash can accept it, so this proves the listener
16
+ * is the one this invocation started — no new API route or nonce is needed.
17
+ *
18
+ * Question 1 is asked first so the session token is never sent to a server already shown to
19
+ * be the wrong one. Every outcome that is not a clear "yes" to both is a refusal (fail-closed);
20
+ * only connection errors and 5xx (a server still warming up) are retried until the deadline.
21
+ *
22
+ * @module server-identity
23
+ */
24
+ /** Path probed: authenticated like every API route, and it reads nothing (Issue #1925). */
25
+ export declare const IDENTITY_PROBE_PATH = "/api/capabilities";
26
+ export declare const DEFAULT_IDENTITY_TIMEOUT_MS = 30000;
27
+ export declare const DEFAULT_IDENTITY_INTERVAL_MS = 300;
28
+ export interface VerifyLaunchedServerOptions {
29
+ protocol: 'http' | 'https';
30
+ host: string;
31
+ port: number;
32
+ /** Plaintext session token whose hash the launched server was given */
33
+ sessionToken: string;
34
+ timeoutMs?: number;
35
+ intervalMs?: number;
36
+ }
37
+ export type LaunchedServerVerdict = {
38
+ ok: true;
39
+ } | {
40
+ ok: false;
41
+ reason: string;
42
+ };
43
+ /**
44
+ * Verify that the endpoint is the authenticated server this invocation launched.
45
+ *
46
+ * @returns `{ ok: true }` only when an unknown token is refused with 401 AND the session
47
+ * token is accepted; otherwise `{ ok: false, reason }`. Never throws.
48
+ */
49
+ export declare function verifyLaunchedServer(options: VerifyLaunchedServerOptions): Promise<LaunchedServerVerdict>;
50
+ //# sourceMappingURL=server-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-identity.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-identity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,2FAA2F;AAC3F,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD,eAAO,MAAM,2BAA2B,QAAQ,CAAC;AACjD,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAGhD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAqDjF;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CA0ChC"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * Launched-server identity check
4
+ * Issue #3087: `remote` published whatever answered on the port
5
+ *
6
+ * A TCP connect only proves that SOMETHING listens. In #3087 an orphaned server from an
7
+ * earlier `start --daemon` (no authentication) kept the port, the server `remote` launched
8
+ * died on EADDRINUSE, and `remote` put the orphan behind a public tunnel.
9
+ *
10
+ * Before anything is published, this asks the endpoint two questions over plain HTTP(S):
11
+ *
12
+ * 1. A request carrying a token nobody holds must be refused with 401. Anything else means
13
+ * authentication is off (or the answer is not CommandMate's middleware), so the server
14
+ * would be reachable without pairing.
15
+ * 2. A request carrying the session token `remote` minted moments ago must succeed. Only
16
+ * the server launched with that token's hash can accept it, so this proves the listener
17
+ * is the one this invocation started — no new API route or nonce is needed.
18
+ *
19
+ * Question 1 is asked first so the session token is never sent to a server already shown to
20
+ * be the wrong one. Every outcome that is not a clear "yes" to both is a refusal (fail-closed);
21
+ * only connection errors and 5xx (a server still warming up) are retried until the deadline.
22
+ *
23
+ * @module server-identity
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.DEFAULT_IDENTITY_INTERVAL_MS = exports.DEFAULT_IDENTITY_TIMEOUT_MS = exports.IDENTITY_PROBE_PATH = void 0;
27
+ exports.verifyLaunchedServer = verifyLaunchedServer;
28
+ const http_1 = require("http");
29
+ const https_1 = require("https");
30
+ const crypto_1 = require("crypto");
31
+ /** Path probed: authenticated like every API route, and it reads nothing (Issue #1925). */
32
+ exports.IDENTITY_PROBE_PATH = '/api/capabilities';
33
+ exports.DEFAULT_IDENTITY_TIMEOUT_MS = 30000;
34
+ exports.DEFAULT_IDENTITY_INTERVAL_MS = 300;
35
+ const REQUEST_TIMEOUT_MS = 10000;
36
+ function probe(options, bearer, timeoutMs) {
37
+ return new Promise((resolve) => {
38
+ const send = options.protocol === 'https' ? https_1.request : http_1.request;
39
+ let settled = false;
40
+ const finish = (status) => {
41
+ if (settled)
42
+ return;
43
+ settled = true;
44
+ resolve(status);
45
+ };
46
+ try {
47
+ const req = send({
48
+ host: options.host,
49
+ port: options.port,
50
+ path: exports.IDENTITY_PROBE_PATH,
51
+ method: 'GET',
52
+ headers: { Authorization: `Bearer ${bearer}` },
53
+ timeout: timeoutMs,
54
+ // Loopback only, and identity is proven by the token, not the certificate: a
55
+ // self-signed CM_HTTPS_CERT must not make the check impossible.
56
+ rejectUnauthorized: false,
57
+ }, (res) => {
58
+ res.resume();
59
+ finish(res.statusCode ?? null);
60
+ });
61
+ req.on('timeout', () => {
62
+ req.destroy();
63
+ finish(null);
64
+ });
65
+ req.on('error', () => finish(null));
66
+ req.end();
67
+ }
68
+ catch {
69
+ finish(null);
70
+ }
71
+ });
72
+ }
73
+ function isTransient(status) {
74
+ return status === null || status >= 500;
75
+ }
76
+ /**
77
+ * Verify that the endpoint is the authenticated server this invocation launched.
78
+ *
79
+ * @returns `{ ok: true }` only when an unknown token is refused with 401 AND the session
80
+ * token is accepted; otherwise `{ ok: false, reason }`. Never throws.
81
+ */
82
+ async function verifyLaunchedServer(options) {
83
+ const timeoutMs = options.timeoutMs ?? exports.DEFAULT_IDENTITY_TIMEOUT_MS;
84
+ const intervalMs = options.intervalMs ?? exports.DEFAULT_IDENTITY_INTERVAL_MS;
85
+ const deadline = Date.now() + timeoutMs;
86
+ // A token that cannot be anyone's: fresh random bytes, never hashed or stored anywhere.
87
+ const decoy = (0, crypto_1.randomBytes)(32).toString('hex');
88
+ const where = `${options.host}:${options.port}`;
89
+ const ask = async (bearer) => {
90
+ for (;;) {
91
+ const remaining = deadline - Date.now();
92
+ const status = await probe(options, bearer, Math.max(Math.min(REQUEST_TIMEOUT_MS, remaining), 1));
93
+ if (!isTransient(status) || deadline - Date.now() <= 0) {
94
+ return status;
95
+ }
96
+ await new Promise((resolve) => setTimeout(resolve, Math.min(intervalMs, Math.max(deadline - Date.now(), 1))));
97
+ }
98
+ };
99
+ const unauthenticated = await ask(decoy);
100
+ if (unauthenticated !== 401) {
101
+ return {
102
+ ok: false,
103
+ reason: unauthenticated === null
104
+ ? `nothing answered on ${where}`
105
+ : `the server on ${where} did not require authentication (HTTP ${unauthenticated} for an unknown token, expected 401)`,
106
+ };
107
+ }
108
+ const authenticated = await ask(options.sessionToken);
109
+ if (authenticated === null || authenticated < 200 || authenticated >= 300) {
110
+ return {
111
+ ok: false,
112
+ reason: authenticated === null
113
+ ? `nothing answered on ${where}`
114
+ : `the server on ${where} is not the one this command started (HTTP ${authenticated} for this session's token)`,
115
+ };
116
+ }
117
+ return { ok: true };
118
+ }
@@ -25,4 +25,17 @@ export declare const DEFAULT_INTERVAL_MS = 300;
25
25
  * @returns true if the server accepted a connection, false on timeout
26
26
  */
27
27
  export declare function waitForServer(host: string, port: number, options?: WaitForServerOptions): Promise<boolean>;
28
+ /**
29
+ * Whether something is accepting TCP connections on host:port right now.
30
+ *
31
+ * Issue #3087: a single attempt, used where "the port is free" has to be proven
32
+ * (before `start` spawns a server, after `stop` claims to have stopped one)
33
+ * rather than waited for.
34
+ *
35
+ * @param host - Host to connect to
36
+ * @param port - Port to connect to
37
+ * @param timeoutMs - How long one connection attempt may take
38
+ * @returns true if a connection was accepted
39
+ */
40
+ export declare function isPortInUse(host: string, port: number, timeoutMs?: number): Promise<boolean>;
28
41
  //# sourceMappingURL=server-ready.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-ready.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-ready.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,CAmBlB"}
1
+ {"version":3,"file":"server-ready.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-ready.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AACxC,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAEvC;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAElG"}
@@ -12,6 +12,7 @@
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.DEFAULT_INTERVAL_MS = exports.DEFAULT_TIMEOUT_MS = void 0;
14
14
  exports.waitForServer = waitForServer;
15
+ exports.isPortInUse = isPortInUse;
15
16
  const net_1 = require("net");
16
17
  exports.DEFAULT_TIMEOUT_MS = 30000;
17
18
  exports.DEFAULT_INTERVAL_MS = 300;
@@ -39,6 +40,21 @@ async function waitForServer(host, port, options = {}) {
39
40
  await delay(Math.min(intervalMs, remaining));
40
41
  }
41
42
  }
43
+ /**
44
+ * Whether something is accepting TCP connections on host:port right now.
45
+ *
46
+ * Issue #3087: a single attempt, used where "the port is free" has to be proven
47
+ * (before `start` spawns a server, after `stop` claims to have stopped one)
48
+ * rather than waited for.
49
+ *
50
+ * @param host - Host to connect to
51
+ * @param port - Port to connect to
52
+ * @param timeoutMs - How long one connection attempt may take
53
+ * @returns true if a connection was accepted
54
+ */
55
+ function isPortInUse(host, port, timeoutMs = 1000) {
56
+ return tryConnect(host, port, timeoutMs);
57
+ }
42
58
  /**
43
59
  * Attempt a single TCP connection.
44
60
  *
@@ -67,6 +67,15 @@ export declare const COPILOT_VERSION_PROBE_TIMEOUT_MS = 5000;
67
67
  * is; what is copilot-specific is the caller below.
68
68
  */
69
69
  export declare function findExecutableOnPath(name: string): string | null;
70
+ /**
71
+ * Every executable named `name` on `PATH`, in `PATH` order, up to `limit`.
72
+ *
73
+ * Issue #2939: `opencode` can name two different programs on one machine
74
+ * (OpenCode 1.x's installer and `@opencode/cli`, which registers `opencode`
75
+ * next to `opencode2`), so "the first one" is not always the one a tool wants.
76
+ * The same walk as {@link findExecutableOnPath}, not a second copy of it.
77
+ */
78
+ export declare function findExecutablesOnPath(name: string, limit?: number): string[];
70
79
  /**
71
80
  * The copilot this machine would actually run, or null when there is none.
72
81
  *
@@ -1 +1 @@
1
- {"version":3,"file":"copilot-executable.d.ts","sourceRoot":"","sources":["../../../src/lib/cli-tools/copilot-executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAQH;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5D,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;CAC1C;AAQD,4FAA4F;AAC5F,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAyBrD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAShE;AAuCD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiBlF"}
1
+ {"version":3,"file":"copilot-executable.d.ts","sourceRoot":"","sources":["../../../src/lib/cli-tools/copilot-executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAQH;;;;;;;;;GASG;AACH,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,YAAY,CAAC;AAE5D,yDAAyD;AACzD,MAAM,WAAW,iBAAiB;IAChC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;CAC1C;AAQD,4FAA4F;AAC5F,eAAO,MAAM,gCAAgC,OAAO,CAAC;AAyBrD;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAiB,GAAG,MAAM,EAAE,CAYtF;AAuCD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAiBlF"}
@@ -39,6 +39,7 @@
39
39
  Object.defineProperty(exports, "__esModule", { value: true });
40
40
  exports.COPILOT_VERSION_PROBE_TIMEOUT_MS = void 0;
41
41
  exports.findExecutableOnPath = findExecutableOnPath;
42
+ exports.findExecutablesOnPath = findExecutablesOnPath;
42
43
  exports.resolveCopilotExecutable = resolveCopilotExecutable;
43
44
  const child_process_1 = require("child_process");
44
45
  const fs_1 = require("fs");
@@ -83,17 +84,32 @@ function isExecutableFile(candidate) {
83
84
  * is; what is copilot-specific is the caller below.
84
85
  */
85
86
  function findExecutableOnPath(name) {
87
+ return findExecutablesOnPath(name, 1)[0] ?? null;
88
+ }
89
+ /**
90
+ * Every executable named `name` on `PATH`, in `PATH` order, up to `limit`.
91
+ *
92
+ * Issue #2939: `opencode` can name two different programs on one machine
93
+ * (OpenCode 1.x's installer and `@opencode/cli`, which registers `opencode`
94
+ * next to `opencode2`), so "the first one" is not always the one a tool wants.
95
+ * The same walk as {@link findExecutableOnPath}, not a second copy of it.
96
+ */
97
+ function findExecutablesOnPath(name, limit = Infinity) {
86
98
  const rawPath = process.env.PATH;
87
- if (!rawPath)
88
- return null;
99
+ if (!rawPath || limit <= 0)
100
+ return [];
101
+ const found = [];
89
102
  for (const directory of rawPath.split(path_1.delimiter)) {
90
103
  if (!directory)
91
104
  continue;
92
105
  const candidate = (0, path_1.join)(directory, name);
93
- if (isExecutableFile(candidate))
94
- return candidate;
106
+ if (found.includes(candidate) || !isExecutableFile(candidate))
107
+ continue;
108
+ found.push(candidate);
109
+ if (found.length >= limit)
110
+ break;
95
111
  }
96
- return null;
112
+ return found;
97
113
  }
98
114
  /**
99
115
  * Where `gh copilot` puts the copy it downloads.
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Which `opencode` is OpenCode 1.x and which is OpenCode V2 (Issue #2939).
3
+ *
4
+ * ## Why the name is not enough
5
+ *
6
+ * OpenCode V2's npm package `@opencode/cli` (2.0.18) registers **both**
7
+ * `opencode` and `opencode2` in its `bin`. So on a machine that has it,
8
+ * `opencode` may be OpenCode 1.x (its own installer, `~/.opencode/bin`) or
9
+ * OpenCode V2 (`/opt/homebrew/bin/opencode`), decided by nothing but the order
10
+ * of `PATH`. Asking `which opencode` then answers "OpenCode is installed" for a
11
+ * V2 binary, and the v1 launch line (`opencode --port N --hostname …`) reaches
12
+ * a program that has neither flag.
13
+ *
14
+ * The answer here is the version each candidate prints about itself:
15
+ *
16
+ * - OpenCode 1.x prints a bare `1.18.33`;
17
+ * - OpenCode V2 prints `opencode v2.0.18`.
18
+ *
19
+ * Every `opencode` / `opencode2` on `PATH` is a candidate, not just the first,
20
+ * so a V2 `opencode` earlier on `PATH` no longer hides a 1.x one behind it.
21
+ *
22
+ * ## Probe and launch are one measurement
23
+ *
24
+ * The path that answered is the path the launch line runs — the rule
25
+ * `./copilot-executable` set for copilot (#1907). The server resolves names on
26
+ * its own `PATH`, the pane on its login shell's; typing a bare `opencode` would
27
+ * let the two disagree.
28
+ *
29
+ * ## Cost
30
+ *
31
+ * `opencode --version` takes ~0.4 s and both tools probe `opencode`, so one
32
+ * probe per path is shared for {@link OPENCODE_EXECUTABLE_CACHE_TTL_MS}, and a
33
+ * concurrent caller gets the probe already in flight.
34
+ *
35
+ * @module lib/cli-tools/opencode-executable
36
+ */
37
+ /** OpenCode 1.x's executable name (tool id `opencode`). */
38
+ export declare const OPENCODE_V1_BINARY_NAME = "opencode";
39
+ /** OpenCode V2's own executable name (tool id `opencode-v2`). */
40
+ export declare const OPENCODE_V2_BINARY_NAME = "opencode2";
41
+ /** Budget for one `--version`. */
42
+ export declare const OPENCODE_VERSION_PROBE_TIMEOUT_MS = 5000;
43
+ /** How long one probe result is reused (same TTL as the installed-agents cache). */
44
+ export declare const OPENCODE_EXECUTABLE_CACHE_TTL_MS = 30000;
45
+ /** Which OpenCode a binary is. */
46
+ export type OpencodeGeneration = 'v1' | 'v2';
47
+ /** What `--version` said, when it said something recognisable. */
48
+ export interface OpencodeVersionInfo {
49
+ readonly generation: OpencodeGeneration;
50
+ /** `major.minor.patch` (plus any pre-release suffix). */
51
+ readonly version: string;
52
+ }
53
+ /**
54
+ * Classify `opencode --version` / `opencode2 --version` output.
55
+ *
56
+ * A line has to be a version in one of the two forms and nothing else, so a
57
+ * different program that happens to print a number is not taken for either.
58
+ * The major version decides: 1 is OpenCode 1.x, 2 or later is OpenCode V2.
59
+ * `0.x` (the pre-1.0 `opencode`) and anything unreadable are null.
60
+ *
61
+ * @returns The generation and version, or null when the output is not OpenCode's
62
+ */
63
+ export declare function parseOpencodeVersionOutput(output: string): OpencodeVersionInfo | null;
64
+ /** One candidate and what it answered (null: no recognisable answer). */
65
+ export interface OpencodeProbe {
66
+ readonly path: string;
67
+ readonly info: OpencodeVersionInfo | null;
68
+ }
69
+ /** The binary a tool will run. */
70
+ export interface OpencodeExecutable {
71
+ /** Absolute path, as found on `PATH` — the launch line runs exactly this. */
72
+ readonly path: string;
73
+ readonly version: string;
74
+ readonly generation: OpencodeGeneration;
75
+ }
76
+ /** A resolution: what was chosen, and every candidate asked on the way. */
77
+ export interface OpencodeResolution {
78
+ readonly executable: OpencodeExecutable | null;
79
+ readonly probed: readonly OpencodeProbe[];
80
+ }
81
+ /** Forget every cached probe (tests, and a caller that knows the install changed). */
82
+ export declare function clearOpencodeExecutableCache(): void;
83
+ /** `<path> --version`, classified; cached per path. Never rejects. */
84
+ export declare function probeOpencodeExecutable(path: string): Promise<OpencodeVersionInfo | null>;
85
+ /**
86
+ * OpenCode 1.x: the first `opencode` on `PATH` that prints a 1.x version.
87
+ * An `opencode` that answers `opencode v2.x` is skipped, never launched.
88
+ */
89
+ export declare function resolveOpencodeV1Executable(): Promise<OpencodeResolution>;
90
+ /**
91
+ * OpenCode V2: `opencode2` first, then an `opencode` that prints
92
+ * `opencode v2.x` — for an operator who has V2 only under the `opencode` name.
93
+ */
94
+ export declare function resolveOpencodeV2Executable(): Promise<OpencodeResolution>;
95
+ /**
96
+ * Why OpenCode 1.x counts as not installed, when there is more to say than
97
+ * "no `opencode` on PATH".
98
+ *
99
+ * @returns A sentence naming the `opencode` that is there and what it is, or
100
+ * null when nothing called `opencode` was found at all
101
+ */
102
+ export declare function describeOpencodeV1Unavailable(resolution: OpencodeResolution): string | null;
103
+ //# sourceMappingURL=opencode-executable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-executable.d.ts","sourceRoot":"","sources":["../../../src/lib/cli-tools/opencode-executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAMH,2DAA2D;AAC3D,eAAO,MAAM,uBAAuB,aAAa,CAAC;AAElD,iEAAiE;AACjE,eAAO,MAAM,uBAAuB,cAAc,CAAC;AAEnD,kCAAkC;AAClC,eAAO,MAAM,iCAAiC,OAAO,CAAC;AAKtD,oFAAoF;AACpF,eAAO,MAAM,gCAAgC,QAAS,CAAC;AAKvD,kCAAkC;AAClC,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7C,kEAAkE;AAClE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAQD;;;;;;;;;GASG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAarF;AAED,yEAAyE;AACzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC3C;AAED,kCAAkC;AAClC,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;CAC3C;AASD,sFAAsF;AACtF,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AA2BD,sEAAsE;AACtE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAOzF;AAqBD;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAEzE;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAEzE;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAe3F"}