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
@@ -6,6 +6,12 @@
6
6
  */
7
7
  import { DaemonStatus, StartOptions } from '../types';
8
8
  import { ServerEnv } from './server-url';
9
+ /** How long stop() waits for the server's process group after SIGTERM before escalating. */
10
+ export declare const STOP_GRACE_TIMEOUT_MS = 10000;
11
+ /** How long stop() waits for the process group after SIGKILL. */
12
+ export declare const STOP_KILL_TIMEOUT_MS = 3000;
13
+ /** How long stop() waits for the recorded port to be released once the group is gone. */
14
+ export declare const PORT_RELEASE_TIMEOUT_MS = 3000;
9
15
  /**
10
16
  * Daemon manager for background server process
11
17
  */
@@ -35,12 +41,43 @@ export declare class DaemonManager {
35
41
  * @throws Error if already running
36
42
  */
37
43
  start(options: StartOptions): Promise<number>;
44
+ /** Throws when the recorded server is running, or an earlier server's group lives on. */
45
+ private assertNotRunning;
46
+ /** Builds the child process env from process.env, .env and the start options. */
47
+ private buildChildEnv;
48
+ /** Decides bind address, port and protocol, warning when exposed without protection. */
49
+ private resolveEndpoint;
50
+ /** Throws when something else already answers on the port the server would bind. */
51
+ private assertPortFree;
52
+ /** Persists the DaemonState; kills the spawned child and throws when the write fails. */
53
+ private recordState;
38
54
  /**
39
55
  * Stop daemon process
56
+ *
57
+ * Issue #3087: signals the daemon's whole process group, waits for every member to exit
58
+ * (escalating to SIGKILL after {@link STOP_GRACE_TIMEOUT_MS}), and then requires the recorded
59
+ * port to be free. "Stopped" is reported only when both hold. A recorded leader that already
60
+ * exited while its group lives on (the orphaned server of #3087) is stopped the same way.
61
+ *
40
62
  * @param force Use SIGKILL instead of SIGTERM
41
- * @returns true if stopped successfully, false if not running
63
+ * @returns true if stopped (or the PID file was stale), false if not running or not stopped
42
64
  */
43
65
  stop(force?: boolean): Promise<boolean>;
66
+ /**
67
+ * Signal the daemon's process group and wait until no member is left.
68
+ *
69
+ * @returns true once the group is gone, false if it outlived SIGKILL
70
+ */
71
+ private terminateGroup;
72
+ /**
73
+ * Issue #3087: confirm the port the server was started on is free again.
74
+ *
75
+ * A state file from before #1354 records no port; re-deriving one from a .env that may have
76
+ * changed since could blame an unrelated listener, so that legacy case is not checked.
77
+ *
78
+ * @returns true when the port is free (or unknown), false if something still listens on it
79
+ */
80
+ private waitForPortRelease;
44
81
  /**
45
82
  * Get daemon status
46
83
  * @returns Status object or null if no PID file
@@ -51,7 +88,10 @@ export declare class DaemonManager {
51
88
  */
52
89
  isRunning(): Promise<boolean>;
53
90
  /**
54
- * Wait for process to exit
91
+ * Wait until neither the recorded PID nor any member of its process group is alive
92
+ * (Issue #3087: the group, because the server outlives npm).
93
+ *
94
+ * @returns true if everything exited within the timeout
55
95
  */
56
96
  private waitForExit;
57
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/daemon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOtD,OAAO,EAA2C,SAAS,EAAE,MAAM,cAAc,CAAC;AAElF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,YAAY,CAAC,CAAY;IAEjC;;;;OAIG;gBACS,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAMjD;;;;;;OAMG;IACH,eAAe,IAAI,SAAS;IAK5B;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IA+GnD;;;;OAIG;IACG,IAAI,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BpD;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmD/C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;OAEG;YACW,WAAW;CAiB1B"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/daemon.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAOtD,OAAO,EAA2C,SAAS,EAAE,MAAM,cAAc,CAAC;AASlF,4FAA4F;AAC5F,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAE3C,iEAAiE;AACjE,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,yFAAyF;AACzF,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAsE5C;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,YAAY,CAAC,CAAY;IAEjC;;;;OAIG;gBACS,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAMjD;;;;;;OAMG;IACH,eAAe,IAAI,SAAS;IAK5B;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCnD,yFAAyF;IACzF,OAAO,CAAC,gBAAgB;IAiBxB,iFAAiF;IACjF,OAAO,CAAC,aAAa;IA2CrB,wFAAwF;IACxF,OAAO,CAAC,eAAe;IAoBvB,oFAAoF;YACtE,cAAc;IAgB5B,yFAAyF;IACzF,OAAO,CAAC,WAAW;IAkCnB;;;;;;;;;;OAUG;IACG,IAAI,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAkDpD;;;;OAIG;YACW,cAAc;IAe5B;;;;;;;OAOG;YACW,kBAAkB;IAuBhC;;;OAGG;IACG,SAAS,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAmD/C;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAInC;;;;;OAKG;YACW,WAAW;CAc1B"}
@@ -6,7 +6,7 @@
6
6
  * SF-1: SRP - Process management only (PID handling delegated to PidManager)
