commandmate 0.31.1 → 0.31.3

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 (299) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +170 -170
  3. package/.next/app-path-routes-manifest.json +29 -29
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update-check/route.js +1 -1
  12. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  14. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  16. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/messages/route.js +1 -1
  18. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  19. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/session/route.js +1 -1
  21. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  22. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/assistant/start/route.js +2 -2
  24. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  25. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/assistant/terminal/route.js +2 -2
  27. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  28. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/capabilities/route.js +1 -1
  35. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  44. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  45. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  47. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  48. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  50. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  51. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/push/escalation/route.js +2 -2
  55. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  56. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  58. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/push/vapid/route.js +2 -2
  60. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  61. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  67. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/clone/route.js +1 -1
  70. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/restore/route.js +1 -1
  74. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/route.js +1 -1
  77. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  78. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/repositories/scan/route.js +1 -1
  80. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  81. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/sync/route.js +1 -1
  83. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  84. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  87. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  107. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  110. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  116. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  163. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  198. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/route.js +1 -1
  212. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  218. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/page_client-reference-manifest.js +1 -1
  220. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  223. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  224. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  225. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  227. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  228. package/.next/server/app/worktrees/[id]/page.js +10 -10
  229. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  230. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app-paths-manifest.json +29 -29
  232. package/.next/server/chunks/1058.js +1 -1
  233. package/.next/server/chunks/1068.js +1 -1
  234. package/.next/server/chunks/1191.js +2 -2
  235. package/.next/server/chunks/1886.js +1 -1
  236. package/.next/server/chunks/2119.js +1 -1
  237. package/.next/server/chunks/2404.js +1 -1
  238. package/.next/server/chunks/2445.js +1 -1
  239. package/.next/server/chunks/261.js +1 -1
  240. package/.next/server/chunks/2739.js +1 -1
  241. package/.next/server/chunks/3241.js +1 -1
  242. package/.next/server/chunks/3484.js +1 -0
  243. package/.next/server/chunks/358.js +1 -0
  244. package/.next/server/chunks/4325.js +1 -1
  245. package/.next/server/chunks/4393.js +1 -1
  246. package/.next/server/chunks/4443.js +1 -1
  247. package/.next/server/chunks/5017.js +1 -1
  248. package/.next/server/chunks/5120.js +1 -1
  249. package/.next/server/chunks/5164.js +1 -1
  250. package/.next/server/chunks/552.js +3 -3
  251. package/.next/server/chunks/595.js +8 -0
  252. package/.next/server/chunks/6130.js +1 -1
  253. package/.next/server/chunks/8800.js +1 -1
  254. package/.next/server/chunks/8918.js +3 -3
  255. package/.next/server/chunks/9123.js +1 -1
  256. package/.next/server/chunks/9130.js +2 -2
  257. package/.next/server/chunks/9627.js +3 -3
  258. package/.next/server/chunks/9696.js +2 -2
  259. package/.next/server/chunks/9798.js +2 -2
  260. package/.next/server/middleware-manifest.json +5 -5
  261. package/.next/server/pages/500.html +1 -1
  262. package/.next/server/server-reference-manifest.json +1 -1
  263. package/.next/static/chunks/{1783-11c9b4d8a52ebd91.js → 2813-de885de8a4b11910.js} +1 -1
  264. package/.next/static/chunks/4718-07ec4e10186928db.js +1 -0
  265. package/.next/static/chunks/app/worktrees/[id]/page-91b639c90795baa9.js +1 -0
  266. package/.next/static/css/acc4b9c3feb04287.css +1 -0
  267. package/.next/trace +13 -13
  268. package/dist/lib/detection/tools/verified-against.d.ts +24 -24
  269. package/dist/lib/detection/tools/verified-against.js +24 -24
  270. package/dist/server/locales/en/worktree.json +1402 -0
  271. package/dist/server/locales/ja/worktree.json +1402 -0
  272. package/dist/server/src/lib/db/chat-db.js +44 -1
  273. package/dist/server/src/lib/detection/cli-patterns.js +157 -23
  274. package/dist/server/src/lib/detection/model-info-extractor.js +185 -4
  275. package/dist/server/src/lib/detection/tools/antigravity/detect.js +105 -25
  276. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +233 -0
  277. package/dist/server/src/lib/detection/tools/verified-against.js +24 -24
  278. package/dist/server/src/lib/hooks/hook-settings-generator.js +16 -0
  279. package/dist/server/src/lib/hooks/sources/claude/model-switch.js +169 -0
  280. package/dist/server/src/lib/hooks/sources/claude/source.js +14 -1
  281. package/dist/server/src/lib/polling/response-checker.js +17 -1
  282. package/dist/server/src/lib/polling/response-poller-core.js +143 -9
  283. package/dist/server/src/lib/push/index.js +13 -1
  284. package/dist/server/src/lib/push/model-change-push-notifier.js +174 -0
  285. package/dist/server/src/lib/push/notification-dedup.js +2 -1
  286. package/dist/server/src/lib/push/push-sender.js +48 -20
  287. package/dist/server/src/lib/realtime/model-change-broadcast.js +171 -0
  288. package/dist/server/src/lib/realtime/types.js +19 -1
  289. package/dist/server/src/lib/realtime/waiting-broadcast.js +13 -0
  290. package/dist/server/src/lib/session/agent-event-state.js +344 -12
  291. package/package.json +1 -1
  292. package/.next/server/chunks/6894.js +0 -8
  293. package/.next/server/chunks/7187.js +0 -1
  294. package/.next/server/chunks/7472.js +0 -1
  295. package/.next/static/chunks/4718-46e1d2f07c8423ba.js +0 -1
  296. package/.next/static/chunks/app/worktrees/[id]/page-64d4ec3051971760.js +0 -1
  297. package/.next/static/css/5c13ea243dfdcb66.css +0 -1
  298. /package/.next/static/{60mm4_QBuFtFTfo5UMyKU → 0hTIackGXw6v7diXJS6yN}/_buildManifest.js +0 -0
  299. /package/.next/static/{60mm4_QBuFtFTfo5UMyKU → 0hTIackGXw6v7diXJS6yN}/_ssgManifest.js +0 -0
