commandmate 0.49.2 → 0.49.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 (704) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +241 -234
  3. package/.next/app-path-routes-manifest.json +19 -18
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/capabilities/route.js +1 -1
  18. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/route.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  21. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  24. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  31. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  32. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  34. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  35. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/push/escalation/route.js +1 -1
  42. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  43. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  45. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/push/vapid/route.js +1 -1
  47. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  48. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/relays/[relayId]/cancel/route.js +4 -1
  50. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  51. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/relays/[relayId]/resolve/route.js +1 -0
  53. package/.next/server/app/api/relays/[relayId]/resolve/route.js.nft.json +1 -0
  54. package/.next/server/app/api/relays/[relayId]/resolve/route_client-reference-manifest.js +1 -0
  55. package/.next/server/app/api/relays/[relayId]/route.js +1 -1
  56. package/.next/server/app/api/relays/[relayId]/route.js.nft.json +1 -1
  57. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/relays/route.js +4 -1
  59. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  60. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/remote/pair/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  96. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  100. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/verification/runs/route.js +1 -1
  102. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  105. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  108. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  111. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/cli-reference/route.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 +2 -2
  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.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.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +2 -2
  130. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  131. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.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.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  183. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  186. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -2
  188. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  189. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  203. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  206. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  212. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +2 -2
  222. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +2 -2
  225. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/schedules/route.js +2 -2
  228. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -144
  232. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  233. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  235. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  241. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  253. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  254. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  274. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/api/worktrees/route.js +1 -1
  277. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  278. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  279. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  280. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  282. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  285. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  287. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  288. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  289. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  290. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  291. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  292. package/.next/server/app/worktrees/[id]/page.js +10 -10
  293. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  294. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  295. package/.next/server/app-paths-manifest.json +19 -18
  296. package/.next/server/chunks/1308.js +1 -0
  297. package/.next/server/chunks/1656.js +2 -2
  298. package/.next/server/chunks/1957.js +2 -2
  299. package/.next/server/chunks/2119.js +1 -1
  300. package/.next/server/chunks/2445.js +1 -1
  301. package/.next/server/chunks/2897.js +1 -1
  302. package/.next/server/chunks/3417.js +1 -1
  303. package/.next/server/chunks/3801.js +7 -7
  304. package/.next/server/chunks/4207.js +1 -1
  305. package/.next/server/chunks/4490.js +1 -0
  306. package/.next/server/chunks/4911.js +1 -1
  307. package/.next/server/chunks/4936.js +1 -1
  308. package/.next/server/chunks/5209.js +2 -2
  309. package/.next/server/chunks/5350.js +212 -0
  310. package/.next/server/chunks/5354.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/7023.js +3 -3
  314. package/.next/server/chunks/7905.js +1 -1
  315. package/.next/server/chunks/7926.js +1 -0
  316. package/.next/server/chunks/8581.js +1 -1
  317. package/.next/server/chunks/8728.js +2 -2
  318. package/.next/server/chunks/8782.js +1 -1
  319. package/.next/server/chunks/8807.js +89 -88
  320. package/.next/server/chunks/8918.js +3 -3
  321. package/.next/server/chunks/9169.js +1 -0
  322. package/.next/server/chunks/9390.js +1 -1
  323. package/.next/server/chunks/9584.js +1 -1
  324. package/.next/server/chunks/9627.js +5 -5
  325. package/.next/server/chunks/9702.js +1 -0
  326. package/.next/server/chunks/9731.js +3 -3
  327. package/.next/server/middleware-manifest.json +5 -5
  328. package/.next/server/pages/500.html +1 -1
  329. package/.next/server/server-reference-manifest.json +1 -1
  330. package/.next/static/chunks/{2407-07a237575e1ceb9e.js → 2407-87ec01332344ec2b.js} +1 -1
  331. package/.next/static/chunks/3931-3ef48b8d97357282.js +1 -0
  332. package/.next/static/chunks/app/api/agents/update/route-96fc12d400b49b13.js +1 -0
  333. package/.next/static/chunks/app/api/agents/versions/route-96fc12d400b49b13.js +1 -0
  334. package/.next/static/chunks/app/api/app/release-notes/route-96fc12d400b49b13.js +1 -0
  335. package/.next/static/chunks/app/api/app/update/route-96fc12d400b49b13.js +1 -0
  336. package/.next/static/chunks/app/api/app/update-check/route-96fc12d400b49b13.js +1 -0
  337. package/.next/static/chunks/app/api/auth/login/route-96fc12d400b49b13.js +1 -0
  338. package/.next/static/chunks/app/api/auth/logout/route-96fc12d400b49b13.js +1 -0
  339. package/.next/static/chunks/app/api/auth/status/route-96fc12d400b49b13.js +1 -0
  340. package/.next/static/chunks/app/api/capabilities/route-96fc12d400b49b13.js +1 -0
  341. package/.next/static/chunks/app/api/daily-summary/route-96fc12d400b49b13.js +1 -0
  342. package/.next/static/chunks/app/api/daily-summary/status/route-96fc12d400b49b13.js +1 -0
  343. package/.next/static/chunks/app/api/external-apps/[id]/health/route-96fc12d400b49b13.js +1 -0
  344. package/.next/static/chunks/app/api/external-apps/[id]/route-96fc12d400b49b13.js +1 -0
  345. package/.next/static/chunks/app/api/external-apps/route-96fc12d400b49b13.js +1 -0
  346. package/.next/static/chunks/app/api/fs/browse/route-96fc12d400b49b13.js +1 -0
  347. package/.next/static/chunks/app/api/fs/recent-paths/route-96fc12d400b49b13.js +1 -0
  348. package/.next/static/chunks/app/api/hooks/agent-event/route-96fc12d400b49b13.js +1 -0
  349. package/.next/static/chunks/app/api/hooks/claude-done/route-96fc12d400b49b13.js +1 -0
  350. package/.next/static/chunks/app/api/hooks/permission-request/route-96fc12d400b49b13.js +1 -0
  351. package/.next/static/chunks/app/api/metrics/vibe/route-96fc12d400b49b13.js +1 -0
  352. package/.next/static/chunks/app/api/ollama/models/route-96fc12d400b49b13.js +1 -0
  353. package/.next/static/chunks/app/api/push/escalation/route-96fc12d400b49b13.js +1 -0
  354. package/.next/static/chunks/app/api/push/subscriptions/route-96fc12d400b49b13.js +1 -0
  355. package/.next/static/chunks/app/api/push/vapid/route-96fc12d400b49b13.js +1 -0
  356. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-96fc12d400b49b13.js +1 -0
  357. package/.next/static/chunks/app/api/relays/[relayId]/resolve/route-96fc12d400b49b13.js +1 -0
  358. package/.next/static/chunks/app/api/relays/[relayId]/route-96fc12d400b49b13.js +1 -0
  359. package/.next/static/chunks/app/api/relays/route-96fc12d400b49b13.js +1 -0
  360. package/.next/static/chunks/app/api/remote/pair/route-96fc12d400b49b13.js +1 -0
  361. package/.next/static/chunks/app/api/repositories/[id]/route-96fc12d400b49b13.js +1 -0
  362. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-96fc12d400b49b13.js +1 -0
  363. package/.next/static/chunks/app/api/repositories/clone/route-96fc12d400b49b13.js +1 -0
  364. package/.next/static/chunks/app/api/repositories/excluded/route-96fc12d400b49b13.js +1 -0
  365. package/.next/static/chunks/app/api/repositories/restore/route-96fc12d400b49b13.js +1 -0
  366. package/.next/static/chunks/app/api/repositories/route-96fc12d400b49b13.js +1 -0
  367. package/.next/static/chunks/app/api/repositories/scan/route-96fc12d400b49b13.js +1 -0
  368. package/.next/static/chunks/app/api/repositories/sync/route-96fc12d400b49b13.js +1 -0
  369. package/.next/static/chunks/app/api/repositories/validate-path/route-96fc12d400b49b13.js +1 -0
  370. package/.next/static/chunks/app/api/settings/default-agents/route-96fc12d400b49b13.js +1 -0
  371. package/.next/static/chunks/app/api/settings/default-surface-mode/route-96fc12d400b49b13.js +1 -0
  372. package/.next/static/chunks/app/api/sidebar/group-order/route-96fc12d400b49b13.js +1 -0
  373. package/.next/static/chunks/app/api/skills/[id]/route-96fc12d400b49b13.js +1 -0
  374. package/.next/static/chunks/app/api/skills/installations/route-96fc12d400b49b13.js +1 -0
  375. package/.next/static/chunks/app/api/skills/operations/route-96fc12d400b49b13.js +1 -0
  376. package/.next/static/chunks/app/api/skills/reindex/route-96fc12d400b49b13.js +1 -0
  377. package/.next/static/chunks/app/api/skills/route-96fc12d400b49b13.js +1 -0
  378. package/.next/static/chunks/app/api/slash-commands/route-96fc12d400b49b13.js +1 -0
  379. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-96fc12d400b49b13.js +1 -0
  380. package/.next/static/chunks/app/api/tasks/[taskId]/route-96fc12d400b49b13.js +1 -0
  381. package/.next/static/chunks/app/api/templates/[id]/route-96fc12d400b49b13.js +1 -0
  382. package/.next/static/chunks/app/api/templates/route-96fc12d400b49b13.js +1 -0
  383. package/.next/static/chunks/app/api/verification/runs/[runId]/route-96fc12d400b49b13.js +1 -0
  384. package/.next/static/chunks/app/api/verification/runs/route-96fc12d400b49b13.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-96fc12d400b49b13.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-96fc12d400b49b13.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-96fc12d400b49b13.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-96fc12d400b49b13.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-96fc12d400b49b13.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-96fc12d400b49b13.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-96fc12d400b49b13.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-96fc12d400b49b13.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/env/route-96fc12d400b49b13.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-96fc12d400b49b13.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-96fc12d400b49b13.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-96fc12d400b49b13.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-96fc12d400b49b13.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-96fc12d400b49b13.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-96fc12d400b49b13.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-96fc12d400b49b13.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-96fc12d400b49b13.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-96fc12d400b49b13.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-96fc12d400b49b13.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-96fc12d400b49b13.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-96fc12d400b49b13.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-96fc12d400b49b13.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-96fc12d400b49b13.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-96fc12d400b49b13.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-96fc12d400b49b13.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-96fc12d400b49b13.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-96fc12d400b49b13.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-96fc12d400b49b13.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-96fc12d400b49b13.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-96fc12d400b49b13.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-96fc12d400b49b13.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-96fc12d400b49b13.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-96fc12d400b49b13.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-96fc12d400b49b13.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-96fc12d400b49b13.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-96fc12d400b49b13.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-96fc12d400b49b13.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-96fc12d400b49b13.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-96fc12d400b49b13.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-96fc12d400b49b13.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-96fc12d400b49b13.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-96fc12d400b49b13.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-96fc12d400b49b13.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-96fc12d400b49b13.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-96fc12d400b49b13.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-96fc12d400b49b13.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-96fc12d400b49b13.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-96fc12d400b49b13.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-96fc12d400b49b13.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-96fc12d400b49b13.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-96fc12d400b49b13.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-96fc12d400b49b13.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/route-96fc12d400b49b13.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-96fc12d400b49b13.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-96fc12d400b49b13.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-96fc12d400b49b13.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/search/route-96fc12d400b49b13.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/send/route-96fc12d400b49b13.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-96fc12d400b49b13.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-96fc12d400b49b13.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-96fc12d400b49b13.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-96fc12d400b49b13.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-96fc12d400b49b13.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-96fc12d400b49b13.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-96fc12d400b49b13.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-96fc12d400b49b13.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-96fc12d400b49b13.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-96fc12d400b49b13.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-96fc12d400b49b13.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-96fc12d400b49b13.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-96fc12d400b49b13.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-96fc12d400b49b13.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-96fc12d400b49b13.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-96fc12d400b49b13.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-96fc12d400b49b13.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-96fc12d400b49b13.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-96fc12d400b49b13.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-96fc12d400b49b13.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-96fc12d400b49b13.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-96fc12d400b49b13.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-96fc12d400b49b13.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-96fc12d400b49b13.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-96fc12d400b49b13.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-96fc12d400b49b13.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/route-96fc12d400b49b13.js +1 -0
  470. package/.next/static/chunks/app/{layout-4f64316957b0a8e5.js → layout-b9d8aef70e4f17b2.js} +1 -1
  471. package/.next/static/chunks/app/manifest.webmanifest/route-96fc12d400b49b13.js +1 -0
  472. package/.next/static/chunks/app/proxy/[...path]/route-96fc12d400b49b13.js +1 -0
  473. package/.next/static/chunks/app/worktrees/[id]/layout-96fc12d400b49b13.js +1 -0
  474. package/.next/static/chunks/app/worktrees/[id]/page-f6a151304860b549.js +1 -0
  475. package/.next/trace +13 -13
  476. package/.next/types/app/api/relays/[relayId]/resolve/route.ts +347 -0
  477. package/.next/types/routes.d.ts +2 -1
  478. package/.next/types/validator.ts +9 -0
  479. package/dist/cli/commands/prompt.d.ts.map +1 -1
  480. package/dist/cli/commands/prompt.js +2 -1
  481. package/dist/cli/commands/relays.d.ts +2 -0
  482. package/dist/cli/commands/relays.d.ts.map +1 -1
  483. package/dist/cli/commands/relays.js +142 -5
  484. package/dist/cli/commands/report.d.ts +7 -2
  485. package/dist/cli/commands/report.d.ts.map +1 -1
  486. package/dist/cli/commands/report.js +19 -6
  487. package/dist/cli/commands/respond-strict.d.ts.map +1 -1
  488. package/dist/cli/commands/respond-strict.js +9 -2
  489. package/dist/cli/commands/task.d.ts +22 -0
  490. package/dist/cli/commands/task.d.ts.map +1 -1
  491. package/dist/cli/commands/task.js +26 -18
  492. package/dist/cli/types/api-responses.d.ts +52 -0
  493. package/dist/cli/types/api-responses.d.ts.map +1 -1
  494. package/dist/cli/utils/api-client-deadline.d.ts +28 -0
  495. package/dist/cli/utils/api-client-deadline.d.ts.map +1 -0
  496. package/dist/cli/utils/api-client-deadline.js +46 -0
  497. package/dist/cli/utils/api-client-errors.d.ts +118 -0
  498. package/dist/cli/utils/api-client-errors.d.ts.map +1 -0
  499. package/dist/cli/utils/api-client-errors.js +210 -0
  500. package/dist/cli/utils/api-client.d.ts +3 -133
  501. package/dist/cli/utils/api-client.d.ts.map +1 -1
  502. package/dist/cli/utils/api-client.js +30 -257
  503. package/dist/lib/cli-tools/types.d.ts +6 -0
  504. package/dist/lib/cli-tools/types.d.ts.map +1 -1
  505. package/dist/server/locales/en/worktree.json +7 -0
  506. package/dist/server/locales/ja/worktree.json +7 -0
  507. package/dist/server/src/lib/cli-tools/claude.js +8 -2
  508. package/dist/server/src/lib/cli-tools/command-code.js +7 -15
  509. package/dist/server/src/lib/cli-tools/copilot.js +154 -25
  510. package/dist/server/src/lib/cli-tools/opencode.js +157 -6
  511. package/dist/server/src/lib/cli-tools/prompt-wait-dialog.js +115 -0
  512. package/dist/server/src/lib/cli-tools/submit-composer-read.js +41 -8
  513. package/dist/server/src/lib/cli-tools/submit-verified-sender-composer.js +78 -0
  514. package/dist/server/src/lib/cli-tools/submit-verified-sender-lock.js +116 -0
  515. package/dist/server/src/lib/cli-tools/submit-verified-sender-report.js +250 -0
  516. package/dist/server/src/lib/cli-tools/submit-verified-sender-shared.js +106 -0
  517. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +94 -295
  518. package/dist/server/src/lib/cli-tools/vibe-local.js +87 -0
  519. package/dist/server/src/lib/db/chat-db.js +14 -1
  520. package/dist/server/src/lib/db/db-instance.js +114 -2
  521. package/dist/server/src/lib/db/migrations/index.js +2 -0
  522. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  523. package/dist/server/src/lib/db/migrations/v63-session-relays-delivery-attempt.js +61 -0
  524. package/dist/server/src/lib/db/relay-bind-db-base.js +89 -0
  525. package/dist/server/src/lib/db/relay-bind-db-delivery.js +223 -0
  526. package/dist/server/src/lib/db/relay-bind-db-pending.js +183 -0
  527. package/dist/server/src/lib/db/relay-bind-db.js +88 -167
  528. package/dist/server/src/lib/db/relay-db-base.js +20 -0
  529. package/dist/server/src/lib/db/relay-db-count.js +49 -0
  530. package/dist/server/src/lib/db/relay-db-delivery.js +104 -0
  531. package/dist/server/src/lib/db/relay-db-hold.js +250 -0
  532. package/dist/server/src/lib/db/relay-db.js +33 -92
  533. package/dist/server/src/lib/detection/tools/opencode/composer-own-text.js +119 -0
  534. package/dist/server/src/lib/detection/tools/opencode/readiness.js +62 -0
  535. package/dist/server/src/lib/detection/tools/vibe-local/readiness.js +70 -0
  536. package/dist/server/src/lib/relay/relay-bound-reply.js +20 -9
  537. package/dist/server/src/lib/relay/relay-delivery.js +359 -79
  538. package/dist/server/src/lib/relay/relay-messages.js +13 -0
  539. package/dist/server/src/lib/relay/relay-system-line.js +28 -15
  540. package/dist/server/src/lib/relay/types.js +14 -2
  541. package/dist/server/src/lib/session/claude-session.js +4 -1
  542. package/dist/server/src/lib/session/current-output-builder.js +7 -5
  543. package/dist/server/src/lib/session/instance-input-lock.js +47 -2
  544. package/dist/server/src/lib/session/prompt-submit-receipt.js +87 -18
  545. package/dist/server/src/lib/session/prompt-waiting-guard.js +8 -2
  546. package/dist/server/src/lib/session/respond-target.js +82 -0
  547. package/dist/server/src/lib/session/send-attempt-state.js +130 -3
  548. package/dist/server/src/lib/session/send-user-message.js +78 -7
  549. package/dist/server/src/lib/session/structured-prompt.js +12 -7
  550. package/dist/server/src/lib/session/worktree-session-reconcile.js +10 -0
  551. package/dist/server/src/lib/session-key-sender.js +6 -1
  552. package/package.json +1 -1
  553. package/release-notes/0.49.3.json +52 -0
  554. package/.next/server/chunks/1062.js +0 -1
  555. package/.next/server/chunks/110.js +0 -1
  556. package/.next/server/chunks/2422.js +0 -1
  557. package/.next/server/chunks/3756.js +0 -1
  558. package/.next/server/chunks/5630.js +0 -1
  559. package/.next/server/chunks/6808.js +0 -4
  560. package/.next/server/chunks/9198.js +0 -144
  561. package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +0 -1
  562. package/.next/static/chunks/app/api/agents/update/route-a4f129c451de7859.js +0 -1
  563. package/.next/static/chunks/app/api/agents/versions/route-a4f129c451de7859.js +0 -1
  564. package/.next/static/chunks/app/api/app/release-notes/route-a4f129c451de7859.js +0 -1
  565. package/.next/static/chunks/app/api/app/update/route-a4f129c451de7859.js +0 -1
  566. package/.next/static/chunks/app/api/app/update-check/route-a4f129c451de7859.js +0 -1
  567. package/.next/static/chunks/app/api/auth/login/route-a4f129c451de7859.js +0 -1
  568. package/.next/static/chunks/app/api/auth/logout/route-a4f129c451de7859.js +0 -1
  569. package/.next/static/chunks/app/api/auth/status/route-a4f129c451de7859.js +0 -1
  570. package/.next/static/chunks/app/api/capabilities/route-a4f129c451de7859.js +0 -1
  571. package/.next/static/chunks/app/api/daily-summary/route-a4f129c451de7859.js +0 -1
  572. package/.next/static/chunks/app/api/daily-summary/status/route-a4f129c451de7859.js +0 -1
  573. package/.next/static/chunks/app/api/external-apps/[id]/health/route-a4f129c451de7859.js +0 -1
  574. package/.next/static/chunks/app/api/external-apps/[id]/route-a4f129c451de7859.js +0 -1
  575. package/.next/static/chunks/app/api/external-apps/route-a4f129c451de7859.js +0 -1
  576. package/.next/static/chunks/app/api/fs/browse/route-a4f129c451de7859.js +0 -1
  577. package/.next/static/chunks/app/api/fs/recent-paths/route-a4f129c451de7859.js +0 -1
  578. package/.next/static/chunks/app/api/hooks/agent-event/route-a4f129c451de7859.js +0 -1
  579. package/.next/static/chunks/app/api/hooks/claude-done/route-a4f129c451de7859.js +0 -1
  580. package/.next/static/chunks/app/api/hooks/permission-request/route-a4f129c451de7859.js +0 -1
  581. package/.next/static/chunks/app/api/metrics/vibe/route-a4f129c451de7859.js +0 -1
  582. package/.next/static/chunks/app/api/ollama/models/route-a4f129c451de7859.js +0 -1
  583. package/.next/static/chunks/app/api/push/escalation/route-a4f129c451de7859.js +0 -1
  584. package/.next/static/chunks/app/api/push/subscriptions/route-a4f129c451de7859.js +0 -1
  585. package/.next/static/chunks/app/api/push/vapid/route-a4f129c451de7859.js +0 -1
  586. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-a4f129c451de7859.js +0 -1
  587. package/.next/static/chunks/app/api/relays/[relayId]/route-a4f129c451de7859.js +0 -1
  588. package/.next/static/chunks/app/api/relays/route-a4f129c451de7859.js +0 -1
  589. package/.next/static/chunks/app/api/remote/pair/route-a4f129c451de7859.js +0 -1
  590. package/.next/static/chunks/app/api/repositories/[id]/route-a4f129c451de7859.js +0 -1
  591. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-a4f129c451de7859.js +0 -1
  592. package/.next/static/chunks/app/api/repositories/clone/route-a4f129c451de7859.js +0 -1
  593. package/.next/static/chunks/app/api/repositories/excluded/route-a4f129c451de7859.js +0 -1
  594. package/.next/static/chunks/app/api/repositories/restore/route-a4f129c451de7859.js +0 -1
  595. package/.next/static/chunks/app/api/repositories/route-a4f129c451de7859.js +0 -1
  596. package/.next/static/chunks/app/api/repositories/scan/route-a4f129c451de7859.js +0 -1
  597. package/.next/static/chunks/app/api/repositories/sync/route-a4f129c451de7859.js +0 -1
  598. package/.next/static/chunks/app/api/repositories/validate-path/route-a4f129c451de7859.js +0 -1
  599. package/.next/static/chunks/app/api/settings/default-agents/route-a4f129c451de7859.js +0 -1
  600. package/.next/static/chunks/app/api/settings/default-surface-mode/route-a4f129c451de7859.js +0 -1
  601. package/.next/static/chunks/app/api/sidebar/group-order/route-a4f129c451de7859.js +0 -1
  602. package/.next/static/chunks/app/api/skills/[id]/route-a4f129c451de7859.js +0 -1
  603. package/.next/static/chunks/app/api/skills/installations/route-a4f129c451de7859.js +0 -1
  604. package/.next/static/chunks/app/api/skills/operations/route-a4f129c451de7859.js +0 -1
  605. package/.next/static/chunks/app/api/skills/reindex/route-a4f129c451de7859.js +0 -1
  606. package/.next/static/chunks/app/api/skills/route-a4f129c451de7859.js +0 -1
  607. package/.next/static/chunks/app/api/slash-commands/route-a4f129c451de7859.js +0 -1
  608. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-a4f129c451de7859.js +0 -1
  609. package/.next/static/chunks/app/api/tasks/[taskId]/route-a4f129c451de7859.js +0 -1
  610. package/.next/static/chunks/app/api/templates/[id]/route-a4f129c451de7859.js +0 -1
  611. package/.next/static/chunks/app/api/templates/route-a4f129c451de7859.js +0 -1
  612. package/.next/static/chunks/app/api/verification/runs/[runId]/route-a4f129c451de7859.js +0 -1
  613. package/.next/static/chunks/app/api/verification/runs/route-a4f129c451de7859.js +0 -1
  614. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-a4f129c451de7859.js +0 -1
  615. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-a4f129c451de7859.js +0 -1
  616. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-a4f129c451de7859.js +0 -1
  617. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-a4f129c451de7859.js +0 -1
  618. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-a4f129c451de7859.js +0 -1
  619. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-a4f129c451de7859.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-a4f129c451de7859.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-a4f129c451de7859.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/env/route-a4f129c451de7859.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-a4f129c451de7859.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-a4f129c451de7859.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-a4f129c451de7859.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-a4f129c451de7859.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-a4f129c451de7859.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-a4f129c451de7859.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-a4f129c451de7859.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-a4f129c451de7859.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-a4f129c451de7859.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-a4f129c451de7859.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-a4f129c451de7859.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-a4f129c451de7859.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-a4f129c451de7859.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-a4f129c451de7859.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-a4f129c451de7859.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-a4f129c451de7859.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-a4f129c451de7859.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-a4f129c451de7859.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-a4f129c451de7859.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-a4f129c451de7859.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-a4f129c451de7859.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-a4f129c451de7859.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-a4f129c451de7859.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-a4f129c451de7859.js +0 -1
  647. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-a4f129c451de7859.js +0 -1
  648. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-a4f129c451de7859.js +0 -1
  649. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-a4f129c451de7859.js +0 -1
  650. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-a4f129c451de7859.js +0 -1
  651. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-a4f129c451de7859.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-a4f129c451de7859.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-a4f129c451de7859.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-a4f129c451de7859.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-a4f129c451de7859.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-a4f129c451de7859.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-a4f129c451de7859.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-a4f129c451de7859.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-a4f129c451de7859.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-a4f129c451de7859.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-a4f129c451de7859.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-a4f129c451de7859.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-a4f129c451de7859.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-a4f129c451de7859.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-a4f129c451de7859.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/route-a4f129c451de7859.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-a4f129c451de7859.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-a4f129c451de7859.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-a4f129c451de7859.js +0 -1
  670. package/.next/static/chunks/app/api/worktrees/[id]/search/route-a4f129c451de7859.js +0 -1
  671. package/.next/static/chunks/app/api/worktrees/[id]/send/route-a4f129c451de7859.js +0 -1
  672. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-a4f129c451de7859.js +0 -1
  673. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-a4f129c451de7859.js +0 -1
  674. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-a4f129c451de7859.js +0 -1
  675. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-a4f129c451de7859.js +0 -1
  676. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-a4f129c451de7859.js +0 -1
  677. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-a4f129c451de7859.js +0 -1
  678. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-a4f129c451de7859.js +0 -1
  679. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-a4f129c451de7859.js +0 -1
  680. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-a4f129c451de7859.js +0 -1
  681. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-a4f129c451de7859.js +0 -1
  682. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-a4f129c451de7859.js +0 -1
  683. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-a4f129c451de7859.js +0 -1
  684. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-a4f129c451de7859.js +0 -1
  685. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-a4f129c451de7859.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-a4f129c451de7859.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-a4f129c451de7859.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-a4f129c451de7859.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-a4f129c451de7859.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-a4f129c451de7859.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-a4f129c451de7859.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-a4f129c451de7859.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-a4f129c451de7859.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-a4f129c451de7859.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-a4f129c451de7859.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-a4f129c451de7859.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-a4f129c451de7859.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/route-a4f129c451de7859.js +0 -1
  699. package/.next/static/chunks/app/manifest.webmanifest/route-a4f129c451de7859.js +0 -1
  700. package/.next/static/chunks/app/proxy/[...path]/route-a4f129c451de7859.js +0 -1
  701. package/.next/static/chunks/app/worktrees/[id]/layout-a4f129c451de7859.js +0 -1
  702. package/.next/static/chunks/app/worktrees/[id]/page-33afc6aa96289fb0.js +0 -1
  703. /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_buildManifest.js +0 -0
  704. /package/.next/static/{yGatWDsS532awSs51kXyd → LNfVZiq6FZwKsV7L9Mi6M}/_ssgManifest.js +0 -0
