commandmate 0.44.1 → 0.44.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +169 -169
  3. package/.next/app-path-routes-manifest.json +35 -35
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/react-loadable-manifest.json +0 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route.js +1 -1
  10. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/agents/versions/route.js +1 -1
  12. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update/route.js +2 -2
  15. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/login/route.js +1 -1
  18. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/capabilities/route.js +1 -1
  22. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/route.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  28. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  31. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/route.js +1 -1
  33. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  37. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  40. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  41. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  43. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  44. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/push/escalation/route.js +1 -1
  48. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/push/subscriptions/route.js +2 -2
  50. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/push/vapid/route.js +1 -1
  52. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  53. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  54. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  55. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/relays/route.js +1 -1
  57. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  58. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  61. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  63. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/clone/route.js +1 -1
  66. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/restore/route.js +1 -1
  70. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  71. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/repositories/route.js +1 -1
  73. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  74. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/repositories/scan/route.js +1 -1
  76. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  77. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/repositories/sync/route.js +1 -1
  79. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  80. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  83. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  84. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/sidebar/group-order/route.js +1 -1
  87. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/skills/[id]/route.js +1 -1
  89. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/skills/route.js +1 -1
  94. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/[id]/route.js +2 -2
  99. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/templates/route.js +2 -2
  101. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +3 -3
  117. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -2
  192. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -2
  195. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  208. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  211. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/schedules/route.js +3 -3
  214. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  215. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  219. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  240. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/route.js +1 -1
  264. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  267. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  269. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  270. package/.next/server/app/page_client-reference-manifest.js +1 -1
  271. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  273. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  274. package/.next/server/app/sessions/page.js +1 -1
  275. package/.next/server/app/sessions/page.js.nft.json +1 -1
  276. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/worktrees/[id]/page.js +11 -11
  282. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  283. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app-paths-manifest.json +35 -35
  286. package/.next/server/chunks/1191.js +2 -2
  287. package/.next/server/chunks/1210.js +1 -1
  288. package/.next/server/chunks/1559.js +2 -0
  289. package/.next/server/chunks/1789.js +1 -0
  290. package/.next/server/chunks/2119.js +1 -1
  291. package/.next/server/chunks/2404.js +1 -1
  292. package/.next/server/chunks/2445.js +1 -1
  293. package/.next/server/chunks/2460.js +1 -0
  294. package/.next/server/chunks/2710.js +1 -1
  295. package/.next/server/chunks/2908.js +1 -0
  296. package/.next/server/chunks/2980.js +1 -1
  297. package/.next/server/chunks/3241.js +1 -1
  298. package/.next/server/chunks/3480.js +1 -1
  299. package/.next/server/chunks/3718.js +1 -1
  300. package/.next/server/chunks/4207.js +2 -2
  301. package/.next/server/chunks/450.js +1 -1
  302. package/.next/server/chunks/4672.js +5 -0
  303. package/.next/server/chunks/{9353.js → 4718.js} +2 -2
  304. package/.next/server/chunks/4837.js +14 -0
  305. package/.next/server/chunks/5048.js +1 -1
  306. package/.next/server/chunks/5209.js +1 -0
  307. package/.next/server/chunks/5595.js +1 -0
  308. package/.next/server/chunks/5625.js +25 -0
  309. package/.next/server/chunks/5845.js +1 -0
  310. package/.next/server/chunks/611.js +1 -1
  311. package/.next/server/chunks/6130.js +1 -1
  312. package/.next/server/chunks/6401.js +1 -1
  313. package/.next/server/chunks/6781.js +1 -1
  314. package/.next/server/chunks/6793.js +3 -3
  315. package/.next/server/chunks/7491.js +2 -2
  316. package/.next/server/chunks/7905.js +1 -1
  317. package/.next/server/chunks/850.js +1 -0
  318. package/.next/server/chunks/8543.js +1 -1
  319. package/.next/server/chunks/8728.js +3 -3
  320. package/.next/server/chunks/8791.js +1 -1
  321. package/.next/server/chunks/8800.js +1 -1
  322. package/.next/server/chunks/8918.js +7 -7
  323. package/.next/server/chunks/9130.js +1 -5
  324. package/.next/server/chunks/9390.js +2 -3
  325. package/.next/server/chunks/9584.js +1 -1
  326. package/.next/server/chunks/9627.js +6 -6
  327. package/.next/server/chunks/9731.js +3 -3
  328. package/.next/server/middleware-manifest.json +5 -5
  329. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  330. package/.next/server/pages/500.html +1 -1
  331. package/.next/server/server-reference-manifest.json +1 -1
  332. package/.next/static/chunks/{1642-fb2e176aaadbd137.js → 1642-767aed8e7c61ef7f.js} +1 -1
  333. package/.next/static/chunks/{2407-f1f258d4a1d92620.js → 2407-06d35bb1aa02de80.js} +1 -1
  334. package/.next/static/chunks/{2619-04bc32f026a0d946.js → 2619-a305ad4810f1393a.js} +1 -1
  335. package/.next/static/chunks/4727-5d695d71e3fdf97b.js +1 -0
  336. package/.next/static/chunks/{8165-3853772f6ae1299b.js → 8165-3525fb42f1b4976e.js} +1 -1
  337. package/.next/static/chunks/app/{layout-da66300cc20244ed.js → layout-0d1750b833f5cc3e.js} +1 -1
  338. package/.next/static/chunks/app/sessions/page-2af68c63211c751f.js +1 -0
  339. package/.next/static/chunks/app/worktrees/[id]/page-e36898c3a80e7302.js +1 -0
  340. package/.next/static/chunks/app/worktrees/[id]/terminal/{page-373ea37b16d930c7.js → page-c601f3b3ece6557e.js} +1 -1
  341. package/.next/static/css/057f64a65726c439.css +1 -0
  342. package/.next/trace +13 -13
  343. package/dist/cli/commands/ask.d.ts.map +1 -1
  344. package/dist/cli/commands/ask.js +120 -119
  345. package/dist/cli/commands/attach.d.ts +94 -0
  346. package/dist/cli/commands/attach.d.ts.map +1 -1
  347. package/dist/cli/commands/attach.js +145 -7
  348. package/dist/cli/commands/auto-yes.js +1 -1
  349. package/dist/cli/commands/capture.d.ts.map +1 -1
  350. package/dist/cli/commands/capture.js +10 -13
  351. package/dist/cli/commands/command-target.d.ts +23 -0
  352. package/dist/cli/commands/command-target.d.ts.map +1 -0
  353. package/dist/cli/commands/command-target.js +25 -0
  354. package/dist/cli/commands/instances.d.ts.map +1 -1
  355. package/dist/cli/commands/instances.js +41 -2
  356. package/dist/cli/commands/message-dispatch.d.ts +36 -0
  357. package/dist/cli/commands/message-dispatch.d.ts.map +1 -0
  358. package/dist/cli/commands/message-dispatch.js +63 -0
  359. package/dist/cli/commands/reply.d.ts.map +1 -1
  360. package/dist/cli/commands/reply.js +2 -5
  361. package/dist/cli/commands/respond.d.ts.map +1 -1
  362. package/dist/cli/commands/respond.js +3 -6
  363. package/dist/cli/commands/send.d.ts.map +1 -1
  364. package/dist/cli/commands/send.js +149 -146
  365. package/dist/cli/commands/wait.d.ts.map +1 -1
  366. package/dist/cli/commands/wait.js +608 -416
  367. package/dist/cli/types/api-responses.d.ts +174 -27
  368. package/dist/cli/types/api-responses.d.ts.map +1 -1
  369. package/dist/cli/types/api-responses.js +4 -2
  370. package/dist/cli/utils/api-client.d.ts +25 -5
  371. package/dist/cli/utils/api-client.d.ts.map +1 -1
  372. package/dist/cli/utils/api-client.js +87 -55
  373. package/dist/cli/utils/server-url.d.ts +1 -0
  374. package/dist/cli/utils/server-url.d.ts.map +1 -1
  375. package/dist/cli/utils/server-url.js +7 -0
  376. package/dist/config/uat-isolation.d.ts +140 -0
  377. package/dist/config/uat-isolation.d.ts.map +1 -0
  378. package/dist/config/uat-isolation.js +246 -0
  379. package/dist/lib/global-state.d.ts +12 -0
  380. package/dist/lib/global-state.d.ts.map +1 -0
  381. package/dist/lib/global-state.js +16 -0
  382. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +33 -0
  383. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -0
  384. package/dist/lib/polling/auto-yes-suppression-reason.js +2 -0
  385. package/dist/lib/session/prompt-view.d.ts +228 -0
  386. package/dist/lib/session/prompt-view.d.ts.map +1 -0
  387. package/dist/lib/session/prompt-view.js +290 -0
  388. package/dist/lib/session/status-evidence-type.d.ts +16 -0
  389. package/dist/lib/session/status-evidence-type.d.ts.map +1 -0
  390. package/dist/lib/session/status-evidence-type.js +2 -0
  391. package/dist/lib/tmux/legacy-session-alias.d.ts.map +1 -1
  392. package/dist/lib/tmux/legacy-session-alias.js +2 -1
  393. package/dist/server/locales/en/worktree.json +3 -1
  394. package/dist/server/locales/ja/worktree.json +3 -1
  395. package/dist/server/server.js +5 -3
  396. package/dist/server/src/cli/types/api-responses.js +4 -2
  397. package/dist/server/src/config/cli-tool-timing-config.js +1 -6
  398. package/dist/server/src/config/uat-isolation.js +246 -0
  399. package/dist/server/src/lib/assistant-response-saver.js +62 -3
  400. package/dist/server/src/lib/auto-yes-lifecycle.js +139 -0
  401. package/dist/server/src/lib/auto-yes-poller.js +465 -160
  402. package/dist/server/src/lib/auto-yes-state.js +2 -2
  403. package/dist/server/src/lib/cli-tools/antigravity.js +39 -80
  404. package/dist/server/src/lib/cli-tools/base.js +151 -0
  405. package/dist/server/src/lib/cli-tools/codex.js +44 -80
  406. package/dist/server/src/lib/cli-tools/command-code.js +24 -56
  407. package/dist/server/src/lib/cli-tools/copilot.js +25 -67
  408. package/dist/server/src/lib/cli-tools/direct-input.js +8 -0
  409. package/dist/server/src/lib/cli-tools/gemini.js +23 -73
  410. package/dist/server/src/lib/cli-tools/opencode-pane-width.js +53 -0
  411. package/dist/server/src/lib/cli-tools/opencode-v2.js +9 -7
  412. package/dist/server/src/lib/cli-tools/opencode.js +21 -85
  413. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +127 -4
  414. package/dist/server/src/lib/cli-tools/vibe-local.js +21 -66
  415. package/dist/server/src/lib/detection/cli-patterns.js +374 -3047
  416. package/dist/server/src/lib/detection/idle-evidence-observation.js +2 -2
  417. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +7 -32
  418. package/dist/server/src/lib/detection/prompt-detector.js +2 -35
  419. package/dist/server/src/lib/detection/selection-shape-patterns.js +69 -0
  420. package/dist/server/src/lib/detection/selection-shape.js +32 -520
  421. package/dist/server/src/lib/detection/shared/pasted-text.js +41 -0
  422. package/dist/server/src/lib/detection/shared/shell-pane-command.js +16 -0
  423. package/dist/server/src/lib/detection/shared/strip-box-drawing.js +25 -0
  424. package/dist/server/src/lib/detection/status-detector.js +1 -1
  425. package/dist/server/src/lib/detection/tools/antigravity/detect.js +12 -60
  426. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +2 -15
  427. package/dist/server/src/lib/detection/tools/antigravity/live-region.js +39 -0
  428. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +286 -0
  429. package/dist/server/src/lib/detection/tools/claude/detect.js +11 -17
  430. package/dist/server/src/lib/detection/tools/claude/live-region.js +26 -0
  431. package/dist/server/src/lib/detection/tools/claude/patterns.js +264 -4
  432. package/dist/server/src/lib/detection/tools/claude/prompt.js +2 -10
  433. package/dist/server/src/lib/detection/tools/codex/cli-patterns.js +1 -1
  434. package/dist/server/src/lib/detection/tools/codex/detect.js +71 -130
  435. package/dist/server/src/lib/detection/tools/codex/live-region.js +104 -0
  436. package/dist/server/src/lib/detection/tools/codex/patterns.js +855 -0
  437. package/dist/server/src/lib/detection/tools/codex/prompt.js +2 -10
  438. package/dist/server/src/lib/detection/tools/command-code/detect.js +19 -50
  439. package/dist/server/src/lib/detection/tools/command-code/dialog.js +2 -18
  440. package/dist/server/src/lib/detection/tools/command-code/live-region.js +36 -0
  441. package/dist/server/src/lib/detection/tools/command-code/patterns.js +234 -0
  442. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +461 -0
  443. package/dist/server/src/lib/detection/tools/context-above.js +20 -0
  444. package/dist/server/src/lib/detection/tools/copilot/detect.js +13 -35
  445. package/dist/server/src/lib/detection/tools/copilot/live-region.js +52 -0
  446. package/dist/server/src/lib/detection/tools/copilot/patterns.js +640 -0
  447. package/dist/server/src/lib/detection/tools/copilot/prompt.js +2 -10
  448. package/dist/server/src/lib/detection/tools/frame.js +36 -2
  449. package/dist/server/src/lib/detection/tools/gemini/patterns.js +29 -0
  450. package/dist/server/src/lib/detection/tools/live-region-specs.js +31 -0
  451. package/dist/server/src/lib/detection/tools/live-region.js +204 -0
  452. package/dist/server/src/lib/detection/tools/opencode/detect.js +11 -49
  453. package/dist/server/src/lib/detection/tools/opencode/live-region.js +24 -0
  454. package/dist/server/src/lib/detection/tools/opencode/patterns.js +508 -0
  455. package/dist/server/src/lib/detection/tools/opencode-gutter-live-region.js +72 -0
  456. package/dist/server/src/lib/detection/tools/opencode-v2/detect.js +10 -42
  457. package/dist/server/src/lib/detection/tools/opencode-v2/live-region.js +24 -0
  458. package/dist/server/src/lib/detection/tools/opencode-v2/patterns.js +63 -0
  459. package/dist/server/src/lib/detection/tools/run-detection.js +31 -50
  460. package/dist/server/src/lib/detection/tools/verdicts.js +59 -0
  461. package/dist/server/src/lib/detection/tools/vibe-local/patterns.js +20 -0
  462. package/dist/server/src/lib/detection/truncate-raw-content.js +38 -0
  463. package/dist/server/src/lib/detection/turn-abandoned.js +66 -0
  464. package/dist/server/src/lib/detection/unclassified-frame-tracker.js +2 -2
  465. package/dist/server/src/lib/global-state.js +16 -0
  466. package/dist/server/src/lib/hooks/agent-session-telemetry.js +4 -6
  467. package/dist/server/src/lib/hooks/permission-decision-state.js +2 -2
  468. package/dist/server/src/lib/hooks/sources/antigravity/history.js +11 -76
  469. package/dist/server/src/lib/hooks/sources/antigravity/hooks-config.js +63 -1
  470. package/dist/server/src/lib/hooks/sources/antigravity/source.js +16 -0
  471. package/dist/server/src/lib/hooks/sources/antigravity/transcript.js +3 -12
  472. package/dist/server/src/lib/hooks/sources/claude/history.js +17 -156
  473. package/dist/server/src/lib/hooks/sources/claude/queued-notice.js +53 -0
  474. package/dist/server/src/lib/hooks/sources/claude/source.js +33 -3
  475. package/dist/server/src/lib/hooks/sources/claude/transcript.js +3 -13
  476. package/dist/server/src/lib/hooks/sources/codex/history.js +11 -74
  477. package/dist/server/src/lib/hooks/sources/codex/hooks-config.js +147 -11
  478. package/dist/server/src/lib/hooks/sources/codex/relay-install.js +64 -21
  479. package/dist/server/src/lib/hooks/sources/codex/transcript.js +5 -15
  480. package/dist/server/src/lib/hooks/sources/command-code/history.js +20 -121
  481. package/dist/server/src/lib/hooks/sources/command-code/transcript.js +3 -13
  482. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +161 -31
  483. package/dist/server/src/lib/hooks/sources/define-source.js +40 -55
  484. package/dist/server/src/lib/hooks/sources/event-mapper.js +2 -1
  485. package/dist/server/src/lib/hooks/sources/opencode/diff.js +3 -4
  486. package/dist/server/src/lib/hooks/sources/opencode/history.js +2 -1
  487. package/dist/server/src/lib/hooks/sources/opencode/launch-settings.js +2 -1
  488. package/dist/server/src/lib/hooks/sources/opencode/payloads.js +2 -1
  489. package/dist/server/src/lib/hooks/sources/opencode/ports.js +2 -1
  490. package/dist/server/src/lib/hooks/sources/opencode/subscription.js +4 -3
  491. package/dist/server/src/lib/hooks/sources/opencode/transcript.js +3 -16
  492. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +2 -1
  493. package/dist/server/src/lib/hooks/sources/opencode-v2/mappers.js +5 -4
  494. package/dist/server/src/lib/hooks/sources/opencode-v2/ports.js +2 -1
  495. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +3 -7
  496. package/dist/server/src/lib/hooks/sources/opencode-v2/usage.js +2 -1
  497. package/dist/server/src/lib/hooks/sources/pending-decisions.js +2 -1
  498. package/dist/server/src/lib/hooks/sources/registry.js +3 -2
  499. package/dist/server/src/lib/hooks/sources/transcript-history.js +262 -0
  500. package/dist/server/src/lib/hooks/sources/turn-body.js +31 -0
  501. package/dist/server/src/lib/hooks/tool-input-normalization-state.js +2 -2
  502. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +2 -2
  503. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +16 -4
  504. package/dist/server/src/lib/polling/auto-yes-enter-fallback-state.js +142 -0
  505. package/dist/server/src/lib/polling/auto-yes-enter-fallback.js +187 -0
  506. package/dist/server/src/lib/polling/auto-yes-resolver.js +9 -3
  507. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +2 -0
  508. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +2 -2
  509. package/dist/server/src/lib/polling/pending-scraped-response.js +190 -0
  510. package/dist/server/src/lib/polling/prompt-dedup-state.js +2 -2
  511. package/dist/server/src/lib/polling/prompt-dedup.js +2 -2
  512. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +95 -0
  513. package/dist/server/src/lib/polling/response-checker-extraction-result.js +50 -0
  514. package/dist/server/src/lib/polling/response-checker-extraction-steps.js +670 -0
  515. package/dist/server/src/lib/polling/response-checker.js +666 -1162
  516. package/dist/server/src/lib/polling/response-dedup.js +3 -4
  517. package/dist/server/src/lib/polling/response-poller-constants.js +17 -0
  518. package/dist/server/src/lib/polling/response-poller-core.js +54 -20
  519. package/dist/server/src/lib/polling/startup-screen.js +142 -0
  520. package/dist/server/src/lib/polling/structured-history-gate.js +3 -2
  521. package/dist/server/src/lib/prompt-answer-semantic.js +178 -0
  522. package/dist/server/src/lib/prompt-answer-sender.js +6 -5
  523. package/dist/server/src/lib/push/failure-episode-state.js +2 -2
  524. package/dist/server/src/lib/push/notification-dedup.js +3 -4
  525. package/dist/server/src/lib/push/prompt-card-state.js +2 -2
  526. package/dist/server/src/lib/push/waiting-push-notifier.js +3 -4
  527. package/dist/server/src/lib/realtime/publisher-registry.js +3 -2
  528. package/dist/server/src/lib/realtime/terminal-broadcast.js +38 -2
  529. package/dist/server/src/lib/realtime/terminal-session-ownership.js +45 -0
  530. package/dist/server/src/lib/relay/relay-delivery.js +6 -2
  531. package/dist/server/src/lib/relay/relay-readiness.js +38 -1
  532. package/dist/server/src/lib/relay/relay-triggers.js +9 -0
  533. package/dist/server/src/lib/resource-cleanup.js +6 -4
  534. package/dist/server/src/lib/response-cleaner.js +24 -1
  535. package/dist/server/src/lib/response-extractor.js +16 -0
  536. package/dist/server/src/lib/schedule-manager.js +8 -10
  537. package/dist/server/src/lib/session/agent-event-ask-user-question.js +168 -0
  538. package/dist/server/src/lib/session/agent-event-awaiting-instruction.js +104 -0
  539. package/dist/server/src/lib/session/agent-event-dedup.js +539 -0
  540. package/dist/server/src/lib/session/agent-event-model.js +562 -0
  541. package/dist/server/src/lib/session/agent-event-record.js +10 -0
  542. package/dist/server/src/lib/session/agent-event-state.js +106 -1854
  543. package/dist/server/src/lib/session/agent-event-structured-state.js +109 -0
  544. package/dist/server/src/lib/session/agent-event-turn.js +811 -0
  545. package/dist/server/src/lib/session/agent-session-lifecycle.js +11 -2
  546. package/dist/server/src/lib/session/chat-turn-progress.js +322 -0
  547. package/dist/server/src/lib/session/claude-executor.js +45 -5
  548. package/dist/server/src/lib/session/claude-session.js +21 -65
  549. package/dist/server/src/lib/session/cli-session.js +17 -0
  550. package/dist/server/src/lib/session/current-output-builder.js +454 -1103
  551. package/dist/server/src/lib/session/current-output-history-writers.js +255 -0
  552. package/dist/server/src/lib/session/current-output-types.js +9 -0
  553. package/dist/server/src/lib/session/detection-divergence.js +55 -0
  554. package/dist/server/src/lib/session/global-session-constants.js +2 -13
  555. package/dist/server/src/lib/session/hook-turn-hold.js +102 -0
  556. package/dist/server/src/lib/session/layer-disagreement.js +2 -2
  557. package/dist/server/src/lib/session/opencode-session-store.js +2 -1
  558. package/dist/server/src/lib/session/prompt-view.js +290 -0
  559. package/dist/server/src/lib/session/prompt-waiting-composition.js +35 -0
  560. package/dist/server/src/lib/session/provisional-turn.js +3 -1
  561. package/dist/server/src/lib/session/send-user-message.js +1 -1
  562. package/dist/server/src/lib/session/session-starting-state.js +4 -6
  563. package/dist/server/src/lib/session/status-evidence-type.js +2 -0
  564. package/dist/server/src/lib/session/status-evidence.js +2 -2
  565. package/dist/server/src/lib/session/structured-status-merge.js +335 -0
  566. package/dist/server/src/lib/session/waiting-episode-state.js +3 -4
  567. package/dist/server/src/lib/session/waiting-kind.js +3 -0
  568. package/dist/server/src/lib/session-cleanup.js +6 -8
  569. package/dist/server/src/lib/skills/install-plan.js +2 -1
  570. package/dist/server/src/lib/skills/snapshot-store.js +2 -2
  571. package/dist/server/src/lib/skills/uninstall-plan.js +2 -2
  572. package/dist/server/src/lib/timer-manager.js +6 -8
  573. package/dist/server/src/lib/tmux/geometry-delegation.js +3 -4
  574. package/dist/server/src/lib/tmux/legacy-session-alias.js +2 -1
  575. package/dist/server/src/lib/tmux/session-hooks.js +2 -1
  576. package/dist/server/src/lib/tmux/session-status-options.js +3 -3
  577. package/dist/server/src/lib/tmux/tmux-capture-cache.js +3 -2
  578. package/dist/server/src/lib/tmux/tmux.js +33 -59
  579. package/dist/server/src/lib/tui-accumulator.js +2 -2
  580. package/dist/server/src/lib/version-checker.js +6 -6
  581. package/dist/server/src/lib/ws-server.js +47 -11
  582. package/docs/en/user-guide/webapp-guide.md +27 -3
  583. package/package.json +1 -1
  584. package/release-notes/0.44.2.json +33 -0
  585. package/release-notes/0.44.3.json +82 -0
  586. package/scripts/hooks/cmate-agent-event.sh +18 -0
  587. package/.next/server/chunks/1068.js +0 -1
  588. package/.next/server/chunks/434.js +0 -1
  589. package/.next/server/chunks/5775.js +0 -1
  590. package/.next/server/chunks/6474.js +0 -14
  591. package/.next/server/chunks/650.js +0 -1
  592. package/.next/server/chunks/6661.js +0 -1
  593. package/.next/server/chunks/8583.js +0 -1
  594. package/.next/server/chunks/964.js +0 -1
  595. package/.next/server/chunks/967.js +0 -1
  596. package/.next/server/chunks/9882.js +0 -25
  597. package/.next/static/chunks/591-308072f285c34787.js +0 -1
  598. package/.next/static/chunks/app/sessions/page-049e06335187aa91.js +0 -1
  599. package/.next/static/chunks/app/worktrees/[id]/page-040c5f0f585e6812.js +0 -1
  600. package/.next/static/css/38070d879efa1371.css +0 -1
  601. package/dist/server/src/lib/cli-tools/index.js +0 -41
  602. package/dist/server/src/lib/polling/global-session-poller.js +0 -140
  603. /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_buildManifest.js +0 -0
  604. /package/.next/static/{57lOiz8zSEHdw97XIm0af → tWwHQzmvc-rv9KKUtDWfQ}/_ssgManifest.js +0 -0
