commandmate 0.44.2 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +289 -289
  3. package/.next/app-path-routes-manifest.json +20 -20
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/next-server.js.nft.json +1 -1
  6. package/.next/prerender-manifest.json +12 -12
  7. package/.next/react-loadable-manifest.json +26 -32
  8. package/.next/required-server-files.json +1 -1
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/update/route.js +1 -1
  11. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/agents/versions/route.js +1 -1
  13. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/app/update/route.js +2 -2
  16. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/auth/login/route.js +1 -1
  19. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/capabilities/route.js +1 -1
  23. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js +1 -1
  25. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  26. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  29. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  32. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/external-apps/route.js +1 -1
  34. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  38. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  39. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  41. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  42. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  44. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  45. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/push/escalation/route.js +1 -1
  49. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/push/subscriptions/route.js +2 -2
  51. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/push/vapid/route.js +1 -1
  53. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  55. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  56. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/relays/route.js +1 -1
  58. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  59. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  62. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  65. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/repositories/clone/route.js +1 -1
  67. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  68. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/restore/route.js +1 -1
  71. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/route.js +1 -1
  74. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/scan/route.js +1 -1
  77. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  78. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/repositories/sync/route.js +1 -1
  80. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  81. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  84. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  85. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  88. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/skills/[id]/route.js +1 -1
  90. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/skills/route.js +1 -1
  95. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/templates/[id]/route.js +2 -2
  100. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/templates/route.js +2 -2
  102. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  107. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  110. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  113. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  119. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  122. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  125. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  174. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  177. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  180. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +3 -3
  184. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  197. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  200. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  204. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  209. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  212. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  215. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  216. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  237. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  241. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  242. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  246. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/route.js +1 -1
  265. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  266. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  268. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  270. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/page_client-reference-manifest.js +1 -1
  272. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  275. package/.next/server/app/sessions/page.js +1 -1
  276. package/.next/server/app/sessions/page.js.nft.json +1 -1
  277. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/worktrees/[id]/page.js +11 -11
  283. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  284. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app-paths-manifest.json +20 -20
  287. package/.next/server/chunks/1191.js +2 -2
  288. package/.next/server/chunks/1210.js +1 -1
  289. package/.next/server/chunks/1503.js +2 -2
  290. package/.next/server/chunks/1559.js +2 -0
  291. package/.next/server/chunks/1789.js +1 -0
  292. package/.next/server/chunks/1944.js +1 -1
  293. package/.next/server/chunks/2119.js +1 -1
  294. package/.next/server/chunks/22.js +1 -1
  295. package/.next/server/chunks/2404.js +1 -1
  296. package/.next/server/chunks/2445.js +1 -1
  297. package/.next/server/chunks/2460.js +1 -1
  298. package/.next/server/chunks/2710.js +2 -2
  299. package/.next/server/chunks/2908.js +1 -1
  300. package/.next/server/chunks/2980.js +1 -1
  301. package/.next/server/chunks/3241.js +1 -1
  302. package/.next/server/chunks/3480.js +1 -1
  303. package/.next/server/chunks/3718.js +1 -1
  304. package/.next/server/chunks/4207.js +2 -2
  305. package/.next/server/chunks/450.js +1 -1
  306. package/.next/server/chunks/{9353.js → 4718.js} +2 -2
  307. package/.next/server/chunks/4802.js +1 -1
  308. package/.next/server/chunks/4837.js +14 -0
  309. package/.next/server/chunks/5048.js +1 -1
  310. package/.next/server/chunks/5064.js +1 -1
  311. package/.next/server/chunks/5209.js +1 -0
  312. package/.next/server/chunks/5292.js +7 -0
  313. package/.next/server/chunks/5595.js +1 -1
  314. package/.next/server/chunks/5625.js +25 -0
  315. package/.next/server/chunks/5737.js +1 -1
  316. package/.next/server/chunks/6065.js +1 -1
  317. package/.next/server/chunks/611.js +1 -1
  318. package/.next/server/chunks/6130.js +1 -1
  319. package/.next/server/chunks/6401.js +1 -1
  320. package/.next/server/chunks/6781.js +1 -1
  321. package/.next/server/chunks/6793.js +3 -3
  322. package/.next/server/chunks/7491.js +2 -2
  323. package/.next/server/chunks/7905.js +1 -1
  324. package/.next/server/chunks/850.js +1 -1
  325. package/.next/server/chunks/8728.js +3 -3
  326. package/.next/server/chunks/8791.js +1 -1
  327. package/.next/server/chunks/8800.js +1 -1
  328. package/.next/server/chunks/8918.js +6 -8
  329. package/.next/server/chunks/9051.js +1 -1
  330. package/.next/server/chunks/9130.js +1 -1
  331. package/.next/server/chunks/9390.js +2 -2
  332. package/.next/server/chunks/9584.js +1 -1
  333. package/.next/server/chunks/9627.js +6 -6
  334. package/.next/server/chunks/9731.js +3 -3
  335. package/.next/server/middleware-build-manifest.js +1 -1
  336. package/.next/server/middleware-manifest.json +5 -5
  337. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  338. package/.next/server/pages/500.html +1 -1
  339. package/.next/server/server-reference-manifest.json +1 -1
  340. package/.next/static/chunks/1464.09cd37fee202ec4b.js +1 -0
  341. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  342. package/.next/static/chunks/2053-390e77fce43b555c.js +1 -0
  343. package/.next/static/chunks/{2407-051f6f84226a9f2c.js → 2407-dd4a0f04f1349221.js} +1 -1
  344. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  345. package/.next/static/chunks/{2751-9ef0f4b450bd4ef0.js → 2751-5f0b2702accd164d.js} +1 -1
  346. package/.next/static/chunks/{282.6b6f2e31a96674dd.js → 282.a1013532fd9a61b4.js} +1 -1
  347. package/.next/static/chunks/3237.94c29281d9ec122e.js +1 -0
  348. package/.next/static/chunks/3480.2e21f62e5e9d3ba5.js +1 -0
  349. package/.next/static/chunks/4290.c06dbe243819fea0.js +66 -0
  350. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
  351. package/.next/static/chunks/{5222.305dc0ebba9c0784.js → 5222.39e2034d3fce233c.js} +1 -1
  352. package/.next/static/chunks/{7095.8c869e553133a40e.js → 7095.87323a4fdf426341.js} +1 -1
  353. package/.next/static/chunks/{7485.442b21101fca7257.js → 7485.8a2a9d7c5396aa26.js} +3 -3
  354. package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
  355. package/.next/static/chunks/app/{layout-9da1ab602bcb3051.js → layout-07d040cb3d3ea657.js} +1 -1
  356. package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
  357. package/.next/static/chunks/app/worktrees/[id]/page-35f0e31a725d1c89.js +1 -0
  358. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  359. package/.next/static/chunks/{webpack-021f0741f22dd16a.js → webpack-165d8df9acd1c5d4.js} +1 -1
  360. package/.next/static/css/057f64a65726c439.css +1 -0
  361. package/.next/trace +13 -13
  362. package/dist/cli/commands/ask.d.ts.map +1 -1
  363. package/dist/cli/commands/ask.js +120 -119
  364. package/dist/cli/commands/attach.d.ts +94 -0
  365. package/dist/cli/commands/attach.d.ts.map +1 -1
  366. package/dist/cli/commands/attach.js +145 -7
  367. package/dist/cli/commands/auto-yes.js +1 -1
  368. package/dist/cli/commands/capture.d.ts.map +1 -1
  369. package/dist/cli/commands/capture.js +3 -5
  370. package/dist/cli/commands/command-target.d.ts +23 -0
  371. package/dist/cli/commands/command-target.d.ts.map +1 -0
  372. package/dist/cli/commands/command-target.js +25 -0
  373. package/dist/cli/commands/instances.d.ts.map +1 -1
  374. package/dist/cli/commands/instances.js +41 -2
  375. package/dist/cli/commands/message-dispatch.d.ts +36 -0
  376. package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
  377. package/dist/cli/commands/message-dispatch.js +63 -0
  378. package/dist/cli/commands/reply.d.ts.map +1 -1
  379. package/dist/cli/commands/reply.js +2 -5
  380. package/dist/cli/commands/respond.d.ts.map +1 -1
  381. package/dist/cli/commands/respond.js +3 -6
  382. package/dist/cli/commands/send.d.ts.map +1 -1
  383. package/dist/cli/commands/send.js +149 -146
  384. package/dist/cli/commands/skill-format.d.ts +8 -0
  385. package/dist/cli/commands/skill-format.d.ts.map +1 -1
  386. package/dist/cli/commands/skill-format.js +13 -3
  387. package/dist/cli/commands/wait.d.ts.map +1 -1
  388. package/dist/cli/commands/wait.js +657 -431
  389. package/dist/cli/types/api-responses.d.ts +156 -27
  390. package/dist/cli/types/api-responses.d.ts.map +1 -1
  391. package/dist/cli/types/api-responses.js +4 -2
  392. package/dist/cli/utils/api-client.d.ts +25 -5
  393. package/dist/cli/utils/api-client.d.ts.map +1 -1
  394. package/dist/cli/utils/api-client.js +87 -55
  395. package/dist/cli/utils/server-url.d.ts +1 -0
  396. package/dist/cli/utils/server-url.d.ts.map +1 -1
  397. package/dist/cli/utils/server-url.js +7 -0
  398. package/dist/cli/utils/verify-runner.d.ts +21 -0
  399. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  400. package/dist/cli/utils/verify-runner.js +38 -1
  401. package/dist/config/uat-isolation.d.ts +140 -0
  402. package/dist/config/uat-isolation.d.ts.map +1 -0
  403. package/dist/config/uat-isolation.js +246 -0
  404. package/dist/lib/global-state.d.ts +12 -0
  405. package/dist/lib/global-state.d.ts.map +1 -0
  406. package/dist/lib/global-state.js +16 -0
  407. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
  408. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
  409. package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
  410. package/dist/lib/session/prompt-view.d.ts +26 -3
  411. package/dist/lib/session/prompt-view.d.ts.map +1 -1
  412. package/dist/lib/session/prompt-view.js +26 -3
  413. package/dist/lib/session/status-evidence-type.d.ts +16 -0
  414. package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
  415. package/dist/lib/session/status-evidence-type.js +2 -0
  416. package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
  417. package/dist/lib/tmux/legacy-session-alias.js +2 -1
  418. package/dist/server/locales/en/worktree.json +8 -2
  419. package/dist/server/locales/ja/worktree.json +8 -2
  420. package/dist/server/src/cli/types/api-responses.js +4 -2
  421. package/dist/server/src/config/cli-tool-timing-config.js +1 -6
  422. package/dist/server/src/config/uat-isolation.js +246 -0
  423. package/dist/server/src/lib/assistant-response-saver.js +62 -3
  424. package/dist/server/src/lib/auto-yes-lifecycle.js +6 -0
  425. package/dist/server/src/lib/auto-yes-poller.js +450 -160
  426. package/dist/server/src/lib/auto-yes-state.js +2 -2
  427. package/dist/server/src/lib/cli-tools/antigravity.js +38 -79
  428. package/dist/server/src/lib/cli-tools/base.js +151 -0
  429. package/dist/server/src/lib/cli-tools/codex.js +44 -80
  430. package/dist/server/src/lib/cli-tools/command-code.js +24 -56
  431. package/dist/server/src/lib/cli-tools/copilot.js +25 -67
  432. package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
  433. package/dist/server/src/lib/cli-tools/gemini.js +23 -73
  434. package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
  435. package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
  436. package/dist/server/src/lib/cli-tools/opencode.js +21 -85
  437. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
  438. package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
  439. package/dist/server/src/lib/detection/cli-patterns.js +374 -3065
  440. package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
  441. package/dist/server/src/lib/detection/model-info-extractor.js +57 -3
  442. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
  443. package/dist/server/src/lib/detection/prompt-detector.js +2 -35
  444. package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
  445. package/dist/server/src/lib/detection/selection-shape.js +32 -520
  446. package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
  447. package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
  448. package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
  449. package/dist/server/src/lib/detection/status-detector.js +1 -1
  450. package/dist/server/src/lib/detection/tools/antigravity/detect.js +5 -29
  451. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
  452. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
  453. package/dist/server/src/lib/detection/tools/claude/detect.js +3 -14
  454. package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
  455. package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
  456. package/dist/server/src/lib/detection/tools/codex/detect.js +46 -85
  457. package/dist/server/src/lib/detection/tools/codex/live-region.js +33 -2
  458. package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
  459. package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
  460. package/dist/server/src/lib/detection/tools/command-code/detect.js +8 -50
  461. package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
  462. package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
  463. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
  464. package/dist/server/src/lib/detection/tools/context-above.js +20 -0
  465. package/dist/server/src/lib/detection/tools/copilot/detect.js +10 -35
  466. package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
  467. package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
  468. package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
  469. package/dist/server/src/lib/detection/tools/live-region-specs.js +1 -1
  470. package/dist/server/src/lib/detection/tools/opencode/detect.js +8 -49
  471. package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
  472. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +7 -42
  473. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
  474. package/dist/server/src/lib/detection/tools/run-detection.js +6 -47
  475. package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
  476. package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
  477. package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
  478. package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
  479. package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
  480. package/dist/server/src/lib/git/git-exec.js +23 -5
  481. package/dist/server/src/lib/global-state.js +16 -0
  482. package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
  483. package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
  484. package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
  485. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
  486. package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
  487. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
  488. package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
  489. package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
  490. package/dist/server/src/lib/hooks/sources/claude/self-resume.js +213 -0
  491. package/dist/server/src/lib/hooks/sources/claude/source.js +57 -10
  492. package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
  493. package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
  494. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
  495. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
  496. package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
  497. package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
  498. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
  499. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
  500. package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
  501. package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
  502. package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
  503. package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
  504. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
  505. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
  506. package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
  507. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
  508. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
  509. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
  510. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
  511. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
  512. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
  513. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
  514. package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
  515. package/dist/server/src/lib/hooks/sources/registry.js +3 -2
  516. package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
  517. package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
  518. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
  519. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
  520. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
  521. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
  522. package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
  523. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
  524. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
  525. package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
  526. package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
  527. package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
  528. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
  529. package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
  530. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
  531. package/dist/server/src/lib/polling/response-checker.js +641 -1142
  532. package/dist/server/src/lib/polling/response-dedup.js +3 -4
  533. package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
  534. package/dist/server/src/lib/polling/response-poller-core.js +54 -20
  535. package/dist/server/src/lib/polling/startup-screen.js +142 -0
  536. package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
  537. package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
  538. package/dist/server/src/lib/prompt-answer-sender.js +5 -4
  539. package/dist/server/src/lib/push/failure-episode-state.js +2 -2
  540. package/dist/server/src/lib/push/notification-dedup.js +3 -4
  541. package/dist/server/src/lib/push/prompt-card-state.js +2 -2
  542. package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
  543. package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
  544. package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -5
  545. package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
  546. package/dist/server/src/lib/relay/relay-delivery.js +3 -2
  547. package/dist/server/src/lib/relay/relay-readiness.js +38 -1
  548. package/dist/server/src/lib/response-cleaner.js +24 -1
  549. package/dist/server/src/lib/response-extractor.js +16 -0
  550. package/dist/server/src/lib/schedule-manager.js +8 -10
  551. package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
  552. package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
  553. package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
  554. package/dist/server/src/lib/session/agent-event-model.js +562 -0
  555. package/dist/server/src/lib/session/agent-event-record.js +10 -0
  556. package/dist/server/src/lib/session/agent-event-state.js +107 -1854
  557. package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
  558. package/dist/server/src/lib/session/agent-event-turn.js +862 -0
  559. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
  560. package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
  561. package/dist/server/src/lib/session/claude-executor.js +45 -5
  562. package/dist/server/src/lib/session/claude-session.js +21 -65
  563. package/dist/server/src/lib/session/cli-session.js +17 -0
  564. package/dist/server/src/lib/session/current-output-builder.js +449 -1107
  565. package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
  566. package/dist/server/src/lib/session/current-output-types.js +9 -0
  567. package/dist/server/src/lib/session/detection-divergence.js +55 -0
  568. package/dist/server/src/lib/session/global-session-constants.js +2 -13
  569. package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
  570. package/dist/server/src/lib/session/layer-disagreement.js +2 -2
  571. package/dist/server/src/lib/session/opencode-session-store.js +2 -1
  572. package/dist/server/src/lib/session/prompt-view.js +26 -3
  573. package/dist/server/src/lib/session/prompt-waiting-composition.js +3 -2
  574. package/dist/server/src/lib/session/provisional-turn.js +3 -1
  575. package/dist/server/src/lib/session/send-user-message.js +1 -1
  576. package/dist/server/src/lib/session/session-starting-state.js +4 -6
  577. package/dist/server/src/lib/session/status-evidence-type.js +2 -0
  578. package/dist/server/src/lib/session/status-evidence.js +2 -2
  579. package/dist/server/src/lib/session/structured-status-merge.js +335 -0
  580. package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
  581. package/dist/server/src/lib/session-cleanup.js +1 -5
  582. package/dist/server/src/lib/skills/install-plan.js +3 -1
  583. package/dist/server/src/lib/skills/preview-diff.js +24 -3
  584. package/dist/server/src/lib/skills/snapshot-store.js +2 -2
  585. package/dist/server/src/lib/skills/uninstall-plan.js +3 -2
  586. package/dist/server/src/lib/timer-manager.js +6 -8
  587. package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
  588. package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
  589. package/dist/server/src/lib/tmux/session-hooks.js +2 -1
  590. package/dist/server/src/lib/tmux/session-status-options.js +3 -3
  591. package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
  592. package/dist/server/src/lib/tmux/tmux.js +33 -59
  593. package/dist/server/src/lib/tui-accumulator.js +2 -2
  594. package/dist/server/src/lib/verification/env-clean-gate.js +6 -5
  595. package/dist/server/src/lib/version-checker.js +6 -6
  596. package/dist/server/src/lib/ws-server.js +47 -11
  597. package/docs/en/user-guide/commands-guide.md +0 -1
  598. package/docs/en/user-guide/webapp-guide.md +27 -3
  599. package/package.json +3 -2
  600. package/release-notes/0.44.3.json +82 -0
  601. package/release-notes/0.45.0.json +41 -0
  602. package/scripts/hooks/cmate-agent-event.sh +38 -0
  603. package/.next/server/chunks/1068.js +0 -1
  604. package/.next/server/chunks/4372.js +0 -5
  605. package/.next/server/chunks/6474.js +0 -14
  606. package/.next/server/chunks/967.js +0 -1
  607. package/.next/server/chunks/9798.js +0 -2
  608. package/.next/server/chunks/9882.js +0 -25
  609. package/.next/static/chunks/2053-85a974ddfe7498fe.js +0 -1
  610. package/.next/static/chunks/4290.6cf86f68d73b6e77.js +0 -82
  611. package/.next/static/chunks/4459.a94b52985a76509a.js +0 -1
  612. package/.next/static/chunks/591-539fec878c9dec5e.js +0 -1
  613. package/.next/static/chunks/5951.616956b6aa5df63f.js +0 -1
  614. package/.next/static/chunks/9856.15463dd58437e2ac.js +0 -1
  615. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
  616. package/.next/static/chunks/app/worktrees/[id]/page-2a81397e60f17e63.js +0 -1
  617. package/.next/static/css/38070d879efa1371.css +0 -1
  618. package/dist/server/src/lib/cli-tools/index.js +0 -41
  619. package/dist/server/src/lib/polling/global-session-poller.js +0 -140
  620. /package/.next/static/{QlCqLjorauDDBXPa-C7TK → TPWbZB3zBp3Zv_eFEOlmt}/_buildManifest.js +0 -0
  621. /package/.next/static/{QlCqLjorauDDBXPa-C7TK → TPWbZB3zBp3Zv_eFEOlmt}/_ssgManifest.js +0 -0
