commandmate 0.49.1 → 0.49.2

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 (456) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +128 -132
  3. package/.next/app-path-routes-manifest.json +22 -22
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +12 -12
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  8. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/capabilities/route.js +1 -1
  17. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  26. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  27. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  29. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  30. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  32. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  33. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  38. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  41. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  42. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/relays/[relayId]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/relays/route.js +1 -1
  45. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  46. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  50. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  51. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/clone/route.js +1 -1
  53. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  54. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/restore/route.js +1 -1
  57. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  58. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/repositories/route.js +1 -1
  60. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  61. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/repositories/scan/route.js +1 -1
  63. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  64. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/repositories/sync/route.js +1 -1
  66. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  67. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  70. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  71. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  75. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  79. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  82. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  86. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/verification/runs/route.js +1 -1
  88. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  91. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/cli-reference/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/env/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/instances/notes/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  167. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  170. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +2 -1
  172. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  173. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/logs/route.js +2 -2
  178. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/opencode/diff/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  210. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/send/route.js +2 -2
  219. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +3 -3
  222. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  232. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  235. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  236. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  238. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  240. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  244. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  246. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  247. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  249. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  250. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  252. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  253. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  256. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  259. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  260. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  262. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  263. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  265. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  268. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  270. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  271. package/.next/server/app/api/worktrees/route.js +1 -1
  272. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  273. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  274. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  275. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  276. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  277. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  278. package/.next/server/app/page_client-reference-manifest.js +1 -1
  279. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  280. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  281. package/.next/server/app/review/page.js +1 -1
  282. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  283. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  284. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  285. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  286. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  287. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  288. package/.next/server/app/worktrees/[id]/page.js +2 -2
  289. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  290. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  291. package/.next/server/app-paths-manifest.json +22 -22
  292. package/.next/server/chunks/1062.js +1 -0
  293. package/.next/server/chunks/110.js +1 -0
  294. package/.next/server/chunks/1501.js +5 -4
  295. package/.next/server/chunks/1656.js +2 -2
  296. package/.next/server/chunks/1957.js +2 -0
  297. package/.next/server/chunks/2119.js +1 -1
  298. package/.next/server/chunks/2445.js +1 -1
  299. package/.next/server/chunks/2897.js +1 -0
  300. package/.next/server/chunks/3417.js +1 -0
  301. package/.next/server/chunks/3505.js +1 -1
  302. package/.next/server/chunks/3756.js +1 -0
  303. package/.next/server/chunks/3801.js +3 -3
  304. package/.next/server/chunks/4911.js +1 -0
  305. package/.next/server/chunks/4936.js +1 -0
  306. package/.next/server/chunks/5209.js +2 -1
  307. package/.next/server/chunks/5354.js +1 -1
  308. package/.next/server/chunks/6130.js +1 -1
  309. package/.next/server/chunks/6401.js +1 -1
  310. package/.next/server/chunks/7023.js +2 -2
  311. package/.next/server/chunks/7905.js +1 -1
  312. package/.next/server/chunks/8581.js +15 -15
  313. package/.next/server/chunks/8728.js +2 -2
  314. package/.next/server/chunks/8782.js +1 -1
  315. package/.next/server/chunks/9390.js +1 -1
  316. package/.next/server/chunks/9584.js +1 -1
  317. package/.next/server/chunks/9731.js +2 -2
  318. package/.next/server/middleware-manifest.json +5 -5
  319. package/.next/server/pages/500.html +1 -1
  320. package/.next/server/server-reference-manifest.json +1 -1
  321. package/.next/static/chunks/{2407-675ba6b21844dc3b.js → 2407-07a237575e1ceb9e.js} +1 -1
  322. package/.next/static/chunks/3931-61ad1a4fc0208d0e.js +1 -0
  323. package/.next/static/chunks/5794-7975b8e51e731b19.js +1 -0
  324. package/.next/static/chunks/6966-d8dc6032410ffaba.js +1 -0
  325. package/.next/static/chunks/7197-ed3b3d99ac3bd450.js +1 -0
  326. package/.next/static/chunks/7636-a48cf0f7110250c5.js +1 -0
  327. package/.next/static/chunks/app/layout-4f64316957b0a8e5.js +1 -0
  328. package/.next/static/chunks/app/more/page-ff5af5ca48774c89.js +1 -0
  329. package/.next/static/chunks/app/page-b4863bfe0452e09d.js +1 -0
  330. package/.next/static/chunks/app/review/page-ff3efb96fdf9bb4b.js +1 -0
  331. package/.next/static/chunks/app/sessions/{page-890fd50ec9739973.js → page-c6eb7c02db2f4c80.js} +1 -1
  332. package/.next/static/chunks/app/worktrees/[id]/{page-f6d3ab8185d93aae.js → page-33afc6aa96289fb0.js} +1 -1
  333. package/.next/trace +13 -13
  334. package/dist/cli/commands/ask.d.ts.map +1 -1
  335. package/dist/cli/commands/ask.js +56 -5
  336. package/dist/cli/commands/attach.d.ts +4 -1
  337. package/dist/cli/commands/attach.d.ts.map +1 -1
  338. package/dist/cli/commands/attach.js +19 -7
  339. package/dist/cli/commands/command-target.d.ts +7 -0
  340. package/dist/cli/commands/command-target.d.ts.map +1 -1
  341. package/dist/cli/commands/command-target.js +10 -0
  342. package/dist/cli/commands/instances.d.ts.map +1 -1
  343. package/dist/cli/commands/instances.js +38 -2
  344. package/dist/cli/commands/message-dispatch.d.ts +17 -3
  345. package/dist/cli/commands/message-dispatch.d.ts.map +1 -1
  346. package/dist/cli/commands/message-dispatch.js +14 -8
  347. package/dist/cli/commands/relays.d.ts +2 -1
  348. package/dist/cli/commands/relays.d.ts.map +1 -1
  349. package/dist/cli/commands/relays.js +4 -3
  350. package/dist/cli/commands/respond-strict.d.ts.map +1 -1
  351. package/dist/cli/commands/respond-strict.js +22 -5
  352. package/dist/cli/commands/respond.d.ts +2 -2
  353. package/dist/cli/commands/respond.d.ts.map +1 -1
  354. package/dist/cli/commands/respond.js +40 -37
  355. package/dist/cli/commands/send.d.ts.map +1 -1
  356. package/dist/cli/commands/send.js +8 -4
  357. package/dist/cli/commands/wait-instance.d.ts +9 -1
  358. package/dist/cli/commands/wait-instance.d.ts.map +1 -1
  359. package/dist/cli/commands/wait-instance.js +15 -0
  360. package/dist/cli/commands/wait-poll-state.d.ts +18 -0
  361. package/dist/cli/commands/wait-poll-state.d.ts.map +1 -1
  362. package/dist/cli/commands/wait-verify.d.ts +2 -1
  363. package/dist/cli/commands/wait-verify.d.ts.map +1 -1
  364. package/dist/cli/commands/wait-verify.js +5 -1
  365. package/dist/cli/commands/wait.d.ts.map +1 -1
  366. package/dist/cli/commands/wait.js +37 -13
  367. package/dist/cli/commands/whoami.d.ts.map +1 -1
  368. package/dist/cli/commands/whoami.js +3 -1
  369. package/dist/cli/docs/agent-operations.d.ts +1 -1
  370. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  371. package/dist/cli/docs/agent-operations.js +1 -0
  372. package/dist/cli/types/api-responses.d.ts +3 -1
  373. package/dist/cli/types/api-responses.d.ts.map +1 -1
  374. package/dist/cli/utils/api-client.d.ts +55 -1
  375. package/dist/cli/utils/api-client.d.ts.map +1 -1
  376. package/dist/cli/utils/api-client.js +220 -18
  377. package/dist/cli/utils/follow-up-command.d.ts +38 -0
  378. package/dist/cli/utils/follow-up-command.d.ts.map +1 -0
  379. package/dist/cli/utils/follow-up-command.js +57 -0
  380. package/dist/cli/utils/reply-ledger.d.ts +1 -1
  381. package/dist/cli/utils/reply-ledger.d.ts.map +1 -1
  382. package/dist/cli/utils/reply-ledger.js +7 -2
  383. package/dist/cli/utils/server-capabilities.d.ts +18 -0
  384. package/dist/cli/utils/server-capabilities.d.ts.map +1 -1
  385. package/dist/cli/utils/server-capabilities.js +36 -3
  386. package/dist/cli/utils/session-target.d.ts +1 -1
  387. package/dist/cli/utils/session-target.d.ts.map +1 -1
  388. package/dist/cli/utils/session-target.js +3 -0
  389. package/dist/cli/utils/verify-runner.d.ts +7 -0
  390. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  391. package/dist/cli/utils/verify-runner.js +51 -15
  392. package/dist/lib/cli-tools/session-name.d.ts.map +1 -1
  393. package/dist/lib/cli-tools/session-name.js +11 -3
  394. package/dist/lib/session/send-attempt-types.d.ts +25 -0
  395. package/dist/lib/session/send-attempt-types.d.ts.map +1 -1
  396. package/dist/lib/session/send-attempt-types.js +10 -1
  397. package/dist/lib/verification/session-kill-ledger.d.ts +110 -0
  398. package/dist/lib/verification/session-kill-ledger.d.ts.map +1 -0
  399. package/dist/lib/verification/session-kill-ledger.js +174 -0
  400. package/dist/server/locales/en/worktree.json +2 -0
  401. package/dist/server/locales/ja/worktree.json +2 -0
  402. package/dist/server/src/config/cli-tool-timing-config.js +1 -7
  403. package/dist/server/src/lib/auto-yes-poller.js +5 -1
  404. package/dist/server/src/lib/cli-tools/antigravity.js +5 -2
  405. package/dist/server/src/lib/cli-tools/base.js +39 -0
  406. package/dist/server/src/lib/cli-tools/codex.js +7 -4
  407. package/dist/server/src/lib/cli-tools/command-code.js +7 -3
  408. package/dist/server/src/lib/cli-tools/copilot.js +5 -3
  409. package/dist/server/src/lib/cli-tools/gemini.js +10 -2
  410. package/dist/server/src/lib/cli-tools/launch-keys.js +39 -0
  411. package/dist/server/src/lib/cli-tools/opencode-v2.js +6 -2
  412. package/dist/server/src/lib/cli-tools/opencode.js +5 -2
  413. package/dist/server/src/lib/cli-tools/session-name.js +11 -3
  414. package/dist/server/src/lib/cli-tools/submit-composer-read.js +16 -6
  415. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +164 -7
  416. package/dist/server/src/lib/cli-tools/vibe-local.js +4 -2
  417. package/dist/server/src/lib/db/db-migration-path.js +63 -2
  418. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +5 -4
  419. package/dist/server/src/lib/hooks/sources/copilot/hook-settings.js +2 -3
  420. package/dist/server/src/lib/prompt-answer-errors.js +76 -2
  421. package/dist/server/src/lib/session/agent-event-state.js +4 -0
  422. package/dist/server/src/lib/session/agent-session-lifecycle.js +6 -1
  423. package/dist/server/src/lib/session/claude-session.js +22 -6
  424. package/dist/server/src/lib/session/current-output-builder.js +5 -3
  425. package/dist/server/src/lib/session/current-output-history-writers.js +1 -1
  426. package/dist/server/src/lib/session/prompt-submit-receipt.js +155 -0
  427. package/dist/server/src/lib/session/prompt-waiting-guard.js +10 -3
  428. package/dist/server/src/lib/session/send-attempt-state.js +48 -0
  429. package/dist/server/src/lib/session/send-attempt-types.js +10 -1
  430. package/dist/server/src/lib/session/send-user-message.js +5 -4
  431. package/dist/server/src/lib/session/session-launch-flight.js +243 -0
  432. package/dist/server/src/lib/session/session-starting-state.js +40 -4
  433. package/dist/server/src/lib/session/structured-prompt.js +12 -9
  434. package/dist/server/src/lib/session/waiting-episode-binding.js +4 -2
  435. package/dist/server/src/lib/session-cleanup.js +32 -0
  436. package/dist/server/src/lib/session-key-sender.js +0 -27
  437. package/dist/server/src/lib/verification/env-clean-gate.js +129 -0
  438. package/dist/server/src/lib/verification/env-snapshot.js +11 -2
  439. package/dist/server/src/lib/verification/session-kill-ledger.js +174 -0
  440. package/package.json +5 -1
  441. package/release-notes/0.49.2.json +49 -0
  442. package/.next/server/chunks/3773.js +0 -1
  443. package/.next/server/chunks/5775.js +0 -1
  444. package/.next/server/chunks/7604.js +0 -2
  445. package/.next/static/chunks/3931-1a1abab16248f14d.js +0 -1
  446. package/.next/static/chunks/4768-ad6f82f034f21eae.js +0 -1
  447. package/.next/static/chunks/5794-80ac3f06f098ea29.js +0 -1
  448. package/.next/static/chunks/6654-f3534f35f16644bc.js +0 -1
  449. package/.next/static/chunks/7665-e9ef6e0a85b9fa49.js +0 -1
  450. package/.next/static/chunks/8606-ce17ffa77f39608e.js +0 -1
  451. package/.next/static/chunks/app/layout-8bfac4724277b47f.js +0 -1
  452. package/.next/static/chunks/app/more/page-87c84987b2765213.js +0 -1
  453. package/.next/static/chunks/app/page-1b820c421db48c2c.js +0 -1
  454. package/.next/static/chunks/app/review/page-e2fd4a590646a2d8.js +0 -1
  455. /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → yGatWDsS532awSs51kXyd}/_buildManifest.js +0 -0
  456. /package/.next/static/{fqfSDqQMweROeHUzOt_m1 → yGatWDsS532awSs51kXyd}/_ssgManifest.js +0 -0