@@ -57,6 +57,7 @@ const opencode_config_1 = require("./opencode-config");
57
57
  const tmux_pane_config_1 = require("../../config/tmux-pane-config");
58
58
  Object.defineProperty(exports, "OPENCODE_PANE_HEIGHT", { enumerable: true, get: function () { return tmux_pane_config_1.OPENCODE_PANE_HEIGHT; } });
59
59
  Object.defineProperty(exports, "OPENCODE_PANE_WIDTH", { enumerable: true, get: function () { return tmux_pane_config_1.OPENCODE_PANE_WIDTH; } });
60
+ const opencode_pane_width_1 = require("./opencode-pane-width");
60
61
  const child_process_1 = require("child_process");
61
62
  const path_1 = require("path");
62
63
  const util_1 = require("util");
@@ -76,61 +77,11 @@ const install_hints_1 = require("./install-hints");
76
77
  const opencode_executable_1 = require("./opencode-executable");
77
78
  const log_diagnosis_1 = require("../../lib/hooks/sources/opencode/log-diagnosis");
78
79
  const launch_screen_1 = require("../../lib/session/launch-screen");
80
+ const errors_1 = require("../../lib/errors");
79
81
  const logger = (0, logger_1.createLogger)('cli-tools/opencode');
80
82
  const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
