commandmate 0.23.0 → 0.24.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 (662) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +393 -384
  3. package/.next/app-path-routes-manifest.json +15 -14
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/react-loadable-manifest.json +1 -1
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update-check/route.js +1 -1
  11. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/assistant/conversation/route.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 +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  17. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/messages/route.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  20. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/assistant/session/route.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  23. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/assistant/start/route.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  26. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/assistant/terminal/route.js +2 -2
  28. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  29. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/assistant/tools/route.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  32. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/daily-summary/route.js +1 -1
  37. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  38. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  40. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  41. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  48. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  49. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  51. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  52. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  54. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  55. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/push/escalation/route.js +1 -0
  59. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -0
  60. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -0
  61. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  62. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/push/vapid/route.js +1 -1
  64. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  65. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  68. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  70. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  72. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  73. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/repositories/clone/route.js +1 -1
  75. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/restore/route.js +1 -1
  79. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/route.js +1 -1
  82. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  83. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/repositories/scan/route.js +1 -1
  85. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  86. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/repositories/sync/route.js +1 -1
  88. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  89. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  100. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/todos/route.js +1 -1
  104. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  106. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/verification/runs/route.js +1 -1
  108. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  114. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  119. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  122. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  164. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +5 -5
  168. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  185. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  191. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  192. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  217. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  225. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/route.js +1 -1
  244. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/chat/page.js +2 -2
  247. package/.next/server/app/chat/page.js.nft.json +1 -1
  248. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  250. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/more/page.js +2 -2
  252. package/.next/server/app/more/page.js.nft.json +1 -1
  253. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  254. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  255. package/.next/server/app/page.js +1 -1
  256. package/.next/server/app/page.js.nft.json +1 -1
  257. package/.next/server/app/page_client-reference-manifest.js +1 -1
  258. package/.next/server/app/proxy/[...path]/route.js +1 -1
  259. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/repositories/page.js +2 -2
  261. package/.next/server/app/repositories/page.js.nft.json +1 -1
  262. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  263. package/.next/server/app/review/page.js +1 -1
  264. package/.next/server/app/review/page.js.nft.json +1 -1
  265. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  266. package/.next/server/app/sessions/page.js +1 -1
  267. package/.next/server/app/sessions/page.js.nft.json +1 -1
  268. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  269. package/.next/server/app/skills/[skillId]/page.js +2 -2
  270. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  271. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  272. package/.next/server/app/skills/installed/page.js +2 -2
  273. package/.next/server/app/skills/installed/page.js.nft.json +1 -1
  274. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  275. package/.next/server/app/skills/page.js +1 -1
  276. package/.next/server/app/skills/page.js.nft.json +1 -1
  277. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/worktrees/[id]/page.js +6 -6
  280. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  281. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app-paths-manifest.json +15 -14
  284. package/.next/server/chunks/1029.js +1 -1
  285. package/.next/server/chunks/1296.js +1 -1
  286. package/.next/server/chunks/1366.js +1 -1
  287. package/.next/server/chunks/1601.js +7 -0
  288. package/.next/server/chunks/1825.js +1 -1
  289. package/.next/server/chunks/2119.js +1 -1
  290. package/.next/server/chunks/2445.js +1 -1
  291. package/.next/server/chunks/2546.js +1 -1
  292. package/.next/server/chunks/3417.js +1 -1
  293. package/.next/server/chunks/3451.js +1 -1
  294. package/.next/server/chunks/3480.js +1 -1
  295. package/.next/server/chunks/3543.js +1 -1
  296. package/.next/server/chunks/3945.js +1 -1
  297. package/.next/server/chunks/4393.js +1 -0
  298. package/.next/server/chunks/4444.js +1 -1
  299. package/.next/server/chunks/4455.js +1 -0
  300. package/.next/server/chunks/5164.js +1 -0
  301. package/.next/server/chunks/5959.js +5 -5
  302. package/.next/server/chunks/5998.js +1 -1
  303. package/.next/server/chunks/6130.js +1 -1
  304. package/.next/server/chunks/6159.js +1 -1
  305. package/.next/server/chunks/6274.js +2 -2
  306. package/.next/server/chunks/6401.js +1 -1
  307. package/.next/server/chunks/7458.js +5 -5
  308. package/.next/server/chunks/8536.js +1 -1
  309. package/.next/server/chunks/880.js +21 -0
  310. package/.next/server/chunks/8807.js +134 -129
  311. package/.next/server/chunks/9058.js +1 -1
  312. package/.next/server/chunks/9123.js +8 -8
  313. package/.next/server/chunks/9358.js +1 -1
  314. package/.next/server/chunks/9373.js +3 -3
  315. package/.next/server/chunks/9687.js +1 -1
  316. package/.next/server/middleware-build-manifest.js +1 -1
  317. package/.next/server/middleware-manifest.json +5 -5
  318. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  319. package/.next/server/pages/500.html +1 -1
  320. package/.next/server/server-reference-manifest.json +1 -1
  321. package/.next/static/chunks/4322-dfd5a7119b5ba4fc.js +1 -0
  322. package/.next/static/chunks/{4974-eaf66770bfa9dea0.js → 4974-35592ec312322124.js} +1 -1
  323. package/.next/static/chunks/5229-0610b4e3288e777d.js +1 -0
  324. package/.next/static/chunks/6381-18a6a02a94d00d76.js +1 -0
  325. package/.next/static/chunks/7229.7f0f5a7032b612b4.js +1 -0
  326. package/.next/static/chunks/{744-fa8c0ae444c8338c.js → 744-3ad06d8c8ca482fc.js} +1 -1
  327. package/.next/static/chunks/app/api/app/update/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  328. package/.next/static/chunks/app/api/app/update-check/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  329. package/.next/static/chunks/app/api/assistant/conversation/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  330. package/.next/static/chunks/app/api/assistant/current-output/{route-973ec48531555712.js → route-fae89f8d4cc3ff97.js} +1 -1
  331. package/.next/static/chunks/app/api/assistant/messages/route-fae89f8d4cc3ff97.js +1 -0
  332. package/.next/static/chunks/app/api/assistant/session/route-fae89f8d4cc3ff97.js +1 -0
  333. package/.next/static/chunks/app/api/assistant/start/route-fae89f8d4cc3ff97.js +1 -0
  334. package/.next/static/chunks/app/api/assistant/terminal/route-fae89f8d4cc3ff97.js +1 -0
  335. package/.next/static/chunks/app/api/assistant/tools/route-fae89f8d4cc3ff97.js +1 -0
  336. package/.next/static/chunks/app/api/auth/login/route-fae89f8d4cc3ff97.js +1 -0
  337. package/.next/static/chunks/app/api/auth/logout/route-fae89f8d4cc3ff97.js +1 -0
  338. package/.next/static/chunks/app/api/auth/status/route-fae89f8d4cc3ff97.js +1 -0
  339. package/.next/static/chunks/app/api/daily-summary/route-fae89f8d4cc3ff97.js +1 -0
  340. package/.next/static/chunks/app/api/daily-summary/status/route-fae89f8d4cc3ff97.js +1 -0
  341. package/.next/static/chunks/app/api/external-apps/[id]/health/route-fae89f8d4cc3ff97.js +1 -0
  342. package/.next/static/chunks/app/api/external-apps/[id]/route-fae89f8d4cc3ff97.js +1 -0
  343. package/.next/static/chunks/app/api/external-apps/route-fae89f8d4cc3ff97.js +1 -0
  344. package/.next/static/chunks/app/api/fs/browse/route-fae89f8d4cc3ff97.js +1 -0
  345. package/.next/static/chunks/app/api/fs/recent-paths/route-fae89f8d4cc3ff97.js +1 -0
  346. package/.next/static/chunks/app/api/hooks/agent-event/route-fae89f8d4cc3ff97.js +1 -0
  347. package/.next/static/chunks/app/api/hooks/claude-done/route-fae89f8d4cc3ff97.js +1 -0
  348. package/.next/static/chunks/app/api/hooks/permission-request/route-fae89f8d4cc3ff97.js +1 -0
  349. package/.next/static/chunks/app/api/metrics/vibe/route-fae89f8d4cc3ff97.js +1 -0
  350. package/.next/static/chunks/app/api/ollama/models/route-fae89f8d4cc3ff97.js +1 -0
  351. package/.next/static/chunks/app/api/push/escalation/route-fae89f8d4cc3ff97.js +1 -0
  352. package/.next/static/chunks/app/api/push/subscriptions/route-fae89f8d4cc3ff97.js +1 -0
  353. package/.next/static/chunks/app/api/push/vapid/route-fae89f8d4cc3ff97.js +1 -0
  354. package/.next/static/chunks/app/api/repositories/[id]/route-fae89f8d4cc3ff97.js +1 -0
  355. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
  356. package/.next/static/chunks/app/api/repositories/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
  357. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-fae89f8d4cc3ff97.js +1 -0
  358. package/.next/static/chunks/app/api/repositories/clone/route-fae89f8d4cc3ff97.js +1 -0
  359. package/.next/static/chunks/app/api/repositories/excluded/route-fae89f8d4cc3ff97.js +1 -0
  360. package/.next/static/chunks/app/api/repositories/restore/route-fae89f8d4cc3ff97.js +1 -0
  361. package/.next/static/chunks/app/api/repositories/route-fae89f8d4cc3ff97.js +1 -0
  362. package/.next/static/chunks/app/api/repositories/scan/route-fae89f8d4cc3ff97.js +1 -0
  363. package/.next/static/chunks/app/api/repositories/sync/route-fae89f8d4cc3ff97.js +1 -0
  364. package/.next/static/chunks/app/api/repositories/validate-path/route-fae89f8d4cc3ff97.js +1 -0
  365. package/.next/static/chunks/app/api/sidebar/group-order/route-fae89f8d4cc3ff97.js +1 -0
  366. package/.next/static/chunks/app/api/skills/[id]/route-fae89f8d4cc3ff97.js +1 -0
  367. package/.next/static/chunks/app/api/skills/installations/route-fae89f8d4cc3ff97.js +1 -0
  368. package/.next/static/chunks/app/api/skills/operations/route-fae89f8d4cc3ff97.js +1 -0
  369. package/.next/static/chunks/app/api/skills/reindex/route-fae89f8d4cc3ff97.js +1 -0
  370. package/.next/static/chunks/app/api/skills/route-fae89f8d4cc3ff97.js +1 -0
  371. package/.next/static/chunks/app/api/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
  372. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-fae89f8d4cc3ff97.js +1 -0
  373. package/.next/static/chunks/app/api/tasks/[taskId]/route-fae89f8d4cc3ff97.js +1 -0
  374. package/.next/static/chunks/app/api/templates/[id]/route-fae89f8d4cc3ff97.js +1 -0
  375. package/.next/static/chunks/app/api/templates/route-fae89f8d4cc3ff97.js +1 -0
  376. package/.next/static/chunks/app/api/todos/route-fae89f8d4cc3ff97.js +1 -0
  377. package/.next/static/chunks/app/api/verification/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
  378. package/.next/static/chunks/app/api/verification/runs/route-fae89f8d4cc3ff97.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-fae89f8d4cc3ff97.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-fae89f8d4cc3ff97.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-fae89f8d4cc3ff97.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-fae89f8d4cc3ff97.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-fae89f8d4cc3ff97.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-fae89f8d4cc3ff97.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-fae89f8d4cc3ff97.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-fae89f8d4cc3ff97.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-fae89f8d4cc3ff97.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-fae89f8d4cc3ff97.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-fae89f8d4cc3ff97.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-fae89f8d4cc3ff97.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-fae89f8d4cc3ff97.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-fae89f8d4cc3ff97.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-fae89f8d4cc3ff97.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-fae89f8d4cc3ff97.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-fae89f8d4cc3ff97.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-fae89f8d4cc3ff97.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-fae89f8d4cc3ff97.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-fae89f8d4cc3ff97.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-fae89f8d4cc3ff97.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-fae89f8d4cc3ff97.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-fae89f8d4cc3ff97.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-fae89f8d4cc3ff97.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-fae89f8d4cc3ff97.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-fae89f8d4cc3ff97.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-fae89f8d4cc3ff97.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-fae89f8d4cc3ff97.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-fae89f8d4cc3ff97.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-fae89f8d4cc3ff97.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-fae89f8d4cc3ff97.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-fae89f8d4cc3ff97.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-fae89f8d4cc3ff97.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-fae89f8d4cc3ff97.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-fae89f8d4cc3ff97.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-fae89f8d4cc3ff97.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-fae89f8d4cc3ff97.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-fae89f8d4cc3ff97.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-fae89f8d4cc3ff97.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-fae89f8d4cc3ff97.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/route-fae89f8d4cc3ff97.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-fae89f8d4cc3ff97.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-fae89f8d4cc3ff97.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-fae89f8d4cc3ff97.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/search/route-fae89f8d4cc3ff97.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/send/route-fae89f8d4cc3ff97.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-fae89f8d4cc3ff97.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-fae89f8d4cc3ff97.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-fae89f8d4cc3ff97.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-fae89f8d4cc3ff97.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-fae89f8d4cc3ff97.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-fae89f8d4cc3ff97.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-fae89f8d4cc3ff97.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-fae89f8d4cc3ff97.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-fae89f8d4cc3ff97.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-fae89f8d4cc3ff97.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-fae89f8d4cc3ff97.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-fae89f8d4cc3ff97.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-fae89f8d4cc3ff97.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-fae89f8d4cc3ff97.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-fae89f8d4cc3ff97.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-fae89f8d4cc3ff97.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-fae89f8d4cc3ff97.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-fae89f8d4cc3ff97.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-fae89f8d4cc3ff97.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-fae89f8d4cc3ff97.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-fae89f8d4cc3ff97.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-fae89f8d4cc3ff97.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/route-fae89f8d4cc3ff97.js +1 -0
  451. package/.next/static/chunks/app/chat/page-15d13fc024d78f5d.js +1 -0
  452. package/.next/static/chunks/app/layout-6a26ea22d5cf03dc.js +1 -0
  453. package/.next/static/chunks/app/manifest.webmanifest/route-fae89f8d4cc3ff97.js +1 -0
  454. package/.next/static/chunks/app/more/page-b8ba537baeac8d5b.js +1 -0
  455. package/.next/static/chunks/app/page-afc64708362f31e5.js +1 -0
  456. package/.next/static/chunks/app/proxy/[...path]/route-fae89f8d4cc3ff97.js +1 -0
  457. package/.next/static/chunks/app/repositories/page-3469dacb6be7842f.js +1 -0
  458. package/.next/static/chunks/app/review/page-2d9cb7e068f8f35a.js +1 -0
  459. package/.next/static/chunks/app/sessions/page-7470c2bfd89e0df9.js +1 -0
  460. package/.next/static/chunks/app/skills/[skillId]/page-5e24481162f7ea78.js +1 -0
  461. package/.next/static/chunks/app/skills/installed/page-efd2d710a27f9735.js +1 -0
  462. package/.next/static/chunks/app/skills/page-0498adfc6e48684b.js +1 -0
  463. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-9ddcb224594f620f.js +1 -0
  464. package/.next/static/chunks/app/worktrees/[id]/layout-fae89f8d4cc3ff97.js +1 -0
  465. package/.next/static/chunks/app/worktrees/[id]/page-e611d30e47989e5d.js +1 -0
  466. package/.next/static/chunks/{webpack-180bebdee221b6f4.js → webpack-3534d858912a6c92.js} +1 -1
  467. package/.next/static/css/3ac44cfc082d02ad.css +1 -0
  468. package/.next/static/smu4mnL7qMf8w38n9dQJE/_buildManifest.js +1 -0
  469. package/.next/trace +12 -12
  470. package/.next/types/app/api/push/escalation/route.ts +347 -0
  471. package/.next/types/routes.d.ts +2 -1
  472. package/.next/types/validator.ts +9 -0
  473. package/dist/cli/commands/capture.d.ts.map +1 -1
  474. package/dist/cli/commands/capture.js +6 -0
  475. package/dist/cli/commands/instances.d.ts.map +1 -1
  476. package/dist/cli/commands/instances.js +19 -1
  477. package/dist/cli/commands/task.d.ts.map +1 -1
  478. package/dist/cli/commands/task.js +6 -0
  479. package/dist/cli/commands/verify.js +6 -1
  480. package/dist/cli/types/api-responses.d.ts +46 -0
  481. package/dist/cli/types/api-responses.d.ts.map +1 -1
  482. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  483. package/dist/cli/utils/verify-runner.js +17 -1
  484. package/dist/server/locales/en/notifications.json +20 -1
  485. package/dist/server/locales/ja/notifications.json +20 -1
  486. package/dist/server/server.js +23 -0
  487. package/dist/server/src/lib/db/db.js +2 -1
  488. package/dist/server/src/lib/db/migrations/index.js +2 -0
  489. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  490. package/dist/server/src/lib/db/migrations/v56-gate-result-source.js +58 -0
  491. package/dist/server/src/lib/db/verification-db.js +26 -6
  492. package/dist/server/src/lib/detection/model-info-extractor.js +384 -0
  493. package/dist/server/src/lib/hooks/sources/antigravity/source.js +4 -0
  494. package/dist/server/src/lib/hooks/sources/claude/source.js +7 -0
  495. package/dist/server/src/lib/hooks/sources/codex/source.js +5 -0
  496. package/dist/server/src/lib/hooks/sources/define-source.js +8 -0
  497. package/dist/server/src/lib/hooks/sources/event-mapper.js +20 -0
  498. package/dist/server/src/lib/hooks/sources/opencode/ingest.js +6 -0
  499. package/dist/server/src/lib/hooks/sources/opencode/mappers.js +22 -0
  500. package/dist/server/src/lib/hooks/sources/opencode/source.js +3 -0
  501. package/dist/server/src/lib/polling/response-checker.js +47 -0
  502. package/dist/server/src/lib/push/escalation-settings.js +114 -0
  503. package/dist/server/src/lib/push/index.js +21 -1
  504. package/dist/server/src/lib/push/notification-dedup.js +35 -0
  505. package/dist/server/src/lib/push/push-sender.js +66 -7
  506. package/dist/server/src/lib/push/waiting-push-notifier.js +231 -0
  507. package/dist/server/src/lib/realtime/waiting-broadcast.js +93 -0
  508. package/dist/server/src/lib/session/agent-event-state.js +260 -0
  509. package/dist/server/src/lib/session/current-output-builder.js +24 -0
  510. package/dist/server/src/lib/session/next-action-helper.js +93 -0
  511. package/dist/server/src/lib/session/prompt-waiting-composition.js +38 -0
  512. package/dist/server/src/lib/session/waiting-episode-state.js +136 -0
  513. package/dist/server/src/lib/session/waiting-kind.js +59 -0
  514. package/dist/server/src/lib/tasks/contract-message.js +64 -21
  515. package/dist/server/src/lib/tasks/contract-parser.js +58 -12
  516. package/dist/server/src/lib/verification/gate-runner.js +64 -22
  517. package/dist/server/src/lib/verification/verify-config.js +84 -51
  518. package/dist/server/src/lib/ws-server.js +9 -0
  519. package/dist/server/src/types/sidebar.js +68 -0
  520. package/package.json +1 -1
  521. package/.next/server/chunks/6283.js +0 -1
  522. package/.next/server/chunks/646.js +0 -21
  523. package/.next/static/chunks/4560-0917ae2e6a0e5400.js +0 -1
  524. package/.next/static/chunks/6488-95ba9d24a76f0cc5.js +0 -1
  525. package/.next/static/chunks/7229.edb331fb9fbafa27.js +0 -1
  526. package/.next/static/chunks/app/api/assistant/messages/route-973ec48531555712.js +0 -1
  527. package/.next/static/chunks/app/api/assistant/session/route-973ec48531555712.js +0 -1
  528. package/.next/static/chunks/app/api/assistant/start/route-973ec48531555712.js +0 -1
  529. package/.next/static/chunks/app/api/assistant/terminal/route-973ec48531555712.js +0 -1
  530. package/.next/static/chunks/app/api/assistant/tools/route-973ec48531555712.js +0 -1
  531. package/.next/static/chunks/app/api/auth/login/route-973ec48531555712.js +0 -1
  532. package/.next/static/chunks/app/api/auth/logout/route-973ec48531555712.js +0 -1
  533. package/.next/static/chunks/app/api/auth/status/route-973ec48531555712.js +0 -1
  534. package/.next/static/chunks/app/api/daily-summary/route-973ec48531555712.js +0 -1
  535. package/.next/static/chunks/app/api/daily-summary/status/route-973ec48531555712.js +0 -1
  536. package/.next/static/chunks/app/api/external-apps/[id]/health/route-973ec48531555712.js +0 -1
  537. package/.next/static/chunks/app/api/external-apps/[id]/route-973ec48531555712.js +0 -1
  538. package/.next/static/chunks/app/api/external-apps/route-973ec48531555712.js +0 -1
  539. package/.next/static/chunks/app/api/fs/browse/route-973ec48531555712.js +0 -1
  540. package/.next/static/chunks/app/api/fs/recent-paths/route-973ec48531555712.js +0 -1
  541. package/.next/static/chunks/app/api/hooks/agent-event/route-973ec48531555712.js +0 -1
  542. package/.next/static/chunks/app/api/hooks/claude-done/route-973ec48531555712.js +0 -1
  543. package/.next/static/chunks/app/api/hooks/permission-request/route-973ec48531555712.js +0 -1
  544. package/.next/static/chunks/app/api/metrics/vibe/route-973ec48531555712.js +0 -1
  545. package/.next/static/chunks/app/api/ollama/models/route-973ec48531555712.js +0 -1
  546. package/.next/static/chunks/app/api/push/subscriptions/route-973ec48531555712.js +0 -1
  547. package/.next/static/chunks/app/api/push/vapid/route-973ec48531555712.js +0 -1
  548. package/.next/static/chunks/app/api/repositories/[id]/route-973ec48531555712.js +0 -1
  549. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
  550. package/.next/static/chunks/app/api/repositories/[id]/todos/route-973ec48531555712.js +0 -1
  551. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-973ec48531555712.js +0 -1
  552. package/.next/static/chunks/app/api/repositories/clone/route-973ec48531555712.js +0 -1
  553. package/.next/static/chunks/app/api/repositories/excluded/route-973ec48531555712.js +0 -1
  554. package/.next/static/chunks/app/api/repositories/restore/route-973ec48531555712.js +0 -1
  555. package/.next/static/chunks/app/api/repositories/route-973ec48531555712.js +0 -1
  556. package/.next/static/chunks/app/api/repositories/scan/route-973ec48531555712.js +0 -1
  557. package/.next/static/chunks/app/api/repositories/sync/route-973ec48531555712.js +0 -1
  558. package/.next/static/chunks/app/api/repositories/validate-path/route-973ec48531555712.js +0 -1
  559. package/.next/static/chunks/app/api/sidebar/group-order/route-973ec48531555712.js +0 -1
  560. package/.next/static/chunks/app/api/skills/[id]/route-973ec48531555712.js +0 -1
  561. package/.next/static/chunks/app/api/skills/installations/route-973ec48531555712.js +0 -1
  562. package/.next/static/chunks/app/api/skills/operations/route-973ec48531555712.js +0 -1
  563. package/.next/static/chunks/app/api/skills/reindex/route-973ec48531555712.js +0 -1
  564. package/.next/static/chunks/app/api/skills/route-973ec48531555712.js +0 -1
  565. package/.next/static/chunks/app/api/slash-commands/route-973ec48531555712.js +0 -1
  566. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-973ec48531555712.js +0 -1
  567. package/.next/static/chunks/app/api/tasks/[taskId]/route-973ec48531555712.js +0 -1
  568. package/.next/static/chunks/app/api/templates/[id]/route-973ec48531555712.js +0 -1
  569. package/.next/static/chunks/app/api/templates/route-973ec48531555712.js +0 -1
  570. package/.next/static/chunks/app/api/todos/route-973ec48531555712.js +0 -1
  571. package/.next/static/chunks/app/api/verification/runs/[runId]/route-973ec48531555712.js +0 -1
  572. package/.next/static/chunks/app/api/verification/runs/route-973ec48531555712.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-973ec48531555712.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-973ec48531555712.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-973ec48531555712.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-973ec48531555712.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-973ec48531555712.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-973ec48531555712.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-973ec48531555712.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-973ec48531555712.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-973ec48531555712.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-973ec48531555712.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-973ec48531555712.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-973ec48531555712.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-973ec48531555712.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-973ec48531555712.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-973ec48531555712.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-973ec48531555712.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-973ec48531555712.js +0 -1
  590. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-973ec48531555712.js +0 -1
  591. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-973ec48531555712.js +0 -1
  592. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-973ec48531555712.js +0 -1
  593. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-973ec48531555712.js +0 -1
  594. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-973ec48531555712.js +0 -1
  595. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-973ec48531555712.js +0 -1
  596. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-973ec48531555712.js +0 -1
  597. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-973ec48531555712.js +0 -1
  598. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-973ec48531555712.js +0 -1
  599. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-973ec48531555712.js +0 -1
  600. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-973ec48531555712.js +0 -1
  601. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-973ec48531555712.js +0 -1
  602. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-973ec48531555712.js +0 -1
  603. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-973ec48531555712.js +0 -1
  604. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-973ec48531555712.js +0 -1
  605. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-973ec48531555712.js +0 -1
  606. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-973ec48531555712.js +0 -1
  607. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-973ec48531555712.js +0 -1
  608. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-973ec48531555712.js +0 -1
  609. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-973ec48531555712.js +0 -1
  610. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-973ec48531555712.js +0 -1
  611. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-973ec48531555712.js +0 -1
  612. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-973ec48531555712.js +0 -1
  613. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-973ec48531555712.js +0 -1
  614. package/.next/static/chunks/app/api/worktrees/[id]/route-973ec48531555712.js +0 -1
  615. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-973ec48531555712.js +0 -1
  616. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-973ec48531555712.js +0 -1
  617. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-973ec48531555712.js +0 -1
  618. package/.next/static/chunks/app/api/worktrees/[id]/search/route-973ec48531555712.js +0 -1
  619. package/.next/static/chunks/app/api/worktrees/[id]/send/route-973ec48531555712.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-973ec48531555712.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-973ec48531555712.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-973ec48531555712.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-973ec48531555712.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-973ec48531555712.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-973ec48531555712.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-973ec48531555712.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-973ec48531555712.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-973ec48531555712.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-973ec48531555712.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-973ec48531555712.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-973ec48531555712.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-973ec48531555712.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-973ec48531555712.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-973ec48531555712.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-973ec48531555712.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-973ec48531555712.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-973ec48531555712.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-973ec48531555712.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-973ec48531555712.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-973ec48531555712.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-973ec48531555712.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-973ec48531555712.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-973ec48531555712.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/route-973ec48531555712.js +0 -1
  645. package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +0 -1
  646. package/.next/static/chunks/app/layout-86574192bd3c0e6b.js +0 -1
  647. package/.next/static/chunks/app/manifest.webmanifest/route-973ec48531555712.js +0 -1
  648. package/.next/static/chunks/app/more/page-1619018cac999bbc.js +0 -1
  649. package/.next/static/chunks/app/page-a34d26812f085b6c.js +0 -1
  650. package/.next/static/chunks/app/proxy/[...path]/route-973ec48531555712.js +0 -1
  651. package/.next/static/chunks/app/repositories/page-202680fe6ec169c8.js +0 -1
  652. package/.next/static/chunks/app/review/page-b559bfb11c46931b.js +0 -1
  653. package/.next/static/chunks/app/sessions/page-3fa7e767d0ab3889.js +0 -1
  654. package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +0 -1
  655. package/.next/static/chunks/app/skills/installed/page-6641f95e6a6e5f9d.js +0 -1
  656. package/.next/static/chunks/app/skills/page-184f8e23e31a3667.js +0 -1
  657. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/page-6041d3c3db326317.js +0 -1
  658. package/.next/static/chunks/app/worktrees/[id]/layout-973ec48531555712.js +0 -1
  659. package/.next/static/chunks/app/worktrees/[id]/page-966a451ae7b0903a.js +0 -1
  660. package/.next/static/css/d3453a6876553d32.css +0 -1
  661. package/.next/static/wH6K6QNPHSdATFkVoIcy3/_buildManifest.js +0 -1
  662. /package/.next/static/{wH6K6QNPHSdATFkVoIcy3 → smu4mnL7qMf8w38n9dQJE}/_ssgManifest.js +0 -0
