commandmate 0.47.0 → 0.48.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 (696) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +501 -501
  3. package/.next/app-path-routes-manifest.json +34 -34
  4. package/.next/build-manifest.json +8 -8
  5. package/.next/diagnostics/framework.json +1 -1
  6. package/.next/next-minimal-server.js.nft.json +1 -1
  7. package/.next/next-server.js.nft.json +1 -1
  8. package/.next/prerender-manifest.json +12 -12
  9. package/.next/react-loadable-manifest.json +1 -1
  10. package/.next/required-server-files.json +1 -1
  11. package/.next/server/app/_not-found/page.js +2 -2
  12. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/agents/update/route.js +2 -2
  15. package/.next/server/app/api/agents/update/route.js.nft.json +1 -1
  16. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/agents/versions/route.js +1 -1
  18. package/.next/server/app/api/agents/versions/route.js.nft.json +1 -1
  19. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/app/release-notes/route.js +1 -1
  21. package/.next/server/app/api/app/release-notes/route.js.nft.json +1 -1
  22. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/app/update/route.js +5 -5
  24. package/.next/server/app/api/app/update/route.js.nft.json +1 -1
  25. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/app/update-check/route.js +1 -1
  27. package/.next/server/app/api/app/update-check/route.js.nft.json +1 -1
  28. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/auth/login/route.js +1 -1
  30. package/.next/server/app/api/auth/login/route.js.nft.json +1 -1
  31. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/auth/logout/route.js +1 -1
  33. package/.next/server/app/api/auth/logout/route.js.nft.json +1 -1
  34. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/status/route.js +1 -1
  36. package/.next/server/app/api/auth/status/route.js.nft.json +1 -1
  37. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/capabilities/route.js +1 -1
  39. package/.next/server/app/api/capabilities/route.js.nft.json +1 -1
  40. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/daily-summary/route.js +1 -1
  42. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  43. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  45. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  46. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  48. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  49. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  51. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  52. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/external-apps/route.js +1 -1
  54. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  55. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/fs/browse/route.js +1 -1
  57. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -1
  58. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  60. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -1
  61. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  63. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  64. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  66. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  67. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  69. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  70. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/metrics/vibe/route.js +2 -2
  72. package/.next/server/app/api/metrics/vibe/route.js.nft.json +1 -1
  73. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/ollama/models/route.js +1 -1
  75. package/.next/server/app/api/ollama/models/route.js.nft.json +1 -1
  76. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/push/escalation/route.js +1 -1
  78. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  79. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  81. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  82. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/push/vapid/route.js +1 -1
  84. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  85. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  87. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  88. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/relays/route.js +1 -1
  90. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  91. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/remote/pair/route.js +2 -2
  93. package/.next/server/app/api/remote/pair/route.js.nft.json +1 -1
  94. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  96. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  97. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  99. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  100. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/repositories/clone/route.js +1 -1
  102. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  103. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  105. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  106. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/repositories/restore/route.js +1 -1
  108. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  109. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/repositories/route.js +1 -1
  111. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  112. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/repositories/scan/route.js +1 -1
  114. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  115. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/repositories/sync/route.js +1 -1
  117. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  118. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/repositories/validate-path/route.js +1 -1
  120. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -1
  121. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  123. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  124. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/settings/default-surface-mode/route.js +1 -1
  126. package/.next/server/app/api/settings/default-surface-mode/route.js.nft.json +1 -1
  127. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  129. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  130. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/skills/[id]/route.js +1 -1
  132. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  133. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/skills/installations/route.js +1 -1
  135. package/.next/server/app/api/skills/installations/route.js.nft.json +1 -1
  136. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/skills/operations/route.js +2 -2
  138. package/.next/server/app/api/skills/operations/route.js.nft.json +1 -1
  139. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/skills/reindex/route.js +1 -1
  141. package/.next/server/app/api/skills/reindex/route.js.nft.json +1 -1
  142. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/skills/route.js +1 -1
  144. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  145. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/slash-commands/route.js +1 -1
  147. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  148. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/tasks/[taskId]/cancel/route.js +1 -1
  150. package/.next/server/app/api/tasks/[taskId]/cancel/route.js.nft.json +1 -1
  151. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  153. package/.next/server/app/api/tasks/[taskId]/route.js.nft.json +1 -1
  154. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/templates/[id]/route.js +1 -1
  156. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  157. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/templates/route.js +1 -1
  159. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  160. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  162. package/.next/server/app/api/verification/runs/[runId]/route.js.nft.json +1 -1
  163. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/verification/runs/route.js +1 -1
  165. package/.next/server/app/api/verification/runs/route.js.nft.json +1 -1
  166. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +7 -7
  183. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/env/route.js +2 -2
  192. package/.next/server/app/api/worktrees/[id]/env/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +3 -3
  198. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  253. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  256. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  262. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js.nft.json +1 -1
  274. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  291. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  298. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  313. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  315. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  318. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js.nft.json +1 -1
  319. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  320. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  321. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  322. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  323. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  324. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  325. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  326. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  327. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  328. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  329. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  330. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  331. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  332. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  333. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  334. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  335. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  336. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  337. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  338. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  339. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  340. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  341. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +5 -5
  342. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  343. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  344. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  345. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  346. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  347. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  348. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  349. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  350. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  351. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  352. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  353. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  354. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  355. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  356. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -1
  357. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -1
  358. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  359. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  360. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -1
  361. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  362. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  363. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  364. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  365. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  366. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  367. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  368. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  369. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  370. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  371. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  372. package/.next/server/app/api/worktrees/[id]/tasks/route.js.nft.json +1 -1
  373. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  374. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -103
  375. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  376. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  377. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  378. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  379. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  380. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  381. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  382. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  383. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  384. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  385. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  386. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  387. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  388. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  389. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  390. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  391. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  392. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  393. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  394. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  395. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  396. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  397. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  398. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +2 -2
  399. package/.next/server/app/api/worktrees/[id]/verify/config/route.js.nft.json +1 -1
  400. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  401. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  402. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  403. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  404. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  405. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  406. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  407. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  408. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js.nft.json +1 -1
  409. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  410. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  411. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js.nft.json +1 -1
  412. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  413. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  414. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  415. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  416. package/.next/server/app/api/worktrees/apply-default-agents/route.js +1 -1
  417. package/.next/server/app/api/worktrees/apply-default-agents/route.js.nft.json +1 -1
  418. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  419. package/.next/server/app/api/worktrees/route.js +1 -1
  420. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  421. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  422. package/.next/server/app/apple-icon.png/route.js +1 -1
  423. package/.next/server/app/apple-icon.png/route.js.nft.json +1 -1
  424. package/.next/server/app/apple-icon.png.meta +1 -1
  425. package/.next/server/app/icon.png/route.js +1 -1
  426. package/.next/server/app/icon.png/route.js.nft.json +1 -1
  427. package/.next/server/app/icon.png.meta +1 -1
  428. package/.next/server/app/icon1.png/route.js +1 -1
  429. package/.next/server/app/icon1.png/route.js.nft.json +1 -1
  430. package/.next/server/app/icon1.png.meta +1 -1
  431. package/.next/server/app/icon2.png/route.js +1 -1
  432. package/.next/server/app/icon2.png/route.js.nft.json +1 -1
  433. package/.next/server/app/icon2.png.meta +1 -1
  434. package/.next/server/app/login/page.js +2 -2
  435. package/.next/server/app/login/page.js.nft.json +1 -1
  436. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  437. package/.next/server/app/manifest.webmanifest/route.js +2 -2
  438. package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  439. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  440. package/.next/server/app/manifest.webmanifest.meta +1 -1
  441. package/.next/server/app/more/page.js +2 -2
  442. package/.next/server/app/more/page.js.nft.json +1 -1
  443. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  444. package/.next/server/app/offline/page.js +2 -2
  445. package/.next/server/app/offline/page.js.nft.json +1 -1
  446. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  447. package/.next/server/app/page.js +2 -2
  448. package/.next/server/app/page.js.nft.json +1 -1
  449. package/.next/server/app/page_client-reference-manifest.js +1 -1
  450. package/.next/server/app/proxy/[...path]/route.js +1 -1
  451. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  452. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  453. package/.next/server/app/repositories/page.js +2 -2
  454. package/.next/server/app/repositories/page.js.nft.json +1 -1
  455. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  456. package/.next/server/app/review/page.js +2 -2
  457. package/.next/server/app/review/page.js.nft.json +1 -1
  458. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  459. package/.next/server/app/sessions/page.js +2 -2
  460. package/.next/server/app/sessions/page.js.nft.json +1 -1
  461. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  462. package/.next/server/app/skills/[skillId]/page.js +2 -2
  463. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  464. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  465. package/.next/server/app/skills/installed/page.js +2 -2
  466. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  467. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  468. package/.next/server/app/skills/page.js +2 -2
  469. package/.next/server/app/skills/page.js.nft.json +1 -1
  470. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  471. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  472. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  473. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  474. package/.next/server/app/worktrees/[id]/page.js +12 -12
  475. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  476. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  477. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  478. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  479. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  480. package/.next/server/app-paths-manifest.json +34 -34
  481. package/.next/server/chunks/{5048.js → 1185.js} +1 -1
  482. package/.next/server/chunks/1191.js +11 -4
  483. package/.next/server/chunks/1501.js +1 -1
  484. package/.next/server/chunks/1601.js +2 -2
  485. package/.next/server/chunks/1656.js +19 -0
  486. package/.next/server/chunks/1945.js +3 -3
  487. package/.next/server/chunks/1990.js +103 -0
  488. package/.next/server/chunks/2119.js +1 -1
  489. package/.next/server/chunks/2404.js +1 -1
  490. package/.next/server/chunks/2422.js +1 -1
  491. package/.next/server/chunks/2445.js +1 -1
  492. package/.next/server/chunks/2534.js +1 -1
  493. package/.next/server/chunks/255.js +1 -0
  494. package/.next/server/chunks/3241.js +1 -1
  495. package/.next/server/chunks/3505.js +7 -0
  496. package/.next/server/chunks/3897.js +22 -0
  497. package/.next/server/chunks/4072.js +5 -5
  498. package/.next/server/chunks/4248.js +1 -1
  499. package/.next/server/chunks/4280.js +1 -0
  500. package/.next/server/chunks/463.js +1 -0
  501. package/.next/server/chunks/5209.js +1 -1
  502. package/.next/server/chunks/5611.js +1 -1
  503. package/.next/server/chunks/6119.js +1 -0
  504. package/.next/server/chunks/6130.js +1 -1
  505. package/.next/server/chunks/6345.js +1 -1
  506. package/.next/server/chunks/6401.js +1 -1
  507. package/.next/server/chunks/6486.js +9 -8
  508. package/.next/server/chunks/6781.js +1 -1
  509. package/.next/server/chunks/6784.js +1 -0
  510. package/.next/server/chunks/720.js +103 -0
  511. package/.next/server/chunks/7604.js +2 -0
  512. package/.next/server/chunks/7905.js +1 -1
  513. package/.next/server/chunks/8581.js +7 -7
  514. package/.next/server/chunks/8728.js +3 -3
  515. package/.next/server/chunks/8791.js +1 -1
  516. package/.next/server/chunks/8807.js +19 -18
  517. package/.next/server/chunks/8918.js +2 -104
  518. package/.next/server/chunks/9130.js +1 -1
  519. package/.next/server/chunks/936.js +1 -1
  520. package/.next/server/chunks/9390.js +1 -1
  521. package/.next/server/chunks/9540.js +1 -1
  522. package/.next/server/chunks/9627.js +4 -4
  523. package/.next/server/chunks/9731.js +3 -3
  524. package/.next/server/middleware-build-manifest.js +1 -1
  525. package/.next/server/middleware-manifest.json +5 -5
  526. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  527. package/.next/server/pages/500.html +1 -1
  528. package/.next/server/pages/_document.js.nft.json +1 -1
  529. package/.next/server/pages/_error.js +3 -3
  530. package/.next/server/pages/_error.js.nft.json +1 -1
  531. package/.next/server/server-reference-manifest.json +1 -1
  532. package/.next/server/src/middleware.js.map +1 -1
  533. package/.next/static/chunks/{1111.5ab4f0ffb0d944e5.js → 1111.1b653d4a9816a0a7.js} +8 -8
  534. package/.next/static/chunks/{1255-7e5873f06b25e129.js → 1255-a85690d352f4f8fd.js} +1 -1
  535. package/.next/static/chunks/2099-c3e0ab70a1b95dd3.js +1 -0
  536. package/.next/static/chunks/{2407-b2f524f99f7fc353.js → 2407-26139a8a2f1adbe8.js} +1 -1
  537. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  538. package/.next/static/chunks/{2863-6a07ec82fb52f4dd.js → 2863-f0121af1cbbedb3b.js} +1 -1
  539. package/.next/static/chunks/{8165-263172c17ae8e8c3.js → 8165-c68b3dc844210e6a.js} +1 -1
  540. package/.next/static/chunks/8407-35bbfc84793d7004.js +1 -0
  541. package/.next/static/chunks/9079-406b84d3cc891a87.js +1 -0
  542. package/.next/static/chunks/9465-b59bb255b376c813.js +1 -0
  543. package/.next/static/chunks/app/{layout-419eaf7de340f4ab.js → layout-46b4cbf07520d9b6.js} +1 -1
  544. package/.next/static/chunks/app/sessions/page-fb241bed579c67aa.js +1 -0
  545. package/.next/static/chunks/app/worktrees/[id]/page-cbc7749a33450cc5.js +1 -0
  546. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  547. package/.next/static/chunks/main-37ca13e38030fe8b.js +1 -0
  548. package/.next/static/chunks/{webpack-468b7b33030234b3.js → webpack-838df0273b03af19.js} +1 -1
  549. package/.next/trace +13 -13
  550. package/dist/cli/commands/auto-yes.d.ts +24 -0
  551. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  552. package/dist/cli/commands/auto-yes.js +73 -3
  553. package/dist/cli/commands/instances.d.ts.map +1 -1
  554. package/dist/cli/commands/instances.js +10 -1
  555. package/dist/cli/commands/prompt.d.ts.map +1 -1
  556. package/dist/cli/commands/prompt.js +28 -14
  557. package/dist/cli/commands/send.d.ts.map +1 -1
  558. package/dist/cli/commands/send.js +15 -0
  559. package/dist/cli/commands/wait.d.ts.map +1 -1
  560. package/dist/cli/commands/wait.js +108 -14
  561. package/dist/cli/docs/agent-operations.d.ts +2 -2
  562. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  563. package/dist/cli/docs/agent-operations.js +27 -0
  564. package/dist/cli/types/api-responses.d.ts +131 -4
  565. package/dist/cli/types/api-responses.d.ts.map +1 -1
  566. package/dist/cli/types/index.d.ts +4 -0
  567. package/dist/cli/types/index.d.ts.map +1 -1
  568. package/dist/cli/utils/resource-resolvers.d.ts +0 -18
  569. package/dist/cli/utils/resource-resolvers.d.ts.map +1 -1
  570. package/dist/cli/utils/resource-resolvers.js +1 -51
  571. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +65 -2
  572. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  573. package/dist/lib/polling/auto-yes-suppression-reason.js +36 -2
  574. package/dist/lib/prompt-observation/types.d.ts +13 -0
  575. package/dist/lib/prompt-observation/types.d.ts.map +1 -1
  576. package/dist/server/locales/en/worktree.json +2 -1
  577. package/dist/server/locales/ja/worktree.json +2 -1
  578. package/dist/server/src/lib/auto-yes-poller-answer-target.js +38 -0
  579. package/dist/server/src/lib/auto-yes-poller-keys.js +35 -0
  580. package/dist/server/src/lib/auto-yes-poller-session-presence.js +26 -0
  581. package/dist/server/src/lib/auto-yes-poller-tick.js +233 -0
  582. package/dist/server/src/lib/auto-yes-poller.js +468 -792
  583. package/dist/server/src/lib/auto-yes-state.js +50 -2
  584. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +107 -14
  585. package/dist/server/src/lib/db/chat-db.js +5 -1
  586. package/dist/server/src/lib/db/verification-db.js +23 -2
  587. package/dist/server/src/lib/detection/option-recommendation.js +120 -0
  588. package/dist/server/src/lib/detection/prompt-detect-multiple-choice-approval-context.js +290 -0
  589. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +396 -268
  590. package/dist/server/src/lib/detection/prompt-detector.js +92 -21
  591. package/dist/server/src/lib/detection/prompt-screen-key.js +60 -0
  592. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +158 -35
  593. package/dist/server/src/lib/detection/tools/claude/detect.js +111 -10
  594. package/dist/server/src/lib/detection/tools/command-code/dialog.js +67 -0
  595. package/dist/server/src/lib/detection/tools/dialog-block.js +16 -0
  596. package/dist/server/src/lib/detection/waiting-screen-reading.js +98 -0
  597. package/dist/server/src/lib/hooks/permission-adjudication.js +26 -0
  598. package/dist/server/src/lib/hooks/permission-decision-service.js +49 -4
  599. package/dist/server/src/lib/hooks/permission-request-payload.js +20 -0
  600. package/dist/server/src/lib/hooks/sources/antigravity/source.js +21 -0
  601. package/dist/server/src/lib/hooks/sources/claude/source.js +3 -0
  602. package/dist/server/src/lib/hooks/sources/codex/source.js +2 -0
  603. package/dist/server/src/lib/hooks/sources/command-code/source.js +2 -0
  604. package/dist/server/src/lib/hooks/sources/copilot/source.js +2 -0
  605. package/dist/server/src/lib/hooks/sources/gemini/source.js +2 -0
  606. package/dist/server/src/lib/hooks/sources/legacy-relay.js +2 -0
  607. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
  608. package/dist/server/src/lib/hooks/sources/opencode/source.js +2 -0
  609. package/dist/server/src/lib/hooks/sources/opencode-v2/ingest.js +6 -0
  610. package/dist/server/src/lib/hooks/sources/opencode-v2/source.js +2 -0
  611. package/dist/server/src/lib/hooks/sources/pending-decisions.js +14 -2
  612. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +14 -3
  613. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +21 -1
  614. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +2 -2
  615. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger-types.js +117 -0
  616. package/dist/server/src/lib/polling/auto-yes-confirmation-ledger.js +1091 -0
  617. package/dist/server/src/lib/polling/auto-yes-decision-state.js +195 -0
  618. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +139 -10
  619. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +14 -0
  620. package/dist/server/src/lib/polling/auto-yes-ledger-records.js +143 -0
  621. package/dist/server/src/lib/polling/auto-yes-manual-answer.js +122 -0
  622. package/dist/server/src/lib/polling/auto-yes-option-effect.js +157 -0
  623. package/dist/server/src/lib/polling/auto-yes-policy.js +46 -11
  624. package/dist/server/src/lib/polling/auto-yes-poller-capture.js +63 -0
  625. package/dist/server/src/lib/polling/auto-yes-poller-enter-fallback.js +37 -0
  626. package/dist/server/src/lib/polling/auto-yes-poller-generation.js +192 -0
  627. package/dist/server/src/lib/polling/auto-yes-poller-receipt-log.js +324 -0
  628. package/dist/server/src/lib/polling/auto-yes-poller-state.js +193 -26
  629. package/dist/server/src/lib/polling/auto-yes-poller-steps.js +279 -0
  630. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +13 -2
  631. package/dist/server/src/lib/polling/auto-yes-question-choice.js +57 -0
  632. package/dist/server/src/lib/polling/auto-yes-resolver.js +117 -22
  633. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +36 -2
  634. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +25 -1
  635. package/dist/server/src/lib/polling/prompt-screen-reading.js +232 -0
  636. package/dist/server/src/lib/polling/response-checker-blank-response.js +30 -0
  637. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +39 -0
  638. package/dist/server/src/lib/polling/response-checker.js +138 -53
  639. package/dist/server/src/lib/prompt-answer-sender.js +104 -10
  640. package/dist/server/src/lib/prompt-observation/appearance.js +165 -0
  641. package/dist/server/src/lib/push/notification-dedup.js +15 -2
  642. package/dist/server/src/lib/push/prompt-card-state.js +140 -19
  643. package/dist/server/src/lib/push/prompt-push-gate.js +158 -12
  644. package/dist/server/src/lib/push/push-sender.js +23 -3
  645. package/dist/server/src/lib/push/resolution-push-notifier.js +14 -0
  646. package/dist/server/src/lib/push/waiting-push-notifier.js +139 -17
  647. package/dist/server/src/lib/realtime/terminal-broadcast.js +16 -0
  648. package/dist/server/src/lib/session/agent-event-state.js +25 -5
  649. package/dist/server/src/lib/session/agent-event-turn.js +140 -46
  650. package/dist/server/src/lib/session/cli-session.js +21 -2
  651. package/dist/server/src/lib/session/current-output-builder.js +64 -11
  652. package/dist/server/src/lib/session/send-attempt-state.js +23 -7
  653. package/dist/server/src/lib/session/waiting-episode-binding-observation.js +289 -0
  654. package/dist/server/src/lib/session/waiting-episode-binding-resolve.js +38 -0
  655. package/dist/server/src/lib/session/waiting-episode-binding.js +276 -0
  656. package/dist/server/src/lib/session/waiting-episode-state.js +307 -17
  657. package/dist/server/src/lib/session/waiting-episode-verdict.js +174 -0
  658. package/dist/server/src/lib/tmux/tmux-capture-cache.js +76 -11
  659. package/dist/server/src/lib/tmux/tmux.js +54 -9
  660. package/dist/server/src/lib/verification/gate-runner.js +162 -13
  661. package/dist/server/src/lib/verification/machine-lock.js +5 -0
  662. package/dist/server/src/lib/ws-server.js +18 -3
  663. package/dist/server/src/types/auto-yes-answer-mode.js +38 -0
  664. package/dist/server/src/types/auto-yes-decision.js +61 -0
  665. package/dist/server/src/types/auto-yes.js +6 -0
  666. package/dist/server/src/types/prompt-reading.js +32 -0
  667. package/dist/types/auto-yes-answer-mode.d.ts +35 -0
  668. package/dist/types/auto-yes-answer-mode.d.ts.map +1 -0
  669. package/dist/types/auto-yes-answer-mode.js +38 -0
  670. package/docs/en/user-guide/webapp-guide.md +33 -4
  671. package/package.json +2 -2
  672. package/public/sw.js +76 -4
  673. package/release-notes/0.47.1.json +20 -0
  674. package/release-notes/0.47.2.json +20 -0
  675. package/release-notes/0.48.0.json +57 -0
  676. package/scripts/hooks/cmate-agent-event.sh +22 -0
  677. package/.next/server/chunks/1331.js +0 -22
  678. package/.next/server/chunks/1559.js +0 -2
  679. package/.next/server/chunks/1836.js +0 -1
  680. package/.next/server/chunks/1944.js +0 -1
  681. package/.next/server/chunks/2328.js +0 -1
  682. package/.next/server/chunks/2460.js +0 -1
  683. package/.next/server/chunks/5292.js +0 -7
  684. package/.next/server/chunks/5595.js +0 -1
  685. package/.next/server/chunks/7166.js +0 -19
  686. package/.next/server/chunks/9051.js +0 -1
  687. package/.next/server/chunks/9199.js +0 -1
  688. package/.next/static/chunks/602-1c1488959215e140.js +0 -1
  689. package/.next/static/chunks/8407-155f84e5ba05f1d5.js +0 -1
  690. package/.next/static/chunks/9079-24f9fa549ed298f1.js +0 -1
  691. package/.next/static/chunks/9465-e5a351baa941f31b.js +0 -1
  692. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +0 -1
  693. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +0 -1
  694. package/.next/static/chunks/main-ac91ed6e71380841.js +0 -1
  695. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_buildManifest.js +0 -0
  696. /package/.next/static/{b5BiQC9F6r_XFPdA9cuSj → PTlAswXLq8PAe2vUJ8dVP}/_ssgManifest.js +0 -0
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * Which option Auto-Yes answers a question with under the `recommended`
4
+ * answer mode (Issue #3863).
5
+ *
6
+ * Only the choice among a question's options. Whether the screen is a
7
+ * question at all (`classifyAutoYesQuestion`), whether the mode lets Auto-Yes
8
+ * answer it, and what the contract allows are decided elsewhere; a permission
9
+ * dialog keeps #3822's rule (the one "allow this call once" row) and never
10
+ * reaches this.
11
+ *
12
+ * The rule (the user's decision of 2026-10-24):
13
+ *
14
+ * - exactly one option's title ends in a recommendation marker → that option,
15
+ * wherever it is in the list and wherever the cursor is;
16
+ * - no option is recommended (every reading `false`) → the default: the
17
+ * cursor's option, else option 1;
18
+ * - otherwise nothing is chosen: an option whose title could not be told from
19
+ * its description (`'unknown'`, or no reading at all), two or more
20
+ * recommended options, a chosen option that takes typed text, or a
21
+ * multi-select question.
22
+ *
23
+ * Client-safe: no server-only imports (the resolver that calls it is walked by
24
+ * the client-import guard).
25
+ *
26
+ * @module lib/polling/auto-yes-question-choice
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.chooseRecommendedOption = chooseRecommendedOption;
30
+ /**
31
+ * Choose a question's answer under the `recommended` mode.
32
+ *
33
+ * @param options - The question's options, as the reader read them
34
+ * @param recommendations - Per option, what its title says (`PromptDetectionResult.optionRecommendations`);
35
+ * absent or of another length reads as `'unknown'` for every option
36
+ * @param multiSelect - Whether the question takes several answers
37
+ */
38
+ function chooseRecommendedOption(options, recommendations, multiSelect) {
39
+ if (multiSelect)
40
+ return { kind: 'unidentified', cause: 'multi-select' };
41
+ if (options.length === 0)
42
+ return { kind: 'unidentified', cause: 'no-options' };
43
+ if (recommendations === undefined || recommendations.length !== options.length) {
44
+ return { kind: 'unidentified', cause: 'unknown-title' };
45
+ }
46
+ if (recommendations.some((value) => value === 'unknown'))
47
+ return { kind: 'unidentified', cause: 'unknown-title' };
48
+ const recommended = options.filter((_, index) => recommendations[index] === true);
49
+ if (recommended.length > 1)
50
+ return { kind: 'unidentified', cause: 'several-recommended' };
51
+ const [option, basis] = recommended.length === 1
52
+ ? [recommended[0], 'recommended']
53
+ : [options.find((candidate) => candidate.isDefault) ?? options[0], 'default'];
54
+ if (option.requiresTextInput)
55
+ return { kind: 'unidentified', cause: 'typed-text' };
56
+ return { kind: 'chosen', option, basis };
57
+ }
@@ -9,6 +9,15 @@
9
9
  * confirm is a separate row, so a default is half an answer)
10
10
  * - multiple_choice with default option -> default option number
11
11
  * - multiple_choice without default -> first option number
12
+ * - Issue #3822: a permission dialog (a row reads as one of the effects in
13
+ * `auto-yes-option-effect`) -> the number of its one "allow this call once"
14
+ * row, wherever the default is; withheld as `allow-once-unidentified` when
15
+ * there is no such row or more than one
16
+ * - Issue #3863: a question under the `recommended` answer mode (the caller
17
+ * passes `question`) -> its recommended option, else its default; withheld
18
+ * as `recommended-option-unidentified` when that cannot be told
19
+ * (`auto-yes-question-choice`). A question that reads as a permission
20
+ * dialog keeps the allow-once rule above.
12
21
  * - option requiring text input -> null (skip)