81
- /**
82
- * Extract error message from unknown error type (DRY)
83
- * Same pattern as claude-session.ts / codex.ts / gemini.ts / vibe-local.ts.
84
- * A shared version exists in src/lib/errors.ts (getErrorMessage), but CLI tool
85
- * modules use local copies to avoid importing the server-side error module.
86
- * [D1-002] Future refactoring candidate: extract to BaseCLITool or a shared util.
87
- */
88
- function getErrorMessage(error) {
89
- return error instanceof Error ? error.message : String(error);
90
- }
91
83
  /** OpenCode TUI graceful exit command [D1-006] */
92
84
  exports.OPENCODE_EXIT_COMMAND = '/exit';
93
- /**
94
- * {@link resolveOpencodePaneWidth}, plus the one-line operator feedback the
95
- * pure config module deliberately cannot emit (Issue #2047).
96
- *
97
- * `tmux-pane-config.ts` has no imports at all — that is a documented property
98
- * (#1906), and pulling the logger in there would make every consumer of a
99
- * constant depend on the logging stack. So the resolver stays silent and the
100
- * warning lives here, at the two call sites that actually resize a pane.
101
- *
102
- * Two things are worth telling the operator, and neither is an error:
103
- *
104
- * - the value was DROPPED (not an integer, or outside the accepted bounds), so
105
- * the pane they are about to look at is the 80-column default rather than
106
- * what they asked for;
107
- * - the value was ACCEPTED but lands at or above
108
- * {@link OPENCODE_SIDEBAR_MIN_WIDTH}, where opencode 1.18.22 paints its
109
- * right-hand sidebar into the same rows as the transcript. #2047 measured
110
- * what that does to this repo's own readers — a saved "reply" made entirely
111
- * of sidebar chrome, a status flip on an aborted turn, and a false idle
112
- * composer off the session title. It is still allowed, because an operator
113
- * who only ever reads the pane in the browser may want it; it is not silent.
114
- *
115
- * @returns Pane width in columns, ready to hand to `resize-window`.
116
- */
117
- function resolveOpencodePaneWidthChecked() {
118
- const requested = process.env[tmux_pane_config_1.OPENCODE_PANE_WIDTH_ENV];
119
- const width = (0, tmux_pane_config_1.resolveOpencodePaneWidth)();
120
- if (requested !== undefined && String(width) !== requested.trim()) {
121
- logger.warn('opencode-pane-width-rejected', {
122
- requested,
123
- applied: width,
124
- });
125
- }
126
- else if (width >= tmux_pane_config_1.OPENCODE_SIDEBAR_MIN_WIDTH) {
127
- logger.warn('opencode-pane-width-sidebar-visible', {
128
- width,
129
- sidebarMinWidth: tmux_pane_config_1.OPENCODE_SIDEBAR_MIN_WIDTH,
130
- });
131
- }
132
- return width;
133
- }
134
85
  /**
135
86
  * Interval between readiness polls while opencode paints its TUI (Issue #1908).
136
87
  *
@@ -238,13 +189,6 @@ class OpenCodeTool extends base_1.BaseCLITool {
238
189
  async isInstalled() {
239
190
  return (await (0, opencode_executable_1.resolveOpencodeV1Executable)()).executable !== null;
240
191
  }
241
- /**
242
- * Check if OpenCode session is running for a worktree
243
- */
244
- async isRunning(worktreeId, instanceId) {
245
- const sessionName = this.getSessionName(worktreeId, instanceId);
246
- return await (0, tmux_1.hasSession)(sessionName);
247
- }
248
192
  /**
249
193
  * Start a new OpenCode session for a worktree
250
194
  * Launches `opencode` TUI in interactive mode within tmux
@@ -262,6 +206,9 @@ class OpenCodeTool extends base_1.BaseCLITool {
262
206
  }
263
207
  const sessionName = this.getSessionName(worktreeId, instanceId);
264
208
  const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
209
+ // Issue #3296: resolved ONCE. The relaunch path uses it twice (reconcile and
210
+ // resize), and resolving at each site printed the same warn twice.
211
+ const paneWidth = (0, opencode_pane_width_1.resolveOpencodePaneWidthChecked)({ warnSidebar: true });
265
212
  const exists = await (0, tmux_1.hasSession)(sessionName);
266
213
  if (exists) {
267
214
  // Issue #2047: the SAME width as the creation path below. These two used
@@ -270,7 +217,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
270
217
  // a reconnect would silently hand the detectors a geometry the creation
271
218
  // path had been moved away from.
272
219
  await this.reconcileExistingSession(sessionName, worktreePath, {
273
- windowWidth: resolveOpencodePaneWidthChecked(),
220
+ windowWidth: paneWidth,
274
221
  windowHeight: tmux_pane_config_1.OPENCODE_PANE_HEIGHT,
275
222
  });
276
223
  // Issue #2070: is opencode still the thing drawing this pane? The two
@@ -295,7 +242,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
295
242
  // the pane is the same one AND the process is the same process, so
296
243
  // fencing here would discard a still-valid verdict on every reconnect.
297
244
  await (0, runtime_1.resumeOpencodeEventStream)(target, worktreePath);
298
- logger.info('opencode-session-sessionname');
245
+ logger.info('opencode-session-exists');
299
246
  return;
300
247
  }
301
248
  logger.warn('opencode-session-relaunch', { sessionName });
@@ -332,14 +279,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
332
279
  // exists; the resize below still runs, because a pane that was created
333
280
  // before #2047 carries the geometry of its own era either way.
334
281
  if (!exists) {
335
- // Create tmux session. Scrollback depth comes from the shared
336
- // TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
337
- await (0, tmux_1.createSession)({
338
- sessionName,
339
- workingDirectory: worktreePath,
340
- });
341
- // Wait a moment for the session to be created
342
- await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
282
+ await this.createLaunchPane(sessionName, worktreePath);
343
283
  }
344
284
  // Resize tmux window so opencode's right-hand sidebar stays hidden and
345
285
  // `capture-pane` returns transcript rows only. Issue #2047 measured the
@@ -350,7 +290,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
350
290
  await execFileAsync('tmux', [
351
291
  // Issue #1156: exact-match target so resize never leaks to a prefix-colliding instance
352
292
  'resize-window', '-t', (0, tmux_1.exactTarget)(sessionName),
353
- '-x', String(resolveOpencodePaneWidthChecked()), '-y', String(tmux_pane_config_1.OPENCODE_PANE_HEIGHT),
293
+ '-x', String(paneWidth), '-y', String(tmux_pane_config_1.OPENCODE_PANE_HEIGHT),
354
294
  ]);
355
295
  }
356
296
  catch {
@@ -419,10 +359,10 @@ class OpenCodeTool extends base_1.BaseCLITool {
419
359
  throw new Error((0, log_diagnosis_1.buildOpencodeSharedDataConflictMessage)(conflict));
420
360
  }
421
361
  }
422
- logger.info('started-opencode-session:sessionname');
362
+ logger.info('started-opencode-session');
423
363
  }
424
364
  catch (error) {
425
- const errorMessage = getErrorMessage(error);
365
+ const errorMessage = (0, errors_1.getErrorMessage)(error);
426
366
  throw new Error(`Failed to start OpenCode session: ${errorMessage}`);
427
367
  }
428
368
  }
@@ -625,7 +565,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
625
565
  logger.warn('opencode-send-api-failed', {
626
566
  worktreeId: target.worktreeId,
627
567
  instanceId,
628
- error: getErrorMessage(error),
568
+ error: (0, errors_1.getErrorMessage)(error),
629
569
  });
630
570
  return false;
631
571
  }
@@ -676,10 +616,6 @@ class OpenCodeTool extends base_1.BaseCLITool {
676
616
  */
