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
@@ -33,7 +33,11 @@ const cli_session_1 = require("../../lib/session/cli-session");
33
33
  const status_detector_1 = require("../../lib/detection/status-detector");
34
34
  const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
35
35
  const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
36
- const auto_yes_enter_fallback_1 = require("../../lib/polling/auto-yes-enter-fallback");
36
+ const auto_yes_poller_state_1 = require("../../lib/polling/auto-yes-poller-state");
37
+ const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
38
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
39
+ const auto_yes_decision_state_1 = require("../../lib/polling/auto-yes-decision-state");
40
+ const antigravity_receipt_episodes_1 = require("../../lib/polling/antigravity-receipt-episodes");
37
41
  const prompt_dedup_state_1 = require("../../lib/polling/prompt-dedup-state");
38
42
  const status_capture_config_1 = require("../../config/status-capture-config");
39
43
  const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
@@ -45,6 +49,7 @@ const status_evidence_1 = require("../../lib/session/status-evidence");
45
49
  const ask_user_question_prompt_1 = require("../../lib/session/ask-user-question-prompt");
46
50
  const prompt_view_1 = require("../../lib/session/prompt-view");
47
51
  const auto_yes_dialog_gate_1 = require("../../lib/polling/auto-yes-dialog-gate");
52
+ const prompt_screen_reading_1 = require("../../lib/polling/prompt-screen-reading");
48
53
  const layer_disagreement_1 = require("../../lib/session/layer-disagreement");
49
54
  const structured_prompt_1 = require("../../lib/session/structured-prompt");
50
55
  const chat_turn_progress_1 = require("./chat-turn-progress");
@@ -226,7 +231,7 @@ function readAgentEvents(worktreeId, cliToolId, instanceId, resolvedInstanceId)
226
231
  * every value below is derived from the arguments, and nothing is assigned
227
232
  * outside this function.
228
233
  */
