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
@@ -43,7 +43,14 @@ exports.STRUCTURED_PROMPT_PROVISIONAL_MAX_AGE_MS = exports.STRUCTURED_STATE_MAX_
43
43
  exports.recordAgentStopEvent = recordAgentStopEvent;
44
44
  exports.getLastStopEventAt = getLastStopEventAt;
45
45
  exports.recordAgentEvent = recordAgentEvent;
46
+ exports.getAwaitingInstruction = getAwaitingInstruction;
47
+ exports.isAwaitingInstruction = isAwaitingInstruction;
46
48
  exports.getLastAgentEvent = getLastAgentEvent;
49
+ exports.getLastKnownAgentModel = getLastKnownAgentModel;
50
+ exports.recordCapturedModelInfo = recordCapturedModelInfo;
51
+ exports.getLastCapturedModelInfo = getLastCapturedModelInfo;
52
+ exports.getResolvedAgentModelInfo = getResolvedAgentModelInfo;
53
+ exports.getLastKnownAgentEffort = getLastKnownAgentEffort;
47
54
  exports.beginAgentEventGeneration = beginAgentEventGeneration;
48
55
  exports.getAgentEventGenerationStartedAt = getAgentEventGenerationStartedAt;
49
56
  exports.discardAgentEventState = discardAgentEventState;
@@ -60,7 +67,10 @@ exports.isDuplicateAgentEvent = isDuplicateAgentEvent;
60
67
  exports.getRecentEventKeyCount = getRecentEventKeyCount;
61
68
  exports.clearAgentStopEvents = clearAgentStopEvents;
62
69
  const auto_yes_state_1 = require("../../lib/auto-yes-state");
70
+ const agent_event_types_1 = require("../../lib/hooks/agent-event-types");
63
71
  const permission_request_payload_1 = require("../../lib/hooks/permission-request-payload");
72
+ // Issue #1784: the terminal-frame half of "which model / effort is this on".
73
+ const model_info_extractor_1 = require("../../lib/detection/model-info-extractor");
64
74
  const status_mapping_1 = require("../../lib/session/status-mapping");
65
75
  const structured_prompt_1 = require("../../lib/session/structured-prompt");
66
76
  /** compositeKey -> epoch ms of the most recent stop event. */
@@ -81,6 +91,46 @@ const askUserQuestion = globalThis.__agentEventAskUserQuestion ??
81
91
  /** dedup key -> epoch ms it was first seen. See {@link isDuplicateAgentEvent}. */
82
92
  const recentEventKeys = globalThis.__agentEventRecentKeys ??
83
93
  (globalThis.__agentEventRecentKeys = new Map());