@@ -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
  }
@@ -44,6 +44,41 @@ const INERT_SUBSCRIPTION = {
44
44
  close: async () => { },
45
45
  liveness: { state: 'unknown' },
46
46
  };
47
+ /**
48
+ * The event normalization both factories share: their two bodies were identical.
49
+ */
50
+ function normalizeSpecEvent(spec, nativeEventNameFields, raw) {
51
+ const receivedAt = raw.receivedAt ?? Date.now();
52
+ const nativeEventName = nativeEventNameFields.length > 0
53
+ ? (0, event_mapper_1.readFirstStringField)(raw.payload, nativeEventNameFields)
54
+ : null;
55
+ // An event word the caller already resolved wins over the payload. This
56
+ // is the only channel antigravity has, and it is also how the relay
57
+ // script's `--event` reaches here for every other tool.
58
+ if (raw.event != null && (0, agent_event_types_1.isAgentEventType)(raw.event)) {
59
+ return (0, event_mapper_1.buildNormalizedEvent)({ event: raw.event }, raw.payload, receivedAt, {
60
+ detail: spec.extractDetail,
61
+ conversationId: spec.conversationIdFields,
62
+ toolCallId: spec.toolCallIdFields,
63
+ modelFields: spec.modelFields,
64
+ extractModel: spec.extractModel,
65
+ });
66
+ }
67
+ const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
68
+ if (!mapping) {
69
+ // C8. Not an error: a tool emits more events than CommandMate has words
70
+ // for, and it grows more of them between releases.
71
+ (0, event_mapper_1.recordUnknownEvent)(spec.cliToolId, nativeEventName);
72
+ return null;
73
+ }
74
+ return (0, event_mapper_1.buildNormalizedEvent)(mapping, raw.payload, receivedAt, {
75
+ detail: spec.extractDetail,
76
+ conversationId: spec.conversationIdFields,
77
+ toolCallId: spec.toolCallIdFields,
78
+ modelFields: spec.modelFields,
79
+ extractModel: spec.extractModel,
80
+ });
81
+ }
47
82
  /**
48
83
  * Build a push (hook) source from its differences.
49
84
  *
@@ -58,36 +93,7 @@ function definePushHookSource(spec) {
58
93
  noDecision: spec.noDecision,
59
94
  capabilities: spec.capabilities,
60
95
  normalizeEvent(raw) {
61
- const receivedAt = raw.receivedAt ?? Date.now();
62
- const nativeEventName = nativeEventNameFields.length > 0
63
- ? (0, event_mapper_1.readFirstStringField)(raw.payload, nativeEventNameFields)
64
- : null;
65
- // An event word the caller already resolved wins over the payload. This
66
- // is the only channel antigravity has, and it is also how the relay
67
- // script's `--event` reaches here for every other tool.
68
- if (raw.event != null && (0, agent_event_types_1.isAgentEventType)(raw.event)) {
69
- return (0, event_mapper_1.buildNormalizedEvent)({ event: raw.event }, raw.payload, receivedAt, {
70
- detail: spec.extractDetail,
71
- conversationId: spec.conversationIdFields,
72
- toolCallId: spec.toolCallIdFields,
73
- modelFields: spec.modelFields,
74
- extractModel: spec.extractModel,
75
- });
76
- }
77
- const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
78
- if (!mapping) {
79
- // C8. Not an error: a tool emits more events than CommandMate has words
80
- // for, and it grows more of them between releases.
81
- (0, event_mapper_1.recordUnknownEvent)(spec.cliToolId, nativeEventName);
82
- return null;
83
- }
84
- return (0, event_mapper_1.buildNormalizedEvent)(mapping, raw.payload, receivedAt, {
85
- detail: spec.extractDetail,
86
- conversationId: spec.conversationIdFields,
87
- toolCallId: spec.toolCallIdFields,
88
- modelFields: spec.modelFields,
89
- extractModel: spec.extractModel,
90
- });
96
+ return normalizeSpecEvent(spec, nativeEventNameFields, raw);
91
97
  },
92
98
  eventIdentityOf(payload) {
93
99
  // Issue #1899. Absent by default, because a push tool whose capability
@@ -96,6 +102,9 @@ function definePushHookSource(spec) {
96
102
  // applied to it.
97
103
  return spec.extractEventIdentity?.(payload) ?? null;
98
104
  },
105
+ promptJoinsOpenTurn(payload) {
106
+ return spec.promptJoinsOpenTurn?.(payload) ?? false;
107
+ },
99
108
  parsePermissionRequest: spec.parsePermissionRequest,
100
109
  parseQuestion: spec.parseQuestion,
101
110
  encodeVerdict(verdict) {
@@ -149,31 +158,7 @@ function definePullEventSource(spec) {
149
158
  noDecision: spec.noDecision,
150
159
  capabilities: spec.capabilities,
151
160
  normalizeEvent(raw) {
152
- const receivedAt = raw.receivedAt ?? Date.now();
153
- const nativeEventName = nativeEventNameFields.length > 0
154
- ? (0, event_mapper_1.readFirstStringField)(raw.payload, nativeEventNameFields)
155
- : null;
156
- if (raw.event != null && (0, agent_event_types_1.isAgentEventType)(raw.event)) {
157
- return (0, event_mapper_1.buildNormalizedEvent)({ event: raw.event }, raw.payload, receivedAt, {
158
- detail: spec.extractDetail,
159
- conversationId: spec.conversationIdFields,
160
- toolCallId: spec.toolCallIdFields,
161
- modelFields: spec.modelFields,
162
- extractModel: spec.extractModel,
163
- });
164
- }
165
- const mapping = (0, event_mapper_1.runEventMappers)(spec.mappers, nativeEventName, raw.payload);
166
- if (!mapping) {
167
- (0, event_mapper_1.recordUnknownEvent)(spec.cliToolId, nativeEventName);
168
- return null;
169
- }
170
- return (0, event_mapper_1.buildNormalizedEvent)(mapping, raw.payload, receivedAt, {
171
- detail: spec.extractDetail,
172
- conversationId: spec.conversationIdFields,
173
- toolCallId: spec.toolCallIdFields,
174
- modelFields: spec.modelFields,
175
- extractModel: spec.extractModel,
176
- });
161
+ return normalizeSpecEvent(spec, nativeEventNameFields, raw);
177
162
  },
178
163
  eventIdentityOf(payload) {
179
164
  // Issue #1899. See the push factory's copy — the difference is that a
@@ -39,6 +39,7 @@ exports.isPlainObject = isPlainObject;
39
39
  exports.readNestedString = readNestedString;
40
40
  exports.buildNormalizedEvent = buildNormalizedEvent;
41
41
  const agent_event_types_1 = require("../../../lib/hooks/agent-event-types");
42
+ const global_state_1 = require("../../global-state");
42
43
  /**
43
44
  * The commonest rule: this native name is always that word.
44
45
  *
@@ -69,7 +70,7 @@ function runEventMappers(mappers, nativeEventName, payload) {
69
70
  }
70
71
  /** Cap on remembered distinct names, so an unbounded vocabulary cannot grow this. */