@@ -0,0 +1,384 @@
1
+ "use strict";
2
+ /**
3
+ * Model / reasoning-effort extraction from the terminal frame (Issue #1784).
4
+ *
5
+ * Phase 1 (#1783) reads the model off the agents' own structured hook events.
6
+ * That channel has one hole and one gap:
7
+ *
8
+ * - **No effort, anywhere.** Not one hook payload of any tool carries a
9
+ * reasoning-effort field (verified across every fixture under
10
+ * `tests/fixtures/hooks/`). The only place the number exists at all is on
11
+ * screen, in the TUI's own chrome.
12
+ * - **No model after a restart, for Claude.** Claude publishes its model on
13
+ * `SessionStart` and on nothing else, so a server that restarts mid-session
14
+ * never hears it again for that session. The banner is still in scrollback.
15
+ *
16
+ * This module is the screen-scraped half. It is deliberately a *separate* set of
17
+ * patterns from `cli-patterns.ts`: two of the patterns it would otherwise have
18
+ * been tempting to extend are load-bearing for behaviour that has nothing to do
19
+ * with display —
20
+ *
21
+ * - `CODEX_STATUS_BAR_PATTERN` is the footer boundary the Codex running/idle
22
+ * decision is windowed on (#1150). Widening it to capture groups risks the
23
+ * dot.
24
+ * - `CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN` is the guard that stops Auto-Yes from
25
+ * Enter-confirming the `/model` picker and rewriting the user's **global
26
+ * default model** (#1495).
27
+ *
28
+ * So: read-only reuse of `CODEX_STATUS_BAR_PATTERN` to *locate* the footer (one
29
+ * definition of "which line is the status bar", shared with the detector), new
30
+ * patterns to read values out of it, and not one byte changed in either file.
31
+ *
32
+ * ## Where the values come from (all measured on real TUIs, 2026-08-15)
33
+ *
34
+ * | tool | line |
35
+ * |-------------|------------------------------------------------------------------|
36
+ * | codex | footer: `gpt-5.6-sol xhigh · ~/share/work/…` |
37
+ * | claude | banner: `▝▜█████▛▘ Opus 5 (1M context) with xhigh effort · Claude Max` |
38
+ * | antigravity | footer: `? for shortcuts … Gemini 3.7 Flash · hig` |
39
+ * | antigravity | banner: ` ▀▀▀▀▀▀▀▀ Gemini 3.7 Flash (High)` |
40
+ *
41
+ * Everything is matched **after** `stripAnsi`. The real captures are shot
42
+ * through with SGR sequences *inside* the value — the Codex footer arrives as
43
+ * `\x1b[38;2;…mgpt-5.6-sol xhigh\x1b[2m\x1b[39m · …` — so a pattern applied to
44
+ * the raw bytes matches nothing at all. `tests/fixtures/model-info-captures.ts`
45
+ * keeps one ANSI-bearing capture precisely so a regression here fails a test
46
+ * rather than a user's screen.
47
+ *
48
+ * ## Not a new capture
49
+ *
50
+ * Nothing here issues a `capture-pane`. {@link extractModelInfo} is a pure
51
+ * function of text the status-detection poll already fetched
52
+ * (`worktree-status-helper.ts`), so the added load is zero.
53
+ *
54
+ * @see Issue #1784, Phase 2 of the model/effort visibility series
55
+ */
56
+ Object.defineProperty(exports, "__esModule", { value: true });
57
+ exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = exports.CLAUDE_STARTUP_BANNER_PATTERN = exports.CODEX_FOOTER_MODEL_PATTERN = exports.REASONING_EFFORT_LEVELS = void 0;
58
+ exports.resolveEffortToken = resolveEffortToken;
59
+ exports.extractModelInfo = extractModelInfo;
60
+ exports.deriveEffortFromModelId = deriveEffortFromModelId;
61
+ exports.mergeModelInfo = mergeModelInfo;
62
+ const ansi_1 = require("./ansi");
63
+ const cli_patterns_1 = require("./cli-patterns");
64
+ /**
65
+ * The reasoning-effort vocabulary these tools actually print.
66
+ *
67
+ * `minimal` and `xhigh` are the ends Codex exposes; Claude prints `xhigh` too.
68
+ * Anything outside this list is treated as "not an effort token", which is what
69
+ * keeps a stray word at the end of a status bar from being published as one.
70
+ */
71
+ exports.REASONING_EFFORT_LEVELS = ['minimal', 'low', 'medium', 'high', 'xhigh'];
72
+ /**
73
+ * Longest string accepted as a model name.
74
+ *
75
+ * A bound, not a format check: the point is that a runaway match (a wrapped
76
+ * conversation line that happened to satisfy the shape) is rejected rather than
77
+ * pushed into the UI and the API. Real ids are far shorter — the longest
78
+ * observed is `Opus 5 (1M context)` at 19.
79
+ */
80
+ const MAX_MODEL_NAME_LENGTH = 64;
81
+ /** An unknown answer. Freshly built each time — callers may keep the object. */
82
+ function unknown() {
83
+ return { model: null, effort: null };
84
+ }
85
+ /**
86
+ * Bare model *token* shape — Codex, whose footer prints the raw id.
87
+ *
88
+ * No spaces: the Codex footer's model is one token (`gpt-5.6-sol`, `o4-mini`).
89
+ */
90
+ const MODEL_TOKEN_SHAPE = /^[A-Za-z0-9][A-Za-z0-9._:@/-]*$/;
91
+ /**
92
+ * Model *label* shape — Claude and Antigravity, which print a display name.
93
+ *
94
+ * Spaces, dots and parentheses are in (`Opus 5 (1M context)`, `Gemini 3.7
95
+ * Flash`); anything else — box glyphs, `?`, `·`, `>` — is out, which is what
96
+ * rejects a status-bar hint that was mistaken for the model.
97
+ */
98
+ const MODEL_LABEL_SHAPE = /^[A-Za-z0-9][A-Za-z0-9 .()[\]_:@/-]*$/;
99
+ function isPlausibleModelToken(value) {
100
+ return value.length > 0 && value.length <= MAX_MODEL_NAME_LENGTH && MODEL_TOKEN_SHAPE.test(value);
101
+ }
102
+ function isPlausibleModelLabel(value) {
103
+ return value.length > 0 && value.length <= MAX_MODEL_NAME_LENGTH && MODEL_LABEL_SHAPE.test(value);
104
+ }
105
+ /**
106
+ * Resolve a word to a {@link ReasoningEffort}, or null.
107
+ *
108
+ * `allowTruncated` exists for exactly one measured defect: **agy 1.1.13 renders
109
+ * its right-aligned status bar one column short**, so `high` reaches the pane as
110
+ * `hig` at every width tested (200 and 120 both produce a 199-/119-column line
111
+ * whose last glyph is missing). Accepting a one-character-short prefix recovers
112
+ * it. The prefix must resolve to exactly one level, so nothing ambiguous is ever
113
+ * promoted — `hig`→`high`, `lo`→`low`, `mediu`→`medium`, `xhig`→`xhigh`, and a
114
+ * single letter resolves to nothing.
115
+ *
116
+ * Off for Codex and Claude: neither truncates, and loosening a matcher that does
117
+ * not need it only buys false positives.
118
+ */
119
+ function resolveEffortToken(token, options = {}) {
120
+ const normalized = token.trim().toLowerCase();
121
+ if (normalized === '')
122
+ return null;
123
+ if (exports.REASONING_EFFORT_LEVELS.includes(normalized))
124
+ return normalized;
125
+ if (!options.allowTruncated || normalized.length < 2)
126
+ return null;
127
+ const candidates = exports.REASONING_EFFORT_LEVELS.filter((level) => level.length === normalized.length + 1 && level.startsWith(normalized));
128
+ return candidates.length === 1 ? candidates[0] : null;
129
+ }
130
+ // =============================================================================
131
+ // Codex
132
+ // =============================================================================
133
+ /**
134
+ * Reads `<model>[ <effort>]` off the head of a Codex status bar (Issue #1784).
135
+ *
136
+ * Applied to the segment *before* the first "·", which is what makes one pattern
137
+ * cover all three footer formats the CLI has shipped:
138
+ *
139
+ * v0.147 / v0.141: `gpt-5.6-sol xhigh · ~/share/work/…` → head `gpt-5.6-sol xhigh `
140
+ * legacy w/ quota: `gpt-5.4 high · 21% left · ~/…` → head `gpt-5.4 high `
141
+ * legacy o4-mini: ` o4-mini 50% left · /path` → head ` o4-mini 50% left `
142
+ *
143
+ * The last one is why the effort group is optional *and* why it is anchored to a
144
+ * keyword rather than "the second token": that format's second token is `50%`,
145
+ * and a positional read would publish "50%" as the reasoning effort.
146
+ *
147
+ * No /g flag (stateless `exec`). No nested quantifiers — `[^\s·]+` and the
148
+ * optional `\s+<keyword>` are adjacent, never nested (ReDoS-safe, same rule
149
+ * `cli-patterns.ts` documents).
150
+ */
151
+ exports.CODEX_FOOTER_MODEL_PATTERN = /^\s*([^\s·]+)(?:\s+(minimal|low|medium|high|xhigh)\b)?/i;
152
+ function readCodexFooter(line) {
153
+ // Same "is this the status bar" question the detector asks, answered by the
154
+ // same pattern (#1150). Imported read-only: this module must never be the
155
+ // reason that boundary moves.
156
+ if (!cli_patterns_1.CODEX_STATUS_BAR_PATTERN.test(line))
157
+ return null;
158
+ const separator = line.indexOf('·');
159
+ if (separator < 0)
160
+ return null;
161
+ const match = exports.CODEX_FOOTER_MODEL_PATTERN.exec(line.slice(0, separator));
162
+ if (!match)
163
+ return null;
164
+ const model = match[1];
165
+ if (!isPlausibleModelToken(model))
166
+ return null;
167
+ const effort = match[2] ? resolveEffortToken(match[2]) : null;
168
+ // `CODEX_STATUS_BAR_PATTERN` is a *boundary* test — "a token, a middle dot, a
169
+ // trailing path" — and the detector can afford that because it only ever asks
170
+ // it inside a window it already knows the footer is in. Reading values needs
171
+ // one more bit of evidence, because a sentence Codex printed about a file
172
+ // ("Updated · /src/foo.ts") satisfies the boundary shape, and a value read
173
+ // here LATCHES for the rest of the session. Every Codex model id carries a
174
+ // version number, so a digit in the token or a recognised effort keyword
175
+ // beside it is what separates chrome from prose.
176
+ if (effort === null && !/\d/.test(model))
177
+ return null;
178
+ return { model, effort };
179
+ }
180
+ // =============================================================================
181
+ // Claude
182
+ // =============================================================================
183
+ /**
184
+ * Reads `<model> with <effort> effort` off the Claude startup banner (#1784).
185
+ *
186
+ * Measured on claude 2.1.232:
187
+ * `▝▜█████▛▘ Opus 5 (1M context) with xhigh effort · Claude Max`
188
+ *
189
+ * Three deliberate choices:
190
+ *
191
+ * - **The block/box glyph is required.** `U+2500–U+259F` covers both the ASCII
192
+ * art of the plain banner (`▝▜█████▛▘`) and the frame of the boxed welcome
193
+ * variant (`│ Opus 4.8 (1M context) with xhigh effort · Claude Max │`,
194
+ * `tests/fixtures/claude-model-overlay.ts`). Without it, a *reply* containing
195
+ * the words "…with high effort…" would be scraped as a model — Claude's own
196
+ * prose shares the pane with its chrome.
197
+ * - **The plan suffix is not matched.** `· Claude Max` is one plan of several
198
+ * and is not part of the model; the match ends at `effort`.
199
+ * - **`(1M context)` is inside the model, not stripped.** It is what
200
+ * distinguishes the 1M variant, and #1783 already displays the hook-reported
201
+ * id verbatim.
202
+ *
203
+ * No /g. No nested quantifiers: the lazy `[^\u2500-\u259F]*?` sits between two
204
+ * literal-anchored parts, and the greedy prefix class is disjoint from `\S`.
205
+ */
206
+ exports.CLAUDE_STARTUP_BANNER_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+with\s+(minimal|low|medium|high|xhigh)\s+effort\b/i;
207
+ function readClaudeBanner(line) {
208
+ const match = exports.CLAUDE_STARTUP_BANNER_PATTERN.exec(line);
209
+ if (!match)
210
+ return null;
211
+ const model = match[1].trim();
212
+ if (!isPlausibleModelLabel(model))
213
+ return null;
214
+ return { model, effort: resolveEffortToken(match[2]) };
215
+ }
216
+ // =============================================================================
217
+ // Antigravity
218
+ // =============================================================================
219
+ /**
220
+ * The two left-hand hints agy prints on its status bar (#1784).
221
+ *
222
+ * `? for shortcuts` when idle and `esc to cancel` while generating — both
223
+ * measured on agy 1.1.13, and both already documented in
224
+ * `src/lib/cli-tools/antigravity.ts`. Requiring one of them is what stops a
225
+ * wrapped answer line that happens to end in `· high` from being read as chrome.
226
+ */
227
+ exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN = /^\s*(?:\?\s+for\s+shortcuts|esc\s+to\s+cancel)\b/i;
228
+ /**
229
+ * Reads `<model> (<Effort>)` off the agy startup banner (#1784).
230
+ *
231
+ * Measured: ` ▀▀▀▀▀▀▀▀ Gemini 3.7 Flash (High)`. Same block-glyph anchor
232
+ * as the Claude banner, for the same reason. The sibling banner lines are
233
+ * rejected by the effort keyword — the account line `dev@example.com (Google AI
234
+ * Pro)` sitting directly above it has the shape but not the vocabulary.
235
+ *
236
+ * Used only as the fallback: the status bar survives scrollback eviction and the
237
+ * banner does not.
238
+ */
239
+ exports.ANTIGRAVITY_BANNER_MODEL_PATTERN = /^\s*[\u2500-\u259F][\s\u2500-\u259F]*(\S[^\u2500-\u259F]*?)\s+\((minimal|low|medium|high|xhigh)\)\s*$/i;
240
+ function readAntigravityStatusBar(line) {
241
+ if (!exports.ANTIGRAVITY_STATUS_BAR_HINT_PATTERN.test(line))
242
+ return null;
243
+ const separator = line.lastIndexOf('·');
244
+ if (separator < 0)
245
+ return null;
246
+ // agy drops the final column of this line (see `resolveEffortToken`), so the
247
+ // trailing token is read with truncation tolerance. If it does not resolve,
248
+ // the whole line is abandoned rather than half-read: a bar with no effort
249
+ // suffix would otherwise hand back a model name with its last letter shaved
250
+ // off.
251
+ const effort = resolveEffortToken(line.slice(separator + 1), { allowTruncated: true });
252
+ if (!effort)
253
+ return null;
254
+ // The bar is `<hint>` … right-aligned `<model>`, so the model is the last
255
+ // run of text separated from the hint by the alignment padding.
256
+ const chunks = line.slice(0, separator).trimEnd().split(/\s{2,}/);
257
+ const model = (chunks[chunks.length - 1] ?? '').trim();
258
+ return { model: isPlausibleModelLabel(model) ? model : null, effort };
259
+ }
260
+ function readAntigravityBanner(line) {
261
+ const match = exports.ANTIGRAVITY_BANNER_MODEL_PATTERN.exec(line);
262
+ if (!match)
263
+ return null;
264
+ const model = match[1].trim();
265
+ if (!isPlausibleModelLabel(model))
266
+ return null;
267
+ return { model, effort: resolveEffortToken(match[2]) };
268
+ }
269
+ // =============================================================================
270
+ // Public API
271
+ // =============================================================================
272
+ /**
273
+ * Scan a capture from the bottom up, returning the first line that reads.
274
+ *
275
+ * Bottom-up is the whole rule: the status bar is the last line of the frame, and
276
+ * for Claude "the last banner wins" is how a mid-session `/model` switch — which
277
+ * prints a fresh banner — overtakes the one from session start.
278
+ *
279
+ * ANSI is stripped per line rather than over the whole blob so a malformed OSC
280
+ * sequence can never swallow a newline and merge two lines into one.
281
+ */
282
+ function scanFromEnd(captureText, read) {
283
+ const lines = captureText.split('\n');
284
+ for (let i = lines.length - 1; i >= 0; i--) {
285
+ const result = read((0, ansi_1.stripAnsi)(lines[i]));
286
+ if (result)
287
+ return result;
288
+ }
289
+ return null;
290
+ }
291
+ /**
292
+ * What this capture says the session's model and reasoning effort are (#1784).
293
+ *
294
+ * Pure and side-effect free. Never throws, and answers `{ model: null, effort:
295
+ * null }` for every tool it has no rule for (gemini / copilot / vibe-local /
296
+ * opencode — out of scope for this Issue) and for every frame that does not show
297
+ * the chrome it looks for.
298
+ *
299
+ * **Answering null is a correct outcome, not a failure.** tmux keeps a
300
+ * 2000-line `history-limit`; a Claude session that has been talking for hours
301
+ * has long since scrolled its banner away, and the honest answer then is "the
302
+ * screen does not say" — the alternative, a stale or guessed value, is the one
303
+ * thing this must not do. The caller latches the last non-null sighting.
304
+ *
305
+ * @param cliToolId - Which TUI the text came from; the rules are per-tool
306
+ * @param captureText - `capture-pane` output, ANSI-bearing or not
307
+ */
308
+ function extractModelInfo(cliToolId, captureText) {
309
+ if (!captureText)
310
+ return unknown();
311
+ switch (cliToolId) {
312
+ case 'codex':
313
+ return scanFromEnd(captureText, readCodexFooter) ?? unknown();
314
+ case 'claude':
315
+ return scanFromEnd(captureText, readClaudeBanner) ?? unknown();
316
+ case 'antigravity':
317
+ return (scanFromEnd(captureText, readAntigravityStatusBar) ??
318
+ scanFromEnd(captureText, readAntigravityBanner) ??
319
+ unknown());
320
+ default:
321
+ return unknown();
322
+ }
323
+ }
324
+ /**
325
+ * The effort an Antigravity model id carries in its own name (#1784).
326
+ *
327
+ * agy's ids embed the level — `gemini-3.7-flash-high`, `gemini-3.5-flash-low` —
328
+ * and that id arrives on **every** agy hook payload (`modelName`), which makes
329
+ * it a strictly better source than the screen for this one tool: no scrollback
330
+ * dependency, no truncation, no polling delay.
331
+ *
332
+ * Ids that carry no suffix (`claude-sonnet-4-6`, `claude-opus-4-6-thinking`)
333
+ * answer null and fall through to the scraped bar.
334
+ *
335
+ * **Measured against the Issue text**: #1784 lists `gpt-oss-120b-medium` as an
336
+ * id "without a suffix" while also specifying `-low|-medium|-high$` as the rule
337
+ * — the two contradict each other, because that id ends in `-medium`. The stated
338
+ * rule is applied as written (it reads `medium`), which is also the reading that
339
+ * matches what the level means for that model. Nothing is lost either way: the
340
+ * *model* shown in the UI is the hook-reported id verbatim, so the id is never
341
+ * rewritten by this function.
342
+ *
343
+ * `minimal` / `xhigh` are deliberately not in the suffix vocabulary: no agy id
344
+ * has been observed with them, and a model genuinely named `…-minimal` would be
345
+ * misread.
346
+ */
347
+ exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN = /-(low|medium|high)$/i;
348
+ function deriveEffortFromModelId(modelId) {
349
+ if (!modelId)
350
+ return null;
351
+ const match = exports.ANTIGRAVITY_MODEL_ID_EFFORT_PATTERN.exec(modelId);
352
+ return match ? match[1].toLowerCase() : null;
353
+ }
354
+ /**
355
+ * Fold the hook-reported model together with the scraped frame (#1784).
356
+ *
357
+ * The precedence, and why:
358
+ *
359
+ * - **model — hooks win.** A hook payload is the agent naming itself; the
360
+ * screen is a render of that, abbreviated for display (agy prints `Gemini 3.7
361
+ * Flash` for `gemini-3.7-flash-high`). When they disagree the exact one is
362
+ * right. Capture only fills the hole: Claude after a server restart, and any
363
+ * session that predates this process.
364
+ * - **effort — the screen wins for codex/claude**, because it is the *only*
365
+ * source: no hook payload of any tool carries an effort field.
366
+ * - **effort — the id wins for antigravity**, because agy encodes the level in
367
+ * the id it reports on every event, and that beats a bar that is only on
368
+ * screen while the session lives.
369
+ *
370
+ * The derivation reads the *merged* model rather than the hook value alone:
371
+ * effort-in-the-id is a property of the id being published, and when no hook has
372
+ * spoken the merged value is the scraped display name, which carries no suffix
373
+ * and falls through to the scraped effort anyway. Same answer, one input.
374
+ *
375
+ * @param cliToolId - Which tool; only `antigravity` derives effort from the id
376
+ * @param hooksModel - {@link import('../../lib/session/agent-event-state').getLastKnownAgentModel}
377
+ * @param captured - {@link extractModelInfo}'s answer, latched by the caller
378
+ */
379
+ function mergeModelInfo(cliToolId, hooksModel, captured) {
380
+ const model = (hooksModel || null) ?? captured?.model ?? null;
381
+ const capturedEffort = captured?.effort ?? null;
382
+ const effort = cliToolId === 'antigravity' ? (deriveEffortFromModelId(model) ?? capturedEffort) : capturedEffort;
383
+ return { model, effort };
384
+ }
@@ -198,6 +198,10 @@ exports.antigravityAgentEventSource = (0, define_source_1.definePushHookSource)(
198
198
  // protojson camelCase, one tool out of six. `session_id` does not exist here.
199
199
  conversationIdFields: ['conversationId'],
200
200
  toolCallIdFields: [],
201
+ // Issue #1783. protojson camelCase again: `modelName`, not `model`. Present on
202
+ // all six captured fixtures, so agy is the one tool whose model survives every
203
+ // kind of event — including the ones that carry no session id at all.
204
+ modelFields: ['modelName'],
201
205
  // The tool name is nested under `toolCall`, and it is present on both
202
206
  // `PreToolUse` and `PostToolUse` payloads (checked against both fixtures).
203
207
  extractDetail: (event, payload) => event === 'pre_tool_use' || event === 'post_tool_use'
@@ -109,6 +109,13 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
109
109
  nativeEventNameFields: ['hook_event_name'],
110
110
  conversationIdFields: hook_event_vocabulary_1.SESSION_ID_FIELDS,
111
111
  toolCallIdFields: hook_event_vocabulary_1.TOOL_CALL_ID_FIELDS,
112
+ // Issue #1783. Claude sends it on `SessionStart` and nowhere else — checked
113
+ // against every fixture in `tests/fixtures/hooks/claude/`, where only
114
+ // `session-start.json` carries the key. So the value has to be *remembered*
115
+ // rather than read off the newest event; `getLastKnownAgentModel` is what
116
+ // does that. The value arrives with its own suffix (`claude-opus-5[1m]`) and
117
+ // is not parsed here: a display string the tool chose is the tool's to spell.
118
+ modelFields: ['model'],
112
119
  // S2.
113
120
  extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
114
121
  // S7. Both parsers are strict and answer null for anything they cannot vouch
@@ -107,6 +107,11 @@ exports.codexAgentEventSource = (0, define_source_1.definePushHookSource)({
107
107
  nativeEventNameFields: ['hook_event_name'],
108
108
  conversationIdFields: hook_event_vocabulary_1.SESSION_ID_FIELDS,
109
109
  toolCallIdFields: hook_event_vocabulary_1.TOOL_CALL_ID_FIELDS,
110
+ // Issue #1783. Same spelling as Claude, but on every event except `SessionEnd`
111
+ // rather than on `SessionStart` alone — verified against the fixtures, where
112
+ // only `session-end.json` lacks the key. codex therefore keeps its model
113
+ // visible through a restart of this server, which claude does not.
114
+ modelFields: ['model'],
110
115
  extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
111
116
  // The captured `PermissionRequest` payload is Claude-shaped field for field —
112
117
  // `hook_event_name`, `tool_name`, `tool_input`, `session_id`,
@@ -67,6 +67,8 @@ function definePushHookSource(spec) {
67
67
  detail: spec.extractDetail,
68
68
  conversationId: spec.conversationIdFields,
69
69
  toolCallId: spec.toolCallIdFields,
70
+ modelFields: spec.modelFields,
71
+ extractModel: spec.extractModel,
70
72
  });
71
73
  }
72
74
  const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
@@ -80,6 +82,8 @@ function definePushHookSource(spec) {
80
82
  detail: spec.extractDetail,
81
83
  conversationId: spec.conversationIdFields,
82
84
  toolCallId: spec.toolCallIdFields,
85
+ modelFields: spec.modelFields,
86
+ extractModel: spec.extractModel,
83
87
  });