@@ -3,16 +3,17 @@
3
3
  * Antigravity (agy) status detector (Issue #1927, 方針書 §4 D2).
4
4
  *
5
5
  * A verbatim lift of the `cliToolId === 'antigravity'` blocks (priorities 0.9
6
- * and 2.8) out of `detectSessionStatus`.
6
+ * and 2.8) out of `detectSessionStatus`, plus the Issue #2364 dialog reading in
7
+ * `beforePrompt`.
7
8
  *
8
9
  * No `readIdleEvidence`: agy's idle branch reads the same always-visible `> `
9
- * input box that #1885 showed is not evidence on its own, and no IDLE agy frame
10
- * has been captured to measure a better rule from. (Issue #2270 added live
11
- * 1.1.25 captures, but only of the permission dialog and the `/model` picker
12
- * both `waiting`.) Per §4 D1 決定 1's tool-by-tool rollout (DR2-002) a tool
13
- * without a measured rule keeps the pre-#1927 reading, and its rule must be read
14
- * off ITS OWN frames rather than inferred from another tool's — which is exactly
15
- * the mistake #1979 corrected.
10
+ * input box that #1885 showed is not evidence on its own. Issue #2364 captured
11
+ * the first live IDLE agy frame (`antigravity-live-2364/boot-idle.txt`: a bare
12
+ * `>` between two rules over a `? for shortcuts` status row), so a rule could
13
+ * now be measured — but it has not been, and per §4 D1 決定 1's tool-by-tool
14
+ * rollout (DR2-002) a tool without a measured rule keeps the pre-#1927 reading.
15
+ * Its rule must be read off ITS OWN frames rather than inferred from another
16
+ * tool's — which is exactly the mistake #1979 corrected.
16
17
  */
17
18
  Object.defineProperty(exports, "__esModule", { value: true });
18
19
  exports.antigravityStatusDetector = exports.VERIFIED_AGAINST = void 0;
@@ -20,12 +21,66 @@ const cli_patterns_1 = require("../../cli-patterns");
20
21
  const status_reason_1 = require("../../status-reason");
21
22
  const run_detection_1 = require("../run-detection");
22
23
  const verified_against_1 = require("../verified-against");
23
- /** agy build these rules were read off (Issue #988 / #995; value in ../verified-against, #1929). */
24
+ const dialog_1 = require("./dialog");
25
+ /** agy build these rules were read off (Issue #988 / #995 / #2364; value in ../verified-against, #1929). */
24
26
  exports.VERIFIED_AGAINST = verified_against_1.ANTIGRAVITY_VERIFIED_AGAINST;