71
72
  exports.MAX_UNKNOWN_EVENT_NAMES = 32;
72
- const unknownEvents = (globalThis.__agentSourceUnknownEvents ??= new Map());
73
+ const unknownEvents = (0, global_state_1.getOrInitGlobal)('__agentSourceUnknownEvents', () => new Map());
73
74
  /**
74
75
  * Record an event that mapped to nothing.
75
76
  *
@@ -51,15 +51,14 @@ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
51
51
  const tool_id_1 = require("./tool-id");
52
52
  const ports_1 = require("./ports");
53
53
  const client_1 = require("./client");
54
+ const global_state_1 = require("../../../global-state");
54
55
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/diff');
55
56
  /** Cap on a stored session or message id, so a hostile frame cannot grow the map. */
56
57
  const MAX_OPENCODE_DIFF_ID_LENGTH = 128;
57
58
  /** compositeKey -> that instance's diff state. */
58
- const records = globalThis.__opencodeSessionDiff ??
59
- (globalThis.__opencodeSessionDiff = new Map());
59
+ const records = (0, global_state_1.getOrInitGlobal)('__opencodeSessionDiff', () => new Map());
60
60
  /** Keys with a `GET /diff` in flight, so a poll storm makes one request. */
61
- const refreshing = globalThis.__opencodeSessionDiffRefreshes ??
62
- (globalThis.__opencodeSessionDiffRefreshes = new Set());
61
+ const refreshing = (0, global_state_1.getOrInitGlobal)('__opencodeSessionDiffRefreshes', () => new Set());
63
62
  function keyOf(target) {
64
63
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
65
64
  }
