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
@@ -34,6 +34,7 @@
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.claudeAgentEventSource = void 0;
36
36
  exports.encodeClaudeVerdict = encodeClaudeVerdict;
37
+ const uat_isolation_1 = require("../../../../config/uat-isolation");
37
38
  const agent_event_types_1 = require("../../../../lib/hooks/agent-event-types");
38
39
  const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
39
40
  const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
@@ -42,6 +43,7 @@ const define_source_1 = require("../define-source");
42
43
  const event_mapper_1 = require("../event-mapper");
43
44
  const hook_event_vocabulary_1 = require("../hook-event-vocabulary");
44
45
  const model_switch_1 = require("./model-switch");
46
+ const queued_notice_1 = require("./queued-notice");
45
47
  const tool_id_1 = require("./tool-id");
46
48
  /**
47
49
  * The no-decision body, byte for byte what the #1721 spike returned for D5.
@@ -158,6 +160,9 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
158
160
  // the latch. `extractModel` runs before `modelFields`, and answers null for
159
161
  // every other event so the flat lookup above is unchanged for them.
160
162
  extractModel: model_switch_1.extractClaudeSwitchedModel,
163
+ // Issue #3330. A background-task notice attached to the running turn fires
164
+ // `UserPromptSubmit` too, and continues that turn rather than opening one.
165
+ promptJoinsOpenTurn: queued_notice_1.isClaudeQueuedNoticePrompt,
161
166
  // S2.
162
167
  extractDetail: hook_event_vocabulary_1.extractSnakeCaseEventDetail,
163
168
  // S7. Both parsers are strict and answer null for anything they cannot vouch
@@ -171,22 +176,47 @@ exports.claudeAgentEventSource = (0, define_source_1.definePushHookSource)({
171
176
  // writes the settings file, falls back to the bare path on any failure, and is
172
177
  // covered byte-for-byte by `tests/unit/hooks/hook-settings-generator.test.ts`.
173
178
  prepareLaunch: ({ target, executablePath }) => {
174
- const command = (0, hook_settings_generator_1.buildClaudeLaunchCommand)(executablePath, {
179
+ // Issue #3312: under `own-home` the settings file goes in only once its
180
+ // directory and the file itself check out inside the dedicated user's
181
+ // HOME; else the launch is refused.
182
+ const ownHome = (0, uat_isolation_1.getUatIsolationMode)() === 'own-home';
183
+ const hookTarget = {
175
184
  worktreeId: target.worktreeId,
176
185
  instanceId: target.instanceId,
177
186
  cliToolId: target.cliToolId,
178
- });
187
+ };
188
+ if ((0, hook_settings_generator_1.isHookInjectionEnabled)()) {
189
+ (0, uat_isolation_1.assertUatOwnHomeWriteTargets)(tool_id_1.CLAUDE_CLI_TOOL_ID, [
190
+ (0, hook_settings_generator_1.getHookSettingsDirectory)(),
191
+ (0, hook_settings_generator_1.getHookSettingsPath)(hookTarget),
192
+ ]);
193
+ }
194
+ const baseCommand = (0, hook_settings_generator_1.buildClaudeLaunchCommand)(executablePath, hookTarget);
195
+ // Issue #3312: under `own-home` a claude without its settings file is a
196
+ // check that cannot see `hook_stop`, so injection switched off or a file
197
+ // that could not be written refuses the launch. `1` and normal mode keep
198
+ // starting the bare executable.
199
+ if (ownHome && baseCommand === executablePath) {
200
+ throw new uat_isolation_1.UatIsolationLaunchRefusedError(tool_id_1.CLAUDE_CLI_TOOL_ID, (0, hook_settings_generator_1.isHookInjectionEnabled)() ? 'the hook settings file could not be written' : 'CM_AGENT_HOOKS_INJECT=0', (0, hook_settings_generator_1.isHookInjectionEnabled)()
201
+ ? 'Make CM_AGENT_HOOKS_DIR writable by the dedicated user.'
202
+ : 'Do not combine CM_AGENT_HOOKS_INJECT=0 with own-home.');
203
+ }
179
204
  // The path is reported only when the command actually names it. Injection
180
205
  // can be switched off (`CM_AGENT_HOOKS_INJECT=0`) or fail to write, and both
181
206
  // return the bare executable — claiming a settings file in that case would
182
207
  // be telling the caller about a file that is not there.
183
- const settingsPath = (0, hook_settings_generator_1.isHookInjectionEnabled)() && command !== executablePath
208
+ const settingsPath = (0, hook_settings_generator_1.isHookInjectionEnabled)() && baseCommand !== executablePath
184
209
  ? (0, hook_settings_generator_1.getHookSettingsPath)({
185
210
  worktreeId: target.worktreeId,
186
211
  instanceId: target.instanceId,
187
212
  cliToolId: target.cliToolId,
188
213
  })
189
214
  : null;
215
+ // Issue #3360: in UAT isolation the user's own `~/.claude/settings.json`
216
+ // (whose hooks post to production) is not loaded; `--settings` still is.
217
+ const command = (0, uat_isolation_1.isUatIsolationEnabled)()
218
+ ? `${baseCommand} --setting-sources ${uat_isolation_1.CLAUDE_UAT_SETTING_SOURCES}`
219
+ : baseCommand;
190
220
  // Empty, and the only source for which that is uninteresting: `--settings`
191
221
  // carries the correlation keys inside the file, so Claude never needed the
192
222
  // environment prefix the other four sources reached for (#1846).
@@ -297,18 +297,12 @@ function readToolDetail(input) {
297
297
  for (const field of CLAUDE_TOOL_DETAIL_FIELDS) {
298
298
  const value = (0, event_mapper_1.readStringField)(input, field);
299
299
  if (value)
300
- return boundToolDetail(collapseToLine(value));
300
+ return boundToolDetail((0, turn_body_1.collapseToLine)(value));
301
301
  }
302
302
  return null;
303
303
  }
304
- /** A tool detail on one line. A heredoc `command` puts newlines in it. */
305
- function collapseToLine(value) {
306
- return value.replace(/\s+/g, ' ').trim();
307
- }
308
304
  function boundToolDetail(value) {
309
- return value.length <= exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH
310
- ? value
311
- : `${value.slice(0, exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH - 1)}…`;
305
+ return (0, turn_body_1.boundDetail)(value, exports.MAX_CLAUDE_TOOL_DETAIL_LENGTH);
312
306
  }