13
22
  * - unknown type -> null (skip)
14
23
  *
@@ -18,16 +27,32 @@
18
27
  * omitting it (or passing one that states nothing) reproduces the pre-#1547
19
28
  * behaviour exactly, which is what keeps contract-less operation untouched.
20
29
  *
21
- * Client-safe: no server-only imports, because a 'use client' hook
22
- * (`hooks/useAutoYes.ts`) imports this module.
30
+ * Client-safe: no server-only imports. A 'use client' hook
31
+ * (`hooks/useAutoYes.ts`) imported this module until Issue #3821 retired the
32
+ * browser's answers; the guard `use-auto-yes-client-imports-3748` still walks it.
23
33
  */
24
34
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.MAX_DENY_MATCH_TEXT_LENGTH = exports.MAX_DENY_PATTERN_LENGTH = void 0;
35
+ exports.MAX_DENY_MATCH_TEXT_LENGTH = exports.MAX_DENY_PATTERN_LENGTH = exports.AUTO_YES_POLICY_UNKNOWN = void 0;
36
+ exports.isAutoYesPolicyUnknown = isAutoYesPolicyUnknown;
37
+ exports.policyLookupMode = policyLookupMode;
26
38
  exports.evaluatePolicyAgainstTexts = evaluatePolicyAgainstTexts;