94
+ /** compositeKey -> the agent's own "I am waiting for instructions" (#1786). */
95
+ const awaitingInstruction = globalThis.__agentEventAwaitingInstruction ??
96
+ (globalThis.__agentEventAwaitingInstruction = new Map());
97
+ /**
98
+ * compositeKey -> the last non-null model this instance reported (Issue #1783).
99
+ *
100
+ * A *separate* map, not a field read off {@link lastAgentEvent}, and that is the
101
+ * whole point of it. `lastAgentEvent` is replaced wholesale on every delivery,
102
+ * and Claude puts the model on `SessionStart` and on nothing else — so the very
103
+ * next `UserPromptSubmit` would overwrite the only record that ever knew it, and
104
+ * the UI would show the model for the fraction of a second between session start
105
+ * and the first prompt. Keeping the last *non-null* sighting separately is what
106
+ * makes "which model is this session on" answerable at all for that tool.
107
+ *
108
+ * Never written with null: absent means "nothing has ever said", which is the
109
+ * honest state for gemini, copilot, and any session that predates this server
110
+ * process. See {@link getLastKnownAgentModel}.
111
+ */
112
+ const lastAgentModel = globalThis.__agentEventLastModel ??
113
+ (globalThis.__agentEventLastModel = new Map());
114
+ /**
115
+ * compositeKey -> what the terminal frame last showed for this instance (#1784).
116
+ *
117
+ * The second source, and a strictly different kind of fact from
118
+ * {@link lastAgentModel}: that one is the agent naming itself over the hook
119
+ * channel, this one is the TUI's own chrome read back off the screen. It is
120
+ * kept apart rather than folded into the first map because the two have a
121
+ * precedence between them ({@link getResolvedAgentModelInfo}) — merging on write
122
+ * would let a scraped display name ("Gemini 3.7 Flash") overwrite the exact id
123
+ * the agent reported, with nothing left to recover it from.
124
+ *
125
+ * Latched the same way and for a sharper reason: Claude prints its model in the
126
+ * startup banner and nowhere else, and tmux keeps 2000 lines of history, so on
127
+ * any session that has been talking for a while the banner is simply gone. The
128
+ * screen going quiet is not the model changing, so the last non-null sighting
129
+ * stands until the process it described does not (see
130
+ * {@link beginAgentEventGeneration} / {@link discardAgentEventState}).
131
+ */
132
+ const capturedModelInfo = globalThis.__agentCapturedModelInfo ??
133
+ (globalThis.__agentCapturedModelInfo = new Map());
84
134
  /**
85
135
  * How long two identical events count as one delivery.
86
136
  *
@@ -124,6 +174,12 @@ function getLastStopEventAt(worktreeId, cliToolId, instanceId) {
124
174
  function recordAgentEvent(worktreeId, cliToolId, instanceId, record) {
125
175
  const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
126
176
  lastAgentEvent.set(key, record);
177
+ // Issue #1783: latch, never clear. An event without a model is the ordinary
178
+ // case (Claude sends one on `SessionStart` alone), and reading it as "the
179
+ // model is now unknown" would blank the display on the very next event.
180
+ if (typeof record.model === 'string' && record.model !== '') {
181
+ lastAgentModel.set(key, record.model.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH));
182
+ }
127
183
  applyAskUserQuestionTransition(key, record);
128
184
  if (record.event === 'session_start') {
129
185
  // The agent restarting inside a pane CommandMate never touched — `claude`
@@ -134,6 +190,92 @@ function recordAgentEvent(worktreeId, cliToolId, instanceId, record) {
134
190
  generationStartedAt.set(key, record.at);
135
191
  }
136
192
  applyPromptWaitingTransition(key, record);
193
+ applyAwaitingInstructionTransition(key, record);
194
+ }
195
+ /**
196
+ * The third state: "this turn is over and nobody has told me what to do next"
197
+ * (Issue #1786).
198
+ *
199
+ * | event | effect on awaiting_instruction |
200
+ * |-----------------------------------|--------------------------------|
201
+ * | `notification(idle_prompt)` | **set** |
202
+ * | `user_prompt_submit` | release |
203
+ * | `session_start` / `session_end` | release |
204
+ * | everything else | unchanged |
205
+ *
206
+ * It is a boolean beside the status rather than a fifth `SessionStatus`, because
207
+ * `idle_prompt` already maps to `ready` (`agentEventToSessionStatus`) and
208
+ * `ready` means "you can send a message" everywhere in this codebase — the
209
+ * sidebar, `deriveCliStatus`, `getNextAction`, `commandmate wait`. Widening that
210
+ * vocabulary to carry "and it is *asking* you to" would have every consumer of
211
+ * the four values re-decide what they mean; the boolean asks nothing of anyone
212
+ * who does not want it.
213
+ *
214
+ * `stop` deliberately does NOT set it. `Stop` fires when the turn ends, which is
215
+ * most of the time the agent has simply finished a step of its own plan;
216
+ * `Notification(idle_prompt)` is Claude's separate, later "waiting for your
217
+ * input" signal, and using the turn boundary instead would mark every
218
+ * intermediate stop as a request for instructions.
219
+ *
220
+ * `pre_tool_use` / `post_tool_use` / `notification(permission_prompt)` leave it
221
+ * alone, and that is not a gap: a tool call or a dialog can only happen inside a
222
+ * turn, and the turn's own `user_prompt_submit` has already released it. Adding
223
+ * them would only paper over a `UserPromptSubmit` that never arrived — and an
224
+ * operator whose `UserPromptSubmit` hook is missing has no `Notification` hook
225
+ * either, so there would be nothing to release.
226
+ *
227
+ * There is deliberately no age bound here, unlike every other state in this
228
+ * module. Those bound the damage of an event that may never arrive (a lost
229
+ * `Stop`, a dialog answered with no event to say so). This one is released by
230
+ * events that cannot be missed while the fact is still true: typing into the
231
+ * composer — from the app or straight into the tmux pane — raises
232
+ * `UserPromptSubmit`, and ending the session raises `SessionEnd`. An agent that
233
+ * has been idle for six hours genuinely is still awaiting instructions, and
234
+ * expiring the flag would erase the notification #1790 exists to send. The
235
+ * generation fence in {@link isAwaitingInstruction} still applies, so the flag
236
+ * never survives the process that reported it.
237
+ */
238
+ function applyAwaitingInstructionTransition(key, record) {
239
+ switch (record.event) {
240
+ case 'notification':
241
+ if (record.detail === 'idle_prompt') {
242
+ awaitingInstruction.set(key, { at: record.at, message: record.message ?? null });
243
+ }
244
+ return;
245
+ case 'user_prompt_submit':
246
+ case 'session_start':
247
+ case 'session_end':
248
+ awaitingInstruction.delete(key);
249
+ return;
250
+ case 'stop':
251
+ case 'pre_tool_use':
252
+ case 'post_tool_use':
253
+ return;
254
+ default:
255
+ // exhaustive check: a new AgentEventType must decide its transition here
256
+ record.event;
257
+ return;
258
+ }
259
+ }
260
+ /**
261
+ * The agent's own "waiting for your input", or null (Issue #1786).
262
+ *
263
+ * Fenced by generation like the rest of this module: an `idle_prompt` from the
264
+ * Claude process that used to live in this pane is not this one's.
265
+ */
266
+ function getAwaitingInstruction(worktreeId, cliToolId, instanceId) {
267
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
268
+ const record = awaitingInstruction.get(key);
269
+ if (!record)
270
+ return null;
271
+ const generation = generationStartedAt.get(key);
272
+ if (generation !== undefined && record.at < generation)
273
+ return null;
274
+ return record;
275
+ }
276
+ /** {@link getAwaitingInstruction} as the boolean the list API publishes. */
277
+ function isAwaitingInstruction(worktreeId, cliToolId, instanceId) {
278
+ return getAwaitingInstruction(worktreeId, cliToolId, instanceId) !== null;
137
279
  }
