commandmate 0.30.2 → 0.31.1

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 +151 -151
  3. package/.next/app-path-routes-manifest.json +25 -25
  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 +11 -11
  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 +25 -25
  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/4802.js +1 -0
  277. package/.next/server/chunks/5017.js +1 -1
  278. package/.next/server/chunks/5043.js +1 -1
  279. package/.next/server/chunks/5164.js +1 -1
  280. package/.next/server/chunks/552.js +2 -2
  281. package/.next/server/chunks/6072.js +1 -1
  282. package/.next/server/chunks/6130.js +1 -1
  283. package/.next/server/chunks/663.js +4 -3
  284. package/.next/server/chunks/6894.js +2 -2
  285. package/.next/server/chunks/7187.js +1 -0
  286. package/.next/server/chunks/7472.js +1 -1
  287. package/.next/server/chunks/{880.js → 7859.js} +6 -6
  288. package/.next/server/chunks/7905.js +1 -1
  289. package/.next/server/chunks/8800.js +2 -2
  290. package/.next/server/chunks/8918.js +7 -0
  291. package/.next/server/chunks/9123.js +2 -2
  292. package/.next/server/chunks/9130.js +4 -4
  293. package/.next/server/chunks/9627.js +1 -1
  294. package/.next/server/chunks/9696.js +1 -1
  295. package/.next/server/chunks/9798.js +1 -1
  296. package/.next/server/middleware-manifest.json +5 -5
  297. package/.next/server/pages/500.html +1 -1
  298. package/.next/server/pages-manifest.json +1 -1
  299. package/.next/server/server-reference-manifest.json +1 -1
  300. package/.next/static/chunks/1783-11c9b4d8a52ebd91.js +1 -0
  301. package/.next/static/chunks/4718-46e1d2f07c8423ba.js +1 -0
  302. package/.next/static/chunks/6022-2fa0b5a82d4ce7b6.js +1 -0
  303. package/.next/static/chunks/{5229-6c89475b61bd2c8b.js → 6170-951b9f5fe6b4b3b5.js} +1 -1
  304. package/.next/static/chunks/app/chat/{page-9aa2011410895b0d.js → page-37d7615d17d7e2a0.js} +1 -1
  305. package/.next/static/chunks/app/layout-4c2f21e3f653ee4c.js +1 -0
  306. package/.next/static/chunks/app/more/{page-333bba1c8bbc9c11.js → page-353a3924e6d7968e.js} +1 -1
  307. package/.next/static/chunks/app/{page-214f7ffa13a0cf10.js → page-c2bf871d953a1d6f.js} +1 -1
  308. package/.next/static/chunks/app/repositories/{page-4951cac905e50224.js → page-7d0f26df0537254c.js} +1 -1
  309. package/.next/static/chunks/app/review/{page-a0899b2d285318c3.js → page-e3f141b2829973e9.js} +1 -1
  310. package/.next/static/chunks/app/sessions/{page-fb36145ec732092a.js → page-53f188ed9ca49e5f.js} +1 -1
  311. package/.next/static/chunks/app/skills/[skillId]/{page-9099e26b60442873.js → page-80569b720aea59cc.js} +1 -1
  312. package/.next/static/chunks/app/skills/installed/{page-182e32368696d824.js → page-dbd2690ad72da95b.js} +1 -1
  313. package/.next/static/chunks/app/skills/{page-d3fdc88239ebe0ab.js → page-dacd36f9c11aa7da.js} +1 -1
  314. package/.next/static/chunks/app/worktrees/[id]/page-64d4ec3051971760.js +1 -0
  315. package/.next/static/css/5c13ea243dfdcb66.css +1 -0
  316. package/.next/trace +13 -13
  317. package/README.md +37 -11
  318. package/dist/cli/commands/attach.d.ts +50 -0
  319. package/dist/cli/commands/attach.d.ts.map +1 -0
  320. package/dist/cli/commands/attach.js +204 -0
  321. package/dist/cli/commands/capture.d.ts.map +1 -1
  322. package/dist/cli/commands/capture.js +114 -0
  323. package/dist/cli/commands/instances.d.ts.map +1 -1
  324. package/dist/cli/commands/instances.js +23 -2
  325. package/dist/cli/commands/ls.d.ts.map +1 -1
  326. package/dist/cli/commands/ls.js +41 -1
  327. package/dist/cli/config/cli-dependencies.d.ts.map +1 -1
  328. package/dist/cli/config/cli-dependencies.js +34 -0
  329. package/dist/cli/program.d.ts.map +1 -1
  330. package/dist/cli/program.js +5 -0
  331. package/dist/cli/types/index.d.ts +36 -0
  332. package/dist/cli/types/index.d.ts.map +1 -1
  333. package/dist/config/tmux-pane-config.d.ts +153 -0
  334. package/dist/config/tmux-pane-config.d.ts.map +1 -0
  335. package/dist/config/tmux-pane-config.js +172 -0
  336. package/dist/lib/cli-tools/session-name.d.ts +44 -0
  337. package/dist/lib/cli-tools/session-name.d.ts.map +1 -0
  338. package/dist/lib/cli-tools/session-name.js +57 -0
  339. package/dist/lib/cli-tools/types.d.ts +1 -1
  340. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  341. package/dist/lib/cli-tools/types.js +6 -1
  342. package/dist/lib/cli-tools/validation.d.ts +34 -0
  343. package/dist/lib/cli-tools/validation.d.ts.map +1 -0
  344. package/dist/lib/cli-tools/validation.js +41 -0
  345. package/dist/lib/detection/status-reason.d.ts +18 -0
  346. package/dist/lib/detection/status-reason.d.ts.map +1 -1
  347. package/dist/lib/detection/status-reason.js +18 -0
  348. package/dist/lib/detection/tools/verified-against.d.ts +57 -7
  349. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  350. package/dist/lib/detection/tools/verified-against.js +59 -8
  351. package/dist/lib/detection/version-probes.d.ts +26 -5
  352. package/dist/lib/detection/version-probes.d.ts.map +1 -1
  353. package/dist/lib/detection/version-probes.js +28 -6
  354. package/dist/lib/session/tmux-session-surface.d.ts +369 -0
  355. package/dist/lib/session/tmux-session-surface.d.ts.map +1 -0
  356. package/dist/lib/session/tmux-session-surface.js +525 -0
  357. package/dist/server/src/config/cli-tool-timing-config.js +12 -1
  358. package/dist/server/src/config/detection-evidence-config.js +5 -0
  359. package/dist/server/src/config/schedule-config.js +28 -1
  360. package/dist/server/src/lib/cli-tools/antigravity.js +2 -2
  361. package/dist/server/src/lib/cli-tools/base.js +13 -8
  362. package/dist/server/src/lib/cli-tools/claude.js +20 -0
  363. package/dist/server/src/lib/cli-tools/codex.js +205 -61
  364. package/dist/server/src/lib/cli-tools/command-code.js +349 -0
  365. package/dist/server/src/lib/cli-tools/composer-spec.js +6 -0
  366. package/dist/server/src/lib/cli-tools/copilot.js +2 -2
  367. package/dist/server/src/lib/cli-tools/gemini.js +2 -2
  368. package/dist/server/src/lib/cli-tools/graceful-exit.js +16 -1
  369. package/dist/server/src/lib/cli-tools/index.js +4 -1
  370. package/dist/server/src/lib/cli-tools/install-hints.js +131 -0
  371. package/dist/server/src/lib/cli-tools/liveness-spec.js +18 -0
  372. package/dist/server/src/lib/cli-tools/manager.js +2 -0
  373. package/dist/server/src/lib/cli-tools/opencode.js +2 -2
  374. package/dist/server/src/lib/cli-tools/start-availability.js +18 -11
  375. package/dist/server/src/lib/cli-tools/types.js +6 -1
  376. package/dist/server/src/lib/cli-tools/vibe-local.js +2 -2
  377. package/dist/server/src/lib/cmate-parser.js +6 -0
  378. package/dist/server/src/lib/detection/cli-patterns.js +441 -8
  379. package/dist/server/src/lib/detection/opencode-modal-overlay.js +66 -100
  380. package/dist/server/src/lib/detection/selection-shape.js +341 -0
  381. package/dist/server/src/lib/detection/sgr-background.js +210 -0
  382. package/dist/server/src/lib/detection/status-detector.js +6 -0
  383. package/dist/server/src/lib/detection/status-reason.js +18 -0
  384. package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -15
  385. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +392 -0
  386. package/dist/server/src/lib/detection/tools/codex/detect.js +83 -2
  387. package/dist/server/src/lib/detection/tools/command-code/detect.js +159 -0
  388. package/dist/server/src/lib/detection/tools/registry.js +6 -4
  389. package/dist/server/src/lib/detection/tools/verified-against.js +59 -8
  390. package/dist/server/src/lib/detection/version-probes.js +28 -6
  391. package/dist/server/src/lib/hooks/sources/antigravity/history.js +77 -16
  392. package/dist/server/src/lib/hooks/sources/claude/history.js +94 -18
  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/job-executor.js +12 -0
  407. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +6 -0
  408. package/dist/server/src/lib/polling/response-checker.js +112 -7
  409. package/dist/server/src/lib/polling/structured-history-gate.js +15 -8
  410. package/dist/server/src/lib/realtime/types.js +15 -5
  411. package/dist/server/src/lib/response-cleaner.js +24 -1
  412. package/dist/server/src/lib/response-extractor.js +11 -0
  413. package/dist/server/src/lib/session/claude-executor.js +223 -4
  414. package/dist/server/src/lib/session/cli-session.js +52 -0
  415. package/dist/server/src/lib/session/tmux-session-surface.js +525 -0
  416. package/dist/server/src/lib/skills/compatibility-matrix.js +117 -1
  417. package/dist/server/src/lib/tmux/geometry-delegation.js +143 -0
  418. package/dist/server/src/lib/tmux/read-mode-pager.js +76 -10
  419. package/dist/server/src/lib/tmux/read-mode.js +44 -2
  420. package/dist/server/src/lib/tmux/session-hook-scripts.js +249 -0
  421. package/dist/server/src/lib/tmux/session-hooks.js +122 -0
  422. package/dist/server/src/lib/tmux/session-status-options.js +213 -0
  423. package/dist/server/src/lib/tmux/tmux.js +79 -2
  424. package/dist/server/src/lib/version-checker.js +110 -0
  425. package/dist/server/src/lib/ws-server.js +16 -10
  426. package/dist/server/src/types/agent-transcript.js +73 -1
  427. package/dist/server/src/types/terminal-keys.js +131 -3
  428. package/dist/types/terminal-keys.d.ts +100 -3
  429. package/dist/types/terminal-keys.d.ts.map +1 -1
  430. package/dist/types/terminal-keys.js +131 -3
  431. package/package.json +1 -1
  432. package/.next/server/chunks/3099.js +0 -5
  433. package/.next/server/chunks/7824.js +0 -1
  434. package/.next/server/chunks/848.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-147dde2a967e9458.js +0 -1
  438. package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +0 -1
  439. package/.next/static/chunks/app/worktrees/[id]/page-2f73d69187936627.js +0 -1
  440. package/.next/static/css/23f9c40ecc458c77.css +0 -1
  441. /package/.next/static/{QXxQbXWoo7ldUyOcv7PCZ → 60mm4_QBuFtFTfo5UMyKU}/_buildManifest.js +0 -0
  442. /package/.next/static/{QXxQbXWoo7ldUyOcv7PCZ → 60mm4_QBuFtFTfo5UMyKU}/_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.
