commandmate 0.44.1 → 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 (604) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +169 -169
  3. package/.next/app-path-routes-manifest.json +35 -35
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  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 -2
  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 -2
  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 +3 -3
  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 +35 -35
  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 -0
  294. package/.next/server/chunks/2710.js +1 -1
  295. package/.next/server/chunks/2908.js +1 -0
  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 -0
  308. package/.next/server/chunks/5625.js +25 -0
  309. package/.next/server/chunks/5845.js +1 -0
  310. package/.next/server/chunks/611.js +1 -1
  311. package/.next/server/chunks/6130.js +1 -1
  312. package/.next/server/chunks/6401.js +1 -1
  313. package/.next/server/chunks/6781.js +1 -1
  314. package/.next/server/chunks/6793.js +3 -3
  315. package/.next/server/chunks/7491.js +2 -2
  316. package/.next/server/chunks/7905.js +1 -1
  317. package/.next/server/chunks/850.js +1 -0
  318. package/.next/server/chunks/8543.js +1 -1
  319. package/.next/server/chunks/8728.js +3 -3
  320. package/.next/server/chunks/8791.js +1 -1
  321. package/.next/server/chunks/8800.js +1 -1
  322. package/.next/server/chunks/8918.js +7 -7
  323. package/.next/server/chunks/9130.js +1 -5
  324. package/.next/server/chunks/9390.js +2 -3
  325. package/.next/server/chunks/9584.js +1 -1
  326. package/.next/server/chunks/9627.js +6 -6
  327. package/.next/server/chunks/9731.js +3 -3
  328. package/.next/server/middleware-manifest.json +5 -5
  329. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  330. package/.next/server/pages/500.html +1 -1
  331. package/.next/server/server-reference-manifest.json +1 -1
  332. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  333. package/.next/static/chunks/{2407-f1f258d4a1d92620.js → 2407-06d35bb1aa02de80.js} +1 -1
  334. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  335. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
  336. package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
  337. package/.next/static/chunks/app/{layout-da66300cc20244ed.js → layout-0d1750b833f5cc3e.js} +1 -1
  338. package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
  339. package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
  340. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  341. package/.next/static/css/057f64a65726c439.css +1 -0
  342. package/.next/trace +13 -13
  343. package/dist/cli/commands/ask.d.ts.map +1 -1
  344. package/dist/cli/commands/ask.js +120 -119
  345. package/dist/cli/commands/attach.d.ts +94 -0
  346. package/dist/cli/commands/attach.d.ts.map +1 -1
  347. package/dist/cli/commands/attach.js +145 -7
  348. package/dist/cli/commands/auto-yes.js +1 -1
  349. package/dist/cli/commands/capture.d.ts.map +1 -1
  350. package/dist/cli/commands/capture.js +10 -13
  351. package/dist/cli/commands/command-target.d.ts +23 -0
  352. package/dist/cli/commands/command-target.d.ts.map +1 -0
  353. package/dist/cli/commands/command-target.js +25 -0
  354. package/dist/cli/commands/instances.d.ts.map +1 -1
  355. package/dist/cli/commands/instances.js +41 -2
  356. package/dist/cli/commands/message-dispatch.d.ts +36 -0
  357. package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
  358. package/dist/cli/commands/message-dispatch.js +63 -0
  359. package/dist/cli/commands/reply.d.ts.map +1 -1
  360. package/dist/cli/commands/reply.js +2 -5
  361. package/dist/cli/commands/respond.d.ts.map +1 -1
  362. package/dist/cli/commands/respond.js +3 -6
  363. package/dist/cli/commands/send.d.ts.map +1 -1
  364. package/dist/cli/commands/send.js +149 -146
  365. package/dist/cli/commands/wait.d.ts.map +1 -1
  366. package/dist/cli/commands/wait.js +608 -416
  367. package/dist/cli/types/api-responses.d.ts +174 -27
  368. package/dist/cli/types/api-responses.d.ts.map +1 -1
  369. package/dist/cli/types/api-responses.js +4 -2
  370. package/dist/cli/utils/api-client.d.ts +25 -5
  371. package/dist/cli/utils/api-client.d.ts.map +1 -1
  372. package/dist/cli/utils/api-client.js +87 -55
  373. package/dist/cli/utils/server-url.d.ts +1 -0
  374. package/dist/cli/utils/server-url.d.ts.map +1 -1
  375. package/dist/cli/utils/server-url.js +7 -0
  376. package/dist/config/uat-isolation.d.ts +140 -0
  377. package/dist/config/uat-isolation.d.ts.map +1 -0
  378. package/dist/config/uat-isolation.js +246 -0
  379. package/dist/lib/global-state.d.ts +12 -0
  380. package/dist/lib/global-state.d.ts.map +1 -0
  381. package/dist/lib/global-state.js +16 -0
  382. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
  383. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
  384. package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
  385. package/dist/lib/session/prompt-view.d.ts +228 -0
  386. package/dist/lib/session/prompt-view.d.ts.map +1 -0
  387. package/dist/lib/session/prompt-view.js +290 -0
  388. package/dist/lib/session/status-evidence-type.d.ts +16 -0
  389. package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
  390. package/dist/lib/session/status-evidence-type.js +2 -0
  391. package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
  392. package/dist/lib/tmux/legacy-session-alias.js +2 -1
  393. package/dist/server/locales/en/worktree.json +3 -1
  394. package/dist/server/locales/ja/worktree.json +3 -1
  395. package/dist/server/server.js +5 -3
  396. package/dist/server/src/cli/types/api-responses.js +4 -2
  397. package/dist/server/src/config/cli-tool-timing-config.js +1 -6
  398. package/dist/server/src/config/uat-isolation.js +246 -0
  399. package/dist/server/src/lib/assistant-response-saver.js +62 -3
  400. package/dist/server/src/lib/auto-yes-lifecycle.js +139 -0
  401. package/dist/server/src/lib/auto-yes-poller.js +465 -160
  402. package/dist/server/src/lib/auto-yes-state.js +2 -2
  403. package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
  404. package/dist/server/src/lib/cli-tools/base.js +151 -0
  405. package/dist/server/src/lib/cli-tools/codex.js +44 -80
  406. package/dist/server/src/lib/cli-tools/command-code.js +24 -56
  407. package/dist/server/src/lib/cli-tools/copilot.js +25 -67
  408. package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
  409. package/dist/server/src/lib/cli-tools/gemini.js +23 -73
  410. package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
  411. package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
  412. package/dist/server/src/lib/cli-tools/opencode.js +21 -85
  413. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
  414. package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
  415. package/dist/server/src/lib/detection/cli-patterns.js +374 -3047
  416. package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
  417. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
  418. package/dist/server/src/lib/detection/prompt-detector.js +2 -35
  419. package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
  420. package/dist/server/src/lib/detection/selection-shape.js +32 -520
  421. package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
  422. package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
  423. package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
  424. package/dist/server/src/lib/detection/status-detector.js +1 -1
  425. package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
  426. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
  427. package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
  428. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
  429. package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
  430. package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
  431. package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
  432. package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
  433. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
  434. package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
  435. package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
  436. package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
  437. package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
  438. package/dist/server/src/lib/detection/tools/command-code/detect.js +19 -50
  439. package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
  440. package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
  441. package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
  442. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
  443. package/dist/server/src/lib/detection/tools/context-above.js +20 -0
  444. package/dist/server/src/lib/detection/tools/copilot/detect.js +13 -35
  445. package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
  446. package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
  447. package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
  448. package/dist/server/src/lib/detection/tools/frame.js +36 -2
  449. package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
  450. package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
  451. package/dist/server/src/lib/detection/tools/live-region.js +204 -0
  452. package/dist/server/src/lib/detection/tools/opencode/detect.js +11 -49
  453. package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
  454. package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
  455. package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
  456. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +10 -42
  457. package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
  458. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
  459. package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
  460. package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
  461. package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
  462. package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
  463. package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
  464. package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
  465. package/dist/server/src/lib/global-state.js +16 -0
  466. package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
  467. package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
  468. package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
  469. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
  470. package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
  471. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
  472. package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
  473. package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
  474. package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
  475. package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
  476. package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
  477. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
  478. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
  479. package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
  480. package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
  481. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
  482. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
  483. package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
  484. package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
  485. package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
  486. package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
  487. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
  488. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
  489. package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
  490. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
  491. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
  492. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
  493. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
  494. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
  495. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
  496. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
  497. package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
  498. package/dist/server/src/lib/hooks/sources/registry.js +3 -2
  499. package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
  500. package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
  501. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
  502. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
  503. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
  504. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
  505. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
  506. package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
  507. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
  508. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
  509. package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
  510. package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
  511. package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
  512. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
  513. package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
  514. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
  515. package/dist/server/src/lib/polling/response-checker.js +666 -1162
  516. package/dist/server/src/lib/polling/response-dedup.js +3 -4
  517. package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
  518. package/dist/server/src/lib/polling/response-poller-core.js +54 -20
  519. package/dist/server/src/lib/polling/startup-screen.js +142 -0
  520. package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
  521. package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
  522. package/dist/server/src/lib/prompt-answer-sender.js +6 -5
  523. package/dist/server/src/lib/push/failure-episode-state.js +2 -2
  524. package/dist/server/src/lib/push/notification-dedup.js +3 -4
  525. package/dist/server/src/lib/push/prompt-card-state.js +2 -2
  526. package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
  527. package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
  528. package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -2
  529. package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
  530. package/dist/server/src/lib/relay/relay-delivery.js +6 -2
  531. package/dist/server/src/lib/relay/relay-readiness.js +38 -1
  532. package/dist/server/src/lib/relay/relay-triggers.js +9 -0
  533. package/dist/server/src/lib/resource-cleanup.js +6 -4
  534. package/dist/server/src/lib/response-cleaner.js +24 -1
  535. package/dist/server/src/lib/response-extractor.js +16 -0
  536. package/dist/server/src/lib/schedule-manager.js +8 -10
  537. package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
  538. package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
  539. package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
  540. package/dist/server/src/lib/session/agent-event-model.js +562 -0
  541. package/dist/server/src/lib/session/agent-event-record.js +10 -0
  542. package/dist/server/src/lib/session/agent-event-state.js +106 -1854
  543. package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
  544. package/dist/server/src/lib/session/agent-event-turn.js +811 -0
  545. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
  546. package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
  547. package/dist/server/src/lib/session/claude-executor.js +45 -5
  548. package/dist/server/src/lib/session/claude-session.js +21 -65
  549. package/dist/server/src/lib/session/cli-session.js +17 -0
  550. package/dist/server/src/lib/session/current-output-builder.js +454 -1103
  551. package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
  552. package/dist/server/src/lib/session/current-output-types.js +9 -0
  553. package/dist/server/src/lib/session/detection-divergence.js +55 -0
  554. package/dist/server/src/lib/session/global-session-constants.js +2 -13
  555. package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
  556. package/dist/server/src/lib/session/layer-disagreement.js +2 -2
  557. package/dist/server/src/lib/session/opencode-session-store.js +2 -1
  558. package/dist/server/src/lib/session/prompt-view.js +290 -0
  559. package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
  560. package/dist/server/src/lib/session/provisional-turn.js +3 -1
  561. package/dist/server/src/lib/session/send-user-message.js +1 -1
  562. package/dist/server/src/lib/session/session-starting-state.js +4 -6
  563. package/dist/server/src/lib/session/status-evidence-type.js +2 -0
  564. package/dist/server/src/lib/session/status-evidence.js +2 -2
  565. package/dist/server/src/lib/session/structured-status-merge.js +335 -0
  566. package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
  567. package/dist/server/src/lib/session/waiting-kind.js +3 -0
  568. package/dist/server/src/lib/session-cleanup.js +6 -8
  569. package/dist/server/src/lib/skills/install-plan.js +2 -1
  570. package/dist/server/src/lib/skills/snapshot-store.js +2 -2
  571. package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
  572. package/dist/server/src/lib/timer-manager.js +6 -8
  573. package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
  574. package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
  575. package/dist/server/src/lib/tmux/session-hooks.js +2 -1
  576. package/dist/server/src/lib/tmux/session-status-options.js +3 -3
  577. package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
  578. package/dist/server/src/lib/tmux/tmux.js +33 -59
  579. package/dist/server/src/lib/tui-accumulator.js +2 -2
  580. package/dist/server/src/lib/version-checker.js +6 -6
  581. package/dist/server/src/lib/ws-server.js +47 -11
  582. package/docs/en/user-guide/webapp-guide.md +27 -3
  583. package/package.json +1 -1
  584. package/release-notes/0.44.2.json +33 -0
  585. package/release-notes/0.44.3.json +82 -0
  586. package/scripts/hooks/cmate-agent-event.sh +18 -0
  587. package/.next/server/chunks/1068.js +0 -1
  588. package/.next/server/chunks/434.js +0 -1
  589. package/.next/server/chunks/5775.js +0 -1
  590. package/.next/server/chunks/6474.js +0 -14
  591. package/.next/server/chunks/650.js +0 -1
  592. package/.next/server/chunks/6661.js +0 -1
  593. package/.next/server/chunks/8583.js +0 -1
  594. package/.next/server/chunks/964.js +0 -1
  595. package/.next/server/chunks/967.js +0 -1
  596. package/.next/server/chunks/9882.js +0 -25
  597. package/.next/static/chunks/591-308072f285c34787.js +0 -1
  598. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
  599. package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +0 -1
  600. package/.next/static/css/38070d879efa1371.css +0 -1
  601. package/dist/server/src/lib/cli-tools/index.js +0 -41
  602. package/dist/server/src/lib/polling/global-session-poller.js +0 -140
  603. /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
  604. /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
