commandmate 0.39.1 → 0.40.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 (599) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +249 -242
  3. package/.next/app-path-routes-manifest.json +25 -24
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update-check/route.js +1 -1
  14. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/capabilities/route.js +1 -1
  19. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  28. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  30. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  31. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  40. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  42. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  46. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  47. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/clone/route.js +1 -1
  49. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  50. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/restore/route.js +1 -1
  53. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/route.js +1 -1
  56. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  57. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/repositories/scan/route.js +1 -1
  59. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  60. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/repositories/sync/route.js +1 -1
  62. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  63. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  66. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  67. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  84. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  87. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  90. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +2 -2
  94. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  95. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  98. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -0
  100. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -0
  101. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -0
  102. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  131. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  134. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  137. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  149. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  165. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/route.js +1 -1
  201. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  204. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  206. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  207. package/.next/server/app/page_client-reference-manifest.js +1 -1
  208. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  210. package/.next/server/app/review/page.js +1 -1
  211. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  212. package/.next/server/app/sessions/page.js +1 -1
  213. package/.next/server/app/sessions/page.js.nft.json +1 -1
  214. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  218. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/worktrees/[id]/page.js +10 -10
  220. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  221. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  223. package/.next/server/app-paths-manifest.json +25 -24
  224. package/.next/server/chunks/2119.js +1 -1
  225. package/.next/server/chunks/2445.js +1 -1
  226. package/.next/server/chunks/252.js +1 -0
  227. package/.next/server/chunks/2816.js +1 -1
  228. package/.next/server/chunks/3241.js +1 -1
  229. package/.next/server/chunks/3323.js +1 -1
  230. package/.next/server/chunks/4443.js +1 -1
  231. package/.next/server/chunks/5164.js +1 -1
  232. package/.next/server/chunks/6130.js +1 -1
  233. package/.next/server/chunks/650.js +1 -1
  234. package/.next/server/chunks/6661.js +1 -1
  235. package/.next/server/chunks/6793.js +1 -1
  236. package/.next/server/chunks/7685.js +1 -1
  237. package/.next/server/chunks/7905.js +1 -1
  238. package/.next/server/chunks/8581.js +29 -29
  239. package/.next/server/chunks/8673.js +14 -0
  240. package/.next/server/chunks/8728.js +4 -3
  241. package/.next/server/chunks/8800.js +1 -1
  242. package/.next/server/chunks/9080.js +1 -1
  243. package/.next/server/chunks/9731.js +2 -2
  244. package/.next/server/chunks/9882.js +3 -3
  245. package/.next/server/middleware-manifest.json +5 -5
  246. package/.next/server/pages/500.html +1 -1
  247. package/.next/server/server-reference-manifest.json +1 -1
  248. package/.next/static/chunks/{2407-9ac8b6188ddbb119.js → 2407-d750620d0511e94f.js} +1 -1
  249. package/.next/static/chunks/4768-979c8a03bed218e7.js +1 -0
  250. package/.next/static/chunks/7705-25076b57224da370.js +1 -0
  251. package/.next/static/chunks/8606-9a381b996f9b6834.js +1 -0
  252. package/.next/static/chunks/9619-22adf5367c4b7080.js +1 -0
  253. package/.next/static/chunks/app/api/agents/update/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  254. package/.next/static/chunks/app/api/agents/versions/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  255. package/.next/static/chunks/app/api/app/release-notes/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  256. package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +1 -0
  257. package/.next/static/chunks/app/api/app/update-check/{route-70779af8b4c8259a.js → route-0468c3c4baa46028.js} +1 -1
  258. package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +1 -0
  259. package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +1 -0
  260. package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +1 -0
  261. package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +1 -0
  262. package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +1 -0
  263. package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +1 -0
  264. package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +1 -0
  265. package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +1 -0
  266. package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +1 -0
  267. package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +1 -0
  268. package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +1 -0
  269. package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +1 -0
  270. package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +1 -0
  271. package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +1 -0
  272. package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +1 -0
  273. package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +1 -0
  274. package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +1 -0
  275. package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +1 -0
  276. package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +1 -0
  277. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +1 -0
  278. package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +1 -0
  279. package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +1 -0
  280. package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +1 -0
  281. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +1 -0
  282. package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +1 -0
  283. package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +1 -0
  284. package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +1 -0
  285. package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +1 -0
  286. package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +1 -0
  287. package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +1 -0
  288. package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +1 -0
  289. package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +1 -0
  290. package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +1 -0
  291. package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +1 -0
  292. package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +1 -0
  293. package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +1 -0
  294. package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +1 -0
  295. package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +1 -0
  296. package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +1 -0
  297. package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +1 -0
  298. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +1 -0
  299. package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +1 -0
  300. package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +1 -0
  301. package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +1 -0
  302. package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +1 -0
  303. package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +1 -0
  304. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +1 -0
  305. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +1 -0
  306. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +1 -0
  307. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +1 -0
  308. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +1 -0
  309. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +1 -0
  310. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +1 -0
  311. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +1 -0
  312. package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +1 -0
  313. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +1 -0
  314. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +1 -0
  315. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +1 -0
  316. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +1 -0
  317. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +1 -0
  318. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +1 -0
  319. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +1 -0
  320. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +1 -0
  321. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +1 -0
  322. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +1 -0
  323. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +1 -0
  324. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +1 -0
  325. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +1 -0
  326. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +1 -0
  327. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +1 -0
  328. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +1 -0
  329. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +1 -0
  330. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +1 -0
  331. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +1 -0
  332. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +1 -0
  333. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +1 -0
  334. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +1 -0
  335. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +1 -0
  336. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +1 -0
  337. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +1 -0
  338. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +1 -0
  339. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +1 -0
  340. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +1 -0
  341. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +1 -0
  342. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +1 -0
  343. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +1 -0
  344. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +1 -0
  345. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +1 -0
  346. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +1 -0
  347. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +1 -0
  348. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +1 -0
  388. package/.next/static/chunks/app/layout-3d3fcc8aac7b3bb5.js +1 -0
  389. package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +1 -0
  390. package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +1 -0
  391. package/.next/static/chunks/app/review/page-30616daa1dc595c2.js +1 -0
  392. package/.next/static/chunks/app/sessions/page-1a8ba152bbcb9efb.js +1 -0
  393. package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +1 -0
  394. package/.next/static/chunks/app/worktrees/[id]/page-a91e812ad9d94697.js +1 -0
  395. package/.next/static/css/974314e796232f53.css +1 -0
  396. package/.next/trace +13 -13
  397. package/.next/types/app/api/worktrees/[id]/direct-input/route.ts +347 -0
  398. package/.next/types/routes.d.ts +2 -1
  399. package/.next/types/validator.ts +9 -0
  400. package/dist/cli/commands/ls.d.ts.map +1 -1
  401. package/dist/cli/commands/ls.js +9 -0
  402. package/dist/cli/commands/peers.d.ts.map +1 -1
  403. package/dist/cli/commands/peers.js +4 -0
  404. package/dist/cli/commands/send.d.ts.map +1 -1
  405. package/dist/cli/commands/send.js +20 -6
  406. package/dist/cli/config/model-validation.d.ts +22 -0
  407. package/dist/cli/config/model-validation.d.ts.map +1 -1
  408. package/dist/cli/config/model-validation.js +35 -1
  409. package/dist/cli/types/api-responses.d.ts +11 -0
  410. package/dist/cli/types/api-responses.d.ts.map +1 -1
  411. package/dist/lib/detection/status-reason.d.ts +13 -0
  412. package/dist/lib/detection/status-reason.d.ts.map +1 -1
  413. package/dist/lib/detection/status-reason.js +13 -0
  414. package/dist/lib/detection/tools/verified-against.d.ts +74 -5
  415. package/dist/lib/detection/tools/verified-against.d.ts.map +1 -1
  416. package/dist/lib/detection/tools/verified-against.js +74 -5
  417. package/dist/server/locales/en/worktree.json +58 -0
  418. package/dist/server/locales/ja/worktree.json +58 -0
  419. package/dist/server/src/config/claude-constants.js +27 -0
  420. package/dist/server/src/lib/cli-tools/base.js +2 -1
  421. package/dist/server/src/lib/cli-tools/claude.js +5 -1
  422. package/dist/server/src/lib/cli-tools/command-code.js +5 -1
  423. package/dist/server/src/lib/cli-tools/direct-input.js +22 -0
  424. package/dist/server/src/lib/cmate-cli-tool-parser.js +31 -0
  425. package/dist/server/src/lib/detection/cli-patterns.js +44 -5
  426. package/dist/server/src/lib/detection/model-info-extractor.js +49 -10
  427. package/dist/server/src/lib/detection/selection-shape.js +274 -19
  428. package/dist/server/src/lib/detection/status-detector.js +2 -0
  429. package/dist/server/src/lib/detection/status-reason.js +13 -0
  430. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +67 -27
  431. package/dist/server/src/lib/detection/tools/codex/detect.js +18 -3
  432. package/dist/server/src/lib/detection/tools/command-code/detect.js +46 -0
  433. package/dist/server/src/lib/detection/tools/command-code/dialog.js +116 -25
  434. package/dist/server/src/lib/detection/tools/verified-against.js +74 -5
  435. package/dist/server/src/lib/detection/tui-detection-frame.js +18 -3
  436. package/dist/server/src/lib/polling/auto-yes-resolver.js +8 -0
  437. package/dist/server/src/lib/prompt-answer-sender.js +255 -1
  438. package/dist/server/src/lib/realtime-snippet.js +53 -0
  439. package/dist/server/src/lib/session/agent-event-state.js +8 -1
  440. package/dist/server/src/lib/session/claude-session.js +19 -2
  441. package/dist/server/src/lib/session/current-output-builder.js +4 -1
  442. package/dist/server/src/lib/session/status-mapping.js +58 -8
  443. package/dist/server/src/lib/tmux/key-sequence.js +27 -1
  444. package/dist/server/src/lib/tmux/tmux-control-client.js +26 -3
  445. package/dist/server/src/lib/tmux/tmux.js +64 -3
  446. package/dist/server/src/types/direct-input.js +113 -0
  447. package/dist/server/src/types/sidebar.js +67 -7
  448. package/dist/server/src/types/terminal-keys.js +33 -1
  449. package/dist/types/terminal-keys.d.ts +28 -1
  450. package/dist/types/terminal-keys.d.ts.map +1 -1
  451. package/dist/types/terminal-keys.js +33 -1
  452. package/package.json +1 -1
  453. package/release-notes/0.40.0.json +69 -0
  454. package/release-notes/0.40.1.json +20 -0
  455. package/.next/server/chunks/6092.js +0 -14
  456. package/.next/static/chunks/4768-0ad5eb716bed5de9.js +0 -1
  457. package/.next/static/chunks/8606-e893c1dab6fb81bc.js +0 -1
  458. package/.next/static/chunks/9619-7bc0e9524f0773b5.js +0 -1
  459. package/.next/static/chunks/982-edf98d9d54c5ce9b.js +0 -1
  460. package/.next/static/chunks/app/api/app/update/route-70779af8b4c8259a.js +0 -1
  461. package/.next/static/chunks/app/api/auth/login/route-70779af8b4c8259a.js +0 -1
  462. package/.next/static/chunks/app/api/auth/logout/route-70779af8b4c8259a.js +0 -1
  463. package/.next/static/chunks/app/api/auth/status/route-70779af8b4c8259a.js +0 -1
  464. package/.next/static/chunks/app/api/capabilities/route-70779af8b4c8259a.js +0 -1
  465. package/.next/static/chunks/app/api/daily-summary/route-70779af8b4c8259a.js +0 -1
  466. package/.next/static/chunks/app/api/daily-summary/status/route-70779af8b4c8259a.js +0 -1
  467. package/.next/static/chunks/app/api/external-apps/[id]/health/route-70779af8b4c8259a.js +0 -1
  468. package/.next/static/chunks/app/api/external-apps/[id]/route-70779af8b4c8259a.js +0 -1
  469. package/.next/static/chunks/app/api/external-apps/route-70779af8b4c8259a.js +0 -1
  470. package/.next/static/chunks/app/api/fs/browse/route-70779af8b4c8259a.js +0 -1
  471. package/.next/static/chunks/app/api/fs/recent-paths/route-70779af8b4c8259a.js +0 -1
  472. package/.next/static/chunks/app/api/hooks/agent-event/route-70779af8b4c8259a.js +0 -1
  473. package/.next/static/chunks/app/api/hooks/claude-done/route-70779af8b4c8259a.js +0 -1
  474. package/.next/static/chunks/app/api/hooks/permission-request/route-70779af8b4c8259a.js +0 -1
  475. package/.next/static/chunks/app/api/metrics/vibe/route-70779af8b4c8259a.js +0 -1
  476. package/.next/static/chunks/app/api/ollama/models/route-70779af8b4c8259a.js +0 -1
  477. package/.next/static/chunks/app/api/push/escalation/route-70779af8b4c8259a.js +0 -1
  478. package/.next/static/chunks/app/api/push/subscriptions/route-70779af8b4c8259a.js +0 -1
  479. package/.next/static/chunks/app/api/push/vapid/route-70779af8b4c8259a.js +0 -1
  480. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-70779af8b4c8259a.js +0 -1
  481. package/.next/static/chunks/app/api/relays/route-70779af8b4c8259a.js +0 -1
  482. package/.next/static/chunks/app/api/remote/pair/route-70779af8b4c8259a.js +0 -1
  483. package/.next/static/chunks/app/api/repositories/[id]/route-70779af8b4c8259a.js +0 -1
  484. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-70779af8b4c8259a.js +0 -1
  485. package/.next/static/chunks/app/api/repositories/clone/route-70779af8b4c8259a.js +0 -1
  486. package/.next/static/chunks/app/api/repositories/excluded/route-70779af8b4c8259a.js +0 -1
  487. package/.next/static/chunks/app/api/repositories/restore/route-70779af8b4c8259a.js +0 -1
  488. package/.next/static/chunks/app/api/repositories/route-70779af8b4c8259a.js +0 -1
  489. package/.next/static/chunks/app/api/repositories/scan/route-70779af8b4c8259a.js +0 -1
  490. package/.next/static/chunks/app/api/repositories/sync/route-70779af8b4c8259a.js +0 -1
  491. package/.next/static/chunks/app/api/repositories/validate-path/route-70779af8b4c8259a.js +0 -1
  492. package/.next/static/chunks/app/api/settings/default-agents/route-70779af8b4c8259a.js +0 -1
  493. package/.next/static/chunks/app/api/settings/default-surface-mode/route-70779af8b4c8259a.js +0 -1
  494. package/.next/static/chunks/app/api/sidebar/group-order/route-70779af8b4c8259a.js +0 -1
  495. package/.next/static/chunks/app/api/skills/[id]/route-70779af8b4c8259a.js +0 -1
  496. package/.next/static/chunks/app/api/skills/installations/route-70779af8b4c8259a.js +0 -1
  497. package/.next/static/chunks/app/api/skills/operations/route-70779af8b4c8259a.js +0 -1
  498. package/.next/static/chunks/app/api/skills/reindex/route-70779af8b4c8259a.js +0 -1
  499. package/.next/static/chunks/app/api/skills/route-70779af8b4c8259a.js +0 -1
  500. package/.next/static/chunks/app/api/slash-commands/route-70779af8b4c8259a.js +0 -1
  501. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-70779af8b4c8259a.js +0 -1
  502. package/.next/static/chunks/app/api/tasks/[taskId]/route-70779af8b4c8259a.js +0 -1
  503. package/.next/static/chunks/app/api/templates/[id]/route-70779af8b4c8259a.js +0 -1
  504. package/.next/static/chunks/app/api/templates/route-70779af8b4c8259a.js +0 -1
  505. package/.next/static/chunks/app/api/verification/runs/[runId]/route-70779af8b4c8259a.js +0 -1
  506. package/.next/static/chunks/app/api/verification/runs/route-70779af8b4c8259a.js +0 -1
  507. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-70779af8b4c8259a.js +0 -1
  508. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-70779af8b4c8259a.js +0 -1
  509. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-70779af8b4c8259a.js +0 -1
  510. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-70779af8b4c8259a.js +0 -1
  511. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-70779af8b4c8259a.js +0 -1
  512. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-70779af8b4c8259a.js +0 -1
  513. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-70779af8b4c8259a.js +0 -1
  514. package/.next/static/chunks/app/api/worktrees/[id]/env/route-70779af8b4c8259a.js +0 -1
  515. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-70779af8b4c8259a.js +0 -1
  516. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-70779af8b4c8259a.js +0 -1
  517. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-70779af8b4c8259a.js +0 -1
  518. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-70779af8b4c8259a.js +0 -1
  519. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-70779af8b4c8259a.js +0 -1
  520. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-70779af8b4c8259a.js +0 -1
  521. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-70779af8b4c8259a.js +0 -1
  522. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-70779af8b4c8259a.js +0 -1
  523. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-70779af8b4c8259a.js +0 -1
  524. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-70779af8b4c8259a.js +0 -1
  525. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-70779af8b4c8259a.js +0 -1
  526. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-70779af8b4c8259a.js +0 -1
  527. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-70779af8b4c8259a.js +0 -1
  528. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-70779af8b4c8259a.js +0 -1
  529. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-70779af8b4c8259a.js +0 -1
  530. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-70779af8b4c8259a.js +0 -1
  531. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-70779af8b4c8259a.js +0 -1
  532. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-70779af8b4c8259a.js +0 -1
  533. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-70779af8b4c8259a.js +0 -1
  534. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-70779af8b4c8259a.js +0 -1
  535. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-70779af8b4c8259a.js +0 -1
  536. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-70779af8b4c8259a.js +0 -1
  537. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-70779af8b4c8259a.js +0 -1
  538. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-70779af8b4c8259a.js +0 -1
  539. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-70779af8b4c8259a.js +0 -1
  540. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-70779af8b4c8259a.js +0 -1
  541. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-70779af8b4c8259a.js +0 -1
  542. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-70779af8b4c8259a.js +0 -1
  543. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-70779af8b4c8259a.js +0 -1
  544. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-70779af8b4c8259a.js +0 -1
  545. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-70779af8b4c8259a.js +0 -1
  546. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-70779af8b4c8259a.js +0 -1
  547. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-70779af8b4c8259a.js +0 -1
  548. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-70779af8b4c8259a.js +0 -1
  549. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-70779af8b4c8259a.js +0 -1
  550. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-70779af8b4c8259a.js +0 -1
  551. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-70779af8b4c8259a.js +0 -1
  552. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-70779af8b4c8259a.js +0 -1
  553. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-70779af8b4c8259a.js +0 -1
  554. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-70779af8b4c8259a.js +0 -1
  555. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-70779af8b4c8259a.js +0 -1
  556. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-70779af8b4c8259a.js +0 -1
  557. package/.next/static/chunks/app/api/worktrees/[id]/route-70779af8b4c8259a.js +0 -1
  558. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-70779af8b4c8259a.js +0 -1
  559. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-70779af8b4c8259a.js +0 -1
  560. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-70779af8b4c8259a.js +0 -1
  561. package/.next/static/chunks/app/api/worktrees/[id]/search/route-70779af8b4c8259a.js +0 -1
  562. package/.next/static/chunks/app/api/worktrees/[id]/send/route-70779af8b4c8259a.js +0 -1
  563. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-70779af8b4c8259a.js +0 -1
  564. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-70779af8b4c8259a.js +0 -1
  565. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-70779af8b4c8259a.js +0 -1
  566. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-70779af8b4c8259a.js +0 -1
  567. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-70779af8b4c8259a.js +0 -1
  568. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-70779af8b4c8259a.js +0 -1
  569. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-70779af8b4c8259a.js +0 -1
  570. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-70779af8b4c8259a.js +0 -1
  571. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-70779af8b4c8259a.js +0 -1
  572. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-70779af8b4c8259a.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-70779af8b4c8259a.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-70779af8b4c8259a.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-70779af8b4c8259a.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-70779af8b4c8259a.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-70779af8b4c8259a.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-70779af8b4c8259a.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-70779af8b4c8259a.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-70779af8b4c8259a.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-70779af8b4c8259a.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-70779af8b4c8259a.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-70779af8b4c8259a.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-70779af8b4c8259a.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-70779af8b4c8259a.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-70779af8b4c8259a.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-70779af8b4c8259a.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-70779af8b4c8259a.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/route-70779af8b4c8259a.js +0 -1
  590. package/.next/static/chunks/app/layout-542d075e9d7cc541.js +0 -1
  591. package/.next/static/chunks/app/manifest.webmanifest/route-70779af8b4c8259a.js +0 -1
  592. package/.next/static/chunks/app/proxy/[...path]/route-70779af8b4c8259a.js +0 -1
  593. package/.next/static/chunks/app/review/page-8ed49e2edcc7667b.js +0 -1
  594. package/.next/static/chunks/app/sessions/page-56f6a2466dd0479d.js +0 -1
  595. package/.next/static/chunks/app/worktrees/[id]/layout-70779af8b4c8259a.js +0 -1
  596. package/.next/static/chunks/app/worktrees/[id]/page-760408096ad697b4.js +0 -1
  597. package/.next/static/css/b4aaf81d10efdd00.css +0 -1
  598. /package/.next/static/{7Ge9-hsqlip_Z6bhEnVkd → JfzIPPhL-ikSVcJYOKgfD}/_buildManifest.js +0 -0
  599. /package/.next/static/{7Ge9-hsqlip_Z6bhEnVkd → JfzIPPhL-ikSVcJYOKgfD}/_ssgManifest.js +0 -0
