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
@@ -63,7 +63,9 @@
63
63
  * start. Those post too, with the environment variables unset; the relay omits
64
64
  * the correlation keys it does not have and the receiver falls back to
65
65
  * resolving the worktree from `cwd`, which is exactly the hand-configured
66
- * behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off.
66
+ * behaviour of Issue #1549. `CM_AGENT_HOOKS_INJECT=0` turns the whole thing off;
67
+ * `CM_UAT_ISOLATION=1` keeps it on without writing any shared file (Issue #3360,
68
+ * {@link reuseCodexHookSettingsReadOnly}).
67
69
  *
68
70
  * ## The shared app-server daemon (Issue #2874)
69
71
  *
@@ -96,12 +98,15 @@ exports.buildCodexPermissionHookCommand = buildCodexPermissionHookCommand;
96
98
  exports.buildCodexHookSettings = buildCodexHookSettings;
97
99
  exports.mergeCodexHookSettings = mergeCodexHookSettings;
98
100
  exports.writeCodexHookSettings = writeCodexHookSettings;
101
+ exports.inspectCodexSharedHooksReadOnly = inspectCodexSharedHooksReadOnly;
102
+ exports.reuseCodexHookSettingsReadOnly = reuseCodexHookSettingsReadOnly;
99
103
  exports.buildCodexLaunchPlan = buildCodexLaunchPlan;
100
104
  const child_process_1 = require("child_process");
101
105
  const fs_1 = require("fs");
102
106
  const os_1 = require("os");
103
107
  const path_1 = require("path");
104
108
  const safe_directory_1 = require("../../../../config/safe-directory");
109
+ const uat_isolation_1 = require("../../../../config/uat-isolation");
105
110
  const types_1 = require("../../../../lib/cli-tools/types");
106
111
  const env_1 = require("../../../../lib/env");
107
112
  const hook_settings_generator_1 = require("../../../../lib/hooks/hook-settings-generator");