@@ -44,6 +44,7 @@ const sources_1 = require("../../lib/hooks/sources");
44
44
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
45
45
  const session_generation_archive_1 = require("../../lib/session/session-generation-archive");
46
46
  const session_starting_state_1 = require("../../lib/session/session-starting-state");
47
+ const auto_yes_enter_fallback_state_1 = require("../../lib/polling/auto-yes-enter-fallback-state");
47
48
  const logger_1 = require("../../lib/logger");
48
49
  const logger = (0, logger_1.createLogger)('lib/session/agent-session-lifecycle');
49
50
  /**
@@ -79,6 +80,10 @@ function beginAgentSession(target, at = Date.now()) {
79
80
  (0, session_starting_state_1.markSessionStarting)(target.worktreeId, target.cliToolId, target.instanceId, at);
80
81
  const before = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
81
82
  (0, agent_event_state_1.beginAgentEventGeneration)(target.worktreeId, target.cliToolId, target.instanceId, at);
83
+ // Issue #3397: Auto-Yes's Enter belongs to the process whose screen it went
84
+ // to. A relaunch does not stop the Auto-Yes poller, so the record (and the
85
+ // poller's keys, through the epoch) are expired here, with the generation.
86
+ (0, auto_yes_enter_fallback_state_1.beginEnterFallbackSession)(target.worktreeId, target.cliToolId, target.instanceId);
82
87
  const after = (0, agent_event_state_1.getAgentEventDropCounts)(target.worktreeId, target.cliToolId, target.instanceId).decisionEvicted;
83
88
  const source = (0, sources_1.getAgentEventSource)(target.cliToolId);
84
89
  logger.info('agent-session-generation-begun', {
@@ -120,8 +125,12 @@ function beginAgentSession(target, at = Date.now()) {
120
125
  * does not import a settings generator: which file gets written, and whether
121
126
  * one gets written at all, is the source's business.
122
127
  *
123
- * Never throws — see `AgentEventSource.prepareLaunch`. A tool whose config
124
- * could not be written starts bare, which is the pre-#1722 status quo.
128
+ * Never throws outside UAT isolation — see `AgentEventSource.prepareLaunch`. A
129
+ * tool whose config could not be written starts bare, which is the pre-#1722
130
+ * status quo. Under `CM_UAT_ISOLATION=1` codex and antigravity throw instead
131
+ * (Issue #3360), and under `own-home` claude too when its settings directory
132
+ * is outside the dedicated user's HOME (Issue #3312), so call this before
133
+ * creating the tmux session.
125
134
  *
126
135
  * @param context - The instance, its executable, and the worktree it runs in
127
136
  * @returns The command, its environment, and the config file when one landed
@@ -0,0 +1,322 @@
1
+ "use strict";
2
+ /**
3
+ * Chat turn progress: the frames that carry the body of an open turn
4
+ * (Issue #3215).
5
+ *
6
+ * Moved verbatim out of `current-output-builder`, which re-exports every name
7
+ * it used to export, so an import from either module reads the same
8
+ * declaration. The comments came along unedited: where one says "this file" or
9
+ * "this module", it was written about `current-output-builder`.
10
+ *
11
+ * `publishChatTurnProgress` is exported for `buildCurrentOutput` and for
12
+ * nothing else; it is not part of what `current-output-builder` re-exports.
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || (function () {
31
+ var ownKeys = function(o) {
32
+ ownKeys = Object.getOwnPropertyNames || function (o) {
33
+ var ar = [];
34
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
35
+ return ar;
36
+ };
37
+ return ownKeys(o);
38
+ };
39
+ return function (mod) {
40
+ if (mod && mod.__esModule) return mod;
41
+ var result = {};
42
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
43
+ __setModuleDefault(result, mod);
44
+ return result;
45
+ };
46
+ })();
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.resetChatTurnProgressState = resetChatTurnProgressState;
49
+ exports.buildChatTurnProgress = buildChatTurnProgress;
50
+ exports.emitChatTurnProgress = emitChatTurnProgress;
51
+ exports.publishChatTurnProgress = publishChatTurnProgress;
52
+ const types_1 = require("../../lib/realtime/types");
53
+ const logger_1 = require("../../lib/logger");
54
+ const global_state_1 = require("../global-state");
55
+ // Issue #3215: the name is the one these lines have always been logged under.
56
+ // It is what an operator greps for, so it did not move with the code.
57
+ const logger = (0, logger_1.createLogger)('current-output-builder');
58
+ function newChatTurnProgressState() {
59
+ return {
60
+ version: 0,
61
+ askedAt: Number.NEGATIVE_INFINITY,
62
+ turnKey: null,
63
+ body: null,
64
+ loggedOutcome: null,
65
+ loggedTurnKey: null,
66
+ };
67
+ }
68
+ /**
69
+ * On `globalThis` for the reason every shared map in this subsystem is (#1736):
70
+ * under `next dev` the poller's bundle and the opencode subscription's bundle
71
+ * would each get a private copy, and two producers throttling against two
72
+ * different maps is no throttle at all.
73
+ */
74
+ const chatTurnProgressState = (0, global_state_1.getOrInitGlobal)('__chatTurnProgressState', () => new Map());
75
+ function chatTurnProgressKey(target) {
76
+ return `${target.worktreeId}:${target.cliToolId}:${target.instanceId ?? target.cliToolId}`;
77
+ }
78
+ /** Forget every instance's progress bookkeeping. Test seam. */
79
+ function resetChatTurnProgressState() {
80
+ chatTurnProgressState.clear();
81
+ }
82
+ /**
83
+ * Say once, at info, what happened to this instance's progress frames (Issue #2248).
84
+ *
85
+ * ## Why info, and why this file had none
86
+ *
87
+ * Every outcome here was `logger.debug`, including the two that mean the reader
88
+ * is watching a blank space: a push that threw, and a room with no subscribers.
89
+ * Issue #2248 was opened after a live session where the body reached the browser
90
+ * — or did not — and the server logs could not answer which, because debug is
91
+ * off in the builds people run. An unobservable push is a feature that can only
92
+ * be debugged by reproducing it.
93
+ *
94
+ * ## Why once
95
+ *
96
+ * The publisher runs on EVERY poll tick of a generating session. Logging each
97
+ * tick at info would put a line per second per agent into the operator's log and
98
+ * make the level useless, so this collapses a run of identical ticks into its
99
+ * first: the outcome and the turn it happened on are the identity, and a repeat
100
+ * of the pair says nothing the first line did not.
101
+ *
102
+ * The consequences of that identity, both deliberate:
103
+ *
104
+ * - **a new turn always logs**, because `turnKey` is part of the pair. That is
105
+ * the acceptance criterion — one info line per turn — and the reason
106
+ * `loggedTurnKey` exists at all rather than a bare boolean;
107
+ * - **a CHANGE of outcome always logs**, so "the subscriber left" and "it
108
+ * started failing" are both visible the tick they happen, without the
109
+ * steady state that follows repeating them.
110
+ *
111
+ * `no-subscribers` and `failed` carry no turn key — neither knows one; the first
112
+ * returns before the source is asked and the second is why there is no frame —
113
+ * so for them the pair is `(outcome, null)` and the run collapses to one line
114
+ * until something else happens.
115
+ */
116
+ function logChatTurnProgressOutcome(target, outcome, turnKey, extra = {}) {
117
+ const key = chatTurnProgressKey(target);
118
+ const state = chatTurnProgressState.get(key) ?? newChatTurnProgressState();
119
+ chatTurnProgressState.set(key, state);
120
+ if (state.loggedOutcome === outcome && state.loggedTurnKey === turnKey)
121
+ return;
122
+ state.loggedOutcome = outcome;
123
+ state.loggedTurnKey = turnKey;
124
+ // Written out rather than interpolated: these strings are what an operator
125
+ // greps the log for, and an interpolated name cannot be found in the source.
126
+ const message = outcome === 'published'
127
+ ? 'chat-turn-progress-published'
128
+ : outcome === 'no-subscribers'
129
+ ? 'chat-turn-progress-no-subscribers'
130
+ : 'chat-turn-progress-failed';
131
+ logger.info(message, {
132
+ worktreeId: target.worktreeId,
133
+ cliToolId: target.cliToolId,
134
+ instanceId: target.instanceId ?? target.cliToolId,
135
+ turnKey,
136
+ ...extra,
137
+ });
138
+ }
139
+ /**
140
+ * Decide whether this instance has a new progress frame, and build it.
141
+ *
142
+ * The single generator both tools go through, on the same argument
143
+ * {@link buildCurrentOutput} makes for the terminal payload: two producers of one
144
+ * wire shape drift, and the drift is invisible because each of them is
145
+ * individually correct. Three rules, in this order, and each of them is a way
146
+ * this feature goes wrong if it is missing:
147
+ *
148
+ * 1. **Throttle.** At most one *ask* per {@link CHAT_TURN_PROGRESS_MIN_INTERVAL_MS}
149
+ * per instance. It gates the ask rather than the send because the source is
150
+ * the expensive half (see {@link ChatTurnProgressSource}); a gate on the send
151
+ * alone would re-read a 4 MiB transcript to discover it had not changed.
152
+ * 2. **No-change suppression.** Same turn, same body → no frame. A reply that
153
+ * has stopped growing must not keep waking every subscribed browser.
154
+ * 3. **Monotonic version**, per instance and NOT per turn. A client drops
155
+ * anything at or below what it has already rendered, and restarting the
156
+ * counter on a new turn would make the first frame of turn N+1 look stale
157
+ * against the last frame of turn N.
158
+ *
159
+ * The body is bounded by {@link truncateChatTurnProgressBody}, whose cut is
160
+ * folded into `partial` together with the reader's own — see
161
+ * {@link ChatTurnProgressEvent.partial} for why one flag answers both.
162
+ *
163
+ * Never throws: a source that throws is a turn with nothing to show, not a
164
+ * broken poll tick.
165
+ *
166
+ * @param target - The instance
167
+ * @param source - Asked only when the throttle allows it
168
+ * @param now - Epoch ms; injected by the tests
169
+ * @returns The frame to broadcast, or null when there is nothing new to say
170
+ */
171
+ async function buildChatTurnProgress(target, source, now = Date.now()) {
172
+ const key = chatTurnProgressKey(target);
173
+ const state = chatTurnProgressState.get(key) ?? newChatTurnProgressState();
174
+ if (now - state.askedAt < types_1.CHAT_TURN_PROGRESS_MIN_INTERVAL_MS)
175
+ return null;
176
+ state.askedAt = now;
177
+ chatTurnProgressState.set(key, state);
178
+ let draft;
179
+ try {
180
+ draft = await source();
181
+ }
182
+ catch {
183
+ // The readers already promise never to throw; this is the belt for the
184
+ // dynamic import that reaches them.
185
+ return null;
186
+ }
187
+ if (!draft || draft.body.length === 0)
188
+ return null;
189
+ const bounded = (0, types_1.truncateChatTurnProgressBody)(draft.body);
190
+ if (draft.turnKey === state.turnKey && bounded.body === state.body)
191
+ return null;
192
+ state.turnKey = draft.turnKey;
193
+ state.body = bounded.body;
194
+ state.version += 1;
195
+ return {
196
+ type: types_1.CHAT_TURN_PROGRESS_EVENT_TYPE,
197
+ worktreeId: target.worktreeId,
198
+ cliToolId: target.cliToolId,
199
+ instanceId: target.instanceId ?? target.cliToolId,
200
+ turnKey: draft.turnKey,
201
+ body: bounded.body,
202
+ partial: bounded.truncated || draft.partial === true,
203
+ version: state.version,
204
+ done: false,
205
+ };
206
+ }
207
+ /**
208
+ * Build a progress frame and push it to the worktree room.
209
+ *
210
+ * Subscribers are checked FIRST, before the throttle state is touched and long
211
+ * before the source is asked, so a session nobody is watching costs one map
212
+ * lookup per tick — the same bargain `broadcastTerminalSnapshot` strikes, and
213
+ * the reason a 4 MiB transcript read does not happen for every claude session on
214
+ * the machine.
215
+ *
216
+ * The `ws-server` import is dynamic so this module's *other* callers — the
217
+ * `/current-output` route and `commandmate capture` — do not pull the WebSocket
218
+ * server into their graph just by building a payload.
219
+ *
220
+ * Never throws; a failed push is a moment of staleness on a surface that has the
221
+ * settled row coming anyway.
222
+ *
223
+ * @returns Whether a frame was broadcast
224
+ */
225
+ async function emitChatTurnProgress(target, source, now = Date.now()) {
226
+ try {
227
+ const { broadcast, hasRoomSubscribers } = await Promise.resolve().then(() => __importStar(require('../../lib/ws-server')));
228
+ if (!hasRoomSubscribers(target.worktreeId)) {
229
+ // Issue #2248. Reported, not silent: "the body never reached the browser"
230
+ // and "nobody was listening" look identical from a screenshot, and this is
231
+ // the only place that can tell them apart.
232
+ logChatTurnProgressOutcome(target, 'no-subscribers', null);
233
+ return false;
234
+ }
235
+ const event = await buildChatTurnProgress(target, source, now);
236
+ // Not logged: null is the throttle, an unchanged body, or a turn with no
237
+ // text yet — the quiet, correct majority of ticks.
238
+ if (!event)
239
+ return false;
240
+ broadcast(target.worktreeId, event);
241
+ logChatTurnProgressOutcome(target, 'published', event.turnKey, {
242
+ version: event.version,
243
+ bodyLength: event.body.length,
244
+ partial: event.partial,
245
+ });
246
+ return true;
247
+ }
248
+ catch (error) {
249
+ logChatTurnProgressOutcome(target, 'failed', null, {
250
+ error: error instanceof Error ? error.message : String(error),
251
+ });
252
+ return false;
253
+ }
254
+ }
255
+ /**
256
+ * Ask the tool that has a transcript for the body of its open turn (Issue #2199).
257
+ *
258
+ * claude only, and that is a statement about which tools have a *pull* reader
259
+ * rather than a list to extend by hand. opencode's body arrives on its own SSE
260
+ * stream and is published from `sources/opencode/history` at the moment a part
261
+ * lands — polling for it here would be a second producer of the same frames.
262
+ * codex and antigravity have neither, and stay on the indicator (#2197 / #2198).
263
+ *
264
+ * The reader is imported dynamically so `sources/claude/history` — and through
265
+ * it `fs/promises`, the session-pointer latch and `user-turn-recorder` — stays
266
+ * out of the module graph of the `/current-output` route and of `commandmate
267
+ * capture`, both of which reach this file for a payload and nothing else.
268
+ *
269
+ * ## Which half the caller waits for (Issue #2248)
270
+ *
271
+ * The caller awaits the CHEAP half — the worktree row and "is anybody watching"
272
+ * — and not the expensive one. That split is what `void` was protecting in the
273
+ * first place: the 4 MiB transcript read, the JSONL parse, the render and the
274
+ * broadcast still run detached, so no poll tick and no WebSocket snapshot waits
275
+ * on them.
276
+ *
277
+ * What awaiting the prelude buys is the reason this Issue exists: the line that
278
+ * says whether anybody received the frame is written while the tick it belongs
279
+ * to is still the tick in progress. Left inside the detached half it landed
280
+ * wherever the event loop happened to get to it, next to some unrelated
281
+ * request's output, which is not a log an operator can read backwards.
282
+ *
283
+ * Never throws: `emitChatTurnProgress` swallows, and so does this.
284
+ */
285
+ async function publishChatTurnProgress(db, worktreeId, cliToolId, instanceId) {
286
+ if (cliToolId !== 'claude')
287
+ return;
288
+ const target = { worktreeId, cliToolId, instanceId };
289
+ try {
290
+ // The slug the transcript directory is named after is a function of the
291
+ // worktree's path, so the row is what makes the file findable at all. Read
292
+ // before the throttle only because it is a single indexed lookup against a
293
+ // connection this function was handed; everything expensive is behind the
294
+ // gate.
295
+ const { getWorktreeById } = await Promise.resolve().then(() => __importStar(require('../../lib/db/worktree-db')));
296
+ const worktreePath = getWorktreeById(db, worktreeId)?.path;
297
+ if (!worktreePath)
298
+ return;
299
+ // Issue #2248. Hoisted out of `emitChatTurnProgress` — which still makes the
300
+ // same check for its other caller — so the answer, and the line that reports
301
+ // it, are settled before this function returns. Costs one Map lookup on the
302
+ // sessions nobody is watching, which is the bargain that was already being
303
+ // struck one frame later.
304
+ const { hasRoomSubscribers } = await Promise.resolve().then(() => __importStar(require('../../lib/ws-server')));
305
+ if (!hasRoomSubscribers(worktreeId)) {
306
+ logChatTurnProgressOutcome(target, 'no-subscribers', null);
307
+ return;
308
+ }
309
+ // Detached on purpose: everything past this point is the transcript read.
310
+ void emitChatTurnProgress(target, async () => {
311
+ const { readClaudeTurnProgress } = await Promise.resolve().then(() => __importStar(require('../../lib/hooks/sources/claude/history')));
312
+ return readClaudeTurnProgress({ worktreeId, cliToolId, instanceId: instanceId ?? cliToolId }, { worktreePath });
313
+ });
314
+ }
315
+ catch (error) {
316
+ // Issue #2248: the reader's half of the same failure — the worktree row or
317
+ // one of the dynamic imports — on the same once-per-run gate as the push's.
318
+ logChatTurnProgressOutcome(target, 'failed', null, {
319
+ error: error instanceof Error ? error.message : String(error),
320
+ });
321
+ }
322
+ }
@@ -28,14 +28,17 @@ exports.readCommandCodeStream = readCommandCodeStream;
28
28
  exports.describeCommandCodeBlockedToolCalls = describeCommandCodeBlockedToolCalls;