505
554
  *
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.
555
+ * @returns Epoch ms, or 0 when the turn has no timestamped record
513
556
  */
514
- function resolveAssistantTimestampMs(turn, userRow) {
515
- if (userRow.timestampMs === null)
516
- return turn.startedAt;
517
- return Math.max(turn.startedAt, userRow.timestampMs + 1);
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).
567
+ *
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.
573
+ */
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.
@@ -358,12 +358,23 @@ async function captureClaudeTranscriptTurn(target, capture) {
358
358
  // by timestamp, and each turn's `/send` row is adopted against the previous
359
359
  // turn's start, so a later turn must not get to claim a row an earlier one
360
360
  // is about to ask for.
361
+ //
362
+ // Every prompt row is recorded before any reply is written (Issue #2273).
363
+ // That is what lets a reply be dated at its turn's END without overtaking
364
+ // the NEXT turn's prompt: a queued `/send` row is written while this turn is
365
+ // still running, so its instant is only knowable once that row has been
366
+ // recorded. With one turn pending — the ordinary case — this is the single
367
+ // call it always was.
368
+ const userRows = [];
369
+ for (let index = 0; index < pending.turns.length; index += 1) {
370
+ const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
371
+ userRows.push(await recordClaudeUserTurn(target, pending.turns[index], previousStartedAt));
372
+ }
373
+ const lastRecordAt = lastClaudeAssistantRecordAt(parsed.records);
361
374
  let captured = false;
362
375
  for (let index = 0; index < pending.turns.length; index += 1) {
363
376
  const turn = pending.turns[index];
364
- const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
365
- const userRow = await recordClaudeUserTurn(target, turn, previousStartedAt);
366
- captured = await writeClaudeTurn(target, turn, (0, transcript_1.renderClaudeTurn)(turn), resolveAssistantTimestampMs(turn, userRow), path);
377
+ captured = await writeClaudeTurn(target, turn, (0, transcript_1.renderClaudeTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.promptUuid) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), path);
367
378
  }