313
307
  /**
314
308
  * Read one parsed transcript line.
@@ -787,11 +781,7 @@ function renderClaudeTurn(turn) {
787
781
  unknown.add(block.type);
788
782
  }
789
783
  let body = (0, turn_body_1.separateTurnBody)(rendered).body;
790
- if (body.length > exports.MAX_CLAUDE_TURN_BODY_LENGTH) {
791
- body =
792
- body.slice(0, exports.MAX_CLAUDE_TURN_BODY_LENGTH - exports.CLAUDE_TURN_TRUNCATION_MARKER.length) +
793
- exports.CLAUDE_TURN_TRUNCATION_MARKER;
794
- }
784
+ body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_CLAUDE_TURN_BODY_LENGTH, exports.CLAUDE_TURN_TRUNCATION_MARKER);
795
785
  return {
796
786
  sessionId: turn.sessionId,
797
787
  promptUuid: turn.promptUuid,
@@ -95,6 +95,7 @@ exports.isCodexRolloutFileFor = isCodexRolloutFileFor;
95
95
  exports.findCodexRolloutPath = findCodexRolloutPath;
96
96
  exports.captureCodexTranscriptTurn = captureCodexTranscriptTurn;
97
97
  exports.resolveCodexTranscriptPath = resolveCodexTranscriptPath;
98
+ const global_state_1 = require("../../../../lib/global-state");
98
99
  const promises_1 = require("fs/promises");
99
100
  const os_1 = require("os");
100
101
  const path_1 = require("path");
@@ -104,6 +105,7 @@ const user_turn_recorder_1 = require("../../../../lib/history/user-turn-recorder
104
105
  const assistant_response_saver_1 = require("../../../../lib/assistant-response-saver");
105
106
  const logger_1 = require("../../../../lib/logger");
106
107
  const agent_transcript_1 = require("../../../../types/agent-transcript");
108
+ const transcript_history_1 = require("../transcript-history");
107
109
  const transcript_1 = require("./transcript");
108
110
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/codex/history');
109
111
  /**
@@ -151,7 +153,7 @@ const CODEX_SESSION_ID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-
151
153
  * codex sends `session_id` on every event it delivers — but a future one that
152
154
  * did not would otherwise blank the pointer mid-session.
153
155
  */
154
- const sessionPointers = (globalThis.__codexTranscriptSessions ??= new Map());
156
+ const sessionPointers = (0, global_state_1.getOrInitGlobal)('__codexTranscriptSessions', () => new Map());
155
157
  /**
156
158
  * Where each session id's rollout file was found.
157
159
  *
@@ -161,7 +163,7 @@ const sessionPointers = (globalThis.__codexTranscriptSessions ??= new Map());
161
163
  * session started, which is not derivable from the id — and a scan of 1,791
162
164
  * files on every finished turn is not something to do twice.
163
165
  */