29
29
  exports.readExecutionLogWarning = readExecutionLogWarning;
30
30
  exports.describeCommandCodeFailure = describeCommandCodeFailure;
31
+ exports.uatIsolationHeadlessRefusal = uatIsolationHeadlessRefusal;
31
32
  exports.executeClaudeCommand = executeClaudeCommand;
32
33
  exports.getActiveProcesses = getActiveProcesses;
33
34
  const child_process_1 = require("child_process");
35
+ const uat_isolation_1 = require("../../config/uat-isolation");
34
36
  const env_sanitizer_1 = require("../../lib/security/env-sanitizer");
35
37
  const cli_patterns_1 = require("../../lib/detection/cli-patterns");
36
38
  const types_1 = require("../../lib/cli-tools/types");
37
39
  const schedule_config_1 = require("../../config/schedule-config");
38
40
  const opencode_executable_1 = require("../../lib/cli-tools/opencode-executable");
41
+ const global_state_1 = require("../global-state");
39
42
  // =============================================================================
40
43
  // Constants
41
44
  // =============================================================================
@@ -335,7 +338,15 @@ function buildCliArgs(message, cliToolId, permission, options) {
335
338
  }
336
339
  case 'claude':
337
340
  default:
338
- return ['-p', message, '--output-format', 'text', '--permission-mode', permission ?? 'acceptEdits'];
341
+ {
342
+ const args = ['-p', message, '--output-format', 'text', '--permission-mode', permission ?? 'acceptEdits'];
343
+ // Issue #3360: the interactive launch's restriction, for `claude -p` too
344
+ // (Schedules, daily summary): under UAT isolation the user's own
345
+ // settings.json — whose hooks post to production — is not loaded.
346
+ if ((0, uat_isolation_1.isUatIsolationEnabled)())
347
+ args.push('--setting-sources', uat_isolation_1.CLAUDE_UAT_SETTING_SOURCES);
348
+ return args;
349
+ }
339
350
  }