@@ -23,12 +23,14 @@ exports.tokenizeCliToolColumn = tokenizeCliToolColumn;
23
23
  exports.parseCliToolColumn = parseCliToolColumn;
24
24
  exports.validateCopilotModelName = validateCopilotModelName;
25
25
  exports.validateAntigravityModelName = validateAntigravityModelName;
26
+ exports.validateClaudeModelName = validateClaudeModelName;
26
27
  exports.validateOpencodeRunName = validateOpencodeRunName;
27
28
  exports.validateOpencodeTitle = validateOpencodeTitle;
28
29
  exports.parseAndValidateCliToolColumn = parseAndValidateCliToolColumn;
29
30
  exports.resolveScheduleCommandOptions = resolveScheduleCommandOptions;
30
31
  const copilot_constants_1 = require("../config/copilot-constants");
31
32
  const antigravity_constants_1 = require("../config/antigravity-constants");
33
+ const claude_constants_1 = require("../config/claude-constants");
32
34
  const opencode_constants_1 = require("../config/opencode-constants");
33
35
  // =============================================================================
34
36
  // Constants
@@ -342,6 +344,35 @@ function validateAntigravityModelName(modelName) {
342
344
  }
343
345
  return { valid: true };
344
346
  }
347
+ /**
348
+ * Validate a Claude model name using the reject approach (no sanitization).
349
+ * Issue #2771: `claude --model` takes an alias (`sonnet`, `opus`, `opus[1m]`) or
350
+ * a full id (`claude-sonnet-5`, `claude-opus-5[1m]`, a Bedrock / Vertex id). The
351
+ * brackets are why Copilot's pattern cannot be reused, and the display names
352
+ * Antigravity accepts ("Gemini 3.1 Pro (High)") are not something Claude takes.
353
+ *
354
+ * @param modelName - Model name to validate
355
+ * @returns Validation result with optional reason for rejection
356
+ */
357
+ function validateClaudeModelName(modelName) {
358
+ // Control character rejection
359
+ if (/[\x00-\x1f\x7f]/.test(modelName)) {
360
+ return { valid: false, reason: 'Model name contains control characters' };
361
+ }
362
+ // Empty / whitespace-only rejection
363
+ if (modelName.trim() === '') {
364
+ return { valid: false, reason: 'Model name must not be empty' };
365
+ }
366
+ // Pattern validation (leading alphanumeric required, DR4-001)
367
+ if (!claude_constants_1.CLAUDE_MODEL_NAME_PATTERN.test(modelName)) {
368
+ return { valid: false, reason: 'Model name contains invalid characters' };
369
+ }
370
+ // Length validation
371
+ if (modelName.length > claude_constants_1.MAX_CLAUDE_MODEL_NAME_LENGTH) {
372
+ return { valid: false, reason: `Model name exceeds ${claude_constants_1.MAX_CLAUDE_MODEL_NAME_LENGTH} characters` };
373
+ }
374
+ return { valid: true };
375
+ }
345
376
  /**
346
377
  * Validate an opencode `--agent` / `--variant` value (Issue #2044).
347
378
  *
@@ -4,8 +4,8 @@
4
4
  * Shared between response-poller.ts and API routes
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_FORM_SUBMIT_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
8
- exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = void 0;
7
+ exports.COPILOT_USER_ECHO_PATTERN = exports.COPILOT_REASONING_HEADER_PATTERN = exports.COPILOT_BOX_ROW_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_IDLE_STATUS_PATTERN = exports.COPILOT_WORKING_STATUS_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_FOOTER_STATUS_PATTERN = exports.OPENCODE_USER_ECHO_PATTERN = exports.OPENCODE_GUTTER_ROW_PATTERN = exports.OPENCODE_COMPOSER_BOTTOM_BORDER = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_PERMISSION_PATTERN = exports.OPENCODE_TURN_COMPLETE_PATTERN = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_IDLE_COMPOSER_PATTERN = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_USER_ECHO_PATTERN = exports.CODEX_TRAILED_STATUS_BAR_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_FORM_SUBMIT_FOOTER_PATTERN = exports.CODEX_APPROVAL_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_HOOKS_REVIEW_ANCHORS = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_INTERRUPT_HINT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
8
+ exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.COMMAND_CODE_SKIP_PATTERNS = exports.COMMAND_CODE_HOOK_NOTICE_PATTERN = exports.COMMAND_CODE_BANNER_PATTERNS = exports.COMMAND_CODE_MODE_INDICATOR_PATTERN = exports.COMMAND_CODE_COMPLETION_PATTERN = exports.COMMAND_CODE_RESPONSE_MARKER_PATTERN = exports.COMMAND_CODE_THINKING_PATTERN = exports.COMMAND_CODE_INTERRUPT_HINT_PATTERN = exports.COMMAND_CODE_SEPARATOR_PATTERN = exports.COMMAND_CODE_PROMPT_PATTERN = exports.COMMAND_CODE_SPINNER_CHARS = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SURVEY_PATTERN = exports.ANTIGRAVITY_DIALOG_MAX_ROWS = exports.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN = exports.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN = exports.ANTIGRAVITY_NUMBERED_OPTION_PATTERN = exports.ANTIGRAVITY_NAVIGATE_FOOTER_PATTERN = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_PATTERN = exports.ANTIGRAVITY_COMPOSER_MODE_BANNER_SOURCE = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_FOLDER_TRUST_ANSWER_KEY = exports.COPILOT_FOLDER_TRUST_SESSION_OPTION_PATTERN = exports.COPILOT_FOLDER_TRUST_ANCHORS = exports.COPILOT_SELECTION_FOOTER_PATTERN = exports.COPILOT_BOOT_BANNER_ANCHORS = exports.COPILOT_TRANSCRIPT_CONTINUATION_PATTERN = exports.COPILOT_TOOL_ROW_PATTERN = exports.COPILOT_TOOL_VERBS = exports.COPILOT_TRANSCRIPT_DIVIDER_PATTERN = void 0;
9
9
  exports.isCodexTurnActive = isCodexTurnActive;
10
10
  exports.findClaudeChromeStart = findClaudeChromeStart;
11
11
  exports.isCodexPromptReady = isCodexPromptReady;
@@ -629,6 +629,43 @@ exports.CODEX_PAGER_FOOTER_PATTERN = /(?:↑\/↓|pgup\/pgdn|home\/end)\s+to\s+(
629
629
  * line. No nested quantifiers (ReDoS-safe; adjacent greedy quantifiers only).
630
630
  */