677
617
  async sendMessage(worktreeId, message, instanceId) {
678
618
  const sessionName = this.getSessionName(worktreeId, instanceId);
679
- const exists = await (0, tmux_1.hasSession)(sessionName);
680
- if (!exists) {
681
- throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
682
- }
683
619
  // Issue #2070: the pane exists, but does the AGENT? An agent that quit,
684
620
  // updated itself or crashed leaves its tmux session behind, and the send
685
621
  // that followed used to sit in the readiness wait until it timed out —
@@ -691,7 +627,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
691
627
  // typing the message into a shell prompt. The relaunch reserves a port and
692
628
  // re-attaches, so the server path is available again by the time it is
693
629
  // tried. `sendMessageWithImage` reaches this through its own fallback.
694
- await this.relaunchIfToolExited(worktreeId, instanceId);
630
+ await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: true });
695
631
  if (await this.trySendViaServer((0, runtime_1.opencodeTarget)(worktreeId, instanceId), message)) {
696
632
  // Issue #405: the transcript grew, so the cached capture is stale — the
697
633
  // same reason the keystroke path invalidates below.
@@ -709,10 +645,10 @@ class OpenCodeTool extends base_1.BaseCLITool {
709
645
  });
710
646
  // Issue #405: Invalidate cache after sending message