340
351
  }
341
352
  // =============================================================================
@@ -792,6 +803,33 @@ function describeCommandCodeFailure(exitCode, result) {
792
803
  * @param options - Additional options (e.g., model for vibe-local)
793
804
  * @returns Execution result with output and status
794
805
  */
806
+ /**
807
+ * Why a headless run of `cliToolId` may not happen under `CM_UAT_ISOLATION=1`,
808
+ * or null when it may (Issue #3360).
809
+ *
810
+ * `codex exec` and `agy -p` read the user's shared hook config —
811
+ * `$CODEX_HOME/hooks.json` and `~/.gemini/config/hooks.json`, the trusted files
812
+ * the production server wrote — whatever this process passes. A headless run is
813
+ * started with none of the correlation keys or receiver URLs an interactive
814
+ * launch puts in its environment, so those hooks fall back to the relay's
815
+ * default port, which is the production server's. There is no per-run way to turn
816
+ * them off or point them elsewhere, so in isolation the run is refused rather
817
+ * than allowed to reach production. claude's `-p` is not here: it gets
818
+ * `--setting-sources project,local` in {@link buildCliArgs}.
819
+ */
820
+ function uatIsolationHeadlessRefusal(cliToolId) {
821
+ if (!(0, uat_isolation_1.isUatIsolationEnabled)())
822
+ return null;
823
+ const shared = UAT_ISOLATION_SHARED_HOOK_FILES[cliToolId];
824
+ if (!shared)
825
+ return null;
826
+ return new uat_isolation_1.UatIsolationLaunchRefusedError(`a headless ${cliToolId} run`, `it reads the shared ${shared} and its hooks post to the relay's default port (the production server); see docs/user-guide/uat-isolation.md`, 'Headless codex / antigravity runs (Schedules, daily summary) cannot be isolated; skip those scenarios in a UAT.').message;
827
+ }
828
+ /** Tools whose headless run reads a hook config shared with production (Issue #3360). */
829
+ const UAT_ISOLATION_SHARED_HOOK_FILES = {
830
+ codex: '$CODEX_HOME/hooks.json',
831
+ antigravity: '~/.gemini/config/hooks.json',
832
+ };
795
833
  async function executeClaudeCommand(message, cwd, cliToolId = 'claude', permission, options) {
796
834
  // Validate cliToolId against whitelist [SEC-001]
797
835
  if (!exports.ALLOWED_CLI_TOOLS.has(cliToolId)) {
@@ -802,6 +840,11 @@ async function executeClaudeCommand(message, cwd, cliToolId = 'claude', permissi
802
840
  error: `Invalid CLI tool: ${cliToolId}`,
803
841
  };
804
842
  }
843
+ // Issue #3360: refused under UAT isolation before anything is spawned.
844
+ const refusal = uatIsolationHeadlessRefusal(cliToolId);
845
+ if (refusal) {
846
+ return { output: refusal, exitCode: null, status: 'failed', error: refusal };
847
+ }
805
848
  // Validate message length
806
849
  const truncatedMessage = message.length > exports.MAX_MESSAGE_LENGTH
807
850
  ? message.substring(0, exports.MAX_MESSAGE_LENGTH)
@@ -984,8 +1027,5 @@ async function executeClaudeCommand(message, cwd, cliToolId = 'claude', permissi
984
1027
  * Uses globalThis for hot reload persistence.
985
1028
  */
986
1029
  function getActiveProcesses() {
987
- if (!globalThis.__scheduleActiveProcesses) {
988
- globalThis.__scheduleActiveProcesses = new Map();
989
- }
990
- return globalThis.__scheduleActiveProcesses;
1030
+ return (0, global_state_1.getOrInitGlobal)('__scheduleActiveProcesses', () => new Map());
991
1031
  }
@@ -10,13 +10,11 @@ exports.isSessionHealthy = isSessionHealthy;
10
10
  exports.getSessionName = getSessionName;
11
11
  exports.isClaudeInstalled = isClaudeInstalled;
12
12
  exports.isClaudeRunning = isClaudeRunning;
13
- exports.getClaudeSessionState = getClaudeSessionState;
14
13
  exports.waitForPrompt = waitForPrompt;
15
14
  exports.startClaudeSession = startClaudeSession;
16
15
  exports.sendMessageToClaude = sendMessageToClaude;
17
16
  exports.captureClaudeOutput = captureClaudeOutput;
18
17
  exports.stopClaudeSession = stopClaudeSession;
19
- exports.restartClaudeSession = restartClaudeSession;
20
18
  const tmux_1 = require("../../lib/tmux/tmux");
21
19
  const cli_patterns_1 = require("../../lib/detection/cli-patterns");
22
20
  const tool_liveness_1 = require("../../lib/detection/tool-liveness");
@@ -28,7 +26,6 @@ const util_1 = require("util");
28
26
  const promises_1 = require("fs/promises");
29
27
  const logger_1 = require("../../lib/logger");
30
28
  const session_ownership_1 = require("../../lib/cli-tools/session-ownership");
31
- const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
32
29
  const session_name_1 = require("../../lib/cli-tools/session-name");
33
30
  const sources_1 = require("../../lib/hooks/sources");
34
31
  const hook_settings_generator_1 = require("../../lib/hooks/hook-settings-generator");
@@ -347,7 +344,7 @@ async function getClaudePath() {
347
344
  return cachedClaudePath;
348
345
  }
349
346
  catch {
350
- logger.info('claudepath-is-not-executable:envclaudepa');
347
+ logger.info('claude-path-env-not-executable');
351
348
  // Fall through to fallback paths
352
349
  }
353
350
  }
@@ -453,7 +450,7 @@ async function isSessionHealthy(sessionName) {
453
450
  async function ensureHealthySession(sessionName) {
454
451
  const result = await isSessionHealthy(sessionName);
455
452
  if (!result.healthy) {
456
- logger.warn('session-sessionname-unhealthy:resultreas');
453
+ logger.warn('claude-session-unhealthy');
457
454
  await (0, tmux_1.killSession)(sessionName);
458
455
  return false;
459
456
  }
@@ -528,35 +525,11 @@ async function isClaudeRunning(worktreeId, instanceId) {
528
525
  // S2-F001: await + extract .healthy to maintain boolean return type
529
526
  const result = await isSessionHealthy(sessionName);
530
527
  if (!result.healthy) {
531
- logger.warn('session-sessionname-unhealthy:resultreas');
528
+ logger.warn('claude-session-unhealthy');
532
529
  return false;
533
530
  }
534
531
  return true;
535
532
  }
536
- /**
537
- * Get Claude session state
538
- *
539
- * C-S3-002: This function checks tmux session existence via hasSession() but
540
- * does NOT perform health checks (unlike isClaudeRunning()). This is intentional:
541
- * getClaudeSessionState() is a lightweight status query for UI display purposes,
542
- * while isClaudeRunning() performs the more expensive health check for operational
543
- * decisions (e.g., whether to recreate a session).
544
- *
545
- * If health-aware state is needed, callers should use isClaudeRunning() instead
546
- * or call ensureHealthySession() separately.
547
- *
548
- * @param worktreeId - Worktree ID
549
- * @returns Session state information (existence-based, not health-based)
550
- */
551
- async function getClaudeSessionState(worktreeId, instanceId) {
552
- const sessionName = getSessionName(worktreeId, instanceId);
553
- const isRunning = await (0, tmux_1.hasSession)(sessionName);
554
- return {
555
- sessionName,
556
- isRunning,
557
- lastActivity: new Date(),
558
- };
559
- }
560
533
  /**
561
534
  * Wait for session to be at prompt state
562
535
  * Delegates to session-key-sender.ts (Issue #479: SRP split)
@@ -615,7 +588,7 @@ async function startClaudeSession(options) {
615
588
  const healthy = await ensureHealthySession(sessionName);
616
589
  if (healthy) {
617
590
  await (0, tmux_1.reconcileSessionGeometry)(sessionName);
618
- logger.info('claude-session-sessionname');
591
+ logger.info('claude-session-exists');
619
592
  return;
620
593
  }
621
594
  // If not healthy, ensureHealthySession() already killed the session.
@@ -639,16 +612,6 @@ async function startClaudeSession(options) {
639
612
  // making it the helper's job is what lets Phase 4-2…4-5 have one too.
640
613
  (0, agent_session_lifecycle_1.beginAgentSession)({ worktreeId, cliToolId: sources_1.CLAUDE_CLI_TOOL_ID, instanceId });
641
614
  try {
642
- // Create tmux session. Scrollback depth comes from the shared
643
- // TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
644
- // (Claude itself renders in the alternate screen and keeps history_size at 0,
645
- // so the limit is inert for this tool; it still applies to the bare shell.)
646
- await (0, tmux_1.createSession)({
647
- sessionName,
648
- workingDirectory: worktreePath,
649
- });
650
- // SF-S2-003: Sanitize environment after createSession, before launching Claude CLI
651
- await (0, session_key_sender_1.sanitizeSessionEnvironment)(sessionName);
652
615
  // Get Claude CLI path dynamically
653
616
  const claudePath = await getClaudePath();
654
617
  // Issue #1722: hand this session its own hooks config, so structured
@@ -668,6 +631,11 @@ async function startClaudeSession(options) {
668
631
  // Issue #1759: which config file gets written, and whether one is written
669
632
  // at all, belongs to the tool's `AgentEventSource` (S3/S4). Claude's
670
633
  // delegates to `buildClaudeLaunchCommand`, unchanged.
634
+ //
635
+ // Issue #3312: built BEFORE the tmux session, as codex's is. Under
636
+ // `CM_UAT_ISOLATION=own-home` the plan throws `UatIsolationLaunchRefusedError`
637
+ // (wrong user / HOME / write target, or a settings file it could not
638
+ // write), and a refused launch must not leave an empty pane behind.
671
639
  const baseLaunchCommand = (0, agent_session_lifecycle_1.buildAgentLaunchCommandLine)({
672
640
  target: { worktreeId, cliToolId: sources_1.CLAUDE_CLI_TOOL_ID, instanceId },
673
641
  executablePath: claudePath,
@@ -679,6 +647,16 @@ async function startClaudeSession(options) {
679
647
  // The flag outranks a `model` in the worktree's `.claude/settings.local.json`
680
648
  // and the operator's `~/.claude/settings.json` (measured on 2.1.278).
681
649
  const launchCommand = model === undefined ? baseLaunchCommand : `${baseLaunchCommand} --model ${(0, hook_settings_generator_1.shellQuote)(model)}`;
650
+ // Create tmux session. Scrollback depth comes from the shared
651
+ // TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
652
+ // (Claude itself renders in the alternate screen and keeps history_size at 0,
653
+ // so the limit is inert for this tool; it still applies to the bare shell.)
654
+ await (0, tmux_1.createSession)({
655
+ sessionName,
656
+ workingDirectory: worktreePath,
657
+ });
658
+ // SF-S2-003: Sanitize environment after createSession, before launching Claude CLI
659
+ await (0, session_key_sender_1.sanitizeSessionEnvironment)(sessionName);
682
660
  // Start Claude CLI in interactive mode using dynamically resolved path
683
661
  await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(launchCommand), true);
684
662
  // Wait for Claude to initialize with dynamic detection (OCP-001)
@@ -713,7 +691,7 @@ async function startClaudeSession(options) {
713
691
  if (!trustDialogOpen && cli_patterns_1.CLAUDE_PROMPT_PATTERN.test(cleanOutput)) {
714
692
  // Wait for stability after prompt detection (CONS-007, DOC-001)
715
693
  await new Promise((resolve) => setTimeout(resolve, exports.CLAUDE_POST_PROMPT_DELAY));
716
- logger.info('claude-initialized-in');
694
+ logger.info('claude-initialized');
717
695
  initialized = true;
718
696
  break;
719
697
  }
@@ -752,7 +730,7 @@ async function startClaudeSession(options) {
752
730
  if (!initialized) {
753
731
  throw new session_start_error_1.SessionStartTimeoutError('Claude Code', sessionName, exports.CLAUDE_INIT_TIMEOUT);
754
732
  }
755
- logger.info('started-claude-session:sessionname');
733
+ logger.info('started-claude-session');
756
734
  }
757
735
  catch (error) {
758
736
  // MF-S2-002: Clear cached path on all failures (harmless for non-path failures)
@@ -840,25 +818,3 @@ async function stopClaudeSession(worktreeId, instanceId) {
840
818
  (0, agent_event_state_1.discardAgentEventState)(worktreeId, 'claude', instanceId);
841
819
  return stopped;
842
820
  }
843
- /**
844
- * Restart a Claude session
845
- *
846
- * @param options - Session options
847
- *
848
- * @example
849
- * ```typescript
850
- * await restartClaudeSession({
851
- * worktreeId: 'feature-foo',
852
- * worktreePath: '/path/to/worktree',
853
- * });
854
- * ```
855
- */
856
- async function restartClaudeSession(options) {
857
- const { worktreeId, instanceId } = options;
858
- // Stop existing session
859
- await stopClaudeSession(worktreeId, instanceId);
860
- // Wait a moment before restarting
861
- await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.CLAUDE_RESTART_DELAY_MS));
862
- // Start new session
863
- await startClaudeSession(options);
864
- }
@@ -13,6 +13,7 @@
13
13
  */
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.isSessionRunning = isSessionRunning;
16
+ exports.getSessionPresence = getSessionPresence;
16
17
  exports.captureSessionOutput = captureSessionOutput;
17
18
  exports.captureSessionOutputFresh = captureSessionOutputFresh;
18
19
  exports.getSessionName = getSessionName;
@@ -29,6 +30,7 @@ const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
29
30
  // zero"), and this module already imports from `lib/tmux/**` above.
30
31
  const session_hooks_1 = require("../../lib/tmux/session-hooks");
31
32
  const session_status_options_1 = require("../../lib/tmux/session-status-options");
33
+ const tmux_1 = require("../../lib/tmux/tmux");
32
34
  const tmux_session_surface_1 = require("./tmux-session-surface");
33
35
  const logger = (0, logger_1.createLogger)('cli-session');
34
36
  function getDefaultTransport() {
@@ -52,6 +54,21 @@ async function isSessionRunning(worktreeId, cliToolId, instanceId) {
52
54
  const { sessionName } = resolveSessionContext(worktreeId, cliToolId, instanceId);
53
55
  return getDefaultTransport().sessionExists(sessionName);
54
56
  }
57
+ /**
58
+ * Whether the CLI tool session exists, keeping "could not tell" apart from
59
+ * "absent" (Issue #3329). Asks tmux directly rather than through the transport:
60
+ * both transports answer `sessionExists` with the same `tmux has-session`, and
61
+ * that boolean is exactly what loses the difference.
62
+ *
63
+ * @param worktreeId - Worktree ID
64
+ * @param cliToolId - CLI tool ID
65
+ * @param instanceId - Optional agent instance ID (defaults to primary)
66
+ * @returns `present`, `absent`, or `unknown`
67
+ */
68
+ async function getSessionPresence(worktreeId, cliToolId, instanceId) {
69
+ const { sessionName } = resolveSessionContext(worktreeId, cliToolId, instanceId);
70
+ return (0, tmux_1.probeSession)(sessionName);
71
+ }
55
72
  /**
56
73
  * Capture CLI session output (cache-backed)
57
74
  *