84
88
  },
85
89
  parsePermissionRequest: spec.parsePermissionRequest,
@@ -136,6 +140,8 @@ function definePullEventSource(spec) {
136
140
  detail: spec.extractDetail,
137
141
  conversationId: spec.conversationIdFields,
138
142
  toolCallId: spec.toolCallIdFields,
143
+ modelFields: spec.modelFields,
144
+ extractModel: spec.extractModel,
139
145
  });
140
146
  }
141
147
  const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
@@ -147,6 +153,8 @@ function definePullEventSource(spec) {
147
153
  detail: spec.extractDetail,
148
154
  conversationId: spec.conversationIdFields,
149
155
  toolCallId: spec.toolCallIdFields,
156
+ modelFields: spec.modelFields,
157
+ extractModel: spec.extractModel,
150
158
  });
151
159
  },
152
160
  parsePermissionRequest: spec.parsePermissionRequest,
@@ -33,6 +33,7 @@ exports.resetUnknownEventTallies = resetUnknownEventTallies;
33
33
  exports.readStringField = readStringField;
34
34
  exports.readFirstStringField = readFirstStringField;
35
35
  exports.boundDetail = boundDetail;
36
+ exports.boundModel = boundModel;
36
37
  exports.isPlainObject = isPlainObject;
37
38
  exports.readNestedString = readNestedString;