631
631
  exports.CODEX_STATUS_BAR_PATTERN = /^\s*\S.*·\s*~?\/\S*\s*$/;
632
+ /**
633
+ * Codex status bar with something drawn AFTER the path (Issue #2818) — the
634
+ * second shape `findCodexFooterBoundary` in `tools/codex/detect.ts` accepts.
635
+ *
636
+ * From codex 0.154.0 on, the bar stops ending in the path once the first turn
637
+ * has named the thread, and Plan mode adds a right-aligned badge:
638
+ *
639
+ * ```text
640
+ * gpt-5.6-terra low · /private/var/…/repo · Run touch probe.txt
641
+ * gpt-6-astra medium · ~/uat3-…/sandbox-repo Plan mode (shift+tab to cycle)
642
+ * ```
643
+ *
644
+ * {@link CODEX_STATUS_BAR_PATTERN} wants the path last, so every such frame had
645
+ * no boundary and fell to the detector's bar-independent branch D (#1150's
646
+ * safety net). That branch reads the 15-row tail, and on an idle frame the tail
647
+ * still holds the finished turn's `• Ran …` record — which is how an idle
648
+ * session read `running` (#2808's `idle-after-declined-approval.txt`; #2818
649
+ * reproduced it on a turn that simply ran one command and answered).
650
+ *
651
+ * Kept a SEPARATE pattern rather than a widened {@link CODEX_STATUS_BAR_PATTERN}
652
+ * so the change stays on the one reader it was measured for: that pattern is
653
+ * also the stripped-capture landmark of {@link findCodexChromeStart} and the
654
+ * value reader's first test in `model-info-extractor.ts`, neither of which
655
+ * this Issue measured.
656
+ *
657
+ * The shape is the one `CODEX_STATUS_BAR_WITH_TRAILER_PATTERN`
658
+ * (`model-info-extractor.ts`, #2592) reads values off, written out here rather
659
+ * than imported: that module's rule is that it must never be the reason this
660
+ * boundary moves. Head segment, `·`, a path, then EITHER a further `·`
661
+ * segment OR a column gap (two spaces) before right-aligned text. `[^·]*` puts
662
+ * the path right after the FIRST `·`, so codex's in-flight row (`• Working (…)
663
+ * · 1 background terminal running · /ps to view`) is not a bar — its first `·`
664
+ * is followed by a count, not a path.
665
+ *
666
+ * Single-line, no /g, no nested quantifiers (ReDoS-safe), as above.
667
+ */
668
+ exports.CODEX_TRAILED_STATUS_BAR_PATTERN = /^\s*\S[^·]*·\s*~?\/\S*(?:\s*·[^\n]*|[^\S\n]{2,}\S[^\n]*)$/;
632
669
  /**
633
670
  * How far above the last non-blank row {@link findCodexChromeStart} looks for the
634
671
  * composer.
@@ -702,9 +739,11 @@ const CODEX_CHROME_GLYPH_ROW_PATTERN = /^›(\s|$)/;
702
739
  * the list silently stopped matching the thing it was written for. Issue #2310
703
740
  * measured what actually separates codex's three uses of `›` (U+203A), and it is
704
741
  * the SGR attributes, not the text: the composer glyph is bold (`ESC[1m›`), a
705
- * transcript echo is dim (`ESC[1;2m›`), a dialog option carries a coloured glyph
706
- * or a bold label. {@link readCodexGlyphRowKind} is that measurement, and this
707
- * reader is one of its callers.
742
+ * transcript echo is dim (`ESC[1;2m›`), a dialog option carries a bold label or
743
+ * a label drawn in the glyph's own colour (one span — since #2798 a coloured
744
+ * glyph alone is not enough, because 0.155.1 colours the composer's glyph too).
745
+ * {@link readCodexGlyphRowKind} is that measurement, and this reader is one of
746
+ * its callers.
708
747
  *
709
748
  * `-1` is returned for a frame whose bottom-most `›` is an option row: codex
710
749
  * replaces the composer with the dialog, so there is no chrome to trim and the
@@ -62,7 +62,7 @@
62
62
  * @see Issue #1784, Phase 2 of the model/effort visibility series
63
63
  */