368
379
  return captured;
369
380
  }
@@ -643,22 +654,87 @@ async function recordClaudeUserTurn(target, turn, previousStartedAt = 0) {
643
654
  /**
644
655
  * When the assistant row for this turn is dated.
645
656
  *
646
- * #2121 dated it by the prompt record's clock so that a row written a poll late
647
- * still sorts where the conversation put it, and that is still what happens for
648
- * every turn that produced no user row.
649
- *
650
- * When there *is* a user row, it sits on that same instant — both come from the
651
- * one prompt record and `groupMessagesIntoPairs` orders by timestamp and
652
- * nothing else. A tie there is decided by whichever row the database happened to
653
- * return first, and the losing arrangement (assistant, then user) is exactly the
654
- * `orphan` pair this Issue exists to remove. So the reply is moved to the first
655
- * millisecond after the prompt: the smallest change that makes the order a
656
- * property of the data rather than of the query plan.
657
+ * **The turn's LAST assistant record, not its prompt (Issue #2273).** #2121
658
+ * dated the reply by the prompt record's clock so that a row written a poll late
659
+ * still sorted where the conversation put it, and #2196 moved it one millisecond
660
+ * on so that `groupMessagesIntoPairs` — which orders by timestamp and nothing
661
+ * else could never return the answer above the question. Both properties
662
+ * survive: `earliest` is a floor this never goes under.
663
+ *
664
+ * What neither accounted for is the row that lands BETWEEN the prompt and the
665
+ * reply. A tool approval is written when the dialog appears, seconds into the
666
+ * turn, and the chat surface orders its rows by timestamp so a reply dated at
667
+ * the turn's start draws ABOVE an approval that really happened before it. The
668
+ * measured case is in the Issue: prompt `04:49:50.989Z`, reply `04:49:54.000Z`,
669
+ * approval `04:49:57.513Z`, rendered as question → answer → approval.
670
+ *
671
+ * The turn's last assistant record is the moment the reply was finished, so
672
+ * everything the turn produced on the way sorts before it. `lastRecordAt` is 0
673
+ * when the window held no timestamped assistant record for the turn, and the row
674
+ * is then dated exactly where #2196 put it.
675
+ *
676
+ * `nextTurnOpensAt` is the ceiling. The next turn's prompt row may be a `/send`
677
+ * row written while THIS turn was still running — a queued prompt — and a reply
678
+ * that overtook it would be paired with the wrong question.
679
+ *
680
+ * @param lastRecordAt - Epoch ms of the turn's last assistant record, or 0
681
+ * @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
682
+ * this is the newest turn in the window
683
+ */
684
+ function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
685
+ const earliest = userRow.timestampMs === null
686
+ ? turn.startedAt
687
+ : Math.max(turn.startedAt, userRow.timestampMs + 1);
688
+ const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
689
+ return Math.max(earliest, Math.min(lastRecordAt, latest));
690
+ }
691
+ /**
692
+ * When each turn's last assistant record was written (Issue #2273).
693
+ *
694
+ * Keyed by `promptUuid`, which is the turn key {@link buildClaudeTurns} uses, and
695
+ * walked over the same records with the same two rules — sidechains skipped, a
696
+ * prompt record opening a turn — so the two passes cannot disagree about which
697
+ * turn a record belongs to. It is a second pass rather than a field on the
698
+ * accumulator because `./transcript` is not this Issue's to change.
699
+ *
700
+ * Only `assistant` records count. A turn's `user` records are its tool RESULTS,
701
+ * and the last of those is a step the agent took before it had finished
702
+ * answering; the reply is dated by the agent's last word.
703
+ *
704
+ * @returns `promptUuid` → epoch ms; absent for a turn with no timestamped
705
+ * assistant record
657
706
  */