27
+ /**
28
+ * An agy screen only the terminal can drive: the `/model` picker, the folder
29
+ * trust screen, the slash-command popup — and the post-answer survey.
30
+ *
31
+ * `hasActivePrompt: false` with a reason in `SELECTION_LIST_REASONS` is what
32
+ * puts NavigationButtons (and the chat surface's "drive it from the terminal"
33
+ * card) on screen, and what makes `wait` stop with exit 10 instead of hanging.
34
+ */
35
+ const SELECTION_LIST_VERDICT = {
36
+ status: 'waiting',
37
+ confidence: 'high',
38
+ reason: status_reason_1.STATUS_REASON.ANTIGRAVITY_SELECTION_LIST,
39
+ hasActivePrompt: false,
40
+ evidence: 'positive',
41
+ };
42
+ /**
43
+ * How close to the bottom of the content the survey row must be to count as
44
+ * open: itself, a blank row and the `? for shortcuts` status row.
45
+ */
46
+ const SURVEY_TAIL_ROWS = 3;
47
+ /**
48
+ * Is the post-answer survey the live screen, rather than a row of it left in
49
+ * the scrollback? (Issue #2364)
50
+ *
51
+ * agy retains scrollback, so the guard is positional: the `[1] Good … [0] Skip`
52
+ * row is the survey only while it sits within the last few content rows and
53
+ * no bare `>` composer has been drawn below it — the composer is what replaces
54
+ * it once the digit is typed.
55
+ */
56
+ function isAntigravitySurveyOpen(contentLines) {
57
+ const tail = contentLines.slice(-SURVEY_TAIL_ROWS);
58
+ const surveyAt = tail.findIndex(row => cli_patterns_1.ANTIGRAVITY_SURVEY_PATTERN.test(row));
59
+ if (surveyAt < 0)
60
+ return false;
61
+ const { promptPattern } = (0, cli_patterns_1.getCliToolPatterns)('antigravity');
62
+ return !tail.slice(surveyAt + 1).some(row => promptPattern.test(row));
63
+ }
25
64
  exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector)({
26
65
  tool: 'antigravity',
27
66
  verifiedAgainst: exports.VERIFIED_AGAINST,
28
67
  beforePrompt(frame) {
68
+ // 0.85. Issue #2364: the survey agy draws in place of its composer after a
69
+ // tool decision — `[1] Good [2] Fine [3] Bad [0] Skip` under `How's the
70
+ // CLI experience so far?`. Nothing else on that frame is readable: there is
71
+ // no `↑/↓ Navigate` footer and no bare `>` row, so it used to reach the
72
+ // `default` floor as `running`, and the chat surface showed "generating"
73
+ // over a screen waiting for a keypress.
74
+ //
75
+ // Published as a selection list rather than as a `multiple_choice` prompt
76
+ // on purpose. The screen takes a TYPED digit (`0` closes it), while
77
+ // `sendPromptAnswer` drives every numeric agy answer with arrow keys +
78
+ // Enter (Issue #999) — a `0. Skip` button on PromptPanel would send `Up`,
79
+ // `Enter` to a screen that does not navigate. As a selection list the
80
+ // frame is `waiting`, `wait` returns, the waiting push fires, and the chat
81
+ // surface's card points at the terminal, where a single `0` is the answer.
82
+ if (isAntigravitySurveyOpen(frame.contentLines))
83
+ return SELECTION_LIST_VERDICT;
29
84
  // 0.9. Antigravity: selection list detection BEFORE thinking detection (Issue #995)
30
85
  // agy's "Switch Model" (and other) selection TUIs render an "esc to cancel"
31
86
  // footer that ANTIGRAVITY_THINKING_PATTERN also matches, so the generic thinking
@@ -35,7 +90,7 @@ exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector
35
90
  // Codex early-detection pattern.
36
91
  if (!cli_patterns_1.ANTIGRAVITY_SELECTION_LIST_PATTERN.test(frame.lastLines))
37
92
  return null;
38
- // Issue #2270: except when the frame is the NUMBERED permission dialog.
93
+ // Issue #2270 / #2364: except when the frame is a NUMBERED dialog.
39
94
  //
40
95
  // #997 widened the pattern above to the bare `↑/↓ Navigate` footer so the
41
96
  // "Do you want to proceed?" menu would reach this branch — but this branch
@@ -47,23 +102,48 @@ exports.antigravityStatusDetector = (0, run_detection_1.createToolStatusDetector
47
102
  // with four `multiple_choice` options and the push notification sent
48
103
  // `kind: 'prompt'` — one screen, two answers.
49
104
  //
50
- // Returning null hands the frame to priority 1, where `detectPrompt` with
51
- // `buildDetectPromptOptions('antigravity')` already reads it as that same
52
- // 4-option `multiple_choice` (Issue #999). That is what puts
53
- // `hasActivePrompt: true` and `promptData` on the wire, so PromptPanel and
54
- // the legacy Auto-Yes path both work and all three producers agree.
105
+ // #2270 returned null here and let priority 1's generic `detectPrompt` read
106
+ // the frame. That held for the one dialog it measured and broke on the next
107
+ // two (#2364): the file-creation menu never passed its `Do you want to
108
+ // proceed?` discriminator, and a Bash approval whose option labels wrap —
109
+ // agy prints the command inside the label, so most of them do — passed it
110
+ // and then failed in the one-row-per-option parser, after which the `esc
111
+ // to cancel` status row matched the thinking pattern and the pane went out
112
+ // as `running` / `thinking_indicator`. So the discriminator is structural
113
+ // now (`isAntigravityNumberedDialog`), the frame is read by agy's own
114
+ // reader (`./dialog.ts`), and a frame the reader cannot parse is published
115
+ // as UNCLASSIFIED — never as a picker, and never as "generating", which is
116
+ // the worst answer a waiting dialog can get: `wait` never returns from it.
117
+ //
118
+ // `stripBoxDrawing` here, as priority 1 applies it before `detectPrompt`,
119
+ // so this verdict and the response poller's (`detectPromptWithOptions`,
120
+ // which reads the same helper over the same spelling) carry one question,
121
+ // one option list and one `instructionText` for one screen.
55
122
  //
56
123
  // #995's own case is untouched: the Switch Model picker carries no numbered
57
- // rows, so it still resolves here and still keeps NavigationButtons.
58
- if ((0, cli_patterns_1.isAntigravityNumberedDialog)(frame.lastLines))
59
- return null;
60
- return {
61
- status: 'waiting',
62
- confidence: 'high',
63
- reason: status_reason_1.STATUS_REASON.ANTIGRAVITY_SELECTION_LIST,
64
- hasActivePrompt: false,
65
- evidence: 'positive',
66
- };
124
+ // rows, so it still resolves below and still keeps NavigationButtons.
125
+ const text = (0, cli_patterns_1.stripBoxDrawing)(frame.clean);
126
+ if ((0, cli_patterns_1.isAntigravityNumberedDialog)(text)) {
127
+ const promptDetection = (0, dialog_1.detectAntigravityNumberedDialogPrompt)(text);
128
+ if (promptDetection !== null) {
129
+ return {
130
+ status: 'waiting',
131
+ confidence: 'high',
132
+ reason: status_reason_1.STATUS_REASON.PROMPT_DETECTED,
133
+ hasActivePrompt: true,
134
+ evidence: 'positive',
135
+ promptDetection,
136
+ };
137
+ }
138
+ return {
139
+ status: 'running',
140
+ confidence: 'low',
141
+ reason: status_reason_1.STATUS_REASON.UNKNOWN_FRAME,
142
+ hasActivePrompt: false,
143
+ evidence: 'none',
144
+ };
145
+ }
146
+ return SELECTION_LIST_VERDICT;
67
147
  },
68
148
  afterThinking(frame) {
69
149
  // 2.8. Antigravity (agy) footer-based detection (Issue #988)
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ /**
3
+ * Antigravity (agy)'s numbered permission dialogs, read on their own terms
4
+ * (Issue #2364).
5
+ *
6
+ * ## What was measured (agy 1.1.27, pane 200x1000, 2026-09-06)
7
+ *
8
+ * `tests/fixtures/antigravity-live-2364/` holds the frames. The two that this
9
+ * module exists for:
10
+ *
11
+ * | frame | question | options | shape |
12
+ * |---------------------------|---------------------------------|---------|------------------------------------|
13
+ * | `dialog-create-file.txt` | `Allow creation of this file?` | 2 | diff preview above the question |
14
+ * | `dialog-bash-wrapped.txt` | `Do you want to proceed?` | 4 | options 2 and 3 wrap onto 3 rows |
15
+ *
16
+ * Before this Issue the first resolved as `antigravity_selection_list`
17
+ * (`hasActivePrompt: false`, so the chat surface drew an arrow pad and no
18
+ * yes/no panel) because Issue #2270's discriminator was the sentence `Do you
19
+ * want to proceed?`; the second passed the discriminator and then failed in the
20
+ * generic multiple-choice parser, which reads one row per option, so the
21
+ * `esc to cancel` status row fell through to the thinking pattern and the pane
22
+ * was published as `running` / `thinking_indicator` — "generating", with `wait`
23
+ * never returning. agy prints the command text inside the option label, so
24
+ * every Bash approval of a multi-line command takes the second shape.
25
+ *
26
+ * ## What this reads
27
+ *
28
+ * The block between the nearest boundary row and the `↑/↓ Navigate` footer
29
+ * ({@link locateAntigravityDialogRegion}), through the shared
30
+ * {@link findNumberedOptionBlock}: a run of `N. label` rows descending to `1.`,
31
+ * every non-numbered row folded into the label above it, the `>` gutter naming
32
+ * the highlighted option. The question is the one `?`-terminated row directly
33
+ * above option 1 — NOT the five rows the generic parser joins, which on the
34
+ * file-creation menu put the diff preview into the question
35
+ * (`…hello-agy.txt +1 1 + hello from antigravity Allow creation of this file?`).
36
+ * The diff, the command and the panel header go to `instructionText`, where the
37
+ * prompt panels render them as context.
38
+ *
39
+ * ## Who calls it
40
+ *
41
+ * Both producers of the wire, so that they cannot disagree about one screen:
42
+ * `antigravity/detect.ts` (the status verdict `/current-output` publishes) and
43
+ * `polling/response-checker.ts` (the `prompt` row the poller stores and the
44
+ * push notification it raises). The Auto-Yes poller is deliberately NOT a
45
+ * caller: with Auto-Yes on, agy's `PreToolUse` hook answers the permission
46
+ * request before the dialog is drawn (Issue #1779), so the dialogs this module
47
+ * reads only appear when nothing is going to auto-answer them.
48
+ *
49
+ * Deliberately NOT a change to the generic multiple-choice parser: folding
50
+ * continuation rows there would change what every other tool's dialogs read
51
+ * as, and each of those readings is pinned to its own live captures.
52
+ *
53
+ * ## Input contract
54
+ *
55
+ * ANSI-stripped text; box drawing optional (the poller's copy has been through
56
+ * `stripBoxDrawing`, the status path's has not, and the block is bounded the
57
+ * same way on both — see {@link ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN}).
58
+ */
59
+ Object.defineProperty(exports, "__esModule", { value: true });
60
+ exports.readAntigravityNumberedDialog = readAntigravityNumberedDialog;
61
+ exports.detectAntigravityNumberedDialogPrompt = detectAntigravityNumberedDialogPrompt;
62
+ const cli_patterns_1 = require("../../cli-patterns");
63
+ const prompt_detect_multiple_choice_1 = require("../../prompt-detect-multiple-choice");
64
+ const tui_detection_frame_1 = require("../../tui-detection-frame");
65
+ const dialog_block_1 = require("../dialog-block");
66
+ /**
67
+ * How many non-blank rows above option 1 may be searched for the question.
68
+ *
69
+ * On every measured frame the question is the row directly above option 1;
70
+ * the allowance is for a blank row or a wrapped question, not for reaching up
71
+ * into the diff preview.
72
+ */
73
+ const QUESTION_SCAN_ROWS = 3;
74
+ /**
75
+ * How far above the question the panel header may sit.
76
+ *
77
+ * The `●` tool-call row that opens the panel is what `instructionText` starts
78
+ * under; the cap keeps a frame with no such row from carrying the whole
79
+ * transcript into the panel text.
80
+ */
81
+ const INSTRUCTION_LOOKBACK_ROWS = 40;
82
+ /**
83
+ * How many non-blank rows under the bottom option row may be its wrapped tail.
84
+ *
85
+ * Handed to {@link findNumberedOptionBlock} as its footer scan, because the
86
+ * region this reader hands it ends above the real footer. Sized well past the
87
+ * three-row labels agy 1.1.27 draws; a command long enough to exceed it is
88
+ * elided by agy itself (`pr...'`).
89
+ */
90
+ const LAST_OPTION_TAIL_ROWS = 12;
91
+ /** The `●` tool-call row that opens every measured agy permission panel. */
92
+ const TOOL_CALL_ROW_PATTERN = /^\s*●\s/;
93
+ /** A horizontal rule; dropped from `instructionText`, where a 200-column rule is noise. */
94
+ const RULE_ROW_PATTERN = /^\s*─{3,}\s*$/;
95
+ /** A row that asks something — the shape the question row takes on every measured dialog. */
96
+ const QUESTION_ROW_PATTERN = /[??]\s*$/;
97
+ /**
98
+ * The same tail limits `prompt-detector.ts` applies to `rawContent`
99
+ * (`RAW_CONTENT_MAX_LINES` / `RAW_CONTENT_MAX_CHARS`), restated because that
100
+ * helper is private to it. A prompt row stores this text as its message body,
101
+ * so an unbounded 1000-row pane must not go in.
102
+ */
103
+ const RAW_CONTENT_MAX_LINES = 200;
104
+ const RAW_CONTENT_MAX_CHARS = 5000;
105
+ function truncateRawContent(content) {
106
+ const lines = content.split('\n');
107
+ const tail = lines.length > RAW_CONTENT_MAX_LINES ? lines.slice(-RAW_CONTENT_MAX_LINES) : lines;
108
+ const joined = tail.join('\n');
109
+ return joined.length > RAW_CONTENT_MAX_CHARS ? joined.slice(-RAW_CONTENT_MAX_CHARS) : joined;
110
+ }
111
+ /**
112
+ * Read agy's numbered dialog off ANSI-stripped rows.
113
+ *
114
+ * Null when the frame has no `↑/↓ Navigate` footer, when the rows above it do
115
+ * not form a numbered run reaching `1.` (the Switch Model picker, the trust
116
+ * screen, the slash popup), or when the block sits under a `Switch Model`
117
+ * header. A caller that has already passed `isAntigravityNumberedDialog` and
118
+ * still gets null here is looking at a numbered dialog this reader cannot
119
+ * parse — which is an unclassified frame, not a picker.
120
+ */
121
+ function readAntigravityNumberedDialog(lines) {
122
+ const region = (0, cli_patterns_1.locateAntigravityDialogRegion)(lines);
123
+ if (region === null)
124
+ return null;
125
+ const regionRows = lines.slice(region.start, region.footer);
126
+ if (regionRows.some(row => cli_patterns_1.ANTIGRAVITY_SWITCH_MODEL_HEADER_PATTERN.test(row)))
127
+ return null;
128
+ // The slice stops ABOVE the footer row, so the rows the block reader files
129
+ // as `footer` — the non-option rows between the bottom option and the region
130
+ // end — are the wrapped tail of the LAST option, not chrome: agy 1.1.27 draws
131
+ // `6. No, and always deny for commands that start with '<cmd>` over three
132
+ // rows on a repeated denial (`dialog-bash-wrapped-six.txt`), and the
133
+ // `↑/↓ Navigate` footer this region is anchored on already vouched for the
134
+ // block. Every other row of the region above the block is question / preview
135
+ // and never reached (the run stops at `1.`).
136
+ const block = (0, dialog_block_1.findNumberedOptionBlock)(regionRows, regionRows.length, LAST_OPTION_TAIL_ROWS);
137
+ if (block === null)
138
+ return null;
139
+ const options = [...block.options];
140
+ if (block.footer !== '') {
141
+ const last = options.length - 1;
142
+ options[last] = [options[last], ...block.footer.split('\n')].join(' ').trim();
143
+ }
144
+ const firstOptionRow = region.start + block.firstRow;
145
+ // The question: the nearest `?`-terminated row above option 1, looking past
146
+ // blank rows and at most QUESTION_SCAN_ROWS non-blank ones, none of which
147
+ // may be a boundary (that would be the previous turn, not this panel).
148
+ let questionRow = -1;
149
+ let fallbackRow = -1;
150
+ let scanned = 0;
151
+ for (let i = firstOptionRow - 1; i >= region.start && scanned < QUESTION_SCAN_ROWS; i--) {
152
+ const row = lines[i];
153
+ if (row.trim() === '')
154
+ continue;
155
+ if (cli_patterns_1.ANTIGRAVITY_DIALOG_BOUNDARY_PATTERN.test(row) || RULE_ROW_PATTERN.test(row))
156
+ break;
157
+ scanned++;
158
+ if (fallbackRow < 0)
159
+ fallbackRow = i;
160
+ if (QUESTION_ROW_PATTERN.test(row)) {
161
+ questionRow = i;
162
+ break;
163
+ }
164
+ }
165
+ if (questionRow < 0)
166
+ questionRow = fallbackRow;
167
+ return {
168
+ question: questionRow < 0 ? 'Please select an option:' : lines[questionRow].trim(),
169
+ options,
170
+ selectedIndex: block.selectedIndex,
171
+ questionRow: questionRow < 0 ? firstOptionRow : questionRow,
172
+ firstOptionRow,
173
+ footerRow: region.footer,
174
+ };
175
+ }
176
+ /**
177
+ * The panel text above the options, for the prompt panels' context box.
178
+ *
179
+ * From the row under the `●` tool-call row that opened the panel (`Command`,
180
+ * `Create file`, the `Requesting permission for:` block, the diff preview),
181
+ * through the question, the options and the footer — rules dropped. Falls back
182
+ * to the dialog region when no tool-call row is within reach.
183
+ */
184
+ function extractInstructionText(lines, dialog) {
185
+ const region = (0, cli_patterns_1.locateAntigravityDialogRegion)(lines);
186
+ let start = region?.start ?? dialog.questionRow;
187
+ const floor = Math.max(0, dialog.questionRow - INSTRUCTION_LOOKBACK_ROWS);
188
+ for (let i = dialog.questionRow - 1; i >= floor; i--) {
189
+ if (TOOL_CALL_ROW_PATTERN.test(lines[i])) {
190
+ start = i + 1;
191
+ break;
192
+ }
193
+ }
194
+ const text = lines
195
+ .slice(start, dialog.footerRow + 1)
196
+ .filter(row => !RULE_ROW_PATTERN.test(row))
197
+ .map(row => row.trimEnd())
198
+ .join('\n')
199
+ .trim();
200
+ return text.length > 0 ? text : undefined;
201
+ }
202
+ /**
203
+ * Read agy's numbered dialog as the `multiple_choice` prompt the rest of the
204
+ * system consumes, or null when the frame does not carry one.
205
+ *
206
+ * The result has the same shape `detectPrompt` produces for a numbered dialog
207
+ * — `promptData.type === 'multiple_choice'`, `options[].isDefault` on the
208
+ * highlighted row, `instructionText` / `approvalTarget` / `rawContent` filled
209
+ * the way Issues #235 and #1699 defined them — so `PromptPanel`,
210
+ * `MobilePromptSheet`, `respond`, the deny patterns and the prompt-history
211
+ * writers all read it unchanged.
212
+ *
213
+ * @param text - ANSI-stripped capture, box drawing optional
214
+ */
215
+ function detectAntigravityNumberedDialogPrompt(text) {
216
+ const normalized = (0, tui_detection_frame_1.normalizeTuiFrameForDetection)(text);
217
+ const lines = normalized.split('\n');
218
+ const dialog = readAntigravityNumberedDialog(lines);
219
+ if (dialog === null)
220
+ return null;
221
+ return (0, prompt_detect_multiple_choice_1.buildMultipleChoiceResult)(dialog.question, dialog.options.map((label, index) => ({
222
+ number: index + 1,
223
+ label,
224
+ isDefault: index === dialog.selectedIndex,
225
+ })), {
226
+ instructionText: extractInstructionText(lines, dialog),
227
+ // Issue #1699's machine-facing surface: bounded above at the previous
228
+ // turn's boundary and below at the footer, so the command in the
229
+ // `Requesting permission for:` block and in the labels is judged and
230
+ // nothing from an earlier, already-answered approval is.
231
+ approvalTarget: (0, prompt_detect_multiple_choice_1.joinApprovalTarget)(lines, (0, prompt_detect_multiple_choice_1.findApprovalContextStart)(lines, dialog.questionRow), dialog.footerRow),
232
+ }, normalized, truncateRawContent);
233
+ }
@@ -74,35 +74,35 @@ exports.OPENCODE_VERIFIED_AGAINST = {
74
74
  paneGeometry: '80x200',
75
75
  };
76
76
  /**
77
- * agy these rules were read off (#988 / #995 footer + selection rules, re-read
78
- * against the #2270 live panes).
77
+ * agy these rules were read off (#988 / #995 footer + selection rules, #2270's
78
+ * numbered-dialog carve-out, re-measured and re-captured by #2364).
79
79
  *
80
- * Bumped from `0.4.x` / `2026-07-30` / `inline` because the frames were
81
- * RE-CAPTURED, not because the binary moved: #2270 drove agy 1.1.25 on a private
82
- * tmux socket at the production geometry and kept both panes inline in
83
- * `tests/unit/status-detector-selection.test.ts`
84
- * (`AGY_1125_PERMISSION_PANE`, `AGY_1125_SWITCH_MODEL_PANE`) under the banner
85
- * `Antigravity CLI 1.1.25`, trailing pane padding included. The
86
- * `Do you want to proceed?` + `N. label` rules were measured off those frames,
87
- * and `ANTIGRAVITY_SELECTION_LIST_PATTERN` (#995 / #997) was re-checked against
88
- * them and left unchanged.
80
+ * Bumped from 1.1.25 because the frames were RE-CAPTURED and the rules CHANGED:
81
+ * #2364 drove agy 1.1.27 on a private tmux socket at the production geometry and
82
+ * kept the frames in `tests/fixtures/antigravity-live-2364/` the file-creation
83
+ * menu (`Allow creation of this file?`, two options), the Bash approval whose
84
+ * option labels wrap onto three rows each, the one-row Bash approval #2270 had
85
+ * measured on 1.1.25, the `/model` picker, the folder-trust screen, the
86
+ * slash-command popup, and the first live IDLE agy frame. The numbered-dialog
87
+ * discriminator (`isAntigravityNumberedDialog`) was rewritten off those frames
88
+ * from a question-line match to the footer + numbered-row structure, and the
89
+ * dialogs are now read by `tools/antigravity/dialog.ts` rather than by the
90
+ * generic multiple-choice parser. `ANTIGRAVITY_SELECTION_LIST_PATTERN`
91
+ * (#995 / #997) was re-checked against every frame and left unchanged.
89
92
  *
90
- * `paneGeometry` leaves `inline` because the 1.1.25 permission dialog draws no
91
- * composer row at all — it reproduces only at the 200x1000 pane the server
92
- * captures, and a fixture without the ~970 blank padding rows exercises a
93
- * different `lastLines` slice than production does. That is a statement about
94
- * the capture condition, not about agy: the scrollback-retained rendering the
95
- * `afterThinking` footer rules rest on (#988) is unchanged, and the 1.1.25
96
- * dialog still ends on `esc to cancel`.
93
+ * The #2270 1.1.25 panes stay where they are
94
+ * (`tests/unit/status-detector-selection.test.ts`) and the rules still answer
95
+ * for both builds.
97
96
  *
98
- * What this stamp does NOT claim: #2270 captured `waiting` frames only, so the
99
- * idle (`? for shortcuts`) and generating (spinner) branches are carried over
100
- * from the 0.4 captures rather than re-measured. A live IDLE 1.1.25 frame is
101
- * still uncapturedsee the `readIdleEvidence` note in `antigravity/detect.ts`.
97
+ * What this stamp does NOT claim: the generating (spinner) branch is still
98
+ * carried over from the 0.4 captures rather than re-measured, and the
99
+ * post-answer survey (`[1] Good [0] Skip`) was seen once on the production
100
+ * server and reconstructed from its cleaned rows — the raw frame is not in the
101
+ * fixture directory (see its README).
102
102
  */
103
103
  exports.ANTIGRAVITY_VERIFIED_AGAINST = {
104
- version: '1.1.25',
105
- capturedAt: '2026-09-04',
104
+ version: '1.1.27',
105
+ capturedAt: '2026-09-06',
106
106
  paneGeometry: '200x1000',
107
107
  };
108
108
  /**
@@ -64,6 +64,7 @@ const path_1 = require("path");
64
64
  const safe_directory_1 = require("../../config/safe-directory");
65
65
  const env_1 = require("../../lib/env");
66
66
  const types_1 = require("../../lib/cli-tools/types");
67
+ const model_switch_1 = require("../../lib/hooks/sources/claude/model-switch");
67
68
  const tool_id_1 = require("../../lib/hooks/sources/claude/tool-id");
68
69
  const permission_request_payload_1 = require("../../lib/hooks/permission-request-payload");
69
70
  const logger_1 = require("../../lib/logger");
@@ -343,6 +344,17 @@ function buildSessionStartCommand(target, options = {}) {
343
344
  * hook and nothing here delivers it — Claude enforces it itself, before any
344
345
  * `PermissionRequest` exists — which is precisely why it belongs next to the
345
346
  * hook that Auto-Yes answers rather than in the contract layer above it.
347
+ *
348
+ * `PostModelSwitch` (Issue #2363) is the structured report of a `/model` or
349
+ * `/fast` switch, measured on 2.1.263 to reach a `type: "http"` hook injected
350
+ * through this very file (`lib/hooks/sources/claude/model-switch` has the
351
+ * payload). It posts to the event receiver with no matcher: the event fires
352
+ * only when the model actually changes, so there is nothing to narrow. Its
353
+ * `PreModelSwitch` twin is deliberately NOT registered — it is a decision hook
354
+ * whose reply can block the switch, the probe's second session saw it fire
355
+ * twice per switch with inconsistent `from_model` values, and the `Post` event
356
+ * alone says what happened. The omission is pinned by
357
+ * `tests/unit/lib/hooks/hook-settings-post-model-switch-2363.test.ts`.
346
358
  */
347
359
  function buildAgentHookSettings(target, options = {}) {
348
360
  const url = buildAgentEventUrl(target, options);
@@ -369,6 +381,10 @@ function buildAgentHookSettings(target, options = {}) {
369
381
  // Issue #1726. The event receiver, not the permission one: observation.
370
382
  PreToolUse: [{ matcher: exports.TOOL_USE_MATCHER, hooks: [http()] }],
371
383
  PostToolUse: [{ matcher: exports.TOOL_USE_MATCHER, hooks: [http()] }],
384
+ // Issue #2363. The model the session is now on, on every `/model` and
385
+ // `/fast` that changes it. Observation, so the event receiver; and only
386
+ // the `Post` half — see the function comment.
387
+ [model_switch_1.CLAUDE_POST_MODEL_SWITCH_EVENT_NAME]: [{ hooks: [http()] }],
372
388
  // Issue #1724. Points at its own receiver, not the event one.
373
389
  PermissionRequest: [{ hooks: [permissionHttp()] }],
374
390
  },