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
@@ -224,9 +224,9 @@ function readItemDetail(type, item) {
224
224
  // for a call codex could not parse.
225
225
  const parsed = readParsedCommand(item.parsed_cmd);
226
226
  if (parsed)
227
- return boundDetailText(collapseToLine(parsed));
227
+ return boundDetailText((0, turn_body_1.collapseToLine)(parsed));
228
228
  const argv = readArgv(item.command);
229
- return argv ? boundDetailText(collapseToLine(argv)) : null;
229
+ return argv ? boundDetailText((0, turn_body_1.collapseToLine)(argv)) : null;
230
230
  }
231
231
  if (type === 'FileChange') {
232
232
  const changes = item.changes;
@@ -248,7 +248,7 @@ function readItemDetail(type, item) {
248
248
  }
249
249
  if (type === 'Extension') {
250
250
  const query = (0, event_mapper_1.readStringField)(item, 'query') ?? (0, event_mapper_1.readStringField)(item, 'action');
251
- return query ? boundDetailText(collapseToLine(query)) : null;
251
+ return query ? boundDetailText((0, turn_body_1.collapseToLine)(query)) : null;
252
252
  }
253
253
  return null;
254
254
  }
@@ -273,14 +273,8 @@ function readArgv(value) {
273
273
  const parts = value.filter((entry) => typeof entry === 'string');
274
274
  return parts.length > 0 ? parts.join(' ') : null;
275
275
  }
276
- /** A tool detail on one line. A heredoc puts newlines in a shell command. */
277
- function collapseToLine(value) {
278
- return value.replace(/\s+/g, ' ').trim();
279
- }
280
276
  function boundDetailText(value) {
281
- return value.length <= exports.MAX_CODEX_TOOL_DETAIL_LENGTH
282
- ? value
283
- : `${value.slice(0, exports.MAX_CODEX_TOOL_DETAIL_LENGTH - 1)}…`;
277
+ return (0, turn_body_1.boundDetail)(value, exports.MAX_CODEX_TOOL_DETAIL_LENGTH);
284
278
  }
285
279
  /**
286
280
  * Read one parsed rollout line.
@@ -565,11 +559,7 @@ function renderCodexTurn(turn) {
565
559
  // enough to be truncated at both ends still says so at both ends.
566
560
  if (!turn.started && body.length > 0)
567
561
  body = exports.CODEX_TURN_HEAD_TRUNCATION_MARKER + body;
568
- if (body.length > exports.MAX_CODEX_TURN_BODY_LENGTH) {
569
- body =
570
- body.slice(0, exports.MAX_CODEX_TURN_BODY_LENGTH - exports.CODEX_TURN_TRUNCATION_MARKER.length) +
571
- exports.CODEX_TURN_TRUNCATION_MARKER;
572
- }
562
+ body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_CODEX_TURN_BODY_LENGTH, exports.CODEX_TURN_TRUNCATION_MARKER);
573
563
  return {
574
564
  sessionId: turn.sessionId,
575
565
  turnId: turn.turnId,
@@ -129,6 +129,7 @@ exports.acceptCommandCodeTranscriptHint = acceptCommandCodeTranscriptHint;
129
129
  exports.findCommandCodeTranscriptPath = findCommandCodeTranscriptPath;
130
130
  exports.captureCommandCodeTranscriptTurn = captureCommandCodeTranscriptTurn;
131
131
  exports.resolveCommandCodeTranscriptPath = resolveCommandCodeTranscriptPath;
132
+ const global_state_1 = require("../../../../lib/global-state");
132
133
  const promises_1 = require("fs/promises");
133
134
  const os_1 = require("os");
134
135
  const path_1 = require("path");
@@ -138,6 +139,7 @@ const user_turn_recorder_1 = require("../../../../lib/history/user-turn-recorder
138
139
  const assistant_response_saver_1 = require("../../../../lib/assistant-response-saver");
139
140
  const logger_1 = require("../../../../lib/logger");
140
141
  const agent_transcript_1 = require("../../../../types/agent-transcript");
142
+ const transcript_history_1 = require("../transcript-history");
141
143
  const transcript_1 = require("./transcript");
142
144
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/command-code/history');
143
145
  /**
@@ -172,7 +174,7 @@ const COMMAND_CODE_SESSION_ID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA
172
174
  * Command Code sends `session_id` on all four of its events — but an event that
173
175
  * did not would otherwise blank the pointer mid-session.
174
176
  */
175
- const sessionPointers = (globalThis.__commandCodeTranscriptSessions ??= new Map());
177
+ const sessionPointers = (0, global_state_1.getOrInitGlobal)('__commandCodeTranscriptSessions', () => new Map());
176
178
  /**
177
179
  * Where each session id's transcript was found.
178
180
  *
@@ -181,7 +183,7 @@ const sessionPointers = (globalThis.__commandCodeTranscriptSessions ??= new Map(
181
183
  * directory scan — the project directory name is `slugify(cwd)` and not
182
184
  * derivable — and a scan on every finished turn is not something to do twice.
183
185
  */