38
39
  exports.buildNormalizedEvent = buildNormalizedEvent;
@@ -118,6 +119,20 @@ function boundDetail(value) {
118
119
  return null;
119
120
  return value.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH);
120
121
  }
122
+ /**
123
+ * Trim a model id to the length the store accepts (Issue #1783).
124
+ *
125
+ * The same bound as {@link boundDetail} and deliberately so: both are short
126
+ * enum-ish words the agent chose, both end up rendered, and giving the model its
127
+ * own number would only invite the two to drift. Named separately because the
128
+ * call sites read better and because a future measurement could move one
129
+ * without moving the other.
130
+ */
131
+ function boundModel(value) {
132
+ if (value === null || value === '')
133
+ return null;
134
+ return value.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH);
135
+ }
121
136
  /** Type guard for a JSON object (not an array, not null). */
122
137
  function isPlainObject(value) {
123
138
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -151,6 +166,11 @@ function buildNormalizedEvent(mapping, payload, receivedAt, fallbacks = {}) {
151
166
  (fallbacks.conversationId ? readFirstStringField(payload, fallbacks.conversationId) : null),
152
167
  toolCallId: mapping.toolCallId ??
153
168
  (fallbacks.toolCallId ? readFirstStringField(payload, fallbacks.toolCallId) : null),
169
+ // Issue #1783. Every source runs through here, so a tool that declares
170
+ // neither hook simply answers null — which is the honest answer for gemini
171
+ // and copilot, whose payloads never carry one.
172
+ model: boundModel(fallbacks.extractModel?.(payload) ??
173
+ (fallbacks.modelFields ? readFirstStringField(payload, fallbacks.modelFields) : null)),
154
174
  raw: payload,
155
175
  receivedAt,
156
176
  };
@@ -230,6 +230,12 @@ async function ingestOpencodeEvent(target, event) {
230
230
  detail: event.detail?.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH) ?? null,
231
231
  sessionId: event.conversationId,
232
232
  message: describeNotification(event)?.slice(0, structured_prompt_1.MAX_STRUCTURED_PROMPT_MESSAGE_LENGTH) ?? null,
233
+ // Issue #1783. The second of the two receiving paths — this one is
234
+ // in-process rather than an HTTP route, and forgetting it would leave
235
+ // opencode as the one tool whose model is extracted and then dropped.
236
+ // Already bounded by the normaliser; null on the frames that carry no
237
+ // `properties.info.model` (every `session.idle`, every tool part).
238
+ model: event.model,
233
239
  });