658
- function resolveAssistantTimestampMs(turn, userRow) {
659
- if (userRow.timestampMs === null)
660
- return turn.startedAt;
661
- return Math.max(turn.startedAt, userRow.timestampMs + 1);
707
+ function lastClaudeAssistantRecordAt(records) {
708
+ const at = new Map();
709
+ let key = null;
710
+ for (const record of records) {
711
+ if (record.isSidechain)
712
+ continue;
713
+ if ((0, transcript_1.isClaudePromptRecord)(record)) {
714
+ key = record.uuid;
715
+ continue;
716
+ }
717
+ if (record.type !== 'assistant' || key === null || record.timestampMs === null)
718
+ continue;
719
+ if (record.timestampMs > (at.get(key) ?? 0))
720
+ at.set(key, record.timestampMs);
721
+ }
722
+ return at;
723
+ }
724
+ /**
725
+ * The instant the next pending turn's prompt row carries, or null (Issue #2273).
726
+ *
727
+ * The user row's own timestamp when there is one, because that is what History
728
+ * sorts on and it can be EARLIER than the turn's start — an adopted `/send` row
729
+ * was written when CommandMate handed the text to the pane, which for a queued
730
+ * prompt is while the previous turn was still running. The turn's start is the
731
+ * fallback for a turn that produced no row at all.
732
+ */
733
+ function nextTurnOpensAt(turns, userRows, index) {
734
+ const next = turns[index + 1];
735
+ if (!next)
736
+ return null;
737
+ return userRows[index + 1]?.timestampMs ?? next.startedAt;
662
738
  }
663
739
  /**
664
740
  * The transcript file for this instance, or null.
@@ -400,12 +400,22 @@ async function captureCodexTranscriptTurn(target, capture = {}) {
400
400
  anchored: pending.anchored,
401
401
  });
402
402
  }
403
+ // Every prompt row first, then every reply (Issue #2273). The two passes are
404
+ // what let a reply be dated at its turn's END without overtaking the NEXT
405
+ // turn's prompt: a queued `/send` row is written while this turn is still
406
+ // running, so its instant is only knowable once that row has been recorded.
407
+ // With one turn pending — the ordinary case — this is the single call it
408
+ // always was.
409
+ const userRows = [];
410
+ for (let index = 0; index < pending.turns.length; index += 1) {
411
+ const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
412
+ userRows.push(await recordCodexUserTurns(target, pending.turns[index], previousStartedAt));
413
+ }
414
+ const lastRecordAt = lastCodexRecordAt(parsed.records);
403
415
  let captured = false;
404
416
  for (let index = 0; index < pending.turns.length; index += 1) {
405
417
  const turn = pending.turns[index];
406
- const previousStartedAt = index === 0 ? pending.previousStartedAt : pending.turns[index - 1].startedAt;
407
- const lastUserRow = await recordCodexUserTurns(target, turn, previousStartedAt);
408
- captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), resolveAssistantTimestampMs(turn, lastUserRow), path);
418
+ captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.turnId) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), path);
409
419
  }
410
420
  return captured;
411
421
  }
@@ -544,20 +554,79 @@ async function recordCodexUserTurns(target, turn, previousStartedAt = 0) {
544
554
  /**
545
555
  * When the assistant row for this turn is dated.
546
556
  *
547
- * The turn's own clock, from the first record bearing its `turn_id`, so a row
548
- * written a poll late still sorts where the conversation put it.
557
+ * **The turn's LAST record, not its first (Issue #2273).** #2197 dated the reply
558
+ * by the first record bearing the `turn_id` so that a row written a poll late
559
+ * still sorted where the conversation put it, and #2196 moved it one millisecond
560
+ * past the last prompt so that `groupMessagesIntoPairs` — which orders by
561
+ * timestamp and nothing else — could never return the answer above the question.
562
+ * Both properties survive: `earliest` is a floor this never goes under, and for
563
+ * codex it is the floor that matters most, because a turn can carry SEVERAL
564
+ * prompts (measured at more than one on 23 of 326 archived turns) and the reply
565
+ * has to sort past all of them.
566
+ *
567
+ * What neither accounted for is the row that lands BETWEEN the prompt and the
568
+ * reply. A tool approval is written when the dialog appears, seconds into the
569
+ * turn, and the chat surface orders its rows by timestamp — so a reply dated at
570
+ * the turn's start draws ABOVE an approval that really happened before it. The
571
+ * turn's last record — for codex, the `task_complete` that closes it — is the
572
+ * moment the turn ended, so everything it produced on the way sorts before it.
573
+ *
574
+ * `nextTurnOpensAt` is the ceiling. The next turn's prompt row may be a `/send`
575
+ * row written while THIS turn was still running — a queued prompt — and a reply
576
+ * that overtook it would be paired with the wrong question.
577
+ *
578
+ * @param lastRecordAt - Epoch ms of the turn's last record, or 0 when unknown
579
+ * @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
580
+ * this is the newest turn in the window
581
+ */
582
+ function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
583
+ const earliest = userRow.timestampMs === null
584
+ ? turn.startedAt
585
+ : Math.max(turn.startedAt, userRow.timestampMs + 1);
586
+ const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
587
+ return Math.max(earliest, Math.min(lastRecordAt, latest));
588
+ }
589
+ /**
590
+ * When each turn's last record was written (Issue #2273).
591
+ *
592
+ * Keyed by `turn_id` and walked over the same records {@link buildCodexTurns}
593
+ * walks, with the same `response_item` exclusion — that stream is codex's
594
+ * duplicate of the same events and counting it would be counting each record
595
+ * twice. It is a second pass rather than a field on the accumulator because
596
+ * `./transcript` is not this Issue's to change.
597
+ *
598
+ * Every record of the turn counts, `task_complete` included: that one IS the
599
+ * turn's end and is exactly the instant the reply should be dated by.
549
600
  *
550
- * When there is a user row it sits on the same instant or later, and
551
- * `groupMessagesIntoPairs` orders by timestamp and nothing else — a tie there is
552
- * decided by whichever row the database returned first, and the losing
553
- * arrangement (assistant, then user) is exactly the `orphan` pair #2196 exists
554
- * to remove. So the reply is moved to the first millisecond after the last
555
- * prompt: the smallest change that makes the order a property of the data.
601
+ * @returns `turn_id` epoch ms; absent for a turn with no timestamped record
556
602
  */
