commandmate 0.30.1 → 0.31.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 (442) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +164 -164
  3. package/.next/app-path-routes-manifest.json +28 -28
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  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_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update-check/route.js +1 -1
  12. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  15. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  17. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  18. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js +1 -1
  20. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  21. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js +1 -1
  23. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  24. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js +3 -3
  26. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  27. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/assistant/terminal/route.js +4 -4
  29. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js +1 -1
  32. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  33. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/capabilities/route.js +1 -1
  38. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  47. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  48. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  50. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  51. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  53. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  54. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  65. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  66. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/clone/route.js +1 -1
  68. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  69. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/restore/route.js +1 -1
  72. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  73. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/repositories/route.js +1 -1
  75. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/scan/route.js +1 -1
  78. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  79. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/sync/route.js +1 -1
  81. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  85. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  86. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/skills/[id]/route.js +1 -1
  90. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/skills/route.js +1 -1
  95. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/slash-commands/route.js +1 -1
  97. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  107. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  110. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  113. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  119. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  150. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +4 -3
  177. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/schedules/route.js +4 -3
  180. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  186. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/route.js +1 -1
  221. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/chat/page.js +2 -2
  224. package/.next/server/app/chat/page.js.nft.json +1 -1
  225. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  227. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/more/page.js +2 -2
  229. package/.next/server/app/more/page.js.nft.json +1 -1
  230. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/page.js +1 -1
  233. package/.next/server/app/page.js.nft.json +1 -1
  234. package/.next/server/app/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/repositories/page.js +2 -2
  237. package/.next/server/app/repositories/page.js.nft.json +1 -1
  238. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/review/page.js +1 -1
  240. package/.next/server/app/review/page.js.nft.json +1 -1
  241. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/sessions/page.js +1 -1
  243. package/.next/server/app/sessions/page.js.nft.json +1 -1
  244. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  245. package/.next/server/app/skills/[skillId]/page.js +2 -2
  246. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  247. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  248. package/.next/server/app/skills/installed/page.js +2 -2
  249. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  250. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  251. package/.next/server/app/skills/page.js +1 -1
  252. package/.next/server/app/skills/page.js.nft.json +1 -1
  253. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  254. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  255. package/.next/server/app/worktrees/[id]/page.js +10 -10
  256. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  257. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  258. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  259. package/.next/server/app-paths-manifest.json +28 -28
  260. package/.next/server/chunks/1058.js +1 -1
  261. package/.next/server/chunks/1068.js +1 -1
  262. package/.next/server/chunks/1262.js +1 -1
  263. package/.next/server/chunks/1886.js +3 -3
  264. package/.next/server/chunks/1990.js +103 -0
  265. package/.next/server/chunks/2119.js +1 -1
  266. package/.next/server/chunks/2328.js +1 -1
  267. package/.next/server/chunks/2404.js +1 -1
  268. package/.next/server/chunks/2445.js +1 -1
  269. package/.next/server/chunks/261.js +1 -1
  270. package/.next/server/chunks/3123.js +1 -1
  271. package/.next/server/chunks/3241.js +1 -1
  272. package/.next/server/chunks/3480.js +5 -4
  273. package/.next/server/chunks/4299.js +1 -1
  274. package/.next/server/chunks/4393.js +1 -1
  275. package/.next/server/chunks/4443.js +1 -5
  276. package/.next/server/chunks/5017.js +1 -1
  277. package/.next/server/chunks/5043.js +1 -1
  278. package/.next/server/chunks/5164.js +1 -1
  279. package/.next/server/chunks/552.js +2 -2
  280. package/.next/server/chunks/6072.js +1 -1
  281. package/.next/server/chunks/6130.js +1 -1
  282. package/.next/server/chunks/663.js +4 -3
  283. package/.next/server/chunks/6894.js +2 -2
  284. package/.next/server/chunks/7187.js +1 -0
  285. package/.next/server/chunks/7472.js +1 -1
  286. package/.next/server/chunks/{880.js → 7859.js} +6 -6
  287. package/.next/server/chunks/7905.js +1 -1
  288. package/.next/server/chunks/8800.js +2 -2
  289. package/.next/server/chunks/8918.js +7 -0
  290. package/.next/server/chunks/9123.js +2 -2
  291. package/.next/server/chunks/9130.js +4 -4
  292. package/.next/server/chunks/9627.js +1 -1
  293. package/.next/server/chunks/9696.js +2 -2
  294. package/.next/server/chunks/9798.js +1 -1
  295. package/.next/server/middleware-manifest.json +5 -5
  296. package/.next/server/pages/500.html +1 -1
  297. package/.next/server/server-reference-manifest.json +1 -1
  298. package/.next/static/chunks/1783-11c9b4d8a52ebd91.js +1 -0
  299. package/.next/static/chunks/4718-de1224c9e8a6e7fc.js +1 -0
  300. package/.next/static/chunks/6022-2fa0b5a82d4ce7b6.js +1 -0
  301. package/.next/static/chunks/{5229-6c89475b61bd2c8b.js → 6170-951b9f5fe6b4b3b5.js} +1 -1
  302. package/.next/static/chunks/app/chat/{page-9aa2011410895b0d.js → page-37d7615d17d7e2a0.js} +1 -1
  303. package/.next/static/chunks/app/layout-4c2f21e3f653ee4c.js +1 -0
  304. package/.next/static/chunks/app/more/{page-333bba1c8bbc9c11.js → page-353a3924e6d7968e.js} +1 -1
  305. package/.next/static/chunks/app/{page-214f7ffa13a0cf10.js → page-c2bf871d953a1d6f.js} +1 -1
  306. package/.next/static/chunks/app/repositories/{page-4951cac905e50224.js → page-7d0f26df0537254c.js} +1 -1
  307. package/.next/static/chunks/app/review/{page-a0899b2d285318c3.js → page-e3f141b2829973e9.js} +1 -1
  308. package/.next/static/chunks/app/sessions/{page-fb36145ec732092a.js → page-53f188ed9ca49e5f.js} +1 -1
  309. package/.next/static/chunks/app/skills/[skillId]/{page-9099e26b60442873.js → page-80569b720aea59cc.js} +1 -1
  310. package/.next/static/chunks/app/skills/installed/{page-182e32368696d824.js → page-dbd2690ad72da95b.js} +1 -1
  311. package/.next/static/chunks/app/skills/{page-d3fdc88239ebe0ab.js → page-dacd36f9c11aa7da.js} +1 -1
  312. package/.next/static/chunks/app/worktrees/[id]/page-97205088520255a5.js +1 -0
  313. package/.next/static/css/5c13ea243dfdcb66.css +1 -0
  314. package/.next/trace +13 -13
  315. package/README.md +37 -11
  316. package/dist/cli/commands/attach.d.ts +50 -0
  317. package/dist/cli/commands/attach.d.ts.map +1 -0
  318. package/dist/cli/commands/attach.js +204 -0
  319. package/dist/cli/commands/capture.d.ts.map +1 -1
  320. package/dist/cli/commands/capture.js +114 -0
  321. package/dist/cli/commands/instances.d.ts.map +1 -1
  322. package/dist/cli/commands/instances.js +23 -2
  323. package/dist/cli/commands/ls.d.ts.map +1 -1
  324. package/dist/cli/commands/ls.js +41 -1
  325. package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
  326. package/dist/cli/config/cli-dependencies.js +34 -0
  327. package/dist/cli/program.d.ts.map +1 -1
  328. package/dist/cli/program.js +5 -0
  329. package/dist/cli/types/index.d.ts +36 -0
  330. package/dist/cli/types/index.d.ts.map +1 -1
  331. package/dist/config/tmux-pane-config.d.ts +153 -0
  332. package/dist/config/tmux-pane-config.d.ts.map +1 -0
  333. package/dist/config/tmux-pane-config.js +172 -0
  334. package/dist/lib/cli-tools/session-name.d.ts +44 -0
  335. package/dist/lib/cli-tools/session-name.d.ts.map +1 -0
  336. package/dist/lib/cli-tools/session-name.js +57 -0
  337. package/dist/lib/cli-tools/types.d.ts +1 -1
  338. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  339. package/dist/lib/cli-tools/types.js +6 -1
  340. package/dist/lib/cli-tools/validation.d.ts +34 -0
  341. package/dist/lib/cli-tools/validation.d.ts.map +1 -0
  342. package/dist/lib/cli-tools/validation.js +41 -0
  343. package/dist/lib/detection/status-reason.d.ts +18 -0
  344. package/dist/lib/detection/status-reason.d.ts.map +1 -1
  345. package/dist/lib/detection/status-reason.js +18 -0
  346. package/dist/lib/detection/tools/verified-against.d.ts +57 -7
  347. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  348. package/dist/lib/detection/tools/verified-against.js +59 -8
  349. package/dist/lib/detection/version-probes.d.ts +26 -5
  350. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  351. package/dist/lib/detection/version-probes.js +28 -6
  352. package/dist/lib/session/tmux-session-surface.d.ts +369 -0
  353. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -0
  354. package/dist/lib/session/tmux-session-surface.js +525 -0
  355. package/dist/server/src/config/cli-tool-timing-config.js +12 -1
  356. package/dist/server/src/config/detection-evidence-config.js +5 -0
  357. package/dist/server/src/config/schedule-config.js +28 -1
  358. package/dist/server/src/lib/cli-tools/antigravity.js +2 -2
  359. package/dist/server/src/lib/cli-tools/base.js +13 -8
  360. package/dist/server/src/lib/cli-tools/claude.js +20 -0
  361. package/dist/server/src/lib/cli-tools/codex.js +205 -61
  362. package/dist/server/src/lib/cli-tools/command-code.js +349 -0
  363. package/dist/server/src/lib/cli-tools/composer-spec.js +6 -0
  364. package/dist/server/src/lib/cli-tools/copilot.js +2 -2
  365. package/dist/server/src/lib/cli-tools/gemini.js +2 -2
  366. package/dist/server/src/lib/cli-tools/graceful-exit.js +16 -1
  367. package/dist/server/src/lib/cli-tools/index.js +4 -1
  368. package/dist/server/src/lib/cli-tools/install-hints.js +131 -0
  369. package/dist/server/src/lib/cli-tools/liveness-spec.js +18 -0
  370. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  371. package/dist/server/src/lib/cli-tools/opencode.js +2 -2
  372. package/dist/server/src/lib/cli-tools/start-availability.js +18 -11
  373. package/dist/server/src/lib/cli-tools/types.js +6 -1
  374. package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
  375. package/dist/server/src/lib/cmate-parser.js +6 -0
  376. package/dist/server/src/lib/detection/cli-patterns.js +441 -8
  377. package/dist/server/src/lib/detection/opencode-modal-overlay.js +66 -100
  378. package/dist/server/src/lib/detection/selection-shape.js +341 -0
  379. package/dist/server/src/lib/detection/sgr-background.js +210 -0
  380. package/dist/server/src/lib/detection/status-detector.js +6 -0
  381. package/dist/server/src/lib/detection/status-reason.js +18 -0
  382. package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -15
  383. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +392 -0
  384. package/dist/server/src/lib/detection/tools/codex/detect.js +83 -2
  385. package/dist/server/src/lib/detection/tools/command-code/detect.js +159 -0
  386. package/dist/server/src/lib/detection/tools/registry.js +6 -4
  387. package/dist/server/src/lib/detection/tools/verified-against.js +59 -8
  388. package/dist/server/src/lib/detection/version-probes.js +28 -6
  389. package/dist/server/src/lib/hooks/sources/antigravity/history.js +101 -21
  390. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +39 -0
  391. package/dist/server/src/lib/hooks/sources/claude/history.js +245 -21
  392. package/dist/server/src/lib/hooks/sources/claude/transcript.js +175 -13
  393. package/dist/server/src/lib/hooks/sources/codex/history.js +84 -15
  394. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +130 -17
  395. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +145 -0
  396. package/dist/server/src/lib/hooks/sources/command-code/history.js +865 -0
  397. package/dist/server/src/lib/hooks/sources/command-code/hooks-config.js +390 -0
  398. package/dist/server/src/lib/hooks/sources/command-code/source.js +290 -0
  399. package/dist/server/src/lib/hooks/sources/command-code/tool-id.js +18 -0
  400. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +604 -0
  401. package/dist/server/src/lib/hooks/sources/index.js +3 -1
  402. package/dist/server/src/lib/hooks/sources/opencode/history.js +57 -3
  403. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +24 -28
  404. package/dist/server/src/lib/hooks/sources/registry.js +4 -0
  405. package/dist/server/src/lib/hooks/sources/turn-body.js +77 -19
  406. package/dist/server/src/lib/hooks/stop-history-capture.js +58 -25
  407. package/dist/server/src/lib/job-executor.js +12 -0
  408. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +6 -0
  409. package/dist/server/src/lib/polling/response-checker.js +112 -7
  410. package/dist/server/src/lib/polling/structured-history-gate.js +15 -8
  411. package/dist/server/src/lib/realtime/types.js +15 -5
  412. package/dist/server/src/lib/response-cleaner.js +24 -1
  413. package/dist/server/src/lib/response-extractor.js +11 -0
  414. package/dist/server/src/lib/session/claude-executor.js +223 -4
  415. package/dist/server/src/lib/session/cli-session.js +52 -0
  416. package/dist/server/src/lib/session/tmux-session-surface.js +525 -0
  417. package/dist/server/src/lib/skills/compatibility-matrix.js +117 -1
  418. package/dist/server/src/lib/tmux/geometry-delegation.js +143 -0
  419. package/dist/server/src/lib/tmux/read-mode-pager.js +76 -10
  420. package/dist/server/src/lib/tmux/read-mode.js +44 -2
  421. package/dist/server/src/lib/tmux/session-hook-scripts.js +249 -0
  422. package/dist/server/src/lib/tmux/session-hooks.js +122 -0
  423. package/dist/server/src/lib/tmux/session-status-options.js +213 -0
  424. package/dist/server/src/lib/tmux/tmux.js +79 -2
  425. package/dist/server/src/lib/version-checker.js +110 -0
  426. package/dist/server/src/lib/ws-server.js +16 -10
  427. package/dist/server/src/types/agent-transcript.js +73 -1
  428. package/dist/server/src/types/terminal-keys.js +131 -3
  429. package/dist/types/terminal-keys.d.ts +100 -3
  430. package/dist/types/terminal-keys.d.ts.map +1 -1
  431. package/dist/types/terminal-keys.js +131 -3
  432. package/package.json +1 -1
  433. package/.next/server/chunks/3099.js +0 -5
  434. package/.next/server/chunks/7824.js +0 -1
  435. package/.next/static/chunks/3916-0e929d089282dc5d.js +0 -1
  436. package/.next/static/chunks/6022-7a7d1760fc9814c7.js +0 -1
  437. package/.next/static/chunks/6381-dbf04a99647f6018.js +0 -1
  438. package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +0 -1
  439. package/.next/static/chunks/app/worktrees/[id]/page-aac399392ec8c273.js +0 -1
  440. package/.next/static/css/23f9c40ecc458c77.css +0 -1
  441. /package/.next/static/{pcpB4K6KreMzu2qbhvuRY → nXW4dPkpE_9xUf_9ySRff}/_buildManifest.js +0 -0
  442. /package/.next/static/{pcpB4K6KreMzu2qbhvuRY → nXW4dPkpE_9xUf_9ySRff}/_ssgManifest.js +0 -0