138
280
  /**
139
281
  * The `prompt_waiting` half of the state machine, driven by the same events
@@ -221,6 +363,97 @@ function applyPromptWaitingTransition(key, record) {
221
363
  function getLastAgentEvent(worktreeId, cliToolId, instanceId) {
222
364
  return lastAgentEvent.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
223
365
  }
366
+ /**
367
+ * The last model this instance reported running, or null (Issue #1783).
368
+ *
369
+ * "Last **non-null**", which is the only useful reading: three of the four tools
370
+ * that publish a model publish it on some events and not others, and Claude
371
+ * publishes it on exactly one. Reading `getLastAgentEvent()?.model` would
372
+ * therefore answer null for almost every moment of almost every session.
373
+ *
374
+ * Deliberately **not** bounded by {@link STRUCTURED_STATE_MAX_AGE_MS}, unlike
375
+ * every other reader in this module. That bound exists because a *status* that
376
+ * nothing has refreshed is a claim about right now that may have expired — a
377
+ * lost `Stop` leaving the layer asserting `running` forever. A model is not that
378
+ * kind of claim: an eight-hour turn is on the same model at the end as at the
379
+ * start, and expiring it would blank the display on precisely the long-running
380
+ * sessions this is most useful for. What *is* honoured is identity: a new
381
+ * generation or a discarded session drops the value, because the process that
382
+ * reported it is gone. See {@link beginAgentEventGeneration} /
383
+ * {@link discardAgentEventState}.
384
+ *
385
+ * In-memory only — nothing is written to `session_states`. After a server
386
+ * restart codex and antigravity repopulate on their next event; Claude stays
387
+ * null until its next `SessionStart`, a gap Phase 2 (#1784) closes from the
388
+ * terminal frame.
389
+ */
390
+ function getLastKnownAgentModel(worktreeId, cliToolId, instanceId) {
391
+ return lastAgentModel.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
392
+ }
393
+ /**
394
+ * Latch what a terminal capture showed for this instance (Issue #1784).
395
+ *
396
+ * Called from the status-detection poll with the text that poll already
397
+ * captured — no `capture-pane` is issued for this, so the feature costs nothing
398
+ * in tmux round-trips.
399
+ *
400
+ * **Each half latches independently.** A Codex footer carries a model on every
401
+ * frame but an effort only on some formats; a Claude banner carries both and
402
+ * then scrolls away entirely. Writing `{model, effort}` wholesale would let the
403
+ * frame that stopped showing one of them blank a value the other frame proved.
404
+ * Nothing is ever written as null: absent means "no frame has ever shown this",
405
+ * which is the honest state for gemini/copilot and for any session whose chrome
406
+ * this module has no rule for.
407
+ *
408
+ * @param info - {@link import('../../lib/detection/model-info-extractor').extractModelInfo}'s answer
409
+ */
410
+ function recordCapturedModelInfo(worktreeId, cliToolId, instanceId, info) {
411
+ if (!info.model && !info.effort)
412
+ return;
413
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
414
+ const previous = capturedModelInfo.get(key);
415
+ capturedModelInfo.set(key, {
416
+ model: info.model ? info.model.slice(0, agent_event_types_1.MAX_EVENT_DETAIL_LENGTH) : (previous?.model ?? null),
417
+ effort: info.effort ?? previous?.effort ?? null,
418
+ });
419
+ }
420
+ /**
421
+ * The last model/effort a terminal capture showed, both halves possibly null.
422
+ *
423
+ * The raw scraped value, before precedence is applied — {@link
424
+ * getResolvedAgentModelInfo} is what callers publishing to the UI or the API
425
+ * want. Exported for the tests and for anything that needs to tell "the screen
426
+ * said" apart from "the agent said".
427
+ */
428
+ function getLastCapturedModelInfo(worktreeId, cliToolId, instanceId) {
429
+ const record = capturedModelInfo.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
430
+ return { model: record?.model ?? null, effort: record?.effort ?? null };
431
+ }
432
+ /**
433
+ * The model and reasoning effort to publish for this instance (Issue #1784).
434
+ *
435
+ * The single answer both surfaces should read: it folds the hook channel
436
+ * (#1783) together with the screen under the precedence documented on
437
+ * {@link mergeModelInfo} — hooks win for the model, the screen is the only
438
+ * source of effort for codex/claude, and antigravity's effort is derived from
439
+ * the id it reports rather than from its (renderer-truncated) status bar.
440
+ *
441
+ * Both halves may be null, and routinely are: no tool publishes an effort over
442
+ * hooks, and most tools publish neither. Callers omit the key rather than
443
+ * emitting null — see `CliToolSessionStatus`.
444
+ */
445
+ function getResolvedAgentModelInfo(worktreeId, cliToolId, instanceId) {
446
+ return (0, model_info_extractor_1.mergeModelInfo)(cliToolId, getLastKnownAgentModel(worktreeId, cliToolId, instanceId), getLastCapturedModelInfo(worktreeId, cliToolId, instanceId));
447
+ }
448
+ /**
449
+ * The reasoning effort this instance is running at, or null (Issue #1784).
450
+ *
451
+ * Convenience reader over {@link getResolvedAgentModelInfo} for callers that
452
+ * want only the effort — `capture --json` and `instances` (#1785) among them.
453
+ */
454
+ function getLastKnownAgentEffort(worktreeId, cliToolId, instanceId) {
455
+ return getResolvedAgentModelInfo(worktreeId, cliToolId, instanceId).effort;
456
+ }
224
457
  /**
225
458
  * How long a structured verdict is trusted after the event that produced it
226
459
  * (Issue #1723).
@@ -266,6 +499,21 @@ function beginAgentEventGeneration(worktreeId, cliToolId, instanceId, at = Date.
266
499
  promptWaiting.delete(key);
267
500
  // Same reasoning for the question that dialog was asking (Issue #1726).
268
501
  askUserQuestion.delete(key);
502
+ // And for "waiting for your input" (Issue #1786): a new process has not asked
503
+ // for anything yet.
504
+ awaitingInstruction.delete(key);
505
+ // And for the model (Issue #1783): a new generation is a new agent process,
506
+ // which may have been launched on a different model entirely. Latching across
507
+ // one would show the *previous* process's model with nothing to correct it —
508
+ // Claude only re-reports on `SessionStart`, which lands moments later anyway.
509
+ // A `/clear` is deliberately not affected: it reaches `recordAgentEvent` as
510
+ // `session_end` + `session_start`, never this function.
511
+ lastAgentModel.delete(key);
512
+ // Issue #1784: same argument for what the screen showed. The latch exists to
513
+ // survive the banner scrolling away *within* one process; carrying it across
514
+ // a relaunch would show the old process's effort with no frame left that
515
+ // could contradict it. The next poll re-reads a live footer immediately.
516
+ capturedModelInfo.delete(key);
269
517
  }
270
518
  /**
271
519
  * @returns Epoch ms the current generation began, or null when no generation
@@ -290,6 +538,11 @@ function discardAgentEventState(worktreeId, cliToolId, instanceId) {
290
538
  generationStartedAt.delete(key);
291
539
  promptWaiting.delete(key);
292
540
  askUserQuestion.delete(key);
541
+ awaitingInstruction.delete(key);
542
+ // Issue #1783: the session that was on this model no longer exists.
543
+ lastAgentModel.delete(key);
544
+ // Issue #1784: nor does the pane its footer was read from.
545
+ capturedModelInfo.delete(key);
293
546
  }
294
547
  /**
295
548
  * The status this instance's structured events imply, or null when they imply
@@ -644,4 +897,11 @@ function clearAgentStopEvents() {
644
897
  generationStartedAt.clear();
645
898
  promptWaiting.clear();
646
899
  askUserQuestion.clear();
900
+ awaitingInstruction.clear();
901
+ // Issue #1783. CI runs with `fileParallelism: false`, so every suite in the
902
+ // repo shares this process — a model latched by one test would otherwise be
903
+ // read by another, in file order, and only in CI.
904
+ lastAgentModel.clear();
905
+ // Issue #1784: and the same for the scraped half.
906
+ capturedModelInfo.clear();
647
907
  }
@@ -292,6 +292,14 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
292
292
  sessionStatusReason: 'session_not_running',
293
293
  lastStopEventAt: stopEventAt,
294
294
  structuredEvents,
295
+ // Issue #1785: null on a dead session, not the last model it ran. The
296
+ // latch outlives the process that filled it (by design — see
297
+ // getLastKnownAgentModel), so reporting it here would tell `commandmate
298
+ // instances` that a `RUNNING no` row is on gpt-5.6. The same holds for
299
+ // the effort, whose scraped half never expires either: dropping both is
300
+ // the server's job, done here and in exactly one place.
301
+ model: null,
302
+ reasoningEffort: null,
295
303
  };
296
304
  }
297
305
  const sessionState = (0, db_1.getSessionState)(db, worktreeId, resolvedInstanceId);
@@ -448,6 +456,18 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
448
456
  }
449
457
  const realtimeSnippet = lines.slice(-100).join('\n');
450
458
  const autoYesState = (0, auto_yes_manager_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
459
+ // Issue #1785 + #1784: ONE resolution for both halves, not two readers.
460
+ //
461
+ // `getResolvedAgentModelInfo` is the reader #1784 documents as "the single
462
+ // answer both surfaces should read", and it is already what the list API
463
+ // publishes (`worktree-status-helper`). Reading the model off the hook latch
464
+ // here while taking the effort from the resolver would let this payload
465
+ // publish an effort with no model — the exact shape `buildModelByInstance`
466
+ // calls "unreachable through the API" — on a claude session whose banner the
467
+ // poller scraped before its first `SessionStart` hook arrived. It also folds
468
+ // in antigravity's rule that the effort comes from the model id, which a bare
469
+ // read of the scraped half would drop.
470
+ const { model, effort } = (0, agent_event_state_1.getResolvedAgentModelInfo)(worktreeId, cliToolId, instanceId);
451
471
  return {
452
472
  isRunning: true,
453
473
  cliToolId,
@@ -477,5 +497,9 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
477
497
  serverPollerActive: (0, auto_yes_manager_1.isPollerActive)(compositeKey),
478
498
  lastStopEventAt: stopEventAt,
479
499
  structuredEvents,
500
+ // Issue #1785: straight from the retention layer, unparsed. See the field
501
+ // docs on CurrentOutputPayload for why nothing is normalised on the way out.
502
+ model,
503
+ reasoningEffort: effort,
480
504
  };
481
505
  }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ /**
3
+ * Next Action Helper - Derived state for worktree next actions and review status.
4
+ *
5
+ * Issue #600: UX refresh - provides getNextAction() and getReviewStatus()
6
+ * for Review screen and WorktreeCard display.
7
+ *
8
+ * Uses exhaustive check (satisfies never) pattern to catch future
9
+ * SessionStatus extensions at compile time [DR2-005].
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.NEXT_ACTION_KEYS = void 0;
13
+ exports.isNextActionKey = isNextActionKey;
14
+ exports.getNextAction = getNextAction;
15
+ exports.getReviewStatus = getReviewStatus;
16
+ /**
17
+ * Dictionary keys returned by {@link getNextAction} (Issue #1787).
18
+ *
19
+ * These are keys in the `worktree` namespace (`locales/{en,ja}/worktree.json`),
20
+ * NOT display strings: the function runs on the server (`/api/worktrees`) and in
21
+ * module scope, where `t()` cannot be called, so pinning English here would ship
22
+ * "Approve / Reject" to a Japanese UI — the same problem #1271/#1273 fixed for
23
+ * StatusDot's labels. Rendering surfaces resolve them with
24
+ * `useTranslations('worktree')`.
25
+ */
26
+ exports.NEXT_ACTION_KEYS = {
27
+ start: 'nextAction.start',
28
+ sendMessage: 'nextAction.sendMessage',
29
+ approveReject: 'nextAction.approveReject',
30
+ replyToPrompt: 'nextAction.replyToPrompt',
31
+ checkStalled: 'nextAction.checkStalled',
32
+ running: 'nextAction.running',
33
+ };
34
+ const NEXT_ACTION_KEY_SET = new Set(Object.values(exports.NEXT_ACTION_KEYS));
35
+ /**
36
+ * Whether a value is a key this module produces (Issue #1787).
37
+ *
38
+ * `Worktree.nextAction` is a plain `string` on the wire, and a server that
39
+ * predates this Issue still sends the old English literal. Callers must gate
40
+ * `t()` on this: next-intl reports a missing key by rendering the key path, so
41
+ * feeding it `"Approve / Reject"` would put `worktree.Approve / Reject` on
42
+ * screen. Anything that fails this test is rendered verbatim instead.
43
+ */
44
+ function isNextActionKey(value) {
45
+ return NEXT_ACTION_KEY_SET.has(value);
46
+ }
47
+ /**
48
+ * Determine the next action for a given session state.
49
+ *
50
+ * @param status - Current session status (idle/ready/running/waiting) or null
51
+ * @param promptType - Type of active prompt, if any
52
+ * @param isStalled - Whether the session is considered stalled
53
+ * @returns A dictionary key from {@link NEXT_ACTION_KEYS} (Issue #1787 — this
54
+ * used to be a hard-coded English string)
55
+ */
56
+ function getNextAction(status, promptType, isStalled) {
57
+ if (!status)
58
+ return exports.NEXT_ACTION_KEYS.start;
59
+ if (status === 'idle')
60
+ return exports.NEXT_ACTION_KEYS.start;
61
+ if (status === 'ready')
62
+ return exports.NEXT_ACTION_KEYS.sendMessage;
63
+ if (status === 'waiting' && promptType === 'approval')
64
+ return exports.NEXT_ACTION_KEYS.approveReject;
65
+ if (status === 'waiting')
66
+ return exports.NEXT_ACTION_KEYS.replyToPrompt;
67
+ if (status === 'running' && isStalled)
68
+ return exports.NEXT_ACTION_KEYS.checkStalled;
69
+ if (status === 'running')
70
+ return exports.NEXT_ACTION_KEYS.running;
71
+ // exhaustive check: SessionStatus extensions will cause compile error [DR2-005]
72
+ const _exhaustive = status;
73
+ void _exhaustive;
74
+ return exports.NEXT_ACTION_KEYS.running;
75
+ }
76
+ /**
77
+ * Determine the review status for a worktree.
78
+ *
79
+ * @param worktreeStatus - Worktree's status field (ready/in_progress/in_review/done/null)
80
+ * @param sessionStatus - Current session status or null
81
+ * @param promptType - Type of active prompt, if any
82
+ * @param isStalled - Whether the session is considered stalled
83
+ * @returns ReviewStatus if applicable, null otherwise
84
+ */
85
+ function getReviewStatus(worktreeStatus, sessionStatus, promptType, isStalled) {
86
+ if (worktreeStatus === 'in_review')
87
+ return 'done';
88
+ if (sessionStatus === 'waiting' && promptType === 'approval')
89
+ return 'approval';
90
+ if (sessionStatus === 'running' && isStalled)
91
+ return 'stalled';
92
+ return null;
93
+ }
@@ -35,6 +35,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.STRUCTURED_SEND_GUARD_ENV = exports.STRUCTURED_SEND_BLOCK_MAX_AGE_MS = void 0;
36
36
  exports.structuredWaitingReason = structuredWaitingReason;