64
64
  Object.defineProperty(exports, "__esModule", { value: true });
65
- exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
65
+ exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.COMMAND_CODE_BANNER_MODELS_PATTERN = exports.OPENCODE_STEP_MODEL_PATTERN = exports.COPILOT_MODEL_CHANGE_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_MODEL_SWITCH_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_STATUS_BAR_WITH_TRAILER_PATTERN = exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
66
66
  exports.resolveEffortToken = resolveEffortToken;
67
67
  exports.extractModelInfo = extractModelInfo;
68
68
  exports.deriveEffortFromModelId = deriveEffortFromModelId;
@@ -72,11 +72,27 @@ const cli_patterns_1 = require("./cli-patterns");
72
72
  /**
73
73
  * The reasoning-effort vocabulary these tools actually print.
74
74
  *
75
- * `minimal` and `xhigh` are the ends Codex exposes; Claude prints `xhigh` too.
75
+ * `minimal` and `xhigh` are the ends Codex exposed until 0.155; Claude prints
76
+ * `xhigh` too. Issue #2835 adds the three levels above `xhigh` that codex 0.155.1
77
+ * defines (`ReasoningEffort` in `codex-rs/protocol/src/openai_models.rs`, tag
78
+ * `rust-v0.155.1`: `max` / `ultra` / `persistent`, drawn in the status bar
79
+ * verbatim by `status_line_reasoning_effort_label`). Its `None` is drawn as
80
+ * `default` and is deliberately NOT a level — it names no effort. Command Code's
81
+ * `with max effort` banner resolves through the same list.
82
+ *
76
83
  * Anything outside this list is treated as "not an effort token", which is what
77
84
  * keeps a stray word at the end of a status bar from being published as one.
78
85
  */
