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
@@ -92,6 +92,19 @@ exports.STATUS_REASON = {
92
92
  * the sentence that identifies it was measured on one tool.
93
93
  */
94
94
  COMMAND_CODE_DISMISSABLE_PANEL: 'command_code_dismissable_panel',
95
+ /**
96
+ * Issue #2761: Command Code's plan review overlay.
97
+ *
98
+ * `Approve ctrl+a executes the plan` / `Cancel esc` under the plan, with a
99
+ * line cursor the arrows move and a comment box every typed character lands
100
+ * in. A member of `SELECTION_LIST_REASONS`: a human has to drive it, the arrow
101
+ * pad is the right control, and `wait` must stop on it (exit 10) rather than
102
+ * poll a blocked agent. Its own token rather than
103
+ * {@link STATUS_REASON.COMMAND_CODE_SELECTION_LIST} so an operator reading
104
+ * `capture --json` can tell "a plan is waiting for approval" from "a picker is
105
+ * open".
106
+ */
107
+ COMMAND_CODE_PLAN_REVIEW: 'command_code_plan_review',
95
108
  COPILOT_SELECTION_LIST: 'copilot_selection_list',
96
109
  CODEX_SELECTION_LIST: 'codex_selection_list',
97
110
  /** Issue #1017: Codex pager / edit-previous (transcript) mode. */
@@ -44,7 +44,7 @@
44
44
  * ESC[1mESC[38;5;6m› 1. Yes, proceed (y)ESC[0m approval option → bold label
45
45
  * ESC[1mESC[38;5;6m› [ ] Network proxy Apply network… /experimental → bold label
46
46
  * ESC[1mESC[38;5;6m› Global - Open Agents unboundESC[0m /keymap → bold label
47
- * ESC[38;5;6m› 1. Yes, continueESC[39m trust dialog → coloured glyph
47
+ * ESC[38;5;6m› 1. Yes, continueESC[39m trust dialog → glyph colour runs into the label
48
48
  * ```
49
49
  *
50
50
  * `composer-residual-leading-number.txt` is the frame that rules out the cheap
@@ -53,9 +53,37 @@
53
53
  * `waiting` — the shape #1883 turned into a send guard that rejected every send.
54
54
  *
55
55
  * {@link readCodexGlyphRowKind} therefore recognises an option **positively**
56
- * (bold label, or a non-default foreground on the glyph) instead of defining it
57
- * as "not the composer". Every unrecognised shape falls to `composer`, which is
58
- * the direction that costs nothing: it is what the code did before #2310.
56
+ * (bold label, or the glyph's colour running on into the label) instead of
57
+ * defining it as "not the composer". Every unrecognised shape falls to
58
+ * `composer`, which is what the code did before #2310.
59
+ *
60
+ * ## codex 0.155.1 colours the composer glyph (Issue #2798)
61
+ *
62
+ * Through 0.154.0 a coloured glyph was only ever a dialog's, so "the glyph has a
63
+ * non-default foreground" was read as an option on its own. 0.155.1 draws the
64
+ * idle composer's glyph bold AND in truecolor orange
65
+ * (`tests/fixtures/codex-idle-composer-0155/`):
66
+ *
67
+ * ```text
68
+ * ESC[1mESC[38;2;255;178;66m›ESC[0m ESC[2mAsk Codex to do anythingESC[0m composer, empty (0.155.1)
69
+ * ```
70
+ *
71
+ * Read by colour alone that is an option, so every finished turn on 0.155.1
72
+ * published `waiting` / `codex_selection_list` next to a `ghost` composer: the
73
+ * chat pane stuck on the selection-list card, `commandmate wait` returned
74
+ * exit 10 instead of completing, and the Pick pad offered the assistant's own
75
+ * numbered paragraphs as choices. What still separates the two is where the
76
+ * colour stops. A dialog paints its highlighted row as ONE span — glyph and
77
+ * label in the same colour, with no attribute change between them — while the
78
+ * composer resets (`ESC[0m`) right after its glyph, on every measured build, so
79
+ * its label carries its own styling or none. The rule therefore reads the
80
+ * colour as option evidence only when the label is drawn in the glyph's colour,
81
+ * and reads a dim label — the composer's placeholder, the same signal
82
+ * `composer-text.ts` calls `ghost` — as the composer before it looks at colour.
83
+ * `codex-pasted-content.capture` (#2464, 0.154.0) is why "the label is coloured
84
+ * too" is not enough: a composer holding pasted text draws its
85
+ * `[Pasted Content …]` label cyan, and on 0.155.1 that label would sit next to
86
+ * an orange glyph.
59
87
  *
60
88
  * ## Why this duplicates a little of `composer-text.ts`
61
89
  *
@@ -84,16 +112,18 @@ exports.CODEX_GLYPH = '›';
84
112
  * The codex build these dialog rules were read off.
85
113
  *
86
114
  * Separate from `CODEX_VERIFIED_AGAINST` on purpose: that stamp is the whole
87
- * detector's (`tools/verified-against.ts`, outside this Issue's scope) and still
88
- * names 0.148.0, while the frames below are 0.153.2. Recording the newer
89
- * measurement here rather than leaving it unrecorded keeps a later reader able
90
- * to tell "this rule is wrong" from "this rule was right for 0.153.2"; the
91
- * detector-wide stamp should be raised to match the next time that file is in
92
- * scope.
115
+ * detector's (`tools/verified-against.ts`). It was held at 0.148.0 while one
116
+ * idle frame of the same 0.155.1 probe was misread for a reason outside these
117
+ * rules — the status-bar boundary — and advanced to 0.155.1 once Issue #2818
118
+ * fixed that boundary. The dialog frames themselves
119
+ * all read correctly on 0.155.1 (Issue #2808, `tests/fixtures/codex-dialogs-0155/`):
120
+ * the command approval, `/model`, `/experimental`, `/keymap` and the
121
+ * directory-trust screen are `waiting`, and every highlighted row is the
122
+ * one-span shape these rules key on. The rules were first read off 0.153.2.
93
123
  */
94
124
  exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
95
- version: '0.153.2',
96
- capturedAt: '2026-09-04',
125
+ version: '0.155.1',
126
+ capturedAt: '2026-09-21',
97
127
  paneGeometry: '200x1000',
98
128
  };
99
129
  /**
@@ -116,12 +146,13 @@ exports.CODEX_DIALOG_RULES_VERIFIED_AGAINST = {
116
146
  * | `Press t to trust all; enter to review hooks; esc to close` | hooks list | both |
117
147
  * | `Press t to trust; esc to go back` | hooks detail | both |
118
148
  * | `Press space to select or enter to save for next conversation` | `/experimental` | 1st |
149
+ * | `Press space to select or enter to save` | `/experimental` (0.155.1) | 1st |
119
150
  * | `left/right group · enter edit shortcut · … · esc close` | `/keymap` | 2nd |
120
151
  *
121
152
  * No `/g` (keeps `.test()` stateless) and no nested quantifiers (ReDoS-safe).
122
153
  */
123
154
  exports.CODEX_DIALOG_FOOTER_PATTERN = /press\s+\S+\s+to\s+\S|esc\s+(?:to\s+)?(?:cancel|close|dismiss|quit|exit|back|go\s+back)/i;
124
- const INITIAL_SGR = { bold: false, dim: false, coloured: false };
155
+ const INITIAL_SGR = { bold: false, dim: false, fg: null };
125
156
  /**
126
157
  * Apply one SGR parameter list to the running attribute state.
127
158
  *
@@ -133,7 +164,7 @@ const INITIAL_SGR = { bold: false, dim: false, coloured: false };
133
164
  */
134
165
  function applySgr(params, state) {
135
166
  const parts = params === '' ? ['0'] : params.split(';');
136
- let { bold, dim, coloured } = state;
167
+ let { bold, dim, fg } = state;
137
168
  for (let i = 0; i < parts.length; i++) {
138
169
  const code = parts[i] === '' ? 0 : Number(parts[i]);
139
170
  if (Number.isNaN(code))
@@ -141,13 +172,9 @@ function applySgr(params, state) {
141
172
  if (code === 38) {
142
173
  const mode = parts[i + 1] === '' || parts[i + 1] === undefined ? -1 : Number(parts[i + 1]);
143
174
  // 5 = 256-colour (one argument), 2 = 24-bit RGB (three arguments).
144
- if (mode === 5)
145
- i += 2;
146
- else if (mode === 2)
147
- i += 4;
148
- else
149
- i += 1;
150
- coloured = true;
175
+ const argCount = mode === 5 ? 2 : mode === 2 ? 4 : 1;
176
+ fg = parts.slice(i + 1, i + 1 + argCount).join(';');
177
+ i += argCount;
151
178
  continue;
152
179
  }
153
180
  if (code === 48 || code === 58) {
@@ -164,7 +191,7 @@ function applySgr(params, state) {
164
191
  if (code === 0) {
165
192
  bold = false;
166
193
  dim = false;
167
- coloured = false;
194
+ fg = null;
168
195
  }
169
196
  else if (code === 1)
170
197
  bold = true;
@@ -175,11 +202,11 @@ function applySgr(params, state) {
175
202
  dim = false;
176
203
  }
177
204
  else if (code === 39)
178
- coloured = false;
205
+ fg = null;
179
206
  else if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97))
180
- coloured = true;
207
+ fg = String(code);
181
208
  }
182
- return { bold, dim, coloured };
209
+ return { bold, dim, fg };
183
210
  }
184
211
  /**
185
212
  * Split one raw pane row into rendered characters tagged with their attributes.
@@ -259,8 +286,21 @@ function readCodexGlyphRowKind(rawRow) {
259
286
  if (glyph.dim)
260
287
  return 'transcript-echo';
261
288
  const label = chars.slice(glyphIndex + 1).find(c => c.ch.trim() !== '');
262
- // Positively recognised: the two shapes every measured dialog row has.
263
- if (label?.attrs.bold || glyph.coloured)
289
+ // A dialog renders its highlighted label bold; composer text never is.
290
+ if (label?.attrs.bold)
291
+ return 'option';
292
+ // Issue #2798: a dim label is the placeholder codex paints into an EMPTY
293
+ // composer (`Ask Codex to do anything`), which is the input box saying so
294
+ // itself. Checked before the colour, because from 0.155.1 on the composer's
295
+ // glyph is coloured too.
296
+ if (label?.attrs.dim)
297
+ return 'composer';
298
+ // Issue #2798: a coloured glyph alone is not a dialog — 0.155.1 draws the idle
299
+ // composer's `›` in orange. A dialog paints glyph and label as one span, so
300
+ // the colour counts only when the label is drawn in the glyph's own colour;
301
+ // the composer resets right after its glyph, and its pasted-content label is
302
+ // cyan, not the glyph's orange.
303
+ if (glyph.fg !== null && label?.attrs.fg === glyph.fg)
264
304
  return 'option';
265
305
  return 'composer';
266
306
  }
@@ -41,10 +41,18 @@ exports.VERIFIED_AGAINST = verified_against_1.CODEX_VERIFIED_AGAINST;
41
41
  */
42
42
  const CODEX_CONFIRMATION_FOOTER_PATTERN = /press\s+(?:number|enter)\s+to\s+confirm/i;
43
43
  const CODEX_NUMBERED_OPTION_PATTERN = /^\s*[❯›●]?\s*\d{1,2}[.)]\s/;
44
- /** Index of the Codex status bar within the last 10 content rows, or -1. */
44
+ /**
45
+ * Index of the Codex status bar within the last 10 content rows, or -1.
46
+ *
47
+ * Issue #2818: a bar carrying a thread title or the Plan-mode badge after the
48
+ * path (codex 0.154.0+) is the same bar, so it is a boundary too. Without it
49
+ * such frames fell to branch D, whose 15-row tail still holds a finished
50
+ * turn's `• Ran …` record, and an idle session read `running`.
51
+ */
45
52
  function findCodexFooterBoundary(contentLines) {
46
53
  for (let ci = contentLines.length - 1; ci >= Math.max(0, contentLines.length - 10); ci--) {
47
- if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(contentLines[ci]))
54
+ const line = contentLines[ci];
55
+ if (cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line) || cli_patterns_1.CODEX_TRAILED_STATUS_BAR_PATTERN.test(line))
48
56
  return ci;
49
57
  }
50
58
  return -1;
@@ -216,7 +224,8 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
216
224
  // prompts high in scrollback to falsely trigger NavigationButtons.
217
225
  //
218
226
  // Issue #1150: the status bar is located via CODEX_STATUS_BAR_PATTERN (version-
219
- // independent; matches both legacy "N% left ·" and v0.141 "model · path" bars).
227
+ // independent; matches both legacy "N% left ·" and v0.141 "model · path" bars),
228
+ // and since #2818 via CODEX_TRAILED_STATUS_BAR_PATTERN too (0.154+ "· <title>").
220
229
  const codexFooterBoundary = findCodexFooterBoundary(contentLines);
221
230
  let codexContentEnd = codexFooterBoundary >= 0 ? codexFooterBoundary - 1 : contentLines.length - 1;
222
231
  while (codexContentEnd >= 0 && contentLines[codexContentEnd].trim() === '') {
@@ -402,6 +411,12 @@ exports.codexStatusDetector = (0, run_detection_1.createToolStatusDetector)({
402
411
  // Claude's interrupt-hint net. Gated so idle frames are unaffected:
403
412
  // only fires when the tail is NOT the idle › prompt, so an idle session still
404
413
  // falls through to the generic composer check.
414
+ //
415
+ // That gate does not hold when the bar is drawn but not recognised: the tail
416
+ // is then the bar, not the `›`, and a finished turn's `• Ran …` record in the
417
+ // 15-row window reads as running. That is how 0.154's titled bar misread
418
+ // idle sessions until #2818 taught findCodexFooterBoundary its shape — the
419
+ // cost of this net whenever codex redraws the bar again.
405
420
  let codexTailIdx = contentLines.length - 1;
406
421
  while (codexTailIdx >= 0 && contentLines[codexTailIdx].trim() === '') {
407
422
  codexTailIdx--;
@@ -95,6 +95,15 @@
95
95
  * reading declines. The move to `beforePrompt` is part of that: see the branch
96
96
  * for why the generic parser must not get this frame either before or after.
97
97
  *
98
+ * Issue #2761 put a second reading in `beforePrompt`, ahead of that one: the
99
+ * plan review overlay (1.58.0), identified by `Approve ctrl+a` / `Cancel esc`.
100
+ * It is there for the same reason — the shared parser must not get the frame —
101
+ * but for a different hazard: the rows above its footer are the plan itself, and
102
+ * a plan that ends in `(y/n)` reads as a yes/no prompt. Issue #2793 extended that
103
+ * reading to the two states of the overlay #2763 measured and #2761 had not seen:
104
+ * the action list focused (`❯ Approve ctrl+a`), and the radio `ctrl+a` asks
105
+ * with comments pending.
106
+ *
98
107
  * ## What #2304 re-measured, and what it did not change
99
108
  *
100
109
  * Nothing here changed, and that is the finding. Seven frames were captured
@@ -138,6 +147,43 @@ exports.commandCodeStatusDetector = (0, run_detection_1.createToolStatusDetector
138
147
  tool: 'command-code',
139
148
  verifiedAgainst: exports.VERIFIED_AGAINST,
140
149
  beforePrompt(frame) {
150
+ // Issue #2761. The plan review overlay, read off its two footer rows.
151
+ //
152
+ // `beforePrompt` and not `afterPrompt`, and that placement is the point: the
153
+ // rows above the footer are the PLAN — free text the agent wrote — and the
154
+ // last eight of them sit inside the 15-row window the shared parser reads.
155
+ // A plan whose last line is `Do you want to proceed? (y/n)` or `Approve?` is
156
+ // read by that parser as a yes/no prompt (measured), which publishes
157
+ // `hasActivePrompt: true` and lets Auto-Yes type `y` — into the plan, as a
158
+ // comment. So this screen must be claimed before the parser sees it.
159
+ //
160
+ // `waiting` + the selection-list family: the arrows move a line cursor, a
161
+ // human has to decide, and nothing on this pane moves until they do.
162
+ // `hasActivePrompt: false` — there is no payload to answer with, and approval
163
+ // is never something Auto-Yes may do on its own.
164
+ //
165
+ // Issue #2793 widened what "this screen" covers, on two frames each that
166
+ // #2763 measured and this branch had missed:
167
+ //
168
+ // - **the action list focused** (`❯ Approve ctrl+a` / `❯ Cancel esc`).
169
+ // The footer pattern now takes the `❯` on either row. Missing it was a
170
+ // false completion, not a gap: the frame fell through to the composer
171
+ // check, `COMMAND_CODE_PROMPT_PATTERN` read the `❯` row as the composer,
172
+ // and `wait` exited 0 on a plan nobody had approved;
173
+ // - **the approve-with-comments radio** `ctrl+a` opens when comments are
174
+ // pending (`←/→ choose · enter confirm · esc back`). The same verdict: it is
175
+ // the same overlay, still waiting on a human's decision about the plan,
176
+ // and the arrow pad (`◀` `▶` `Enter` `Esc`) is exactly what it asks for.
177
+ if (selection_shape_1.COMMAND_CODE_PLAN_REVIEW_FOOTER.test(frame.lastLines) ||
178
+ (0, selection_shape_1.isCommandCodePlanApproveChoice)(frame.lastLines)) {
179
+ return {
180
+ status: 'waiting',
181
+ confidence: 'high',
182
+ reason: status_reason_1.STATUS_REASON.COMMAND_CODE_PLAN_REVIEW,
183
+ hasActivePrompt: false,
184
+ evidence: 'positive',
185
+ };
186
+ }
141
187
  // Issue #2521 recognised this screen; Issue #2522 reads it.
142
188
  //
143
189
  // `AskUserQuestion` draws no footer, so neither `afterPrompt` branch below
@@ -139,19 +139,57 @@ const COMMAND_CODE_FREE_TEXT_OPTION_PATTERN = /^[^\S\n]*type\s+something\b/i;
139
139
  /**
140
140
  * A checkbox option — the row shape of a MULTI-select question.
141
141
  *
142
- * The same expression `prompt-answer-sender` and `prompt-answer-semantic` use to
143
- * recognise one, restated here (both are private to their modules) because this
144
- * reader has to DECLINE the screen rather than answer it: 対象外 says Review,
145
- * multi-select and free-text screens are not to be pushed through the
146
- * single-select parser, and the reason is mechanical. On a checkbox list the
147
- * digit TOGGLES a box and the confirm is a separate `Next` row, so a payload
148
- * that claimed "option 2 is the answer" would have `respond 2` tick a box and
149
- * stop — leaving the question up and the operator told it was answered.
150
- *
151
- * `unsupported` rather than `none`: the screen IS a live question and the human
152
- * has to be sent to the pane for it, which is exactly #2521's fallback.
142
+ * Issue #2522 used this to DECLINE the screen: on a checkbox list the digit
143
+ * toggles a box and the confirm is a separate `Submit` / `Next` row, so a
144
+ * payload claiming "option 2 is the answer" had `respond 2` tick a box and stop,
145
+ * leaving the question up and the operator told it was answered.
146
+ *
147
+ * Issue #2755 turns it into a READING instead. The prefix is stripped off the
148
+ * label, the ticked rows are reported as {@link MultipleChoiceOption.checked},
149
+ * and the payload says `multiSelect: true` so that every consumer that turns a
150
+ * number into keys branches on it. The decline survives for the one screen that
151
+ * still cannot be answered — a checkbox list with no confirm row, where nothing
152
+ * measured says how the question is committed.
153
+ *
154
+ * Three tick glyphs, all measured: `[x]` on the 1.54.1 capture #2753 was raised
155
+ * from, `[✔]` (U+2714) across #2754's twenty-six, and `[X]` because the two
156
+ * differ only in case and a build that switches is not worth a second Issue.
157
+ */
158
+ const CHECKBOX_OPTION_PATTERN = /^\[[ xX\u2714]\]\s/;
159
+ /** The tick half of {@link CHECKBOX_OPTION_PATTERN}: a box that is ON. */
160
+ const CHECKBOX_TICKED_PATTERN = /^\[[xX\u2714]\]\s/;
161
+ /**
162
+ * The confirm row of a multi-select question (Issue #2755).
163
+ *
164
+ * `Submit` on the last question of a call, `Next` on every other one, measured
165
+ * on 1.54.1. It carries NO number — the strict `1.`…`N.` run ends one row above
166
+ * it — and it is the row `findNumberedOptionBlock` files as `footer` and this
167
+ * module used to fold into the bottom option's label:
168
+ *
169
+ * options[4].label = "[ ] Type something... Submit Enter to select | …"
170
+ *
171
+ * The cursor glyph is optional and is the reason this is not
172
+ * `/^\s*Submit\s*$/`: 1.54.1 draws `❯ Submit` the moment the cursor parks
173
+ * there (#2754 実測 1), and a pattern that missed that spelling would fold the
174
+ * row back into the label on exactly the frames #2755 exists for.
175
+ */
176
+ const COMMAND_CODE_CONFIRM_ROW_PATTERN = /^[^\S\n]*(?:\u276F[^\S\n]*)?(?:Submit|Next)[^\S\n]*$/;
177
+ /**
178
+ * 1.54.1's hint bar, which is not part of any option either (Issue #2755).
179
+ *
180
+ * Enter to select | Arrow keys to navigate | 1-9 quick select | n notes | c chat | Esc to cancel
181
+ *
182
+ * Drawn only when the call carries more than one question (#2754 実測 3), which
183
+ * is why it is NOT used as evidence that this screen is up — the most dangerous
184
+ * spelling, one question with the cursor on `Submit`, draws no footer at all.
185
+ * It is read here for the one thing it is good for: keeping it out of the last
186
+ * option's label, where the tail walk would otherwise put it along with its
187
+ * `requiresTextInput` flag.
188
+ *
189
+ * Distinct from {@link COMMAND_CODE_SELECTION_LIST_FOOTER}, which is the `·`
190
+ * separated picker footer and is left exactly as #2753 left it.
153
191
  */
154
- const CHECKBOX_OPTION_PATTERN = /^\[[ x]\]\s/i;
192
+ const COMMAND_CODE_QUESTION_HINT_BAR_PATTERN = /^[^\S\n]*Enter\s+to\s+select\b.*\|.*\bEsc\s+to\s+cancel[^\S\n]*$/i;
155
193
  /**
156
194
  * The same tail limits `prompt-detector.ts` applies to `rawContent`
157
195
  * (`RAW_CONTENT_MAX_LINES` / `RAW_CONTENT_MAX_CHARS`), restated because that
@@ -182,6 +220,13 @@ function unsupported(reason) {
182
220
  function readCommandCodeQuestionDialog(frame) {
183
221
  if (!frame)
184
222
  return { kind: 'none' };
223
+ // Issue #2755 §7: the Review page, before the question reading, because the
224
+ // two are told apart by what the rows SAY and not by their shape. Declined
225
+ // outright — see `'review-page'` — so neither this reader nor, through
226
+ // `beforePrompt`'s fallback verdict, the generic parser can turn `1. Submit`
227
+ // into an answerable default.
228
+ if ((0, selection_shape_1.readCommandCodeReviewPage)(frame) !== null)
229
+ return unsupported('review-page');
185
230
  // The positive recognition is #2521's, unchanged and not re-derived: the last
186
231
  // qualifying rule row, a tab strip under it, a question, a strict `1.`…`N.`
187
232
  // run and exactly one `❯` on one of its rows, with the pickers and panels the
@@ -199,6 +244,13 @@ function readCommandCodeQuestionDialog(frame) {
199
244
  ? unsupported('numbering-unreadable')
200
245
  : { kind: 'none' };
201
246
  }
247
+ // Issue #2755 §2 / §8. The region is this screen and the `❯` is not on a
248
+ // numbered row: `Submit`, `Next` or the `notes:` input. Nothing here can be
249
+ // answered — the digits are dead while the cursor is off the list — but the
250
+ // pane is a live question, so it takes #2521's manual-operation fallback and
251
+ // NOT the `ready` the composer check would otherwise publish off `❯ Submit`.
252
+ if (!region.cursorOnOptionRow)
253
+ return unsupported('cursor-outside-options');
202
254
  const lines = frame.replace(/\r\n/g, '\n').split('\n').map(ansi_1.stripAnsi);
203
255
  const regionRows = lines.slice(region.firstLineIndex, region.lastLineIndex + 1);
204
256
  if (regionRows.length > exports.COMMAND_CODE_QUESTION_MAX_REGION_ROWS) {
@@ -213,16 +265,32 @@ function readCommandCodeQuestionDialog(frame) {
213
265
  if (block === null)
214
266
  return unsupported('option-block-unreadable');
215
267
  const labels = [...block.options];
216
- if (block.footer !== '') {
217
- // Rows below the bottom option. The region's lower edge is the last row with
218
- // content and this screen draws no footer, so they are that option's own
219
- // description.
268
+ // Rows below the bottom option. On 1.53.0 there were none but a wrapped
269
+ // description, which 確定仕様 A folds into that option. 1.54.1 draws two rows
270
+ // that are NOT anybody's description — the `Submit` / `Next` confirm and the
271
+ // hint bar — and folding them produced the label #2754 recorded:
272
+ //
273
+ // "[ ] Type something... Submit Enter to select | Arrow keys to navigate | …"
274
+ //
275
+ // Issue #2755 takes them out here rather than in `findNumberedOptionBlock`:
276
+ // that reader is shared by every tool's `prompt.ts`, and what a row below the
277
+ // last option MEANS is exactly the per-tool knowledge a tool module owns.
278
+ const tailRows = block.footer === '' ? [] : block.footer.split('\n');
279
+ const hasConfirmRow = tailRows.some((row) => COMMAND_CODE_CONFIRM_ROW_PATTERN.test(row));
280
+ const description = tailRows.filter((row) => !COMMAND_CODE_CONFIRM_ROW_PATTERN.test(row) &&
281
+ !COMMAND_CODE_QUESTION_HINT_BAR_PATTERN.test(row));
282
+ if (description.length > 0) {
220
283
  const last = labels.length - 1;
221
- labels[last] = [labels[last], ...block.footer.split('\n')].join(' ').trim();
284
+ labels[last] = [labels[last], ...description].join(' ').trim();
222
285
  }
223
286
  if (labels.length !== region.optionCount)
224
287
  return unsupported('option-count-mismatch');
225
- if (labels.some((label) => CHECKBOX_OPTION_PATTERN.test(label)))
288
+ // Issue #2755: a checkbox list is READ rather than declined — but only when
289
+ // the screen also draws the row that commits it. Without one, the digit
290
+ // toggles a box and nothing on this frame says what finishes the question, so
291
+ // #2522's decline stands.
292
+ const multiSelect = labels.some((label) => CHECKBOX_OPTION_PATTERN.test(label));
293
+ if (multiSelect && !hasConfirmRow)
226
294
  return unsupported('multi-select');
227
295
  // The default. Not `selectedGlyph` alone: `findNumberedOptionBlock`'s glyph
228
296
  // union is `[❯›●>]` because it serves every CLI, and `●` is this screen's TAB
@@ -259,11 +327,25 @@ function readCommandCodeQuestionDialog(frame) {
259
327
  // matters is that the descriptions are inside both: a deny pattern has to see
260
328
  // the sentence the option is actually promising.
261
329
  const dialogText = (0, prompt_detect_multiple_choice_1.joinApprovalTarget)(regionRows, tabOffset + 1, regionRows.length);
262
- const built = (0, prompt_detect_multiple_choice_1.buildMultipleChoiceResult)(question, labels.map((label, index) => ({
330
+ // Issue #2755: the checkbox comes OFF the label and becomes state. A label
331
+ // that still read `[ ] calc.js` is what a user reported as "cannot pick more
332
+ // than one" (#2753's capture), and it is also what every label-matching
333
+ // consumer downstream — the deny patterns, `respond`'s semantic resolution,
334
+ // the answer panels — would have had to learn to strip for itself.
335
+ //
336
+ // `checked` is written on BOTH states of a multi-select row, because the
337
+ // sender computes a symmetric difference against it and "absent" would be
338
+ // indistinguishable from "unticked" at the one place the distinction decides
339
+ // whether a box is turned OFF. On a single-select row it is written on
340
+ // neither: 受入基準 (a) pins those payloads with `toStrictEqual`, and an
341
+ // added `checked: false` is exactly the drift that pin exists to catch.
342
+ const readOptions = labels.map((label, index) => ({
263
343
  number: index + 1,
264
- label,
344
+ label: multiSelect ? label.replace(CHECKBOX_OPTION_PATTERN, '') : label,
265
345
  isDefault: index === block.selectedIndex,
266
- })), { instructionText: dialogText, approvalTarget: dialogText }, regionRows.join('\n'), truncateRawContent,
346
+ ...(multiSelect ? { checked: CHECKBOX_TICKED_PATTERN.test(label) } : {}),
347
+ }));
348
+ const built = (0, prompt_detect_multiple_choice_1.buildMultipleChoiceResult)(question, readOptions, { instructionText: dialogText, approvalTarget: dialogText }, regionRows.join('\n'), truncateRawContent,
267
349
  // 確定仕様 D. The measured `QuestionPrompt` hands the ordinary choices to a
268
350
  // `SelectInput`, which calls `onSelect` on the DIGIT — so a trailing Enter
269
351
  // would land on whatever the tool painted next (the following question, or
@@ -290,10 +372,19 @@ function readCommandCodeQuestionDialog(frame) {
290
372
  ...built,
291
373
  promptData: {
292
374
  ...promptData,
293
- options: promptData.options.map((option) => option.requiresTextInput === true ||
294
- COMMAND_CODE_FREE_TEXT_OPTION_PATTERN.test(option.label)
295
- ? { ...option, requiresTextInput: true }
296
- : option),
375
+ // Only ever added, never set to `false`: see the `checked` note above.
376
+ ...(multiSelect ? { multiSelect: true } : {}),
377
+ // `buildMultipleChoiceResult` rebuilds every option from the three
378
+ // fields it takes, so `checked` is re-applied here rather than trusted
379
+ // to survive the shared builder (Issue #2755).
380
+ options: promptData.options.map((option, index) => {
381
+ const checked = readOptions[index]?.checked;
382
+ const withState = checked === undefined ? option : { ...option, checked };
383
+ return option.requiresTextInput === true ||
384
+ COMMAND_CODE_FREE_TEXT_OPTION_PATTERN.test(option.label)
385
+ ? { ...withState, requiresTextInput: true }
386
+ : withState;
387
+ }),
297
388
  },
298
389
  },
299
390
  };
@@ -33,10 +33,37 @@ exports.CLAUDE_VERIFIED_AGAINST = {
33
33
  capturedAt: '2026-08-23',
34
34
  paneGeometry: '200x1000',
35
35
  };
36
- /** codex-cli these rules were read off (#1628 / #1829 / #1890 fixtures). */
36
+ /**
37
+ * codex-cli these rules were read off (#1628 / #1829 / #1890 fixtures; re-read
38
+ * on 0.155.1 by #2808 / #2818).
39
+ *
40
+ * ## Held back by Issue #2808, advanced to 0.155.1 by Issue #2818
41
+ *
42
+ * #2808 re-captured codex **0.155.1** on a private tmux socket at 200x1000
43
+ * (`tests/fixtures/codex-dialogs-0155/`, 2026-09-21): the command approval,
44
+ * `/model`, `/experimental`, `/keymap` and the directory-trust screen all read
45
+ * `waiting`, each highlighted row the same one-span shape as the 0.146.0-0.153.2
46
+ * captures, and the idle composers read `ready`. The stamp stayed at 0.148.0
47
+ * because one frame of that probe was misread: the idle composer after a
48
+ * declined approval read `running`. From 0.154.0 on the status bar carries the
49
+ * thread's title after the path, `CODEX_STATUS_BAR_PATTERN` wants the path last,
50
+ * so the detector found no bar and its bar-independent branch D read the
51
+ * declined command's lingering `• Ran` row in the 15-row tail.
52
+ *
53
+ * #2818 made the titled bar a boundary (`CODEX_TRAILED_STATUS_BAR_PATTERN`) and
54
+ * probed 0.155.1 again on its own socket (`tests/fixtures/codex-thread-title-probe/`,
55
+ * 2026-09-21): a turn running `sleep 30` under a titled bar, the same turn after
56
+ * the command finished and codex was still working, and the idle composer once
57
+ * it had answered — the last with the `• Ran sleep 30` row still in the tail,
58
+ * which read `running` before the fix. The two running frames read `running`,
59
+ * both idle frames read `ready`, and no other frame in the tree changed its
60
+ * verdict. **The stamp moved to 0.155.1 because every 0.155.1 frame now reads
61
+ * correctly** (`codex-thread-title-bar-2818.test.ts`,
62
+ * `codex-dialogs-0155-2808.test.ts`).
63
+ */
37
64
  exports.CODEX_VERIFIED_AGAINST = {
38
- version: '0.148.0',
39
- capturedAt: '2026-08-15',
65
+ version: '0.155.1',
66
+ capturedAt: '2026-09-21',
40
67
  paneGeometry: '200x1000',
41
68
  };
42
69
  /**
@@ -140,10 +167,52 @@ exports.ANTIGRAVITY_VERIFIED_AGAINST = {
140
167
  * `detectDialog` declares. The rule itself was read off the 1.40.1 and 1.49.0
141
168
  * dialog frames above, and no 1.53.1 frame was added to the fixture directory,
142
169
  * so the condition in the previous paragraph is still unmet.
170
+ *
171
+ * ## Held back by Issue #2754, advanced to 1.54.1 by Issue #2773
172
+ *
173
+ * #2754 finally did the probe the paragraph above asked for: a live **1.54.1**
174
+ * session on a private tmux socket at 200x1000, twenty-six captures in
175
+ * `tests/fixtures/command-code-askuserquestion-2754/` (`capturedAt` is the day
176
+ * that probe ran, 2026-09-20), and every key in the screen's footer sent ONE AT
177
+ * A TIME with a capture on each side of it. By the letter of that paragraph the
178
+ * stamp could have moved then. It did not, because what the probe measured was
179
+ * that **the rules did not answer for 1.54.1**: nine of the 26 captures came out
180
+ * wrong, and six of those published `ready` / `input_prompt` for a live,
181
+ * unanswered question — #2521's 偽完了 on a real capture. Stamping 1.54.1 over
182
+ * frames the rules demonstrably misread would have made the probe report a
183
+ * measurement that said the opposite of what was measured — the fail-open
184
+ * version of the #2304 precedent rather than an application of it.
185
+ *
186
+ * The defects it found were closed one Issue at a time:
187
+ *
188
+ * - **#2753** added `COMMAND_CODE_TAB_ANSWERED_MARKERS` (`✔`, U+2714), so a
189
+ * strip like `✔ Party size | ● Update scope | ◯ Review` passes
190
+ * `isCommandCodeQuestionTabRow` and eight frames left the generic parser;
191
+ * - **#2755** closed the rest: (a) a `❯` outside the option list (`❯ Submit`,
192
+ * `❯ Next`, `❯ notes:`) is named `cursor-outside-options` and hands the human
193
+ * the screen instead of publishing `ready`; (b) the Review page is named
194
+ * `review-page` and publishes no payload, so its default can no longer COMMIT
195
+ * the answers; (c) checkbox lists (`1. [ ] …` / `Submit`) are read as
196
+ * multi-select with the box off the label and the 1.54.1 footer off the last
197
+ * option.
198
+ *
199
+ * **The stamp moved to 1.54.1 because all twenty-six frames now read correctly**
200
+ * (`askuserquestion-1541-2754.test.ts` pins each): fifteen publish an answerable
201
+ * payload, six are `cursor-outside-options` and two are `review-page` (both
202
+ * decline on purpose — a human is sent to the screen, Auto-Yes has nothing to
203
+ * send), two are `ready` because the question is gone, and one is `running`
204
+ * because it was caught mid-turn. False completions went from six to zero.
205
+ * The rules were re-read off THESE frames, so 1.54.1 is the build they were read
206
+ * off — not the build that happens to be installed. `getDetectorFreshness`
207
+ * compares this stamp with the CLI installed now and will say `stale` once that
208
+ * is newer, which is the probe doing its job.
209
+ *
210
+ * This stamp answers "which build were these rules read off", and
211
+ * {@link getDetectorFreshness} turns it into "are they current".
143
212
  */
144
213
  exports.COMMAND_CODE_VERIFIED_AGAINST = {
145
- version: '1.40.1',
146
- capturedAt: '2026-09-03',
214
+ version: '1.54.1',
215
+ capturedAt: '2026-09-20',
147
216
  paneGeometry: '200x1000',
148
217
  };
149
218
  /**
@@ -9,12 +9,27 @@
9
9
  * known prompt footers, excludes overlays rendered below the active prompt.
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.isClaudeFooter = isClaudeFooter;
12
13
  exports.normalizeTuiFrameForDetection = normalizeTuiFrameForDetection;
13
- const CLAUDE_PROMPT_FOOTER_PATTERN = /Esc\s+to\s+cancel\s*[·•]\s*Tab\s+to\s+amend/i;
14
- const CLAUDE_PICKER_FOOTER_PATTERN = /Enter\s+to\s+select\b.*\bnavigate\b/i;
14
+ // A real footer starts its row: in every capture measured for Issue 2776 only
15
+ // whitespace precedes it (plus one SGR colour sequence in a raw capture), while
16
+ // every measured quote of it has visible text first (`「`, `- Approval footer: `,
17
+ // `navigate · `). A quote above the live prompt otherwise cut the frame at the
18
+ // quote (Issue 2774: 963 of 1002 rows). The row end is NOT anchored: real
19
+ // footers go on with more key hints (` · Esc to cancel`, ` · ctrl+e to explain`).
20
+ // Position and discard-size limits were measured and rejected — see
21
+ // docs/design/tui-frame-footer-scan-2776.md.
22
+ const CLAUDE_PROMPT_FOOTER_PATTERN = /^(?:\s|\x1b\[[0-9;]*m)*Esc\s+to\s+cancel\s*[·•]\s*Tab\s+to\s+amend/i;
23
+ const CLAUDE_PICKER_FOOTER_PATTERN = /^(?:\s|\x1b\[[0-9;]*m)*Enter\s+to\s+select\b.*\bnavigate\b/i;
15
24
  // A prompt/thinking/input anchor below a footer means that footer belongs to an
16
25
  // older frame. Task-panel rows intentionally do not match these patterns.
17
- const CLAUDE_LOWER_INTERACTIVE_ANCHOR = /^\s*[>❯]\s*(?:\d{1,2}[.)])?|esc\s+to\s+interrupt|[✻✽✶✢✳⦿◉●⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s+.+…/i;
26
+ // `›` (U+203A) is codex's composer glyph. Without it, a line anywhere in the
27
+ // transcript that merely QUOTES a picker footer truncates the frame at that
28
+ // line and the live composer below it is discarded — the agent then reads as
29
+ // `running` / `default` forever (Issue 2774). The other six tools draw
30
+ // `>` or `❯`, so this class is what they are already covered by.
31
+ const CLAUDE_LOWER_INTERACTIVE_ANCHOR = /^\s*[>❯›]\s*(?:\d{1,2}[.)])?|esc\s+to\s+interrupt|[✻✽✶✢✳⦿◉●⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏]\s+.+…/i;
32
+ /** Whether `line` is one of Claude's prompt/picker footer rows (not a quote of one). */
18
33
  function isClaudeFooter(line) {
19
34
  return CLAUDE_PROMPT_FOOTER_PATTERN.test(line) || CLAUDE_PICKER_FOOTER_PATTERN.test(line);
20
35
  }
@@ -4,6 +4,8 @@
4
4
  *
5
5
  * Base rules (unchanged since Issue #479):
6
6
  * - yes/no prompt -> 'y'
7
+ * - multiple_choice with `multiSelect: true` -> null (Issue #2755: the number
8
+ * ticks a box, the confirm is a separate row, so a default is half an answer)
7
9
  * - multiple_choice with default option -> default option number
8
10
  * - multiple_choice without default -> first option number
9
11
  * - option requiring text input -> null (skip)
@@ -45,6 +47,12 @@ function resolveBaseAnswer(promptData) {
45
47
  return 'y';
46
48
  }
47
49
  if (promptData.type === 'multiple_choice') {
50
+ // Issue #2755: a checkbox question. A number ticks a box and the confirm is
51
+ // a separate row, so "the default option" is not an answer — it is half of
52
+ // one. Auto-Yes refuses the prompt instead of ticking something and stopping.
53
+ if (promptData.multiSelect === true) {
54
+ return null;
55
+ }
48
56
  const defaultOpt = promptData.options.find(o => o.isDefault);
49
57
  const target = defaultOpt ?? promptData.options[0];
50
58
  if (!target) {