7
7
  */
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.DaemonManager = void 0;
9
+ exports.DaemonManager = exports.PORT_RELEASE_TIMEOUT_MS = exports.STOP_KILL_TIMEOUT_MS = exports.STOP_GRACE_TIMEOUT_MS = void 0;
10
10
  const child_process_1 = require("child_process");
11
11
  const dotenv_1 = require("dotenv");
12
12
  const pid_manager_1 = require("./pid-manager");
@@ -16,6 +16,81 @@ const package_info_1 = require("./package-info");
16
16
  const security_messages_1 = require("../config/security-messages");
17
17
  const logger_1 = require("./logger");
18
18
  const server_url_1 = require("./server-url");
19
+ const server_ready_1 = require("./server-ready");
20
+ const process_inspect_1 = require("./process-inspect");
21
+ /** How long stop() waits for the server's process group after SIGTERM before escalating. */
22
+ exports.STOP_GRACE_TIMEOUT_MS = 10000;
23
+ /** How long stop() waits for the process group after SIGKILL. */
24
+ exports.STOP_KILL_TIMEOUT_MS = 3000;
25
+ /** How long stop() waits for the recorded port to be released once the group is gone. */
26
+ exports.PORT_RELEASE_TIMEOUT_MS = 3000;
27
+ /**
28
+ * Whether a signal can be delivered to `target` (a PID, or a negated PGID).
29
+ * EPERM means it exists but belongs to someone else, which still counts as alive.
30
+ */
31
+ function signalTargetExists(target) {
32
+ try {
33
+ process.kill(target, 0);
34
+ return true;
35
+ }
36
+ catch (err) {
37
+ return err.code === 'EPERM';
38
+ }
39
+ }
40
+ /**
41
+ * Issue #3087: whether the process is still running code. `kill(pid, 0)` also succeeds for a
42
+ * zombie, which without an init process (a container whose PID 1 never reaps) stays forever.
43
+ */
44
+ function processAlive(pid) {
45
+ return signalTargetExists(pid) && !(0, process_inspect_1.isZombieProcess)(pid);
46
+ }
47
+ /**
48
+ * Issue #3087: whether any process of the group the daemon was spawned into is still alive.
49
+ *
50
+ * `start()` spawns with `detached: true`, so the recorded PID is a process-group leader and the
51
+ * server it launches (npm → node server.js) inherits that PGID. A PGID is not reused while any
52
+ * member is alive, so a live group with the recorded ID is ours even after the leader exited.
53
+ *
54
+ * A group whose members are all zombies has exited. Only Linux can tell (via /proc); elsewhere,
55
+ * or when /proc shows no member at all, the signal-based answer stands.
56
+ */
57
+ function processGroupExists(pid) {
58
+ if (pid <= 1 || !signalTargetExists(-pid)) {
59
+ return false;
60
+ }
61
+ const states = (0, process_inspect_1.listProcessGroupStates)(pid);
62
+ return states === null || states.length === 0 || states.some((state) => !(0, process_inspect_1.isExitedState)(state));
63
+ }
64
+ /**
65
+ * Issue #3087: signal the whole process group, not just the recorded PID.
66
+ *
67
+ * The recorded PID is npm's, and npm does not reliably forward signals to the server it runs
68
+ * (observed on Linux), so `kill(pid)` alone left the server listening as an orphan. Falls back
69
+ * to the bare PID when no such group exists (e.g. a server that is not a group leader).
70
+ */
71
+ function signalProcessGroup(pid, signal) {
72
+ // Never negate 0 or 1: kill(0) signals our own group and kill(-1) every process we may signal.
73
+ if (pid <= 1) {
74
+ throw new Error(`Refusing to signal invalid PID ${pid}`);
75
+ }
76
+ try {
77
+ process.kill(-pid, signal);
78
+ return;
79
+ }
80
+ catch (err) {
81
+ if (err.code !== 'ESRCH') {
82
+ throw err;
83
+ }
84
+ }
85
+ try {
86
+ process.kill(pid, signal);
87
+ }
88
+ catch (err) {
89
+ if (err.code !== 'ESRCH') {
90
+ throw err;
91
+ }
92
+ }
93
+ }
19
94
  /**
20
95
  * Daemon manager for background server process
21
96
  */