79
- exports.REASONING_EFFORT_LEVELS = ['minimal', 'low', 'medium', 'high', 'xhigh'];
86
+ exports.REASONING_EFFORT_LEVELS = [
87
+ 'minimal',
88
+ 'low',
89
+ 'medium',
90
+ 'high',
91
+ 'xhigh',
92
+ 'max',
93
+ 'ultra',
94
+ 'persistent',
95
+ ];
80
96
  /**
81
97
  * Longest string accepted as a model name.
82
98
  *
@@ -156,7 +172,23 @@ function resolveEffortToken(token, options = {}) {
156
172
  * optional `\s+<keyword>` are adjacent, never nested (ReDoS-safe, same rule
157
173
  * `cli-patterns.ts` documents).
158
174
  */
159
- exports.CODEX_FOOTER_MODEL_PATTERN = /^\s*([^\s·]+)(?:\s+(minimal|low|medium|high|xhigh)\b)?/i;
175
+ exports.CODEX_FOOTER_MODEL_PATTERN = /^\s*([^\s·]+)(?:\s+(minimal|low|medium|high|xhigh|max|ultra|persistent)\b)?/i;
176
+ /**
177
+ * The head of a Codex status bar that has a word where the effort goes
178
+ * (Issue #2835).
179
+ *
180
+ * codex draws `<model> <effort>` and, for an effort it has no name for, still
181
+ * draws a word there: `default` for `None` (`status_line_reasoning_effort_label`,
182
+ * codex 0.155.1; live in `tests/fixtures/agent-mode-2592/codex-default.txt`), or
183
+ * a model-defined value verbatim. A head whose second token is a word is
184
+ * therefore a bar that SHOWS an effort, even when {@link CODEX_FOOTER_MODEL_PATTERN}
185
+ * cannot name it. The legacy o4-mini head (`o4-mini 50% left`) has no
186
+ * such slot — its second token starts with a digit — and neither does a status
187
+ * line configured to show the model alone.
188
+ *
189
+ * No /g. No nested quantifiers: two adjacent runs and a lookahead.
190
+ */
191
+ exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN = /^\s*[^\s·]+\s+[A-Za-z][A-Za-z_-]*(?=\s|$)/;
160
192
  /**
161
193
  * A codex status bar with something AFTER the path (Issue #2592).
162
194
  *
@@ -202,7 +234,8 @@ function readCodexFooter(line) {
202
234
  const separator = line.indexOf('·');
203
235
  if (separator < 0)
204
236
  return null;
205
- const match = exports.CODEX_FOOTER_MODEL_PATTERN.exec(line.slice(0, separator));
237
+ const head = line.slice(0, separator);
238
+ const match = exports.CODEX_FOOTER_MODEL_PATTERN.exec(head);
206
239
  if (!match)
207
240
  return null;
208
241
  const model = match[1];
@@ -219,6 +252,13 @@ function readCodexFooter(line) {
219
252
  // beside it is what separates chrome from prose.
220
253
  if (effort === null && !/\d/.test(model))
221
254
  return null;
255
+ // Issue #2835: a bar that shows an effort this module cannot name says the
256
+ // latched effort is no longer current. Publishing the old one would be a
257
+ // wrong value, which is worse than none — the case that found it was a
258
+ // session moved from `xhigh` to `max` while `max` was not yet a level.
259
+ if (effort === null && exports.CODEX_FOOTER_EFFORT_SLOT_PATTERN.test(head)) {
260
+ return { model, effort: null, effortUnreadable: true };
261
+ }
222
262
  return { model, effort };
223
263
  }
224
264
  // =============================================================================
@@ -612,11 +652,10 @@ function readOpencodeStepMarker(line) {
612
652
  * footer reads `? for shortcuts · taste on`), so everything from the dot on
613
653
  * is dropped, and the dot itself is optional.
614
654
  * - **The effort is read when the banner prints one, through the shared
615
- * vocabulary.** `low` / `high` resolve; `max` is not a
616
- * {@link ReasoningEffort} and answers null rather than widening a list every
617
- * other reader and the UI type depend on. The model half is published either
618
- * way: the ` with … effort` frame delimits it cleanly, so nothing is
619
- * half-read.
655
+ * vocabulary.** `low` / `high` / `max` resolve (`max` since Issue #2835,
656
+ * which added it to {@link REASONING_EFFORT_LEVELS} for codex; before that it
657
+ * answered null). The model half is published either way: the
658
+ * ` with … effort` frame delimits it cleanly, so nothing is half-read.
620
659
  *
621
660
  * ## After a `/model` switch (measured, 1.49.0)
622
661
  *
@@ -64,10 +64,12 @@
64
64
  * written once.
65
65
  */
66
66
  Object.defineProperty(exports, "__esModule", { value: true });
67
- exports.DISMISSABLE_PANEL_FOOTER_PATTERN = exports.COMMAND_CODE_SELECTION_LIST_FOOTER = exports.SET_AS_DEFAULT_FOOTER_PATTERN = exports.SESSION_SCOPE_FOOTER_PATTERN = exports.MAX_OPTION_NUMBER = exports.SELECTION_SHAPE_TAIL_LINE_COUNT = void 0;
67
+ exports.COMMAND_CODE_PLAN_APPROVE_CHOICE_FOOTER = exports.COMMAND_CODE_PLAN_APPROVE_CHOICE_ROW = exports.COMMAND_CODE_PLAN_REVIEW_FOOTER = exports.DISMISSABLE_PANEL_FOOTER_PATTERN = exports.COMMAND_CODE_SELECTION_LIST_FOOTER = exports.SET_AS_DEFAULT_FOOTER_PATTERN = exports.SESSION_SCOPE_FOOTER_PATTERN = exports.MAX_OPTION_NUMBER = exports.SELECTION_SHAPE_TAIL_LINE_COUNT = void 0;
68
+ exports.isCommandCodePlanApproveChoice = isCommandCodePlanApproveChoice;
68
69
  exports.hasDismissablePanelFooter = hasDismissablePanelFooter;
69
70
  exports.readCommandCodeQuestionRegion = readCommandCodeQuestionRegion;
70
71
  exports.hasCommandCodeQuestionChrome = hasCommandCodeQuestionChrome;
72
+ exports.readCommandCodeReviewPage = readCommandCodeReviewPage;
71
73
  exports.extractCommandCodeSelectionListFrame = extractCommandCodeSelectionListFrame;
72
74
  exports.readSelectionListShape = readSelectionListShape;
73
75
  exports.shouldOfferOptionNumbers = shouldOfferOptionNumbers;
@@ -188,6 +190,98 @@ exports.COMMAND_CODE_SELECTION_LIST_FOOTER = /\benter\s+to\s+select\b\s*[·•]\
188
190
  * Code writes its picker hints in lower case; nothing rests on which it uses.
189
191
  */
190
192
  exports.DISMISSABLE_PANEL_FOOTER_PATTERN = /^\s*(?:press|hit|type)?\s*(?:<)?esc(?:ape)?(?:>)?\s+to\s+(?:close|dismiss|exit)\b[\s.·•]*$/im;