@@ -15,8 +15,9 @@ exports.getToolStatusDetector = getToolStatusDetector;
15
15
  const detect_1 = require("./antigravity/detect");
16
16
  const detect_2 = require("./claude/detect");
17
17
  const detect_3 = require("./codex/detect");
18
- const detect_4 = require("./copilot/detect");
19
- const detect_5 = require("./opencode/detect");
18
+ const detect_4 = require("./command-code/detect");
19
+ const detect_5 = require("./copilot/detect");
20
+ const detect_6 = require("./opencode/detect");
20
21
  const run_detection_1 = require("./run-detection");
21
22
  const verified_against_1 = require("./verified-against");
22
23
  /**
@@ -38,9 +39,10 @@ const vibeLocalStatusDetector = createGenericStatusDetector('vibe-local');
38
39
  const DETECTORS = {
39
40
  claude: detect_2.claudeStatusDetector,
40
41
  codex: detect_3.codexStatusDetector,
41
- copilot: detect_4.copilotStatusDetector,
42
- opencode: detect_5.opencodeStatusDetector,
42
+ copilot: detect_5.copilotStatusDetector,
43
+ opencode: detect_6.opencodeStatusDetector,
43
44
  antigravity: detect_1.antigravityStatusDetector,
45
+ 'command-code': detect_4.commandCodeStatusDetector,
44
46
  gemini: geminiStatusDetector,
45
47
  'vibe-local': vibeLocalStatusDetector,
46
48
  };
@@ -26,7 +26,7 @@
26
26
  * instead of importing it.
27
27
  */