557
- function resolveAssistantTimestampMs(turn, userRow) {
558
- if (userRow.timestampMs === null)
559
- return turn.startedAt;
560
- return Math.max(turn.startedAt, userRow.timestampMs + 1);
603
+ function lastCodexRecordAt(records) {
604
+ const at = new Map();
605
+ for (const record of records) {
606
+ if (record.type === 'response_item')
607
+ continue;
608
+ const turnId = record.turnId;
609
+ if (!turnId || record.timestampMs === null)
610
+ continue;
611
+ if (record.timestampMs > (at.get(turnId) ?? 0))
612
+ at.set(turnId, record.timestampMs);
613
+ }
614
+ return at;
615
+ }
616
+ /**
617
+ * The instant the next pending turn's prompt row carries, or null (Issue #2273).
618
+ *
619
+ * The user row's own timestamp when there is one, because that is what History
620
+ * sorts on and it can be EARLIER than the turn's start — an adopted `/send` row
621
+ * was written when CommandMate handed the text to the pane, which for a queued
622
+ * prompt is while the previous turn was still running. The turn's start is the
623
+ * fallback for a turn that produced no row at all.
624
+ */
625
+ function nextTurnOpensAt(turns, userRows, index) {
626
+ const next = turns[index + 1];
627
+ if (!next)
628
+ return null;
629
+ return userRows[index + 1]?.timestampMs ?? next.startedAt;
561
630
  }
562
631
  /**
563
632
  * Write one rendered turn, unless it is already there.