@@ -9,12 +9,14 @@
9
9
  * - ApiClient: HTTP get/post with base URL and auth headers
10
10
  */
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.ApiError = exports.ApiClient = exports.FOREIGN_SESSION_ERROR_CODE = exports.MAX_STOP_PATTERN_LENGTH = void 0;
12
+ exports.DeadlineExceededError = exports.ApiError = exports.ApiClient = exports.FOREIGN_SESSION_ERROR_CODE = exports.MAX_STOP_PATTERN_LENGTH = void 0;
13
13
  exports.isValidWorktreeId = isValidWorktreeId;
14
14
  exports.isValidInstanceId = isValidInstanceId;
15
15
  exports.resolveAuthToken = resolveAuthToken;
16
16
  exports.foreignSessionMessage = foreignSessionMessage;
17
17
  exports.handleApiError = handleApiError;
18
+ exports.isDeadlineExceeded = isDeadlineExceeded;
19
+ exports.rethrowIfDeadlineExceeded = rethrowIfDeadlineExceeded;
18
20
  exports.assertResponseShape = assertResponseShape;
19
21
  exports.fetchDaemonVersion = fetchDaemonVersion;
20
22
  exports.warnIfVersionSkew = warnIfVersionSkew;
@@ -255,6 +257,8 @@ function isLocalhost(url) {
255
257
  class ApiClient {
256
258
  baseUrl;
257
259
  token;
260
+ /** Epoch ms after which every request of this client fails (Issue #3983). */
261
+ deadlineAt;
258
262
  constructor(options) {
259
263
  // Issue #1743: resolve through loadClientEnv() rather than `process.env.CM_PORT || '3000'`.
260
264
  // Reading process.env alone ignored ~/.commandmate/.env, so with two servers running,
@@ -289,6 +293,51 @@ class ApiClient {
289
293
  get serverUrl() {
290
294
  return this.baseUrl;
291
295
  }
296
+ /**
297
+ * This client with every request bounded by `deadlineAt` (Issue #3983).
298
+ *
299
+ * `wait` / `ask` / `verify` take `--timeout` as the deadline of the whole
300
+ * command, but only the poll's own reads were bounded by it: a task-ledger
301
+ * read, an `--instance` resolution or a capability probe before the poll had
302
+ * no deadline at all, so a server that stopped answering held the command for
303
+ * as long as undici's own timeouts (minutes) and then, swallowed into a
304
+ * degraded path, kept it going. The derived client carries one deadline for
305
+ * every method (`get` / `post` / `patch` / `rawGet`), and a request it ends
306
+ * fails with {@link DeadlineExceededError} — exit 124 — which the
307
+ * degrade-on-failure catches rethrow ({@link isDeadlineExceeded}).
308
+ *
309
+ * One request lasts until its body has been read (`json()` / `text()`), the
310
+ * body of a {@link rawGet} response included: a server that sends headers and
311
+ * then stalls the body is not an answer.
312
+ *
313
+ * @param deadlineAt - Epoch ms; undefined returns this client unchanged
314
+ * @returns A client sharing this one's server and token
315
+ */
316
+ withDeadline(deadlineAt) {
317
+ if (deadlineAt === undefined || !Number.isFinite(deadlineAt))
318
+ return this;
319
+ // Not `new ApiClient(...)`: the constructor re-resolves the endpoint and
320
+ // re-prints the --token warning, and the derived client must dial the very
321
+ // server this one does.
322
+ const derived = Object.create(Object.getPrototypeOf(this));
323
+ derived.baseUrl = this.baseUrl;
324
+ derived.token = this.token;
325
+ derived.deadlineAt = deadlineAt;
326
+ return derived;
327
+ }
328
+ /** The deadline this client carries, if any (Issue #3983). */
329
+ get deadline() {
330
+ return this.deadlineAt;
331
+ }
332
+ /**
333
+ * The bound of one request: a signal that fires at the deadline (combined
334
+ * with the caller's own, when it gave one), or null without a deadline.
335
+ */
336
+ startDeadline(callerSignal) {
337
+ if (this.deadlineAt === undefined)
338
+ return null;
339
+ return startRequestDeadline(this.deadlineAt, this.baseUrl, callerSignal);
340
+ }
292
341
  getHeaders() {
293
342
  const headers = {
294
343
  'Content-Type': 'application/json',
@@ -314,11 +363,28 @@ class ApiClient {
314
363
  * @returns The raw Response, whatever its status
315
364
  */
316
365
  async rawGet(path, init) {
317
- return fetch(`${this.baseUrl}${path}`, {
318
- method: 'GET',
319
- headers: { ...this.getHeaders(), ...(init?.headers ?? {}) },
320
- redirect: 'manual',
321
- });
366
+ const deadline = this.startDeadline();
367
+ if (!deadline) {
368
+ return fetch(`${this.baseUrl}${path}`, {
369
+ method: 'GET',
370
+ headers: { ...this.getHeaders(), ...(init?.headers ?? {}) },
371
+ redirect: 'manual',
372
+ });
373
+ }
374
+ // Issue #3983: the caller reads the body, so the deadline is not released
375
+ // here — it stays armed (unref'd) for the body read, which it also bounds.
376
+ try {
377
+ const response = await deadline.run(fetch(`${this.baseUrl}${path}`, {
378
+ method: 'GET',
379
+ headers: { ...this.getHeaders(), ...(init?.headers ?? {}) },
380
+ redirect: 'manual',
381
+ signal: deadline.signal,
382
+ }));
383
+ return boundBodyReads(response, deadline);
384
+ }
385
+ catch (error) {
386
+ throw deadline.classify(error);
387
+ }
322
388
  }
323
389
  /**
324
390
  * HTTP GET request
@@ -330,34 +396,45 @@ class ApiClient {
330
396
  * before (no `signal` key on the fetch init).
331
397
  */
332
398
  async get(path, init) {
399
+ // Issue #3983: a client with a deadline bounds the request and its body.
400
+ const deadline = this.startDeadline(init?.signal);
401
+ const signal = deadline ? deadline.signal : init?.signal;
333
402
  try {
334
- const response = await fetch(`${this.baseUrl}${path}`, {
403
+ const response = await bounded(deadline, fetch(`${this.baseUrl}${path}`, {
335
404
  method: 'GET',
336
405
  headers: this.getHeaders(),
337
- ...(init?.signal ? { signal: init.signal } : {}),
338
- });
406
+ ...(signal ? { signal } : {}),
407
+ }));
339
408
  if (!response.ok) {
340
409
  // Issue #1637: read the body first — handleApiError needs it to surface
341
410
  // the server's reason for a 5xx instead of "check the logs".
342
- const payload = await readErrorPayload(response);
411
+ const payload = await bounded(deadline, readErrorPayload(response));
343
412
  const errResult = handleApiError(null, response.status, payload, { serverUrl: this.baseUrl });
344
413
  throw new ApiError(errResult.message, errResult.exitCode, response.status, payload);
345
414
  }
346
- return (await response.json());
415
+ return (await bounded(deadline, response.json()));
347
416
  }
348
417
  catch (error) {
418
+ if (deadline) {
419
+ const classified = deadline.classify(error);
420
+ if (classified instanceof DeadlineExceededError)
421
+ throw classified;
422
+ }
349
423
  if (error instanceof ApiError)
350
424
  throw error;
351
425
  const errResult = handleApiError(error);
352
426
  throw new ApiError(errResult.message, errResult.exitCode);
353
427
  }
428
+ finally {
429
+ deadline?.release();
430
+ }
354
431
  }
355
432
  /**
356
433
  * HTTP POST request
357
434
  * [DR1-05] Generic type parameter specified at call site
358
435
  */
359
436
  async post(path, body) {
360
- return sendWithBody(this.baseUrl, 'POST', this.getHeaders(), path, body);
437
+ return sendWithBody(this.baseUrl, 'POST', this.getHeaders(), path, body, this.startDeadline());
361
438
  }
362
439
  /**
363
440
  * HTTP PATCH request (Issue #1000: agent-instance roster mutations via
@@ -365,37 +442,46 @@ class ApiClient {
365
442
  * [DR1-05] Generic type parameter specified at call site
366
443
  */
367
444
  async patch(path, body) {
368
- return sendWithBody(this.baseUrl, 'PATCH', this.getHeaders(), path, body);
445
+ return sendWithBody(this.baseUrl, 'PATCH', this.getHeaders(), path, body, this.startDeadline());
369
446
  }
370
447
  }
371
448
  exports.ApiClient = ApiClient;
372
449
  /** POST / PATCH share everything but the method; an empty body (204) is `undefined`. */
373
- async function sendWithBody(baseUrl, method, headers, path, body) {
450
+ async function sendWithBody(baseUrl, method, headers, path, body, deadline) {
374
451
  try {
375
- const response = await fetch(`${baseUrl}${path}`, {
452
+ const response = await bounded(deadline, fetch(`${baseUrl}${path}`, {
376
453
  method,
377
454
  headers,
378
455
  body: body !== undefined ? JSON.stringify(body) : undefined,
379
- });
456
+ ...(deadline ? { signal: deadline.signal } : {}),
457
+ }));
380
458
  if (!response.ok) {
381
459
  // Issue #1637: read the body first — handleApiError needs it to surface
382
460
  // the server's reason for a 5xx instead of "check the logs".
383
- const payload = await readErrorPayload(response);
461
+ const payload = await bounded(deadline, readErrorPayload(response));
384
462
  const errResult = handleApiError(null, response.status, payload, { serverUrl: baseUrl });
385
463
  throw new ApiError(errResult.message, errResult.exitCode, response.status, payload);
386
464
  }
387
465
  // Handle 204 No Content
388
- const text = await response.text();
466
+ const text = await bounded(deadline, response.text());
389
467
  if (!text)
390
468
  return undefined;
391
469
  return JSON.parse(text);
392
470
  }
393
471
  catch (error) {
472
+ if (deadline) {
473
+ const classified = deadline.classify(error);
474
+ if (classified instanceof DeadlineExceededError)
475
+ throw classified;
476
+ }
394
477
  if (error instanceof ApiError)
395
478
  throw error;
396
479
  const errResult = handleApiError(error);
397
480
  throw new ApiError(errResult.message, errResult.exitCode, undefined, undefined, error);
398
481
  }
482
+ finally {
483
+ deadline?.release();
484
+ }
399
485
  }
400
486
  /**
401
487
  * Read the typed error body of a failed response.
@@ -454,6 +540,122 @@ class ApiError extends Error {
454
540
  }
455
541
  exports.ApiError = ApiError;
456
542
  // =============================================================================
543
+ // Command deadline (Issue #3983)
544
+ // =============================================================================
545
+ /** The longest delay `setTimeout` honours (2^31-1 ms, ~24.8 days). */
546
+ const MAX_TIMER_MS = 2 ** 31 - 1;
547
+ /**
548
+ * A request ended by the deadline of a client from {@link ApiClient.withDeadline}
549
+ * (Issue #3983).
550
+ *
551
+ * An `ApiError` with exit 124 so that the commands' own error handling reports
552
+ * it as the timeout it is, and a class of its own so that a catch which turns
553
+ * failures into a degraded result ("verification resolves its own task", "use
554
+ * the selector as an instance id") can tell it apart and rethrow it — see
555
+ * {@link isDeadlineExceeded}. Wrapped into another `ApiError`, it travels as
556
+ * that error's `transportError`.
557
+ */
558
+ class DeadlineExceededError extends ApiError {
559
+ constructor(serverUrl) {
560
+ super(withServerUrl('--timeout reached before the server answered', { serverUrl }), types_1.WaitExitCode.TIMEOUT);
561
+ this.name = 'DeadlineExceededError';
562
+ }
563
+ }
564
+ exports.DeadlineExceededError = DeadlineExceededError;
565
+ /**
566
+ * Whether `error` is — or wraps — a request ended by a command deadline
567
+ * (Issue #3983). The catches that degrade on failure ask this first and
568
+ * rethrow: a deadline is the command's answer, not a reason to carry on.
569
+ */
570
+ function isDeadlineExceeded(error) {
571
+ if (error instanceof DeadlineExceededError)
572
+ return true;
573
+ if (error instanceof ApiError && error.transportError instanceof DeadlineExceededError)
574
+ return true;
575
+ return error instanceof Error && error.cause instanceof DeadlineExceededError;
576
+ }
577
+ /** Rethrow `error` when it is a command deadline; otherwise return (Issue #3983). */
578
+ function rethrowIfDeadlineExceeded(error) {
579
+ if (isDeadlineExceeded(error))
580
+ throw error;
581
+ }
582
+ /**
583
+ * Arm the deadline of one request. Its signal goes to `fetch` (which then also
584
+ * aborts the body stream), and every await of the request is raced against it
585
+ * as well — so a stalled body or a transport that ignores the signal still ends
586
+ * on time. Past the deadline the signal is already aborted and no request is
587
+ * sent; started exactly at it, the request gets the current tick (a read at the
588
+ * deadline may still bring the answer `verify` reports, Issue #1544). Beyond
589
+ * what a timer can hold the request is left unbounded.
590
+ */
591
+ function startRequestDeadline(deadlineAt, serverUrl, callerSignal) {
592
+ const controller = new AbortController();
593
+ const fire = () => {
594
+ if (!controller.signal.aborted)
595
+ controller.abort(new DeadlineExceededError(serverUrl));
596
+ };
597
+ const remaining = deadlineAt - Date.now();
598
+ let timer;
599
+ if (remaining < 0) {
600
+ fire();
601
+ }
602
+ else if (remaining <= MAX_TIMER_MS) {
603
+ timer = setTimeout(fire, remaining);
604
+ // A command that is done must not stay alive for a deadline it no longer needs.
605
+ timer.unref?.();
606
+ }
607
+ const signal = callerSignal ? AbortSignal.any([controller.signal, callerSignal]) : controller.signal;
608
+ const deadlineError = () => controller.signal.reason instanceof DeadlineExceededError
609
+ ? controller.signal.reason
610
+ : new DeadlineExceededError(serverUrl);
611
+ return {
612
+ signal,
613
+ run(promise) {
614
+ if (controller.signal.aborted) {
615
+ promise.catch(() => { });
616
+ return Promise.reject(deadlineError());
617
+ }
618
+ return new Promise((resolve, reject) => {
619
+ const onAbort = () => reject(deadlineError());
620
+ controller.signal.addEventListener('abort', onAbort, { once: true });
621
+ promise.then((value) => {
622
+ controller.signal.removeEventListener('abort', onAbort);
623
+ resolve(value);
624
+ }, (error) => {
625
+ controller.signal.removeEventListener('abort', onAbort);
626
+ reject(error);
627
+ });
628
+ });
629
+ },
630
+ classify(error) {
631
+ return controller.signal.aborted ? deadlineError() : error;
632
+ },
633
+ release() {
634
+ if (timer !== undefined)
635
+ clearTimeout(timer);
636
+ },
637
+ };
638
+ }
639
+ /** `promise` raced against `deadline`, or `promise` itself without one. */
640
+ function bounded(deadline, promise) {
641
+ return deadline ? deadline.run(promise) : promise;
642
+ }
643
+ /**
644
+ * A {@link ApiClient.rawGet} response whose body reads are raced against the
645
+ * request's deadline (Issue #3983). The caller reads the body, so the bound has
646
+ * to travel with the response.
647
+ */
648
+ function boundBodyReads(response, deadline) {
649
+ const read = (method) => () => deadline.run(method()).catch((error) => {
650
+ throw deadline.classify(error);
651
+ });
652
+ const json = response.json.bind(response);
653
+ const text = response.text.bind(response);
654
+ Object.defineProperty(response, 'json', { value: read(json), configurable: true });
655
+ Object.defineProperty(response, 'text', { value: read(text), configurable: true });
656
+ return response;
657
+ }
658
+ // =============================================================================
457
659
  // Response shape validation & version-skew detection (Issue #1357)
458
660
  // =============================================================================
459
661
  /**
@@ -0,0 +1,38 @@
1
+ /**
2
+ * The next command a CLI message tells the operator to run, aimed at the
3
+ * target the command actually addressed (Issue #3982).
4
+ *
5
+ * Each hint used to append ` --instance ${options.instance}` itself: the string
6
+ * the user typed (an alias reached `capture` unresolved), and nothing at all for
7
+ * `--agent` (so the hint read the worktree default's pane). One of them was
8
+ * fixed in #3975 and the others were not. These builders take the RESOLVED
9
+ * target — {@link CommandTarget}, what `resolveCommandTarget` returns — so the
10
+ * raw option cannot be passed where the hint's target belongs.
11
+ */
12
+ import type { CommandTarget } from '../commands/command-target';
13
+ /**
14
+ * The `capture` flags that read a dialog: the pane itself (the stored reply is
15
+ * not what is on screen), and enough of it to hold the dialog and its numbers.
16
+ */
17
+ export declare const DIALOG_CAPTURE_FLAGS = "--pane --tail 40";
18
+ /**
19
+ * ` --instance <id>` for a resolved instance, else ` --agent <tool>` when one
20
+ * was named, else nothing — a command that named no target keeps naming none.
21
+ */
22
+ export declare function targetFlags(target: CommandTarget): string;
23
+ /**
24
+ * `commandmate <verb> <worktree-id>[ <args>]<target flags>[ <trailing>]`.
25
+ *
26
+ * @param args - What follows the worktree id, e.g. `<number>` or `"<text>"`
27
+ * @param trailing - Flags that follow the target, e.g. `--pane --tail 40`
28
+ */
29
+ export declare function followUpCommand(verb: string, worktreeId: string, target: CommandTarget, args?: string, trailing?: string): string;
30
+ /** The `capture` that shows the target's dialog as it is on screen. */
31
+ export declare function dialogCaptureCommand(worktreeId: string, target: CommandTarget): string;
32
+ /**
33
+ * `commandmate capture <id>[ target] --pane`: the pane a message went to, to
34
+ * look at before a resend (Issue #3992). Without a target (a caller that has
35
+ * none to give) it names none.
36
+ */
37
+ export declare function paneCaptureCommand(worktreeId: string, target: CommandTarget | undefined): string;
38
+ //# sourceMappingURL=follow-up-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"follow-up-command.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/follow-up-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;;GAGG;AACH,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAIzD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,CAER;AAED,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,CAEtF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAIhG"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * The next command a CLI message tells the operator to run, aimed at the
4
+ * target the command actually addressed (Issue #3982).
5
+ *
6
+ * Each hint used to append ` --instance ${options.instance}` itself: the string
7
+ * the user typed (an alias reached `capture` unresolved), and nothing at all for
8
+ * `--agent` (so the hint read the worktree default's pane). One of them was
9
+ * fixed in #3975 and the others were not. These builders take the RESOLVED
10
+ * target — {@link CommandTarget}, what `resolveCommandTarget` returns — so the
11
+ * raw option cannot be passed where the hint's target belongs.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.DIALOG_CAPTURE_FLAGS = void 0;
15
+ exports.targetFlags = targetFlags;
16
+ exports.followUpCommand = followUpCommand;
17
+ exports.dialogCaptureCommand = dialogCaptureCommand;
18
+ exports.paneCaptureCommand = paneCaptureCommand;
19
+ /**
20
+ * The `capture` flags that read a dialog: the pane itself (the stored reply is
21
+ * not what is on screen), and enough of it to hold the dialog and its numbers.
22
+ */
23
+ exports.DIALOG_CAPTURE_FLAGS = '--pane --tail 40';
24
+ /**
25
+ * ` --instance <id>` for a resolved instance, else ` --agent <tool>` when one
26
+ * was named, else nothing — a command that named no target keeps naming none.
27
+ */
28
+ function targetFlags(target) {
29
+ if (target.instanceId)
30
+ return ` --instance ${target.instanceId}`;
31
+ if (target.agent)
32
+ return ` --agent ${target.agent}`;
33
+ return '';
34
+ }
35
+ /**
36
+ * `commandmate <verb> <worktree-id>[ <args>]<target flags>[ <trailing>]`.
37
+ *
38
+ * @param args - What follows the worktree id, e.g. `<number>` or `"<text>"`
39
+ * @param trailing - Flags that follow the target, e.g. `--pane --tail 40`
40
+ */
41
+ function followUpCommand(verb, worktreeId, target, args, trailing) {
42
+ return `commandmate ${verb} ${worktreeId}${args ? ` ${args}` : ''}${targetFlags(target)}${trailing ? ` ${trailing}` : ''}`;
43
+ }
44
+ /** The `capture` that shows the target's dialog as it is on screen. */
45
+ function dialogCaptureCommand(worktreeId, target) {
46
+ return followUpCommand('capture', worktreeId, target, undefined, exports.DIALOG_CAPTURE_FLAGS);
47
+ }
48
+ /**
49
+ * `commandmate capture <id>[ target] --pane`: the pane a message went to, to
50
+ * look at before a resend (Issue #3992). Without a target (a caller that has
51
+ * none to give) it names none.
52
+ */
53
+ function paneCaptureCommand(worktreeId, target) {
54
+ return target
55
+ ? followUpCommand('capture', worktreeId, target, undefined, '--pane')
56
+ : `commandmate capture ${worktreeId} --pane`;
57
+ }
@@ -17,7 +17,7 @@
17
17
  * and whether an unmarked row may stand in for one — stays with the caller.
18
18
  */
19
19
  import type { PromptMessageResponse } from '../types/api-responses';
20
- import type { ApiClient } from './api-client';
20
+ import { type ApiClient } from './api-client';
21
21
  /**
22
22
  * Chat rows read back per request.
23
23
  *
@@ -1 +1 @@
1
- {"version":3,"file":"reply-ledger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/reply-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AA4B1C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAMtD,CAAC;AAcH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAaD,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,cAAc,EAAE,CAkBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,EAAE,OAAO,GACpB,cAAc,GAAG,IAAI,CAMvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAST;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAiC,GACvC,MAAM,GAAG,IAAI,CAWf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAIT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAsBzC;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAUlC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAMzC"}
1
+ {"version":3,"file":"reply-ledger.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/reply-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzE;;;;;;;GAOG;AACH,eAAO,MAAM,uBAAuB,KAAK,CAAC;AA4B1C;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,EAAE,WAAW,CAAC,MAAM,CAMtD,CAAC;AAcH;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAaD,iDAAiD;AACjD,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,cAAc,EAAE,OAAO,CAAC;IACxB,kEAAkE;IAClE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,oEAAoE;IACpE,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,cAAc,EAAE,CAkBlB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,cAAc,EAAE,EAC5B,YAAY,EAAE,OAAO,GACpB,cAAc,GAAG,IAAI,CAMvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAST;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAAE,EACjC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAiC,GACvC,MAAM,GAAG,IAAI,CAWf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,qBAAqB,EAAE,EACjC,KAAK,EAAE,MAAM,GACZ,OAAO,CAIT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAwBzC;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAUlC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,OAAO,CAAC,qBAAqB,EAAE,GAAG,IAAI,CAAC,CAQzC"}
@@ -28,6 +28,7 @@ exports.mayHaveDroppedRowsSince = mayHaveDroppedRowsSince;
28
28
  exports.fetchPromptRowsSince = fetchPromptRowsSince;
29
29
  exports.requestRecentMessages = requestRecentMessages;
30
30
  exports.fetchRecentMessages = fetchRecentMessages;
31
+ const api_client_1 = require("./api-client");
31
32
  /**
32
33
  * Chat rows read back per request.
33
34
  *
@@ -290,7 +291,9 @@ async function fetchPromptRowsSince(client, worktreeId, instanceId, since) {
290
291
  before = oldest;
291
292
  }
292
293
  }
293
- catch {
294
+ catch (error) {
295
+ // Issue #3983: a deadline is the caller's to handle, not "unreadable".
296
+ (0, api_client_1.rethrowIfDeadlineExceeded)(error);
294
297
  return null;
295
298
  }
296
299
  }
@@ -321,7 +324,9 @@ async function fetchRecentMessages(client, worktreeId, instanceId) {
321
324
  try {
322
325
  return await requestRecentMessages(client, worktreeId, instanceId);
323
326
  }
324
- catch {
327
+ catch (error) {
328
+ // Issue #3983: a deadline is the caller's to handle, not "unreadable".
329
+ (0, api_client_1.rethrowIfDeadlineExceeded)(error);
325
330
  return null;
326
331
  }
327
332
  }
@@ -53,4 +53,22 @@ export declare function resetServerCapabilityProbe(): void;
53
53
  * @throws ApiError on 401/403 and on an unclassifiable response
54
54
  */
55
55
  export declare function serverResolvesSessionTargets(client: ApiClient): Promise<boolean>;
56
+ /**
57
+ * Capability token of a server whose answer errors all carry `reason` and
58
+ * `keysSent` (Issue #3982). Mirrors SERVER_CAPABILITIES in the route.
59
+ */
60
+ export declare const PROMPT_ANSWER_REASON_CAPABILITY = "prompt-answer-reason";
61
+ /**
62
+ * Whether this server puts `reason` on every answer error (Issue #3982).
63
+ *
64
+ * Reads the memo `resolveCommandTarget` already filled for this client, so a
65
+ * command that resolved `--instance` asks nothing more. A command that named
66
+ * no instance probes here, once, and only when it is called — on a failed
67
+ * answer, never on the way to sending one.
68
+ *
69
+ * Fail-safe to the old reading: a probe that cannot be completed (auth, a
70
+ * proxy, the network) answers false, which keeps the pre-#3982 behaviour of
71
+ * reading the reason code out of the 500's text.
72
+ */
73
+ export declare function serverReportsPromptAnswerReason(client: ApiClient): Promise<boolean>;
56
74
  //# sourceMappingURL=server-capabilities.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-capabilities.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAExE,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,2BAA2B,CAAC;AAE1E,oFAAoF;AACpF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE;AACtE,4DAA4D;GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAyBvB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAazF;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAmFD;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAItF"}
1
+ {"version":3,"file":"server-capabilities.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/server-capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEnG,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,2BAA2B,CAAC;AAE1E,oFAAoF;AACpF,MAAM,MAAM,qBAAqB,GAC7B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE;AACtE,4DAA4D;GAC1D;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAyBvB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAazF;AAED,gFAAgF;AAChF,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAyFD;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAItF;AAED;;;GAGG;AACH,eAAO,MAAM,+BAA+B,yBAAyB,CAAC;AAEtE;;;;;;;;;;;GAWG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzF"}
@@ -18,10 +18,11 @@
18
18
  * connection is behaving unexpectedly. Those cases end the command instead.
19
19
  */
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
- exports.RESOLVE_SESSION_TARGET_CAPABILITY = exports.CAPABILITIES_PATH = void 0;
21
+ exports.PROMPT_ANSWER_REASON_CAPABILITY = exports.RESOLVE_SESSION_TARGET_CAPABILITY = exports.CAPABILITIES_PATH = void 0;
22
22
  exports.probeServerCapabilities = probeServerCapabilities;
23
23
  exports.resetServerCapabilityProbe = resetServerCapabilityProbe;
24
24
  exports.serverResolvesSessionTargets = serverResolvesSessionTargets;
25
+ exports.serverReportsPromptAnswerReason = serverReportsPromptAnswerReason;
25
26
  const types_1 = require("../types");
26
27
  const api_client_1 = require("./api-client");
27
28
  /** Path of the capability endpoint (`src/app/api/capabilities/route.ts`). */
@@ -102,6 +103,8 @@ async function runProbe(client) {
102
103
  response = await client.rawGet(exports.CAPABILITIES_PATH, { headers: { Accept: 'application/json' } });
103
104
  }
104
105
  catch (error) {
106
+ // Issue #3983: a command deadline is not "unreachable" — it stays exit 124.
107
+ (0, api_client_1.rethrowIfDeadlineExceeded)(error);
105
108
  const result = (0, api_client_1.handleApiError)(error);
106
109
  throw new api_client_1.ApiError(result.message, result.exitCode);
107
110
  }
@@ -119,7 +122,10 @@ async function runProbe(client) {
119
122
  throw undetermined(response.status);
120
123
  }
121
124
  if (response.status === 404) {
122
- const text = await response.text().catch(() => '');
125
+ const text = await response.text().catch((error) => {
126
+ (0, api_client_1.rethrowIfDeadlineExceeded)(error);
127
+ return '';
128
+ });
123
129
  if (isRealNotFoundBody(text))
124
130
  return { kind: 'legacy' };
125
131
  throw undetermined(response.status);
@@ -136,7 +142,8 @@ async function runProbe(client) {
136
142
  try {
137
143
  parsed = await response.json();
138
144
  }
139
- catch {
145
+ catch (error) {
146
+ (0, api_client_1.rethrowIfDeadlineExceeded)(error);
140
147
  throw undetermined(response.status);
141
148
  }
142
149
  if (parsed === null || typeof parsed !== 'object') {
@@ -164,3 +171,29 @@ async function serverResolvesSessionTargets(client) {
164
171
  return probe.kind === 'supported'
165
172
  && probe.capabilities.includes(exports.RESOLVE_SESSION_TARGET_CAPABILITY);
166
173
  }
174
+ /**
175
+ * Capability token of a server whose answer errors all carry `reason` and
176
+ * `keysSent` (Issue #3982). Mirrors SERVER_CAPABILITIES in the route.
177
+ */
178
+ exports.PROMPT_ANSWER_REASON_CAPABILITY = 'prompt-answer-reason';
179
+ /**
180
+ * Whether this server puts `reason` on every answer error (Issue #3982).
181
+ *
182
+ * Reads the memo `resolveCommandTarget` already filled for this client, so a
183
+ * command that resolved `--instance` asks nothing more. A command that named
184
+ * no instance probes here, once, and only when it is called — on a failed
185
+ * answer, never on the way to sending one.
186
+ *
187
+ * Fail-safe to the old reading: a probe that cannot be completed (auth, a
188
+ * proxy, the network) answers false, which keeps the pre-#3982 behaviour of
189
+ * reading the reason code out of the 500's text.
190
+ */
191
+ async function serverReportsPromptAnswerReason(client) {
192
+ try {
193
+ const probe = await probeServerCapabilities(client);
194
+ return probe.kind === 'supported' && probe.capabilities.includes(exports.PROMPT_ANSWER_REASON_CAPABILITY);
195
+ }
196
+ catch {
197
+ return false;
198
+ }
199
+ }
@@ -20,7 +20,7 @@
20
20
  * tool-named instance is reported exactly as the server reports it (Issue
21
21
  * #2487), because a copy that obeys it sends where the server would refuse to.
22
22
  */
23
- import type { ApiClient } from './api-client';
23
+ import { type ApiClient } from './api-client';
24
24
  /**
25
25
  * Which stage of the precedence chain produced the answer. Mirrors
26
26
  * SessionTargetResolvedBy in `src/lib/session/resolve-session-target.ts`; the
@@ -1 +1 @@
1
- {"version":3,"file":"session-target.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/session-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAK9C;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,QAAQ,GACR,SAAS,GACT,kBAAkB,GAClB,UAAU,GACV,iBAAiB,CAAC;AAEtB;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0EAA0E;IAC1E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,uBAAuB,CAAC;IACpC,gFAAgF;IAChF,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuBD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AA4FD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAcrF"}
1
+ {"version":3,"file":"session-target.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/session-target.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzE;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAC/B,UAAU,GACV,QAAQ,GACR,SAAS,GACT,kBAAkB,GAClB,UAAU,GACV,iBAAiB,CAAC;AAEtB;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,0FAA0F;IAC1F,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;OAIG;IACH,aAAa,CAAC,EAAE,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,0EAA0E;IAC1E,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,UAAU,EAAE,uBAAuB,CAAC;IACpC,gFAAgF;IAChF,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAuBD;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,gBAAgB,CAAC,CAM3B;AA8FD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,CAcrF"}
@@ -26,6 +26,7 @@ exports.resolveSessionTarget = resolveSessionTarget;
26
26
  exports.describeSessionTargetConflict = describeSessionTargetConflict;
27
27
  const types_1 = require("../types");
28
28
  const cli_tool_ids_1 = require("../config/cli-tool-ids");
29
+ const api_client_1 = require("./api-client");
29
30
  const agent_instances_1 = require("./agent-instances");
30
31
  const server_capabilities_1 = require("./server-capabilities");
31
32
  /**
@@ -103,6 +104,8 @@ async function resolveLocally(client, worktreeId, options) {
103
104
  registered = instances.find((inst) => inst.id === instanceId);
104
105
  }
105
106
  catch (error) {
107
+ // Issue #3983: `--timeout` ran out — not a roster to degrade around.
108
+ (0, api_client_1.rethrowIfDeadlineExceeded)(error);
106
109
  console.error(`Warning: could not read the agent-instance roster (${(0, types_1.getErrorMessage)(error)}); using --agent as given.`);
107
110
  return degraded(requestedCliTool);
108
111
  }
@@ -14,6 +14,13 @@ import type { VerificationFlakyDetail, VerificationGateTimingView, VerificationR
14
14
  import { ApiClient } from './api-client';
15
15
  /** Matches the wait command's cadence; runs are minutes long, not seconds. */
16
16
  export declare const VERIFY_POLL_INTERVAL_MS = 5000;
17
+ /**
18
+ * Issue #3983: how far past `--timeout` the read taken AT the deadline may run.
19
+ * The poll sleeps only up to the deadline and reads once more there, so a run
20
+ * that finished in the last interval still reports its verdict (#1544); this
21
+ * bounds that one read rather than skipping it.
22
+ */
23
+ export declare const VERIFY_FINAL_READ_GRACE_MS = 2000;
17
24
  /** Built-in gate id; mirrors WORK_EVIDENCE_GATE_ID in lib/verification/gate-runner.ts. */
18
25
  export declare const WORK_EVIDENCE_GATE_ID = "work-evidence";
19
26
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"verify-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/verify-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EACV,uBAAuB,EAEvB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EAGpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAiC,MAAM,cAAc,CAAC;AAExE,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C,0FAA0F;AAC1F,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAU1C;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAU5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,0BAA0B,GAAG,IAAI,CAInC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,EAAE,SAAS,SAAO,GAAG,MAAM,CAM7F;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAoBxC;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,uBAAuB,GAAG,IAAI,CAehC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AAQvD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAK7E;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACnC,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B;AAUD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAW1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAOnF;AAwJD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAyD9B"}
1
+ {"version":3,"file":"verify-runner.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/verify-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EACV,uBAAuB,EAEvB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EAGpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAAqD,MAAM,cAAc,CAAC;AAE5F,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C;;;;;GAKG;AACH,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,0FAA0F;AAC1F,eAAO,MAAM,qBAAqB,kBAAkB,CAAC;AAErD;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAU1C;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAU5C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,0BAA0B,GAAG,IAAI,CAInC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,0BAA0B,EAAE,SAAS,SAAO,GAAG,MAAM,CAM7F;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,UAAU,CAAC;AAoBxC;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACjC,uBAAuB,GAAG,IAAI,CAehC;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,sBAAsB,mBAAmB,CAAC;AAQvD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,EAAE,CAK7E;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,OAAO,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACnC,iFAAiF;IACjF,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,mBAAmB,CAAC;CAC3B;AAUD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,CAW1E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,CAOnF;AAwJD;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAkF9B"}