711
647
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
712
- logger.info('sent-message-to-opencode-session:session');
648
+ logger.info('sent-message-to-opencode-session');
713
649
  }
714
650
  catch (error) {
715
- const errorMessage = getErrorMessage(error);
651
+ const errorMessage = (0, errors_1.getErrorMessage)(error);
716
652
  throw new Error(`Failed to send message to OpenCode: ${errorMessage}`);
717
653
  }
718
654
  }
@@ -756,10 +692,7 @@ class OpenCodeTool extends base_1.BaseCLITool {
756
692
  */
757
693
  async sendMessageWithImage(worktreeId, message, imagePath, instanceId) {
758
694
  const sessionName = this.getSessionName(worktreeId, instanceId);
759
- const exists = await (0, tmux_1.hasSession)(sessionName);
760
- if (!exists) {
761
- throw new Error(`OpenCode session ${sessionName} does not exist. Start the session first.`);
762
- }
695
+ await this.requireSession('OpenCode', worktreeId, instanceId, { relaunch: false });
763
696
  const target = (0, runtime_1.opencodeTarget)(worktreeId, instanceId);
764
697
  if (await this.trySendViaServer(target, message, imagePath)) {
765
698
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
@@ -869,10 +802,13 @@ class OpenCodeTool extends base_1.BaseCLITool {
869
802
  }
870
803
  // Issue #405: Invalidate cache after session kill
871
804
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
872
- logger.info('stopped-opencode-session:sessionname');
805
+ // Logged unconditionally: after a successful `/exit` no tmux kill runs, so
806
+ // there is no `killed` value to test, unlike `requestExitAndKill` in
807
+ // base.ts (logs only when the kill returned true) (#3232).
808
+ logger.info('stopped-opencode-session');
873
809
  }
874
810
  catch (error) {
875
- logger.error('session:stop-failed', { error: getErrorMessage(error) });
811
+ logger.error('session:stop-failed', { error: (0, errors_1.getErrorMessage)(error) });
876
812
  throw error;
877
813
  }
878
814
  }
@@ -67,6 +67,18 @@
67
67
  * bracketed paste, which the TUI reads as a unit), and Enter is withheld until