27
39
  exports.resolveAutoAnswerWithPolicy = resolveAutoAnswerWithPolicy;
28
40
  exports.resolveAutoAnswer = resolveAutoAnswer;
29
41
  const auto_yes_config_1 = require("../../config/auto-yes-config");
42
+ const auto_yes_suppression_reason_1 = require("./auto-yes-suppression-reason");
30
43
  const prompt_answer_semantic_1 = require("../../lib/prompt-answer-semantic");
44
+ const auto_yes_option_effect_1 = require("./auto-yes-option-effect");
45
+ const auto_yes_question_choice_1 = require("./auto-yes-question-choice");
46
+ /** The one {@link AutoYesPolicyUnknown} value. */
47
+ exports.AUTO_YES_POLICY_UNKNOWN = Object.freeze({ lookupFailed: true });
48
+ /** Whether the lookup failed, i.e. the contract is not known (Issue #3822). */
49
+ function isAutoYesPolicyUnknown(policy) {
50
+ return policy !== null && policy !== undefined && 'lookupFailed' in policy && policy.lookupFailed === true;
51
+ }
52
+ /** The mode a lookup states, for records and log lines; null for no contract or unknown. */
53
+ function policyLookupMode(policy) {
54
+ return policy && !isAutoYesPolicyUnknown(policy) ? policy.mode : null;
55
+ }
31
56
  /**
32
57
  * Upper bound on a deny pattern, mirroring MAX_PATTERN_LENGTH in
33
58
  * lib/tasks/contract-parser (asserted equal by the unit tests). Contracts are
@@ -41,14 +66,31 @@ exports.MAX_DENY_PATTERN_LENGTH = 200;
41
66
  * A prompt question or option label is a few hundred characters; the bound only
42
67
  * exists so a pathological pane cannot make every poll scan megabytes with 32
43
68
  * patterns. Matching is over the head of the field, deterministically.
69
+ *
70
+ * Issue #3881: a field cut here was not shown to the patterns whole, exactly
71
+ * like an approval target cut at its 12-row cap, so a miss over its head is
72
+ * not a pass: it withholds as `deny-pattern-unusable` (no pattern named). A
73
+ * match inside the head is still `deny-pattern`.
44
74
  */