164
- const rolloutPaths = (globalThis.__codexTranscriptPaths ??= new Map());
166
+ const rolloutPaths = (0, global_state_1.getOrInitGlobal)('__codexTranscriptPaths', () => new Map());
165
167
  function keyOf(target) {
166
168
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
167
169
  }
@@ -185,24 +187,7 @@ function resetCodexTranscriptSessions() {
185
187
  * keeps being the only record, which is merely the status quo.
186
188
  */
187
189
  async function resolveCodexSessionId(target) {
188
- const key = keyOf(target);
189
- try {
190
- const { getLastAgentEvent } = await Promise.resolve().then(() => __importStar(require('../../../../lib/session/agent-event-state')));
191
- const sessionId = getLastAgentEvent(target.worktreeId, target.cliToolId, target.instanceId)?.sessionId;
192
- if (typeof sessionId === 'string' && sessionId.length > 0) {
193
- sessionPointers.set(key, sessionId);
194
- return sessionId;
195
- }
196
- }
197
- catch (error) {
198
- // A state module that cannot be reached is one that knows no session id.
199
- logger.debug('codex-transcript-session-lookup-failed', {
200
- worktreeId: target.worktreeId,
201
- instanceId: target.instanceId ?? target.cliToolId,
202
- error: error instanceof Error ? error.message : String(error),
203
- });
204
- }
205
- return sessionPointers.get(key) ?? null;
190
+ return (0, transcript_history_1.resolveSessionIdFromEvents)(target, sessionPointers, keyOf(target), logger, 'codex-transcript-session-lookup-failed');
206
191
  }
207
192
  /**
208
193
  * `$CODEX_HOME`, or `~/.codex`.
@@ -234,15 +219,7 @@ function codexSessionsRoot(codexHome) {
234
219
  * @returns The resolved path, or null when it is not acceptable
235
220
  */
236
221
  function acceptCodexRolloutPath(codexHome, candidate) {
237
- if (!candidate.endsWith(transcript_1.CODEX_ROLLOUT_EXTENSION))
238
- return null;
239
- if (candidate.includes('\0'))
240
- return null;
241
- const root = (0, path_1.resolve)(codexSessionsRoot(codexHome));
242
- const resolved = (0, path_1.resolve)(candidate);
243
- if (resolved !== root && !resolved.startsWith(root + path_1.sep))
244
- return null;
245
- return resolved;
222
+ return (0, transcript_history_1.acceptPathUnderRoot)(codexSessionsRoot(codexHome), transcript_1.CODEX_ROLLOUT_EXTENSION, candidate);
246
223
  }
247
224
  /** Whether a file name is the rollout of this session. */
248
225
  function isCodexRolloutFileFor(name, sessionId) {
@@ -440,7 +417,7 @@ async function captureCodexTranscriptTurn(target, capture = {}, report) {
440
417
  let captured = false;
441
418
  for (let index = 0; index < pending.turns.length; index += 1) {
442
419
  const turn = pending.turns[index];
443
- captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.turnId) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), windowFacts, report);
420
+ captured = await writeCodexTurn(target, turn, (0, transcript_1.renderCodexTurn)(turn), (0, transcript_history_1.resolveAssistantTimestampMs)(turn, userRows[index], lastRecordAt.get(turn.turnId) ?? 0, (0, transcript_history_1.nextTurnOpensAt)(pending.turns, userRows, index)), windowFacts, report);
444
421
  }
