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
@@ -10,6 +10,7 @@ exports.reconcileSessionGeometry = reconcileSessionGeometry;
10
10
  exports.isTmuxAvailable = isTmuxAvailable;
11
11
  exports.hasSession = hasSession;
12
12
  exports.getSessionWorkingDirectory = getSessionWorkingDirectory;
13
+ exports.getPaneCurrentCommand = getPaneCurrentCommand;
13
14
  exports.listSessions = listSessions;
14
15
  exports.createSession = createSession;
15
16
  exports.sendKeys = sendKeys;
@@ -216,6 +217,27 @@ async function getSessionWorkingDirectory(sessionName) {
216
217
  return null;
217
218
  }
218
219
  }
220
+ /**
221
+ * The foreground command of a session's pane (`#{pane_current_command}`), or
222
+ * null when tmux cannot say (Issue #3089).
223
+ *
224
+ * Read by Claude's start wait to tell "the agent quit back to the shell" from
225
+ * "the agent is still drawing": once the agent has exited, the pane's
226
+ * foreground process is the login shell again (`bash`, `zsh`, `-zsh`, ...).
227
+ *
228
+ * @param sessionName - Target session name
229
+ * @returns The command name, or null when the session or tmux is unavailable
230
+ */
231
+ async function getPaneCurrentCommand(sessionName) {
232
+ try {
233
+ const { stdout } = await execFileAsync('tmux', ['display-message', '-p', '-t', exactTarget(sessionName), '#{pane_current_command}'], { timeout: DEFAULT_TIMEOUT });
234
+ const command = stdout.trim();
235
+ return command === '' ? null : command;
236
+ }
237
+ catch {
238
+ return null;
239
+ }
240
+ }
219
241
  /**
220
242
  * List all tmux sessions
221
243
  *
@@ -254,6 +276,33 @@ async function listSessions() {
254
276
  return [];
255
277
  }
256
278
  }
279
+ /**
280
+ * Issue #2958: what window 0 of a new session runs until `createSession`
281
+ * replaces it with the login shell. Two words so tmux execs it directly (a
282
+ * single word would be run through `default-shell -c`); it never exits on its
283
+ * own and dies with the SIGHUP the replacement sends.
284
+ */
285
+ const PLACEHOLDER_PANE_COMMAND = ['sleep', '2147483647'];
286
+ /**
287
+ * Fallback for a failed window rebuild: swap the placeholder in window 0 for
288
+ * the login shell tmux would have started (`default-shell`, as a login shell).
289
+ *
290
+ * A bare `respawn-pane` would re-run the pane's creation command — the
291
+ * placeholder — so the shell is named explicitly.
292
+ */
293
+ async function respawnLoginShell(sessionName, workingDirectory) {
294
+ let shell = '';
295
+ try {
296
+ const { stdout } = await execFileAsync('tmux', ['show-options', '-gv', 'default-shell'], { timeout: DEFAULT_TIMEOUT });
297
+ shell = stdout.trim();
298
+ }
299
+ catch {
300
+ // Fall through to the environment's shell.
301
+ }
302
+ if (!shell)
303
+ shell = process.env.SHELL || '/bin/sh';
304
+ await execFileAsync('tmux', ['respawn-pane', '-k', '-t', `${exactTarget(sessionName)}0`, '-c', workingDirectory, shell, '-l'], { timeout: DEFAULT_TIMEOUT });
305
+ }
257
306
  /**
258
307
  * Create a new tmux session
259
308
  *
@@ -300,7 +349,23 @@ async function createSession(sessionNameOrOptions, cwd) {
300
349
  try {
301
350
  // Create session with explicit window size to avoid 80x24 default
302
351
  // This is critical for TUI tools (Copilot, OpenCode) that use alternate screen
303
- await execFileAsync('tmux', ['new-session', '-d', '-s', sessionName, '-c', workingDirectory, '-x', String(windowWidth), '-y', String(windowHeight)], { timeout: DEFAULT_TIMEOUT });
352
+ //
353
+ // Issue #2958: window 0 runs a PLACEHOLDER, not the login shell, because it
354
+ // is thrown away by the `new-window -k` below a few milliseconds later. A
355
+ // shell killed that early is still inside its rc files, and pyenv's
356
+ // `pyenv init -` (`command pyenv rehash`) can die holding its lock file
357
+ // (`$PYENV_ROOT/shims/.pyenv-shim`). The NEXT shell then spins in
358
+ // `pyenv rehash` for its 60s lock timeout before running the launch command,
359
+ // so the agent missed the 60s initialization wait (exit 99). Measured on tmux
360
+ // 3.5a / pyenv 2.6.0: 7 of 40 shell-first creations left the lock behind and
361
+ // the replacement pane ran its first command after 61s; 0 of 40 with the
362
+ // placeholder. Two argv words make tmux exec it directly, so no shell (and
363
+ // no rc file) is started for window 0 at all.
364
+ await execFileAsync('tmux', [
365
+ 'new-session', '-d', '-s', sessionName, '-c', workingDirectory,
366
+ '-x', String(windowWidth), '-y', String(windowHeight),
367
+ ...PLACEHOLDER_PANE_COMMAND,
368
+ ], { timeout: DEFAULT_TIMEOUT });
304
369
  // Issue #1624: `history-limit` must be set BEFORE the pane that uses it exists.
305
370
  //
306
371
  // It is a session option, but a pane sizes its scrollback buffer ONCE, from
@@ -324,7 +389,9 @@ async function createSession(sessionNameOrOptions, cwd) {
324
389
  // cwd instead). Omitting it silently launches every agent in the wrong repo.
325
390
  //
326
391
  // Best-effort, matching the geometry step below: if this fails the session is
327
- // still usable, just with tmux's default 2000-line scrollback.
392
+ // still usable, just with tmux's default 2000-line scrollback. Window 0 is
393
+ // only a placeholder (Issue #2958), so the fallback must still put the login
394
+ // shell into it — see respawnLoginShell().
328
395
  try {
329
396
  await execFileAsync('tmux', ['new-window', '-k', '-t', `${exactTarget(sessionName)}0`, '-c', workingDirectory], { timeout: DEFAULT_TIMEOUT });
330
397
  }
@@ -334,6 +401,7 @@ async function createSession(sessionNameOrOptions, cwd) {
334
401
  historyLimit,
335
402
  error: error instanceof Error ? error.message : String(error),
336
403
  });
404
+ await respawnLoginShell(sessionName, workingDirectory);
337
405
  }
338
406
  // Issue #1163: Pin the pane to a fixed height so alternate-screen TUIs
339
407
  // (Claude/Codex/etc.) keep enough visible rows for capture-pane.
@@ -515,6 +583,9 @@ const ALLOWED_SPECIAL_KEYS = new Set([
515
583
  // (`COMMAND_CODE_NAVIGATION_KEY_VALUES`), so the route answers 400 for every
516
584
  // other tool — the same arrangement as `s` above.
517
585
  'C-a',
586
+ // Issue #3138: Command Code's plan review is submitted with ctrl+r; sent via
587
+ // sendSpecialKeys() like the other keys instead of a one-off sendKeys() call.
588
+ 'C-r',
518
589
  ]);
519
590
  /**
520
591
  * Type guard for "sendSpecialKeys() will actually deliver this key" (Issue #2032).
@@ -17,9 +17,13 @@
17
17
  * counted, and it is the single failure this gate must not reproduce.
18
18
  * 2. **Additions and removals are judged asymmetrically.** Everything that
19
19
  * existed at task start must still exist, whoever it belonged to — that is
20
- * the pkill (#1739) and `kill-server` (#1624) case — with one exception: a
21
- * tmux session the baseline recorded as *another CommandMate server's*
22
- * (#2627), which that server may close whenever it likes. New things are a
20
+ * the pkill (#1739) and `kill-server` (#1624) case — with three exceptions,
21
+ * each recorded in the baseline rather than guessed at verification: a
22
+ * tmux session of *another CommandMate server* (#2627) or of *this* server's
23
+ * worktree in *another repository* (#3043), which their owners close
24
+ * whenever they like, and a `.commandmate-demo-vitest-<pid>` directory
25
+ * whose pid was already dead (#3043), which the demo-video tests clean up
26
+ * by design. New things are a
23
27
  * violation *unless they are attributable to another worker*, because
24
28
  * parallel delegations legitimately start their own sessions and servers
25
29
  * inside each other's measurement windows — or unless they are the one
@@ -31,10 +35,12 @@
31
35
  * @module lib/verification/env-clean-gate
32
36
  */