68
68
  * the composer shows the whole of it ({@link classifyPasteLanded}). The
69
69
  * measurements are in `docs/design/2464-long-body-repro-matrix.md`.
70
+ *
71
+ * Issue #3366 is the Enter arriving before the body on codex. codex 0.160.0
72
+ * holds fast keystrokes back as a "paste burst" and draws them only once the
73
+ * burst is over — measured at 200x1000: 34 characters after ~180 ms, 80 after
74
+ * ~380 ms, 135 after ~630 ms, 539 after ~2.2 s — and an Enter that lands inside
75
+ * the burst becomes a newline in the composer. The old fixed 100 ms wait pressed
76
+ * Enter there, and the read-back 200 ms later still saw the idle placeholder
77
+ * (the body had not been drawn yet), which it read as "the message left the
78
+ * box": `Message sent.`, with the body sitting unsent in the composer. So for
79
+ * codex, Enter now waits until the composer shows the typed body
80
+ * ({@link confirmTypedBodyLanded}); a body that never appears THROWS before
81
+ * Enter, as #2464 does for a paste.
70
82
  */
71
83
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
72
84
  if (k2 === undefined) k2 = k;
@@ -116,6 +128,7 @@ const cli_patterns_1 = require("../detection/cli-patterns");
116
128
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
117
129
  const logger_1 = require("../../lib/logger");
118
130
  const composer_clear_1 = require("../../lib/session/composer-clear");
131
+ const composer_text_1 = require("../../lib/detection/composer-text");
119
132
  const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
120
133
  /**
121
134
  * Version-resilient pasted-text placeholder.
@@ -149,6 +162,20 @@ exports.LITERAL_SEND_MAX_BYTES = 512;
149
162
  const PASTE_LANDED_POLL_MS = 100;
150
163
  /** Composer reads before a paste that has not fully appeared is abandoned (2 s). */
151
164
  const DEFAULT_PASTE_LANDED_ATTEMPTS = 20;
165
+ /**
166
+ * How often the composer is read while a TYPED body is expected to appear in it
167
+ * (Issue #3366). codex draws a burst of keystrokes all at once when the burst
168
+ * ends, so the poll only decides how late after that moment Enter goes in.
169
+ */
170
+ const TYPED_BODY_POLL_MS = 50;
171
+ /**
172
+ * Composer reads before a typed body that has not appeared is abandoned (5 s).
173
+ *
174
+ * codex 0.160.0 drew a 539-character body ~2.2 s after `send-keys` — about 4 ms
175
+ * per character — and a typed body is at most {@link LITERAL_SEND_MAX_BYTES},
176
+ * so this is roughly twice the slowest draw measured, for a loaded machine.
177
+ */
178
+ const DEFAULT_TYPED_BODY_ATTEMPTS = 100;
152
179
  /** Per-command timeout for `load-buffer` / `paste-buffer`, as for every other tmux call. */
153
180
  const PASTE_COMMAND_TIMEOUT_MS = 5000;
154
181
  /** Makes each send's tmux paste buffer name unique within this process. */
@@ -384,6 +411,32 @@ function comparePasteToken(token, message) {
384
411
  return 'landed';
385
412
  return observed < Math.min(...accepted) ? 'pasting' : 'mismatch';
386
413
  }