445
422
  if (captured) {
446
423
  // Issue #2437: History now holds this turn as the agent's own Markdown.
@@ -506,26 +483,7 @@ function firstCodexRecordAt(records) {
506
483
  * @param turns - Every turn in the window, oldest first
507
484
  */
508
485
  async function selectUnwrittenCodexTurns(target, turns) {
509
- const [{ getDbInstance }, { findMessageByRequestId }] = await Promise.all([
510
- Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
511
- Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
512
- ]);
513
- const db = getDbInstance();
514
- for (let index = turns.length - 1; index >= 0; index -= 1) {
515
- const requestId = (0, agent_transcript_1.codexTurnRequestId)(turns[index].turnId);
516
- if (!findMessageByRequestId(db, target.worktreeId, requestId))
517
- continue;
518
- return {
519
- turns: turns.slice(index + 1),
520
- previousStartedAt: turns[index].startedAt,
521
- anchored: true,
522
- };
523
- }
524
- return {
525
- turns: turns.slice(-1),
526
- previousStartedAt: turns.length > 1 ? turns[turns.length - 2].startedAt : 0,
527
- anchored: false,
528
- };
486
+ return (0, transcript_history_1.selectUnwrittenTurns)(target, turns, (turn) => (0, agent_transcript_1.codexTurnRequestId)(turn.turnId));
529
487
  }
530
488
  /**
531
489
  * The rollout file for this session, or null.
@@ -537,7 +495,7 @@ async function selectUnwrittenCodexTurns(target, turns) {
537
495
  async function locateCodexRollout(codexHome, sessionId) {
538
496
  const memoKey = `${codexHome}\0${sessionId}`;
539
497
  const memoised = rolloutPaths.get(memoKey);
540
- if (memoised && (await isReadableFile(memoised)))
498
+ if (memoised && (await (0, transcript_history_1.isReadableFile)(memoised)))
541
499
  return memoised;
542
500
  if (memoised)
543
501
  rolloutPaths.delete(memoKey);
@@ -550,14 +508,6 @@ async function locateCodexRollout(codexHome, sessionId) {
550
508
  rolloutPaths.set(memoKey, accepted);
551
509
  return accepted;
552
510
  }
553
- async function isReadableFile(path) {
554
- try {
555
- return (await (0, promises_1.stat)(path)).isFile();
556
- }
557
- catch {
558
- return false;
559
- }
560
- }
561
511
  /**
562
512
  * Record every prompt this turn answers, before the reply is written (#2196).
563
513
  *
@@ -598,7 +548,7 @@ async function recordCodexUserTurns(target, turn, previousStartedAt = 0) {
598
548
  }
599
549
  return last;
600
550
  }
601
- /**
551
+ /*
602
552
  * When the assistant row for this turn is dated.
603
553
  *
604
554
  * **The turn's LAST record, not its first (Issue #2273).** #2197 dated the reply
@@ -626,13 +576,6 @@ async function recordCodexUserTurns(target, turn, previousStartedAt = 0) {
626
576
  * @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
627
577
  * this is the newest turn in the window
628
578
  */
629
- function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
630
- const earliest = userRow.timestampMs === null
631
- ? turn.startedAt
632
- : Math.max(turn.startedAt, userRow.timestampMs + 1);
633
- const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
634
- return Math.max(earliest, Math.min(lastRecordAt, latest));
635
- }
636
579
  /**
637
580
  * When each turn's last record was written (Issue #2273).
638
581
  *
@@ -660,7 +603,7 @@ function lastCodexRecordAt(records) {
660
603
  }
661
604
  return at;
662
605
  }
663
- /**
606
+ /*
664
607
  * The instant the next pending turn's prompt row carries, or null (Issue #2273).
665
608
  *
666
609
  * The user row's own timestamp when there is one, because that is what History
@@ -669,12 +612,6 @@ function lastCodexRecordAt(records) {
669
612
  * prompt is while the previous turn was still running. The turn's start is the
670
613
  * fallback for a turn that produced no row at all.
671
614
  */
672
- function nextTurnOpensAt(turns, userRows, index) {
673
- const next = turns[index + 1];
674
- if (!next)
675
- return null;
676
- return userRows[index + 1]?.timestampMs ?? next.startedAt;
677
- }
678
615
  /**
679
616
  * Write one rendered turn, unless it is already there.
680
617
  *
@@ -63,7 +63,9 @@
63
63
  * start. Those post too, with the environment variables unset; the relay omits
64
64
  * the correlation keys it does not have and the receiver falls back to
65
65
  * resolving the worktree from `cwd`, which is exactly the hand-configured
66
- * behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off.
66
+ * behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off;
67
+ * `CM_UAT_ISOLATION=1` keeps it on without writing any shared file (Issue #3360,
68
+ * {@link reuseCodexHookSettingsReadOnly}).
67
69
  *
68
70
  * ## The shared app-server daemon (Issue #2874)
69
71
  *
@@ -96,12 +98,15 @@ exports.buildCodexPermissionHookCommand = buildCodexPermissionHookCommand;
96
98
  exports.buildCodexHookSettings = buildCodexHookSettings;
97
99
  exports.mergeCodexHookSettings = mergeCodexHookSettings;
98
100
  exports.writeCodexHookSettings = writeCodexHookSettings;
101
+ exports.inspectCodexSharedHooksReadOnly = inspectCodexSharedHooksReadOnly;
102
+ exports.reuseCodexHookSettingsReadOnly = reuseCodexHookSettingsReadOnly;
99
103
  exports.buildCodexLaunchPlan = buildCodexLaunchPlan;
100
104
  const child_process_1 = require("child_process");
101
105
  const fs_1 = require("fs");
102
106
  const os_1 = require("os");
103
107
  const path_1 = require("path");
104
108
  const safe_directory_1 = require("../../../../config/safe-directory");
109
+ const uat_isolation_1 = require("../../../../config/uat-isolation");
105
110
  const types_1 = require("../../../../lib/cli-tools/types");
106
111
  const env_1 = require("../../../../lib/env");
107
112
  const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
@@ -313,6 +318,13 @@ function isCodexHookTrustBypassEnabled() {
313
318
  function shouldTrustCodexHooks(worktreePath) {
314
319
  if (resolveCodexHookTrustPolicy() === 'never')
315
320
  return false;
321
+ // Issue #3360: a grant is codex writing the user's own `config.toml`, which a
322
+ // UAT / daily-check server must not cause. Declined, the hooks stay inert for
323
+ // that session — the "no hooks" case the UAT already has to tolerate.
324
+ // Issue #3312: under `own-home` the `config.toml` is the dedicated user's and
325
+ // was checked with the rest of `$CODEX_HOME` before the launch, so it may.
326
+ if ((0, uat_isolation_1.getUatIsolationMode)() === 'shared-read-only')
327
+ return false;
316
328
  try {
317
329
  // codex reads `<cwd>/.codex/hooks.json` as well as the home one, and a
318
330
  // review that includes a hook from the repository is a review this server
@@ -531,6 +543,10 @@ function mergeCodexHookSettings(existing, generated) {
531
543
  base.hooks = merged;
532
544
  return base;
533
545
  }
546
+ /** The bytes `hooks.json` should hold, given what it holds now. */
547
+ function renderCodexHookSettings(existing, options) {
548
+ return `${JSON.stringify(mergeCodexHookSettings(existing, buildCodexHookSettings(options)), null, 2)}\n`;
549
+ }
534
550
  /**
535
551
  * Write the hooks file, and answer where it is.
536
552
  *
@@ -543,6 +559,21 @@ function mergeCodexHookSettings(existing, generated) {
543
559
  */
544
560
  function writeCodexHookSettings(options = {}) {
545
561
  const settingsPath = getCodexHooksPath(options);
562
+ // Issue #3360: UAT isolation never writes the shared files. See
563
+ // {@link reuseCodexHookSettingsReadOnly}. Issue #3312: `own-home` writes
564
+ // them, after checking every path below is inside the dedicated user's HOME
565
+ // (and refuses the launch when one is not).
566
+ const codexHome = getCodexHome(options);
567
+ const relayPath = (0, relay_install_1.getCodexRelayInstallPath)(codexHome);
568
+ const policy = (0, uat_isolation_1.sharedHookWritePolicy)('codex', [
569
+ codexHome,
570
+ settingsPath,
571
+ relayPath,
572
+ (0, relay_install_1.getCodexRelayStagingPath)(relayPath),
573
+ (0, path_1.join)(codexHome, 'config.toml'),
574
+ ]);
575
+ if (policy === 'read-only')
576
+ return reuseCodexHookSettingsReadOnly(options);
546
577
  // Issue #2315: put the relay where the generated file can name it without
547
578
  // naming a checkout, BEFORE the content is built — `buildCodexHookSettings`
548
579
  // only reads what is installed, so an install that had not happened yet would
@@ -550,7 +581,15 @@ function writeCodexHookSettings(options = {}) {
550
581
  // between. Best-effort by construction: the installer never throws, and a
551
582
  // machine where it cannot write simply keeps whatever copy is already there.
552
583
  if (options.relayScriptPath === undefined) {
553
- (0, relay_install_1.installCodexRelayScript)(getCodexHome(options), (0, hook_settings_generator_1.resolveRelayScriptPath)());
584
+ if ((0, uat_isolation_1.getUatIsolationMode)() === 'own-home') {
585
+ // Issue #3312: a relay that could not be updated is a failed
586
+ // preparation here (the caller refuses the launch), not an older relay
587
+ // the check would quietly run against.
588
+ (0, relay_install_1.installCodexRelayScriptOrThrow)(codexHome, (0, hook_settings_generator_1.resolveRelayScriptPath)());
589
+ }
590
+ else {
591
+ (0, relay_install_1.installCodexRelayScript)(codexHome, (0, hook_settings_generator_1.resolveRelayScriptPath)());
592
+ }
554
593
  }
555
594
  let existing = null;
556
595
  let previous = null;
@@ -569,19 +608,100 @@ function writeCodexHookSettings(options = {}) {
569
608
  return null;
570
609
  }
571
610
  }
572
- const content = `${JSON.stringify(mergeCodexHookSettings(existing, buildCodexHookSettings(options)), null, 2)}\n`;
611
+ const content = renderCodexHookSettings(existing, options);
573
612
  if (previous === content)
574
613
  return settingsPath;
575
614
  (0, fs_1.mkdirSync)((0, path_1.dirname)(settingsPath), { recursive: true, mode: 0o700 });
576
615
  (0, fs_1.writeFileSync)(settingsPath, content, { mode: 0o600 });
577
616
  return settingsPath;
578
617
  }
618
+ /**
619
+ * Whether the shared `$CODEX_HOME/hooks.json` may be used, unwritten, by a
620
+ * server in UAT isolation mode (`CM_UAT_ISOLATION=1`, Issue #3360).
621
+ *
622
+ * `$CODEX_HOME/hooks.json`, the installed relay and the hook trust in
623
+ * `config.toml` are shared with the user's production server and live beside
624
+ * codex's login, so they cannot be moved for a UAT either. They do not need to
625
+ * be written to work for one: the file holds no port, worktree or instance —
626
+ * {@link buildCodexLaunchPlan} hands those to the session in its environment —
627
+ * so a file production has already written delivers this session's events to
628
+ * THIS server.
629
+ *
630
+ * Usable means exactly one thing: the file is byte-identical to what this build
631
+ * writes into an EMPTY file. Comparing against the merge with what is there
632
+ * ({@link mergeCodexHookSettings}) would not do — the merge keeps the user's own
633
+ * handlers, so a file holding a hand-written hook that posts straight to
634
+ * production would compare equal and run in the UAT session. So these are all
635
+ * unusable, each with its reason: no file, an unreadable one, hooks or keys
636
+ * CommandMate did not write, a file this build would change (a newer or older
637
+ * CommandMate), or an installed relay whose bytes differ from the one this build
638
+ * ships (the command string would match while running another script).
639
+ */
640
+ function inspectCodexSharedHooksReadOnly(options = {}) {
641
+ const settingsPath = getCodexHooksPath(options);
642
+ if (options.relayScriptPath === undefined) {
643
+ const shipped = (0, hook_settings_generator_1.resolveRelayScriptPath)();
644
+ const installed = (0, relay_install_1.getCodexRelayInstallPath)(getCodexHome(options));
645
+ try {
646
+ if (shipped &&
647
+ (0, fs_1.existsSync)(installed) &&
648
+ (0, fs_1.readFileSync)(shipped, 'utf8') !== (0, fs_1.readFileSync)(installed, 'utf8')) {
649
+ logger.info('codex-hooks-shared-relay-differs-readonly', { installed });
650
+ return { usable: false, reason: `the installed relay ${installed} differs from the one this build ships`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
651
+ }
652
+ }
653
+ catch {
654
+ return { usable: false, reason: `the installed relay ${installed} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
655
+ }
656
+ }
657
+ try {
658
+ if (!(0, fs_1.existsSync)(settingsPath)) {
659
+ logger.info('codex-hooks-shared-absent-readonly', { settingsPath });
660
+ return { usable: false, reason: `${settingsPath} does not exist`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
661
+ }
662
+ const previous = (0, fs_1.readFileSync)(settingsPath, 'utf8');
663
+ if (previous === renderCodexHookSettings(null, options)) {
664
+ return { usable: true, settingsPath };
665
+ }
666
+ if (previous === renderCodexHookSettings(JSON.parse(previous), options)) {
667
+ logger.info('codex-hooks-shared-foreign-readonly', { settingsPath });
668
+ return {
669
+ usable: false,
670
+ reason: `${settingsPath} also holds hooks (or keys) CommandMate did not write, which would run in the UAT session`,
671
+ fix: 'Skip codex scenarios in this UAT, or run it where the shared hooks file holds only the hooks CommandMate writes.',
672
+ };
673
+ }
674
+ logger.info('codex-hooks-shared-differs-readonly', { settingsPath });
675
+ return { usable: false, reason: `${settingsPath} differs from what this build writes`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
676
+ }
677
+ catch (error) {
678
+ logger.warn('codex-hooks-config-unreadable', {
679
+ settingsPath,
680
+ error: error instanceof Error ? error.message : String(error),
681
+ });
682
+ return { usable: false, reason: `${settingsPath} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
683
+ }
684
+ }
685
+ /**
686
+ * {@link writeCodexHookSettings} for a server in UAT isolation mode: the path
687
+ * when {@link inspectCodexSharedHooksReadOnly} finds the shared file usable,
688
+ * else null — which the launch plan turns into a refused launch
689
+ * ({@link UatIsolationLaunchRefusedError}), not "codex without hooks", because
690
+ * a bare codex reads the shared file anyway.
691
+ */
692
+ function reuseCodexHookSettingsReadOnly(options = {}) {
693
+ const inspection = inspectCodexSharedHooksReadOnly(options);
694
+ return inspection.usable ? inspection.settingsPath : null;
695
+ }
579
696
  /**
580
697
  * The plan that starts codex for one instance.
581
698
  *
582
- * Never throws: hooks are an enhancement to a session that has to start anyway,
583
- * so anything that goes wrong here returns the bare executable — which is
584
- * byte-for-byte the pre-#1760 launch.
699
+ * Never throws outside UAT isolation: hooks are an enhancement to a session
700
+ * that has to start anyway, so anything that goes wrong here returns the bare
701
+ * executable — which is byte-for-byte the pre-#1760 launch. Under
702
+ * `CM_UAT_ISOLATION=1` (Issue #3360) each of those roads throws
703
+ * {@link UatIsolationLaunchRefusedError} instead: a bare codex still reads the
704
+ * shared, trusted `hooks.json`.
585
705
  *
586
706
  * The environment assignments are the per-session half of the design. The
587
707
  * hooks file cannot hold them (there is one file for the machine), the payload
@@ -604,19 +724,33 @@ function writeCodexHookSettings(options = {}) {
604
724
  */
605
725
  function buildCodexLaunchPlan(executablePath, target, options = {}) {
606
726
  const bare = { command: executablePath, settingsPath: null, env: {} };
607
- if (!(0, hook_settings_generator_1.isHookInjectionEnabled)())
727
+ // Issue #3360: under UAT isolation every road to `bare` is refused instead.
728
+ // A bare codex still reads `$CODEX_HOME/hooks.json` — production's trusted
729
+ // hooks, with no correlation keys and no `--no-daemon` — so "without hooks"
730
+ // would really be "with production's hooks, posting to production".
731
+ const fallback = (reason, fix) => {
732
+ if ((0, uat_isolation_1.isUatIsolationEnabled)())
733
+ throw new uat_isolation_1.UatIsolationLaunchRefusedError('codex', reason, fix);
608
734
  return bare;
735
+ };
736
+ if (!(0, hook_settings_generator_1.isHookInjectionEnabled)()) {
737
+ return fallback('CM_AGENT_HOOKS_INJECT=0', 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.');
738
+ }
609
739
  const instanceId = target.instanceId ?? tool_id_1.CODEX_CLI_TOOL_ID;
610
740
  if (!(0, path_validator_1.isValidWorktreeId)(target.worktreeId) || !(0, types_1.isValidInstanceId)(instanceId)) {
611
741
  // Both become URL parameters the receiver re-validates; a value that would
612
742
  // be rejected there is not worth injecting.
613
743
  logger.warn('codex-hooks-invalid-correlation-key', { worktreeId: target.worktreeId });
614
- return bare;
744
+ return fallback('the worktree or instance id is not a valid correlation key', 'Use a valid worktree and instance id.');
615
745
  }
616
746
  try {
617
747
  const settingsPath = writeCodexHookSettings(options);
618
- if (!settingsPath)
619
- return bare;
748
+ if (!settingsPath) {
749
+ const inspection = (0, uat_isolation_1.getUatIsolationMode)() === 'shared-read-only' ? inspectCodexSharedHooksReadOnly(options) : null;
750
+ if (inspection && !inspection.usable)
751
+ return fallback(inspection.reason, inspection.fix);
752
+ return fallback(`${getCodexHooksPath(options)} or its relay is missing or differs from what this build writes`, uat_isolation_1.UAT_SAME_BUILD_FIX);
753
+ }
620
754
  const port = options.port ?? (0, env_1.getServerPort)();
621
755
  const query = new URLSearchParams({
622
756
  tool: tool_id_1.CODEX_CLI_TOOL_ID,
@@ -652,10 +786,12 @@ function buildCodexLaunchPlan(executablePath, target, options = {}) {
652
786
  };
653
787
  }
654
788
  catch (error) {
789
+ if (error instanceof uat_isolation_1.UatIsolationLaunchRefusedError)
790
+ throw error;
655
791
  logger.warn('codex-hooks-config-write-failed', {
656
792
  worktreeId: target.worktreeId,
657
793
  error: error instanceof Error ? error.message : String(error),
658
794
  });
659
- return bare;
795
+ return fallback(`the hook config could not be prepared (${error instanceof Error ? error.message : String(error)})`, uat_isolation_1.UAT_SAME_BUILD_FIX);
660
796
  }
661
797
  }
@@ -57,6 +57,8 @@ exports.CODEX_RELAY_INSTALL_BASENAME = exports.CODEX_RELAY_INSTALL_DIRNAME = voi
57
57
  exports.getCodexRelayInstallPath = getCodexRelayInstallPath;
58
58
  exports.getInstalledCodexRelayPath = getInstalledCodexRelayPath;
59
59
  exports.installCodexRelayScript = installCodexRelayScript;
60
+ exports.installCodexRelayScriptOrThrow = installCodexRelayScriptOrThrow;
61
+ exports.getCodexRelayStagingPath = getCodexRelayStagingPath;
60
62
  const fs_1 = require("fs");
61
63
  const path_1 = require("path");
62
64
  const logger_1 = require("../../../../lib/logger");
@@ -109,27 +111,7 @@ function installCodexRelayScript(codexHome, sourcePath) {
109
111
  const target = getCodexRelayInstallPath(codexHome);
110
112
  if (sourcePath && sourcePath !== target) {
111
113
  try {
112
- const desired = (0, fs_1.readFileSync)(sourcePath, 'utf8');
113
- const current = (0, fs_1.existsSync)(target) ? (0, fs_1.readFileSync)(target, 'utf8') : null;
114
- if (current !== desired) {
115
- (0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
116
- // `.tmp` beside the target so the rename cannot cross a filesystem.
117
- const staging = `${target}.tmp`;
118
- try {
119
- (0, fs_1.writeFileSync)(staging, desired, { mode: 0o700 });
120
- (0, fs_1.renameSync)(staging, target);
121
- }
122
- catch (error) {
123
- try {
124
- (0, fs_1.unlinkSync)(staging);
125
- }
126
- catch {
127
- // Nothing to clean up, or nothing that can be.
128
- }
129
- throw error;
130
- }
131
- logger.info('codex-relay-installed', { target });
132
- }
114
+ copyRelayIfChanged(sourcePath, target);
133
115
  }
134
116
  catch (error) {
135
117
  // An install that failed is not a launch that failed. If a previous
@@ -143,3 +125,64 @@ function installCodexRelayScript(codexHome, sourcePath) {
143
125
  }
144
126
  return (0, fs_1.existsSync)(target) ? target : null;
145
127
  }
128
+ /**
129
+ * {@link installCodexRelayScript} for `CM_UAT_ISOLATION=own-home` (Issue #3312):
130
+ * every failure throws instead of being absorbed — no shipped relay, a copy
131
+ * that could not be written, an installed copy whose bytes still differ from
132
+ * the shipped one — so the launch plan refuses the launch rather than running
133
+ * the check against an older relay.
134
+ *
135
+ * @returns The installed path, byte-identical to `sourcePath`
136
+ * @throws When the relay is missing or could not be made identical
137
+ */
138
+ function installCodexRelayScriptOrThrow(codexHome, sourcePath) {
139
+ if (!sourcePath)
140
+ throw new Error('this build ships no relay script');
141
+ const target = getCodexRelayInstallPath(codexHome);
142
+ if (sourcePath !== target)
143
+ copyRelayIfChanged(sourcePath, target);
144
+ if (!(0, fs_1.existsSync)(target) || (0, fs_1.readFileSync)(target, 'utf8') !== (0, fs_1.readFileSync)(sourcePath, 'utf8')) {
145
+ throw new Error(`the installed relay ${target} differs from the one this build ships`);
146
+ }
147
+ return target;
148
+ }
149
+ /**
150
+ * Copy `sourcePath` to `target` when the bytes differ. Throws on any failure.
151
+ *
152
+ * The write goes through `<target>.tmp` and a rename, because the file being
153
+ * replaced is one a *running* codex session may be executing at that moment —
154
+ * truncating it in place would hand that session half a script. The temp file
155
+ * is removed first and then created exclusively (`wx`), so a symlink planted
156
+ * at that name is removed, never written through (Issue #3312).
157
+ */
158
+ function copyRelayIfChanged(sourcePath, target) {
159
+ const desired = (0, fs_1.readFileSync)(sourcePath, 'utf8');
160
+ const current = (0, fs_1.existsSync)(target) ? (0, fs_1.readFileSync)(target, 'utf8') : null;
161
+ if (current === desired)
162
+ return;
163
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
164
+ // `.tmp` beside the target so the rename cannot cross a filesystem.
165
+ const staging = getCodexRelayStagingPath(target);
166
+ try {
167
+ unlinkIfPresent(staging);
168
+ (0, fs_1.writeFileSync)(staging, desired, { mode: 0o700, flag: 'wx' });
169
+ (0, fs_1.renameSync)(staging, target);
170
+ }
171
+ catch (error) {
172
+ unlinkIfPresent(staging);
173
+ throw error;
174
+ }
175
+ logger.info('codex-relay-installed', { target });
176
+ }
177
+ /** The temp file the relay is written to before it is renamed over `target`. */
178
+ function getCodexRelayStagingPath(target) {
179
+ return `${target}.tmp`;
180
+ }
181
+ function unlinkIfPresent(file) {
182
+ try {
183
+ (0, fs_1.unlinkSync)(file);
184
+ }
185
+ catch {
186
+ // Nothing to clean up, or nothing that can be.
187
+ }
188
+ }