33
37
  Object.defineProperty(exports, "__esModule", { value: true });
34
- exports.ENV_CLEAN_GUIDANCE = exports.MAX_REPORTED_ENV_CHANGES = exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT = exports.REQUIRE_ENV_CLEAN_SOURCE_CONFIG = void 0;
38
+ exports.ENV_CLEAN_GUIDANCE = exports.MAX_REPORTED_ENV_CHANGES = exports.isLivePid = exports.readLivePidCwd = exports.REQUIRE_ENV_CLEAN_SOURCE_CONTRACT = exports.REQUIRE_ENV_CLEAN_SOURCE_CONFIG = void 0;
35
39
  exports.resolveRequireEnvClean = resolveRequireEnvClean;
36
40
  exports.attributeSessionName = attributeSessionName;
37
41
  exports.attributeAnchor = attributeAnchor;
42
+ exports.demoVitestPid = demoVitestPid;
43
+ exports.attributeHomeEntry = attributeHomeEntry;
38
44
  exports.resolveTaskSessionName = resolveTaskSessionName;
39
45
  exports.recordTaskSession = recordTaskSession;
40
46
  exports.readTaskSession = readTaskSession;
@@ -42,11 +48,19 @@ exports.currentSessionServer = currentSessionServer;
42
48
  exports.isOtherServerSession = isOtherServerSession;
