commandmate 0.44.2 → 0.44.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +149 -149
  3. package/.next/app-path-routes-manifest.json +21 -21
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/react-loadable-manifest.json +0 -6
  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/agents/update/route.js +1 -1
  10. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/versions/route.js +1 -1
  12. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update/route.js +2 -2
  15. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/login/route.js +1 -1
  18. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/capabilities/route.js +1 -1
  22. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/route.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  28. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  31. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/route.js +1 -1
  33. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  37. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  40. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  41. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  43. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  44. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/push/escalation/route.js +1 -1
  48. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/push/subscriptions/route.js +2 -2
  50. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/push/vapid/route.js +1 -1
  52. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  54. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  55. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/relays/route.js +1 -1
  57. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  58. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  61. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  63. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/clone/route.js +1 -1
  66. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/restore/route.js +1 -1
  70. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/route.js +1 -1
  73. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/scan/route.js +1 -1
  76. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/sync/route.js +1 -1
  79. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  83. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  84. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  87. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/skills/[id]/route.js +1 -1
  89. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/route.js +1 -1
  94. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/[id]/route.js +2 -2
  99. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/templates/route.js +2 -2
  101. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  208. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  211. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  214. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  240. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/route.js +1 -1
  264. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  267. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  269. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  270. package/.next/server/app/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  273. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/sessions/page.js +1 -1
  275. package/.next/server/app/sessions/page.js.nft.json +1 -1
  276. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/worktrees/[id]/page.js +11 -11
  282. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  283. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app-paths-manifest.json +21 -21
  286. package/.next/server/chunks/1191.js +2 -2
  287. package/.next/server/chunks/1210.js +1 -1
  288. package/.next/server/chunks/1559.js +2 -0
  289. package/.next/server/chunks/1789.js +1 -0
  290. package/.next/server/chunks/2119.js +1 -1
  291. package/.next/server/chunks/2404.js +1 -1
  292. package/.next/server/chunks/2445.js +1 -1
  293. package/.next/server/chunks/2460.js +1 -1
  294. package/.next/server/chunks/2710.js +1 -1
  295. package/.next/server/chunks/2908.js +1 -1
  296. package/.next/server/chunks/2980.js +1 -1
  297. package/.next/server/chunks/3241.js +1 -1
  298. package/.next/server/chunks/3480.js +1 -1
  299. package/.next/server/chunks/3718.js +1 -1
  300. package/.next/server/chunks/4207.js +2 -2
  301. package/.next/server/chunks/450.js +1 -1
  302. package/.next/server/chunks/4672.js +5 -0
  303. package/.next/server/chunks/{9353.js → 4718.js} +2 -2
  304. package/.next/server/chunks/4837.js +14 -0
  305. package/.next/server/chunks/5048.js +1 -1
  306. package/.next/server/chunks/5209.js +1 -0
  307. package/.next/server/chunks/5595.js +1 -1
  308. package/.next/server/chunks/5625.js +25 -0
  309. package/.next/server/chunks/611.js +1 -1
  310. package/.next/server/chunks/6130.js +1 -1
  311. package/.next/server/chunks/6401.js +1 -1
  312. package/.next/server/chunks/6781.js +1 -1
  313. package/.next/server/chunks/6793.js +3 -3
  314. package/.next/server/chunks/7491.js +2 -2
  315. package/.next/server/chunks/7905.js +1 -1
  316. package/.next/server/chunks/850.js +1 -1
  317. package/.next/server/chunks/8728.js +3 -3
  318. package/.next/server/chunks/8791.js +1 -1
  319. package/.next/server/chunks/8800.js +1 -1
  320. package/.next/server/chunks/8918.js +7 -7
  321. package/.next/server/chunks/9130.js +1 -1
  322. package/.next/server/chunks/9390.js +2 -2
  323. package/.next/server/chunks/9584.js +1 -1
  324. package/.next/server/chunks/9627.js +6 -6
  325. package/.next/server/chunks/9731.js +3 -3
  326. package/.next/server/middleware-manifest.json +5 -5
  327. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  328. package/.next/server/pages/500.html +1 -1
  329. package/.next/server/server-reference-manifest.json +1 -1
  330. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  331. package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-06d35bb1aa02de80.js} +1 -1
  332. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  333. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
  334. package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
  335. package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-0d1750b833f5cc3e.js} +1 -1
  336. package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
  337. package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
  338. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  339. package/.next/static/css/057f64a65726c439.css +1 -0
  340. package/.next/trace +13 -13
  341. package/dist/cli/commands/ask.d.ts.map +1 -1
  342. package/dist/cli/commands/ask.js +120 -119
  343. package/dist/cli/commands/attach.d.ts +94 -0
  344. package/dist/cli/commands/attach.d.ts.map +1 -1
  345. package/dist/cli/commands/attach.js +145 -7
  346. package/dist/cli/commands/auto-yes.js +1 -1
  347. package/dist/cli/commands/capture.d.ts.map +1 -1
  348. package/dist/cli/commands/capture.js +3 -5
  349. package/dist/cli/commands/command-target.d.ts +23 -0
  350. package/dist/cli/commands/command-target.d.ts.map +1 -0
  351. package/dist/cli/commands/command-target.js +25 -0
  352. package/dist/cli/commands/instances.d.ts.map +1 -1
  353. package/dist/cli/commands/instances.js +41 -2
  354. package/dist/cli/commands/message-dispatch.d.ts +36 -0
  355. package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
  356. package/dist/cli/commands/message-dispatch.js +63 -0
  357. package/dist/cli/commands/reply.d.ts.map +1 -1
  358. package/dist/cli/commands/reply.js +2 -5
  359. package/dist/cli/commands/respond.d.ts.map +1 -1
  360. package/dist/cli/commands/respond.js +3 -6
  361. package/dist/cli/commands/send.d.ts.map +1 -1
  362. package/dist/cli/commands/send.js +149 -146
  363. package/dist/cli/commands/wait.d.ts.map +1 -1
  364. package/dist/cli/commands/wait.js +589 -431
  365. package/dist/cli/types/api-responses.d.ts +159 -27
  366. package/dist/cli/types/api-responses.d.ts.map +1 -1
  367. package/dist/cli/types/api-responses.js +4 -2
  368. package/dist/cli/utils/api-client.d.ts +25 -5
  369. package/dist/cli/utils/api-client.d.ts.map +1 -1
  370. package/dist/cli/utils/api-client.js +87 -55
  371. package/dist/cli/utils/server-url.d.ts +1 -0
  372. package/dist/cli/utils/server-url.d.ts.map +1 -1
  373. package/dist/cli/utils/server-url.js +7 -0
  374. package/dist/config/uat-isolation.d.ts +140 -0
  375. package/dist/config/uat-isolation.d.ts.map +1 -0
  376. package/dist/config/uat-isolation.js +246 -0
  377. package/dist/lib/global-state.d.ts +12 -0
  378. package/dist/lib/global-state.d.ts.map +1 -0
  379. package/dist/lib/global-state.js +16 -0
  380. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
  381. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
  382. package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
  383. package/dist/lib/session/prompt-view.d.ts +26 -3
  384. package/dist/lib/session/prompt-view.d.ts.map +1 -1
  385. package/dist/lib/session/prompt-view.js +26 -3
  386. package/dist/lib/session/status-evidence-type.d.ts +16 -0
  387. package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
  388. package/dist/lib/session/status-evidence-type.js +2 -0
  389. package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
  390. package/dist/lib/tmux/legacy-session-alias.js +2 -1
  391. package/dist/server/locales/en/worktree.json +3 -1
  392. package/dist/server/locales/ja/worktree.json +3 -1
  393. package/dist/server/src/cli/types/api-responses.js +4 -2
  394. package/dist/server/src/config/cli-tool-timing-config.js +1 -6
  395. package/dist/server/src/config/uat-isolation.js +246 -0
  396. package/dist/server/src/lib/assistant-response-saver.js +62 -3
  397. package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
  398. package/dist/server/src/lib/auto-yes-poller.js +450 -160
  399. package/dist/server/src/lib/auto-yes-state.js +2 -2
  400. package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
  401. package/dist/server/src/lib/cli-tools/base.js +151 -0
  402. package/dist/server/src/lib/cli-tools/codex.js +44 -80
  403. package/dist/server/src/lib/cli-tools/command-code.js +24 -56
  404. package/dist/server/src/lib/cli-tools/copilot.js +25 -67
  405. package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
  406. package/dist/server/src/lib/cli-tools/gemini.js +23 -73
  407. package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
  408. package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
  409. package/dist/server/src/lib/cli-tools/opencode.js +21 -85
  410. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
  411. package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
  412. package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
  413. package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
  414. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
  415. package/dist/server/src/lib/detection/prompt-detector.js +2 -35
  416. package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
  417. package/dist/server/src/lib/detection/selection-shape.js +32 -520
  418. package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
  419. package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
  420. package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
  421. package/dist/server/src/lib/detection/tools/antigravity/detect.js +5 -29
  422. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
  423. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
  424. package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
  425. package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
  426. package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
  427. package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
  428. package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
  429. package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
  430. package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
  431. package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
  432. package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
  433. package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
  434. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
  435. package/dist/server/src/lib/detection/tools/context-above.js +20 -0
  436. package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
  437. package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
  438. package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
  439. package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
  440. package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
  441. package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
  442. package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
  443. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
  444. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
  445. package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
  446. package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
  447. package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
  448. package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
  449. package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
  450. package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
  451. package/dist/server/src/lib/global-state.js +16 -0
  452. package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
  453. package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
  454. package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
  455. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
  456. package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
  457. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
  458. package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
  459. package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
  460. package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
  461. package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
  462. package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
  463. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
  464. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
  465. package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
  466. package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
  467. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
  468. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
  469. package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
  470. package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
  471. package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
  472. package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
  473. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
  474. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
  475. package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
  476. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
  477. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
  478. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
  479. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
  480. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
  481. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
  482. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
  483. package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
  484. package/dist/server/src/lib/hooks/sources/registry.js +3 -2
  485. package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
  486. package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
  487. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
  488. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
  489. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
  490. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
  491. package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
  492. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
  493. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
  494. package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
  495. package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
  496. package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
  497. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
  498. package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
  499. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
  500. package/dist/server/src/lib/polling/response-checker.js +641 -1142
  501. package/dist/server/src/lib/polling/response-dedup.js +3 -4
  502. package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
  503. package/dist/server/src/lib/polling/response-poller-core.js +54 -20
  504. package/dist/server/src/lib/polling/startup-screen.js +142 -0
  505. package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
  506. package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
  507. package/dist/server/src/lib/prompt-answer-sender.js +5 -4
  508. package/dist/server/src/lib/push/failure-episode-state.js +2 -2
  509. package/dist/server/src/lib/push/notification-dedup.js +3 -4
  510. package/dist/server/src/lib/push/prompt-card-state.js +2 -2
  511. package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
  512. package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
  513. package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
  514. package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
  515. package/dist/server/src/lib/relay/relay-delivery.js +3 -2
  516. package/dist/server/src/lib/relay/relay-readiness.js +38 -1
  517. package/dist/server/src/lib/response-cleaner.js +24 -1
  518. package/dist/server/src/lib/response-extractor.js +16 -0
  519. package/dist/server/src/lib/schedule-manager.js +8 -10
  520. package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
  521. package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
  522. package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
  523. package/dist/server/src/lib/session/agent-event-model.js +562 -0
  524. package/dist/server/src/lib/session/agent-event-record.js +10 -0
  525. package/dist/server/src/lib/session/agent-event-state.js +106 -1854
  526. package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
  527. package/dist/server/src/lib/session/agent-event-turn.js +811 -0
  528. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
  529. package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
  530. package/dist/server/src/lib/session/claude-executor.js +45 -5
  531. package/dist/server/src/lib/session/claude-session.js +21 -65
  532. package/dist/server/src/lib/session/cli-session.js +17 -0
  533. package/dist/server/src/lib/session/current-output-builder.js +450 -1103
  534. package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
  535. package/dist/server/src/lib/session/current-output-types.js +9 -0
  536. package/dist/server/src/lib/session/detection-divergence.js +55 -0
  537. package/dist/server/src/lib/session/global-session-constants.js +2 -13
  538. package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
  539. package/dist/server/src/lib/session/layer-disagreement.js +2 -2
  540. package/dist/server/src/lib/session/opencode-session-store.js +2 -1
  541. package/dist/server/src/lib/session/prompt-view.js +26 -3
  542. package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
  543. package/dist/server/src/lib/session/provisional-turn.js +3 -1
  544. package/dist/server/src/lib/session/send-user-message.js +1 -1
  545. package/dist/server/src/lib/session/session-starting-state.js +4 -6
  546. package/dist/server/src/lib/session/status-evidence-type.js +2 -0
  547. package/dist/server/src/lib/session/status-evidence.js +2 -2
  548. package/dist/server/src/lib/session/structured-status-merge.js +335 -0
  549. package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
  550. package/dist/server/src/lib/session-cleanup.js +1 -5
  551. package/dist/server/src/lib/skills/install-plan.js +2 -1
  552. package/dist/server/src/lib/skills/snapshot-store.js +2 -2
  553. package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
  554. package/dist/server/src/lib/timer-manager.js +6 -8
  555. package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
  556. package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
  557. package/dist/server/src/lib/tmux/session-hooks.js +2 -1
  558. package/dist/server/src/lib/tmux/session-status-options.js +3 -3
  559. package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
  560. package/dist/server/src/lib/tmux/tmux.js +33 -59
  561. package/dist/server/src/lib/tui-accumulator.js +2 -2
  562. package/dist/server/src/lib/version-checker.js +6 -6
  563. package/dist/server/src/lib/ws-server.js +47 -11
  564. package/docs/en/user-guide/webapp-guide.md +27 -3
  565. package/package.json +1 -1
  566. package/release-notes/0.44.3.json +82 -0
  567. package/scripts/hooks/cmate-agent-event.sh +18 -0
  568. package/.next/server/chunks/1068.js +0 -1
  569. package/.next/server/chunks/4372.js +0 -5
  570. package/.next/server/chunks/6474.js +0 -14
  571. package/.next/server/chunks/967.js +0 -1
  572. package/.next/server/chunks/9798.js +0 -2
  573. package/.next/server/chunks/9882.js +0 -25
  574. package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
  575. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
  576. package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
  577. package/.next/static/css/38070d879efa1371.css +0 -1
  578. package/dist/server/src/lib/cli-tools/index.js +0 -41
  579. package/dist/server/src/lib/polling/global-session-poller.js +0 -140
  580. /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
  581. /package/.next/static/{QlCqLjorauDDBXPa-C7TK → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
@@ -22,9 +22,10 @@ const current_output_builder_1 = require("../../lib/session/current-output-build
22
22
  const logger_1 = require("../../lib/logger");
23
23
  const manager_1 = require("../../lib/cli-tools/manager");
24
24
  const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
25
+ const global_state_1 = require("../global-state");
26
+ const terminal_session_ownership_1 = require("./terminal-session-ownership");
25
27
  const logger = (0, logger_1.createLogger)('terminal-broadcast');
26
- const versionCounters = globalThis.__terminalSnapshotVersions ??
27
- (globalThis.__terminalSnapshotVersions = new Map());
28
+ const versionCounters = (0, global_state_1.getOrInitGlobal)('__terminalSnapshotVersions', () => new Map());
28
29
  exports.INTERACTION_SNAPSHOT_RETRY_DELAYS_MS = [100, 250, 500, 750];
29
30
  function nextVersion(key) {
30
31
  const version = (versionCounters.get(key) ?? 0) + 1;
@@ -40,6 +41,8 @@ async function broadcastTerminalSnapshot(worktreeId, cliToolId, instanceId) {
40
41
  if (!(0, ws_server_1.hasRoomSubscribers)(worktreeId))
41
42
  return;
42
43
  try {
44
+ if (!(await isPushableSession(worktreeId, cliToolId, instanceId)))
45
+ return;
43
46
  const db = (0, db_instance_1.getDbInstance)();
44
47
  const payload = await (0, current_output_builder_1.buildCurrentOutput)(db, worktreeId, cliToolId, instanceId);
45
48
  emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId);
@@ -68,6 +71,9 @@ function snapshotFingerprint(payload) {
68
71
  // the push, the same reason `sessionStatus` and the two dismiss-panel
69
72
  // fields above are here.
70
73
  payload.promptAnswerable ?? null,
74
+ // Issue #3397: so "Auto-Yes sent Enter" (and its `no-effect` follow-up)
75
+ // reaches the push even when the frame did not change.
76
+ payload.autoYes?.lastEnterFallback ?? null,
71
77
  payload.isSelectionListActive ?? false,
72
78
  payload.isPagerActive ?? false,
73
79
  // Issue #2369: in the fingerprint for the same reason `sessionStatus` is —
@@ -80,7 +86,30 @@ function snapshotFingerprint(payload) {
80
86
  payload.startingSince ?? null,
81
87
  ]);
82
88
  }
89
+ /**
90
+ * Whether the session under this (worktree, tool, instance)'s name may be read
91
+ * and pushed now (Issue #3334).
92
+ *
93
+ * `buildCurrentOutput` finds the session by name. The poller that drives this
94
+ * push was started by a send the route had checked, but it keeps ticking by
95
+ * name: if the session ends mid-poll and another CommandMate server starts one
96
+ * under the same name (#2865), the next tick would capture that server's pane
97
+ * and push it to this server's tabs. Asked before every capture, with the same
98
+ * check the WebSocket terminal uses; a refused session is not read and nothing
99
+ * is pushed — the HTTP poll (which answers 409) says what happened.
100
+ */
101
+ async function isPushableSession(worktreeId, cliToolId, instanceId) {
102
+ const sessionName = manager_1.CLIToolManager.getInstance().getTool(cliToolId).getSessionName(worktreeId, instanceId);
103
+ const refusal = await (0, terminal_session_ownership_1.findTerminalSessionRefusal)(worktreeId, sessionName);
104
+ if (refusal === null)
105
+ return true;
106
+ logger.info('terminal-snapshot:refused', { worktreeId, cliToolId, instanceId, refusal });
107
+ return false;
108
+ }
109
+ /** `null` when the session may not be read now ({@link isPushableSession}). */
83
110
  async function captureFreshPayload(worktreeId, cliToolId, instanceId) {
111
+ if (!(await isPushableSession(worktreeId, cliToolId, instanceId)))
112
+ return null;
84
113
  const tool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
85
114
  (0, tmux_capture_cache_1.invalidateCache)(tool.getSessionName(worktreeId, instanceId));
86
115
  return (0, current_output_builder_1.buildCurrentOutput)((0, db_instance_1.getDbInstance)(), worktreeId, cliToolId, instanceId);
@@ -110,9 +139,9 @@ function emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId) {
110
139
  // `JSON.stringify` (in `broadcast`) already drops from the wire on its own.
111
140
  // Defaulting it would turn "not judged" into a judgement.
112
141
  promptAnswerable: payload.promptAnswerable,
113
- // Issue #3184: derived from `promptData` by the builder; `?? null` like
114
- // `promptData` itself, since both say "no prompt" the same way.
115
- promptView: payload.promptView ?? null,
142
+ // Issue #3397: straight through, like `promptAnswerable` — undefined (and so
143
+ // off the wire) when the payload carries no `autoYes`.
144
+ autoYesEnterFallback: payload.autoYes?.lastEnterFallback,
116
145
  isSelectionListActive: payload.isSelectionListActive ?? false,
117
146
  isPagerActive: payload.isPagerActive ?? false,
118
147
  isDismissablePanelActive: payload.isDismissablePanelActive ?? false,
@@ -132,11 +161,15 @@ async function broadcastTerminalSnapshotAfterInteraction(worktreeId, cliToolId,
132
161
  return;
133
162
  try {
134
163
  const initialPayload = await captureFreshPayload(worktreeId, cliToolId, instanceId);
164
+ if (initialPayload === null)
165
+ return;
135
166
  const initialFingerprint = snapshotFingerprint(initialPayload);
136
167
  emitTerminalSnapshot(worktreeId, cliToolId, initialPayload, instanceId);
137
168
  for (const delayMs of retryDelaysMs) {
138
169
  await new Promise(resolve => setTimeout(resolve, delayMs));
139
170
  const payload = await captureFreshPayload(worktreeId, cliToolId, instanceId);
171
+ if (payload === null)
172
+ return;
140
173
  if (snapshotFingerprint(payload) !== initialFingerprint) {
141
174
  emitTerminalSnapshot(worktreeId, cliToolId, payload, instanceId);
142
175
  return;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ /**
3
+ * "May this server write to, or show, the session under this name right now?"
4
+ * (Issue #3334).
5
+ *
6
+ * Shared by the two realtime paths that address a session by a name they
7
+ * resolved earlier: the WebSocket terminal (`ws-server.ts` — every
8
+ * `terminal_input` / `terminal_resize` and the control-mode fallback capture)
9
+ * and the terminal snapshot push (`terminal-broadcast.ts`). Both outlive the
10
+ * moment they were set up — a socket, a poller chain — and a session that
11
+ * ended and was started again by another CommandMate server under the same
12
+ * name (#2865) would otherwise receive this server's keys, or have its screen
13
+ * pushed to this server's tabs. So both ask again before every write or read,
14
+ * the way the routes ask per request.
15
+ *
16
+ * Kept out of `ws-server.ts` so the push can import it without loading the
17
+ * socket server (and so the many suites that stub `@/lib/ws-server` keep
18
+ * stubbing only what they meant to).
19
+ *
20
+ * @module lib/realtime/terminal-session-ownership
21
+ */
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.FOREIGN_TERMINAL_SESSION_ERROR = void 0;
24
+ exports.findTerminalSessionRefusal = findTerminalSessionRefusal;
25
+ const db_instance_1 = require("../../lib/db/db-instance");
26
+ const db_1 = require("../../lib/db");
27
+ const session_ownership_1 = require("../../lib/cli-tools/session-ownership");
28
+ /** The `terminal_error` text for a session another CommandMate server owns. */
29
+ exports.FOREIGN_TERMINAL_SESSION_ERROR = 'Session belongs to another CommandMate server';
30
+ /**
31
+ * Why the session may not be touched now, or null.
32
+ *
33
+ * The worktree row is re-read by id because a rename re-points a terminal
34
+ * subscription (`migrateWorktreeRooms`); a row that is gone cannot vouch for
35
+ * the session, which is refused for the same reason `sendUserMessage` refuses
36
+ * it. An absent session is not refused here — there is nothing of anyone's to
37
+ * show or type into, and each caller already handles a missing session.
38
+ */
39
+ async function findTerminalSessionRefusal(worktreeId, sessionName) {
40
+ const worktree = (0, db_1.getWorktreeById)((0, db_instance_1.getDbInstance)(), worktreeId);
41
+ if (!worktree)
42
+ return 'Worktree not found';
43
+ const ownership = await (0, session_ownership_1.checkSessionOwnership)(sessionName, worktree.path);
44
+ return ownership.verdict === 'foreign' ? exports.FOREIGN_TERMINAL_SESSION_ERROR : null;
45
+ }
@@ -58,6 +58,7 @@ const relay_readiness_1 = require("../../lib/relay/relay-readiness");
58
58
  const relay_session_ref_1 = require("../../lib/relay/relay-session-ref");
59
59
  const relay_system_line_1 = require("../../lib/relay/relay-system-line");
60
60
  const logger_1 = require("../../lib/logger");
61
+ const global_state_1 = require("../global-state");
61
62
  const logger = (0, logger_1.createLogger)('relay-delivery');
62
63
  /**
63
64
  * How many assistant rows back the reply is looked for.
@@ -153,7 +154,7 @@ const TRANSCRIPT_READER_TOOLS = {
153
154
  const RELAY_TURN_ROW_GRACE_MS = 15_000;
154
155
  /** How often the grace above re-reads the ledger. */
155
156
  const RELAY_TURN_ROW_POLL_MS = 1_000;
156
- const inFlight = (globalThis.__relayDeliveryInFlight ??= new Set());
157
+ const inFlight = (0, global_state_1.getOrInitGlobal)('__relayDeliveryInFlight', () => new Set());
157
158
  /** Forget every in-flight delivery. Test seam. */
158
159
  function resetRelayDeliveryState() {
159
160
  inFlight.clear();
@@ -470,7 +471,7 @@ async function deliverOne(db, relayId, kind, body) {
470
471
  if (!relay)
471
472
  return 'skipped';
472
473
  const requester = (0, relay_session_ref_1.resolveRelaySession)(db, relay.from);
473
- const hold = await (0, relay_readiness_1.findRelayHoldReason)(requester.worktreeId, requester.cliToolId, requester.instanceId);
474
+ const hold = await (0, relay_readiness_1.findRelayHoldReason)(requester.worktreeId, requester.cliToolId, requester.instanceId, db);
474
475
  if (hold) {
475
476
  logger.debug('relay-delivery-held', { relayId, kind, reason: hold });
476
477
  return 'held';
@@ -13,12 +13,25 @@
13
13
  * is running. The relay waits for `ready` instead — the ledger is durable, so
14
14
  * waiting costs nothing but time.
15
15
  *
16
+ * Since Issue #3337 "mid-turn" is also the hooks' answer when they speak for
17
+ * a codex pane (`lib/session/hook-turn-hold`, the rule `capture --json`
18
+ * reads): the frame alone read a live codex turn as `ready`.
19
+ *
16
20
  * The prompt-dialog question is deliberately NOT asked here: `sendUserMessage`
17
21
  * already refuses a send that would land in an open dialog (#1708/#1737), and
18
22
  * duplicating that judgement would give the relay path its own second opinion
19
23
  * about a state the send path is the authority on. A refusal there is a retry
20
24
  * here.
21
25
  *
26
+ * **Is it this server's session?** (Issue #3334) Asked first — before the
27
+ * pane is read, and before `isRunning()`, which reads the pane (claude) or
28
+ * resumes an event stream (opencode-v2) on its own.
29
+ * `sendUserMessage` refuses a session another CommandMate server created under
30
+ * the same name (#2865), but this check came first and read that pane to judge
31
+ * it — the same order `sendUserMessage` itself was fixed out of. Such a session
32
+ * holds the delivery (`foreign_session`): the ledger keeps the payload, and it
33
+ * goes out if this server's own session comes back before the deadline.
34
+ *
22
35
  * Fail-open on an unreadable pane, for the same reason `prompt-waiting-guard`
23
36
  * fails open: the cost of a wrong "ready" is a message the send path refuses
24
37
  * and the pump retries, while the cost of a wrong "not ready" is a relay that
@@ -29,22 +42,46 @@
29
42
  Object.defineProperty(exports, "__esModule", { value: true });
30
43
  exports.findRelayHoldReason = findRelayHoldReason;
31
44
  const manager_1 = require("../../lib/cli-tools/manager");
45
+ const session_name_1 = require("../../lib/cli-tools/session-name");
46
+ const worktree_session_ownership_1 = require("../../lib/cli-tools/worktree-session-ownership");
32
47
  const cli_session_1 = require("../../lib/session/cli-session");
33
48
  const status_detector_1 = require("../../lib/detection/status-detector");
49
+ const hook_turn_hold_1 = require("../../lib/session/hook-turn-hold");
34
50
  const status_capture_config_1 = require("../../config/status-capture-config");
35
51
  const logger_1 = require("../../lib/logger");
36
52
  const logger = (0, logger_1.createLogger)('relay-readiness');
37
53
  /**
38
54
  * Whether a relay may be delivered into this session now.
39
55
  *
56
+ * @param db - The handle the worktree row is read from (Issue #3334); defaults
57
+ * to the server's
40
58
  * @returns `null` when the session can take the message, else why it cannot
41
59
  */
42
- async function findRelayHoldReason(worktreeId, cliToolId, instanceId) {
60
+ async function findRelayHoldReason(worktreeId, cliToolId, instanceId, db) {
43
61
  try {
62
+ // Issue #3334: the session name `sendUserMessage` will address, checked
63
+ // the way it checks it — before anything touches the session. That
64
+ // includes `isRunning()`: it is not a bare existence test for every tool.
65
+ // claude's reads the pane to judge its health, and opencode-v2's starts
66
+ // re-subscribing to the event stream of whatever server sits in the
67
+ // session's directory.
68
+ const sessionName = (0, session_name_1.resolveSessionName)(cliToolId, worktreeId, instanceId);
69
+ const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName, db);
70
+ if (ownership === null || ownership.verdict === 'foreign')
71
+ return 'foreign_session';
72
+ if (ownership.verdict === 'absent')
73
+ return 'session_stopped';
44
74
  const cliTool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
45
75
  if (!(await cliTool.isRunning(worktreeId, instanceId)))
46
76
  return 'session_stopped';
47
77
  const output = await (0, cli_session_1.captureSessionOutput)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
78
+ // Issue #3337: for a tool whose hook turns the screen may not end (codex),
79
+ // an open hook turn holds the pane at `running` whatever the frame reads —
80
+ // the rule `capture --json` publishes, read from the one place it is
81
+ // written. A frame of a live codex turn read `ready`, and a reply typed into
82
+ // it interrupted the turn.
83
+ if ((0, hook_turn_hold_1.hookTurnHoldsPane)(worktreeId, cliToolId, instanceId, output))
84
+ return 'generating';
48
85
  const status = (0, status_detector_1.detectSessionStatus)(output, cliToolId);
49
86
  // Only `running` holds. `waiting` is a dialog, which is the send path's
50
87
  // judgement to make (and its refusal is a retry); `idle` and `ready` both
@@ -15,6 +15,7 @@ exports.cleanScrollbackResponse = cleanScrollbackResponse;
15
15
  exports.truncateMessage = truncateMessage;
16
16
  const cli_patterns_1 = require("./detection/cli-patterns");
17
17
  const tui_accumulator_1 = require("./tui-accumulator");
18
+ const startup_screen_1 = require("./polling/startup-screen");
18
19
  const copilot_constants_1 = require("../config/copilot-constants");
19
20
  /**
20
21
  * Clean up Claude response by removing shell setup commands, environment exports, ANSI codes, and banner
@@ -473,11 +474,33 @@ function findScrollbackChromeStart(lines, cliToolId) {
473
474
  * classify rows by their SGR attributes, and stripping first would destroy the
474
475
  * evidence they read.
475
476
  *
477
+ * ## The startup screen (Issue #3293)
478
+ *
479
+ * Neither step removes a banner. codex's and vibe-local's startup screens are
480
+ * mostly rows no pattern names — the version, the cwd, a tagline, a logo — so
481
+ * the first flush of a session, whose cursor is 0, saved the screen as a reply.
482
+ * What says "this is not a reply" is the pane, not the rows: no message has
483
+ * been echoed on it yet ({@link isStartupScreenWithoutUserEcho}, the same
484
+ * reading the poller makes). So the flush hands the pane over with the rows.
485
+ *
486
+ * It is a separate argument because `response` cannot answer for it. The rows
487
+ * past the cursor ordinarily hold a reply and no echo — the echo of the turn
488
+ * they belong to sits above the cursor — so asking the question of `response`
489
+ * would empty real replies. A caller that has only a slice omits `paneLines`
490
+ * and gets the two steps above and nothing else.
491
+ *
476
492
  * @param response - Raw capture, ANSI intact
477
493
  * @param cliToolId - The tool the capture came from
494
+ * @param paneLines - The whole capture `response` was sliced from, ANSI intact.
495
+ * Omitted when the caller does not hold it, or when the capture came back
496
+ * clipped by its window (#1670 — the echo may have scrolled out of it)
478
497
  * @returns Cleaned response, or an empty string when the capture was all chrome
498
+ * or the pane has not had a turn yet
479
499
  */
480
- function cleanScrollbackResponse(response, cliToolId) {
500
+ function cleanScrollbackResponse(response, cliToolId, paneLines) {
501
+ if (paneLines && (0, startup_screen_1.isStartupScreenWithoutUserEcho)(cliToolId, paneLines)) {
502
+ return '';
503
+ }
481
504
  const allLines = response.split('\n');
482
505
  const chromeStart = findScrollbackChromeStart(allLines, cliToolId);
483
506
  const bodyLines = chromeStart >= 0 ? allLines.slice(0, chromeStart) : allLines;
@@ -222,6 +222,22 @@ function resolveExtractionStartIndex(lastCapturedLine, totalLines, bufferReset,
222
222
  return foundUserPrompt >= 0 ? foundUserPrompt + 1 : 0;
223
223
  }
224
224
  // Branch 2b: Codex uses lastCapturedLine directly (Codex-specific TUI behavior)
225
+ //
226
+ // Issue #3335: on codex 0.160.0 this is NOT a read cursor, and it is left
227
+ // that way on purpose. 0.160.0 draws in the alternate screen — the capture is
228
+ // the 1000-row pane, the composer pinned to row 996, the transcript growing
229
+ // from the top — so after the startup screen the cursor is the composer row
230
+ // (996, the poller) or the row count (999/1000, the pre-send flush and the
231
+ // advance after a transcript turn), and every reply is drawn above it.
232
+ // Extraction from it is empty, and the reply reaches History from codex's own
233
+ // transcript, read on the Stop hook (`hooks/stop-history-capture.ts` →
234
+ // `hooks/sources/codex/history.ts`), not from the pane. The cost is stated:
235
+ // a 0.160.0 session whose codex hooks are not installed or not trusted gets
236
+ // no reply row from the pane either. What the screen read must not do is
237
+ // save a wrong row from the parked cursor: the poller stops at the composer
238
+ // (`collectCompletedResponse`), a re-read from the top (cursor >= totalLines,
239
+ // branch 1 above) is dropped by `lineCount <= lastCapturedLine`, and the flush
240
+ // reads nothing at or below the composer (`isCodexCursorAtOrBelowComposer`).
225
241
  if (cliToolId === 'codex') {
226
242
  return Math.max(0, lastCapturedLine);
227
243
  }
@@ -33,6 +33,7 @@ const claude_executor_1 = require("./session/claude-executor");
33
33
  const cron_parser_1 = require("./cron-parser");
34
34
  const job_executor_1 = require("./job-executor");
35
35
  const logger_1 = require("../lib/logger");
36
+ const global_state_1 = require("./global-state");
36
37
  const logger = (0, logger_1.createLogger)('schedule-manager');
37
38
  // Re-export for backward compatibility (public API preservation)
38
39
  var cron_parser_2 = require("./cron-parser");
@@ -202,16 +203,13 @@ function replaceCronExpression(state, entry) {
202
203
  * Get or initialize the global manager state.
203
204
  */
204
205
  function getManagerState() {
205
- if (!globalThis.__scheduleManagerStates) {
206
- globalThis.__scheduleManagerStates = {
207
- timerId: null,
208
- schedules: new Map(),
209
- initialized: false,
210
- isSyncing: false,
211
- cmateFileCache: new Map(),
212
- };
213
- }
214
- return globalThis.__scheduleManagerStates;
206
+ return (0, global_state_1.getOrInitGlobal)('__scheduleManagerStates', () => ({
207
+ timerId: null,
208
+ schedules: new Map(),
209
+ initialized: false,
210
+ isSyncing: false,
211
+ cmateFileCache: new Map(),
212
+ }));
215
213
  }
216
214
  // =============================================================================
217
215
  // Lazy DB Accessor
@@ -0,0 +1,168 @@
1
+ "use strict";
2
+ /**
3
+ * The `AskUserQuestion` call an agent instance has in flight (Issue #1726).
4
+ *
5
+ * Split out of `agent-event-state` (Issue #3375), which re-exports the public
6
+ * names and applies the transition from `recordAgentEvent`.
7
+ *
8
+ * @module lib/session/agent-event-ask-user-question
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.askUserQuestion = void 0;
12
+ exports.applyAskUserQuestionTransition = applyAskUserQuestionTransition;
13
+ exports.recordAskUserQuestion = recordAskUserQuestion;
14
+ exports.getAskUserQuestion = getAskUserQuestion;
15
+ exports.clearAskUserQuestion = clearAskUserQuestion;
16
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
17
+ // Issue #2100: the shared list of tool names that mean "a human is being asked
18
+ // to CHOOSE". Pure — its own only import is `permission-request-payload`, which
19
+ // this module already reached for `ASK_USER_QUESTION_TOOL` — and importing it
20
+ // here rather than repeating `'question'` is what keeps the release rule below
21
+ // and `pendingDecisionKind`'s reader from drifting apart.
22
+ const pending_decision_kind_1 = require("../../lib/hooks/pending-decision-kind");
23
+ const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
24
+ const agent_event_structured_state_1 = require("../../lib/session/agent-event-structured-state");
25
+ const global_state_1 = require("../global-state");
26
+ /** compositeKey -> the `AskUserQuestion` call currently in flight (#1726). */
27
+ exports.askUserQuestion = (0, global_state_1.getOrInitGlobal)('__agentEventAskUserQuestion', () => new Map());
28
+ /**
29
+ * When the in-flight question is released (Issue #1726).
30
+ *
31
+ * | event | effect on the question |
32
+ * |-----------------------------------|------------------------|
33
+ * | `pre_tool_use(AskUserQuestion)` | unchanged (this IS it) |
34
+ * | `pre_tool_use(any other tool)` | release |
35
+ * | `post_tool_use` | release |
36
+ * | `notification(permission_prompt)` | **unchanged** |
37
+ * | `notification(idle_prompt)` | release |
38
+ * | `notification(other)` | unchanged |
39
+ * | `stop` | release |
40
+ * | `user_prompt_submit` | release |
41
+ * | `session_start` / `session_end` | release |
42
+ *
43
+ * `PostToolUse` is the precise release — "this tool call is over" — and `Stop`
44
+ * is the backstop for a delivery that never arrives. Issue #1726's text proposed
45
+ * `PostToolUse` and the #1721 spike recorded it as never observed, so this Issue
46
+ * measured it directly on a live v2.1.223 session (2026-08-06):
47
+ *
48
+ * ```
49
+ * 15:36:04.112 PreToolUse AskUserQuestion
50
+ * 15:36:28.643 PostToolUse AskUserQuestion <- the human answered
51
+ * 15:36:29.992 Stop
52
+ * ```
53
+ *
54
+ * It fires, 1.3 s ahead of `Stop` here — and much further ahead whenever the
55
+ * agent keeps working after the answer, which is the case that matters: `Stop`
56
+ * alone would leave a finished question in place for the whole rest of the turn.
57
+ *
58
+ * A `PostToolUse` for any other tool releases as well: the agent could not have
59
+ * finished another tool call while this question was still on screen.
60
+ *
61
+ * **`Notification(permission_prompt)` keeping the question is a live
62
+ * measurement, not a guess.** The #1721 report says the picker emits no events
63
+ * while it is displayed (§5.6), and a first cut of this module read that as "any
64
+ * event means the picker is gone". Driving a real v2.1.223 session through the
65
+ * server on 2026-08-06 disproved it:
66
+ *
67
+ * ```
68
+ * 15:29:18.099 PreToolUse(AskUserQuestion)
69
+ * 15:29:18.109 PermissionRequest(AskUserQuestion) -> no decision
70
+ * 15:29:24.128 Notification(permission_prompt) <- picker still on screen
71
+ * ```
72
+ *
73
+ * The notification lands ~6 s after the dialog is drawn (§5.5's timing exactly),
74
+ * which is *inside* the window §5.6 was counting rather than outside it. Under
75
+ * the first rule it deleted the question six seconds after it arrived, and the
76
+ * options went back to being the screen's — which is the whole feature, silently
77
+ * off, on every real session.
78
+ *
79
+ * `idle_prompt` still releases: the agent reporting it is sitting at the
80
+ * composer is the agent saying no picker is in front of it. An unrecognised
81
+ * notification type changes nothing, because nothing is known about it.
82
+ */
83
+ function applyAskUserQuestionTransition(key, record) {
84
+ switch (record.event) {
85
+ case 'pre_tool_use':
86
+ // A `PreToolUse` for anything else means the agent has moved on to another
87
+ // tool, so whatever question was in flight has been answered. Only
88
+ // reachable when the operator's own settings.json registers a wider
89
+ // matcher than the injected `AskUserQuestion` one — the two files are
90
+ // concatenated, not substituted (#1722).
91
+ //
92
+ // Issue #2100: the exemption is the whole QUESTION vocabulary, not
93
+ // Claude's one spelling. opencode names its question tool `question`, and
94
+ // it publishes a tool part for the same call: measured on 1.18.23 in an
95
+ // isolated HOME, `question.asked` and
96
+ // `message.part.updated(tool=question, status=running)` arrive **in the
97
+ // same millisecond**, in that order (§27.3). Under the old test the
98
+ // second frame read as "the agent moved on to another tool" and deleted
99
+ // the episode 1 ms after the ingest recorded it, which is why
100
+ // `pendingDecisions[].questionOptions` and `promptData.askUserQuestion`
101
+ // were null for every opencode question. Claude is unaffected —
102
+ // `AskUserQuestion` is the first member of the same list — and the cost
103
+ // is that a hook tool literally named `question` no longer releases the
104
+ // episode, which is the same name `pendingDecisionKind` already reads as
105
+ // "this record is a question" for every tool.
106
+ if (!pending_decision_kind_1.QUESTION_DECISION_TOOL_NAMES.includes(record.detail ?? '')) {
107
+ exports.askUserQuestion.delete(key);
108
+ }
109
+ return;
110
+ case 'notification':
111
+ if (record.detail === 'idle_prompt')
112
+ exports.askUserQuestion.delete(key);
113
+ return;
114
+ case 'post_tool_use':
115
+ case 'stop':
116
+ case 'user_prompt_submit':
117
+ case 'session_start':
118
+ case 'session_end':
119
+ exports.askUserQuestion.delete(key);
120
+ return;
121
+ default:
122
+ // exhaustive check: a new AgentEventType must decide its transition here
123
+ record.event;
124
+ return;
125
+ }
126
+ }
127
+ /**
128
+ * Record the `AskUserQuestion` invocation reported for one instance.
129
+ *
130
+ * Idempotent by construction: the same call is reported twice on every session
131
+ * — once by `PreToolUse` and once by the `PermissionRequest` that
132
+ * `AskUserQuestion` also raises with a byte-identical `tool_input` — and the
133
+ * second delivery simply overwrites the first with the same content.
134
+ *
135
+ * @param at - Epoch ms; defaults to now
136
+ */
137
+ function recordAskUserQuestion(worktreeId, cliToolId, instanceId, spec, at = Date.now()) {
138
+ exports.askUserQuestion.set((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId), { at, spec });
139
+ }
140
+ /**
141
+ * The `AskUserQuestion` call in flight for this instance, or null.
142
+ *
143
+ * Bounded exactly like {@link getStructuredSessionState}: a record from a
144
+ * previous generation belongs to a Claude process that no longer exists, and one
145
+ * older than {@link STRUCTURED_STATE_MAX_AGE_MS} has outlived the screen it
146
+ * describes. There is no provisional bound — unlike a `PermissionRequest`, a
147
+ * `PreToolUse(AskUserQuestion)` is not a prediction that a dialog *might*
148
+ * appear: allowing the permission request does not dismiss the picker (§5.6), so
149
+ * the picker is drawn unconditionally.
150
+ *
151
+ * @param now - Epoch ms; defaults to now
152
+ */
153
+ function getAskUserQuestion(worktreeId, cliToolId, instanceId, now = Date.now()) {
154
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
155
+ const episode = exports.askUserQuestion.get(key);
156
+ if (!episode)
157
+ return null;
158
+ const generation = agent_event_turn_1.generationStartedAt.get(key);
159
+ if (generation !== undefined && episode.at < generation)
160
+ return null;
161
+ if (now - episode.at >= agent_event_structured_state_1.STRUCTURED_STATE_MAX_AGE_MS)
162
+ return null;
163
+ return episode;
164
+ }
165
+ /** Drop the in-flight question for one instance. */
166
+ function clearAskUserQuestion(worktreeId, cliToolId, instanceId) {
167
+ exports.askUserQuestion.delete((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId));
168
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ /**
3
+ * The agent's own "I am waiting for instructions" (Issue #1786).
4
+ *
5
+ * Split out of `agent-event-state` (Issue #3375), which re-exports the public
6
+ * names and applies the transition from `recordAgentEvent`.
7
+ *
8
+ * @module lib/session/agent-event-awaiting-instruction
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.awaitingInstruction = void 0;
12
+ exports.applyAwaitingInstructionTransition = applyAwaitingInstructionTransition;
13
+ exports.getAwaitingInstruction = getAwaitingInstruction;
14
+ exports.isAwaitingInstruction = isAwaitingInstruction;
15
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
16
+ const agent_event_turn_1 = require("../../lib/session/agent-event-turn");
17
+ const global_state_1 = require("../global-state");
18
+ /** compositeKey -> the agent's own "I am waiting for instructions" (#1786). */
19
+ exports.awaitingInstruction = (0, global_state_1.getOrInitGlobal)('__agentEventAwaitingInstruction', () => new Map());
20
+ /**
21
+ * The third state: "this turn is over and nobody has told me what to do next"
22
+ * (Issue #1786).
23
+ *
24
+ * | event | effect on awaiting_instruction |
25
+ * |-----------------------------------|--------------------------------|
26
+ * | `notification(idle_prompt)` | **set** |
27
+ * | `user_prompt_submit` | release |
28
+ * | `session_start` / `session_end` | release |
29
+ * | everything else | unchanged |
30
+ *
31
+ * It is a boolean beside the status rather than a fifth `SessionStatus`, because
32
+ * `idle_prompt` already maps to `ready` (`agentEventToSessionStatus`) and
33
+ * `ready` means "you can send a message" everywhere in this codebase — the
34
+ * sidebar, `deriveCliStatus`, `getNextAction`, `commandmate wait`. Widening that
35
+ * vocabulary to carry "and it is *asking* you to" would have every consumer of
36
+ * the four values re-decide what they mean; the boolean asks nothing of anyone
37
+ * who does not want it.
38
+ *
39
+ * `stop` deliberately does NOT set it. `Stop` fires when the turn ends, which is
40
+ * most of the time the agent has simply finished a step of its own plan;
41
+ * `Notification(idle_prompt)` is Claude's separate, later "waiting for your
42
+ * input" signal, and using the turn boundary instead would mark every
43
+ * intermediate stop as a request for instructions.
44
+ *
45
+ * `pre_tool_use` / `post_tool_use` / `notification(permission_prompt)` leave it
46
+ * alone, and that is not a gap: a tool call or a dialog can only happen inside a
47
+ * turn, and the turn's own `user_prompt_submit` has already released it. Adding
48
+ * them would only paper over a `UserPromptSubmit` that never arrived — and an
49
+ * operator whose `UserPromptSubmit` hook is missing has no `Notification` hook
50
+ * either, so there would be nothing to release.
51
+ *
52
+ * There is deliberately no age bound here, unlike every other state in this
53
+ * module. Those bound the damage of an event that may never arrive (a lost
54
+ * `Stop`, a dialog answered with no event to say so). This one is released by
55
+ * events that cannot be missed while the fact is still true: typing into the
56
+ * composer — from the app or straight into the tmux pane — raises
57
+ * `UserPromptSubmit`, and ending the session raises `SessionEnd`. An agent that
58
+ * has been idle for six hours genuinely is still awaiting instructions, and
59
+ * expiring the flag would erase the notification #1790 exists to send. The
60
+ * generation fence in {@link isAwaitingInstruction} still applies, so the flag
61
+ * never survives the process that reported it.
62
+ */
63
+ function applyAwaitingInstructionTransition(key, record) {
64
+ switch (record.event) {
65
+ case 'notification':
66
+ if (record.detail === 'idle_prompt') {
67
+ exports.awaitingInstruction.set(key, { at: record.at, message: record.message ?? null });
68
+ }
69
+ return;
70
+ case 'user_prompt_submit':
71
+ case 'session_start':
72
+ case 'session_end':
73
+ exports.awaitingInstruction.delete(key);
74
+ return;
75
+ case 'stop':
76
+ case 'pre_tool_use':
77
+ case 'post_tool_use':
78
+ return;
79
+ default:
80
+ // exhaustive check: a new AgentEventType must decide its transition here
81
+ record.event;
82
+ return;
83
+ }
84
+ }
85
+ /**
86
+ * The agent's own "waiting for your input", or null (Issue #1786).
87
+ *
88
+ * Fenced by generation like the rest of this module: an `idle_prompt` from the
89
+ * Claude process that used to live in this pane is not this one's.
90
+ */
91
+ function getAwaitingInstruction(worktreeId, cliToolId, instanceId) {
92
+ const key = (0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId);
93
+ const record = exports.awaitingInstruction.get(key);
94
+ if (!record)
95
+ return null;
96
+ const generation = agent_event_turn_1.generationStartedAt.get(key);
97
+ if (generation !== undefined && record.at < generation)
98
+ return null;
99
+ return record;
100
+ }
101
+ /** {@link getAwaitingInstruction} as the boolean the list API publishes. */
102
+ function isAwaitingInstruction(worktreeId, cliToolId, instanceId) {
103
+ return getAwaitingInstruction(worktreeId, cliToolId, instanceId) !== null;
104
+ }