@@ -52,15 +127,46 @@ class DaemonManager {
52
127
  * @throws Error if already running
53
128
  */
54
129
  async start(options) {
55
- if (this.pidManager.isProcessRunning()) {
56
- const pid = this.pidManager.readPid();
57
- throw new Error(`Server is already running (PID: ${pid})`);
58
- }
130
+ this.assertNotRunning();
59
131
  // Clean up stale PID file
60
132
  this.pidManager.removePid();
61
133
  const npmScript = options.dev ? 'dev' : 'start';
62
134
  // Use package installation directory, not current working directory
63
135
  const packageRoot = (0, paths_1.getPackageRoot)();
136
+ const env = this.buildChildEnv(options);
137
+ const { bindAddress, port, protocol } = this.resolveEndpoint(env);
138
+ await this.assertPortFree(bindAddress, port);
139
+ // Log startup with accurate settings (Stage 4 review: MF-2)
140
+ this.logger.info(`Starting server at ${protocol}://${bindAddress}:${port}`);
141
+ // Spawn detached process
142
+ const child = (0, child_process_1.spawn)('npm', ['run', npmScript], {
143
+ cwd: packageRoot,
144
+ env,
145
+ detached: true,
146
+ stdio: 'ignore',
147
+ });
148
+ // Unref to allow parent to exit
149
+ child.unref();
150
+ const pid = child.pid;
151
+ this.recordState(pid, env, bindAddress, port, protocol);
152
+ return pid;
153
+ }
154
+ /** Throws when the recorded server is running, or an earlier server's group lives on. */
155
+ assertNotRunning() {
156
+ if (this.pidManager.isProcessRunning()) {
157
+ const pid = this.pidManager.readPid();
158
+ throw new Error(`Server is already running (PID: ${pid})`);
159
+ }
160
+ // Issue #3087: a stale PID file is the only record of the PGID an orphaned server still runs
161
+ // in. Removing it here would leave `stop` with nothing to find that server by.
162
+ const stale = this.pidManager.readState();
163
+ if (stale !== null && !processAlive(stale.pid) && processGroupExists(stale.pid)) {
164
+ throw new Error(`Processes of an earlier server are still running (process group ${stale.pid}). ` +
165
+ 'Run "commandmate stop" to stop them first.');
166
+ }
167
+ }
168
+ /** Builds the child process env from process.env, .env and the start options. */
169
+ buildChildEnv(options) {
64
170
  // Issue #125: Load .env file from correct location
65
171
  const envPath = (0, env_setup_1.getEnvPath)();
66
172
  const envResult = (0, dotenv_1.config)({ path: envPath });
@@ -94,6 +200,10 @@ class DaemonManager {
94
200
  env[key] = process.env[key];
95
201
  }
96
202
  }
203
+ return env;
204
+ }
205
+ /** Decides bind address, port and protocol, warning when exposed without protection. */
206
+ resolveEndpoint(env) {
97
207
  // Issue #179: Security warning for external access - recommend reverse proxy
98
208
  const bindAddress = env.CM_BIND || '127.0.0.1';
99
209
  const port = env.CM_PORT || '3000';
@@ -105,18 +215,24 @@ class DaemonManager {
105
215
  if (bindAddress === '0.0.0.0' && !env.CM_AUTH_TOKEN_HASH && !env.CM_ALLOWED_IPS) {
106
216
  console.log(security_messages_1.REVERSE_PROXY_WARNING);
107
217
  }
108
- // Log startup with accurate settings (Stage 4 review: MF-2)
109
- this.logger.info(`Starting server at ${protocol}://${bindAddress}:${port}`);
110
- // Spawn detached process
111
- const child = (0, child_process_1.spawn)('npm', ['run', npmScript], {
112
- cwd: packageRoot,
113
- env,
114
- detached: true,
115
- stdio: 'ignore',
116
- });
117
- // Unref to allow parent to exit
118
- child.unref();
119
- const pid = child.pid;
218
+ return { bindAddress, port, protocol };
219
+ }
220
+ /** Throws when something else already answers on the port the server would bind. */
221
+ async assertPortFree(bindAddress, port) {
222
+ // Issue #3087: refuse to launch onto a port something else already answers on. The new
223
+ // server would fail to listen and exit, while every later TCP check (status, remote's
224
+ // readiness wait) would be answered by that other process and mistake it for this server.
225
+ const probeHost = bindAddress === '0.0.0.0' ? '127.0.0.1' : bindAddress;
226
+ if (await (0, server_ready_1.isPortInUse)(probeHost, parseInt(port, 10))) {
227
+ const listeners = (0, process_inspect_1.describeListeners)(parseInt(port, 10));
228
+ throw new Error(`Port ${port} on ${probeHost} is already in use by another process` +
229
+ `${listeners ? ` (${listeners})` : ''} ` +
230
+ 'that is not the server recorded in the PID file (e.g. an earlier server left running). ' +
231
+ 'Stop that process or choose another port.');
232
+ }
233
+ }
234
+ /** Persists the DaemonState; kills the spawned child and throws when the write fails. */
235
+ recordState(pid, env, bindAddress, port, protocol) {
120
236
  // Issue #1354/#1355/#1358: persist the daemon's version, effective settings, and a
121
237
  // process-identity signature so status/stop/start can report and verify the actual server,
122
238
  // not re-derive it from a possibly-diverged .env. The port/protocol/auth recorded here are
@@ -142,36 +258,102 @@ class DaemonManager {
142
258
  }
143
259
  throw new Error('Failed to write PID file - server may already be running');
144
260
  }
145
- return pid;
146
261
  }