43
49
  exports.recordOtherServerSessions = recordOtherServerSessions;
44
50
  exports.readOtherServerSessions = readOtherServerSessions;
51
+ exports.recordOtherRepositorySessions = recordOtherRepositorySessions;
52
+ exports.readOtherRepositorySessions = readOtherRepositorySessions;
53
+ exports.recordDeadDemoVitestEntries = recordDeadDemoVitestEntries;
54
+ exports.readDeadDemoVitestEntries = readDeadDemoVitestEntries;
45
55
  exports.diffEnvSnapshots = diffEnvSnapshots;
46
56
  exports.formatEnvCleanReport = formatEnvCleanReport;
47
57
  exports.envCleanNoBaseline = envCleanNoBaseline;
48
58
  exports.evaluateEnvClean = evaluateEnvClean;
59
+ const child_process_1 = require("child_process");
60
+ const fs_1 = require("fs");
49
61
  const path_1 = require("path");
62
+ const db_instance_1 = require("../../lib/db/db-instance");
63
+ const worktree_db_1 = require("../../lib/db/worktree-db");
50
64
  const session_name_1 = require("../../lib/cli-tools/session-name");
51
65
  const types_1 = require("../../lib/cli-tools/types");
52
66
  const env_snapshot_1 = require("./env-snapshot");
@@ -138,16 +152,102 @@ function attributeAnchor(anchor, worktreePath) {
138
152
  return 'other';
139
153
  return 'unattributed';
140
154
  }