193
+ /**
194
+ * The two footer rows of Command Code's plan review overlay (Issue #2761).
195
+ *
196
+ * Measured on 1.58.0 at 200x1000. The overlay is a rule, a `Plan review: <title>
197
+ * · <path> · v1` header, the plan with a line-number gutter, a second rule, a
198
+ * ` REVIEW ` badge and then, verbatim:
199
+ *
200
+ * Approve ctrl+a executes the plan
201
+ * Cancel esc
202
+ *
203
+ * BOTH rows, adjacent, because each half alone is weak: `Cancel esc` is two
204
+ * words any picker might print, and `Approve` is a word an agent writes in a
205
+ * plan. Multi-line on purpose — it is tested against a joined tail
206
+ * (`NormalizedFrame.lastLines`, or the tail {@link readSelectionListShape}
207
+ * builds), never against a single row.
208
+ *
209
+ * Swept against every fixture in `tests/fixtures` and
210
+ * `tests/unit/lib/detection/fixtures` when this was written (300 files): the
211
+ * only match is the plan review capture itself.
212
+ *
213
+ * ## The `❯` either row may carry (Issue #2793)
214
+ *
215
+ * `↓` past the plan's last line moves the focus onto the ACTION list, and the
216
+ * focused action is drawn with a `❯ ` in front of it and two spaces before its
217
+ * key (`tests/fixtures/command-code-plan-review-2763/`, 1.58.0):
218
+ *
219
+ * ❯ Approve ctrl+a executes the plan ← `plan-review-action-focus-approve.txt`
220
+ * Cancel esc
221
+ *
222
+ * Approve ctrl+a executes the plan · comments go along as notes
223
+ * ❯ Cancel esc ← `plan-review-long-scrolled-cancel-focused.txt`
224
+ *
225
+ * Without the optional `❯ ` this pattern missed both frames, and they went on to
226
+ * the composer check, where `COMMAND_CODE_PROMPT_PATTERN` (`^❯(\s*$|\s+\S)`)
227
+ * read the cursor row as the composer and published `ready` / `input_prompt`:
228
+ * `wait` exited 0 on a plan nobody had approved — #2754's `❯`-outside-the-list
229
+ * family. It is also the frame on which `Enter` EXECUTES the focused action, so
230
+ * missing it here would also have left the chat surface's `Enter` on screen
231
+ * (see {@link SelectionListShape.offersPlanApprove}). Only `❯`, and only as a
232
+ * prefix: `❯ ` + the row is the one measured spelling of a focused action.
233
+ * Re-swept over the same two directories with the widened pattern: every match
234
+ * is still a `command-code-plan-review-*` capture, which
235
+ * `command-code-plan-review-2793.test.ts` keeps pinned.
236
+ */
237
+ exports.COMMAND_CODE_PLAN_REVIEW_FOOTER = /^\s*(?:❯ +)?Approve\s+ctrl\+a\b[^\n]*\n\s*(?:❯ +)?Cancel\s+esc\s*$/im;
238
+ /**
239
+ * The radio row `ctrl+a` puts in place of the action list when comments are
240
+ * pending (Issue #2793).
241
+ *
242
+ * Measured on 1.58.0 (`tests/fixtures/command-code-plan-review-2763/`): with
243
+ * zero comments `ctrl+a` approves at once, and with one or more it first asks
244
+ * what to do with them. The three action rows are replaced by ONE row, and the
245
+ * selected side is `(•)`, the other `( )` — readable without the ANSI:
246
+ *
247
+ * Approve (•) with 4 comments as notes ( ) original plan · discard comments
248
+ *
249
+ * `comments?` because the badge above it is measured in both numbers
250
+ * (`1 pending comment` / `4 pending comments`); the radio itself was captured
251
+ * with four.
252
+ */
253
+ exports.COMMAND_CODE_PLAN_APPROVE_CHOICE_ROW = /^\s*Approve\s+\([• ]\)\s+with\s+\d+\s+comments?\s+as\s+notes\s+\([• ]\)\s+original\s+plan\b/im;
254
+ /**
255
+ * The hint bar under {@link COMMAND_CODE_PLAN_APPROVE_CHOICE_ROW}, verbatim
256
+ * `←/→ choose · enter confirm · esc back`.
257
+ *
258
+ * Anchored to the LAST row of the text it is tested against (no `m` flag: `$` is
259
+ * the end of the input), because that is where the overlay draws every one of
260
+ * its five measured hint bars, and because it is what keeps a transcript that
261
+ * QUOTES this screen from matching — the composer is always drawn below a
262
+ * transcript, so there the quote is never the last row.
263
+ */
264
+ exports.COMMAND_CODE_PLAN_APPROVE_CHOICE_FOOTER = /(?:^|\n)[ \t]*←\/→\s+choose\s*·\s*enter\s+confirm\s*·\s*esc\s+back\s*$/i;
265
+ /**
266
+ * Whether this tail is the approve-with-comments confirmation (Issue #2793).
267
+ *
268
+ * BOTH rows, for the reason {@link COMMAND_CODE_PLAN_REVIEW_FOOTER} gives for
269
+ * its two: either half alone is a sentence something else could print. Not
270
+ * adjacent — `Editor exited with code 127` and a blank row sit between them on
271
+ * both captures — so each is tested on its own.
272
+ *
273
+ * Deliberately NOT folded into {@link COMMAND_CODE_PLAN_REVIEW_FOOTER}, and
274
+ * therefore not {@link SelectionListShape.offersPlanApprove}: on this screen
275
+ * `enter` is the documented CONFIRM of an approval the human already started
276
+ * with `ctrl+a`, so the chat surface must keep its `Enter`, and what `ctrl+a`
277
+ * does here was not measured.
278
+ *
279
+ * @param tail - the frame's last rows, ANSI stripped, last content row last
280
+ */
281
+ function isCommandCodePlanApproveChoice(tail) {
282
+ return (exports.COMMAND_CODE_PLAN_APPROVE_CHOICE_ROW.test(tail) &&
283
+ exports.COMMAND_CODE_PLAN_APPROVE_CHOICE_FOOTER.test(tail));
284
+ }
191
285
  /**
192
286
  * How many rows from the end of the content the dismiss footer is looked for.
193
287
  *
@@ -276,8 +370,24 @@ const COMMAND_CODE_CURSOR_GLYPH = '❯';
276
370
  const COMMAND_CODE_TAB_SELECTED_MARKERS = '●◉⦿';
277
371
  /** The hollow half of {@link COMMAND_CODE_TAB_SELECTED_MARKERS}'s pair. */
278
372
  const COMMAND_CODE_TAB_UNSELECTED_MARKERS = '◯○◌⚪';
373
+ /**
374
+ * The ANSWERED half, measured on 1.54.1 (Issue #2753).
375
+ *
376
+ * A multi-question `AskUserQuestion` keeps one tab per question and marks the
377
+ * ones already answered: `✔ Party size | ✔ Rental car | ● Update scope | ◯ Review`.
378
+ * Before this family existed the whole strip failed the cell test, the reader answered
379
+ * `none`, and the generic parser read the checkbox list under it as a single
380
+ * select — see the Issue for the capture.
381
+ *
382
+ * U+2714 and nothing else. `✓` (U+2713) and `☑` (U+2611) are the shapes a check
383
+ * mark could take; neither has been seen on a pane, and this reading is shared
384
+ * with `ChatSurface` and `extractCommandCodeSelectionListFrame`, which run for
385
+ * EVERY tool — so an unmeasured glyph here widens what other tools' frames can
386
+ * be claimed as this screen.
387
+ */
388
+ const COMMAND_CODE_TAB_ANSWERED_MARKERS = '✔';
279
389
  /** One `<marker> <label>` cell of the tab strip. */
280
- const COMMAND_CODE_TAB_SEGMENT_PATTERN = new RegExp(`^\\s*([${COMMAND_CODE_TAB_SELECTED_MARKERS}${COMMAND_CODE_TAB_UNSELECTED_MARKERS}])\\s+\\S`);
390
+ const COMMAND_CODE_TAB_SEGMENT_PATTERN = new RegExp(`^\\s*([${COMMAND_CODE_TAB_SELECTED_MARKERS}${COMMAND_CODE_TAB_UNSELECTED_MARKERS}${COMMAND_CODE_TAB_ANSWERED_MARKERS}])\\s+\\S`);
281
391
  /**
282
392
  * Is this row Command Code's question-screen tab strip?
283
393
  *
@@ -288,16 +398,19 @@ const COMMAND_CODE_TAB_SEGMENT_PATTERN = new RegExp(`^\\s*([${COMMAND_CODE_TAB_S
288
398
  * the structure and the one prose never has in this position;
289
399
  * - **every cell is `<marker> <label>`.** A row that is a strip for its first
290
400
  * cell and prose for its second is prose;
291
- * - **at least one filled marker and at least one hollow one.** A tab strip
401
+ * - **at least one filled marker, and at least one other cell.** A tab strip
292
402
  * says which tab has the screen. A row of identical bullets does not, and
293
- * `● one | ● two` is exactly the list-with-a-pipe this rules out.
403
+ * `● one | ● two` is exactly the list-with-a-pipe this rules out. The other
404
+ * cell may be hollow (not answered yet) or the `✔` of an answered tab
405
+ * (measured on 1.54.1 — Issue #2753); what may not be missing is the filled
406
+ * one, so `✔ one | ✔ two` is still refused.
294
407
  */