414
+ /**
415
+ * The composer as {@link classifySubmit} reads it (Issue #3205).
416
+ *
417
+ * {@link readComposer}'s marker reader takes the bottom-most `›` row of the
418
+ * tail as the input line. A codex composer holding several lines draws its
419
+ * continuation rows under the `›` row, and when one of them itself begins with
420
+ * `›` — a body quoting a dialog's `› 1. Yes, proceed (y)` — that continuation
421
+ * row was read as the input line: its text is not the body's first line, so a
422
+ * body still sitting in the composer was classified `submitted` (F). Measured:
423
+ * `tests/fixtures/codex-multiline-composer-3205/tc104-raw-pane.txt`.
424
+ *
425
+ * So for codex a composer of two or more rows is read with
426
+ * `extractComposerText` — the #1890 reader `awaitTypedBody` already uses —
427
+ * and its first line is the input line. Every other frame (a one-row
428
+ * composer, an empty or ghost one, none at all, another tool) is read exactly
429
+ * as before.
430
+ */
431
+ function readSubmitComposer(output, cliToolId, reader, lines, windowLines) {
432
+ if (cliToolId === 'codex' && reader === 'input-line-marker') {
433
+ const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
434
+ if (read.state === 'content' && read.text.includes('\n')) {
435
+ return { kind: 'text', text: firstNonBlankLine(read.text), rows: read.text.split('\n') };
436
+ }
437
+ }
438
+ return readComposer(reader, lines, windowLines);
439
+ }
387
440
  /**
388
441
  * Classify a captured pane into submitted / pending / replaced (Issue #1501).
389
442
  *
@@ -428,7 +481,7 @@ function classifySubmit(output, cliToolId, message, composerSpec = (0, composer_
428
481
  if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
429
482
  return 'submitted';
430
483
  }
431
- const composer = readComposer(composerSpec.reader, lines, windowLines);
484
+ const composer = readSubmitComposer(output, cliToolId, composerSpec.reader, lines, windowLines);
432
485
  // B. No composer visible (scrolled off / dialog / still starting), or the
433
486
  // composer is empty => the message left the box => submitted.
434
487
  if (composer.kind !== 'text') {
@@ -625,6 +678,66 @@ async function confirmPasteLanded(params) {
625
678
  throw new Error(`Message body did not arrive intact for session ${sessionName}: ${what}; the message is ${bytes} bytes / ${lineCount} lines. ` +
626
679
  'Enter was not pressed, so nothing was submitted (Issue #2464).');
627
680
  }
681
+ /** The text with every whitespace character removed — wrapping and indent proof. */
682
+ function compactText(text) {
683
+ return text.replace(/\s+/g, '');
684
+ }
685
+ /**
686
+ * The part of a typed body the composer reader can see (Issue #3366).
687
+ *
688
+ * The codex reader takes the composer as one run of non-blank rows, so a blank
689
+ * line inside the body ends what it returns: what it can show is the body up to
690
+ * its first blank line after the first non-blank one. Leading blank lines are
691
+ * kept — they are drawn as composer rows of their own and compact to nothing.
692
+ */
693
+ function visibleTypedBody(message) {
694
+ const lines = message.split('\n');
695
+ const first = lines.findIndex((line) => line.trim() !== '');
696
+ if (first < 0)
697
+ return '';
698
+ const blank = lines.findIndex((line, index) => index > first && line.trim() === '');
699
+ return lines.slice(0, blank < 0 ? lines.length : blank).join('\n');
700
+ }
701
+ /**
702
+ * Wait until the composer shows the typed body; only then may Enter be pressed
703
+ * (Issue #3366).
704
+ *
705
+ * codex 0.160.0 keeps fast keystrokes in a "paste burst" and inserts them in
706
+ * one go when the burst ends, which took ~4 ms per character at 200x1000
707
+ * (`tests/fixtures/codex-send-burst-3366/`). Until then the composer shows its
708
+ * dim `Ask Codex to do anything`, and an Enter that lands in the burst becomes a
709
+ * newline under the body. The verdict is therefore "the composer's real (not
710
+ * dim) text is the body", read with `extractComposerText`, and nothing less:
711
+ * a prefix is not enough, because codex can draw the first keystrokes before it
712
+ * decides the rest are a burst.
713
+ *
714
+ * A body that never appears is taken back out and the send THROWS without
715
+ * Enter — nothing was submitted, so the caller must not print `Message sent.`.
716
+ *
717
+ * @throws Error when the composer does not show the body within the attempts
718
+ */
719
+ async function confirmTypedBodyLanded(params) {
720
+ const { sessionName, message, cliToolId, composer, attempts } = params;
721
+ const expected = compactText(visibleTypedBody(message));
722
+ if (expected === '')
723
+ return;
724
+ let output = '';
725
+ for (let attempt = 0; attempt < Math.max(1, attempts); attempt++) {
726
+ await new Promise((resolve) => setTimeout(resolve, TYPED_BODY_POLL_MS));
727
+ output = await (0, tmux_1.capturePane)(sessionName, { startLine: -composer.verifyCaptureLines });
728
+ const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
729
+ if (read.state === 'content' && compactText(read.text) === expected)
730
+ return;
731
+ }
732
+ const bytes = Buffer.byteLength(message, 'utf8');
733
+ const shown = describeComposer(output, composer);
734
+ await withdrawUnsentBody(sessionName, cliToolId, composer);
735
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
736
+ logger.error('typed-body-not-landed', { sessionName, cliToolId, bytes, attempts, shown });
737
+ throw new Error(`Message body did not appear in the composer for session ${sessionName} within ` +
738
+ `${attempts * TYPED_BODY_POLL_MS}ms (it shows ${shown}); the message is ${bytes} bytes. ` +
739
+ 'Enter was not pressed, so nothing was submitted (Issue #3366).');
740
+ }
628
741
  /**
629
742
  * Empty the composer before the body is typed into it (Issue #1880).
630
743
  *
@@ -719,7 +832,7 @@ async function clearComposerBeforeSend(sessionName, cliToolId, composerSpec = (0
719
832
  * confirmed within the bounded attempts.
720
833
  */
721
834
  async function sendMessageWithSubmitVerification(params) {
722
- const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, pasteLandedAttempts = DEFAULT_PASTE_LANDED_ATTEMPTS, } = params;
835
+ const { sessionName, message, cliToolId, composer = (0, composer_spec_1.resolveComposerSpec)(cliToolId), textInputWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, interEnterWaitMs = cli_tool_timing_config_1.TUI_TEXT_INPUT_WAIT_MS, verifyAttempts = DEFAULT_VERIFY_ATTEMPTS, verifyDelayMs = cli_tool_timing_config_1.TUI_MESSAGE_PROCESSED_WAIT_MS, pasteLandedAttempts = DEFAULT_PASTE_LANDED_ATTEMPTS, awaitTypedBody = false, typedBodyAttempts = DEFAULT_TYPED_BODY_ATTEMPTS, } = params;
723
836
  const submitEnterCount = params.submitEnterCount ?? composer.submitEnterCount;
724
837
  // 0. Empty the composer first (Issue #1880). The body below is typed at the
725
838
  // TUI's current cursor position, so anything already in the box would be
@@ -748,9 +861,19 @@ async function sendMessageWithSubmitVerification(params) {
748
861
  // sent SIGINT — and a body starting with `-` was eaten by getopt and sent
749
862
  // nowhere at all, with `rc 0`. All four measured on tmux 3.5a; the argv is
750
863
  // built in `lib/tmux/key-sequence.ts`, which carries the table.
864
+ const typedAt = Date.now();
751
865
  await (0, tmux_1.sendKeys)(sessionName, message, false, { literal: true });
752
- // 2. Let the TUI register the input before pressing Enter.
753
- await new Promise((resolve) => setTimeout(resolve, textInputWaitMs));
866
+ // 2. Let the TUI register the input before pressing Enter. On codex that
867
+ // means waiting until the body is drawn (Issue #3366): an Enter pressed
868
+ // while codex still holds the keystrokes as a paste burst becomes a
869
+ // newline, and the body stays unsent. The fixed wait stays as a floor.
870
+ if (awaitTypedBody && composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId)) {
871
+ await confirmTypedBodyLanded({ sessionName, message, cliToolId, composer, attempts: typedBodyAttempts });
872
+ }
873
+ const remaining = textInputWaitMs - (Date.now() - typedAt);
874
+ if (remaining > 0) {
875
+ await new Promise((resolve) => setTimeout(resolve, remaining));
876
+ }
754
877
  }
755
878
  // 3. Submit as a separate command (double Enter for vibe-local's IME mode).