@@ -94,6 +94,7 @@ const agent_transcript_1 = require("../../../../types/agent-transcript");
94
94
  const event_mapper_1 = require("../event-mapper");
95
95
  const client_1 = require("./client");
96
96
  const transcript_1 = require("./transcript");
97
+ const global_state_1 = require("../../../global-state");
97
98
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/history');
98
99
  /**
99
100
  * Cap on turns held in memory for one instance.
@@ -120,7 +121,7 @@ exports.MAX_OPENCODE_BACKFILLED_TURNS = 50;
120
121
  * otherwise each get a private copy, and the turn accumulated by one would be
121
122
  * invisible to the other.
122
123
  */
123
- const transcripts = (globalThis.__opencodeTranscripts ??= new Map());
124
+ const transcripts = (0, global_state_1.getOrInitGlobal)('__opencodeTranscripts', () => new Map());
124
125
  function keyOf(target) {
125
126
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
126
127
  }
@@ -58,8 +58,9 @@ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
58
58
  const logger_1 = require("../../../../lib/logger");
59
59
  const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
60
60
  const opencode_instance_settings_1 = require("../../../../types/opencode-instance-settings");
61
+ const global_state_1 = require("../../../global-state");
61
62
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/launch-settings');
62
- const cache = (globalThis.__opencodeLaunchSettings ??= new Map());
63
+ const cache = (0, global_state_1.getOrInitGlobal)('__opencodeLaunchSettings', () => new Map());
63
64
  function keyOf(target) {
64
65
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
65
66
  }
