commandmate 0.47.2 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +180 -180
  3. package/.next/app-path-routes-manifest.json +30 -30
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route.js +3 -3
  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_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  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 +2 -2
  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 +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  34. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/escalation/route.js +1 -1
  38. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/vapid/route.js +1 -1
  41. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  43. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  44. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/relays/route.js +1 -1
  46. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  47. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  51. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/repositories/clone/route.js +1 -1
  54. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  55. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/restore/route.js +1 -1
  58. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  59. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/route.js +1 -1
  61. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  62. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/scan/route.js +1 -1
  64. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  65. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/sync/route.js +1 -1
  67. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  71. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  72. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  89. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  92. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  95. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  101. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  104. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  135. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  138. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  141. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  157. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  191. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/route.js +1 -1
  212. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  218. package/.next/server/app/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  221. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/sessions/page.js +1 -1
  223. package/.next/server/app/sessions/page.js.nft.json +1 -1
  224. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  225. package/.next/server/app/skills/[skillId]/page.js +1 -1
  226. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  227. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  230. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  231. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  232. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  233. package/.next/server/app/worktrees/[id]/page.js +12 -12
  234. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  235. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app-paths-manifest.json +30 -30
  238. package/.next/server/chunks/1191.js +11 -4
  239. package/.next/server/chunks/1501.js +1 -1
  240. package/.next/server/chunks/1601.js +2 -2
  241. package/.next/server/chunks/1656.js +2 -2
  242. package/.next/server/chunks/1945.js +3 -3
  243. package/.next/server/chunks/1990.js +103 -0
  244. package/.next/server/chunks/2069.js +1 -0
  245. package/.next/server/chunks/2119.js +1 -1
  246. package/.next/server/chunks/2404.js +1 -1
  247. package/.next/server/chunks/2422.js +1 -1
  248. package/.next/server/chunks/2445.js +1 -1
  249. package/.next/server/chunks/2534.js +1 -1
  250. package/.next/server/chunks/255.js +1 -1
  251. package/.next/server/chunks/3241.js +1 -1
  252. package/.next/server/chunks/3505.js +2 -2
  253. package/.next/server/chunks/4243.js +1 -1
  254. package/.next/server/chunks/4248.js +1 -1
  255. package/.next/server/chunks/4280.js +1 -0
  256. package/.next/server/chunks/5209.js +1 -1
  257. package/.next/server/chunks/6119.js +1 -1
  258. package/.next/server/chunks/6130.js +1 -1
  259. package/.next/server/chunks/6401.js +1 -1
  260. package/.next/server/chunks/6486.js +9 -8
  261. package/.next/server/chunks/6781.js +1 -1
  262. package/.next/server/chunks/720.js +103 -0
  263. package/.next/server/chunks/7604.js +2 -0
  264. package/.next/server/chunks/7905.js +1 -1
  265. package/.next/server/chunks/8581.js +8 -8
  266. package/.next/server/chunks/8728.js +3 -3
  267. package/.next/server/chunks/8791.js +1 -1
  268. package/.next/server/chunks/8807.js +19 -18
  269. package/.next/server/chunks/8918.js +2 -104
  270. package/.next/server/chunks/936.js +1 -1
  271. package/.next/server/chunks/9390.js +1 -1
  272. package/.next/server/chunks/9540.js +1 -1
  273. package/.next/server/chunks/9627.js +5 -5
  274. package/.next/server/chunks/9731.js +2 -2
  275. package/.next/server/middleware-manifest.json +5 -5
  276. package/.next/server/pages/500.html +1 -1
  277. package/.next/server/server-reference-manifest.json +1 -1
  278. package/.next/static/chunks/1128-914c559913546bbc.js +1 -0
  279. package/.next/static/chunks/{2407-a6533805a86d05bd.js → 2407-ab92ae9837c39dce.js} +1 -1
  280. package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-7173dc305dffc4f6.js} +1 -1
  281. package/.next/static/chunks/6288-6fadbba6e84393b2.js +1 -0
  282. package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +1 -0
  283. package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
  284. package/.next/static/chunks/9079-987939d231704218.js +1 -0
  285. package/.next/static/chunks/app/{layout-538d8d2746ad1588.js → layout-aa8e66164a4367af.js} +1 -1
  286. package/.next/static/chunks/app/sessions/page-cfd645305e25fd33.js +1 -0
  287. package/.next/static/chunks/app/skills/[skillId]/{page-52ba58712faf3378.js → page-cb6e74fd9a6a571d.js} +1 -1
  288. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-704086656fb45699.js +1 -0
  289. package/.next/static/chunks/app/worktrees/[id]/page-a8d7886703ffc7b4.js +1 -0
  290. package/.next/static/css/{743f79ff19ab91e9.css → db8959555c3d9c96.css} +1 -1
  291. package/.next/trace +13 -13
  292. package/dist/cli/commands/auto-yes.d.ts +24 -0
  293. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  294. package/dist/cli/commands/auto-yes.js +76 -8
  295. package/dist/cli/commands/capture.d.ts.map +1 -1
  296. package/dist/cli/commands/capture.js +5 -0
  297. package/dist/cli/commands/instances.d.ts.map +1 -1
  298. package/dist/cli/commands/instances.js +10 -1
  299. package/dist/cli/commands/prompt.d.ts.map +1 -1
  300. package/dist/cli/commands/prompt.js +5 -3
  301. package/dist/cli/commands/send.d.ts.map +1 -1
  302. package/dist/cli/commands/send.js +19 -6
  303. package/dist/cli/commands/verify.d.ts.map +1 -1
  304. package/dist/cli/commands/verify.js +8 -1
  305. package/dist/cli/commands/wait.d.ts.map +1 -1
  306. package/dist/cli/commands/wait.js +101 -13
  307. package/dist/cli/config/duration-constants.d.ts +16 -13
  308. package/dist/cli/config/duration-constants.d.ts.map +1 -1
  309. package/dist/cli/config/duration-constants.js +21 -21
  310. package/dist/cli/docs/agent-operations.d.ts +2 -2
  311. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  312. package/dist/cli/docs/agent-operations.js +29 -1
  313. package/dist/cli/types/api-responses.d.ts +145 -3
  314. package/dist/cli/types/api-responses.d.ts.map +1 -1
  315. package/dist/cli/types/index.d.ts +4 -0
  316. package/dist/cli/types/index.d.ts.map +1 -1
  317. package/dist/cli/utils/resource-resolvers.d.ts +0 -18
  318. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
  319. package/dist/cli/utils/resource-resolvers.js +1 -51
  320. package/dist/cli/utils/verify-runner.d.ts +24 -1
  321. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  322. package/dist/cli/utils/verify-runner.js +54 -1
  323. package/dist/config/auto-yes-duration.d.ts +56 -0
  324. package/dist/config/auto-yes-duration.d.ts.map +1 -0
  325. package/dist/config/auto-yes-duration.js +76 -0
  326. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +54 -2
  327. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  328. package/dist/lib/polling/auto-yes-suppression-reason.js +33 -2
  329. package/dist/lib/prompt-observation/types.d.ts +13 -0
  330. package/dist/lib/prompt-observation/types.d.ts.map +1 -1
  331. package/dist/server/locales/en/worktree.json +2 -1
  332. package/dist/server/locales/ja/worktree.json +2 -1
  333. package/dist/server/src/config/auto-yes-config.js +14 -19
  334. package/dist/server/src/config/auto-yes-duration.js +76 -0
  335. package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
  336. package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
  337. package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
  338. package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
  339. package/dist/server/src/lib/auto-yes-poller.js +337 -376
  340. package/dist/server/src/lib/auto-yes-state.js +59 -4
  341. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +235 -19
  342. package/dist/server/src/lib/db/chat-db.js +5 -1
  343. package/dist/server/src/lib/db/verification-db.js +23 -2
  344. package/dist/server/src/lib/detection/composer-text.js +215 -11
  345. package/dist/server/src/lib/detection/option-recommendation.js +120 -0
  346. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
  347. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-chrome.js +193 -0
  348. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +402 -539
  349. package/dist/server/src/lib/detection/prompt-detector.js +92 -21
  350. package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
  351. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
  352. package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
  353. package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
  354. package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
  355. package/dist/server/src/lib/detection/upstream-faults.js +19 -2
  356. package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
  357. package/dist/server/src/lib/hooks/permission-decision-service.js +7 -0
  358. package/dist/server/src/lib/hooks/structured-decision-response.js +1 -1
  359. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
  360. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +3 -0
  361. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +34 -3
  362. package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
  363. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
  364. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
  365. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +124 -0
  366. package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
  367. package/dist/server/src/lib/polling/auto-yes-policy.js +11 -5
  368. package/dist/server/src/lib/polling/auto-yes-poller-capture.js +15 -2
  369. package/dist/server/src/lib/polling/auto-yes-poller-generation.js +42 -1
  370. package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +42 -5
  371. package/dist/server/src/lib/polling/auto-yes-poller-state.js +147 -49
  372. package/dist/server/src/lib/polling/auto-yes-poller-steps.js +172 -2
  373. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +2 -2
  374. package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
  375. package/dist/server/src/lib/polling/auto-yes-resolver.js +96 -21
  376. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +33 -2
  377. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
  378. package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
  379. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
  380. package/dist/server/src/lib/polling/response-checker.js +145 -58
  381. package/dist/server/src/lib/prompt-answer-sender.js +104 -10
  382. package/dist/server/src/lib/push/notification-dedup.js +15 -2
  383. package/dist/server/src/lib/push/prompt-card-state.js +140 -19
  384. package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
  385. package/dist/server/src/lib/push/push-sender.js +23 -3
  386. package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
  387. package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
  388. package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
  389. package/dist/server/src/lib/session/agent-event-state.js +25 -5
  390. package/dist/server/src/lib/session/agent-event-turn.js +140 -46
  391. package/dist/server/src/lib/session/cli-session.js +21 -2
  392. package/dist/server/src/lib/session/composer-clear.js +56 -4
  393. package/dist/server/src/lib/session/current-output-builder.js +66 -12
  394. package/dist/server/src/lib/session/send-attempt-state.js +24 -7
  395. package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
  396. package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
  397. package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
  398. package/dist/server/src/lib/session/waiting-episode-state-ops.js +152 -0
  399. package/dist/server/src/lib/session/waiting-episode-state-store.js +202 -0
  400. package/dist/server/src/lib/session/waiting-episode-state-types.js +6 -0
  401. package/dist/server/src/lib/session/waiting-episode-state.js +68 -91
  402. package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
  403. package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
  404. package/dist/server/src/lib/tmux/tmux.js +79 -9
  405. package/dist/server/src/lib/verification/gate-runner.js +172 -16
  406. package/dist/server/src/lib/verification/machine-lock.js +5 -0
  407. package/dist/server/src/lib/ws-server.js +18 -3
  408. package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
  409. package/dist/server/src/types/auto-yes-decision.js +61 -0
  410. package/dist/server/src/types/auto-yes.js +6 -0
  411. package/dist/server/src/types/prompt-reading.js +32 -0
  412. package/dist/types/auto-yes-answer-mode.d.ts +35 -0
  413. package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
  414. package/dist/types/auto-yes-answer-mode.js +38 -0
  415. package/docs/en/user-guide/webapp-guide.md +47 -13
  416. package/package.json +1 -1
  417. package/public/sw.js +76 -4
  418. package/release-notes/0.48.0.json +57 -0
  419. package/release-notes/0.49.0.json +45 -0
  420. package/.next/server/chunks/1559.js +0 -2
  421. package/.next/server/chunks/2460.js +0 -1
  422. package/.next/server/chunks/5595.js +0 -1
  423. package/.next/server/chunks/610.js +0 -1
  424. package/.next/server/chunks/6722.js +0 -1
  425. package/.next/static/chunks/5371-a549a0d2c2044d41.js +0 -1
  426. package/.next/static/chunks/602-1c1488959215e140.js +0 -1
  427. package/.next/static/chunks/6288-09feba367cc2c65e.js +0 -1
  428. package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
  429. package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
  430. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
  431. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9cf1ecc59e36a004.js +0 -1
  432. package/.next/static/chunks/app/worktrees/[id]/page-46aced20b2b1c010.js +0 -1
  433. /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_buildManifest.js +0 -0
  434. /package/.next/static/{etorRtpxbQqqOzdUeXdw2 → 3_JtAZaKMJEDFIIfkHv4n}/_ssgManifest.js +0 -0