756
879
  for (let i = 0; i < Math.max(1, submitEnterCount); i++) {
@@ -19,16 +19,10 @@ const db_instance_1 = require("../db/db-instance");
19
19
  const db_1 = require("../db");
20
20
  const logger_1 = require("../../lib/logger");
21
21
  const cli_tool_timing_config_1 = require("../../config/cli-tool-timing-config");
22
- const install_hints_1 = require("./install-hints");
23
22
  const agent_session_lifecycle_1 = require("../../lib/session/agent-session-lifecycle");
24
23
  const launch_screen_1 = require("../../lib/session/launch-screen");
24
+ const errors_1 = require("../../lib/errors");
25
25
  const logger = (0, logger_1.createLogger)('cli-tools/vibe-local');
26
- /**
27
- * Extract error message from unknown error type (DRY)
28
- */
29
- function getErrorMessage(error) {
30
- return error instanceof Error ? error.message : String(error);
31
- }
32
26
  /**
33
27
  * Wait for vibe-local to initialize after launch.
34
28
  * vibe-local shows a permission check prompt, banner, and model loading.
@@ -42,13 +36,6 @@ class VibeLocalTool extends base_1.BaseCLITool {
42
36
  id = 'vibe-local';
43
37
  name = 'Vibe Local';
44
38
  command = 'vibe-local';
45
- /**
46
- * Check if vibe-local session is running for a worktree
47
- */
48
- async isRunning(worktreeId, instanceId) {
49
- const sessionName = this.getSessionName(worktreeId, instanceId);
50
- return await (0, tmux_1.hasSession)(sessionName);
51
- }
52
39
  /**
53
40
  * Start a new vibe-local session for a worktree
54
41
  * Launches `vibe-local -y` in interactive mode within tmux
@@ -57,26 +44,14 @@ class VibeLocalTool extends base_1.BaseCLITool {
57
44
  * @param worktreePath - Worktree path
58
45
  */
59
46
  async launchSession(worktreeId, worktreePath, instanceId) {
60
- const vibeLocalAvailable = await this.isInstalled();
61
- if (!vibeLocalAvailable) {
62
- throw (0, install_hints_1.missingToolError)(this);
63
- }
64
- const sessionName = this.getSessionName(worktreeId, instanceId);
65
- const exists = await (0, tmux_1.hasSession)(sessionName);
66
- if (exists) {
67
- await this.reconcileExistingSession(sessionName, worktreePath);
68
- // Issue #2070: this branch used to return unconditionally. A tmux session
69
- // outlives the agent that was launched into it — a quit, a self-update, a
70
- // crash — and the launch was then skipped for a pane holding nothing but a
71
- // shell prompt, which left `kill-session` by hand as the only recovery.
72
- // When the tool is gone we fall THROUGH and re-send the launch command
73
- // into the same pane.
74
- if (await this.isToolLive(sessionName, { confirm: true })) {
75
- logger.info('vibe-local-session');
76
- return;
77
- }
78
- logger.warn('vibe-local-session-relaunch', { sessionName });
79
- }
47
+ await this.requireInstalled();
48
+ const { sessionName, exists, live } = await this.resolveLaunchPane(worktreeId, worktreePath, instanceId, {
49
+ logger,
50
+ liveAction: 'vibe-local-session-exists',
51
+ relaunchAction: 'vibe-local-session-relaunch',
52
+ });
53
+ if (live)
54
+ return;
80
55
  // Issue #1759 / #2444: the one line every tool's creation path owes the
81
56
  // rest of the system. vibe-local emits no structured events, so the
82
57
  // generation fence itself is inert here — but `beginAgentSession` is also
@@ -91,14 +66,7 @@ class VibeLocalTool extends base_1.BaseCLITool {
91
66
  // exists and holds the transcript of the process that died in it; the
92
67
  // launch command is re-sent into that same pane.
93
68
  if (!exists) {
94
- // Create tmux session. Scrollback depth comes from the shared
95
- // TMUX_HISTORY_LIMIT default (Issue #1624) — do not re-hardcode it here.
96
- await (0, tmux_1.createSession)({
97
- sessionName,
98
- workingDirectory: worktreePath,
99
- });
100
- // Wait a moment for the session to be created
101
- await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_SESSION_CREATE_WAIT_MS));
69
+ await this.createLaunchPane(sessionName, worktreePath);
102
70
  }
103
71
  // Read Ollama model and context window preferences from DB
104
72
  // [SEC-001] Re-validate model name at point of use (defense-in-depth)
@@ -127,10 +95,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
127
95
  await (0, tmux_1.sendKeys)(sessionName, (0, launch_screen_1.withLaunchScreenCleared)(vibeLocalCommand), true);
128
96
  // Wait for vibe-local to initialize (banner + model loading)
129
97
  await new Promise((resolve) => setTimeout(resolve, VIBE_LOCAL_INIT_WAIT_MS));
130
- logger.info('started-vibe-local-session:sessionname');
98
+ logger.info('started-vibe-local-session');
131
99
  }
132
100
  catch (error) {
133
- const errorMessage = getErrorMessage(error);
101
+ const errorMessage = (0, errors_1.getErrorMessage)(error);
134
102
  throw new Error(`Failed to start Vibe Local session: ${errorMessage}`);
135
103
  }
136
104
  }
@@ -142,16 +110,12 @@ class VibeLocalTool extends base_1.BaseCLITool {
142
110
  */
143
111
  async sendMessage(worktreeId, message, instanceId) {
144
112
  const sessionName = this.getSessionName(worktreeId, instanceId);
145
- const exists = await (0, tmux_1.hasSession)(sessionName);
146
- if (!exists) {
147
- throw new Error(`Vibe Local session ${sessionName} does not exist. Start the session first.`);
148
- }
149
113
  // Issue #2070: the pane exists, but does the AGENT? An agent that quit,
150
114
  // updated itself or crashed leaves its tmux session behind, and the send
151
115
  // that followed used to sit in the readiness wait until it timed out —
152
116
  // leaving `kill-session` by hand as the only recovery. Relaunches into the
153
117
  // same pane when the tool is gone; costs one `capture-pane` when it is not.
154
- await this.relaunchIfToolExited(worktreeId, instanceId);
118
+ await this.requireSession('Vibe Local', worktreeId, instanceId, { relaunch: true });
155
119
  try {
156
120
  // Issue #1471: Body/Enter separation + read-back submit verification via the
157
121
  // shared helper. vibe-local's IME mode needs TWO Enter presses (first Enter
@@ -169,10 +133,10 @@ class VibeLocalTool extends base_1.BaseCLITool {
169
133
  });
170
134
  // Issue #405: Invalidate cache after sending message
171
135
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
172
- logger.info('sent-message-to-vibe-local-session:sessi');
136
+ logger.info('sent-message-to-vibe-local-session');
173
137
  }
174
138
  catch (error) {
175
- const errorMessage = getErrorMessage(error);
139
+ const errorMessage = (0, errors_1.getErrorMessage)(error);
176
140
  throw new Error(`Failed to send message to Vibe Local: ${errorMessage}`);
177
141
  }
178
142
  }
@@ -182,27 +146,18 @@ class VibeLocalTool extends base_1.BaseCLITool {
182
146
  * @param worktreeId - Worktree ID
183
147
  */
184
148
  async killSession(worktreeId, instanceId) {
185
- const sessionName = this.getSessionName(worktreeId, instanceId);
186
- try {
187
- const exists = await (0, tmux_1.hasSession)(sessionName);
188
- if (exists) {
149
+ await this.requestExitAndKill(worktreeId, instanceId, {
150
+ logger,
151
+ stoppedAction: 'stopped-vibe-local-session',
152
+ requestExit: async (sessionName) => {
189
153
  // Send Ctrl+C to interrupt any running operation
190
154
  await (0, tmux_1.sendSpecialKey)(sessionName, 'C-c');
191
155
  await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_INTERRUPT_SETTLE_MS));
192
156
  // Send Ctrl+C again to ensure exit
193
157
  await (0, tmux_1.sendSpecialKey)(sessionName, 'C-c');
194
158
  await new Promise((resolve) => setTimeout(resolve, cli_tool_timing_config_1.TUI_EXIT_WAIT_MS));
195
- }
196
- // Kill the tmux session
197
- const killed = await (0, tmux_1.killSession)(sessionName);
198
- if (killed) {
199
- logger.info('stopped-vibe-local-session:sessionname');
200
- }
201
- }
202
- catch (error) {
203
- logger.error('session:stop-failed', { error: getErrorMessage(error) });
204
- throw error;
205
- }
159
+ },
160
+ });
206
161
  }
207
162
  }
208
163
  exports.VibeLocalTool = VibeLocalTool;