@@ -313,6 +318,13 @@ function isCodexHookTrustBypassEnabled() {
313
318
  function shouldTrustCodexHooks(worktreePath) {
314
319
  if (resolveCodexHookTrustPolicy() === 'never')
315
320
  return false;
321
+ // Issue #3360: a grant is codex writing the user's own `config.toml`, which a
322
+ // UAT / daily-check server must not cause. Declined, the hooks stay inert for
323
+ // that session — the "no hooks" case the UAT already has to tolerate.
324
+ // Issue #3312: under `own-home` the `config.toml` is the dedicated user's and
325
+ // was checked with the rest of `$CODEX_HOME` before the launch, so it may.
326
+ if ((0, uat_isolation_1.getUatIsolationMode)() === 'shared-read-only')
327
+ return false;
316
328
  try {
317
329
  // codex reads `<cwd>/.codex/hooks.json` as well as the home one, and a
318
330
  // review that includes a hook from the repository is a review this server
@@ -531,6 +543,10 @@ function mergeCodexHookSettings(existing, generated) {
531
543
  base.hooks = merged;
532
544
  return base;
533
545
  }
546
+ /** The bytes `hooks.json` should hold, given what it holds now. */
547
+ function renderCodexHookSettings(existing, options) {
548
+ return `${JSON.stringify(mergeCodexHookSettings(existing, buildCodexHookSettings(options)), null, 2)}\n`;
549
+ }
534
550
  /**
535
551
  * Write the hooks file, and answer where it is.
536
552
  *
@@ -543,6 +559,21 @@ function mergeCodexHookSettings(existing, generated) {
543
559
  */
544
560
  function writeCodexHookSettings(options = {}) {
545
561
  const settingsPath = getCodexHooksPath(options);
562
+ // Issue #3360: UAT isolation never writes the shared files. See
563
+ // {@link reuseCodexHookSettingsReadOnly}. Issue #3312: `own-home` writes
564
+ // them, after checking every path below is inside the dedicated user's HOME
565
+ // (and refuses the launch when one is not).
566
+ const codexHome = getCodexHome(options);
567
+ const relayPath = (0, relay_install_1.getCodexRelayInstallPath)(codexHome);
568
+ const policy = (0, uat_isolation_1.sharedHookWritePolicy)('codex', [
569
+ codexHome,
570
+ settingsPath,
571
+ relayPath,
572
+ (0, relay_install_1.getCodexRelayStagingPath)(relayPath),
573
+ (0, path_1.join)(codexHome, 'config.toml'),
574
+ ]);
575
+ if (policy === 'read-only')
576
+ return reuseCodexHookSettingsReadOnly(options);
546
577
  // Issue #2315: put the relay where the generated file can name it without
547
578
  // naming a checkout, BEFORE the content is built — `buildCodexHookSettings`
548
579
  // only reads what is installed, so an install that had not happened yet would
@@ -550,7 +581,15 @@ function writeCodexHookSettings(options = {}) {
550
581
  // between. Best-effort by construction: the installer never throws, and a
551
582
  // machine where it cannot write simply keeps whatever copy is already there.
552
583
  if (options.relayScriptPath === undefined) {
553
- (0, relay_install_1.installCodexRelayScript)(getCodexHome(options), (0, hook_settings_generator_1.resolveRelayScriptPath)());
584
+ if ((0, uat_isolation_1.getUatIsolationMode)() === 'own-home') {
585
+ // Issue #3312: a relay that could not be updated is a failed
586
+ // preparation here (the caller refuses the launch), not an older relay
587
+ // the check would quietly run against.
588
+ (0, relay_install_1.installCodexRelayScriptOrThrow)(codexHome, (0, hook_settings_generator_1.resolveRelayScriptPath)());
589
+ }
590
+ else {
591
+ (0, relay_install_1.installCodexRelayScript)(codexHome, (0, hook_settings_generator_1.resolveRelayScriptPath)());
592
+ }
554
593
  }
555
594
  let existing = null;
556
595
  let previous = null;
@@ -569,19 +608,100 @@ function writeCodexHookSettings(options = {}) {
569
608
  return null;
570
609
  }
571
610
  }
572
- const content = `${JSON.stringify(mergeCodexHookSettings(existing, buildCodexHookSettings(options)), null, 2)}\n`;
611
+ const content = renderCodexHookSettings(existing, options);
573
612
  if (previous === content)
574
613
  return settingsPath;
575
614
  (0, fs_1.mkdirSync)((0, path_1.dirname)(settingsPath), { recursive: true, mode: 0o700 });
576
615
  (0, fs_1.writeFileSync)(settingsPath, content, { mode: 0o600 });
577
616
  return settingsPath;
578
617
  }
618
+ /**
619
+ * Whether the shared `$CODEX_HOME/hooks.json` may be used, unwritten, by a
620
+ * server in UAT isolation mode (`CM_UAT_ISOLATION=1`, Issue #3360).
621
+ *
622
+ * `$CODEX_HOME/hooks.json`, the installed relay and the hook trust in
623
+ * `config.toml` are shared with the user's production server and live beside
624
+ * codex's login, so they cannot be moved for a UAT either. They do not need to
625
+ * be written to work for one: the file holds no port, worktree or instance —
626
+ * {@link buildCodexLaunchPlan} hands those to the session in its environment —
627
+ * so a file production has already written delivers this session's events to
628
+ * THIS server.
629
+ *
630
+ * Usable means exactly one thing: the file is byte-identical to what this build
631
+ * writes into an EMPTY file. Comparing against the merge with what is there
632
+ * ({@link mergeCodexHookSettings}) would not do — the merge keeps the user's own
633
+ * handlers, so a file holding a hand-written hook that posts straight to
634
+ * production would compare equal and run in the UAT session. So these are all
635
+ * unusable, each with its reason: no file, an unreadable one, hooks or keys
636
+ * CommandMate did not write, a file this build would change (a newer or older
637
+ * CommandMate), or an installed relay whose bytes differ from the one this build
638
+ * ships (the command string would match while running another script).
639
+ */
640
+ function inspectCodexSharedHooksReadOnly(options = {}) {
641
+ const settingsPath = getCodexHooksPath(options);
642
+ if (options.relayScriptPath === undefined) {
643
+ const shipped = (0, hook_settings_generator_1.resolveRelayScriptPath)();
644
+ const installed = (0, relay_install_1.getCodexRelayInstallPath)(getCodexHome(options));
645
+ try {
646
+ if (shipped &&
647
+ (0, fs_1.existsSync)(installed) &&
648
+ (0, fs_1.readFileSync)(shipped, 'utf8') !== (0, fs_1.readFileSync)(installed, 'utf8')) {
649
+ logger.info('codex-hooks-shared-relay-differs-readonly', { installed });
650
+ return { usable: false, reason: `the installed relay ${installed} differs from the one this build ships`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
651
+ }
652
+ }
653
+ catch {
654
+ return { usable: false, reason: `the installed relay ${installed} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
655
+ }
656
+ }
657
+ try {
658
+ if (!(0, fs_1.existsSync)(settingsPath)) {
659
+ logger.info('codex-hooks-shared-absent-readonly', { settingsPath });
660
+ return { usable: false, reason: `${settingsPath} does not exist`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
661
+ }
662
+ const previous = (0, fs_1.readFileSync)(settingsPath, 'utf8');
663
+ if (previous === renderCodexHookSettings(null, options)) {
664
+ return { usable: true, settingsPath };
665
+ }
666
+ if (previous === renderCodexHookSettings(JSON.parse(previous), options)) {
667
+ logger.info('codex-hooks-shared-foreign-readonly', { settingsPath });
668
+ return {
669
+ usable: false,
670
+ reason: `${settingsPath} also holds hooks (or keys) CommandMate did not write, which would run in the UAT session`,
671
+ fix: 'Skip codex scenarios in this UAT, or run it where the shared hooks file holds only the hooks CommandMate writes.',
672
+ };
673
+ }
674
+ logger.info('codex-hooks-shared-differs-readonly', { settingsPath });
675
+ return { usable: false, reason: `${settingsPath} differs from what this build writes`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
676
+ }
677
+ catch (error) {
678
+ logger.warn('codex-hooks-config-unreadable', {
679
+ settingsPath,
680
+ error: error instanceof Error ? error.message : String(error),
681
+ });
682
+ return { usable: false, reason: `${settingsPath} could not be read`, fix: uat_isolation_1.UAT_SAME_BUILD_FIX };
683
+ }
684
+ }
685
+ /**
686
+ * {@link writeCodexHookSettings} for a server in UAT isolation mode: the path
687
+ * when {@link inspectCodexSharedHooksReadOnly} finds the shared file usable,
688
+ * else null — which the launch plan turns into a refused launch
689
+ * ({@link UatIsolationLaunchRefusedError}), not "codex without hooks", because
690
+ * a bare codex reads the shared file anyway.
691
+ */
692
+ function reuseCodexHookSettingsReadOnly(options = {}) {
693
+ const inspection = inspectCodexSharedHooksReadOnly(options);
694
+ return inspection.usable ? inspection.settingsPath : null;
695
+ }
579
696
  /**
580
697
  * The plan that starts codex for one instance.
581
698
  *
582
- * Never throws: hooks are an enhancement to a session that has to start anyway,
583
- * so anything that goes wrong here returns the bare executable — which is
584
- * byte-for-byte the pre-#1760 launch.
699
+ * Never throws outside UAT isolation: hooks are an enhancement to a session
700
+ * that has to start anyway, so anything that goes wrong here returns the bare
701
+ * executable — which is byte-for-byte the pre-#1760 launch. Under
702
+ * `CM_UAT_ISOLATION=1` (Issue #3360) each of those roads throws
703
+ * {@link UatIsolationLaunchRefusedError} instead: a bare codex still reads the
704
+ * shared, trusted `hooks.json`.
585
705
  *
586
706
  * The environment assignments are the per-session half of the design. The
587
707
  * hooks file cannot hold them (there is one file for the machine), the payload
@@ -604,19 +724,33 @@ function writeCodexHookSettings(options = {}) {
604
724
  */
605
725
  function buildCodexLaunchPlan(executablePath, target, options = {}) {
606
726
  const bare = { command: executablePath, settingsPath: null, env: {} };
607
- if (!(0, hook_settings_generator_1.isHookInjectionEnabled)())
727
+ // Issue #3360: under UAT isolation every road to `bare` is refused instead.
728
+ // A bare codex still reads `$CODEX_HOME/hooks.json` — production's trusted
729
+ // hooks, with no correlation keys and no `--no-daemon` — so "without hooks"
730
+ // would really be "with production's hooks, posting to production".
731
+ const fallback = (reason, fix) => {
732
+ if ((0, uat_isolation_1.isUatIsolationEnabled)())
733
+ throw new uat_isolation_1.UatIsolationLaunchRefusedError('codex', reason, fix);
608
734
  return bare;
735
+ };
736
+ if (!(0, hook_settings_generator_1.isHookInjectionEnabled)()) {
737
+ return fallback('CM_AGENT_HOOKS_INJECT=0', 'Do not combine CM_AGENT_HOOKS_INJECT=0 with UAT isolation.');
738
+ }
609
739
  const instanceId = target.instanceId ?? tool_id_1.CODEX_CLI_TOOL_ID;
610
740
  if (!(0, path_validator_1.isValidWorktreeId)(target.worktreeId) || !(0, types_1.isValidInstanceId)(instanceId)) {
611
741
  // Both become URL parameters the receiver re-validates; a value that would
612
742
  // be rejected there is not worth injecting.
613
743
  logger.warn('codex-hooks-invalid-correlation-key', { worktreeId: target.worktreeId });
614
- return bare;
744
+ return fallback('the worktree or instance id is not a valid correlation key', 'Use a valid worktree and instance id.');
615
745
  }
616
746
  try {
617
747
  const settingsPath = writeCodexHookSettings(options);
618
- if (!settingsPath)
619
- return bare;
748
+ if (!settingsPath) {
749
+ const inspection = (0, uat_isolation_1.getUatIsolationMode)() === 'shared-read-only' ? inspectCodexSharedHooksReadOnly(options) : null;
750
+ if (inspection && !inspection.usable)
751
+ return fallback(inspection.reason, inspection.fix);
752
+ return fallback(`${getCodexHooksPath(options)} or its relay is missing or differs from what this build writes`, uat_isolation_1.UAT_SAME_BUILD_FIX);
753
+ }
620
754
  const port = options.port ?? (0, env_1.getServerPort)();
621
755
  const query = new URLSearchParams({
622
756
  tool: tool_id_1.CODEX_CLI_TOOL_ID,
@@ -652,10 +786,12 @@ function buildCodexLaunchPlan(executablePath, target, options = {}) {
652
786
  };
653
787
  }
654
788
  catch (error) {
789
+ if (error instanceof uat_isolation_1.UatIsolationLaunchRefusedError)
790
+ throw error;
655
791
  logger.warn('codex-hooks-config-write-failed', {
656
792
  worktreeId: target.worktreeId,
657
793
  error: error instanceof Error ? error.message : String(error),
658
794
  });
659
- return bare;
795
+ return fallback(`the hook config could not be prepared (${error instanceof Error ? error.message : String(error)})`, uat_isolation_1.UAT_SAME_BUILD_FIX);
660
796
  }
661
797
  }
@@ -57,6 +57,8 @@ exports.CODEX_RELAY_INSTALL_BASENAME = exports.CODEX_RELAY_INSTALL_DIRNAME = voi
57
57
  exports.getCodexRelayInstallPath = getCodexRelayInstallPath;
58
58
  exports.getInstalledCodexRelayPath = getInstalledCodexRelayPath;
59
59
  exports.installCodexRelayScript = installCodexRelayScript;
60
+ exports.installCodexRelayScriptOrThrow = installCodexRelayScriptOrThrow;
61
+ exports.getCodexRelayStagingPath = getCodexRelayStagingPath;
60
62
  const fs_1 = require("fs");
61
63
  const path_1 = require("path");
62
64
  const logger_1 = require("../../../../lib/logger");
@@ -109,27 +111,7 @@ function installCodexRelayScript(codexHome, sourcePath) {
109
111
  const target = getCodexRelayInstallPath(codexHome);
110
112
  if (sourcePath && sourcePath !== target) {
111
113
  try {
112
- const desired = (0, fs_1.readFileSync)(sourcePath, 'utf8');
113
- const current = (0, fs_1.existsSync)(target) ? (0, fs_1.readFileSync)(target, 'utf8') : null;
114
- if (current !== desired) {
115
- (0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
116
- // `.tmp` beside the target so the rename cannot cross a filesystem.
117
- const staging = `${target}.tmp`;
118
- try {
119
- (0, fs_1.writeFileSync)(staging, desired, { mode: 0o700 });
120
- (0, fs_1.renameSync)(staging, target);
121
- }
122
- catch (error) {
123
- try {
124
- (0, fs_1.unlinkSync)(staging);
125
- }
126
- catch {
127
- // Nothing to clean up, or nothing that can be.
128
- }
129
- throw error;
130
- }
131
- logger.info('codex-relay-installed', { target });
132
- }
114
+ copyRelayIfChanged(sourcePath, target);
133
115
  }
134
116
  catch (error) {
135
117
  // An install that failed is not a launch that failed. If a previous
@@ -143,3 +125,64 @@ function installCodexRelayScript(codexHome, sourcePath) {
143
125
  }
144
126
  return (0, fs_1.existsSync)(target) ? target : null;
145
127
  }
128
+ /**
129
+ * {@link installCodexRelayScript} for `CM_UAT_ISOLATION=own-home` (Issue #3312):
130
+ * every failure throws instead of being absorbed — no shipped relay, a copy
131
+ * that could not be written, an installed copy whose bytes still differ from
132
+ * the shipped one — so the launch plan refuses the launch rather than running
133
+ * the check against an older relay.
134
+ *
135
+ * @returns The installed path, byte-identical to `sourcePath`
136
+ * @throws When the relay is missing or could not be made identical
137
+ */
138
+ function installCodexRelayScriptOrThrow(codexHome, sourcePath) {
139
+ if (!sourcePath)
140
+ throw new Error('this build ships no relay script');
141
+ const target = getCodexRelayInstallPath(codexHome);
142
+ if (sourcePath !== target)
143
+ copyRelayIfChanged(sourcePath, target);
144
+ if (!(0, fs_1.existsSync)(target) || (0, fs_1.readFileSync)(target, 'utf8') !== (0, fs_1.readFileSync)(sourcePath, 'utf8')) {
145
+ throw new Error(`the installed relay ${target} differs from the one this build ships`);
146
+ }
147
+ return target;
148
+ }
149
+ /**
150
+ * Copy `sourcePath` to `target` when the bytes differ. Throws on any failure.
151
+ *
152
+ * The write goes through `<target>.tmp` and a rename, because the file being
153
+ * replaced is one a *running* codex session may be executing at that moment —
154
+ * truncating it in place would hand that session half a script. The temp file
155
+ * is removed first and then created exclusively (`wx`), so a symlink planted
156
+ * at that name is removed, never written through (Issue #3312).
157
+ */
158
+ function copyRelayIfChanged(sourcePath, target) {
159
+ const desired = (0, fs_1.readFileSync)(sourcePath, 'utf8');
160
+ const current = (0, fs_1.existsSync)(target) ? (0, fs_1.readFileSync)(target, 'utf8') : null;
161
+ if (current === desired)
162
+ return;
163
+ (0, fs_1.mkdirSync)((0, path_1.dirname)(target), { recursive: true, mode: 0o700 });
164
+ // `.tmp` beside the target so the rename cannot cross a filesystem.
165
+ const staging = getCodexRelayStagingPath(target);
166
+ try {
167
+ unlinkIfPresent(staging);
168
+ (0, fs_1.writeFileSync)(staging, desired, { mode: 0o700, flag: 'wx' });
169
+ (0, fs_1.renameSync)(staging, target);
170
+ }
171
+ catch (error) {
172
+ unlinkIfPresent(staging);
173
+ throw error;
174
+ }
175
+ logger.info('codex-relay-installed', { target });
176
+ }
177
+ /** The temp file the relay is written to before it is renamed over `target`. */
178
+ function getCodexRelayStagingPath(target) {
179
+ return `${target}.tmp`;
180
+ }
181
+ function unlinkIfPresent(file) {
182
+ try {
183
+ (0, fs_1.unlinkSync)(file);
184
+ }
185
+ catch {
186
+ // Nothing to clean up, or nothing that can be.
187
+ }
188
+ }
@@ -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.