@@ -41,6 +41,7 @@ exports.readOpencodePermissionSubject = readOpencodePermissionSubject;
41
41
  exports.toOpencodePendingQuestion = toOpencodePendingQuestion;
42
42
  const ask_user_question_payload_1 = require("../../../../lib/hooks/ask-user-question-payload");
43
43
  const event_mapper_1 = require("../event-mapper");
44
+ const global_state_1 = require("../../../global-state");
44
45
  /**
45
46
  * Cap on remembered `callID -> tool name` pairs.
46
47
  *
@@ -49,7 +50,7 @@ const event_mapper_1 = require("../event-mapper");
49
50
  * approval, never a wrong one.
50
51
  */
51
52
  exports.MAX_TRACKED_TOOL_CALLS = 256;
52
- const toolCallNames = (globalThis.__opencodeToolCallNames ??= new Map());
53
+ const toolCallNames = (0, global_state_1.getOrInitGlobal)('__opencodeToolCallNames', () => new Map());
53
54
  /** Record that a tool call has a name, seen on a `message.part.updated` frame. */
54
55
  function rememberOpencodeToolCall(callId, toolName) {
55
56
  toolCallNames.delete(callId);
@@ -65,12 +65,13 @@ const auto_yes_state_1 = require("../../../../lib/auto-yes-state");
65
65
  const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
66
66
  const logger_1 = require("../../../../lib/logger");
67
67
  const client_1 = require("./client");
68
+ const global_state_1 = require("../../../global-state");
68
69
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/ports');
69
70
  /** The window opencode instances are placed in. 100 ports, one per instance. */
70
71
  exports.OPENCODE_PORT_RANGE = { min: 4200, max: 4299 };
71
72
  /** How many candidates a scan will try before giving up. */
72
73
  const PORT_SPAN = exports.OPENCODE_PORT_RANGE.max - exports.OPENCODE_PORT_RANGE.min + 1;
73
- const assignments = (globalThis.__opencodePortAssignments ??= new Map());
74
+ const assignments = (0, global_state_1.getOrInitGlobal)('__opencodePortAssignments', () => new Map());
74
75
  function keyOf(target) {
75
76
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
76
77
  }
@@ -78,6 +78,7 @@ const payloads_1 = require("./payloads");
78
78
  const push_1 = require("./push");
79
79
  const ports_1 = require("./ports");
80
80
  const turn_gate_1 = require("./turn-gate");
81
+ const global_state_1 = require("../../../global-state");
81
82
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode/subscription');
82
83
  /**
83
84
  * How long a connection may be silent before it counts as dead.
@@ -102,7 +103,7 @@ const MAX_SEEN_DECISIONS = 256;
102
103
  * its overflow beats an unbounded one that does not.
103
104
  */
104
105
  exports.MAX_RESYNCED_DECISIONS = 50;
105
- const subscriptions = (globalThis.__opencodeSubscriptions ??= new Map());
106
+ const subscriptions = (0, global_state_1.getOrInitGlobal)('__opencodeSubscriptions', () => new Map());
106
107
  /**
107
108
  * The last liveness of a subscription that was **dropped rather than closed**
108
109
  * (Issue #2054).
@@ -124,7 +125,7 @@ const subscriptions = (globalThis.__opencodeSubscriptions ??= new Map());
124
125
  * Cleared when a new subscription opens on the key, and when the pane is closed:
125
126
  * a process that is gone has no degradation left to report.
126
127
  */
127
- const droppedLiveness = (globalThis.__opencodeDroppedLiveness ??= new Map());
128
+ const droppedLiveness = (0, global_state_1.getOrInitGlobal)('__opencodeDroppedLiveness', () => new Map());
128
129
  /**
129
130
  * What `AgentEventSource.probeActivity` said the last time a stream was
130
131
  * (re-)attached for this instance (Issue #2054).
@@ -134,7 +135,7 @@ const droppedLiveness = (globalThis.__opencodeDroppedLiveness ??= new Map());
134
135
  * that turn ends, so "is this pane working right now?" has no answer on the
135
136
  * stream and one `GET /session/status` is the whole of it.
136
137
  */
137
- const probedActivity = (globalThis.__opencodeProbedActivity ??= new Map());
138
+ const probedActivity = (0, global_state_1.getOrInitGlobal)('__opencodeProbedActivity', () => new Map());
138
139
  function keyOf(target) {
139
140
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
140
141
  }
@@ -210,19 +210,10 @@ function renderToolPart(part) {
210
210
  const name = part.tool ?? 'tool';
211
211
  const detail = part.title ?? null;
212
212
  const failed = part.status === 'error';
213
- const head = `- \`${name}\`${detail ? ` — ${collapseToLine(detail)}` : ''}`;
213
+ const head = `- \`${name}\`${detail ? ` — ${(0, turn_body_1.collapseToLine)(detail)}` : ''}`;
214
214
  if (!failed)
215
215
  return head;
216
- return part.error ? `${head} _(error: ${collapseToLine(part.error)})_` : `${head} _(error)_`;
217
- }
218
- /**
219
- * A tool title on one line.
220
- *
221
- * A `bash` title is the command, and a heredoc puts newlines in it. Left alone
222
- * they would end the list item and turn the rest of the command into body text.
223
- */
224
- function collapseToLine(value) {
225
- return value.replace(/\s+/g, ' ').trim();
216
+ return part.error ? `${head} _(error: ${(0, turn_body_1.collapseToLine)(part.error)})_` : `${head} _(error)_`;
226
217
  }
227
218
  /**
228
219
  * Render one turn to Markdown.
@@ -280,11 +271,7 @@ function renderOpencodeTurn(turn) {
280
271
  // now sits behind the prose, so what a 200 kB turn loses is the tail of its
281
272
  // thinking rather than the answer (Issue #2272).
282
273
  let body = separated.body;
283
- if (body.length > exports.MAX_OPENCODE_TURN_BODY_LENGTH) {
284
- body =
285
- body.slice(0, exports.MAX_OPENCODE_TURN_BODY_LENGTH - exports.OPENCODE_TURN_TRUNCATION_MARKER.length) +
286
- exports.OPENCODE_TURN_TRUNCATION_MARKER;
287
- }
274
+ body = (0, turn_body_1.truncateTurnBody)(body, exports.MAX_OPENCODE_TURN_BODY_LENGTH, exports.OPENCODE_TURN_TRUNCATION_MARKER);
288
275
  return {
289
276
  sessionId: turn.sessionId,
290
277
  userMessageId: turn.userMessageId,
@@ -111,6 +111,7 @@ const transcript_1 = require("../opencode/transcript");
111
111
  const client_1 = require("./client");
112
112
  const secrets_1 = require("./secrets");
113
113
  const tool_id_1 = require("./tool-id");
114
+ const global_state_1 = require("../../../global-state");
114
115
  const logger = (0, logger_1.createLogger)('lib/hooks/sources/opencode-v2/history');
115
116
  /** The stream events after which a turn's reply is read (Issue #2940). */
116
117
  exports.OPENCODE_V2_TURN_END_EVENT_TYPES = [
@@ -271,7 +272,7 @@ function readLatestOpencodeV2AssistantModel(entries) {
271
272
  * ends close together would otherwise race the existence check and insert the
272
273
  * same turn twice.
273
274
  */
274
- const queue = (globalThis.__opencodeV2HistoryQueue ??= new Map());
275
+ const queue = (0, global_state_1.getOrInitGlobal)('__opencodeV2HistoryQueue', () => new Map());
275
276
  /** Forget queued syncs. Test seam. */
276
277
  function resetOpencodeV2HistoryQueue() {
277
278
  queue.clear();