295
408
  function isCommandCodeQuestionTabRow(line) {
296
409
  const segments = line.split('|');
297
410
  if (segments.length < 2)
298
411
  return false;
299
412
  let selected = 0;
300
- let unselected = 0;
413
+ let others = 0;
301
414
  for (const segment of segments) {
302
415
  const match = COMMAND_CODE_TAB_SEGMENT_PATTERN.exec(segment);
303
416
  if (match === null)
@@ -305,9 +418,9 @@ function isCommandCodeQuestionTabRow(line) {
305
418
  if (COMMAND_CODE_TAB_SELECTED_MARKERS.includes(match[1]))
306
419
  selected += 1;
307
420
  else
308
- unselected += 1;
421
+ others += 1;
309
422
  }
310
- return selected > 0 && unselected > 0;
423
+ return selected > 0 && others > 0;
311
424
  }
312
425
  /**
313
426
  * Rows that mean the region spans more than the one dialog on screen now.
@@ -382,9 +495,13 @@ const COMMAND_CODE_QUESTION_REGION_REJECT_PATTERN = /\besc\s+to\s+interrupt\b|^[
382
495
  * 3. the options are a STRICT run `1.` … `N.`, 2 ≤ N ≤ {@link
383
496
  * MAX_OPTION_NUMBER}. A gap, a repeat or a list that starts at `2` is not
384
497
  * this screen;
385
- * 4. exactly one {@link COMMAND_CODE_CURSOR_GLYPH} in the region, and it is on
386
- * an option row. Two cursors means two screens — typically a composer's own
387
- * `❯` under the dialog — and none means the highlight is elsewhere;
498
+ * 4. exactly one {@link COMMAND_CODE_CURSOR_GLYPH} in the region. Two cursors
499
+ * means two screens — typically a composer's own `❯` under the dialog — and
500
+ * none means the highlight is elsewhere. Issue #2755 dropped the "and it is
501
+ * on an option row" half: 1.54.1 parks the cursor on `Submit`, on `Next` and
502
+ * on the `notes:` row, and refusing those frames published six measured
503
+ * captures of a live question as finished turns. WHERE it sits is reported
504
+ * as {@link CommandCodeQuestionRegion.cursorOnOptionRow} instead;
388
505
  * 5. no filter box, no `/model` footer, no dismiss-only footer and no other
389
506
  * turn's UI in the region ({@link FILTER_INPUT_PATTERN},
390
507
  * {@link COMMAND_CODE_SELECTION_LIST_FOOTER},
@@ -446,6 +563,7 @@ function readCommandCodeQuestionRegion(frame) {
446
563
  lastLineIndex: screen.lastLineIndex,
447
564
  tabLineIndex: screen.tabLineIndex,
448
565
  cursorLineIndex: screen.cursorLineIndex,
566
+ cursorOnOptionRow: screen.cursorOnOptionRow,
449
567
  optionCount: screen.numbers.length,
450
568
  };
451
569
  }
@@ -478,17 +596,126 @@ function readCommandCodeQuestionRegion(frame) {
478
596
  * Every structural condition stays: the last qualifying rule row, a genuine tab
479
597
  * strip as the first row under it ({@link isCommandCodeQuestionTabRow} — one
480
598
  * filled marker, one hollow, `|`-separated), a non-blank question body before
481
- * the first option, at least two numbered rows, at least one `❯` ON one of them,
599
+ * the first option, at least two numbered rows, at least one `❯` in the region,
482
600
  * and none of the pickers, panels or other-turn UI the other branches own. An
483
601
  * assistant answering in a numbered list carries none of that, and a frame with
484
- * one option or with the `❯` on a composer row is still `false` — the two cases
485
- * #2521 recorded as "the highlight is elsewhere".
602
+ * one option is still `false`.
603
+ *
604
+ * Issue #2755 no longer requires that `❯` to be ON a numbered row — see
605
+ * condition 4 of {@link readCommandCodeQuestionRegion} for why, and
606
+ * {@link CommandCodeQuestionRegion.cursorOnOptionRow} for what is reported
607
+ * instead.
486
608
  *
487
609
  * @param frame - a raw `capture-pane -p -e` frame, ANSI intact (CRLF tolerated)
488
610
  */
489
611
  function hasCommandCodeQuestionChrome(frame) {
490
612
  return scanCommandCodeQuestionScreen(frame) !== null;
491
613
  }
614
+ /**
615
+ * The Review page's own three rows, measured on 1.54.1 (Issue #2755 §7).
616
+ *
617
+ * `Enter` on the `Submit` row does not send the answers — it opens a SECOND
618
+ * screen:
619
+ *
620
+ * ✔ Update scope | ● Review
621
+ *
622
+ * 1. Which files should I update?
623
+ * calc.js
624
+ *
625
+ * ❯ 1. Submit
626
+ * 2. Cancel
627
+ *
628
+ * ← to go back and edit
629
+ *
630
+ * ## Why this needs a reading of its own
631
+ *
632
+ * Because it is a real numbered list under a real tab strip, and the GENERIC
633
+ * parser answers it: a two-option `multiple_choice` whose default is `Submit`.
634
+ * The default answer on that payload does not pick anything — it COMMITS
635
+ * whatever the human has ticked so far, from a payload nobody meant to expose,
636
+ * which is #1928's shape one screen later. Auto-Yes fires on defaults.
637
+ *
638
+ * Words rather than structure, and deliberately: the two numbered rows are
639
+ * `Submit` and `Cancel`, which is the same shape as any other two-option
640
+ * question. What separates this page from a question is only what it SAYS, so
641
+ * all three rows are required together — the confirm pair AND the back hint —
642
+ * and the whole thing is anchored inside a recognised question region. A screen
643
+ * that carries two of the three keeps every verdict it had.
644
+ *
645
+ * The cursor glyph is optional on both numbered rows: it rests on `1. Submit`
646
+ * when the page is reached by `Enter`, and the Issue is explicit that a pattern
647
+ * decided on the bare word would miss it.
648
+ */
649
+ const COMMAND_CODE_REVIEW_SUBMIT_ROW_PATTERN = /^[^\S\n]*(?:\u276F[^\S\n]*)?1[.)][^\S\n]+Submit[^\S\n]*$/im;
650
+ /** The `Cancel` half of {@link COMMAND_CODE_REVIEW_SUBMIT_ROW_PATTERN}'s pair. */
651
+ const COMMAND_CODE_REVIEW_CANCEL_ROW_PATTERN = /^[^\S\n]*(?:\u276F[^\S\n]*)?2[.)][^\S\n]+Cancel[^\S\n]*$/im;
652
+ /** The footer only the Review page draws. */
653
+ const COMMAND_CODE_REVIEW_BACK_HINT_PATTERN = /^[^\S\n]*\u2190[^\S\n]+to[^\S\n]+go[^\S\n]+back[^\S\n]+and[^\S\n]+edit[^\S\n]*$/im;
654
+ /**
655
+ * The warning the Review page carries when it was reached with answers missing.
656
+ *
657
+ * Measured from the undocumented `d`, which ends a multi-select from any row:
658
+ * `⚠ You have not answered all questions` over a `No answer`. Issue #2755 §7
659
+ * requires that such a page is never read as "answered", which is why the
660
+ * predicate below reports it rather than hiding it.
661
+ */
662
+ const COMMAND_CODE_REVIEW_UNANSWERED_PATTERN = /have\s+not\s+answered\s+all\s+questions/i;
663
+ /**
664
+ * Read Command Code's `AskUserQuestion` Review page, if this frame is one
665
+ * (Issue #2755 §7).
666
+ *
667
+ * The same region {@link readCommandCodeQuestionRegion} works on — last rule
668
+ * row, tab strip as the first row under it — plus the three rows above. The
669
+ * question-shaped conditions are deliberately NOT applied: this page has no
670
+ * question body of its own on the `Submit`/`Cancel` spelling (the answers sit
671
+ * where the question would), and it draws `1.` twice, so the strict reading
672
+ * declines it for a numbering reason that says nothing about what it is.
673
+ *
674
+ * `null` for everything else, so no existing verdict moves except the two
675
+ * captures this is about.
676
+ *
677
+ * @param frame - a raw `capture-pane -p -e` frame, ANSI intact (CRLF tolerated)
678
+ */
679
+ function readCommandCodeReviewPage(frame) {
680
+ if (!frame)
681
+ return null;
682
+ const lines = frame.replace(/\r\n/g, '\n').split('\n').map(ansi_1.stripAnsi);
683
+ let last = lines.length - 1;
684
+ while (last >= 0 && lines[last].trim() === '')
685
+ last -= 1;
686
+ if (last < 1)
687
+ return null;
688
+ let ruleLineIndex = -1;
689
+ for (let i = last - 1; i >= 0; i -= 1) {
690
+ const row = lines[i].trim();
691
+ if (row.length < COMMAND_CODE_RULE_MIN_COLUMNS)
692
+ continue;
693
+ if (!COMMAND_CODE_RULE_ROW_PATTERN.test(row))
694
+ continue;
695
+ ruleLineIndex = i;
696
+ break;
697
+ }
698
+ if (ruleLineIndex < 0)
699
+ return null;
700
+ const region = lines.slice(ruleLineIndex + 1, last + 1);
701
+ const tabOffset = region.findIndex((line) => line.trim() !== '');
702
+ if (tabOffset < 0)
703
+ return null;
704
+ if (!isCommandCodeQuestionTabRow(region[tabOffset]))
705
+ return null;
706
+ const body = region.join('\n');
707
+ if (!COMMAND_CODE_REVIEW_SUBMIT_ROW_PATTERN.test(body))
708
+ return null;
709
+ if (!COMMAND_CODE_REVIEW_CANCEL_ROW_PATTERN.test(body))
710
+ return null;
711
+ if (!COMMAND_CODE_REVIEW_BACK_HINT_PATTERN.test(body))
712
+ return null;
713
+ const submitRow = region.find((row) => COMMAND_CODE_REVIEW_SUBMIT_ROW_PATTERN.test(row));
714
+ return {
715
+ hasUnansweredWarning: COMMAND_CODE_REVIEW_UNANSWERED_PATTERN.test(body),
716
+ cursorOnSubmit: submitRow !== undefined && submitRow.includes(COMMAND_CODE_CURSOR_GLYPH),
717
+ };
718
+ }
492
719
  /**
493
720
  * The structural half of the question-screen reading, shared by the strict
494
721
  * {@link readCommandCodeQuestionRegion} and the weaker
@@ -566,18 +793,38 @@ function scanCommandCodeQuestionScreen(frame) {
566
793
  if (!region.slice(tabOffset + 1, firstOptionOffset).some((line) => line.trim() !== '')) {
567
794
  return null;
568
795
  }
569
- // 4. A cursor, on an option row.
796
+ // 4. A cursor, somewhere in the region.
797
+ //
798
+ // Issue #2755 removed the second half of this condition ("and it is on an
799
+ // option row"). 1.54.1 lets the `❯` leave the list — onto `Submit`, onto
800
+ // `Next`, onto the `notes:` input — and requiring it on a numbered row made
801
+ // six measured captures of a LIVE question fall through to the composer
802
+ // check, which answers `ready` off the dialog's own `❯` row and makes `wait`
803
+ // exit 0 on a pane that is asking a human a question (#2521's 偽完了, §8).
804
+ //
805
+ // The generalisation is deliberate and is stated in the Issue: the condition
806
+ // is "the `❯` is outside the list", NOT the word `Submit`. Adding the three
807
+ // measured labels would have to be re-opened for the fourth, and 1.54.1
808
+ // already draws three. Where the cursor sits is reported instead, in
809
+ // {@link CommandCodeQuestionScreen.cursorOnOptionRow}, and the reader decides
810
+ // what a screen it cannot answer is worth.
811
+ //
812
+ // Nothing else about the reading moved, so a frame that is not a question
813
+ // screen is refused by exactly the conditions that refused it before: the last
814
+ // rule row, a genuine tab strip as its first row, a question body, two or more
815
+ // numbered rows, and none of the pickers or panels the other branches own.
570
816
  let cursorCount = 0;
571
817
  let cursorOffset = -1;
818
+ let cursorOnOptionRow = false;
572
819
  for (let i = 0; i < region.length; i += 1) {
573
820
  const inRow = region[i].split(COMMAND_CODE_CURSOR_GLYPH).length - 1;
574
821
  if (inRow === 0)
575
822
  continue;
576
823
  cursorCount += inRow;
577
- if (OPTION_ROW_PATTERN.test(region[i]))
578
- cursorOffset = i;
824
+ cursorOffset = i;
825
+ cursorOnOptionRow = OPTION_ROW_PATTERN.test(region[i]);
579
826
  }
580
- if (cursorCount === 0 || cursorOffset < 0)
827
+ if (cursorCount === 0)
581
828
  return null;
582
829
  return {
583
830
  ruleLineIndex,
@@ -587,6 +834,7 @@ function scanCommandCodeQuestionScreen(frame) {
587
834
  numbers,
588
835
  cursorCount,
589
836
  cursorLineIndex: ruleLineIndex + 1 + cursorOffset,
837
+ cursorOnOptionRow,
590
838
  };
591
839
  }
592
840
  /**
@@ -690,6 +938,7 @@ const EMPTY_SHAPE = {
690
938
  offersSessionScope: false,
691
939
  commitsDefaultOnEnter: false,
692
940
  hasFilterInput: false,
941
+ offersPlanApprove: false,
693
942
  };
694
943
  /** The last {@link SELECTION_SHAPE_TAIL_LINE_COUNT} rows that carry content. */