184
- const transcriptPaths = (globalThis.__commandCodeTranscriptPaths ??= new Map());
186
+ const transcriptPaths = (0, global_state_1.getOrInitGlobal)('__commandCodeTranscriptPaths', () => new Map());
185
187
  function keyOf(target) {
186
188
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
187
189
  }
@@ -206,24 +208,7 @@ function resetCommandCodeTranscriptSessions() {
206
208
  * is merely the status quo.
207
209
  */
208
210
  async function resolveCommandCodeSessionId(target) {
209
- const key = keyOf(target);
210
- try {
211
- const { getLastAgentEvent } = await Promise.resolve().then(() => __importStar(require('../../../../lib/session/agent-event-state')));
212
- const sessionId = getLastAgentEvent(target.worktreeId, target.cliToolId, target.instanceId)?.sessionId;
213
- if (typeof sessionId === 'string' && sessionId.length > 0) {
214
- sessionPointers.set(key, sessionId);
215
- return sessionId;
216
- }
217
- }
218
- catch (error) {
219
- // A state module that cannot be reached is one that knows no session id.
220
- logger.debug('command-code-transcript-session-lookup-failed', {
221
- worktreeId: target.worktreeId,
222
- instanceId: target.instanceId ?? target.cliToolId,
223
- error: error instanceof Error ? error.message : String(error),
224
- });
225
- }
226
- return sessionPointers.get(key) ?? null;
211
+ return (0, transcript_history_1.resolveSessionIdFromEvents)(target, sessionPointers, keyOf(target), logger, 'command-code-transcript-session-lookup-failed');
227
212
  }
228
213
  /** `<home>/.commandcode/projects`. */
229
214
  function commandCodeProjectsRoot(homeDir) {
@@ -247,15 +232,7 @@ function commandCodeProjectsRoot(homeDir) {
247
232
  * @returns The resolved path, or null when it is not acceptable
248
233
  */
249
234
  function acceptCommandCodeTranscriptHint(homeDir, hint) {
250
- if (!hint.endsWith(transcript_1.COMMAND_CODE_TRANSCRIPT_EXTENSION))
251
- return null;
252
- if (hint.includes('\0'))
253
- return null;
254
- const root = (0, path_1.resolve)(commandCodeProjectsRoot(homeDir));
255
- const resolved = (0, path_1.resolve)(hint);
256
- if (resolved !== root && !resolved.startsWith(root + path_1.sep))
257
- return null;
258
- return resolved;
235
+ return (0, transcript_history_1.acceptPathUnderRoot)(commandCodeProjectsRoot(homeDir), transcript_1.COMMAND_CODE_TRANSCRIPT_EXTENSION, hint);
259
236
  }
260
237
  /**
261
238
  * Find this session's transcript under `~/.commandcode/projects`.
@@ -301,7 +278,7 @@ async function findCommandCodeTranscriptPath(homeDir, sessionId) {
301
278
  const fileName = `${sessionId}${transcript_1.COMMAND_CODE_TRANSCRIPT_EXTENSION}`;
302
279
  for (const directory of directories) {
303
280
  const candidate = (0, path_1.join)(root, directory.name, fileName);
304
- if (await isReadableFile(candidate))
281
+ if (await (0, transcript_history_1.isReadableFile)(candidate))
305
282
  return candidate;
306
283
  }
307
284
  return null;
@@ -438,7 +415,7 @@ async function captureCommandCodeTranscriptTurn(target, capture, report) {
438
415
  let captured = false;
439
416
  for (let index = 0; index < pending.turns.length; index += 1) {
440
417
  const turn = pending.turns[index];
441
- captured = await writeCommandCodeTurn(target, turn, (0, transcript_1.renderCommandCodeTurn)(turn), resolveAssistantTimestampMs(turn, userRows[index], lastRecordAt.get(turn.promptId) ?? 0, nextTurnOpensAt(pending.turns, userRows, index)), path, report);
418
+ captured = await writeCommandCodeTurn(target, turn, (0, transcript_1.renderCommandCodeTurn)(turn), (0, transcript_history_1.resolveAssistantTimestampMs)(turn, userRows[index], lastRecordAt.get(turn.promptId) ?? 0, (0, transcript_history_1.nextTurnOpensAt)(pending.turns, userRows, index)), path, report);
442
419
  }
443
420
  if (captured) {
444
421
  // Issue #2437: History now holds this turn as the agent's own Markdown.
@@ -473,26 +450,7 @@ async function captureCommandCodeTranscriptTurn(target, capture, report) {
473
450
  * there is no evidence in the window that says otherwise.
474
451
  */
475
452
  async function selectUnwrittenCommandCodeTurns(target, turns) {
476
- const [{ getDbInstance }, { findMessageByRequestId }] = await Promise.all([
477
- Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
478
- Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
479
- ]);
480
- const db = getDbInstance();
481
- for (let index = turns.length - 1; index >= 0; index -= 1) {
482
- const requestId = (0, agent_transcript_1.commandCodeTurnRequestId)(turns[index].promptId);
483
- if (!findMessageByRequestId(db, target.worktreeId, requestId))
484
- continue;
485
- return {
486
- turns: turns.slice(index + 1),
487
- previousStartedAt: turns[index].startedAt,
488
- anchored: true,
489
- };
490
- }
491
- return {
492
- turns: turns.slice(-1),
493
- previousStartedAt: turns.length > 1 ? turns[turns.length - 2].startedAt : 0,
494
- anchored: false,
495
- };
453
+ return (0, transcript_history_1.selectUnwrittenTurns)(target, turns, (turn) => (0, agent_transcript_1.commandCodeTurnRequestId)(turn.promptId));
496
454
  }
497
455
  /**
498
456
  * The transcript file this instance would be read from, or null (Issue #2246).
@@ -526,14 +484,14 @@ async function locateCommandCodeTranscript(homeDir, capture, sessionId) {
526
484
  const hint = capture.transcriptPathHint;
527
485
  if (typeof hint === 'string' && hint.length > 0) {
528
486
  const accepted = acceptCommandCodeTranscriptHint(homeDir, hint);
529
- if (accepted && (await isReadableFile(accepted)))
487
+ if (accepted && (await (0, transcript_history_1.isReadableFile)(accepted)))
530
488
  return accepted;
531
489
  }
532
490
  if (!sessionId)
533
491
  return null;
534
492
  const memoKey = `${homeDir}\0${sessionId}`;
535
493
  const memoised = transcriptPaths.get(memoKey);
536
- if (memoised && (await isReadableFile(memoised)))
494
+ if (memoised && (await (0, transcript_history_1.isReadableFile)(memoised)))
537
495
  return memoised;
538
496
  const found = await findCommandCodeTranscriptPath(homeDir, sessionId);
539
497
  if (found)
@@ -542,14 +500,6 @@ async function locateCommandCodeTranscript(homeDir, capture, sessionId) {
542
500
  transcriptPaths.delete(memoKey);
543
501
  return found;
544
502
  }
545
- async function isReadableFile(path) {
546
- try {
547
- return (await (0, promises_1.stat)(path)).isFile();
548
- }
549
- catch {
550
- return false;
551
- }
552
- }
553
503
  /**
554
504
  * Record the prompt this turn answers, before the reply is written (#2196).
555
505
  *
@@ -592,7 +542,7 @@ async function recordCommandCodeUserTurn(target, turn, previousStartedAt = 0) {
592
542
  }
593
543
  return recorded;
594
544
  }
595
- /**
545
+ /*
596
546
  * When the assistant row for this turn is dated.
597
547
  *
598
548
  * **The turn's LAST assistant record, not its prompt (Issue #2273).** #2252
@@ -618,13 +568,6 @@ async function recordCommandCodeUserTurn(target, turn, previousStartedAt = 0) {
618
568
  * @param nextTurnOpensAt - Epoch ms of the next turn's user row, or null when
619
569
  * this is the newest turn in the window
620
570
  */
621
- function resolveAssistantTimestampMs(turn, userRow, lastRecordAt = 0, nextTurnOpensAt = null) {
622
- const earliest = userRow.timestampMs === null
623
- ? turn.startedAt
624
- : Math.max(turn.startedAt, userRow.timestampMs + 1);
625
- const latest = nextTurnOpensAt === null ? Number.POSITIVE_INFINITY : nextTurnOpensAt - 1;
626
- return Math.max(earliest, Math.min(lastRecordAt, latest));
627
- }
628
571
  /**
629
572
  * When each turn's last assistant record was written (Issue #2273).
630
573
  *
@@ -661,7 +604,7 @@ function lastCommandCodeAssistantRecordAt(records) {
661
604
  }
662
605
  return at;
663
606
  }
664
- /**
607
+ /*
665
608
  * The instant the next pending turn's prompt row carries, or null (Issue #2273).
666
609
  *
667
610
  * The user row's own timestamp when there is one, because that is what History
@@ -670,12 +613,6 @@ function lastCommandCodeAssistantRecordAt(records) {
670
613
  * prompt is while the previous turn was still running. The turn's start is the
671
614
  * fallback for a turn that produced no row at all.
672
615
  */
673
- function nextTurnOpensAt(turns, userRows, index) {
674
- const next = turns[index + 1];
675
- if (!next)
676
- return null;
677
- return userRows[index + 1]?.timestampMs ?? next.startedAt;
678
- }
679
616
  /**
680
617
  * How many already-written turns are re-rendered and compared (Issue #2264).
681
618
  *
@@ -710,32 +647,7 @@ exports.COMMAND_CODE_TURN_RECHECK_LIMIT = 3;
710
647
  * @returns Whether the row was replaced
711
648
  */
712
649
  async function growCommandCodeTurnRow(target, existing, rendered, path) {
713
- const instanceId = target.instanceId ?? target.cliToolId;
714
- const previousLength = existing.content.length;
715
- if (rendered.body.length <= previousLength)
716
- return false;
717
- const [{ getDbInstance }, { updateMessageContent }, { broadcastMessage }] = await Promise.all([
718
- Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
719
- Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
720
- Promise.resolve().then(() => __importStar(require('../../../../lib/ws-server'))),
721
- ]);
722
- updateMessageContent(getDbInstance(), existing.id, rendered.body);
723
- broadcastMessage('message_updated', {
724
- worktreeId: target.worktreeId,
725
- message: { ...existing, content: rendered.body },
726
- });
727
- logger.info('command-code-transcript-turn-updated', {
728
- worktreeId: target.worktreeId,
729
- instanceId,
730
- sessionId: rendered.sessionId,
731
- requestId: existing.requestId,
732
- path,
733
- previousLength,
734
- bodyLength: rendered.body.length,
735
- textBlocks: rendered.textBlocks,
736
- toolBlocks: rendered.toolBlocks,
737
- });
738
- return true;
650
+ return (0, transcript_history_1.growTurnRowTo)(target, existing, rendered, path, logger, 'command-code-transcript-turn-updated');
739
651
  }
740
652
  /**
741
653
  * Re-read the newest already-written turns and grow the short ones (#2264).
@@ -758,25 +670,12 @@ async function growCommandCodeTurnRow(target, existing, rendered, path) {
758
670
  * @returns How many rows were replaced
759
671
  */
760
672
  async function refreshCommandCodeTurnRows(target, candidates, path) {
761
- if (candidates.length === 0)
762
- return 0;
763
- const [{ getDbInstance }, { findMessageByRequestId }] = await Promise.all([
764
- Promise.resolve().then(() => __importStar(require('../../../../lib/db/db-instance'))),
765
- Promise.resolve().then(() => __importStar(require('../../../../lib/db'))),
766
- ]);
767
- const db = getDbInstance();
768
- let updated = 0;
769
- for (const turn of candidates) {
770
- if (!(0, transcript_1.isCommandCodeTurnWritable)(turn))
771
- continue;
772
- const existing = findMessageByRequestId(db, target.worktreeId, (0, agent_transcript_1.commandCodeTurnRequestId)(turn.promptId));
773
- if (!existing)
774
- continue;
775
- if (await growCommandCodeTurnRow(target, existing, (0, transcript_1.renderCommandCodeTurn)(turn), path)) {
776
- updated += 1;
777
- }
778
- }
779
- return updated;
673
+ return (0, transcript_history_1.refreshTurnRowsTo)(target, candidates, path, {
674
+ isWritable: transcript_1.isCommandCodeTurnWritable,
675
+ requestIdOf: (turn) => (0, agent_transcript_1.commandCodeTurnRequestId)(turn.promptId),
676
+ render: transcript_1.renderCommandCodeTurn,
677
+ grow: growCommandCodeTurnRow,
678
+ });
780
679
  }
781
680
  /**
782
681
  * Write one rendered turn, unless it is already there.
@@ -202,18 +202,12 @@ function readToolDetail(input) {
202
202
  for (const field of COMMAND_CODE_TOOL_DETAIL_FIELDS) {
203
203
  const value = (0, event_mapper_1.readStringField)(input, field);
204
204
  if (value)
205
- return boundToolDetail(collapseToLine(value));
205
+ return boundToolDetail((0, turn_body_1.collapseToLine)(value));
206
206
  }
207
207
  return null;
208
208
  }
209
- /** A tool detail on one line. A heredoc `command` puts newlines in it. */
210
- function collapseToLine(value) {
211
- return value.replace(/\s+/g, ' ').trim();
212
- }
213
209
  function boundToolDetail(value) {
214
- return value.length <= exports.MAX_COMMAND_CODE_TOOL_DETAIL_LENGTH
215
- ? value
216
- : `${value.slice(0, exports.MAX_COMMAND_CODE_TOOL_DETAIL_LENGTH - 1)}…`;
210
+ return (0, turn_body_1.boundDetail)(value, exports.MAX_COMMAND_CODE_TOOL_DETAIL_LENGTH);
217
211
  }
218
212
  /** `message.meta`, when the entry has one. */
219
213
  function readMessageMeta(message) {
@@ -588,11 +582,7 @@ function renderCommandCodeTurn(turn) {
588
582
  unknown.add(block.type);
589
583
  }
590
584
  let body = (0, turn_body_1.separateTurnBody)(rendered).body;
591
- if (body.length > exports.MAX_COMMAND_CODE_TURN_BODY_LENGTH) {
592
- body =
593
- body.slice(0, exports.MAX_COMMAND_CODE_TURN_BODY_LENGTH - exports.COMMAND_CODE_TURN_TRUNCATION_MARKER.length) +
594
- exports.COMMAND_CODE_TURN_TRUNCATION_MARKER;
595
- }
585
+ body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_COMMAND_CODE_TURN_BODY_LENGTH, exports.COMMAND_CODE_TURN_TRUNCATION_MARKER);
596
586
  return {
597
587
  sessionId: turn.sessionId,
598
588
  promptId: turn.promptId,
@@ -100,6 +100,15 @@
100
100
  * the bearer header without looking at where it is going, so a constant
101
101
  * destination is what keeps the token on loopback (設計方針書 §10.7).
102
102
  *
103
+ * ## UAT isolation (Issue #3391)
104
+ *
105
+ * Under `CM_UAT_ISOLATION=1` (Issue #3360) nothing in `~/.copilot` is written —
106
+ * not `settings.json`, not its backup, not the lock. The file is the user's,
107
+ * shared with their production server, and names a relay by this checkout's
108
+ * path. It is used as it is only when it already holds exactly what this build
109
+ * writes into an empty file ({@link inspectCopilotHookSettingsReadOnly});
110
+ * anything else refuses the launch, the way codex and antigravity do.
111
+ *
103
112
  * @module lib/hooks/sources/copilot/hook-settings
104
113
  */
105
114
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -111,8 +120,9 @@ exports.buildCopilotEventCommand = buildCopilotEventCommand;
111
120
  exports.buildCopilotPermissionCommand = buildCopilotPermissionCommand;
112
121
  exports.buildCopilotHookSettings = buildCopilotHookSettings;
113
122
  exports.mergeCopilotHookSettings = mergeCopilotHookSettings;
114
- exports.readCopilotSettings = readCopilotSettings;
115
123
  exports.inspectCopilotConfigHooks = inspectCopilotConfigHooks;
124
+ exports.getCopilotSettingsTempPath = getCopilotSettingsTempPath;
125
+ exports.inspectCopilotHookSettingsReadOnly = inspectCopilotHookSettingsReadOnly;
116
126
  exports.writeCopilotHookSettings = writeCopilotHookSettings;
117
127
  exports.buildCopilotHookEnvironment = buildCopilotHookEnvironment;
118
128
  exports.isCopilotHookInjectionEnabled = isCopilotHookInjectionEnabled;
@@ -121,6 +131,7 @@ const fs_1 = require("fs");
121
131
  const os_1 = require("os");
122
132
  const path_1 = require("path");
123
133
  const safe_directory_1 = require("../../../../config/safe-directory");
134
+ const uat_isolation_1 = require("../../../../config/uat-isolation");
124
135
  const types_1 = require("../../../../lib/cli-tools/types");
125
136
  const env_1 = require("../../../../lib/env");
126
137
  const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
@@ -488,6 +499,10 @@ function mergeCopilotHookSettings(existing, generated) {
488
499
  }
489
500
  return { ...existing, hooks: merged };
490
501
  }
502
+ /** The bytes `settings.json` should hold, given what it holds now. */
503
+ function renderCopilotHookSettings(existing, options) {
504
+ return `${JSON.stringify(mergeCopilotHookSettings(existing, buildCopilotHookSettings(options)), null, 2)}\n`;
505
+ }
491
506
  /** `''` when the file is not there; anything else throws. */
492
507
  function readFileOrEmpty(path) {
493
508
  try {
@@ -499,16 +514,6 @@ function readFileOrEmpty(path) {
499
514
  throw error;
500
515
  }
501
516
  }
502
- /**
503
- * Read the user's `settings.json`.
504
- *
505
- * @returns The parsed object, or `{}` when the file does not exist
506
- * @throws When the file exists but cannot be read or is not a JSON object —
507
- * the caller turns that into "start without hooks", never into a rewrite
508
- */
509
- function readCopilotSettings(settingsPath) {
510
- return parseCopilotSettings(readFileOrEmpty(settingsPath));
511
- }
512
517
  function parseCopilotSettings(raw) {
513
518
  if (raw.trim() === '')
514
519
  return {};
@@ -682,6 +687,10 @@ function withCopilotSettingsLock(directory, write) {
682
687
  }
683
688
  }
684
689
  }
690
+ /** The temp file {@link writeFileAtomic} writes before it renames it over `path`. */
691
+ function getCopilotSettingsTempPath(path) {
692
+ return `${path}.${process.pid}.tmp`;
693
+ }
685
694
  /**
686
695
  * Replace a file's contents without ever leaving it half-written.
687
696
  *
@@ -692,9 +701,17 @@ function withCopilotSettingsLock(directory, write) {
692
701
  * runs on (設計方針書 §10.9 決定 1).
693
702
  */
694
703
  function writeFileAtomic(path, contents) {
695
- const temp = `${path}.${process.pid}.tmp`;
704
+ const temp = getCopilotSettingsTempPath(path);
696
705
  try {
697
- (0, fs_1.writeFileSync)(temp, contents, { mode: 0o600 });
706
+ // Issue #3312: removed first and then created exclusively, so a symlink
707
+ // planted at the temp name is removed, never written through.
708
+ try {
709
+ (0, fs_1.unlinkSync)(temp);
710
+ }
711
+ catch {
712
+ // Not there: the usual case.
713
+ }
714
+ (0, fs_1.writeFileSync)(temp, contents, { mode: 0o600, flag: 'wx' });
698
715
  (0, fs_1.renameSync)(temp, path);
699
716
  }
700
717
  catch (error) {
@@ -707,22 +724,121 @@ function writeFileAtomic(path, contents) {
707
724
  throw error;
708
725
  }
709
726
  }
727
+ /**
728
+ * The `config.json` that can erase `settingsPath`.
729
+ *
730
+ * Next to the settings file rather than via `getCopilotConfigPath()`: the
731
+ * config.json that can erase a settings.json is the one copilot reads from the
732
+ * same directory, and an overridden `settingsPath` must not be checked against
733
+ * a different home's config.
734
+ */
735
+ function resolveCopilotConfigPathFor(settingsPath, options) {
736
+ return options.configPath ?? (0, path_1.join)((0, path_1.dirname)(settingsPath), 'config.json');
737
+ }
738
+ /**
739
+ * Whether the shared `~/.copilot/settings.json` may be used, unwritten, by a
740
+ * server in UAT isolation mode (`CM_UAT_ISOLATION=1`, Issue #3391).
741
+ *
742
+ * Usable means exactly one thing, as for codex and antigravity: the file is
743
+ * byte-identical to what this build writes into an EMPTY file. Comparing against
744
+ * the merge with what is there ({@link mergeCopilotHookSettings}) would not do —
745
+ * the merge keeps the user's own handlers, so a file holding a hand-written
746
+ * hook that posts straight to production would compare equal and run in the
747
+ * UAT session. The file holds no port, worktree or instance (they travel in the
748
+ * launch environment), so a file production wrote with the same build delivers
749
+ * this session's events to THIS server.
750
+ *
751
+ * A `hooks` key in copilot's `config.json` is refused too: copilot migrates it
752
+ * over `settings.json` at startup, so those hooks would be the ones that run. An
753
+ * unreadable `config.json` is refused rather than proceeded past, because here
754
+ * nothing may run that this server cannot show is its own.
755
+ */
756
+ function inspectCopilotHookSettingsReadOnly(options = {}) {
757
+ const settingsPath = options.settingsPath ?? getCopilotSettingsPath();
758
+ const configPath = resolveCopilotConfigPathFor(settingsPath, options);
759
+ if (!isCopilotHookInjectionEnabled()) {
760
+ return {
761
+ usable: false,
762
+ reason: 'CM_AGENT_HOOKS_INJECT=0',
763
+ fix: 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.',
764
+ };
765
+ }
766
+ try {
767
+ const configHooks = inspectCopilotConfigHooks(configPath);
768
+ if (configHooks !== 'absent') {
769
+ logger.info('copilot-hook-config-json-readonly', { configPath, configHooks });
770
+ return {
771
+ usable: false,
772
+ reason: configHooks === 'present'
773
+ ? `${configPath} has a "hooks" key, which copilot migrates over settings.json at startup`
774
+ : `${configPath} could not be parsed, so it may hold hooks copilot migrates over settings.json`,
775
+ fix: 'Skip copilot scenarios in this UAT, or run it where copilot\'s config.json holds no hooks.',
776
+ };
777
+ }
778
+ const raw = readFileOrEmpty(settingsPath);
779
+ if (raw === '') {
780
+ logger.info('copilot-hook-settings-absent-readonly', { settingsPath });
781
+ return { usable: false, reason: `${settingsPath} does not exist or is empty`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
782
+ }
783
+ if (raw === renderCopilotHookSettings({}, options)) {
784
+ return { usable: true, settingsPath };
785
+ }
786
+ if (raw === renderCopilotHookSettings(parseCopilotSettings(raw), options)) {
787
+ logger.info('copilot-hook-settings-foreign-readonly', { settingsPath });
788
+ return {
789
+ usable: false,
790
+ reason: `${settingsPath} also holds hooks (or keys) CommandMate did not write, which would run in the UAT session`,
791
+ fix: 'Skip copilot scenarios in this UAT, or run it where the shared settings file holds only the hooks CommandMate writes.',
792
+ };
793
+ }
794
+ logger.info('copilot-hook-settings-differs-readonly', { settingsPath });
795
+ return { usable: false, reason: `${settingsPath} differs from what this build writes`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
796
+ }
797
+ catch (error) {
798
+ logger.warn('copilot-hook-settings-unreadable', {
799
+ settingsPath,
800
+ error: error instanceof Error ? error.message : String(error),
801
+ });
802
+ return { usable: false, reason: `${settingsPath} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
803
+ }
804
+ }
710
805
  /**
711
806
  * Merge the generated hooks into copilot's settings file and return its path.
712
807
  *
808
+ * Under `CM_UAT_ISOLATION=1` (Issue #3391) nothing is written: a file that
809
+ * already holds exactly this build's hooks is reused, anything else throws
810
+ * {@link UatIsolationLaunchRefusedError}.
811
+ *
812
+ * @throws {UatIsolationLaunchRefusedError} Under UAT isolation, when the shared
813
+ * file cannot be used as it is
713
814
  * @throws {CopilotConfigHooksShadowError} When copilot's `config.json` still
714
815
  * has a `hooks` key, which it migrates over this file at startup
715
816
  * @throws Anything the read, the merge or the write throws, plus a lock the
716
817
  * file's other writers are holding. Callers must treat a throw as "launch
717
- * without hooks" (fail-open).
818
+ * without hooks" (fail-open), except the UAT isolation refusal.
718
819
  */
719
820
  function writeCopilotHookSettings(options = {}) {
720
- const settingsPath = options.settingsPath ?? getCopilotSettingsPath();
721
- // Next to the settings file rather than via `getCopilotConfigPath()`: the
722
- // config.json that can erase a settings.json is the one copilot reads from
723
- // the same directory, and an overridden `settingsPath` must not be checked
724
- // against a different home's config.
725
- const configPath = options.configPath ?? (0, path_1.join)((0, path_1.dirname)(settingsPath), 'config.json');
821
+ // Issue #3312: under `own-home` the file, its backup and its lock directory
822
+ // are written once they check out inside the dedicated user's HOME.
823
+ const targetPath = options.settingsPath ?? getCopilotSettingsPath();
824
+ const policy = (0, uat_isolation_1.sharedHookWritePolicy)(tool_id_1.COPILOT_CLI_TOOL_ID, [
825
+ (0, path_1.dirname)(targetPath),
826
+ targetPath,
827
+ `${targetPath}${exports.COPILOT_SETTINGS_BACKUP_SUFFIX}`,
828
+ getCopilotSettingsTempPath(targetPath),
829
+ (0, path_1.join)((0, path_1.dirname)(targetPath), exports.COPILOT_SETTINGS_LOCK_BASENAME),
830
+ ]);
831
+ if (policy === 'read-only') {
832
+ // Issue #3391: the file is the user's, shared with their production server,
833
+ // and names a relay by this checkout's path. A UAT server writes nothing to
834
+ // it; see {@link inspectCopilotHookSettingsReadOnly}.
835
+ const inspection = inspectCopilotHookSettingsReadOnly(options);
836
+ if (inspection.usable)
837
+ return inspection.settingsPath;
838
+ throw new uat_isolation_1.UatIsolationLaunchRefusedError(tool_id_1.COPILOT_CLI_TOOL_ID, inspection.reason, inspection.fix);
839
+ }
840
+ const settingsPath = targetPath;
841
+ const configPath = resolveCopilotConfigPathFor(settingsPath, options);
726
842
  const configHooks = inspectCopilotConfigHooks(configPath);
727
843
  if (configHooks === 'present')
728
844
  throw new CopilotConfigHooksShadowError(configPath);
@@ -734,8 +850,7 @@ function writeCopilotHookSettings(options = {}) {
734
850
  (0, fs_1.mkdirSync)((0, path_1.dirname)(settingsPath), { recursive: true, mode: 0o700 });
735
851
  return withCopilotSettingsLock((0, path_1.dirname)(settingsPath), () => {
736
852
  const raw = readFileOrEmpty(settingsPath);
737
- const merged = mergeCopilotHookSettings(parseCopilotSettings(raw), buildCopilotHookSettings(options));
738
- const next = `${JSON.stringify(merged, null, 2)}\n`;
853
+ const next = renderCopilotHookSettings(parseCopilotSettings(raw), options);
739
854
  // Since #1904 the generated commands carry no port and no per-launch value,
740
855
  // so the common re-launch produces the bytes already on disk. Returning
741
856
  // early keeps the user's file — and its mtime — untouched, and skips the
@@ -787,26 +902,37 @@ function isCopilotHookInjectionEnabled() {
787
902
  /**
788
903
  * The command that launches copilot for one instance (S3 / S4 / S5).
789
904
  *
790
- * Never throws. Injection is an enhancement to a session that has to start
791
- * anyway, so every failure — the switch is off, an id would not survive the
792
- * receiver's own validation, the settings file is unreadable or unwritable —
793
- * returns the bare command and no settings path, which is byte-for-byte what
794
- * `cli-tools/copilot.ts` sent before this Issue.
905
+ * Never throws outside UAT isolation. Injection is an enhancement to a session
906
+ * that has to start anyway, so every failure — the switch is off, an id would
907
+ * not survive the receiver's own validation, the settings file is unreadable or
908
+ * unwritable — returns the bare command and no settings path, which is
909
+ * byte-for-byte what `cli-tools/copilot.ts` sent before this Issue.
910
+ *
911
+ * Under `CM_UAT_ISOLATION=1` (Issue #3391) each of those roads throws
912
+ * {@link UatIsolationLaunchRefusedError} instead, as codex's and antigravity's
913
+ * do: a bare copilot still reads the shared `~/.copilot/settings.json`, so
914
+ * "without hooks" would mean "with whatever hooks are in the user's file".
795
915
  *
796
916
  * @param executablePath - Normally {@link COPILOT_LAUNCH_COMMAND}
797
917
  * @param target - The instance being started
798
918
  */
799
919
  function buildCopilotLaunchCommand(executablePath, target, options = {}) {
800
920
  const bare = { command: executablePath, settingsPath: null, env: {} };
801
- if (!isCopilotHookInjectionEnabled())
921
+ const fallback = (reason, fix) => {
922
+ if ((0, uat_isolation_1.isUatIsolationEnabled)())
923
+ throw new uat_isolation_1.UatIsolationLaunchRefusedError(tool_id_1.COPILOT_CLI_TOOL_ID, reason, fix);
802
924
  return bare;
925
+ };
926
+ if (!isCopilotHookInjectionEnabled()) {
927
+ return fallback('CM_AGENT_HOOKS_INJECT=0', 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.');
928
+ }
803
929
  const instanceId = target.instanceId ?? tool_id_1.COPILOT_CLI_TOOL_ID;
804
930
  if (!(0, types_1.isValidInstanceId)(instanceId) || !(0, path_validator_1.isValidWorktreeId)(target.worktreeId)) {
805
931
  // Both become URL parameters the receivers re-validate; a value that would
806
932
  // be rejected there is not worth injecting, and a rejected event is worse
807
933
  // than no event because it is a 400 in the operator's log for every turn.
808
934
  logger.warn('copilot-hook-invalid-correlation-key', { worktreeId: target.worktreeId });
809
- return bare;
935
+ return fallback('the worktree or instance id is not a valid correlation key', 'Use a valid worktree and instance id.');
810
936
  }
811
937
  try {
812
938
  const settingsPath = writeCopilotHookSettings(options);
@@ -817,6 +943,8 @@ function buildCopilotLaunchCommand(executablePath, target, options = {}) {
817
943
  };
818
944
  }
819
945
  catch (error) {
946
+ if (error instanceof uat_isolation_1.UatIsolationLaunchRefusedError)
947
+ throw error;
820
948
  if (error instanceof CopilotConfigHooksShadowError) {
821
949
  // Its own reason code because it is the one failure here an operator can
822
950
  // fix: move `hooks` out of config.json and into settings.json, or let
@@ -825,12 +953,14 @@ function buildCopilotLaunchCommand(executablePath, target, options = {}) {
825
953
  worktreeId: target.worktreeId,
826
954
  configPath: error.configPath,
827
955
  });
828
- return bare;
956
+ // Issue #3312: only `own-home` writes and so can get here isolated; a
957
+ // bare copilot would run the hooks in config.json, so it is refused.
958
+ return fallback(`${error.configPath} has a "hooks" key, which copilot migrates over settings.json at startup`, 'Move the hooks out of copilot\'s config.json.');
829
959
  }
830
960
  logger.warn('copilot-hook-settings-write-failed', {
831
961
  worktreeId: target.worktreeId,
832
962
  error: error instanceof Error ? error.message : String(error),
833
963
  });
834
- return bare;
964
+ return fallback('~/.copilot/settings.json could not be prepared', uat_isolation_1.UAT_SAME_BUILD_FIX);
835
965
  }
836
966
  }