147
262
  /**
148
263
  * Stop daemon process
264
+ *
265
+ * Issue #3087: signals the daemon's whole process group, waits for every member to exit
266
+ * (escalating to SIGKILL after {@link STOP_GRACE_TIMEOUT_MS}), and then requires the recorded
267
+ * port to be free. "Stopped" is reported only when both hold. A recorded leader that already
268
+ * exited while its group lives on (the orphaned server of #3087) is stopped the same way.
269
+ *
149
270
  * @param force Use SIGKILL instead of SIGTERM
150
- * @returns true if stopped successfully, false if not running
271
+ * @returns true if stopped (or the PID file was stale), false if not running or not stopped
151
272
  */
152
273
  async stop(force = false) {
153
- const pid = this.pidManager.readPid();
154
- if (pid === null) {
274
+ const state = this.pidManager.readState();
275
+ if (state === null) {
155
276
  return false;
156
277
  }
278
+ const pid = state.pid;
279
+ const signal = force ? 'SIGKILL' : 'SIGTERM';
157
280
  if (!this.pidManager.isProcessRunning()) {
158
- // Process not running - clean up stale PID file
159
- this.pidManager.removePid();
160
- return true;
281
+ // The leader is gone. Only when its PID is entirely unused (not reused by an unrelated
282
+ // process) can a live group with that ID be the server it left behind.
283
+ const orphanedGroup = !processAlive(pid) && processGroupExists(pid);
284
+ if (!orphanedGroup) {
285
+ // Process not running - clean up stale PID file
286
+ this.pidManager.removePid();
287
+ return true;
288
+ }
289
+ this.logger.warn(`The recorded process ${pid} has exited but its server processes are still running; stopping them.`);
161
290
  }
162
- const signal = force ? 'SIGKILL' : 'SIGTERM';
163
291
  try {
164
- process.kill(pid, signal);
165
- // Wait for process to exit
166
- await this.waitForExit(pid, 10000);
167
- // Clean up PID file
292
+ const exited = await this.terminateGroup(pid, signal);
293
+ if (!exited) {
294
+ // Issue #3087: where zombies cannot be told apart (no /proc), a group can look alive
295
+ // after it stopped serving. The port is what was at stake, so a released port decides.
296
+ if (state.port !== undefined && (await this.waitForPortRelease(state))) {
297
+ this.logger.warn(`Process group ${pid} did not report exit, but port ${state.port} has been released; ` +
298
+ 'treating the server as stopped.');
299
+ this.pidManager.removePid();
300
+ return true;
301
+ }
302
+ this.logger.warn(`Process group ${pid} did not exit.`);
303
+ return false;
304
+ }
305
+ // Clean up PID file: nothing this file describes is alive any more.
168
306
  this.pidManager.removePid();
169
- return true;
307
+ return await this.waitForPortRelease(state);
170
308
  }
171
309
  catch {
172
310
  return false;
173
311
  }
174
312
  }
313
+ /**
314
+ * Signal the daemon's process group and wait until no member is left.
315
+ *
316
+ * @returns true once the group is gone, false if it outlived SIGKILL
317
+ */
318
+ async terminateGroup(pid, signal) {
319
+ signalProcessGroup(pid, signal);
320
+ if (await this.waitForExit(pid, signal === 'SIGKILL' ? exports.STOP_KILL_TIMEOUT_MS : exports.STOP_GRACE_TIMEOUT_MS)) {
321
+ return true;
322
+ }
323
+ if (signal === 'SIGKILL') {
324
+ return false;
325
+ }
326
+ this.logger.warn(`Server (process group ${pid}) did not exit within ${exports.STOP_GRACE_TIMEOUT_MS / 1000}s; sending SIGKILL.`);
327
+ signalProcessGroup(pid, 'SIGKILL');
328
+ return this.waitForExit(pid, exports.STOP_KILL_TIMEOUT_MS);
329
+ }
330
+ /**
331
+ * Issue #3087: confirm the port the server was started on is free again.
332
+ *
333
+ * A state file from before #1354 records no port; re-deriving one from a .env that may have
334
+ * changed since could blame an unrelated listener, so that legacy case is not checked.
335
+ *
336
+ * @returns true when the port is free (or unknown), false if something still listens on it
337
+ */
338
+ async waitForPortRelease(state) {
339
+ if (state.port === undefined) {
340
+ return true;
341
+ }
342
+ const bind = state.bind ?? '127.0.0.1';
343
+ const host = bind === '0.0.0.0' ? '127.0.0.1' : bind;
344
+ const deadline = Date.now() + exports.PORT_RELEASE_TIMEOUT_MS;
345
+ for (;;) {
346
+ if (!(await (0, server_ready_1.isPortInUse)(host, state.port, 500))) {
347
+ return true;
348
+ }
349
+ if (Date.now() >= deadline) {
350
+ this.logger.warn(`Port ${state.port} on ${host} is still in use after the server stopped; ` +
351
+ 'another process is listening on it.');
352
+ return false;
353
+ }
354
+ await new Promise(resolve => setTimeout(resolve, 100));
355
+ }
356
+ }
175
357
  /**
176
358
  * Get daemon status
177
359
  * @returns Status object or null if no PID file
@@ -227,23 +409,23 @@ class DaemonManager {
227
409
  return this.pidManager.isProcessRunning();
228
410
  }
229
411
  /**
230
- * Wait for process to exit
412
+ * Wait until neither the recorded PID nor any member of its process group is alive
413
+ * (Issue #3087: the group, because the server outlives npm).
414
+ *
415
+ * @returns true if everything exited within the timeout
231
416
  */
232
417
  async waitForExit(pid, timeout) {
233
418
  const startTime = Date.now();
234
419
  const checkInterval = 100;
235
- while (Date.now() - startTime < timeout) {
236
- try {
237
- process.kill(pid, 0);
238
- // Process still exists, wait
239
- await new Promise(resolve => setTimeout(resolve, checkInterval));
420
+ for (;;) {
421
+ if (!processAlive(pid) && !processGroupExists(pid)) {
422
+ return true;
240
423
  }
241
- catch {
242
- // Process exited
243
- return;
424
+ if (Date.now() - startTime >= timeout) {
425
+ return false;
244
426
  }
427
+ await new Promise(resolve => setTimeout(resolve, checkInterval));
245
428
  }
246
- // Timeout - process may still be running
247
429
  }
248
430
  }
249
431
  exports.DaemonManager = DaemonManager;
@@ -13,6 +13,12 @@
13
13
  *
14
14
  * @module docs-reader
15
15
  */
16
+ /**
17
+ * Whitelist of available documentation sections.
18
+ * [C-CONS-003] Only files listed here can be accessed via the docs command.
19
+ * Path traversal attempts are prevented by validating section names against this map.
20
+ */
21
+ export declare const SECTION_MAP: Record<string, string>;
16
22
  /**
17
23
  * Get list of available documentation section names.
18
24
  */
@@ -1 +1 @@
1
- {"version":3,"file":"docs-reader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/docs-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA6DH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsCvF"}
1
+ {"version":3,"file":"docs-reader.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/docs-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAU9C,CAAC;AAwCF;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYnD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsCvF"}
@@ -48,6 +48,7 @@ var __importStar = (this && this.__importStar) || (function () {
48
48
  };
49
49
  })();
50
50
  Object.defineProperty(exports, "__esModule", { value: true });
51
+ exports.SECTION_MAP = void 0;
51
52
  exports.getAvailableSections = getAvailableSections;
52
53
  exports.isValidSection = isValidSection;
53
54
  exports.readSection = readSection;
@@ -60,15 +61,15 @@ const agent_operations_1 = require("../docs/agent-operations");
60
61
  * [C-CONS-003] Only files listed here can be accessed via the docs command.
61
62
  * Path traversal attempts are prevented by validating section names against this map.
62
63
  */
63
- const SECTION_MAP = {
64
- 'quick-start': 'docs/user-guide/quick-start.md',
65
- 'commands': 'docs/user-guide/commands-guide.md',
66
- 'webapp': 'docs/user-guide/webapp-guide.md',
67
- 'workflow-examples': 'docs/user-guide/workflow-examples.md',
68
- 'cli-setup': 'docs/user-guide/cli-setup-guide.md',
69
- 'agents': 'docs/user-guide/agents-guide.md',
70
- 'cmate-schedules': 'docs/user-guide/cmate-schedules-guide.md',
71
- 'architecture': 'docs/architecture.md',
64
+ exports.SECTION_MAP = {
65
+ 'quick-start': 'docs/en/user-guide/quick-start.md',
66
+ 'commands': 'docs/en/user-guide/commands-guide.md',
67
+ 'webapp': 'docs/en/user-guide/webapp-guide.md',
68
+ 'workflow-examples': 'docs/en/user-guide/workflow-examples.md',
69
+ 'cli-setup': 'docs/en/user-guide/cli-setup-guide.md',
70
+ 'agents': 'docs/en/user-guide/agents-guide.md',
71
+ 'cmate-schedules': 'docs/en/user-guide/cmate-schedules-guide.md',
72
+ 'architecture': 'docs/en/architecture.md',
72
73
  'readme': 'README.md',
73
74
  };
74
75
  /**
@@ -111,13 +112,13 @@ function resolvePackageRoot() {
111
112
  * Get list of available documentation section names.
112
113
  */
113
114
  function getAvailableSections() {
114
- return [...Object.keys(SECTION_MAP), ...Object.keys(EMBEDDED_SECTIONS)];
115
+ return [...Object.keys(exports.SECTION_MAP), ...Object.keys(EMBEDDED_SECTIONS)];
115
116
  }
116
117
  /**
117
118
  * Check if a section name is valid (exists in the whitelist or embedded).
118
119
  */
119
120
  function isValidSection(section) {
120
- return section in SECTION_MAP || section in EMBEDDED_SECTIONS;
121
+ return section in exports.SECTION_MAP || section in EMBEDDED_SECTIONS;
121
122
  }
122
123
  /**
123
124
  * Read the content of a documentation section.
@@ -136,7 +137,7 @@ function readSection(section) {
136
137
  }
137
138
  // File-based sections
138
139
  const packageRoot = resolvePackageRoot();
139
- const filePath = path.join(packageRoot, SECTION_MAP[section]);
140
+ const filePath = path.join(packageRoot, exports.SECTION_MAP[section]);
140
141
  return fs.readFileSync(filePath, 'utf-8');
141
142
  }
142
143
  /**
@@ -154,7 +155,7 @@ function searchDocs(query) {
154
155
  const packageRoot = resolvePackageRoot();
155
156
  const lowerQuery = query.toLowerCase();
156
157
  // Search file-based sections
157
- for (const [section, relativePath] of Object.entries(SECTION_MAP)) {
158
+ for (const [section, relativePath] of Object.entries(exports.SECTION_MAP)) {
158
159
  const filePath = path.join(packageRoot, relativePath);
159
160
  try {
160
161
  const content = fs.readFileSync(filePath, 'utf-8');
@@ -47,6 +47,18 @@ export interface NpmInstallResult {
47
47
  * @returns The resolved version, or a classified failure
48
48
  */
49
49
  export declare function viewLatestVersion(packageName: string): NpmViewResult;
50
+ /**
51
+ * Non-blocking twin of {@link viewLatestVersion}, for the server. [Issue #3110]
52
+ *
53
+ * The update-check route asks npm whether a release GitHub already announced
54
+ * has reached the registry. `spawnSync` would stall the server's event loop for
55
+ * the whole network round trip, so this uses `execFile` (array args, no shell —
56
+ * MF-SEC-1 holds) under the same timeout and failure classification.
57
+ *
58
+ * @param packageName - Package name (e.g. `commandmate`)
59
+ * @returns The resolved version, or a classified failure. Never rejects.
60
+ */
61
+ export declare function viewLatestVersionAsync(packageName: string): Promise<NpmViewResult>;
50
62
  /**
51
63
  * Install the latest published version of a package globally.
52
64
  *
@@ -1 +1 @@
1
- {"version":3,"file":"npm-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/npm-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA+BpE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAwCzE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAsBrF"}
1
+ {"version":3,"file":"npm-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/npm-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,QAAS,CAAC;AAE1C,mFAAmF;AACnF,eAAO,MAAM,mBAAmB,OAAQ,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,0DAA0D;IAC1D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,CA+BpE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CA6BlF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,gBAAgB,CAwCzE;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAsBrF"}
@@ -18,6 +18,7 @@
18
18
  Object.defineProperty(exports, "__esModule", { value: true });
19
19
  exports.NPM_ROOT_TIMEOUT_MS = exports.NPM_VIEW_TIMEOUT_MS = void 0;
20
20
  exports.viewLatestVersion = viewLatestVersion;
21
+ exports.viewLatestVersionAsync = viewLatestVersionAsync;
21
22
  exports.installGlobalLatest = installGlobalLatest;
22
23
  exports.findGlobalInstallation = findGlobalInstallation;
23
24
  const child_process_1 = require("child_process");
@@ -61,6 +62,41 @@ function viewLatestVersion(packageName) {
61
62
  }
62
63
  return { success: true, version };
63
64
  }
65
+ /**
66
+ * Non-blocking twin of {@link viewLatestVersion}, for the server. [Issue #3110]
67
+ *
68
+ * The update-check route asks npm whether a release GitHub already announced
69
+ * has reached the registry. `spawnSync` would stall the server's event loop for
70
+ * the whole network round trip, so this uses `execFile` (array args, no shell —
71
+ * MF-SEC-1 holds) under the same timeout and failure classification.
72
+ *
73
+ * @param packageName - Package name (e.g. `commandmate`)
74
+ * @returns The resolved version, or a classified failure. Never rejects.
75
+ */
76
+ function viewLatestVersionAsync(packageName) {
77
+ return new Promise((resolve) => {
78
+ (0, child_process_1.execFile)('npm', ['view', packageName, 'version'], { encoding: 'utf-8', timeout: exports.NPM_VIEW_TIMEOUT_MS }, (error, stdout, stderr) => {
79
+ if (error) {
80
+ const errnoError = error;
81
+ if (errnoError.code === 'ENOENT') {
82
+ resolve({
83
+ success: false,
84
+ error: 'npm command not found. Install Node.js/npm and try again.',
85
+ });
86
+ return;
87
+ }
88
+ resolve({ success: false, error: readStream(stderr) || errnoError.message });
89
+ return;
90
+ }
91
+ const version = readStream(stdout);
92
+ if (!version) {
93
+ resolve({ success: false, error: 'npm view returned no version' });
94
+ return;
95
+ }
96
+ resolve({ success: true, version });
97
+ });
98
+ });
99
+ }
64
100
  /**
65
101
  * Install the latest published version of a package globally.
66
102
  *
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Best-effort process inspection for stop/start (Issue #3087)
3
+ *
4
+ * - Zombies: `kill(pid, 0)` succeeds for a zombie, so without an init process
5
+ * (a container whose PID 1 never reaps) a stopped server's group looked alive
6
+ * forever. On Linux, /proc tells a zombie apart; elsewhere nothing is known
7
+ * and callers keep their signal-based answer.
8
+ * - Listeners: when something answers on the configured port but is not the
9
+ * server the PID file describes, the user is told which PID holds it.
10
+ *
11
+ * Every function here is read-only and never throws.
12
+ *
13
+ * @module process-inspect
14
+ */
15
+ interface ProcStat {
16
+ state: string;
17
+ pgrp: number;
18
+ }
19
+ /**
20
+ * Parse `/proc/<pid>/stat`. The command name is parenthesised and may itself
21
+ * contain spaces or parentheses, so fields are read after the LAST `)`.
22
+ */
23
+ export declare function parseProcStat(content: string): ProcStat | null;
24
+ /**
25
+ * @returns true when /proc reports the process as a zombie (or dead); false when it is
26
+ * running, absent, or the platform has no /proc
27
+ */
28
+ export declare function isZombieProcess(pid: number): boolean;
29
+ /**
30
+ * States of every process whose process group is `pgid`.
31
+ *
32
+ * @returns the state letters (possibly empty), or null when /proc cannot be read
33
+ * (non-Linux), in which case nothing is known
34
+ */
35
+ export declare function listProcessGroupStates(pgid: number): string[] | null;
36
+ /** @returns true when a /proc state letter means the process no longer runs */
37
+ export declare function isExitedState(state: string): boolean;
38
+ /**
39
+ * PIDs listening on a TCP port: /proc on Linux, `lsof` elsewhere.
40
+ *
41
+ * @returns the PIDs found; empty when none are visible (another user's process, or no tool)
42
+ */
43
+ export declare function findListeningPids(port: number): number[];
44
+ /**
45
+ * One-line description of a process for an error message.
46
+ *
47
+ * @returns the command line, or null when it cannot be read
48
+ */
49
+ export declare function describeProcess(pid: number): string | null;
50
+ /**
51
+ * "PID 875 (node dist/server/server.js), PID 876" — or null when no PID is visible.
52
+ */
53
+ export declare function describeListeners(port: number): string | null;
54
+ export {};
55
+ //# sourceMappingURL=process-inspect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-inspect.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/process-inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQ9D;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAIpD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI,CAmBpE;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AA0ED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAe1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS7D"}