28
28
  Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
29
+ exports.DETECTOR_VERIFIED_AGAINST = exports.UNMEASURED_VERIFIED_AGAINST = exports.COMMAND_CODE_VERIFIED_AGAINST = exports.ANTIGRAVITY_VERIFIED_AGAINST = exports.OPENCODE_VERIFIED_AGAINST = exports.COPILOT_VERIFIED_AGAINST = exports.CODEX_VERIFIED_AGAINST = exports.CLAUDE_VERIFIED_AGAINST = void 0;
30
30
  /** claude these rules were read off (#1708 / #1927 fixtures). */
31
31
  exports.CLAUDE_VERIFIED_AGAINST = {
32
32
  version: '2.1.240',
@@ -39,10 +39,21 @@ exports.CODEX_VERIFIED_AGAINST = {
39
39
  capturedAt: '2026-08-15',
40
40
  paneGeometry: '200x1000',
41
41
  };
42
- /** copilot-cli these rules were read off (#1885 / #1895 fixtures). */
42
+ /**
43
+ * copilot-cli these rules were read off (#1885 / #1895 / #2269 fixtures).
44
+ *
45
+ * Bumped from 1.0.80 because the frames were RE-CAPTURED and the rules CHANGED:
46
+ * 1.0.82 redrew the composer's fence (`─` rules became a `╻▄` / `╹▀` half-block
47
+ * frame), dropped the `❯` from the composer in favour of the frame's own `┃`
48
+ * edge, boxed the transcript's echoed prompt between two more half-block
49
+ * dividers, and put a file-type badge in front of most tool rows' verbs. The
50
+ * frames are `tests/unit/lib/detection/fixtures/copilot-live-2269/`, captured on
51
+ * a private tmux socket at the production geometry; the 1.0.80 frames stay where
52
+ * they are and the rules still answer for both builds.
53
+ */
43
54
  exports.COPILOT_VERIFIED_AGAINST = {
44
- version: '1.0.80',
45
- capturedAt: '2026-08-21',
55
+ version: '1.0.82',
56
+ capturedAt: '2026-09-04',
46
57
  paneGeometry: '200x1000',
47
58
  };
48
59
  /**
@@ -62,11 +73,50 @@ exports.OPENCODE_VERIFIED_AGAINST = {
62
73
  capturedAt: '2026-08-26',
63
74
  paneGeometry: '80x200',
64
75
  };
65
- /** agy these rules were read off (#988 / #995). */
76
+ /**
77
+ * agy these rules were read off (#988 / #995 footer + selection rules, re-read
78
+ * against the #2270 live panes).
79
+ *
80
+ * Bumped from `0.4.x` / `2026-07-30` / `inline` because the frames were
81
+ * RE-CAPTURED, not because the binary moved: #2270 drove agy 1.1.25 on a private
82
+ * tmux socket at the production geometry and kept both panes inline in
83
+ * `tests/unit/status-detector-selection.test.ts`
84
+ * (`AGY_1125_PERMISSION_PANE`, `AGY_1125_SWITCH_MODEL_PANE`) under the banner
85
+ * `Antigravity CLI 1.1.25`, trailing pane padding included. The
86
+ * `Do you want to proceed?` + `N. label` rules were measured off those frames,
87
+ * and `ANTIGRAVITY_SELECTION_LIST_PATTERN` (#995 / #997) was re-checked against
88
+ * them and left unchanged.
89
+ *
90
+ * `paneGeometry` leaves `inline` because the 1.1.25 permission dialog draws no
91
+ * composer row at all — it reproduces only at the 200x1000 pane the server
92
+ * captures, and a fixture without the ~970 blank padding rows exercises a
93
+ * different `lastLines` slice than production does. That is a statement about
94
+ * the capture condition, not about agy: the scrollback-retained rendering the
95
+ * `afterThinking` footer rules rest on (#988) is unchanged, and the 1.1.25
96
+ * dialog still ends on `esc to cancel`.
97
+ *
98
+ * What this stamp does NOT claim: #2270 captured `waiting` frames only, so the
99
+ * idle (`? for shortcuts`) and generating (spinner) branches are carried over
100
+ * from the 0.4 captures rather than re-measured. A live IDLE 1.1.25 frame is
101
+ * still uncaptured — see the `readIdleEvidence` note in `antigravity/detect.ts`.
102
+ */
66
103
  exports.ANTIGRAVITY_VERIFIED_AGAINST = {
67
- version: '0.4.x',
68
- capturedAt: '2026-07-30',
69
- paneGeometry: 'inline',
104
+ version: '1.1.25',
105
+ capturedAt: '2026-09-04',
106
+ paneGeometry: '200x1000',
107
+ };
108
+ /**
109
+ * Command Code these rules were read off (#2250 fixtures).
110
+ *
111
+ * The frames are `tests/fixtures/command-code-live-2250/`, captured on a private
112
+ * tmux socket at the production geometry — the default pane size does not
113
+ * reproduce the 200-column rules that fence the composer, and the status row
114
+ * drops its `esc to interrupt` tail below 72 columns.
115
+ */
116
+ exports.COMMAND_CODE_VERIFIED_AGAINST = {
117
+ version: '1.40.1',
118
+ capturedAt: '2026-09-03',
119
+ paneGeometry: '200x1000',
70
120
  };
71
121
  /**
72
122
  * The stamp for a tool whose frames nobody has captured yet.
@@ -94,6 +144,7 @@ exports.DETECTOR_VERIFIED_AGAINST = {
94
144
  copilot: exports.COPILOT_VERIFIED_AGAINST,
95
145
  opencode: exports.OPENCODE_VERIFIED_AGAINST,
96
146
  antigravity: exports.ANTIGRAVITY_VERIFIED_AGAINST,
147
+ 'command-code': exports.COMMAND_CODE_VERIFIED_AGAINST,
97
148
  gemini: exports.UNMEASURED_VERIFIED_AGAINST,
98
149
  'vibe-local': exports.UNMEASURED_VERIFIED_AGAINST,
99
150
  };
@@ -124,7 +124,7 @@ function parseCliVersion(output) {
124
124
  return match ? `${match[1]}.${match[2]}.${match[3]}` : null;
125
125
  }
126
126
  /**
127
- * A `verifiedAgainst` stamp written as a minor-series wildcard: `0.4.x`.
127
+ * A `verifiedAgainst` stamp written as a minor-series wildcard: `2.0.x`.
128
128
  *
129
129
  * Only ever applied to the stamp, never to a probe's own output — one side of
130
130
  * this comparison is a string a human typed into a tool module, the other is
@@ -135,11 +135,32 @@ const VERIFIED_AGAINST_WILDCARD_REGEX = /^(\d+)\.(\d+)\.(?:x|\*)$/i;
135
135
  * The comparable form of a `verifiedAgainst` stamp, or null when there is none.
136
136
  *
137
137
  * `'unmeasured'` is null — a tool nobody has captured frames for cannot be
138
- * fresh or stale. `'0.4.x'` becomes `0.4.0`: antigravity's stamp is a minor
139
- * series rather than a build (Issue #995 measured a range), and reading it as
140
- * "no version" would silently exempt the one tool whose rules are furthest
141
- * behind. Widening to `.0` is the safe direction — it can only ever call a
142
- * newer install stale, never call a stale one current.
138
+ * fresh or stale. A minor-series stamp such as `'2.0.x'` becomes `2.0.0`;
139
+ * widening to `.0` is the safe direction, because it can only ever call a newer
140
+ * install stale, never call a stale one current.
141
+ *
142
+ * ## The wildcard branch has no caller in the table today, and stays anyway
143
+ *
144
+ * antigravity's `0.4.x` (Issue #995 measured a range rather than a build) was
145
+ * the only wildcard stamp ever written, and Issue #2292 replaced it with the
146
+ * build #2270 actually read the rules off (`1.1.25`). Re-run the grep that
147
+ * settled it and the branch has zero users:
148
+ *
149
+ * ```
150
+ * $ grep -rnE "version: '[0-9]+\.[0-9]+\.(x|\*)'" src/
151
+ * (no matches)
152
+ * ```
153
+ *
154
+ * It is kept, because deleting it would not delete the FORMAT.
155
+ * `verifiedAgainst` is a hand-written string, and the next person who measures a
156
+ * series rather than a build can still type `2.0.x`. With this branch that
157
+ * stamp compares. Without it {@link parseCliVersion} reads it as null and the
158
+ * tool is filed alongside `'unmeasured'` — never stale, no warning, nothing an
159
+ * operator can act on — which is the same failure #2292 was raised to fix, one
160
+ * level further down. A parser for an input the table still permits is not dead
161
+ * code; the unit exercises it on the format directly rather than through
162
+ * whichever stamp the table happens to hold, so it does not go vacuous now that
163
+ * no tool uses it.
143
164
  */
144
165
  function parseVerifiedAgainstVersion(stamp) {
145
166
  const wildcard = VERIFIED_AGAINST_WILDCARD_REGEX.exec(stamp);
@@ -180,6 +201,7 @@ exports.DETECTOR_VERSION_PROBES = {
180
201
  claude: { kind: 'execFile', command: 'claude', args: ['--version'] },
181
202
  codex: { kind: 'execFile', command: 'codex', args: ['--version'] },
182
203
  antigravity: { kind: 'execFile', command: 'agy', args: ['--version'] },
204
+ 'command-code': { kind: 'execFile', command: 'commandcode', args: ['--version'] },
183
205
  opencode: { kind: 'execFile', command: 'opencode', args: ['--version'] },
184
206
  gemini: { kind: 'execFile', command: 'gemini', args: ['--version'] },
185
207
  copilot: {
@@ -366,12 +366,21 @@ async function captureAntigravityTranscriptTurn(target, capture = {}) {
366
366
  anchored: pending.anchored,
367
367
  });
368
368
  }
369
+ // Every prompt row first, then every reply (Issue #2273). The two passes are
370
+ // what let a reply be dated at its turn's END without overtaking the NEXT
371
+ // turn's prompt: a queued `/send` row is written while this turn is still
372
+ // running, so its instant is only knowable once that row has been recorded.
373
+ // With one turn pending — the ordinary case — this is the single call it
374
+ // always was.
375
+ const userRows = [];
376
+ for (let index = 0; index < pending.turns.length; index += 1) {
377
+ const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
378
+ userRows.push(await recordAntigravityUserTurn(target, pending.turns[index], previousStartedAt));
379
+ }
369
380
  let captured = false;
370
381
  for (let index = 0; index < pending.turns.length; index += 1) {
371
382
  const turn = pending.turns[index];
372
- const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
373
- const userRow = await recordAntigravityUserTurn(target, turn, previousStartedAt);
374
- captured = await writeAntigravityTurn(target, turn, (0, transcript_1.renderAntigravityTurn)(turn), resolveAssistantTimestampMs(turn, userRow), path);
383
+ captured = await writeAntigravityTurn(target, turn, (0, transcript_1.renderAntigravityTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastAntigravityRecordAt(turn), nextTurnOpensAt(pending.turns, userRows, index)), path);
375
384
  }
376
385
  return captured;
377
386
  }
@@ -500,21 +509,73 @@ async function recordAntigravityUserTurn(target, turn, previousStartedAt = 0) {
500
509
  /**
501
510
  * When the assistant row for this turn is dated.
502
511
  *
503
- * The turn's own clock, from the `USER_INPUT` record that opened it, so a row
504
- * written a poll late still sorts where the conversation put it.
512
+ * **The turn's LAST record, not its first (Issue #2273).** #2196 dated the reply
513
+ * one millisecond after the prompt so that `groupMessagesIntoPairs` which
514
+ * orders by timestamp and nothing else — could never put the answer above the
515
+ * question. That is still guaranteed, by `earliest` below, and it is still
516
+ * necessary: agy stamps the prompt and the first reply of a fast turn with the
517
+ * *same second* (measured — `created_at` is second-resolution, and turn 1 of the
518
+ * captured session has `02:12:41Z` on both).
519
+ *
520
+ * What #2196 did not account for is the row that lands BETWEEN the two. A tool
521
+ * approval is written when the dialog appears, seconds into the turn, and the
522
+ * chat surface orders its rows by timestamp: a reply dated at the turn's start
523
+ * therefore draws above an approval that really happened before it. The measured
524
+ * case is in the Issue — prompt `04:49:50.989Z`, reply `04:49:54.000Z`, approval
525
+ * `04:49:57.513Z` — and the reply's own last record is later than all three. So
526
+ * the last record's instant is what the row is dated by: it is the moment the
527
+ * turn actually ended, and everything the turn produced sorts before it.
528
+ *
529
+ * Two bounds keep the move honest:
530
+ *
531
+ * - `earliest` is a floor, never overridden. A turn with no timestamped
532
+ * record (`lastRecordAt === 0`) is dated exactly where #2196 put it.
533
+ * - `nextTurnOpensAt` is a ceiling. The next turn's prompt row may be a `/send`
534
+ * row written while THIS turn was still running — a queued prompt — and a
535
+ * reply that overtook it would be paired with the wrong question.
536
+ *
537
+ * @param lastRecordAt - Epoch ms of the turn's last record, or 0 when unknown
538
+ * @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
539
+ * this is the newest turn in the window
540
+ */
541
+ function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
542
+ const earliest = userRow.timestampMs === null
543
+ ? turn.startedAt
544
+ : Math.max(turn.startedAt, userRow.timestampMs + 1);
545
+ const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
546
+ return Math.max(earliest, Math.min(lastRecordAt, latest));
547
+ }
548
+ /**
549
+ * When the last record agy wrote for this turn was made (Issue #2273).
550
+ *
551
+ * The maximum rather than `records.at(-1)`: `created_at` is agy's own field and
552
+ * a record that carries none reads as null, so the last record in file order is
553
+ * not always the last one with a clock on it.
554
+ *
555
+ * @returns Epoch ms, or 0 when the turn has no timestamped record
556
+ */
557
+ function lastAntigravityRecordAt(turn) {
558
+ let at = 0;
559
+ for (const record of turn.records) {
560
+ if (record.timestampMs !== null && record.timestampMs > at)
561
+ at = record.timestampMs;
562
+ }
563
+ return at;
564
+ }
565
+ /**
566
+ * The instant the next pending turn's prompt row carries, or null (Issue #2273).
505
567
  *
506
- * When there is a user row the reply is moved to the first millisecond after it:
507
- * `groupMessagesIntoPairs` orders by timestamp and nothing else, and agy stamps
508
- * both the prompt and the first reply of a fast turn with the *same second*
509
- * (measured `created_at` is second-resolution, and turn 1 of the captured
510
- * session has `02:12:41Z` on both). A tie is then decided by whichever row the
511
- * database returned first, and the losing arrangement — assistant, then user —
512
- * is exactly the `orphan` pair #2196 exists to remove.
568
+ * The user row's own timestamp when there is one, because that is what History
569
+ * sorts on and it can be EARLIER than the turn's start — an adopted `/send` row
570
+ * was written when CommandMate handed the text to the pane, which for a queued
571
+ * prompt is while the previous turn was still running. The turn's start is the
572
+ * fallback for a turn that produced no row at all.
513
573
  */
514
- function resolveAssistantTimestampMs(turn, userRow) {
515
- if (userRow.timestampMs === null)
516
- return turn.startedAt;
517
- return Math.max(turn.startedAt, userRow.timestampMs + 1);
574
+ function nextTurnOpensAt(turns, userRows, index) {
575
+ const next = turns[index + 1];
576
+ if (!next)
577
+ return null;
578
+ return userRows[index + 1]?.timestampMs ?? next.startedAt;
518
579
  }
519
580
  /**
520
581
  * Write one rendered turn, unless it is already there.
@@ -532,12 +593,31 @@ function resolveAssistantTimestampMs(turn, userRow) {
532
593
  */
533
594
  async function writeAntigravityTurn(target, turn, rendered, timestampMs, path) {
534
595
  const instanceId = target.instanceId ?? target.cliToolId;
596
+ if (!(0, transcript_1.isAntigravityTurnWritable)(turn)) {
597
+ // agy has not finished this answer and no later prompt has taken over, so
598
+ // what is in the file is a turn in progress. Writing it would put a reply
599
+ // with its last paragraph missing into History permanently — the row is
600
+ // keyed on `(conversationId, step_index)`, so every later read finds it and
601
+ // answers "already saved". That is Issue #2264, reported against claude and
602
+ // structurally identical here: a turn cut off after its `tool_calls` renders
603
+ // a *non-empty* body, so the emptiness guard below cannot see it.
604
+ logger.info('antigravity-transcript-turn-open', {
605
+ worktreeId: target.worktreeId,
606
+ instanceId,
607
+ conversationId: rendered.conversationId,
608
+ stepIndex: rendered.stepIndex,
609
+ records: turn.records.length,
610
+ textBlocks: rendered.textBlocks,
611
+ toolBlocks: rendered.toolBlocks,
612
+ });
613
+ return false;
614
+ }
535
615
  if (rendered.body.length === 0) {
536
- // A turn that said nothing yet. Unlike codex there is no `task_complete` to
537
- // tell an unfinished turn from a silent one, so the body is the only
538
- // evidence there is — and answering false is right for both readings: the
539
- // scraper keeps the reply if there was one, and an empty row that would show
540
- // as a blank answer forever is never written.
616
+ // A turn that said nothing. agy has no `task_complete`, so a closed turn
617
+ // that rendered to nothing and an interrupted one look alike here and
618
+ // answering false is right for both readings: the scraper keeps the reply if
619
+ // there was one, and an empty row that would show as a blank answer forever
620
+ // is never written.
541
621
  logger.info('antigravity-transcript-turn-empty', {
542
622
  worktreeId: target.worktreeId,
543
623
  instanceId,
@@ -72,6 +72,8 @@ exports.readAntigravityTranscriptRecord = readAntigravityTranscriptRecord;
72
72
  exports.parseAntigravityTranscript = parseAntigravityTranscript;
73
73
  exports.extractAntigravityUserRequest = extractAntigravityUserRequest;
74
74
  exports.buildAntigravityTurns = buildAntigravityTurns;
75
+ exports.isAntigravityTurnClosingRecord = isAntigravityTurnClosingRecord;
76
+ exports.isAntigravityTurnWritable = isAntigravityTurnWritable;
75
77
  exports.isAntigravityPromptRecord = isAntigravityPromptRecord;
76
78
  exports.renderAntigravityTurn = renderAntigravityTurn;
77
79
  const event_mapper_1 = require("../event-mapper");
@@ -298,6 +300,8 @@ function buildAntigravityTurns(records, conversationId) {
298
300
  ? { stepIndex: record.stepIndex, text, timestampMs: record.timestampMs ?? startedAt }
299
301
  : null,
300
302
  records: [],
303
+ closed: false,
304
+ superseded: false,
301
305
  overflowed: false,
302
306
  });
303
307
  continue;
@@ -307,14 +311,49 @@ function buildAntigravityTurns(records, conversationId) {
307
311
  preludeRecords += 1;
308
312
  continue;
309
313
  }
314
+ // Assigned rather than or-ed, so what survives is the last `MODEL` record's
315
+ // answer. `SYSTEM` records are ignored here for the same reason they render
316
+ // to nothing: agy injected them, they are not agy speaking.
317
+ if (record.source === exports.ANTIGRAVITY_MODEL_SOURCE) {
318
+ turn.closed = isAntigravityTurnClosingRecord(record);
319
+ }
310
320
  if (turn.records.length >= exports.MAX_ANTIGRAVITY_TURN_RECORDS) {
311
321
  turn.overflowed = true;
312
322
  continue;
313
323
  }
314
324
  turn.records.push(record);
315
325
  }
326
+ // Every turn but the last has a later prompt behind it, and a prompt is proof
327
+ // agy moved on. See {@link AntigravityTurnAccumulator.superseded}.
328
+ for (let index = 0; index < turns.length - 1; index += 1) {
329
+ turns[index].superseded = true;
330
+ }
316
331
  return { turns, preludeRecords };
317
332
  }
333
+ /**
334
+ * Whether this `MODEL` record is agy finishing its answer (Issue #2264).
335
+ *
336
+ * See {@link AntigravityTurnAccumulator.closed} for the argument; the emptiness
337
+ * test is the one {@link renderAntigravityTurn} applies to `content`, so a
338
+ * record that renders to nothing cannot be what makes a turn look finished.
339
+ */
340
+ function isAntigravityTurnClosingRecord(record) {
341
+ if (record.source !== exports.ANTIGRAVITY_MODEL_SOURCE)
342
+ return false;
343
+ if (record.type !== exports.ANTIGRAVITY_PLANNER_TYPE)
344
+ return false;
345
+ if (record.toolCalls.length > 0)
346
+ return false;
347
+ return (record.content ?? '').trim().length > 0;
348
+ }
349
+ /**
350
+ * Whether a writer may record this turn (Issue #2264).
351
+ *
352
+ * Either proof that nothing more is coming — agy answered, or it moved on.
353
+ */
354
+ function isAntigravityTurnWritable(turn) {
355
+ return turn.closed || turn.superseded;
356
+ }
318
357
  /** Whether this record is the one the operator's own text arrived on. */
319
358
  function isAntigravityPromptRecord(record) {
320
359
  return record.source === exports.ANTIGRAVITY_USER_SOURCE && record.type === exports.ANTIGRAVITY_USER_TYPE;