234
240
  if (event.event === 'notification' && event.detail === mappers_1.OPENCODE_PERMISSION_DETAIL) {
235
241
  await adjudicatePermission(target, event, instanceId);
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.OPENCODE_MAPPERS = exports.OPENCODE_ERROR_DETAIL = exports.OPENCODE_QUESTION_DETAIL = exports.OPENCODE_PERMISSION_DETAIL = void 0;
37
37
  exports.frameProperties = frameProperties;
38
38
  exports.frameSessionId = frameSessionId;
39
+ exports.frameModel = frameModel;
39
40
  exports.partToolName = partToolName;
40
41
  exports.partCallId = partCallId;
41
42
  exports.withConversationId = withConversationId;
@@ -69,6 +70,27 @@ function frameProperties(payload) {
69
70
  function frameSessionId(payload) {
70
71
  return (0, event_mapper_1.readNestedString)(frameProperties(payload), ['sessionID']);
71
72
  }
73
+ /**
74
+ * `properties.info.model` — the model this frame's session/message ran on (#1783).
75
+ *
76
+ * Two spellings, both live, and the Issue text only named the first: a
77
+ * `message.updated` frame carries `{ providerID, modelID }` while
78
+ * `session.created` / `session.deleted` carry `{ id, providerID }`. Checked
79
+ * against the captured fixtures, which is the only specification that has been
80
+ * right about this server so far (its own `/doc` omits `server.heartbeat`).
81
+ * Reading `modelID` alone would have left `session_start` — the one event a
82
+ * fresh subscription is guaranteed to see — with no model at all.
83
+ *
84
+ * `providerID` is deliberately not folded in. `github-copilot/claude-sonnet-4.6`
85
+ * would be a *composed* string, and every other tool reports the bare model, so
86
+ * composing here would make opencode the odd one out in the UI for no gain.
87
+ */
88
+ function frameModel(payload) {
89
+ const info = frameProperties(payload).info;
90
+ if (!(0, event_mapper_1.isPlainObject)(info))
91
+ return null;
92
+ return (0, event_mapper_1.readNestedString)(info, ['model', 'modelID']) ?? (0, event_mapper_1.readNestedString)(info, ['model', 'id']);
93
+ }
72
94
  /** `properties.part.state.status` — `pending` / `running` / `completed` / `error`. */
73
95
  function partStatus(payload) {
74
96
  return (0, event_mapper_1.readNestedString)(frameProperties(payload), ['part', 'state', 'status']);
@@ -238,6 +238,9 @@ exports.opencodeAgentEventSource = (0, define_source_1.definePullEventSource)({
238
238
  nativeEventNameFields: ['type'],
239
239
  // Flat lookup cannot reach `properties.sessionID`; the rules fill it in.
240
240
  conversationIdFields: [],
241
+ // Issue #1783: nor `properties.info.model.*`, so the spec takes the reader
242
+ // instead of a key list. See {@link frameModel} for the two spellings.
243
+ extractModel: mappers_1.frameModel,
241
244
  parsePermissionRequest: payloads_1.parseOpencodePermissionRequest,
242
245
  parseQuestion: payloads_1.parseOpencodeQuestion,
243
246
  // Self-reference resolves at call time, which is after this const is bound.
@@ -28,7 +28,20 @@ const prompt_dedup_1 = require("./prompt-dedup");
28
28
  const response_dedup_1 = require("./response-dedup");
29
29
  const response_poller_core_1 = require("./response-poller-core");
30
30
  const push_1 = require("../../lib/push");
31
+ // Issue #1790: imported by deep path, not through `@/lib/push`. Suites that
32
+ // replace the barrel to count notifications (e.g. the #1547 escalation test)
33
+ // would otherwise get `undefined` here and take down module evaluation.
34
+ const waiting_push_notifier_1 = require("../../lib/push/waiting-push-notifier");
35
+ const waiting_episode_state_1 = require("../../lib/session/waiting-episode-state");
31
36
  const task_transition_service_1 = require("../../lib/tasks/task-transition-service");
37
+ // Issue #1790: arm the waiting-edge push subscription.
38
+ //
39
+ // It has to exist before the first edge, and `server.ts` reaches this module at
40
+ // boot (it imports `polling/response-poller` for `stopAllPolling`, which pulls
41
+ // in `response-poller-core` and then this file), so this is the earliest hook
42
+ // the notification path owns. Idempotent by replacement, and it starts no timer
43
+ // and touches no database until a wait actually opens.
44
+ (0, waiting_push_notifier_1.startWaitingPushNotifier)();
32
45
  /**
33
46
  * Creates an incomplete extraction result with empty response.
34
47
  * Centralizes the repeated pattern of returning an in-progress/incomplete state.
@@ -465,13 +478,39 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
465
478
  });
466
479
  // Web Push fan-out (Issue #1125): agent is now waiting for a prompt reply.
467
480
  // Fire-and-forget — push is advisory and must never block/break the poller.
481
+ //
482
+ // Issue #1790: the wait is now named by #1786's episode rather than by the
483
+ // prompt text. The two lines below are ordered, not incidental:
484
+ //
485
+ // 1. the notification is raised first, while it still has the prompt's
486
+ // own question to quote — it records the episode in the dedup, so
487
+ // whichever path reports the wait second says nothing;
488
+ // 2. `observeWaitingEdge` then opens that same episode, which is what
489
+ // lets the edge listener (and #1788's WebSocket frame) agree with this
490
+ // call about *which* wait this is instead of raising a second one.
491
+ //
492
+ // Both use one timestamp so the episode the notification claims and the
493
+ // episode the store opens are the same number.
494
+ const promptObservedAt = Date.now();
495
+ const promptWaitingSince = (0, waiting_episode_state_1.getWaitingEpisode)(worktreeId, cliToolId, instanceId)?.since ?? promptObservedAt;
468
496
  void (0, push_1.notifyPushSubscribers)({
469
497
  worktreeId,
470
498
  worktreeName: worktree.name,
471
499
  kind: 'prompt',
472
500
  agentName: resolvedInstanceId,
501
+ instanceId: resolvedInstanceId,
502
+ waitingKind: 'prompt',
503
+ waitingSince: promptWaitingSince,
473
504
  excerpt: promptDetection.promptData?.question ?? promptSaveContent,
474
505
  }).catch(() => { });
506
+ (0, waiting_episode_state_1.observeWaitingEdge)({
507
+ worktreeId,
508
+ cliToolId,
509
+ instanceId,
510
+ waiting: true,
511
+ kind: 'prompt',
512
+ now: promptObservedAt,
513
+ });
475
514
  if (!isFullScreenTui) {
476
515
  (0, response_poller_core_1.stopPolling)(worktreeId, cliToolId, instanceId);
477
516
  }
@@ -562,6 +601,14 @@ async function checkForResponse(worktreeId, cliToolId, instanceId) {
562
601
  });
563
602
  // Broadcast message to WebSocket clients
564
603
  (0, ws_server_1.broadcastMessage)('message', { worktreeId, message });
604
+ // Issue #1790: the agent has just produced a reply, so whatever it was
605
+ // waiting for is over. Closing the episode here is what makes a *second*
606
+ // prompt in the same session notify again: without it a wait opened by the
607
+ // prompt branch above could stay open until a browser next probes the status
608
+ // API, and every later prompt would be folded into that stale episode and
609
+ // silently deduped. Nothing to close is a no-op, and no notification is
610
+ // raised for a closing edge.
611
+ (0, waiting_episode_state_1.observeWaitingEdge)({ worktreeId, cliToolId, instanceId, waiting: false });
565
612
  // Web Push fan-out (Issue #1125): session completed (running → idle).
566
613
  // Fire-and-forget — push is advisory and must never block/break the poller.
567
614
  void (0, push_1.notifyPushSubscribers)({