@@ -815,7 +815,10 @@ async function sendMessageToClaude(worktreeId, message, instanceId) {
815
815
  // (`❯ ` can pass for Claude's prompt) — wait for that launch, or, holding the
816
816
  // input lock as the send service does, refuse with nothing typed (R1).
817
817
  await (0, session_launch_flight_1.settleSessionLaunch)(sessionName, 'Claude Code');
818
- await (0, session_key_sender_1.sendMessageToSession)(sessionName, message, exports.CLAUDE_POST_PROMPT_DELAY, exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT);
818
+ await (0, session_key_sender_1.sendMessageToSession)(sessionName, message, exports.CLAUDE_POST_PROMPT_DELAY, exports.CLAUDE_SEND_PROMPT_WAIT_TIMEOUT,
819
+ // Issue #4048: the instance this send is for, so the first prompt's hook
820
+ // check reads that instance's entry — the same one the name resolves to.
821
+ { worktreeId, instanceId });
819
822
  }
820
823
  /**
821
824
  * Capture Claude session output
@@ -237,7 +237,7 @@ function readAgentEvents(worktreeId, cliToolId, instanceId, resolvedInstanceId)
237
237
  * every value below is derived from the arguments, and nothing is assigned
238
238
  * outside this function.
239
239
  */