45
75
  exports.MAX_DENY_MATCH_TEXT_LENGTH = 20_000;
46
- /** The pre-policy resolution: the rules as they were before Issue #1547. */
47
- function resolveBaseAnswer(promptData) {
76
+ /**
77
+ * The pre-policy resolution: the rules as they were before Issue #1547, with
78
+ * the permission rows read by effect (Issue #3822).
79
+ */
80
+ function resolveBaseAnswer(promptData, cliToolId, question) {
48
81
  if (promptData.type === 'yes_no') {
49
- return 'y';
82
+ return { answer: 'y' };
50
83
  }
51
84
  if (promptData.type === 'multiple_choice') {
85
+ // Issue #3863: a question answered with its recommended option. Not for a
86
+ // question whose rows read as a permission dialog — a recommendation never
87
+ // picks which permission to grant (#3822's rule below decides that).
88
+ if (question !== undefined && (0, auto_yes_option_effect_1.selectAllowOnceOption)(promptData.options, cliToolId).kind === 'not-a-permission-dialog') {
89
+ const choice = (0, auto_yes_question_choice_1.chooseRecommendedOption)(promptData.options, question.optionRecommendations, (0, prompt_answer_semantic_1.isMultiSelectPrompt)(promptData));
90
+ return choice.kind === 'chosen'
91
+ ? { answer: choice.option.number.toString() }
92
+ : { answer: null, withheldBy: auto_yes_suppression_reason_1.RECOMMENDED_OPTION_UNIDENTIFIED_SUPPRESSION_REASON };
93
+ }
52
94
  // Issue #2755: a checkbox question. A number ticks a box and the confirm is
53
95
  // a separate row, so "the default option" is not an answer — it is half of
54
96
  // one. Auto-Yes refuses the prompt instead of ticking something and stopping.
@@ -57,19 +99,28 @@ function resolveBaseAnswer(promptData) {
57
99
  // / `[X]` / `[✔]`) is refused too — the sender answers such a list with
58
100
  // Space→Next→Enter, which would tick the default and submit the list.
59
101
  if ((0, prompt_answer_semantic_1.isMultiSelectPrompt)(promptData)) {
60
- return null;
102
+ return { answer: null };
61
103
  }
62
- const defaultOpt = promptData.options.find(o => o.isDefault);
63
- const target = defaultOpt ?? promptData.options[0];
104
+ // Issue #3822: on a permission dialog the default row may save a rule,
105
+ // change the mode or deny (agy keeps the cursor where it was left), so the
106
+ // answer is the one row that allows this call once, by its number — never
107
+ // whatever the cursor or row 1 happens to be.
108
+ const selection = (0, auto_yes_option_effect_1.selectAllowOnceOption)(promptData.options, cliToolId);
109
+ if (selection.kind === 'unidentified') {
110
+ return { answer: null, withheldBy: auto_yes_suppression_reason_1.ALLOW_ONCE_UNIDENTIFIED_SUPPRESSION_REASON };
111
+ }
112
+ const target = selection.kind === 'allow-once'
113
+ ? selection.option
114
+ : promptData.options.find(o => o.isDefault) ?? promptData.options[0];
64
115
  if (!target) {
65
- return null;
116
+ return { answer: null };
66
117
  }
67
118
  if (target.requiresTextInput) {
68
- return null;
119
+ return { answer: null };
69
120
  }
70
- return target.number.toString();
121
+ return { answer: target.number.toString() };
71
122
  }
72
- return null;
123
+ return { answer: null };
73
124
  }
74
125
  /**
75
126
  * Every piece of prompt text a deny pattern is matched against.
@@ -108,12 +159,14 @@ function collectDenyMatchTexts(promptData) {
108
159
  * Patterns are screened by {@link validateStopPattern} (length, safe-regex2
109
160
  * catastrophic-backtracking detection, syntax) before execution, which is the
110
161
  * same ReDoS defence the stop-pattern path uses. A pattern that fails screening
111
- * — or whose execution throws — is reported as `unusable`, not skipped.
162
+ * — or whose execution throws — is reported as `unusable`, not skipped. So is
163
+ * a miss when a text was cut at {@link MAX_DENY_MATCH_TEXT_LENGTH} (Issue #3881).
112
164
  */
113
165
  function evaluateDenyPatterns(rawTexts, patterns) {
114
166
  if (patterns.length === 0) {
115
167
  return { outcome: 'no-match' };
116
168
  }
169
+ const headCut = rawTexts.some(text => text.length > exports.MAX_DENY_MATCH_TEXT_LENGTH);
117
170
  const texts = rawTexts.map(text => text.length > exports.MAX_DENY_MATCH_TEXT_LENGTH ? text.slice(0, exports.MAX_DENY_MATCH_TEXT_LENGTH) : text);
118
171
  for (const pattern of patterns) {
119
172
  if (pattern.length > exports.MAX_DENY_PATTERN_LENGTH || !(0, auto_yes_config_1.validateStopPattern)(pattern).valid) {
@@ -130,7 +183,9 @@ function evaluateDenyPatterns(rawTexts, patterns) {
130
183
  }
131
184
  }
132
185
  }
133
- return { outcome: 'no-match' };
186
+ // Issue #3881: no pattern matched the heads, but a field's tail was never
187
+ // shown to them — evaluated over part of the request, which is no pass.
188
+ return headCut ? { outcome: 'unusable' } : { outcome: 'no-match' };
134
189
  }
135
190
  /**
136
191
  * Decide whether the policy forbids answering, given the prompt type and the
@@ -151,11 +206,22 @@ function evaluateDenyPatterns(rawTexts, patterns) {
151
206
  *
152
207
  * @param promptType - How the prompt would be classified on screen
153
208
  * @param denyMatchTexts - The only strings deny patterns are matched against
209
+ * Issue #3822: an unknown policy (the lookup failed) denies before anything
210
+ * else — it is not "no contract", and answering would ignore an `off` or a deny
211
+ * pattern the contract may state.
212
+ *
154
213
  * @param policy - Contract policy; null/undefined permits everything
214
+ * @param denySurfaceIncomplete - Issue #3881: the texts are known to be only
215
+ * part of what the prompt asks about (`approvalTargetCompleteness`), so a
216
+ * deny miss withholds as `deny-pattern-unusable`. The hook's structured call
217
+ * is whole and leaves it false.
155
218
  */
156
- function evaluatePolicyAgainstTexts(promptType, denyMatchTexts, policy) {
219
+ function evaluatePolicyAgainstTexts(promptType, denyMatchTexts, policy, denySurfaceIncomplete = false) {
157
220
  if (!policy)
158
221
  return null;
222
+ if (isAutoYesPolicyUnknown(policy)) {
223
+ return { reason: auto_yes_suppression_reason_1.POLICY_LOOKUP_FAILED_SUPPRESSION_REASON };
224
+ }
159
225
  if (policy.mode === 'off') {
160
226
  return { reason: 'mode-off' };
161
227
  }
@@ -166,6 +232,18 @@ function evaluatePolicyAgainstTexts(promptType, denyMatchTexts, policy) {
166
232
  if (deny.outcome === 'unusable') {
167
233
  return { reason: 'deny-pattern-unusable', pattern: deny.pattern };
168
234
  }
235
+ // Issue #3881 (H-3): no pattern matched, but the texts are not the whole
236
+ // request — the approval target's upward scan stopped at its line cap with
237
+ // rows above it, or (review P2-1) at the top of a capture that filled its
238
+ // window, and the command may start there. A miss on part of the
239
+ // request is not a pass: the patterns could not be evaluated against what
240
+ // the prompt asks, which is `deny-pattern-unusable`'s fail-closed case.
241
+ // Only when the contract lists patterns; with none there is nothing to miss.
242
+ // (A field cut at MAX_DENY_MATCH_TEXT_LENGTH is the same case, reported by
243
+ // evaluateDenyPatterns as `unusable` above.)
244
+ if (denySurfaceIncomplete && policy.denyPatterns.length > 0) {
245
+ return { reason: 'deny-pattern-unusable' };
246
+ }
169
247
  if (policy.mode === 'safe') {
170
248
  return promptType === 'yes_no' ? null : { reason: 'type-not-allowed' };
171
249
  }
@@ -176,7 +254,9 @@ function evaluatePolicyAgainstTexts(promptType, denyMatchTexts, policy) {
176
254
  }
177
255
  /** {@link evaluatePolicyAgainstTexts} over a detected on-screen prompt. */
178
256
  function evaluatePolicy(promptData, policy) {
179
- return evaluatePolicyAgainstTexts(promptData.type, collectDenyMatchTexts(promptData), policy);
257
+ return evaluatePolicyAgainstTexts(promptData.type, collectDenyMatchTexts(promptData), policy,
258
+ // Issue #3881: cut at the line cap, or at the top of a clipped capture.
259
+ promptData.approvalTargetCompleteness !== undefined);
180
260
  }
181
261
  /**
182
262
  * Resolve the automatic answer, reporting whether a policy withheld it.
@@ -184,13 +264,27 @@ function evaluatePolicy(promptData, policy) {
184
264
  * `suppressedBy` is set only when an answer was actually withheld, so the
185
265
  * escalation log records real suppressions and not prompts the base rules were
186
266
  * never going to answer anyway (an empty option list, an option that needs
187
- * typing). Those still resolve to null, with `suppressedBy` null.
267
+ * typing). Those still resolve to null, with `suppressedBy` null. Issue #3822:
268
+ * a permission dialog with no single "allow this call once" row is a
269
+ * withholding (`allow-once-unidentified`) — it is a dialog Auto-Yes would have
270
+ * answered before, and the operator must be told why it stopped.
188
271
  *
189
272
  * @param promptData - Detected prompt
190
273
  * @param policy - Contract auto-answer policy; omit for the unconstrained behaviour
274
+ * @param cliToolId - The tool that drew the prompt, whose permission rows are
275
+ * read (Issue #3822). Omitted, every measured tool's wording is read
276
+ * (`auto-yes-option-effect`), so a caller that does not know the tool still
277
+ * never picks a row that saves a rule or changes the mode.
278
+ * @param question - Issue #3863: given when the prompt is a question the
279
+ * `recommended` answer mode answers; the answer is then its recommended
280
+ * option (else its default). The contract is evaluated afterwards exactly
281
+ * as for any answer — on the prompt as read, whichever option was chosen.
191
282
  */
192
- function resolveAutoAnswerWithPolicy(promptData, policy) {
193
- const answer = resolveBaseAnswer(promptData);
283
+ function resolveAutoAnswerWithPolicy(promptData, policy, cliToolId, question) {
284
+ const { answer, withheldBy } = resolveBaseAnswer(promptData, cliToolId, question);
285
+ if (withheldBy) {
286
+ return { answer: null, suppressedBy: withheldBy };
287
+ }
194
288
  if (answer === null) {
195
289
  return { answer: null, suppressedBy: null };
196
290
  }
@@ -205,8 +299,9 @@ function resolveAutoAnswerWithPolicy(promptData, policy) {
205
299
  *
206
300
  * @param promptData - Detected prompt
207
301
  * @param policy - Contract auto-answer policy; omit for the unconstrained behaviour
302
+ * @param cliToolId - The tool that drew the prompt; see {@link resolveAutoAnswerWithPolicy}
208
303
  * @returns The answer string to send, or null if auto-answer is not possible
209
304
  */
210
- function resolveAutoAnswer(promptData, policy) {
211
- return resolveAutoAnswerWithPolicy(promptData, policy).answer;
305
+ function resolveAutoAnswer(promptData, policy, cliToolId) {
306
+ return resolveAutoAnswerWithPolicy(promptData, policy, cliToolId).answer;
212
307
  }
@@ -1,22 +1,56 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NO_HOOK_RECEIPT_SUPPRESSION_REASON = exports.QUESTION_CONFIRM_PAGE_SUPPRESSION_REASON = exports.STARTUP_TRUST_UNHANDLED_SUPPRESSION_REASON = exports.PARTIAL_ANSWER_SUPPRESSION_REASON = exports.CONTRACT_SUPPRESSION_REASONS = void 0;
3
+ exports.NO_HOOK_RECEIPT_SUPPRESSION_REASON = exports.RECOMMENDED_OPTION_UNIDENTIFIED_SUPPRESSION_REASON = exports.ALLOW_ONCE_UNIDENTIFIED_SUPPRESSION_REASON = exports.BASE_RULE_SUPPRESSION_REASONS = exports.QUESTION_LEFT_TO_HUMAN_SUPPRESSION_REASON = exports.QUESTION_CONFIRM_PAGE_SUPPRESSION_REASON = exports.STARTUP_TRUST_UNHANDLED_SUPPRESSION_REASON = exports.PARTIAL_ANSWER_SUPPRESSION_REASON = exports.POLICY_LOOKUP_FAILED_SUPPRESSION_REASON = exports.CONTRACT_SUPPRESSION_REASONS = void 0;
4
+ exports.isBaseRuleSuppressionReason = isBaseRuleSuppressionReason;
4
5
  /**
5
6
  * Issue #3796: the reasons `resolveAutoAnswerWithPolicy` returns — the contract's
6
7
  * verdict on the prompt as it is NOW, which a later tick re-evaluates, as
7
- * opposed to a reason that remembers an event (`partial-answer`).
8
+ * opposed to a reason that remembers an event (`partial-answer`). Issue #3822
9
+ * adds the base rules' one withholding, `allow-once-unidentified`, for the same
10
+ * reason.
8
11
  */
9
12
  exports.CONTRACT_SUPPRESSION_REASONS = new Set([
10
13
  'mode-off',
11
14
  'deny-pattern',
12
15
  'deny-pattern-unusable',
13
16
  'type-not-allowed',
17
+ 'policy-lookup-failed',
18
+ // Issue #3822: not the contract's, but the same kind of verdict — on the
19
+ // prompt as it is now, from `resolveAutoAnswerWithPolicy`, re-evaluated later.
20
+ 'allow-once-unidentified',
21
+ // Issue #3863: likewise, over a question under the `recommended` answer mode.
22
+ 'recommended-option-unidentified',
14
23
  ]);
24
+ /** Issue #3822: the reason recorded when the contract lookup failed. */
25
+ exports.POLICY_LOOKUP_FAILED_SUPPRESSION_REASON = 'policy-lookup-failed';
15
26
  /** Issue #3706: the reason the poller records for an answer stopped part-way. */
16
27
  exports.PARTIAL_ANSWER_SUPPRESSION_REASON = 'partial-answer';
17
28
  /** Issue #3757: the reason the poller records over agy's unanswered trust screen. */
18
29
  exports.STARTUP_TRUST_UNHANDLED_SUPPRESSION_REASON = 'startup-trust-unhandled';
19
30
  /** Issue #3748: the reason the poller records over an `AskUserQuestion` confirm page. */
20
31
  exports.QUESTION_CONFIRM_PAGE_SUPPRESSION_REASON = 'question-confirm-page';
32
+ /** Issue #3822: the reason the poller records over a question the tool asks the operator. */
33
+ exports.QUESTION_LEFT_TO_HUMAN_SUPPRESSION_REASON = 'question-left-to-human';
34
+ /**
35
+ * Issue #3822: the reasons `resolveAutoAnswerWithPolicy` returns from its base
36
+ * rules, before the contract is read. Every other reason it returns is the
37
+ * contract's verdict ({@link CONTRACT_SUPPRESSION_REASONS} holds both kinds:
38
+ * both are verdicts on the prompt as it is now). A reader that tells the
39
+ * operator what stopped the answer — the prompt observation, agy's withheld
40
+ * log line — must not send them to the contract for one of these.
41
+ */
42
+ exports.BASE_RULE_SUPPRESSION_REASONS = new Set([
43
+ 'allow-once-unidentified',
44
+ // Issue #3863: a question whose recommended option could not be told.
45
+ 'recommended-option-unidentified',
46
+ ]);
47
+ /** Whether `reason` is the base rules' withholding rather than the contract's (Issue #3822). */
48
+ function isBaseRuleSuppressionReason(reason) {
49
+ return exports.BASE_RULE_SUPPRESSION_REASONS.has(reason);
50
+ }
51
+ /** Issue #3822: the reason the resolver returns over a permission dialog with no single allow-once row. */
52
+ exports.ALLOW_ONCE_UNIDENTIFIED_SUPPRESSION_REASON = 'allow-once-unidentified';
53
+ /** Issue #3863: the reason the resolver returns over a question whose recommended option could not be told. */
54
+ exports.RECOMMENDED_OPTION_UNIDENTIFIED_SUPPRESSION_REASON = 'recommended-option-unidentified';
21
55
  /** Issue #3767: the reason the poller records over an agy dialog with no matching hook receipt. */
22
56
  exports.NO_HOOK_RECEIPT_SUPPRESSION_REASON = 'no-hook-receipt';
@@ -25,21 +25,30 @@
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  exports.recordPolicySuppression = recordPolicySuppression;
27
27
  exports.getLastPolicySuppression = getLastPolicySuppression;
28
+ exports.suppressionPredatesAnswer = suppressionPredatesAnswer;
28
29
  exports.forgetPolicySuppression = forgetPolicySuppression;
29
30
  exports.clearPolicySuppressions = clearPolicySuppressions;
30
31
  const auto_yes_state_1 = require("../../lib/auto-yes-state");
31
32
  const global_state_1 = require("../global-state");
33
+ const waiting_episode_state_1 = require("../session/waiting-episode-state");
32
34
  /** compositeKey -> the most recent policy suppression for that session. */
33
35
  const lastPolicySuppressions = (0, global_state_1.getOrInitGlobal)('__autoYesPolicySuppressions', () => new Map());
34
36
  /**
35
37
  * Record that the policy withheld an answer for `instanceId`'s current prompt.
36
38
  *
39
+ * Issue #3798: the record names the waiting episode open for the instance at
40
+ * this moment — unless the caller names one (a record carried over for the
41
+ * same dialog) — so it is never taken for the reason of a later wait.
42
+ *
37
43
  * @param at - Epoch ms; defaults to now. Overridable so tests are deterministic.
38
44
  */
39
45
  function recordPolicySuppression(worktreeId, cliToolId, instanceId, suppression, at = Date.now()) {
46
+ const { episodeId: carried, ...rest } = suppression;
47
+ const episodeId = carried ?? (0, waiting_episode_state_1.getWaitingEpisodeRecord)(worktreeId, cliToolId, instanceId)?.episodeId;
40
48
  lastPolicySuppressions.set((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId), {
41
- ...suppression,
49
+ ...rest,
42
50
  at,
51
+ ...(episodeId !== undefined ? { episodeId } : {}),
43
52
  });
44
53
  }
45
54
  /**
@@ -50,6 +59,21 @@ function recordPolicySuppression(worktreeId, cliToolId, instanceId, suppression,
50
59
  function getLastPolicySuppression(worktreeId, cliToolId, instanceId) {
51
60
  return lastPolicySuppressions.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
52
61
  }
62
+ /**
63
+ * Whether the record is older than the Auto-Yes answer to the wait it would
64
+ * explain (Issue #3798): the poller's last answer (`lastAnswer`) went to
65
+ * `waitingEpisodeId`, the wait open now, after the record was written. The
66
+ * success path of a send does not clear the record — it stays as history —
67
+ * but the answer is the newer fact, so the record is not that wait's reason
68
+ * any more. The push gate and `current-output` (`lastSuppressionAnswered`,
69
+ * which `cmate wait` reads) both decide it here. A record written at or after
70
+ * the answer, an answer to another episode, no answer and no wait id are not.
71
+ */
72
+ function suppressionPredatesAnswer(suppression, waitingEpisodeId, answer) {
73
+ if (waitingEpisodeId === null || waitingEpisodeId === undefined || answer === null)
74
+ return false;
75
+ return answer.episodeId === waitingEpisodeId && suppression.at < answer.at;
76
+ }
53
77
  /**
54
78
  * Drop the record of one session (Issue #3796): the reason it gives no longer
55
79
  * holds for the prompt still on screen (the contract that withheld it changed),
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ /**
3
+ * The one place a prompt's screen is read as a kind of dialog for storage
4
+ * (Issue #3881).
5
+ *
6
+ * The response poller saves a `prompt` row from a frame it has in hand; every
7
+ * later reader — the chat transcript above all — has only the row's cut-down
8
+ * `question` and `options`. Deciding "question, permission or confirmation
9
+ * page?" from those again is what drew Claude's 16-column confirm page as a
10
+ * tool approval: its option 1 wraps (`Submit` / `answers`), so the stored
11
+ * option is `Submit`, and the review list is above the five rows the stored
12
+ * question keeps. So the kind is read here, from the frame, with the same
13
+ * predicates the Auto-Yes poller acts on, and stored as `promptData.reading`.
14
+ *
15
+ * What is evidence, in order:
16
+ *
17
+ * 1. the tool's confirm-page reader (`isAutoYesDeclinedConfirmFrame`, the
18
+ * predicate behind the poller's `question-confirm-page`) — `confirmation`;
19
+ * 2. a question reader's picker chrome (`isAskUserQuestion`) — `question`;
20
+ * 3. rows that read as a permission dialog's effects
21
+ * (`selectAllowOnceOption`, the resolver's own reading) — `permission`;
22
+ * 4. a yes/no confirmation pattern — `permission`;
23
+ * 5. nothing — `unknown`, which is not "not a question".
24
+ *
25
+ * Server-only: the confirm-page reader reaches `logger` → `env` → `fs`. The
26
+ * client reads what this wrote through `lib/detection/prompt-reading`.
27
+ *
28
+ * The second half of #3881 added no evidence here, on purpose: agy's
29
+ * receipt-backed reply list and copilot's / codex's questions have none on
30
+ * their screens, and they read `unknown` here as they did. What changed is
31
+ * what the answering paths do with that absence — agy's reply list is not
32
+ * answered on a receipt alone (`response-checker-dialog-gate`'s
33
+ * `isAntigravityGenericReadingOnScreen`), and the `careful` answer mode
34
+ * leaves copilot's / codex's unidentified lists to a human
35
+ * (`classifyAutoYesQuestion`'s `unidentified`). New evidence, when a reader
36
+ * learns some, goes in here; `tests/unit/guards/prompt-reading-sites-3881.test.ts`
37
+ * keeps this the only place.
38
+ *
39
+ * @module lib/polling/prompt-screen-reading
40
+ */
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.captureTopOf = captureTopOf;
43
+ exports.withCaptureTopCompleteness = withCaptureTopCompleteness;
44
+ exports.readPromptScreen = readPromptScreen;
45
+ exports.promptDataForStorage = promptDataForStorage;
46
+ const types_1 = require("../../lib/cli-tools/types");
47
+ const tmux_pane_config_1 = require("../../config/tmux-pane-config");
48
+ const cli_patterns_1 = require("../../lib/detection/cli-patterns");
49
+ const prompt_reading_1 = require("../../types/prompt-reading");
50
+ const auto_yes_confirm_page_1 = require("./auto-yes-confirm-page");
51
+ const auto_yes_option_effect_1 = require("./auto-yes-option-effect");
52
+ /**
53
+ * Where the first row of a capture sits in the pane (Issue #3881 review P2-1).
54
+ *
55
+ * Every capture is the last `windowLines` rows of the pane
56
+ * (`captureSessionOutput` → `sliceOutput`), so one that came back with fewer
57
+ * rows than its window holds the pane's whole history and its first row is
58
+ * the history's first; one that filled the window may have been cut there.
59
+ * The same test as `isCaptureWindowSaturated` (#1670) on the row count —
60
+ * restated, not imported: this module may not reach `tmux-capture-cache`
61
+ * (Issue #1922's import rule), and the equivalence is pinned by
62
+ * `tests/unit/lib/polling/prompt-reading-capture-top-3881.test.ts`.
63
+ *
64
+ * That holds for a scrollback pane only (the second review's N1). A tool in
65
+ * the alternate screen ({@link usesAlternateScreen}: claude, copilot,
66
+ * opencode) keeps no history, so its capture is the visible screen whatever
67
+ * the window, and "fewer rows than the window" says nothing about what the
68
+ * tool scrolled off. Its capture is read off the screen instead
69
+ * ({@link screenTopOf}), once the window is known not to have cut it.
70
+ *
71
+ * Whether it did (the third review's N4): the capture layer says so when the
72
+ * caller asks (`headCut`, the Auto-Yes poller's `capturePollerFrame`). The row
73
+ * count alone cannot tell at a window of exactly {@link TUI_PANE_HEIGHT} rows
74
+ * (the tallest alternate-screen pane, and the poller's REDUCED window): a
75
+ * whole 1000-row screen and a longer pane cut to its last 1000 rows come back
76
+ * the same size. Above that height it can: a cut capture has as many rows as
77
+ * its window, more than any alternate screen holds, and a capture that tall
78
+ * is a pane with history (the tool is not in the alternate screen), read as
79
+ * a scrollback pane. At or below it, a capture that filled its window is
80
+ * `clipped` unless the capture layer said otherwise (`headCut === false`):
81
+ * #3881's second half (review (5b)) took away the 1000-row exception, where
82
+ * an unreported cut on a window of exactly {@link TUI_PANE_HEIGHT} rows was
83
+ * read off the screen — blank first and last rows are what a longer pane cut
84
+ * to its last 1000 rows can show too, so they cannot stand in for the capture
85
+ * layer's word. `undefined` (not reported) and `false` (reported whole) are
86
+ * two answers, not one.
87
+ *
88
+ * And the capture layer's word decides on a scrollback pane too (the fourth
89
+ * review's N5). `headCut === false` is a known whole history, not an unknown
90
+ * top: tmux returned `min(history, N)` history rows plus the visible pane for
91
+ * a `-S -N`, so a capture it cut has more rows than any window it serves and
92
+ * the slice cuts it too — a capture the slice did not cut is everything from
93
+ * the history's first row. Only without that word is a capture that filled
94
+ * its window `clipped`; "filled" is counted in rows ({@link screenRowsOf}),
95
+ * so a trailing newline does not turn a 999-row capture into a full
96
+ * 1000-row window.
97
+ *
98
+ * @param capture - The capture as returned (or its cleaned spelling: same rows)
99
+ * @param windowLines - The window it was captured with
100
+ * @param cliToolId - The tool whose pane it is; omitted, the pane is read as a
101
+ * scrollback pane (the reading before N1)
102
+ * @param headCut - Whether the window dropped rows from the top of what tmux
103
+ * returned, when the capture layer said; omitted, judged from the row count
104
+ */
105
+ function captureTopOf(capture, windowLines, cliToolId, headCut) {
106
+ if (headCut === true)
107
+ return 'clipped';
108
+ const rows = screenRowsOf(capture).length;
109
+ const filled = windowLines > 0 && rows >= windowLines;
110
+ // A known whole history (`headCut === false`) wins over a full window.
111
+ const historyTop = filled && headCut === undefined ? 'clipped' : 'history-start';
112
+ if (cliToolId === undefined || !(0, types_1.usesAlternateScreen)(cliToolId))
113
+ return historyTop;
114
+ if (rows > tmux_pane_config_1.TUI_PANE_HEIGHT)
115
+ return historyTop;
116
+ // Not reported, and the window was filled: nothing says the top was not cut.
117
+ if (headCut === undefined && filled)
118
+ return 'clipped';
119
+ return screenTopOf(capture);
120
+ }
121
+ /** A capture's rows: tmux ends every row with a newline, and the last one is not a row of its own. */
122
+ function screenRowsOf(capture) {
123
+ return (capture.endsWith('\n') ? capture.slice(0, -1) : capture).split('\n');
124
+ }
125
+ /**
126
+ * An alternate-screen capture taken whole: does its content begin at the top
127
+ * of what the tool drew? These tools lay their content out from the screen's
128
+ * top down (a fresh 1000-row claude pane is a blank margin row, the banner,
129
+ * the turn, and blank rows to the bottom — `tests/fixtures/
130
+ * claude-confirm-live-3791/`), and one whose content outgrew the screen
131
+ * scrolls it: then the content reaches the bottom row
132
+ * (`head-cut-200x12.txt`), and the rows that left the top are gone. So the
133
+ * first row is the content's own only when the screen shows both its top
134
+ * margin (a blank first row) and room below (a blank last row); anything else
135
+ * — a content row at either edge — is `screen-full`, which is the side that
136
+ * withholds an answer rather than gives one.
137
+ */
138
+ function screenTopOf(capture) {
139
+ const rows = screenRowsOf(capture);
140
+ const blank = (row) => row === undefined || (0, cli_patterns_1.stripAnsi)(row).trim() === '';
141
+ return rows.length > 1 && blank(rows[0]) && blank(rows[rows.length - 1]) ? 'screen-start' : 'screen-full';
142
+ }
143
+ /**
144
+ * The detection with `approvalTargetCompleteness: 'top-unknown'` on its prompt
145
+ * when the target's upward scan reached the frame's first row without a
146
+ * boundary and that row is not known to be the top of the pane's history
147
+ * (Issue #3881 review P2-1). Before this, `top-unknown` stayed on the
148
+ * detection only and the resolver read such a target as complete: a confirm
149
+ * whose command began above the capture, and whose rest fell within 12 rows,
150
+ * was answered under a contract that denies the command.
151
+ *
152
+ * A capture whose first row is where the pane's content begins
153
+ * (`history-start`, or `screen-start` on the alternate screen) leaves the
154
+ * detection as it is.
155
+ * Blank-row compaction during detection removes no non-blank row, so it does
156
+ * not change which of the two a frame is.
157
+ *
158
+ * @param detection - The tick's detection of the capture
159
+ * @param captureTop - Where the capture's first row sits ({@link CaptureTop}),
160
+ * judged by the caller that knows its window ({@link captureTopOf})
161
+ */
162
+ function withCaptureTopCompleteness(detection, captureTop) {
163
+ const promptData = detection.promptData;
164
+ if (!promptData ||
165
+ promptData.approvalTarget === undefined ||
166
+ promptData.approvalTargetCompleteness !== undefined ||
167
+ detection.approvalContext?.completeness !== 'top-unknown' ||
168
+ !captureTopMayBeCut(captureTop)) {
169
+ return detection;
170
+ }
171
+ return { ...detection, promptData: { ...promptData, approvalTargetCompleteness: 'top-unknown' } };
172
+ }
173
+ /** Whether rows may be missing above a capture's first row ({@link CaptureTop}). */
174
+ function captureTopMayBeCut(captureTop) {
175
+ return captureTop === 'clipped' || captureTop === 'screen-full';
176
+ }
177
+ /**
178
+ * Read the prompt's screen as a kind of dialog.
179
+ *
180
+ * @param cliToolId - The tool that drew the frame
181
+ * @param frame - The capture the prompt was detected on (ANSI and box drawing
182
+ * as captured), or the tick's own `normalizeFrame` of it — the Auto-Yes
183
+ * poller passes that, so a tick still normalises its capture once (#3183) —
184
+ * or null when the caller has none: then no confirm page can be read off it
185
+ * @param detection - The detection of that frame
186
+ * @param captureTop - Where `frame`'s first row sits in the pane, when the
187
+ * caller knows its capture window (Issue #3881 review P2-1)
188
+ * @returns The reading, or null when the detection carries no prompt
189
+ */
190
+ function readPromptScreen(cliToolId, frame, detection, captureTop) {
191
+ const promptData = detection.promptData;
192
+ if (!promptData)
193
+ return null;
194
+ const context = detection.approvalContext;
195
+ const base = {
196
+ version: prompt_reading_1.PROMPT_READING_VERSION,
197
+ ...(context ? { liveRange: { startRow: context.startRow, endRow: context.endRow } } : {}),
198
+ approvalTarget: context?.completeness ?? 'not-measured',
199
+ ...(captureTop !== undefined ? { captureTop } : {}),
200
+ };
201
+ const confirmPage = typeof frame === 'object' && frame !== null
202
+ ? (0, auto_yes_confirm_page_1.isAutoYesDeclinedConfirmPage)(cliToolId, frame)
203
+ : (0, auto_yes_confirm_page_1.isAutoYesDeclinedConfirmFrame)(cliToolId, frame);
204
+ if (confirmPage) {
205
+ return { ...base, kind: 'confirmation', phase: 'confirmation', evidence: ['confirm-page-reader'] };
206
+ }
207
+ if (promptData.type === 'multiple_choice' && promptData.isAskUserQuestion === true) {
208
+ const evidence = ['question-picker-chrome'];
209
+ if (promptData.askUserQuestion !== undefined)
210
+ evidence.push('ask-user-question-payload');
211
+ return { ...base, kind: 'question', phase: 'question', evidence };
212
+ }
213
+ if (promptData.type === 'multiple_choice') {
214
+ return (0, auto_yes_option_effect_1.selectAllowOnceOption)(promptData.options, cliToolId).kind === 'not-a-permission-dialog'
215
+ ? { ...base, kind: 'unknown', evidence: [] }
216
+ : { ...base, kind: 'permission', evidence: ['permission-option-effect'] };
217
+ }
218
+ return { ...base, kind: 'permission', evidence: ['yes-no-pattern'] };
219
+ }
220
+ /**
221
+ * The `promptData` a `prompt` row is saved with: the detection's, with what
222
+ * {@link readPromptScreen} read stored beside it. Undefined when the detection
223
+ * carries none, exactly as before. Both writers of a new `prompt` row from a
224
+ * frame use it: the response poller's save, and (review P2-2) the Auto-Yes
225
+ * poller's audit row when it answers before any row was saved.
226
+ */
227
+ function promptDataForStorage(cliToolId, frame, detection, captureTop) {
228
+ const reading = readPromptScreen(cliToolId, frame, detection, captureTop);
229
+ if (!detection.promptData || reading === null)
230
+ return detection.promptData;
231
+ return { ...detection.promptData, reading };
232
+ }