229
- function composePromptData({ worktreeId, cliToolId, output, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
234
+ function composePromptData({ worktreeId, cliToolId, output, captureWindowLines, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
230
235
  const scraperPromptWaiting = statusResult.hasActivePrompt;
231
236
  // Issue #1726: the agent's own account of what it asked. It contributes only
232
237
  // where some other layer has already established that a dialog is on screen —
@@ -238,7 +243,14 @@ function composePromptData({ worktreeId, cliToolId, output, statusResult, starti
238
243
  // takes it there today (the decision entries publish the same episode's
239
244
  // choices) — and this line now re-uses it, so the two surfaces cannot describe
240
245
  // different instants.
241
- const scraperPromptData = statusResult.promptDetection.promptData;
246
+ //
247
+ // Issue #3881 (second review N3): with the capture's top as the Auto-Yes
248
+ // poller reads it — an approval target whose upward scan reached a top that
249
+ // may be cut carries `approvalTargetCompleteness: 'top-unknown'`, so the
250
+ // contract re-evaluation of `observe=1` (`prompt-observation/observe.ts`)
251
+ // and `wait` read the same completeness the poller acted on, from the same
252
+ // `captureTopOf` on this payload's own capture window.
253
+ const scraperPromptData = (0, prompt_screen_reading_1.withCaptureTopCompleteness)(statusResult.promptDetection, (0, prompt_screen_reading_1.captureTopOf)(output, captureWindowLines, cliToolId)).promptData;
242
254
  const correctedPromptData = scraperPromptData && askUserQuestion
243
255
  ? (0, ask_user_question_prompt_1.applyAskUserQuestion)(scraperPromptData, askUserQuestion.spec)
244
256
  : null;
@@ -468,12 +480,26 @@ function logDetectionDivergence(worktreeId, cliToolId, resolvedInstanceId, statu
468
480
  });
469
481
  }
470
482
  }
483
+ /**
484
+ * Issue #3821: the agy hook call the receipt on screen was accepted for, for
485
+ * the decision to be matched against; null when unknown. Read only, never throws.
486
+ */
487
+ function acceptedAgyCallId(worktreeId, instanceId) {
488
+ try {
489
+ return (0, antigravity_receipt_episodes_1.getAntigravityAcceptedReceiptCallId)(worktreeId, instanceId);
490
+ }
491
+ catch {
492
+ return null;
493
+ }
494
+ }
471
495
  /**
472
496
  * The payload of a running session (Issue #3272). Split out of
473
497
  * {@link buildPayload} as it stood there, so the keys keep their order and the
474
498
  * reads inside it keep theirs.
475
499
  */
476
- function buildRunningPayload({ worktreeId, cliToolId, instanceId, sessionName, published, merged, newContent, output, realtimeSnippet, totalLines, lastCapturedLine, isPromptWaiting, promptData, promptAnswerable, autoYesState, lastEnterFallback, isSelectionListActive, isPagerActive, isDismissablePanelActive, startingSince, lastKnown, lastServerResponseTimestamp, compositeKey, stopEventAt, structuredEvents, model, effort, upstreamFaultMatch, paneObstruction, composer, }) {
500
+ function buildRunningPayload({ worktreeId, cliToolId, instanceId, sessionName, published, merged, newContent, output, realtimeSnippet, totalLines, lastCapturedLine, isPromptWaiting, promptData, promptAnswerable, autoYesState, lastEnterFallback, autoYesDecision, isSelectionListActive, isPagerActive, isDismissablePanelActive, startingSince, lastKnown, lastServerResponseTimestamp, compositeKey, stopEventAt, structuredEvents, model, effort, upstreamFaultMatch, paneObstruction, composer, }) {
501
+ const lastSuppression = (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId);
502
+ const waitingEpisodeId = (0, waiting_episode_state_1.getWaitingEpisodeRecord)(worktreeId, cliToolId, instanceId)?.episodeId ?? null;
477
503
  return {
478
504
  isRunning: true,
479
505
  sessionName,
@@ -496,14 +522,29 @@ function buildRunningPayload({ worktreeId, cliToolId, instanceId, sessionName, p
496
522
  enabled: autoYesState?.enabled ?? false,
497
523
  expiresAt: autoYesState?.enabled ? autoYesState.expiresAt : null,
498
524
  stopReason: autoYesState?.stopReason,
499
- lastSuppression: (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId),
525
+ lastSuppression,
526
+ // Issue #3798: read in the same step as the record above, which names the
527
+ // wait it was written for — `cmate wait` holds the two against each other.
528
+ waitingEpisodeId,
500
529
  // Issue #1694: undefined (so the key is absent from the JSON) unless a
501
530
  // stop pattern actually fired — the state clears it on every other path.
502
531
  stopMatchedText: autoYesState?.stopMatchedText,
503
532
  // Issue #3397: appended last, after the published fields above. Null when
504
- // Auto-Yes never sent its Enter to an unreadable choice screen here.
533
+ // Auto-Yes never sent its Enter to an unreadable choice screen here —
534
+ // always, since Issue #3821 retired the Enter.
505
535
  lastEnterFallback,
536
+ // Issue #3798: appended last. Whether the poller answered the open wait
537
+ // after the record above was written — the push gate's own reading, so
538
+ // `cmate wait` does not take that record for this wait's reason.
539
+ lastSuppressionAnswered: lastSuppression !== null &&
540
+ (0, auto_yes_suppression_state_1.suppressionPredatesAnswer)(lastSuppression, waitingEpisodeId, (0, auto_yes_poller_state_1.getAutoYesLastAnswer)(compositeKey)),
506
541
  },
542
+ // Issue #3821: next to `autoYes`, and about `promptData` above — whether
543
+ // Auto-Yes is answering it, has left it to a human, or neither.
544
+ autoYesDecision,
545
+ // Issue #3863: how a question on this screen is treated while Auto-Yes is
546
+ // on; the key is absent while it is off.
547
+ ...(autoYesState?.enabled ? { autoYesAnswerMode: (0, auto_yes_state_1.autoYesAnswerModeOf)(autoYesState) } : {}),
507
548
  isSelectionListActive,
508
549
  isPagerActive,
509
550
  isDismissablePanelActive,
@@ -664,7 +705,8 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
664
705
  // The effective window is the smaller of what this path asks for and what the
665
706
  // capture layer will ever fetch — captureSessionOutput() reads at most
666
707
  // CACHE_MAX_CAPTURE_LINES regardless of the request.
667
- const captureWindowSaturated = (0, tmux_capture_cache_1.isCaptureWindowSaturated)(totalLines, Math.min(status_capture_config_1.STATUS_CAPTURE_LINES, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES));
708
+ const captureWindowLines = Math.min(status_capture_config_1.STATUS_CAPTURE_LINES, tmux_capture_cache_1.CACHE_MAX_CAPTURE_LINES);
709
+ const captureWindowSaturated = (0, tmux_capture_cache_1.isCaptureWindowSaturated)(totalLines, captureWindowLines);
668
710
  // Issue #1910: saturation of the capture WINDOW is only one of the two ways
669
711
  // the cursor dies, and it is the one that never fires for the alternate-screen
670
712
  // tools — their pane is 1000 rows (claude / copilot) or 200 (opencode), so a
@@ -761,6 +803,7 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
761
803
  worktreeId,
762
804
  cliToolId,
763
805
  output,
806
+ captureWindowLines,
764
807
  statusResult,
765
808
  startingSince,
766
809
  promptWaiting,
@@ -871,7 +914,8 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
871
914
  // Issue #1879: structural, and computed here next to the other frame readers
872
915
  // rather than inside a status branch — the bar it feeds must appear on the
873
916
  // strength of what is in the box, never on the strength of a status verdict.
874
- const composer = (0, composer_text_1.extractComposerText)(output, cliToolId);
917
+ // Issue #3927: the live box — a codex composer left above a dialog is not one.
918
+ const composer = (0, composer_text_1.extractLiveComposerText)(output, cliToolId);
875
919
  // Issue #1839: judged on exactly what is published as `realtimeSnippet`, not
876
920
  // on `output`. The wider capture keeps a banner from an hour ago in scope, and
877
921
  // a fault the operator cannot see in the payload next to it is unverifiable.
@@ -922,10 +966,20 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
922
966
  promptData,
923
967
  promptAnswerable,
924
968
  autoYesState,
925
- // Issue #3397: judged against the screen-read prompt only — the one
926
- // `promptAnswerable` is published for, and the one the poller sent its
927
- // Enter to. A structured (hook / degraded) prompt is never that screen.
928
- lastEnterFallback: (0, auto_yes_enter_fallback_1.publishEnterFallback)((0, auto_yes_enter_fallback_1.getLastEnterFallback)(worktreeId, cliToolId, instanceId), promptAnswerable !== undefined ? statusResult.promptDetection.promptData : null),
969
+ // Issue #3821: the Enter is retired; the key is kept, and is null.
970
+ lastEnterFallback: null,
971
+ // Issue #3821: judged against the screen-read prompt only — the one
972
+ // `promptAnswerable` is published for, and the only kind the poller
973
+ // answers. A structured (hook / degraded) prompt is never that screen, and
974
+ // reads `none`.
975
+ autoYesDecision: (0, auto_yes_decision_state_1.publishAutoYesDecision)({
976
+ compositeKey,
977
+ grant: autoYesState,
978
+ promptData: promptData !== null && promptAnswerable !== undefined ? statusResult.promptDetection.promptData : null,
979
+ // agy: the decision is tied to the hook call its receipt was accepted for.
980
+ callId: cliToolId === 'antigravity' ? acceptedAgyCallId(worktreeId, instanceId) : null,
981
+ pollerActive: (0, auto_yes_manager_1.isPollerActive)(compositeKey),
982
+ }),
929
983
  isSelectionListActive,
930
984
  isPagerActive,
931
985
  isDismissablePanelActive,
@@ -82,6 +82,12 @@ function getLastSendAttempt(instance) {
82
82
  function clearSendAttempts() {
83
83
  records.clear();
84
84
  }
85
+ /**
86
+ * The wordings of a failed tmux call that can carry the message body: `tmux.ts`
87
+ * wraps the child_process error (`Command failed: tmux …argv…`) as
88
+ * `Failed to send keys to tmux session: …` and the like (Issue #3880).
89
+ */
90
+ const TMUX_TRANSPORT_FAILURE = /Command failed: tmux |Failed to send (?:special )?keys? to tmux session|Failed to send special key:|Failed to paste message into tmux session/;
85
91
  /**
86
92
  * Where a failed `ICLITool.sendMessage` stopped, read from its error.
87
93
  *
@@ -103,13 +109,10 @@ function classifySendFailure(error) {
103
109
  return { state: 'not-sent', reason: 'plan-review' };
104
110
  }
105
111
  const message = error instanceof Error ? error.message : String(error);
106
- // The readiness waits of every tool throw before typing anything.
107
- if (/prompt not ready/i.test(message))
108
- return { state: 'not-sent', reason: 'prompt-not-ready' };
109
- // #1880: refused before the body, after only the clear keys (C-e / C-u).
110
- if (/still holds unsent text after \d+ clear passes/.test(message)) {
111
- return { state: 'not-sent', reason: 'composer-not-empty' };
112
- }
112
+ // Issue #3880: the "after the body was typed" wordings are matched FIRST. A
113
+ // body-not-landed error quotes what the composer shows — the user's own text —
114
+ // and a body that says `prompt not ready` must not turn "may have been typed"
115
+ // into "was not typed". Indeterminate wins whenever its wording is present.
113
116
  // #2464 / #3366: typed, never submitted, taken back out best-effort.
114
117
  if (/Enter was not pressed, so nothing was submitted/.test(message)) {
115
118
  return { state: 'indeterminate', reason: 'body-not-landed' };
@@ -122,6 +125,20 @@ function classifySendFailure(error) {
122
125
  if (/submit could not be confirmed/i.test(message)) {
123
126
  return { state: 'indeterminate', reason: 'submit-unconfirmed' };
124
127
  }
128
+ // Issue #3880 (N2): a failed tmux call quotes its argv — and the argv of a
129
+ // literal send IS the body (`Command failed: tmux send-keys -t =s: -l -- <body>`).
130
+ // Whether any of the body reached the pane is unknown, and the body's own words
131
+ // (`Explain prompt not ready.`) must not be read as a readiness refusal below.
132
+ if (TMUX_TRANSPORT_FAILURE.test(message))
133
+ return { state: 'indeterminate', reason: 'send-error' };
134
+ // The readiness waits of every tool throw before typing anything.
135
+ if (/prompt not ready/i.test(message))
136
+ return { state: 'not-sent', reason: 'prompt-not-ready' };
137
+ // #1880: refused before the body, after only the clear keys (C-e / C-u, or C-e / BSpace
138
+ // for a codex composer holding only a paste placeholder, #3937).
139
+ if (/still holds unsent text after \d+ clear passes/.test(message)) {
140
+ return { state: 'not-sent', reason: 'composer-not-empty' };
141
+ }
125
142
  return { state: 'indeterminate', reason: 'send-error' };
126
143
  }
127
144
  /** The whitespace-free form two renderings of one text share. */
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ /**
3
+ * The observation half of `waiting-episode-binding` (Issue #3798): the
4
+ * observers' starts, the dating of a captured frame, and the plan of tables
5
+ * O-1 / O-2. Split out of `waiting-episode-binding` (Issue #3892), which
6
+ * re-exports all of it and carries the plan out (`commitWaitingObservation`).
7
+ *
8
+ * @module lib/session/waiting-episode-binding-observation
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.startWaitingObservation = startWaitingObservation;
12
+ exports.startWorktreeWaitingObservations = startWorktreeWaitingObservations;
13
+ exports.captureFrameTime = captureFrameTime;
14
+ exports.captureObservedFrame = captureObservedFrame;
15
+ exports.planWaitingObservation = planWaitingObservation;
16
+ const async_hooks_1 = require("async_hooks");
17
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
18
+ const prompt_screen_key_1 = require("../../lib/detection/prompt-screen-key");
19
+ const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
20
+ const waiting_episode_binding_resolve_1 = require("../../lib/session/waiting-episode-binding-resolve");
21
+ const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
22
+ const waiting_episode_verdict_1 = require("../../lib/session/waiting-episode-verdict");
23
+ const global_state_1 = require("../global-state");
24
+ /** Where `cli-session` reports a frame's source to the observer it runs for (Issue #3798). */
25
+ function frameMetaSink() {
26
+ return (0, global_state_1.getOrInitGlobal)('__captureFrameMetaSink', () => new async_hooks_1.AsyncLocalStorage());
27
+ }
28
+ /** Fix the observer's start (design §2.5). Read-only. */
29
+ function startWaitingObservation(worktreeId, cliToolId, instanceId) {
30
+ return {
31
+ generation: (0, waiting_episode_binding_resolve_1.generationOf)({ worktreeId, cliToolId, instanceId }),
32
+ version: (0, waiting_episode_state_1.getEpisodeVersion)(worktreeId, cliToolId, instanceId),
33
+ };
34
+ }
35
+ /**
36
+ * Fix the start of every instance of a worktree at once (design §2.5): the
37
+ * status routes call it before `listSessions()`, so a session that started —
38
+ * and opened a wait — after the list was taken is not closed as gone by a
39
+ * probe that did not see it. Instances that have no version or generation yet
40
+ * are fixed at 0 / none.
41
+ */
42
+ function startWorktreeWaitingObservations(worktreeId) {
43
+ const prefix = `${worktreeId}${auto_yes_state_1.COMPOSITE_KEY_SEPARATOR}`;
44
+ const versions = (0, waiting_episode_state_1.snapshotEpisodeVersions)(worktreeId);
45
+ const generations = new Map();
46
+ for (const [key, at] of agent_event_turn_1.generationStartedAt) {
47
+ if (key.startsWith(prefix))
48
+ generations.set(key, at);
49
+ }
50
+ return {
51
+ startFor(cliToolId, instanceId) {
52
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
53
+ return { generation: (0, agent_event_turn_1.toGenerationRef)(generations.get(key) ?? null), version: versions.get(key) ?? 0 };
54
+ },
55
+ };
56
+ }
57
+ /**
58
+ * When the frame a scraper just read was fetched (design §2.2
59
+ * `frameCapturedAt`), from `meta` — what the capture reported for that one
60
+ * frame ({@link captureObservedFrame}). A frame served from the cache, or
61
+ * joined to a fetch already in flight, is as old as that fetch, and is never
62
+ * one this observer fetched itself — even when that fetch started in the very
63
+ * millisecond the observer asked. Only a frame the capture fetched itself,
64
+ * starting at or after `requestedAt` (the moment the observer asked, after its
65
+ * start), counts as fetched after the start. A frame nothing was reported for
66
+ * (a capture module a test replaced) is dated 0, before any close (design
67
+ * §2.6): it opens no wait I6 would hold back, and closes no `screen`.
68
+ */
69
+ function captureFrameTime(meta, requestedAt) {
70
+ if (meta === null)
71
+ return { frameCapturedAt: 0, frameFetchedAfterStart: false };
72
+ return {
73
+ frameCapturedAt: Math.min(meta.fetchStartedAt, requestedAt),
74
+ frameFetchedAfterStart: meta.source === 'fetched' && meta.fetchStartedAt >= requestedAt,
75
+ };
76
+ }
77
+ /**
78
+ * Run one capture for an observer and date the frame it returns (Issue #3798):
79
+ * `cli-session` reports where THIS call's frame came from through an async
80
+ * context set up here, so another capture of the same session running at the
81
+ * same time — a different number of lines, a different text — cannot stand in
82
+ * for it.
83
+ */
84
+ async function captureObservedFrame(capture) {
85
+ const reported = { meta: null };
86
+ const requestedAt = Date.now();
87
+ const frame = await frameMetaSink().run((meta) => {
88
+ reported.meta = meta;
89
+ }, capture);
90
+ return { frame, frameTime: captureFrameTime(reported.meta, requestedAt) };
91
+ }
92
+ function screenBinding(generation, originTurnId) {
93
+ return { kind: 'screen', generation, originTurnId };
94
+ }
95
+ function sameBinding(a, b) {
96
+ if (a.kind !== b.kind)
97
+ return false;
98
+ switch (a.kind) {
99
+ case 'turn':
100
+ return a.turnId === b.turnId;
101
+ case 'dialog-only':
102
+ return a.recordTurnId === b.recordTurnId;
103
+ default:
104
+ return true;
105
+ }
106
+ }
107
+ /** Whether the Auto-Yes poller answered this episode and the screen now shows another confirmation (R1-7, PR 3). */
108
+ function answeredThenAnother(obs, episode, k) {
109
+ return (obs.freshPrompt === true &&
110
+ obs.lastAnswer != null &&
111
+ obs.lastAnswer.episodeId === episode.episodeId &&
112
+ k !== null &&
113
+ k !== obs.lastAnswer.screenKey);
114
+ }
115
+ /** Table O-1: a `waiting` reading on the instance's episode (or none). */
116
+ function verdictForWaiting(obs, episode, humanHeld, c, k, current) {
117
+ if (episode === null)
118
+ return { action: 'opened', binding: c };
119
+ const binding = episode.binding;
120
+ // The row below the table: a binding of another generation is replaced (P3-2).
121
+ if (!(0, waiting_episode_verdict_1.sameGeneration)(binding.generation, current))
122
+ return { action: 'replaced', binding: c };
123
+ if (humanHeld) {
124
+ if (binding.kind === 'screen')
125
+ return { action: 'kept' };
126
+ return { action: 'rebound', binding: screenBinding(current, binding.kind === 'turn' ? binding.turnId : null) };
127
+ }
128
+ switch (binding.kind) {
129
+ case 'turn': {
130
+ const stillOpen = c.kind === 'turn' && c.turnId === binding.turnId;
131
+ if (stillOpen)
132
+ return answeredThenAnother(obs, episode, k) ? { action: 'replaced', binding: c } : { action: 'kept' };
133
+ if (c.kind === 'turn')
134
+ return { action: 'replaced', binding: c };
135
+ // T has ended (stop, screen evidence, the 30-minute stale bound — R2-3):
136
+ // only another confirmation replaces it.
137
+ return obs.freshPrompt === true && k !== null && k !== episode.promptScreenKey
138
+ ? { action: 'replaced', binding: c }
139
+ : { action: 'kept' };
140
+ }
141
+ case 'dialog-only':
142
+ if (c.kind === 'turn')
143
+ return { action: 'rebound', binding: c };
144
+ if (c.kind === 'dialog-only' && c.recordTurnId !== binding.recordTurnId)
145
+ return { action: 'replaced', binding: c };
146
+ return { action: 'kept' };
147
+ case 'unattributed':
148
+ if (c.kind === 'unattributed') {
149
+ return answeredThenAnother(obs, episode, k) ? { action: 'replaced', binding: c } : { action: 'kept' };
150
+ }
151
+ if (c.kind === 'dialog-only')
152
+ return { action: 'rebound', binding: c };
153
+ // c = turn(N): the wait turned out to be N's when it shows the same confirmation (R2-4).
154
+ return k !== null && k === episode.promptScreenKey
155
+ ? { action: 'rebound', binding: c }
156
+ : { action: 'replaced', binding: c };
157
+ case 'screen':
158
+ return c.kind === 'turn' && c.turnId === binding.originTurnId
159
+ ? { action: 'rebound', binding: c }
160
+ : { action: 'replaced', binding: c };
161
+ default:
162
+ binding;
163
+ return { action: 'kept' };
164
+ }
165
+ }
166
+ /** Table O-2: the closing side. Null when the reading closes nothing. */
167
+ function closeReasonFor(obs, episode) {
168
+ const { reading } = obs;
169
+ if (reading.kind === 'gone')
170
+ return 'session-gone';
171
+ if (reading.kind !== 'not-waiting')
172
+ return null;
173
+ switch (obs.observer) {
174
+ case 'status-probe':
175
+ return 'screen-cleared';
176
+ case 'response-checker':
177
+ return 'response-recorded';
178
+ case 'auto-yes-poller':
179
+ // A screen only after a frame fetched since it became one (R3-1, P3-1);
180
+ // any other wait only when the poller answered it (PR 3, 規則 3).
181
+ if (episode.binding.kind === 'screen') {
182
+ return obs.frameCapturedAt > Math.max(episode.openedAt, episode.boundAt) ? 'screen-cleared' : null;
183
+ }
184
+ return obs.lastAnswer != null && obs.lastAnswer.episodeId === episode.episodeId ? 'poller-answered' : null;
185
+ default:
186
+ obs.observer;
187
+ return null;
188
+ }
189
+ }
190
+ /** Why the old episode of a replacement ended. */
191
+ function replacedBecause(old, next, current) {
192
+ if (!(0, waiting_episode_verdict_1.sameGeneration)(old.generation, current))
193
+ return 'generation';
194
+ return next.kind === 'turn' || next.kind === 'dialog-only' ? 'turn-superseded' : 'screen-cleared';
195
+ }
196
+ /**
197
+ * Decide what one observation does to the instance's episode (design §2.4
198
+ * 規則 3・4・5, tables O-1 / O-2 and preconditions 1–3). Reads the store and
199
+ * the turn model; writes nothing.
200
+ */
201
+ function planWaitingObservation(obs) {
202
+ const at = obs.now ?? Date.now();
203
+ const parts = { worktreeId: obs.worktreeId, cliToolId: obs.cliToolId, instanceId: obs.instanceId };
204
+ const episode = (0, waiting_episode_state_1.getWaitingEpisodeRecord)(obs.worktreeId, obs.cliToolId, obs.instanceId);
205
+ const current = (0, waiting_episode_binding_resolve_1.generationOf)(parts);
206
+ const base = {
207
+ observation: obs,
208
+ action: 'ignored',
209
+ episodeId: episode?.episodeId ?? null,
210
+ since: obs.reading.kind === 'waiting' ? episode?.since ?? null : null,
211
+ next: null,
212
+ binding: null,
213
+ closeReason: null,
214
+ ignoredBecause: null,
215
+ at,
216
+ };
217
+ const ignored = (because) => ({
218
+ ...base,
219
+ action: 'ignored',
220
+ ignoredBecause: because,
221
+ });
222
+ // Precondition 1: the observer started in another generation.
223
+ if (!(0, waiting_episode_verdict_1.sameGeneration)(obs.start.generation, current))
224
+ return ignored('generation');
225
+ const versionMoved = obs.start.version !== (0, waiting_episode_state_1.getEpisodeVersion)(obs.worktreeId, obs.cliToolId, obs.instanceId) && obs.freshPrompt !== true;
226
+ const { reading } = obs;
227
+ if (reading.kind !== 'waiting') {
228
+ // Table O-2.
229
+ if (episode === null)
230
+ return ignored('nothing-open');
231
+ if (reading.kind === 'unknown')
232
+ return ignored('unknown-frame');
233
+ const reason = closeReasonFor(obs, episode);
234
+ if (reason === null)
235
+ return ignored('not-this-observer');
236
+ if (versionMoved)
237
+ return ignored('version');
238
+ return { ...base, action: 'closed', closeReason: reason, since: null };
239
+ }
240
+ // Table O-1.
241
+ const k = reading.promptData !== null ? (0, prompt_screen_key_1.promptScreenKey)(reading.promptData) : null;
242
+ // 規則 1: a person's screen is `screen` whatever the turn model says, with
243
+ // the open turn as its origin.
244
+ const resolved = (0, waiting_episode_binding_resolve_1.resolveEpisodeBinding)(parts, at);
245
+ const c = reading.humanHeld
246
+ ? screenBinding(current, resolved.kind === 'turn' ? resolved.turnId : null)
247
+ : resolved;
248
+ const verdict = verdictForWaiting(obs, episode, reading.humanHeld, c, k, current);
249
+ if (verdict.action === 'kept')
250
+ return { ...base, action: 'kept' };
251
+ // Precondition 2 (I5 (b) / (d)) and 3 (I6).
252
+ if (versionMoved)
253
+ return ignored('version');
254
+ const lastClosed = (0, waiting_episode_state_1.getLastClosedEpisode)(obs.worktreeId, obs.cliToolId, obs.instanceId);
255
+ const closedBeforeOwnFetch = obs.frameFetchedAfterStart === true &&
256
+ obs.start.version === (0, waiting_episode_state_1.getEpisodeVersion)(obs.worktreeId, obs.cliToolId, obs.instanceId);
257
+ if (lastClosed !== null &&
258
+ !closedBeforeOwnFetch &&
259
+ obs.frameCapturedAt <= lastClosed.at &&
260
+ (k === null || k === lastClosed.promptScreenKey)) {
261
+ return ignored('stale-frame');
262
+ }
263
+ if (verdict.action === 'rebound') {
264
+ if (episode !== null && sameBinding(episode.binding, verdict.binding))
265
+ return { ...base, action: 'kept' };
266
+ return { ...base, action: 'rebound', binding: verdict.binding };
267
+ }
268
+ const binding = verdict.binding;
269
+ const structuredSince = reading.structuredSince;
270
+ const since = verdict.action === 'opened' || episode === null
271
+ ? structuredSince ?? at
272
+ : structuredSince !== null && structuredSince > episode.since
273
+ ? structuredSince
274
+ : at;
275
+ const next = {
276
+ since,
277
+ kind: reading.waitingKind,
278
+ binding,
279
+ openedBy: obs.observer,
280
+ promptScreenKey: k,
281
+ };
282
+ return {
283
+ ...base,
284
+ action: verdict.action,
285
+ since,
286
+ next,
287
+ closeReason: verdict.action === 'replaced' && episode !== null ? replacedBecause(episode.binding, binding, current) : null,
288
+ };
289
+ }
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ /**
3
+ * What a new waiting episode is bound to, read from the turn model (Issue #3798).
4
+ * Split out of `waiting-episode-binding` (Issue #3892), which re-exports it.
5
+ *
6
+ * @module lib/session/waiting-episode-binding-resolve
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.generationOf = generationOf;
10
+ exports.resolveEpisodeBinding = resolveEpisodeBinding;
11
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
12
+ const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
13
+ function generationOf(parts) {
14
+ return (0, agent_event_turn_1.toGenerationRef)((0, agent_event_turn_1.currentGeneration)((0, auto_yes_state_1.buildCompositeKey)(parts.worktreeId, parts.cliToolId, parts.instanceId)));
15
+ }
16
+ /**
17
+ * What an episode opening now is bound to (design §2.4 規則 1).
18
+ *
19
+ * Read from the fenced, aged turn record — the same reading `getAgentTurn`
20
+ * gives every other reader — with the live decisions counted without retiring
21
+ * the expired ones, so deciding a binding writes nothing a transition would
22
+ * later read differently.
23
+ */
24
+ function resolveEpisodeBinding(parts, at) {
25
+ const generation = generationOf(parts);
26
+ const turn = (0, agent_event_turn_1.getAgentTurn)(parts.worktreeId, parts.cliToolId, parts.instanceId, at);
27
+ if (turn === null)
28
+ return { kind: 'unattributed', generation, lastClosedTurnId: null };
29
+ if (turn.closedAt === null && turn.openedAt !== null) {
30
+ return { kind: 'turn', generation, turnId: turn.turnId };
31
+ }
32
+ if (turn.closedAt === null && (0, agent_event_turn_1.liveDecisionCount)(turn, at) > 0) {
33
+ return { kind: 'dialog-only', generation, recordTurnId: turn.turnId, sessionId: turn.sessionId };
34
+ }
35
+ // A closed turn, or a record holding no live decision (an `idle_prompt`
36
+ // display record, or a forecast whose 20 s ran out).
37
+ return { kind: 'unattributed', generation, lastClosedTurnId: turn.turnId };
38
+ }