141
- function attributeEntry(probeId, entry, context) {
155
+ /** Bounded like the snapshot probes: a hung `lsof` must not hold a run open. */
156
+ const PID_CWD_TIMEOUT_MS = 5_000;
157
+ /**
158
+ * Read a process's cwd from the machine: `/proc/<pid>/cwd` on Linux, `lsof` on
159
+ * macOS (which has no procfs). A dead pid, a process owned by someone this user
160
+ * cannot inspect, or a missing `lsof` all answer null — which leaves the entry
161
+ * unattributed, the strict verdict.
162
+ */
163
+ const readLivePidCwd = (pid) => {
164
+ try {
165
+ process.kill(pid, 0);
166
+ }
167
+ catch (error) {
168
+ // EPERM means the process exists but belongs to another user.
169
+ if (error.code !== 'EPERM')
170
+ return null;
171
+ }
172
+ if (process.platform === 'linux') {
173
+ try {
174
+ return (0, fs_1.readlinkSync)(`/proc/${pid}/cwd`);
175
+ }
176
+ catch {
177
+ return null;
178
+ }
179
+ }
180
+ try {
181
+ const out = (0, child_process_1.execFileSync)('lsof', ['-a', '-d', 'cwd', '-p', String(pid), '-F', 'n'], {
182
+ encoding: 'utf8',
183
+ timeout: PID_CWD_TIMEOUT_MS,
184
+ stdio: ['ignore', 'pipe', 'ignore'],
185
+ });
186
+ const line = out.split('\n').find((field) => field.startsWith('n'));
187
+ return line ? line.slice(1) : null;
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ };
193
+ exports.readLivePidCwd = readLivePidCwd;
194
+ /**
195
+ * `tests/unit/skills/demo-video/env-scripts.test.ts` creates
196
+ * `~/.commandmate-demo-vitest-<pid>` for the length of its run — in the real
197
+ * `$HOME`, because `env-up.sh` refuses `/tmp` and `/var` (#2954). The name
198
+ * carries the pid of the test process that made it, which is the one `$HOME`
199
+ * entry whose owner can be established.
200
+ */
201
+ const DEMO_VITEST_HOME_ENTRY = /^\.commandmate-demo-vitest-([1-9]\d*)$/;
202
+ const isLivePid = (pid) => {
203
+ try {
204
+ process.kill(pid, 0);
205
+ return true;
206
+ }
207
+ catch (error) {
208
+ return error.code === 'EPERM';
209
+ }
210
+ };
211
+ exports.isLivePid = isLivePid;
212
+ /** The pid a `.commandmate-demo-vitest-<pid>` name carries; null for any other name. */
213
+ function demoVitestPid(name) {
214
+ const match = DEMO_VITEST_HOME_ENTRY.exec(name);
215
+ if (!match)
216
+ return null;
217
+ const pid = Number(match[1]);
218
+ return Number.isSafeInteger(pid) ? pid : null;
219
+ }
220
+ /**
221
+ * Attribute a `$HOME` entry (#2954).
222
+ *
223
+ * Only `.commandmate-demo-vitest-<pid>` can be attributed, and only while its
224
+ * pid is alive: the test process's cwd is then judged exactly as a listener's
225
+ * is ({@link attributeAnchor}), so a parallel worktree's test run is `other`.
226
+ * A dead pid, an unreadable cwd, or a cwd inside this worktree leave it
227
+ * unattributed — a directory this worker's own tests failed to remove is still
228
+ * caught.
229
+ */
230
+ function attributeHomeEntry(name, worktreePath, resolvePidCwd = exports.readLivePidCwd) {
231
+ const pid = demoVitestPid(name);
232
+ if (pid === null)
233
+ return 'unattributed';
234
+ const owner = attributeAnchor(resolvePidCwd(pid), worktreePath);
235
+ // `self` is not an excuse for an addition, and a file has no self to report.
236
+ return owner === 'other' ? 'other' : 'unattributed';
237
+ }
238
+ function attributeEntry(probeId, entry, context, resolvePidCwd) {
142
239
  switch (probeId) {
143
240
  case 'tmux-sessions':
144
241
  return attributeSessionName(entry.key, context.worktreeId);
145
242
  case 'listeners':
146
243
  return attributeAnchor(entry.anchor, context.worktreePath);
244
+ case 'home-entries':
245
+ return attributeHomeEntry(entry.key, context.worktreePath, resolvePidCwd);
147
246
  default:
148
247
  // A file has no owner. `$HOME` and `~/.commandmate` are shared, so an
149
248
  // entry appearing there is a violation for whoever is being judged — the
150
- // rule the Issue's incident list is made of.
249
+ // rule the Issue's incident list is made of. The one `$HOME` exception is
250
+ // above (#2954).
151
251
  return 'unattributed';
152
252
  }
153
253
  }
@@ -172,11 +272,13 @@ function resolveTaskSessionName(task) {
172
272
  }
173
273
  }
174
274
  /** A freshly captured baseline, stamped with its task's own agent session. */
175
- function recordTaskSession(snapshot, task, server = currentSessionServer()) {
275
+ function recordTaskSession(snapshot, task, server = currentSessionServer(), isPidAlive = exports.isLivePid) {
176
276
  return {
177
277
  ...snapshot,
178
278
  taskSession: resolveTaskSessionName(task),
179
279
  otherServerSessions: recordOtherServerSessions(snapshot, server),
280
+ otherRepositorySessions: recordOtherRepositorySessions(snapshot, task.worktreeId, server),
281
+ deadDemoVitestEntries: recordDeadDemoVitestEntries(snapshot, isPidAlive),
180
282
  };
181
283
  }
182
284
  /**
@@ -212,6 +314,14 @@ function currentSessionServer() {
212
314
  return undefined;
213
315
  }
214
316
  },
317
+ repositoryOf: (worktreeId) => {
318
+ try {
319
+ return (0, worktree_db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId)?.repositoryPath || null;
320
+ }
321
+ catch {
322
+ return null;
323
+ }
324
+ },
215
325
  };
216
326
  }
217
327
  /**
@@ -290,6 +400,131 @@ function readOtherServerSessions(baseline) {
290
400
  return new Set();
291
401
  return new Set(recorded.filter((name) => typeof name === 'string'));
292
402
  }
403
+ // =============================================================================
404
+ // This server's sessions of another repository (Issue #3043)
405
+ // =============================================================================
406
+ /**
407
+ * The repository a session of this server belongs to, or null when that
408
+ * cannot be pinned to exactly one.
409
+ *
410
+ * The worktree id and the instance suffix are not separable by name alone
411
+ * (`parseSessionName`), so every hyphen-boundary prefix of the tail is looked
412
+ * up; a prefix that is not a registered worktree answers null and is skipped.
413
+ * More than one repository among the answers is ambiguous and answers null —
414
+ * the strict direction, because null excuses nothing.
415
+ */
416
+ function sessionRepository(tail, server) {
417
+ const repositoryOf = server.repositoryOf;
418
+ if (!repositoryOf)
419
+ return null;
420
+ const repositories = new Set();
421
+ let end = tail.indexOf('-');
422
+ for (;;) {
423
+ const candidate = end === -1 ? tail : tail.slice(0, end);
424
+ const repository = repositoryOf(candidate);
425
+ if (repository)
426
+ repositories.add(repository);
427
+ if (end === -1)
428
+ break;
429
+ end = tail.indexOf('-', end + 1);
430
+ }
431
+ return repositories.size === 1 ? [...repositories][0] : null;
432
+ }
433
+ /**
434
+ * The baseline's `mcbd-*` sessions of *this* server whose worktree belongs to a
435
+ * repository other than the task's, at task creation.
436
+ *
437
+ * Why this is the second line removals are excused on — the design note for
438
+ * #3043, which extends the one for #2627 rather than contradicting it:
439
+ *
440
+ * - #1624, the case the removal rule exists for, was a worker killing a
441
+ * *sibling worktree of the same repository*. Those sessions stay guarded
442
+ * exactly as before: a same-repository removal is never excused, however
443
+ * plainly `other` its name is.
444
+ * - A worktree of another repository is driven by another orchestrate on the
445
+ * same server, which closes its workers' sessions when they finish (the
446
+ * 2026-09-29 and 2026-09-30 runs, `commandagent-issue-546/554` against
447
+ * `commandmate-issue-3023`). A delegation has no business in another
448
+ * repository, and the one it is judged for cannot tell that close from a
449
+ * kill any better than it could for another server's.
450
+ * - It uses the database the #2627 note rejected, but not for what that note
451
+ * rejected it for: there the other server's worktrees lived in a different
452
+ * database under colliding ids. Here the session carries *this* server's
453
+ * namespace, so *this* server's worktree table is the authority on it.
454
+ * - Recorded at task creation, like {@link recordOtherServerSessions}: the
455
+ * other orchestrate may remove its worktree — and with it the row — before
456
+ * this task is verified, and an unknown worktree excuses nothing.
457
+ *
458
+ * Still rejected: excusing every `other` removal (drops #1624), counting,
459
+ * timing and the worker's command log, for the reasons in the #2627 note; and
460
+ * a "needs review" verdict of its own, because the orchestrator's review of the
461
+ * same-repository case is exactly the one #1624 needs a hard failure for.
462
+ *
463
+ * @returns the names, or null when `server` has no namespace or cannot place
464
+ * the task's own worktree
465
+ */
466
+ function recordOtherRepositorySessions(snapshot, taskWorktreeId, server) {
467
+ if (server.namespace === null || !server.repositoryOf)
468
+ return null;
469
+ const ownRepository = server.repositoryOf(taskWorktreeId);
470
+ if (!ownRepository)
471
+ return null;
472
+ const sessions = snapshot.probes['tmux-sessions'];
473
+ if (!sessions || sessions.status !== 'ok')
474
+ return [];
475
+ return sessions.entries
476
+ .map((entry) => entry.key)
477
+ .filter((name) => {
478
+ if (attributeSessionName(name, taskWorktreeId) !== 'other')
479
+ return false;
480
+ if (isOtherServerSession(name, server))
481
+ return false;
482
+ const parsed = (0, session_name_1.parseSessionName)(name);
483
+ if (!parsed)
484
+ return false;
485
+ const repository = sessionRepository(parsed.rest, server);
486
+ return repository !== null && repository !== ownRepository;
487
+ });
488
+ }
489
+ /** The recorded other-repository sessions of a baseline; empty when none was recorded. */
490
+ function readOtherRepositorySessions(baseline) {
491
+ const recorded = baseline.otherRepositorySessions;
492
+ if (!Array.isArray(recorded))
493
+ return new Set();
494
+ return new Set(recorded.filter((name) => typeof name === 'string'));
495
+ }
496
+ // =============================================================================
497
+ // Stale demo-vitest directories (Issue #3043)
498
+ // =============================================================================
499
+ /**
500
+ * The baseline's `.commandmate-demo-vitest-<pid>` entries whose pid was already
501
+ * dead at task creation.
502
+ *
503
+ * Recorded then, because only then is it knowable: a removed directory's pid is
504
+ * always dead by verification, so the gate could not otherwise tell a leftover
505
+ * swept up by `env-scripts.test.ts` (#3025, run by any parallel worktree's unit
506
+ * gate) from a directory a live test run was still using. The latter — a pid
507
+ * alive at task start — stays a violation: a worker may have deleted a parallel
508
+ * test's working directory.
509
+ */
510
+ function recordDeadDemoVitestEntries(snapshot, isPidAlive = exports.isLivePid) {
511
+ const home = snapshot.probes['home-entries'];
512
+ if (!home || home.status !== 'ok')
513
+ return [];
514
+ return home.entries
515
+ .map((entry) => entry.key)
516
+ .filter((name) => {
517
+ const pid = demoVitestPid(name);
518
+ return pid !== null && !isPidAlive(pid);
519
+ });
520
+ }
521
+ /** The recorded dead-pid demo-vitest entries of a baseline; empty when none was recorded. */
522
+ function readDeadDemoVitestEntries(baseline) {
523
+ const recorded = baseline.deadDemoVitestEntries;
524
+ if (!Array.isArray(recorded))
525
+ return new Set();
526
+ return new Set(recorded.filter((name) => typeof name === 'string' && demoVitestPid(name) !== null));
527
+ }
293
528
  function toChange(entry, owner) {
294
529
  return { key: entry.key, detail: entry.detail, owner };
295
530
  }
@@ -304,7 +539,10 @@ function toChange(entry, owner) {
304
539
  function diffEnvSnapshots(baseline, final, context, options = {}) {
305
540
  const taskSession = readTaskSession(baseline);
306
541
  const otherServerSessions = readOtherServerSessions(baseline);
542
+ const otherRepositorySessions = readOtherRepositorySessions(baseline);
543
+ const deadDemoVitestEntries = readDeadDemoVitestEntries(baseline);
307
544
  const ignoredHomeEntries = new Set(options.ignoreHomeEntries ?? []);
545
+ const resolvePidCwd = options.resolvePidCwd ?? exports.readLivePidCwd;
308
546
  const probes = env_snapshot_1.ENV_PROBE_IDS.map((probeId) => {
309
547
  const before = baseline.probes[probeId];
310
548
  const after = final.probes[probeId];
@@ -318,6 +556,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
318
556
  taskSessionAdded: [],
319
557
  removed: [],
320
558
  removedByOtherServer: [],
559
+ removedByOtherRepository: [],
560
+ removedStaleDemoVitest: [],
321
561
  ignoredByConfig: [],
322
562
  };
323
563
  }
@@ -331,6 +571,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
331
571
  taskSessionAdded: [],
332
572
  removed: [],
333
573
  removedByOtherServer: [],
574
+ removedByOtherRepository: [],
575
+ removedStaleDemoVitest: [],
334
576
  ignoredByConfig: [],
335
577
  };
336
578
  }
@@ -346,7 +588,7 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
346
588
  for (const entry of after.entries) {
347
589
  if (beforeKeys.has(entry.key))
348
590
  continue;
349
- const owner = attributeEntry(probeId, entry, context);
591
+ const owner = attributeEntry(probeId, entry, context, resolvePidCwd);
350
592
  if (isIgnoredByConfig(entry)) {
351
593
  ignoredByConfig.push(toChange(entry, owner));
352
594
  continue;
@@ -367,10 +609,12 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
367
609
  after.entries.some((entry) => beforeKeys.has(entry.key) || (taskSession !== null && entry.key === taskSession));
368
610
  const removed = [];
369
611
  const removedByOtherServer = [];
612
+ const removedByOtherRepository = [];
613
+ const removedStaleDemoVitest = [];
370
614
  for (const entry of before.entries) {
371
615
  if (afterKeys.has(entry.key))
372
616
  continue;
373
- const change = toChange(entry, attributeEntry(probeId, entry, context));
617
+ const change = toChange(entry, attributeEntry(probeId, entry, context, resolvePidCwd));
374
618
  if (isIgnoredByConfig(entry)) {
375
619
  ignoredByConfig.push(change);
376
620
  }
@@ -379,6 +623,14 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
379
623
  otherServerSessions.has(entry.key)) {
380
624
  removedByOtherServer.push(change);
381
625
  }
626
+ else if (tmuxServerSurvived &&
627
+ change.owner === 'other' &&
628
+ otherRepositorySessions.has(entry.key)) {
629
+ removedByOtherRepository.push(change);
630
+ }
631
+ else if (probeId === 'home-entries' && deadDemoVitestEntries.has(entry.key)) {
632
+ removedStaleDemoVitest.push(change);
633
+ }
382
634
  else {
383
635
  removed.push(change);
384
636
  }
@@ -392,6 +644,8 @@ function diffEnvSnapshots(baseline, final, context, options = {}) {
392
644
  taskSessionAdded,
393
645
  removed,
394
646
  removedByOtherServer,
647
+ removedByOtherRepository,
648
+ removedStaleDemoVitest,
395
649
  ignoredByConfig,
396
650
  };
397
651
  });
@@ -453,6 +707,14 @@ function formatTaskSessionChanges(changes) {
453
707
  function formatRemovedByOtherServer(changes) {
454
708
  return changes.map((change) => ` · - ${change.key} (ignored: another CommandMate server's session, recorded at task start)`);
455
709
  }
710
+ /** Removals excused as this server's sessions of another repository (#3043), one line each. */
711
+ function formatRemovedByOtherRepository(changes) {
712
+ return changes.map((change) => ` · - ${change.key} (ignored: a worktree of another repository on this server, recorded at task start)`);
713
+ }
714
+ /** Removals excused as leftover demo-vitest directories (#3043), one line each. */
715
+ function formatRemovedStaleDemoVitest(changes) {
716
+ return changes.map((change) => ` · - ${change.key} (ignored: its pid was already dead at task start — a leftover swept by the demo-video tests)`);
717
+ }
456
718
  function formatIgnoredByConfig(changes) {
457
719
  if (changes.length === 0)
458
720
  return [];
@@ -486,6 +748,8 @@ function formatEnvCleanReport(diff) {
486
748
  lines.push(` ${probe.probeId} clean (${label})${excused}`);
487
749
  lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
488
750
  lines.push(...formatRemovedByOtherServer(probe.removedByOtherServer));
751
+ lines.push(...formatRemovedByOtherRepository(probe.removedByOtherRepository));
752
+ lines.push(...formatRemovedStaleDemoVitest(probe.removedStaleDemoVitest));
489
753
  lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
490
754
  continue;
491
755
  }
@@ -494,6 +758,8 @@ function formatEnvCleanReport(diff) {
494
758
  lines.push(...formatChanges('-', probe.removed));
495
759
  lines.push(...formatTaskSessionChanges(probe.taskSessionAdded));
496
760
  lines.push(...formatRemovedByOtherServer(probe.removedByOtherServer));
761
+ lines.push(...formatRemovedByOtherRepository(probe.removedByOtherRepository));
762
+ lines.push(...formatRemovedStaleDemoVitest(probe.removedStaleDemoVitest));
497
763
  lines.push(...formatIgnoredByConfig(probe.ignoredByConfig));
498
764
  for (const excused of probe.ignoredAdded) {
499
765
  lines.push(` · ${excused.key} (ignored: belongs to another worktree)`);
@@ -518,7 +784,11 @@ function envCleanNoBaseline(taskId, sources) {
518
784
  return (`${verify_config_1.ENV_CLEAN_GATE_ID}: UNKNOWN — no baseline snapshot exists for ${who}, so nothing can be ` +
519
785
  'compared. This is NOT "the environment is unchanged": no measurement was taken. ' +
520
786
  'A baseline is recorded when the task is created (`send --contract`) and only while the ' +
521
- `gate is switched on (currently: ${how}). Switch it on, then re-send the task.`);
787
+ `gate is switched on (currently: ${how}). Switch it on, then re-send the task.` +
788
+ (taskId
789
+ ? ''
790
+ : ' To re-verify this worktree\'s contract task (this run is not attached to a task), run ' +
791
+ '`commandmate verify <worktree> --task <id>`.'));
522
792
  }
523
793
  /**
524
794
  * Judge the machine against the task's baseline.
@@ -552,6 +822,7 @@ async function evaluateEnvClean(input) {
552
822
  }
553
823
  const diff = diffEnvSnapshots(input.baseline, final, input, {
554
824
  ignoreHomeEntries: input.ignoreHomeEntries,
825
+ resolvePidCwd: input.resolvePidCwd,
555
826
  });
556
827
  const header = `${verify_config_1.ENV_CLEAN_GATE_ID}: baseline=${new Date(input.baseline.capturedAt).toISOString()} ` +
557
828
  `status=${diff.status} task-session=${describeTaskSession(diff.taskSession)}`;
@@ -50,6 +50,8 @@ const worktree_index_1 = require("./worktree-index");
50
50
  // exit-code table the pane prints, so the producer and the reader are one string.
51
51
  const run_verdict_vocabulary_1 = require("./run-verdict-vocabulary");
52
52
  const scope_gate_1 = require("./scope-gate");
53
+ const receipt_owned_paths_1 = require("../../lib/skills/receipt-owned-paths");
54
+ const agent_state_paths_1 = require("../../lib/skills/agent-state-paths");
53
55
  const verify_config_1 = require("./verify-config");
54
56
  Object.defineProperty(exports, "ENV_CLEAN_GATE_ID", { enumerable: true, get: function () { return verify_config_1.ENV_CLEAN_GATE_ID; } });
55
57
  Object.defineProperty(exports, "SCOPE_GATE_ID", { enumerable: true, get: function () { return verify_config_1.SCOPE_GATE_ID; } });
@@ -816,10 +818,35 @@ async function evaluateWorkEvidence(worktreePath, baseRef, requireCommit, agentE
816
818
  if (porcelain.code !== 0) {
817
819
  return done('error', "work-evidence: 'git status --porcelain' failed.", null);
818
820
  }
819
- const uncommittedCount = (0, scope_gate_1.parsePorcelainEntries)(porcelain.stdout).filter((paths) => paths.some((path) => !(0, scope_gate_1.isContractPath)(path))).length;
821
+ // Untracked files a recorded Skill install placed, untouched since, are
822
+ // CommandMate's and not the agent's (#3092): installing a Skill alone must
823
+ // still read as `not_started`. Anything the receipt does not vouch for —
824
+ // including a Skill file whose bytes changed — is counted as before.
825
+ const skillOwned = (0, receipt_owned_paths_1.collectSkillReceiptOwnedPaths)(worktreePath);
826
+ let skillInstalledCount = 0;
827
+ const agentStateExcluded = new Set();
828
+ const uncommittedCount = (0, scope_gate_1.parsePorcelainStatusEntries)(porcelain.stdout).filter((entry) => {
829
+ if (!entry.paths.some((path) => !(0, scope_gate_1.isContractPath)(path)))
830
+ return false;
831
+ if ((0, scope_gate_1.isSkillInstalledUntrackedEntry)(entry, skillOwned)) {
832
+ skillInstalledCount += 1;
833
+ return false;
834
+ }
835
+ if ((0, agent_state_paths_1.isAgentStateUntrackedEntry)(entry)) {
836
+ entry.paths.forEach((path) => agentStateExcluded.add(path));
837
+ return false;
838
+ }
839
+ return true;
840
+ }).length;
820
841
  const summary = `work-evidence: baseRef=${baseRef} commits=${commitCount} uncommitted=${uncommittedCount}` +
821
842
  (requireCommit.required ? ' requireCommit=true' : '') +
822
- ' (contract files excluded)';
843
+ ' (contract files excluded)' +
844
+ (skillInstalledCount > 0
845
+ ? ` (${skillInstalledCount} CommandMate-installed Skill file(s) excluded)`
846
+ : '') +
847
+ (agentStateExcluded.size > 0
848
+ ? ` (agent-managed state file(s) excluded: ${[...agentStateExcluded].sort().join(', ')})`
849
+ : '');
823
850
  if (!Number.isFinite(commitCount) || (commitCount === 0 && uncommittedCount === 0)) {
824
851
  // Issue #2043, and the ONLY place this gate's verdict differs from what it
825
852
  // was: git found nothing, so ask the agent. `null` — every tool but