240
- function composePromptData({ worktreeId, cliToolId, instanceId, output, captureWindowLines, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
240
+ function composePromptData({ worktreeId, cliToolId, respondInstanceId, output, captureWindowLines, statusResult, startingSince, promptWaiting, askUserQuestion, eventSource, }) {
241
241
  const scraperPromptWaiting = statusResult.hasActivePrompt;
242
242
  // Issue #1726: the agent's own account of what it asked. It contributes only
243
243
  // where some other layer has already established that a dialog is on screen —
@@ -338,9 +338,9 @@ function composePromptData({ worktreeId, cliToolId, instanceId, output, captureW
338
338
  : scraperPromptWaiting
339
339
  ? correctedPromptData ??
340
340
  scraperPromptData ??
341
- (structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts, instanceId) : null)
341
+ (structuredFacts ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts, respondInstanceId) : null)
342
342
  : structuredFacts
343
- ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts, instanceId)
343
+ ? (0, structured_prompt_1.buildStructuredPromptData)(worktreeId, structuredFacts, respondInstanceId)
344
344
  : null;
345
345
  // Issue #2870: whether `/prompt-response` would answer the prompt published
346
346
  // above, read by the SAME function it re-verifies with. In #2868 `promptData`
@@ -813,7 +813,7 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
813
813
  const { structuredFacts, promptData, promptAnswerable } = composePromptData({
814
814
  worktreeId,
815
815
  cliToolId,
816
- instanceId,
816
+ respondInstanceId: resolvedInstanceId,
817
817
  output,
818
818
  captureWindowLines,
819
819
  statusResult,
@@ -921,7 +921,9 @@ async function buildPayload(db, worktreeId, cliToolId, instanceId) {
921
921
  worktreeId,
922
922
  cliToolId,
923
923
  instanceId: resolvedInstanceId,
924
- respondInstanceId: instanceId,
924
+ // Issue #4063: the instance the live payload's question names, so the
925
+ // row says the same `respond` whichever caller wrote it.
926
+ respondInstanceId: resolvedInstanceId,
925
927
  state: promptWaiting,
926
928
  facts: structuredFacts,
927
929
  });
@@ -61,6 +61,7 @@ exports.currentInstanceInputTicket = currentInstanceInputTicket;
61
61
  exports.withInstanceInputLock = withInstanceInputLock;
62
62
  exports.instanceInputReadMark = instanceInputReadMark;
63
63
  exports.instanceInputLaunchReadMark = instanceInputLaunchReadMark;
64
+ exports.instanceInputGenerationMark = instanceInputGenerationMark;
64
65
  exports.answerUnderInstanceInputLock = answerUnderInstanceInputLock;
65
66
  exports.leaveCarriedPasteMark = leaveCarriedPasteMark;
66
67
  exports.getCarriedPasteMark = getCarriedPasteMark;
@@ -70,6 +71,7 @@ exports.invalidateInstanceInput = invalidateInstanceInput;
70
71
  exports.isInputBoundaryRefusal = isInputBoundaryRefusal;
71
72
  exports.observeInputStart = observeInputStart;
72
73
  exports.noteInputStart = noteInputStart;
74
+ exports.noteInputTicket = noteInputTicket;
73
75
  exports.noteDispatchStart = noteDispatchStart;
74
76
  exports.noteDispatchFailed = noteDispatchFailed;
75
77
  exports.resetInstanceInputLocks = resetInstanceInputLocks;
@@ -364,6 +366,18 @@ function instanceInputReadMark() {
364
366
  function instanceInputLaunchReadMark() {
365
367
  return (generationSeq.exclusiveEvents ?? 0) + (generationSeq.sharedReleases ?? 0);
366
368
  }
369
+ /**
370
+ * The generation counter as it stands now (Issue #4065): every ticket granted
371
+ * from here on carries a larger generation. A send request reads it once, at
372
+ * its outermost entry (the send route before it reads the body; the send
373
+ * service for the timer and relay), and a refusal it records before any lock
374
+ * was granted to it carries the value — so it is not taken over the record of
375
+ * a send granted after the request began. Process-wide, like the generations
376
+ * themselves; 0 before any grant.
377
+ */
378
+ function instanceInputGenerationMark() {
379
+ return generationSeq.last;
380
+ }
367
381
  function skipOfLockError(error) {
368
382
  const code = typeof error === 'object' && error !== null ? error.code : undefined;
369
383
  if (code === exports.INSTANCE_INPUT_LOCK_TIMEOUT_CODE)
@@ -584,12 +598,16 @@ const inputStartScope = (0, global_state_1.getOrInitGlobal)('__instanceInputStar
584
598
  * {@link noteInputStart}, so a caller can read state as of the moment the
585
599
  * body started going in (Issue #3957: the send route's open-turn reading). A
586
600
  * throw is logged and does not fail the send.
601
+ * @param request - Issue #4065: told, synchronously and as it happens, the
602
+ * generation of the body's input lock ({@link noteInputTicket}) and a
603
+ * dispatch ({@link noteDispatchStart}) — so a send that throws afterwards
604
+ * still leaves them with the caller.
587
605
  * @returns `fn`'s value, and the moment input started — null when nothing in
588
606
  * `fn` noted one (a path that never types a body: opencode's HTTP delivery,
589
607
  * or a send refused before its first key). Never set when `fn` throws.
590
608
  */
591
- async function observeInputStart(fn, onStart, boundary) {
592
- const observer = { at: null, onStart, boundary, dispatchOpen: false };
609
+ async function observeInputStart(fn, onStart, boundary, request) {
610
+ const observer = { at: null, onStart, boundary, dispatchOpen: false, request };
593
611
  const value = await inputStartScope.run(observer, fn);
594
612
  return { value, inputStartedAt: observer.at };
595
613
  }
@@ -623,6 +641,25 @@ function runBoundaryHook(observer, at, kind) {
623
641
  throw error instanceof InputBoundaryRefusedError ? error : new InputBoundaryRefusedError(error);
624
642
  }
625
643
  }
644
+ /**
645
+ * Tell the request observing this context the generation its body's input
646
+ * lock was granted under (Issue #4065). Called by the shared sender right
647
+ * after its lock is granted or joined — never for a launch key, an answer, a
648
+ * trust dialog or copilot's `/model` and selection-list keys, whose tickets
649
+ * are not the body's. Synchronous, never throws; outside an
650
+ * {@link observeInputStart} context it does nothing.
651
+ */
652
+ function noteInputTicket(ticket) {
653
+ const observer = inputStartScope.getStore();
654
+ if (observer?.request?.onTicket === undefined)
655
+ return;
656
+ try {
657
+ observer.request.onTicket(ticket.generation);
658
+ }
659
+ catch (error) {
660
+ logger.warn('input-ticket-observer-failed', { error: error instanceof Error ? error.message : String(error) });
661
+ }
662
+ }
626
663
  /**
627
664
  * Note that a body is about to be DISPATCHED without being typed (Issue #3957):
628
665
  * opencode's HTTP send, which reports no input start. Runs the required
@@ -636,6 +673,14 @@ function noteDispatchStart(now = new Date()) {
636
673
  return;
637
674
  runBoundaryHook(observer, now, 'dispatch');
638
675
  observer.dispatchOpen = true;
676
+ // Issue #4065: after the required hook, so a refused dispatch — nothing went
677
+ // out — is not reported as one.
678
+ try {
679
+ observer.request?.onDispatch?.();
680
+ }
681
+ catch (error) {
682
+ logger.warn('dispatch-start-observer-failed', { error: error instanceof Error ? error.message : String(error) });
683
+ }
639
684
  }
640
685
  /**
641
686
  * Say how a dispatch noted by {@link noteDispatchStart} ended when it did not
@@ -27,16 +27,19 @@
27
27
  * @module lib/session/prompt-submit-receipt
28
28
  */
29
29
  Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.reportsPrompts = reportsPrompts;
30
31
  exports.notePromptSubmitSession = notePromptSubmitSession;
31
32
  exports.notePromptSubmitHook = notePromptSubmitHook;
32
33
  exports.getPromptSubmitTarget = getPromptSubmitTarget;
33
34
  exports.readPromptSubmitReceipt = readPromptSubmitReceipt;
34
35
  exports.noteSubmittedBody = noteSubmittedBody;
36
+ exports.findSubmittedBody = findSubmittedBody;
35
37
  exports.matchesSubmittedBody = matchesSubmittedBody;
36
38
  exports.clearPromptSubmitReceipts = clearPromptSubmitReceipts;
37
39
  const crypto_1 = require("crypto");
38
40
  const auto_yes_state_1 = require("../../lib/auto-yes-state");
39
41
  const global_state_1 = require("../../lib/global-state");
42
+ const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
40
43
  /** How many sessions are tracked at once; the least recently started is forgotten first. */
41
44
  const MAX_TRACKED_SESSIONS = 1024;
42
45
  /**
@@ -49,13 +52,41 @@ const sessionByInstance = (0, global_state_1.getOrInitGlobal)('__promptSubmitSes
49
52
  function instanceKey(target) {
50
53
  return (0, auto_yes_state_1.buildCompositeKey)(target.worktreeId, target.cliToolId, target.instanceId);
51
54
  }
52
- /** The tools whose prompt hook is trusted as proof of a submit. */
55
+ /**
56
+ * The tools whose prompt hook is trusted as proof of a submit — and, since
57
+ * Issue #4048, the only ones whose `lastSend` a found body may demote.
58
+ */
53
59
  function reportsPrompts(cliToolId) {
54
60
  // Claude only. codex's hooks run in a machine-wide daemon that can file a
55
61
  // turn under the wrong instance (#2874), and copilot's arrive out of order
56
62
  // (#1903); neither is evidence about one pane's composer.
57
63
  return cliToolId === 'claude';
58
64
  }
65
+ /**
66
+ * The entry a send looks at (Issue #4048). By name alone, the name's entry. With
67
+ * an explicit target, the same entry only when the target's instance currently
68
+ * maps to this very name and the entry is that instance's — a target and a name
69
+ * that disagree are no entry at all, so nothing about another instance (or a
70
+ * generation the instance no longer runs under this name) is taken as proof.
71
+ * Looking never registers or resets anything.
72
+ */
73
+ function entryFor(sessionName, cliToolId, expected) {
74
+ const entry = sessions.get(sessionName);
75
+ if (entry === undefined || expected === undefined)
76
+ return entry;
77
+ let key;
78
+ try {
79
+ key = instanceKey({ worktreeId: expected.worktreeId, cliToolId, instanceId: expected.instanceId });
80
+ }
81
+ catch {
82
+ return undefined;
83
+ }
84
+ if (sessionByInstance.get(key) !== sessionName)
85
+ return undefined;
86
+ if (instanceKey(entry.target) !== key)
87
+ return undefined;
88
+ return entry;
89
+ }
59
90
  /**
60
91
  * A session's generation began here (`beginAgentSession`). Forgets what was
61
92
  * known about the previous process in the same pane name.
@@ -88,25 +119,49 @@ function notePromptSubmitHook(target, event, at) {
88
119
  if (entry === undefined)
89
120
  return;
90
121
  entry.lastEventAt = at;
91
- if (event === 'user_prompt_submit')
122
+ if (event === 'user_prompt_submit') {
92
123
  entry.lastPromptAt = at;
124
+ // Issue #4048: the agent took a prompt, so a body the screen alone called
125
+ // submitted is no longer one to look for — the late report was that body's,
126
+ // or a later send went through after it. Either way no later send may find
127
+ // it and demote a record (review: X restored after Y's success).
128
+ entry.submittedBody = null;
129
+ }
93
130
  }
94
- /** The instance a session this server started runs, or null. */
95
- function getPromptSubmitTarget(sessionName) {
96
- return sessions.get(sessionName)?.target ?? null;
131
+ /**
132
+ * The instance a session this server started runs, or null. With `expected`
133
+ * (Issue #4048), null unless the explicit target names the same entry.
134
+ */
135
+ function getPromptSubmitTarget(sessionName, expected) {
136
+ if (expected === undefined)
137
+ return sessions.get(sessionName)?.target ?? null;
138
+ return entryFor(sessionName, expected.cliToolId, expected)?.target ?? null;
97
139
  }
98
140
  /**
99
141
  * Whether the screen's B/F verdict for a send whose first Enter went in at
100
142
  * `enteredAt` needs the agent's own report (Issue #4035).
143
+ *
144
+ * `expected` (Issue #4048) is the instance the send was made for; a name that
145
+ * does not resolve to that instance's entry answers `not-required` (never
146
+ * `received`), exactly as a session this server did not start.
147
+ *
148
+ * Known limit, kept as it is (Issue #4048 item 3): the question is asked on
149
+ * every read, and a session whose first hook (`SessionStart`) has not arrived
150
+ * by the read-back is answered `not-required` — the screen's B/F verdict then
151
+ * stands and the send returns at once, before a hook that is only late could
152
+ * turn it into `awaited`. Pinned by `prompt-submit-receipt-4048.test.ts`.
101
153
  */
102
- function readPromptSubmitReceipt(sessionName, cliToolId, enteredAt) {
154
+ function readPromptSubmitReceipt(sessionName, cliToolId, enteredAt, expected) {
103
155
  if (!reportsPrompts(cliToolId))
104
156
  return 'not-required';
105
- const entry = sessions.get(sessionName);
157
+ const entry = entryFor(sessionName, cliToolId, expected);
106
158
  if (entry === undefined || entry.target.cliToolId !== cliToolId)
107
159
  return 'not-required';
108
160
  if (entry.lastPromptAt !== null && entry.lastPromptAt >= enteredAt)
109
161
  return 'received';
162
+ // Issue #4048 item 3 (known limit): no hook yet from this process — the
163
+ // screen decides, and a `SessionStart` that arrives after this read is not
164
+ // waited for.
110
165
  if (entry.lastEventAt === null || entry.lastEventAt < entry.startedAt)
111
166
  return 'not-required';
112
167
  if (entry.lastPromptAt !== null && entry.lastPromptAt >= entry.startedAt)
@@ -122,31 +177,45 @@ function digest(text) {
122
177
  /**
123
178
  * The sender reported this body submitted on this session from the screen
124
179
  * alone — not for one the agent's hook reported, which did leave.
180
+ *
181
+ * `expected` (Issue #4048): with an explicit target, nothing is noted unless it
182
+ * names the same entry as the session name.
125
183
  */
126
- function noteSubmittedBody(sessionName, message) {
127
- const entry = sessions.get(sessionName);
184
+ function noteSubmittedBody(sessionName, message, expected) {
185
+ const entry = expected === undefined ? sessions.get(sessionName) : entryFor(sessionName, expected.cliToolId, expected);
128
186
  if (entry === undefined)
129
187
  return;
130
188
  const body = compact(message);
131
189
  entry.submittedBody = {
132
190
  full: digest(body),
133
191
  prefix: body.length >= BODY_PREFIX_CHARS ? digest(body.slice(0, BODY_PREFIX_CHARS)) : null,
192
+ messageDigest: (0, send_attempt_state_1.sendMessageDigest)(message),
134
193
  };
135
194
  }
136
195
  /**
137
- * Whether a composer read is the body last reported submitted on this session:
138
- * the whole of it, or — for a read long enough — its beginning.
196
+ * The body last reported submitted on this session, when a composer read is it
197
+ * — the whole of it, or (for a read long enough) its beginning — or null.
198
+ * `messageDigest` is the attempt's digest, for demoting only that attempt's
199
+ * record (Issue #4048).
139
200
  */
140
- function matchesSubmittedBody(sessionName, composerText) {
141
- const body = sessions.get(sessionName)?.submittedBody;
201
+ function findSubmittedBody(sessionName, composerText, expected) {
202
+ const entry = expected === undefined ? sessions.get(sessionName) : entryFor(sessionName, expected.cliToolId, expected);
203
+ const body = entry?.submittedBody;
142
204
  if (body === null || body === undefined)
143
- return false;
205
+ return null;
144
206
  const read = compact(composerText);
145
207
  if (read === '')
146
- return false;
147
- if (digest(read) === body.full)
148
- return true;
149
- return body.prefix !== null && read.length >= BODY_PREFIX_CHARS && digest(read.slice(0, BODY_PREFIX_CHARS)) === body.prefix;
208
+ return null;
209
+ const matched = digest(read) === body.full ||
210
+ (body.prefix !== null && read.length >= BODY_PREFIX_CHARS && digest(read.slice(0, BODY_PREFIX_CHARS)) === body.prefix);
211
+ return matched ? { messageDigest: body.messageDigest } : null;
212
+ }
213
+ /**
214
+ * Whether a composer read is the body last reported submitted on this session:
215
+ * the whole of it, or — for a read long enough — its beginning.
216
+ */
217
+ function matchesSubmittedBody(sessionName, composerText) {
218
+ return findSubmittedBody(sessionName, composerText) !== null;
150
219
  }
151
220
  /** Forget every session (tests). */
152
221
  function clearPromptSubmitReceipts() {
@@ -24,6 +24,7 @@ exports.PROMPT_WAITING_CODE = void 0;
24
24
  exports.isPromptWaiting = isPromptWaiting;
25
25
  exports.promptWaitingMessage = promptWaitingMessage;
26
26
  const manager_1 = require("../../lib/cli-tools/manager");
27
+ const respond_target_1 = require("../../lib/session/respond-target");
27
28
  const cli_session_1 = require("../../lib/session/cli-session");
28
29
  const status_detector_1 = require("../../lib/detection/status-detector");
29
30
  const status_capture_config_1 = require("../../config/status-capture-config");
@@ -133,11 +134,16 @@ async function isPromptWaiting(worktreeId, cliToolId, instanceId, options) {
133
134
  * waiting. A request for the primary instance (no `instanceId`) gets the
134
135
  * sentence as before.
135
136
  *
137
+ * Issue #4049: a request that named only a tool other than the worktree
138
+ * default gets ` --agent <tool>` instead (the caller decides, through
139
+ * `respondAgentFor`), since a bare `respond` goes to the default tool.
140
+ *
136
141
  * @param blockedBy - Which layer refused; omitted callers get the plain message
137
142
  * @param instanceId - The instance the refused request named, if any
143
+ * @param agent - The tool to name when no instance was named (`respondAgentFor`)
138
144
  */
139
- function promptWaitingMessage(worktreeId, blockedBy, instanceId) {
140
- const target = instanceId ? ` --instance ${instanceId}` : '';
145
+ function promptWaitingMessage(worktreeId, blockedBy, instanceId, agent) {
146
+ const target = (0, respond_target_1.respondTargetFlags)(instanceId, agent);
141
147
  const base = `${worktreeId} is waiting on a prompt. Sending now would type into the ` +
142
148
  `prompt's input line instead of reaching the agent, and would leave that ` +
143
149
  `text in place for the next answer. Answer the prompt first: ` +
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ /**
3
+ * Where the `respond` a server-side guidance sentence names has to go
4
+ * (Issue #4049).
5
+ *
6
+ * #4031 gave the PROMPT_WAITING refusal and the structured-dialog question a
7
+ * ` --instance <id>` when the request named an instance. A request that named
8
+ * only a tool (`send … --agent codex`) still got a bare `commandmate respond
9
+ * <id> <answer>`, and the CLI resolves a bare `respond` to the worktree's
10
+ * default tool — so the answer could reach a different agent than the one that
11
+ * is waiting.
12
+ *
13
+ * Type-only imports and string building, like `structured-prompt`, so the
14
+ * client bundle that reads that module can read this one too.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.respondTargetFlags = respondTargetFlags;
18
+ exports.respondAgentFor = respondAgentFor;
19
+ exports.commandCodePlanReviewSendMessage = commandCodePlanReviewSendMessage;
20
+ /**
21
+ * The flags that aim a `respond` (or `send`) at the waiting session, by the
22
+ * CLI's own order (`targetFlags` in `src/cli/utils/follow-up-command.ts`): an
23
+ * instance first, else a tool, else nothing — the sentence as it was before.
24
+ *
25
+ * @param instanceId - The instance the request named, if any
26
+ * @param agent - The tool to name when no instance was named (see {@link respondAgentFor})
27
+ */
28
+ function respondTargetFlags(instanceId, agent) {
29
+ if (instanceId)
30
+ return ` --instance ${instanceId}`;
31
+ if (agent)
32
+ return ` --agent ${agent}`;
33
+ return '';
34
+ }
35
+ /**
36
+ * The tool a guidance `respond` must name, or undefined when a bare one already
37
+ * reaches the waiting session.
38
+ *
39
+ * Only a request that named a tool explicitly and no instance gets one, and
40
+ * only when that tool is not what an unqualified request resolves to (the
41
+ * worktree default): `--agent claude` on a claude worktree, and a request that
42
+ * named nothing, keep the sentence they had (#4031's "primary and default are
43
+ * unchanged").
44
+ *
45
+ * @param requestedCliTool - The tool the request named explicitly, if any
46
+ * @param instanceId - The instance the request named, if any
47
+ * @param unqualifiedCliTool - The tool a request naming nothing resolves to
48
+ */
49
+ function respondAgentFor(requestedCliTool, instanceId, unqualifiedCliTool) {
50
+ if (instanceId || !requestedCliTool)
51
+ return undefined;
52
+ return requestedCliTool === unqualifiedCliTool ? undefined : requestedCliTool;
53
+ }
54
+ /**
55
+ * Why `send` stops at the plan review overlay (Issue #3125).
56
+ *
57
+ * The overlay replaces the composer until a human decides, so waiting for the
58
+ * composer only ran out the clock (`prompt not ready` after the full timeout).
59
+ * Its comments, Submit review, approval and cancel go through `respond`.
60
+ *
61
+ * Issue #4049: a function, not a constant. The constant named a
62
+ * `<worktree-id>` placeholder and no instance, so on `command-code-2` the
63
+ * `respond` it showed went to the primary instance. The primary instance
64
+ * (no id, or the tool's own id — #868) gets no `--instance`.
65
+ *
66
+ * Issue #4063: and the tool, by {@link respondTargetFlags}' rule, when the
67
+ * request named Command Code on a worktree whose default is another tool
68
+ * ({@link respondAgentFor}). `CommandCodeTool.sendMessage` does not know the
69
+ * request, so the routes (send, terminal) rebuild the sentence with the `agent`
70
+ * they resolved; the tool's own throw leaves it out. Kept here, with no import
71
+ * beyond types, so those routes do not load the tool module.
72
+ *
73
+ * @param worktreeId - The worktree whose session is showing the review
74
+ * @param instanceId - The instance the send was for, if any
75
+ * @param agent - The tool the `respond` must name when no instance is (see `respondAgentFor`)
76
+ */
77
+ function commandCodePlanReviewSendMessage(worktreeId, instanceId, agent) {
78
+ const target = respondTargetFlags(instanceId && instanceId !== 'command-code' ? instanceId : undefined, agent);
79
+ return ('Command Code is showing a plan review (REVIEW), which takes review comments, not messages. ' +
80
+ `Comment with \`commandmate respond ${worktreeId} "<text>"${target}\`, then \`--plan-review submit\` (ctrl+r), ` +
81
+ '`--plan-review approve` (ctrl+a) or `--plan-review cancel` (esc).');
82
+ }
@@ -22,11 +22,46 @@
22
22
  * Recording must never change a send's outcome: {@link recordSendAttempt}
23
23
  * swallows its own failures.
24
24
  *
25
+ * Issue #4065: which attempt is "the last" is decided by the input lock's
26
+ * grant order, not by which attempt finished last. Three kinds of record:
27
+ *
28
+ * - **granted** — the attempt held the body's input lock (`inputGeneration`,
29
+ * the ticket's generation g). Includes one refused after the grant before
30
+ * any key (g does not mean "typed"). Kept when g ≥ the instance's highest
31
+ * granted generation so far (maxG), dropped when g < maxG: a send granted
32
+ * later has already said how it went.
33
+ * - **refused** — `not-sent` before any lock was granted to it
34
+ * (`observedGeneration`, the generation counter o read once at the request's
35
+ * outermost entry). Kept when maxG ≤ o, dropped when maxG > o: a send granted
36
+ * after this request began has already said how it went. o is only ever
37
+ * compared with maxG — never with another o, nor with another instance's
38
+ * grants; o = 0 is a value like any other.
39
+ * - **excluded / unknown** — neither (copilot's selection-list commands and
40
+ * `/model`, opencode's HTTP delivery including its keyboard fallback after an
41
+ * `unknown` dispatch, a tool path that reports nothing). Kept in the order
42
+ * they finish, as before #4065, and they never move maxG.
43
+ *
44
+ * maxG is held beside the published record and only ever grows: a refused or
45
+ * excluded record, or a demotion ({@link markLastSendDiscarded}), never lowers
46
+ * it, so an older grant's late outcome cannot come back after them. Within one
47
+ * process the generation never goes back (a recreated session keeps counting);
48
+ * a restart forgets the records and maxG together. A worktree ID migration
49
+ * does not move them (the old ID's records are dropped). When more than
50
+ * {@link MAX_TRACKED_INSTANCES} instances are tracked the least recently sent
51
+ * to loses its record and its maxG together — a late outcome for it is then
52
+ * recorded as if it were the first.
53
+ *
54
+ * The published `lastSend` is still the three fields `at` / `state` /
55
+ * `reason`; neither g nor o is published, and `at` is not an order. It is the
56
+ * instance's last attempt by the rules above — not necessarily the reading
57
+ * request's own (that is `onAttempt` / `sendOutcome`).
58
+ *
25
59
  * @module lib/session/send-attempt-state
26
60
  */
27
61
  Object.defineProperty(exports, "__esModule", { value: true });
28
62
  exports.sendMessageDigest = sendMessageDigest;
29
63
  exports.recordSendAttempt = recordSendAttempt;
64
+ exports.forgetSendAttemptsForWorktree = forgetSendAttemptsForWorktree;
30
65
  exports.getLastSendAttempt = getLastSendAttempt;
31
66
  exports.markLastSendDiscarded = markLastSendDiscarded;
32
67
  exports.clearSendAttempts = clearSendAttempts;
@@ -42,6 +77,13 @@ const logger = (0, logger_1.createLogger)('session/send-attempt-state');
42
77
  /** How many instances are tracked at once; the least recently sent to is forgotten first. */
43
78
  const MAX_TRACKED_INSTANCES = 1024;
44
79
  const records = (0, global_state_1.getOrInitGlobal)('__sendAttemptRecords', () => new Map());
80
+ /**
81
+ * Issue #4065: per instance, the highest input generation a granted record
82
+ * carried (maxG). Kept apart from the published record so that a refused or
83
+ * excluded record — or a demotion — that replaces it does not forget it.
84
+ * Evicted with the instance's record.
85
+ */
86
+ const maxGenerations = (0, global_state_1.getOrInitGlobal)('__sendAttemptMaxGeneration', () => new Map());
45
87
  function keyOf(instance) {
46
88
  return JSON.stringify([instance.worktreeId, instance.cliToolId, instance.instanceId]);
47
89
  }
@@ -52,27 +94,90 @@ function sendMessageDigest(content) {
52
94
  /**
53
95
  * Record how a send attempt ended. Never throws: a record that cannot be made
54
96
  * leaves the send exactly as it was.
97
+ *
98
+ * Issue #4048: `typedContent` is the body the sender actually typed when it
99
+ * differs from `content`; `inputGeneration` is the input lock generation the
100
+ * attempt ran under.
101
+ *
102
+ * Issue #4065: `observedGeneration` is the generation counter the request read
103
+ * at its outermost entry (`instanceInputGenerationMark` in `instance-input-lock`), given for a
104
+ * `not-sent` refusal made before any lock was granted to it. Which record is
105
+ * kept is decided against the instance's maxG (see the module comment):
106
+ * granted g ≥ maxG is kept (and raises maxG), g < maxG dropped; a refusal is
107
+ * kept when maxG ≤ o; a record with neither is kept, in the order recorded.
108
+ * `inputGeneration` wins when both are given.
109
+ *
110
+ * @returns Whether the attempt became the instance's record. The request's own
111
+ * outcome is the caller's to report whatever this says (`onAttempt`).
55
112
  */
56
113
  function recordSendAttempt(instance, attempt, now = Date.now()) {
57
114
  try {
58
115
  const key = keyOf(instance);
116
+ const maxGeneration = maxGenerations.get(key);
117
+ if (attempt.inputGeneration !== undefined) {
118
+ if (maxGeneration !== undefined && maxGeneration > attempt.inputGeneration) {
119
+ logger.info('send-attempt-record-skipped-stale-generation', {
120
+ generation: attempt.inputGeneration,
121
+ heldGeneration: maxGeneration,
122
+ });
123
+ return false;
124
+ }
125
+ }
126
+ else if (attempt.observedGeneration !== undefined) {
127
+ if (maxGeneration !== undefined && maxGeneration > attempt.observedGeneration) {
128
+ logger.info('send-attempt-record-skipped-refusal-before-newer-grant', {
129
+ observedGeneration: attempt.observedGeneration,
130
+ heldGeneration: maxGeneration,
131
+ });
132
+ return false;
133
+ }
134
+ }
135
+ const messageDigest = sendMessageDigest(attempt.content);
136
+ const typedDigest = attempt.typedContent === undefined ? undefined : sendMessageDigest(attempt.typedContent);
59
137
  // Re-inserted, so the map's order is least recently sent to first.
60
138
  records.delete(key);
61
139
  records.set(key, {
62
140
  at: Math.floor(now),
63
141
  state: attempt.state,
64
142
  reason: attempt.reason,
65
- messageDigest: sendMessageDigest(attempt.content),
143
+ messageDigest,
144
+ ...(typedDigest !== undefined && typedDigest !== messageDigest ? { typedDigest } : {}),
145
+ ...(attempt.inputGeneration !== undefined ? { inputGeneration: attempt.inputGeneration } : {}),
66
146
  });
147
+ if (attempt.inputGeneration !== undefined) {
148
+ maxGenerations.set(key, Math.max(maxGeneration ?? attempt.inputGeneration, attempt.inputGeneration));
149
+ }
67
150
  while (records.size > MAX_TRACKED_INSTANCES) {
68
151
  const oldest = records.keys().next().value;
69
152
  if (oldest === undefined)
70
153
  break;
71
154
  records.delete(oldest);
155
+ maxGenerations.delete(oldest);
72
156
  }
157
+ return true;
73
158
  }
74
159
  catch (error) {
75
160
  logger.warn('send-attempt-record-failed', { error: error instanceof Error ? error.message : String(error) });
161
+ return false;
162
+ }
163
+ }
164
+ /**
165
+ * Forget the records — and their maxG — of every instance of `worktreeId`
166
+ * (Issue #4065): a worktree ID migration drops them rather than moving them,
167
+ * so the new ID starts with no record. Never throws.
168
+ */
169
+ function forgetSendAttemptsForWorktree(worktreeId) {
170
+ try {
171
+ for (const key of [...records.keys(), ...maxGenerations.keys()]) {
172
+ const parsed = JSON.parse(key);
173
+ if (Array.isArray(parsed) && parsed[0] === worktreeId) {
174
+ records.delete(key);
175
+ maxGenerations.delete(key);
176
+ }
177
+ }
178
+ }
179
+ catch (error) {
180
+ logger.warn('send-attempt-forget-failed', { error: error instanceof Error ? error.message : String(error) });
76
181
  }
77
182
  }
78
183
  /** The instance's last recorded attempt, or null when none is held. */
@@ -83,22 +188,35 @@ function getLastSendAttempt(instance) {
83
188
  * Turn the instance's last `sent` record `indeterminate` (Issue #4035): the
84
189
  * next send found that body still in the composer, so it never reached the
85
190
  * agent. Any other record is left as it is. Never throws.
191
+ *
192
+ * `messageDigest` (Issue #4048) is the digest of the body that was found (the
193
+ * body typed, so it is matched against the record's `typedDigest` too): a
194
+ * record of another attempt — a later send, or one whose body differs — is
195
+ * left as it is. Omitted, the last `sent` record is demoted as before.
86
196
  */
87
- function markLastSendDiscarded(instance, now = Date.now()) {
197
+ function markLastSendDiscarded(instance, now = Date.now(), messageDigest) {
88
198
  try {
89
199
  const key = keyOf(instance);
90
200
  const record = records.get(key);
91
201
  if (record === undefined || record.state !== 'sent')
92
202
  return;
203
+ if (messageDigest !== undefined &&
204
+ record.messageDigest !== messageDigest &&
205
+ record.typedDigest !== messageDigest) {
206
+ return;
207
+ }
208
+ // Issue #4065: the spread keeps the record's generation, and maxG is not
209
+ // touched — a demotion is not a newer attempt.
93
210
  records.set(key, { ...record, at: Math.floor(now), state: 'indeterminate', reason: 'found-in-composer' });
94
211
  }
95
212
  catch (error) {
96
213
  logger.warn('send-attempt-record-failed', { error: error instanceof Error ? error.message : String(error) });
97
214
  }
98
215
  }
99
- /** Forget every record (tests). */
216
+ /** Forget every record and every maxG (tests). */
100
217
  function clearSendAttempts() {
101
218
  records.clear();
219
+ maxGenerations.clear();
102
220
  }
103
221
  /**
104
222
  * The wordings of a failed tmux call that can carry the message body: `tmux.ts`
@@ -134,6 +252,15 @@ function carriesCode(error, code) {
134
252
  * (`Failed to send message to <tool>: …`), so they are matched anywhere in it.
135
253
  */
136
254
  function classifySendFailure(error) {
255
+ // #4040: opencode's keyboard fallback refused before any key (its cause says
256
+ // why — a code like `paste-not-started` included), but the server dispatch
257
+ // before it ended `unknown`: the message may already be there, so the attempt
258
+ // as a whole stays unknown, never "safe to resend". Read FIRST, before any
259
+ // code the cause carries.
260
+ if (error instanceof Error &&
261
+ /an earlier server dispatch may have delivered the message \(Issue #4040\)/.test(error.message)) {
262
+ return { state: 'indeterminate', reason: 'send-error' };
263
+ }
137
264
  if (typeof error === 'object' &&
138
265
  error !== null &&
139
266
  error.code === session_start_error_1.SESSION_STARTING_CODE) {