37
37
  exports.resolvePromptWaiting = resolvePromptWaiting;
38
+ exports.peekPromptWaiting = peekPromptWaiting;
38
39
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
39
40
  const status_mapping_1 = require("../../lib/session/status-mapping");
40
41
  /**
@@ -160,6 +161,43 @@ function resolvePromptWaiting({ worktreeId, cliToolId, instanceId, scraper, igno
160
161
  structuredSendBlockSuppressed: suppressed,
161
162
  };
162
163
  }
164
+ /**
165
+ * The OR rule without the release rule: read both layers, change neither
166
+ * (Issue #1786).
167
+ *
168
+ * Added for the list API (`/api/worktrees`), which had been publishing the
169
+ * scraper's verdict alone and therefore showed no dot at all for a dialog only
170
+ * the agent's events could see. It needs the composed answer; what it must not
171
+ * have is {@link resolvePromptWaiting}'s side effects, for three reasons:
172
+ *
173
+ * - **it is not the same evidence.** The list path detects on
174
+ * `STATUS_DETECTION_CAPTURE_LINES`, a deliberately smaller window than the
175
+ * detail path's, so its "no prompt here" is a weaker statement than the one
176
+ * the release rule was written for. Letting it clear a corroborated episode
177
+ * would retire a record on evidence #1725 never intended.
178
+ * - **`blocksSend` reads the same record.** A list poll that wrongly cleared it
179
+ * would silently disarm the `send` guard — the #1708 hazard, restored by a
180
+ * read endpoint. The Issue's own instruction is that `blocksSend` must not
181
+ * change, and the cheapest way to guarantee that is to write nothing.
182
+ * - **it is polled by every open tab, for every worktree.** A state machine
183
+ * whose outcome depends on how many browsers are watching is not one anybody
184
+ * can reason about later.
185
+ *
186
+ * What the list path gives up is arming corroboration. It costs nothing that was
187
+ * ever there: the arming callers (`current-output-builder`, the `send` guard)
188
+ * are unchanged, and the structured record's own releases — `Stop`,
189
+ * `user_prompt_submit`, `post_tool_use`, `Notification(idle_prompt)`, a
190
+ * generation change — are what retire it in the ordinary case, with
191
+ * {@link agent-event-state!STRUCTURED_STATE_MAX_AGE_MS} as the backstop.
192
+ */
193
+ function peekPromptWaiting({ worktreeId, cliToolId, instanceId, scraper, now = Date.now(), }) {
194
+ const structured = (0, agent_event_state_1.getStructuredPromptWaiting)(worktreeId, cliToolId, instanceId, now);
195
+ return {
196
+ waiting: scraper.hasActivePrompt || structured !== null,
197
+ scraperWaiting: scraper.hasActivePrompt,
198
+ structured,
199
+ };
200
+ }
163
201
  /**
164
202
  * Why this structured record may not refuse a send, or null when it may.
165
203
  *
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+ /**
3
+ * When each agent instance started waiting, and the one place that edge is
4
+ * observed (Issue #1786).
5
+ *
6
+ * `isWaitingForResponse` is a level, and every question the display Issues ask
7
+ * is about the *edge*: #1787 wants "waiting for how long", #1788 wants to push a
8
+ * WebSocket frame the instant it flips, #1790 wants to fire a push notification
9
+ * on the same instant and not on the 200 polls that follow. A level cannot
10
+ * answer any of those, and three surfaces each keeping their own "was it waiting
11
+ * last time?" would be three chances to disagree about when a wait began.
12
+ *
13
+ * So the edge is detected exactly once, here, by {@link observeWaitingEdge}, and
14
+ * everything else either reads {@link getWaitingEpisode} or subscribes with
15
+ * {@link onWaitingTransition}. There is one caller today —
16
+ * `worktree-status-helper`, on the list API's per-instance probe — and it passes
17
+ * the *composed* verdict (scraper OR structured), so a wait that only the
18
+ * agent's own events can see opens an episode exactly like one the screen
19
+ * scraper read.
20
+ *
21
+ * ## Where #1788 / #1790 plug in
22
+ *
23
+ * `onWaitingTransition(listener)` — the listener receives every false→true and
24
+ * true→false crossing, with the instance it belongs to, the episode's `since`
25
+ * and its {@link WaitingKind}. #1788 broadcasts it (`broadcastToWorktree`),
26
+ * #1790 decides whether to send a push. Neither needs to touch this module's
27
+ * internals, and neither can move the timestamps the other reports.
28
+ *
29
+ * Listeners are called synchronously, inside the request that observed the edge,
30
+ * because the point of the seam is immediacy. A listener that throws is
31
+ * contained: this store is on the list API's hot path, and a broken notification
32
+ * sink must not take the status read down with it.
33
+ *
34
+ * In-memory (via `globalThis`, per Issue #1736 — see the note in
35
+ * `agent-event-state`) rather than SQLite, for the same reason the structured
36
+ * state is: it describes a live tmux session, and a wait does not outlive the
37
+ * server process that observed it.
38
+ *
39
+ * @module lib/session/waiting-episode-state
40
+ */
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.onWaitingTransition = onWaitingTransition;
43
+ exports.observeWaitingEdge = observeWaitingEdge;
44
+ exports.getWaitingEpisode = getWaitingEpisode;
45
+ exports.clearWaitingEpisodes = clearWaitingEpisodes;
46
+ exports.clearWaitingTransitionListeners = clearWaitingTransitionListeners;
47
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
48
+ const logger_1 = require("../../lib/logger");
49
+ const logger = (0, logger_1.createLogger)('waiting-episode-state');
50
+ /** compositeKey -> the wait currently in progress for that instance. */
51
+ const episodes = globalThis.__sessionWaitingEpisodes ??
52
+ (globalThis.__sessionWaitingEpisodes = new Map());
53
+ /** Subscribers to the edge. See the module docblock. */
54
+ const listeners = globalThis.__sessionWaitingTransitionListeners ??
55
+ (globalThis.__sessionWaitingTransitionListeners = new Set());
56
+ /**
57
+ * Subscribe to waiting edges.
58
+ *
59
+ * @returns An unsubscribe function. Idempotent — calling it twice is harmless.
60
+ */
61
+ function onWaitingTransition(listener) {
62
+ listeners.add(listener);
63
+ return () => {
64
+ listeners.delete(listener);
65
+ };
66
+ }
67
+ /** Notify subscribers, containing anything they throw. */
68
+ function emit(transition) {
69
+ for (const listener of listeners) {
70
+ try {
71
+ listener(transition);
72
+ }
73
+ catch (error) {
74
+ logger.error('waiting-transition-listener-failed', {
75
+ worktreeId: transition.worktreeId,
76
+ cliToolId: transition.cliToolId,
77
+ instanceId: transition.instanceId ?? transition.cliToolId,
78
+ waiting: transition.waiting,
79
+ error: error instanceof Error ? error.message : String(error),
80
+ });
81
+ }
82
+ }
83
+ }
84
+ /**
85
+ * Record this poll's waiting verdict and answer when the current wait began.
86
+ *
87
+ * The single writer of the edge, by design (Issue #1786). Idempotent for a
88
+ * level that has not changed: repeated `waiting: true` polls return the same
89
+ * `since` and emit nothing, so a listener hears one event per wait rather than
90
+ * one per poll.
91
+ *
92
+ * @returns The episode's `since` while waiting, or null when it is not.
93
+ */
94
+ function observeWaitingEdge({ worktreeId, cliToolId, instanceId, waiting, kind = null, structuredSince = null, now = Date.now(), }) {
95
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
96
+ const existing = episodes.get(key);
97
+ if (!waiting) {
98
+ if (existing === undefined)
99
+ return null;
100
+ episodes.delete(key);
101
+ emit({ worktreeId, cliToolId, instanceId, waiting: false, since: null, kind: null, at: now });
102
+ return null;
103
+ }
104
+ if (existing !== undefined) {
105
+ // A wait can change character without ending — a permission dialog answered
106
+ // into a selection list is still one uninterrupted wait — so the kind is
107
+ // refreshed while `since` stays put.
108
+ existing.kind = kind;
109
+ return existing.since;
110
+ }
111
+ const since = structuredSince ?? now;
112
+ episodes.set(key, { since, kind });
113
+ emit({ worktreeId, cliToolId, instanceId, waiting: true, since, kind, at: now });
114
+ return since;
115
+ }
116
+ /**
117
+ * @returns The wait in progress for this instance, or null when it is not
118
+ * waiting. Read-only: observing the edge is {@link observeWaitingEdge}'s job.
119
+ */
120
+ function getWaitingEpisode(worktreeId, cliToolId, instanceId) {
121
+ return episodes.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
122
+ }
123
+ /**
124
+ * Drop every episode. Test seam.
125
+ *
126
+ * CI runs with `fileParallelism: false`, so one process holds this map for the
127
+ * whole suite: a test that opens an episode and does not clear it hands the next
128
+ * file a session that is already waiting.
129
+ */
130
+ function clearWaitingEpisodes() {
131
+ episodes.clear();
132
+ }
133
+ /** Drop every subscriber. Test seam, paired with {@link clearWaitingEpisodes}. */
134
+ function clearWaitingTransitionListeners() {
135
+ listeners.clear();
136
+ }