695
944
  function tailLines(frame) {
@@ -750,12 +999,13 @@ function readSelectionListShape(frame) {
750
999
  offersSessionScope: exports.SESSION_SCOPE_FOOTER_PATTERN.test(tail),
751
1000
  commitsDefaultOnEnter: exports.SET_AS_DEFAULT_FOOTER_PATTERN.test(tail),
752
1001
  hasFilterInput: FILTER_INPUT_PATTERN.test(tail),
1002
+ offersPlanApprove: exports.COMMAND_CODE_PLAN_REVIEW_FOOTER.test(tail),
753
1003
  };
754
1004
  }
755
1005
  /**
756
1006
  * Whether the card may draw a `1`…`N` row for this shape.
757
1007
  *
758
- * Two refusals, both measured rather than defensive:
1008
+ * Three refusals, all measured rather than defensive:
759
1009
  *
760
1010
  * - **a session-scope footer.** On claude's `/model` a number key commits AND
761
1011
  * rewrites the global default in one press (probed live on 2.1.260), so a
@@ -764,7 +1014,12 @@ function readSelectionListShape(frame) {
764
1014
  * - **a filter input.** copilot's `/model` and Command Code's picker put a
765
1015
  * focused search box on the dialog, where a `4` is four characters of a
766
1016
  * query and not the fourth model.
1017
+ * - **a plan review.** Every character typed there is a comment on the plan,
1018
+ * and the plan's own text is full of `1.` `2.` rows.
767
1019
  */
768
1020
  function shouldOfferOptionNumbers(shape) {
769
- return shape.optionCount > 0 && !shape.offersSessionScope && !shape.hasFilterInput;
1021
+ return (shape.optionCount > 0 &&
1022
+ !shape.offersSessionScope &&
1023
+ !shape.hasFilterInput &&
1024
+ !shape.offersPlanApprove);
770
1025
  }
@@ -60,6 +60,8 @@ exports.SELECTION_LIST_REASONS = new Set([
60
60
  // unclassified floor, whose controls are the answer characters and whose
61
61
  // answer characters go into the picker's search box.
62
62
  status_reason_1.STATUS_REASON.COMMAND_CODE_SELECTION_LIST,
63
+ // Issue #2761: Command Code's plan review. Arrow-driven, human-only.
64
+ status_reason_1.STATUS_REASON.COMMAND_CODE_PLAN_REVIEW,
63
65
  status_reason_1.STATUS_REASON.COPILOT_SELECTION_LIST,
64
66
  status_reason_1.STATUS_REASON.CODEX_SELECTION_LIST,
65
67
  // Issue #1017: Codex pager/edit-previous mode also drives NavigationButtons.