@@ -93,12 +93,25 @@
93
93
  * server does. That is deliberate — `useTerminalPanePolling` derives the
94
94
  * composer text client-side from the frame it already has, which keeps the
95
95
  * WebSocket push path and the HTTP poll path from disagreeing.
96
+ *
97
+ * That is also why the "a dialog below the composer means no composer" rule
98
+ * (Issue #3927, {@link codexDialogBelow}) lives here rather than next to the
99
+ * clear in `session/composer-clear.ts`: the clear, the published
100
+ * `composerText` and the browser's own reading all go through
101
+ * {@link extractLiveComposerText}, and `tools/codex/cli-patterns.ts`, whose
102
+ * `readCodexGlyphRowKind` the rule was first written on, imports the logger.
96
103
  */
97
104
  Object.defineProperty(exports, "__esModule", { value: true });
98
105
  exports.SUPPORTED_COMPOSER_TOOLS = exports.COMPOSER_TEXT_MAX_CHARS = void 0;
99
106
  exports.findClaudeInputBox = findClaudeInputBox;
107
+ exports.isCodexComposerRow = isCodexComposerRow;
108
+ exports.isCodexBoldGutterRow = isCodexBoldGutterRow;
109
+ exports.findCodexLiveComposerRow = findCodexLiveComposerRow;
110
+ exports.codexDialogBelow = codexDialogBelow;
100
111
  exports.findCodexInputBox = findCodexInputBox;
101
112
  exports.extractComposerText = extractComposerText;
113
+ exports.extractLiveComposerText = extractLiveComposerText;
114
+ exports.readCodexComposerFrom = readCodexComposerFrom;
102
115
  const ansi_1 = require("./ansi");
103
116
  /**
104
117
  * Upper bound on the published composer text.
@@ -208,6 +221,10 @@ function isBlankRow(line) {
208
221
  * A bare `\u203A` with nothing after it is accepted: `capture-pane` trims trailing
209
222
  * whitespace, so that is what a composer with neither text nor placeholder looks
210
223
  * like, and calling it `no_composer` would be a worse answer than `empty`.
224
+ *
225
+ * Exported for the send path (Issue #3906): when {@link findCodexInputBox}'s
226
+ * block bound cannot reach a composer split by many blank rows, the sender
227
+ * still has to tell the real `\u203A` row from these look-alikes.
211
228
  */
212
229
  function isCodexComposerRow(line) {
213
230
  if (line === undefined)
@@ -226,6 +243,120 @@ function isCodexComposerRow(line) {
226
243
  const firstText = chars.slice(2).find(c => c.ch !== ' ');
227
244
  return firstText === undefined || !firstText.bold;
228
245
  }
246
+ /**
247
+ * Whether a codex `\u203A` row has its gutter space inside the glyph's bold span
248
+ * (Issue #3906).
249
+ *
250
+ * codex also draws the transcript echo of a sent message with a bold glyph that
251
+ * is NOT dim — `ESC[1m\u203A ESC[0m` + text (measured on 0.153.2 and 0.160.0:
252
+ * `tests/fixtures/codex-live-2310/turn-submitted-no-status.txt:36`,
253
+ * `codex-multiline-composer-3205/tc104-raw-pane.txt:20`,
254
+ * `codex-dialogs-0157/approval.txt:24`) — which {@link isCodexComposerRow}
255
+ * accepts. Every measured composer resets right after its glyph
256
+ * (`ESC[1m\u203AESC[0m `), and every echo carries the space in the glyph's span,
257
+ * dim or not. {@link findCodexInputBox} does not need this — it only looks at
258
+ * the frame's last blocks, where the live composer is — but a search that climbs
259
+ * past them into the transcript does.
260
+ */
261
+ function isCodexBoldGutterRow(line) {
262
+ if (line === undefined)
263
+ return false;
264
+ const chars = scanAttributedChars(line);
265
+ return chars.length > 1 && chars[0].ch === CODEX_PROMPT_GLYPH && chars[1].ch === ' ' && chars[1].bold;
266
+ }
267
+ /**
268
+ * Classify one raw codex row whose first rendered glyph is `\u203A` (Issue #3927).
269
+ *
270
+ * The same reading as `readCodexGlyphRowKind` in `tools/codex/cli-patterns.ts`,
271
+ * re-stated on this module's SGR scan because that module imports the logger
272
+ * and this one is read by the browser bundle. In order: no attributes at all →
273
+ * null (a stripped capture, where every `\u203A` use reads the same); a dim
274
+ * glyph → the transcript echo; a bold label → a dialog option; a dim label →
275
+ * the composer's placeholder; a coloured glyph whose label is drawn in the
276
+ * same colour → a dialog option (from 0.155.1 the composer's glyph is
277
+ * coloured too, but it resets before its label); anything else → the composer.
278
+ * `tests/unit/lib/detection/composer-text-dialog-below-3927.test.ts` holds the
279
+ * two readings equal over the codex fixtures.
280
+ *
281
+ * @param rawRow - One row of the capture, ANSI intact
282
+ */
283
+ function readCodexGlyphRow(rawRow) {
284
+ if (!rawRow.includes('\x1b'))
285
+ return null;
286
+ const chars = scanAttributedChars(rawRow);
287
+ const glyphIndex = chars.findIndex(c => c.ch.trim() !== '');
288
+ if (glyphIndex < 0 || chars[glyphIndex].ch !== CODEX_PROMPT_GLYPH)
289
+ return null;
290
+ const glyph = chars[glyphIndex];
291
+ if (glyph.dim)
292
+ return 'transcript-echo';
293
+ const label = chars.slice(glyphIndex + 1).find(c => c.ch.trim() !== '');
294
+ if (label?.bold)
295
+ return 'option';
296
+ if (label?.dim)
297
+ return 'composer';
298
+ if (glyph.fg !== null && label?.fg === glyph.fg)
299
+ return 'option';
300
+ return 'composer';
301
+ }
302
+ /**
303
+ * A composer row by every reading: {@link isCodexComposerRow}, and not the
304
+ * bold-not-dim echo ({@link isCodexBoldGutterRow}). The caller has already had
305
+ * {@link readCodexGlyphRow} call it `'composer'`, which also requires ANSI
306
+ * attributes: an attribute-free `\u203A` row (a stripped capture, where a dialog
307
+ * option reads the same as a composer) is never taken (Issue #3906).
308
+ */
309
+ function isLiveComposerRow(row) {
310
+ return isCodexComposerRow(row) && !isCodexBoldGutterRow(row);
311
+ }
312
+ /**
313
+ * The live codex composer's `\u203A` row, wherever it is in the frame (Issue #3906).
314
+ *
315
+ * Read from the bottom, in the order `findCodexBottomGlyphRow` reads a frame:
316
+ * a dialog's highlighted option reached before any composer row means the
317
+ * dialog is what the pane shows now, and a composer row above it is one left
318
+ * there from before (codex-live-1671) — so the answer is -1, not that row. The
319
+ * transcript echo of a sent message is skipped, dim ({@link isCodexComposerRow}
320
+ * rejects it) or not ({@link isCodexBoldGutterRow}).
321
+ *
322
+ * Moved here from `session/composer-clear.ts` by Issue #3927, with
323
+ * {@link codexDialogBelow}, so the browser can read the same rule.
324
+ *
325
+ * @param rows - The capture split into rows, ANSI intact
326
+ * @returns The row's index, or -1 when no live composer row is drawn
327
+ */
328
+ function findCodexLiveComposerRow(rows) {
329
+ for (let i = rows.length - 1; i >= 0; i--) {
330
+ const kind = readCodexGlyphRow(rows[i]);
331
+ if (kind === 'option')
332
+ return -1;
333
+ if (kind === 'composer' && isLiveComposerRow(rows[i]))
334
+ return i;
335
+ }
336
+ return -1;
337
+ }
338
+ /**
339
+ * Whether a dialog, not a composer, is what the pane shows below `row` (Issue #3906).
340
+ *
341
+ * The same bottom-up reading as {@link findCodexLiveComposerRow}, stopped at
342
+ * `row`: a dialog's highlighted option reached first means the composer at
343
+ * `row` — even one {@link findCodexInputBox} located among the frame's last
344
+ * blocks — was left there from before the dialog opened. A live composer row
345
+ * reached first means it was not.
346
+ *
347
+ * @param rows - The capture split into rows, ANSI intact
348
+ * @param row - Index of the composer's `\u203A` row
349
+ */
350
+ function codexDialogBelow(rows, row) {
351
+ for (let i = rows.length - 1; i > row; i--) {
352
+ const kind = readCodexGlyphRow(rows[i]);
353
+ if (kind === 'option')
354
+ return true;
355
+ if (kind === 'composer' && isLiveComposerRow(rows[i]))
356
+ return false;
357
+ }
358
+ return false;
359
+ }
229
360
  /**
230
361
  * Locate codex's composer in a captured pane (Issue #1890).
231
362
  *
@@ -282,7 +413,7 @@ function findCodexInputBox(lines) {
282
413
  */
283
414
  function applySgr(params, state) {
284
415
  const parts = params === '' ? ['0'] : params.split(';');
285
- let { dim, bold } = state;
416
+ let { dim, bold, fg } = state;
286
417
  for (let i = 0; i < parts.length; i++) {
287
418
  const code = parts[i] === '' ? 0 : Number(parts[i]);
288
419
  if (Number.isNaN(code))
@@ -290,15 +421,18 @@ function applySgr(params, state) {
290
421
  if (code === 38 || code === 48 || code === 58) {
291
422
  const mode = parts[i + 1] === '' || parts[i + 1] === undefined ? -1 : Number(parts[i + 1]);
292
423
  // 5 = 256-colour (one argument), 2 = 24-bit RGB (three arguments).
293
- if (mode === 5)
294
- i += 2;
295
- else if (mode === 2)
296
- i += 4;
297
- else
298
- i += 1;
424
+ const argCount = mode === 5 ? 2 : mode === 2 ? 4 : 1;
425
+ if (code === 38)
426
+ fg = parts.slice(i + 1, i + 1 + argCount).join(';');
427
+ i += argCount;
299
428
  continue;
300
429
  }
301
- if (code === 0 || code === 22) {
430
+ if (code === 0) {
431
+ dim = false;
432
+ bold = false;
433
+ fg = null;
434
+ }
435
+ else if (code === 22) {
302
436
  dim = false;
303
437
  bold = false;
304
438
  }
@@ -306,8 +440,12 @@ function applySgr(params, state) {
306
440
  bold = true;
307
441
  else if (code === 2)
308
442
  dim = true;
443
+ else if (code === 39)
444
+ fg = null;
445
+ else if ((code >= 30 && code <= 37) || (code >= 90 && code <= 97))
446
+ fg = String(code);
309
447
  }
310
- return { dim, bold };
448
+ return { dim, bold, fg };
311
449
  }
312
450
  /**
313
451
  * Split one raw pane row into rendered characters tagged with their dim state.
@@ -319,12 +457,12 @@ function applySgr(params, state) {
319
457
  */
320
458
  function scanAttributedChars(line) {
321
459
  const out = [];
322
- let state = { dim: false, bold: false };
460
+ let state = { dim: false, bold: false, fg: null };
323
461
  let i = 0;
324
462
  while (i < line.length) {
325
463
  const ch = line[i];
326
464
  if (ch !== '\x1b') {
327
- out.push({ ch, dim: state.dim, bold: state.bold });
465
+ out.push({ ch, dim: state.dim, bold: state.bold, fg: state.fg });
328
466
  i++;
329
467
  continue;
330
468
  }
@@ -430,6 +568,72 @@ function extractComposerText(rawCapture, cliToolId) {
430
568
  const region = locateComposer(lines, cliToolId);
431
569
  if (region === null)
432
570
  return { text: '', state: 'no_composer' };
571
+ return readComposerRegion(lines, region);
572
+ }
573
+ /**
574
+ * The composer the pane shows NOW — {@link extractComposerText}, less a codex
575
+ * composer that a dialog has opened below (Issue #3927).
576
+ *
577
+ * codex draws on the normal screen, so a composer row from before a dialog
578
+ * opened can still sit among the frame's last blocks, above the dialog's
579
+ * highlighted option. {@link extractComposerText} locates it and reports its
580
+ * old text as `content`; this reports `no_composer`, the answer the clear
581
+ * (`session/composer-clear.ts`) has given that frame since #3906. The two
582
+ * display paths — the published `composerText`
583
+ * (`session/current-output-builder.ts`) and the browser's own reading
584
+ * (`hooks/useTerminalPanePolling.ts`) — read through this, so the unsent bar
585
+ * neither shows text its [Clear] cannot remove nor offers a [Run] whose Enter
586
+ * would land in the dialog.
587
+ *
588
+ * {@link extractComposerText} itself keeps its reading. The sender
589
+ * (`cli-tools/submit-verified-sender.ts`) applies {@link codexDialogBelow} to
590
+ * the box it locates on its own branches, and Auto-Yes's Enter fallback and
591
+ * the send-residue check are left reading the box as before.
592
+ *
593
+ * @param rawCapture - A pane capture with ANSI attributes intact
594
+ * @param cliToolId - The CLI whose session was captured
595
+ */
596
+ function extractLiveComposerText(rawCapture, cliToolId) {
597
+ const read = extractComposerText(rawCapture, cliToolId);
598
+ if (cliToolId !== 'codex' || read.state === 'no_composer' || read.state === 'unsupported_tool')
599
+ return read;
600
+ const lines = rawCapture.split('\n');
601
+ const box = findCodexInputBox(lines);
602
+ if (box !== null && codexDialogBelow(lines, box.firstRow))
603
+ return { text: '', state: 'no_composer' };
604
+ return read;
605
+ }
606
+ /**
607
+ * Read a codex composer from a known `\u203A` row (Issue #3906).
608
+ *
609
+ * {@link findCodexInputBox} only searches the frame's last four blocks, and
610
+ * takes the composer's own block alone: a body of several paragraphs puts its
611
+ * `\u203A` row higher up, and its text stops at the first blank row. This reads
612
+ * from `firstRow` down to the frame's last block — codex's model / cwd footer —
613
+ * blank rows included, under the same dim rule as {@link extractComposerText}.
614
+ * When the composer's own block is the frame's last block it is read to the end.
615
+ *
616
+ * Whether `firstRow` is the live composer — not a row left above a dialog — is
617
+ * the caller's question; this only reads it.
618
+ *
619
+ * @param lines - Captured pane lines, ANSI intact
620
+ * @param firstRow - Index of a row {@link isCodexComposerRow} accepts
621
+ */
622
+ function readCodexComposerFrom(lines, firstRow) {
623
+ let end = lines.length - 1;
624
+ while (end >= 0 && isBlankRow(lines[end]))
625
+ end--;
626
+ let lastBlockStart = end;
627
+ while (lastBlockStart > 0 && !isBlankRow(lines[lastBlockStart - 1]))
628
+ lastBlockStart--;
629
+ let ownBlockEnd = firstRow;
630
+ while (ownBlockEnd + 1 < lines.length && !isBlankRow(lines[ownBlockEnd + 1]))
631
+ ownBlockEnd++;
632
+ const lastRow = lastBlockStart > ownBlockEnd ? lastBlockStart - 1 : end;
633
+ return readComposerRegion(lines, { firstRow, lastRow, glyph: CODEX_PROMPT_GLYPH_PATTERN });
634
+ }
635
+ /** The text of a located composer region, under the dim rule. */
636
+ function readComposerRegion(lines, region) {
433
637
  const realRows = [];
434
638
  const renderedRows = [];
435
639
  for (let i = region.firstRow; i <= region.lastRow; i++) {
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ /**
3
+ * Which option of a question the question itself recommends (Issue #3863).
4
+ *
5
+ * Auto-Yes's `recommended` answer mode answers a question with the option
6
+ * whose TITLE ends in a recommendation marker — `(Recommended)`, `(推奨)` or
7
+ * `(推奨)`. The title, not the label as a whole: on Claude's and Command
8
+ * Code's pickers an option is a title row and, under it, a description, and a
9
+ * description may end in the same words (`… see Recommended Next Actions`),
10
+ * or quote the marker. So the readers that still know where a title ends —
11
+ * the block reader, Command Code's question reader and Claude's
12
+ * AskUserQuestion parser — say per option what its title shows:
13
+ *
14
+ * - `true`: the title ends in a marker;
15
+ * - `false`: it does not;
16
+ * - `'unknown'`: the reader could not tell the title from what follows it
17
+ * (a continuation row that may be the title wrapping or a description).
18
+ *
19
+ * A reader never answers `false` for a title it could not delimit: a marker
20
+ * on the part it could not place would make "no option is recommended" (the
21
+ * default is then answered) a guess.
22
+ *
23
+ * The labels themselves, and every text a contract's deny patterns are
24
+ * matched against, are left as they were read.
25
+ *
26
+ * Leaf module: imports nothing.
27
+ *
28
+ * @module lib/detection/option-recommendation
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.isRecommendedTitle = isRecommendedTitle;
32
+ exports.isRecommendationMarker = isRecommendationMarker;
33
+ exports.upperBoundColumns = upperBoundColumns;
34
+ exports.lowerBoundPaneColumns = lowerBoundPaneColumns;
35
+ exports.cannotBeWrapOf = cannotBeWrapOf;
36
+ /**
37
+ * A marker at the very end of a title, standing on its own: what precedes it
38
+ * is the start of the title, white space, or anything but an ASCII letter or
39
+ * digit (`dispatch (Recommended)`, `する(推奨)`), never a word it is glued
40
+ * to (`Not(Recommended)`). Case as the tools write it. Anchored, no nested
41
+ * quantifiers (ReDoS-safe).
42
+ */
43
+ const RECOMMENDATION_MARKER_PATTERN = /(?:^|[^A-Za-z0-9])(?:\(Recommended\)|(推奨)|\(推奨\))$/;
44
+ /**
45
+ * Whether a title — the option's whole title, wrapped rows joined — ends in a
46
+ * recommendation marker.
47
+ *
48
+ * @param title - The option's title, without its number or cursor
49
+ */
50
+ function isRecommendedTitle(title) {
51
+ return RECOMMENDATION_MARKER_PATTERN.test(title.trim());
52
+ }
53
+ /** The markers, as a row holding nothing else spells them. */
54
+ const RECOMMENDATION_MARKERS = new Set(['(Recommended)', '(推奨)', '(推奨)']);
55
+ /**
56
+ * Whether a row holds a marker and nothing else — the tail of a title that
57
+ * wrapped right before its marker (`❯ 1. 整えた状態で続行` / `(Recommended)`).
58
+ */
59
+ function isRecommendationMarker(row) {
60
+ return RECOMMENDATION_MARKERS.has(row.trim());
61
+ }
62
+ /** One code point that occupies no terminal column. */
63
+ const COMBINING_MARK = /^\p{M}$/u;
64
+ /**
65
+ * An UPPER bound on the columns a row occupies: printable ASCII is one
66
+ * column, a combining mark none, and anything else is counted as two (East
67
+ * Asian wide characters are two; no other code point is wider). Used with a
68
+ * LOWER bound on the pane width, so "it would have fit" is never claimed for
69
+ * a row that might not have.
70
+ */
71
+ function upperBoundColumns(text) {
72
+ let columns = 0;
73
+ for (const char of text) {
74
+ const code = char.codePointAt(0) ?? 0;
75
+ if (code >= 0x20 && code < 0x7f)
76
+ columns += 1;
77
+ else if (!COMBINING_MARK.test(char))
78
+ columns += 2;
79
+ }
80
+ return columns;
81
+ }
82
+ /**
83
+ * A LOWER bound on the pane width: the widest row of the frame, counting one
84
+ * column per code point (combining marks none). A row the pane drew is never
85
+ * wider than the pane.
86
+ */
87
+ function lowerBoundPaneColumns(rows) {
88
+ let widest = 0;
89
+ for (const row of rows) {
90
+ let columns = 0;
91
+ for (const char of row.trimEnd()) {
92
+ if (!COMBINING_MARK.test(char))
93
+ columns += 1;
94
+ }
95
+ if (columns > widest)
96
+ widest = columns;
97
+ }
98
+ return widest;
99
+ }
100
+ /**
101
+ * Whether `next` cannot be the wrapped tail of `row` — the pane would have
102
+ * kept `next`'s first word on `row`.
103
+ *
104
+ * Terminals word-wrap a title: a row ends early only when the following word
105
+ * would not fit. So when `row` plus a space plus that word fits inside the
106
+ * pane, `row` did not wrap there and `next` begins something else (the
107
+ * option's description). Judged with an upper bound on what the row and the
108
+ * word occupy and a lower bound on the pane, so a `true` is never a guess; a
109
+ * `false` only says the row MAY have wrapped.
110
+ *
111
+ * @param row - The option's row, as drawn (indent and number included)
112
+ * @param next - The row under it
113
+ * @param paneColumns - {@link lowerBoundPaneColumns} of the frame
114
+ */
115
+ function cannotBeWrapOf(row, next, paneColumns) {
116
+ const firstWord = next.trim().split(/\s+/, 1)[0] ?? '';
117
+ if (firstWord === '')
118
+ return false;
119
+ return upperBoundColumns(row.trimEnd()) + 1 + upperBoundColumns(firstWord) <= paneColumns;
120
+ }