commandmate 0.33.3 → 0.34.1

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 (355) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +146 -146
  3. package/.next/app-path-routes-manifest.json +26 -26
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +15 -15
  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/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update-check/route.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/assistant/conversation/route.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  15. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  17. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  18. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js +1 -1
  20. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  21. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js +1 -1
  23. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  24. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js +2 -2
  26. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  27. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/assistant/terminal/route.js +3 -3
  29. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js +1 -1
  32. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  33. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/capabilities/route.js +1 -1
  38. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/hooks/agent-event/route.js +1 -1
  47. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  48. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  50. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  51. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  53. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  54. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  61. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  62. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/relays/route.js +1 -1
  64. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  65. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  71. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/clone/route.js +1 -1
  74. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/restore/route.js +1 -1
  78. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  79. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/route.js +1 -1
  81. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/scan/route.js +1 -1
  84. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/sync/route.js +1 -1
  87. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  88. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  91. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  92. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  106. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  110. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  113. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  116. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  122. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  159. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/resolve-target/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  176. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  179. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  188. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  190. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  191. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/tasks/route.js +2 -2
  204. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  206. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  207. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/verify/config/route.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/route.js +1 -1
  228. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  231. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  235. package/.next/server/app/page.js +1 -1
  236. package/.next/server/app/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  238. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  239. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/sessions/page.js +1 -1
  241. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  242. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  243. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  245. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/worktrees/[id]/page.js +8 -8
  247. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  248. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  249. package/.next/server/app-paths-manifest.json +26 -26
  250. package/.next/server/chunks/1501.js +4 -4
  251. package/.next/server/chunks/1886.js +2 -2
  252. package/.next/server/chunks/2119.js +1 -1
  253. package/.next/server/chunks/2404.js +1 -1
  254. package/.next/server/chunks/2445.js +1 -1
  255. package/.next/server/chunks/3077.js +1 -1
  256. package/.next/server/chunks/3241.js +1 -1
  257. package/.next/server/chunks/3323.js +1 -1
  258. package/.next/server/chunks/3480.js +2 -2
  259. package/.next/server/chunks/434.js +1 -0
  260. package/.next/server/chunks/4443.js +1 -1
  261. package/.next/server/chunks/4802.js +1 -1
  262. package/.next/server/chunks/5164.js +1 -1
  263. package/.next/server/chunks/5571.js +1 -1
  264. package/.next/server/chunks/595.js +3 -3
  265. package/.next/server/chunks/6130.js +1 -1
  266. package/.next/server/chunks/6285.js +1 -1
  267. package/.next/server/chunks/6286.js +7 -7
  268. package/.next/server/chunks/6337.js +1 -1
  269. package/.next/server/chunks/650.js +1 -1
  270. package/.next/server/chunks/663.js +1 -1
  271. package/.next/server/chunks/6677.js +25 -0
  272. package/.next/server/chunks/7075.js +1 -0
  273. package/.next/server/chunks/7905.js +1 -1
  274. package/.next/server/chunks/8583.js +1 -0
  275. package/.next/server/chunks/8807.js +10 -10
  276. package/.next/server/chunks/8918.js +4 -2
  277. package/.next/server/chunks/9080.js +1 -0
  278. package/.next/server/chunks/964.js +1 -0
  279. package/.next/server/middleware-manifest.json +5 -5
  280. package/.next/server/pages/500.html +1 -1
  281. package/.next/server/server-reference-manifest.json +1 -1
  282. package/.next/server/src/middleware.js +1 -1
  283. package/.next/server/src/middleware.js.map +1 -1
  284. package/.next/static/chunks/2053-9ac860ab4e92ac89.js +1 -0
  285. package/.next/static/chunks/2652-18b8fea64413467e.js +1 -0
  286. package/.next/static/chunks/{4718-814f4ecfd7fcc513.js → 4718-29cfcfb806724d9a.js} +1 -1
  287. package/.next/static/chunks/{8361-9bb887203c456edb.js → 8361-0142beb59be2abf3.js} +1 -1
  288. package/.next/static/chunks/app/{page-022090bf6f932818.js → page-26a42881c8648cd3.js} +1 -1
  289. package/.next/static/chunks/app/sessions/page-a3ab6f122ec60d5a.js +1 -0
  290. package/.next/static/chunks/app/worktrees/[id]/page-60eab4e24c37cb77.js +1 -0
  291. package/.next/static/css/b09bede85744e1cf.css +1 -0
  292. package/.next/trace +13 -13
  293. package/README.md +141 -24
  294. package/dist/cli/commands/ask.d.ts.map +1 -1
  295. package/dist/cli/commands/ask.js +11 -2
  296. package/dist/cli/commands/remote.d.ts +93 -3
  297. package/dist/cli/commands/remote.d.ts.map +1 -1
  298. package/dist/cli/commands/remote.js +232 -9
  299. package/dist/cli/commands/respond.d.ts.map +1 -1
  300. package/dist/cli/commands/respond.js +8 -4
  301. package/dist/cli/commands/send.d.ts.map +1 -1
  302. package/dist/cli/commands/send.js +18 -0
  303. package/dist/cli/commands/wait.d.ts +18 -3
  304. package/dist/cli/commands/wait.d.ts.map +1 -1
  305. package/dist/cli/commands/wait.js +137 -2
  306. package/dist/cli/docs/agent-operations.d.ts +2 -2
  307. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  308. package/dist/cli/docs/agent-operations.js +41 -1
  309. package/dist/cli/types/index.d.ts +9 -0
  310. package/dist/cli/types/index.d.ts.map +1 -1
  311. package/dist/cli/utils/api-client.d.ts.map +1 -1
  312. package/dist/cli/utils/api-client.js +11 -1
  313. package/dist/cli/utils/remote-state.d.ts +32 -0
  314. package/dist/cli/utils/remote-state.d.ts.map +1 -1
  315. package/dist/cli/utils/remote-state.js +12 -0
  316. package/dist/cli/utils/session-target.d.ts +23 -6
  317. package/dist/cli/utils/session-target.d.ts.map +1 -1
  318. package/dist/cli/utils/session-target.js +33 -5
  319. package/dist/server/locales/en/worktree.json +21 -2
  320. package/dist/server/locales/ja/worktree.json +21 -2
  321. package/dist/server/server.js +204 -16
  322. package/dist/server/src/config/schedule-config.js +45 -3
  323. package/dist/server/src/lib/cli-tools/antigravity.js +95 -10
  324. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +377 -16
  325. package/dist/server/src/lib/cmate-parser.js +8 -1
  326. package/dist/server/src/lib/db/agent-instances-db.js +11 -0
  327. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +140 -19
  328. package/dist/server/src/lib/detection/tools/claude/detect.js +13 -2
  329. package/dist/server/src/lib/detection/tools/claude/picker-chrome.js +239 -0
  330. package/dist/server/src/lib/detection/tools/claude/prompt.js +74 -6
  331. package/dist/server/src/lib/hooks/sources/claude/history.js +391 -34
  332. package/dist/server/src/lib/hooks/sources/claude/transcript.js +91 -0
  333. package/dist/server/src/lib/hooks/sources/opencode/ports.js +6 -0
  334. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +114 -11
  335. package/dist/server/src/lib/polling/response-checker.js +82 -3
  336. package/dist/server/src/lib/relay/relay-session-ref.js +15 -8
  337. package/dist/server/src/lib/schedule-manager.js +178 -19
  338. package/dist/server/src/lib/session/ask-user-question-prompt.js +4 -2
  339. package/dist/server/src/lib/session/claude-executor.js +33 -2
  340. package/dist/server/src/lib/session/resolve-session-target.js +37 -9
  341. package/dist/server/src/lib/verification/env-clean-gate.js +81 -4
  342. package/dist/server/src/lib/ws-server.js +74 -5
  343. package/dist/server/src/types/agent-transcript.js +143 -1
  344. package/package.json +1 -1
  345. package/.next/server/chunks/1068.js +0 -1
  346. package/.next/server/chunks/6808.js +0 -1
  347. package/.next/server/chunks/7875.js +0 -25
  348. package/.next/server/chunks/9553.js +0 -1
  349. package/.next/static/chunks/2053-3f299a7a2c7d6767.js +0 -1
  350. package/.next/static/chunks/8772-9be53a530950d804.js +0 -1
  351. package/.next/static/chunks/app/sessions/page-584adf11ae51df10.js +0 -1
  352. package/.next/static/chunks/app/worktrees/[id]/page-3af707e74a75172b.js +0 -1
  353. package/.next/static/css/acd46e25427a2080.css +0 -1
  354. /package/.next/static/{9x6U1h52hH_r6pOsGwI_p → oDWX0JcwfhUYrMnnqDWVC}/_buildManifest.js +0 -0
  355. /package/.next/static/{9x6U1h52hH_r6pOsGwI_p → oDWX0JcwfhUYrMnnqDWVC}/_ssgManifest.js +0 -0
@@ -7,6 +7,8 @@
7
7
  * commandmate remote status # Provider / URL / expiry / pairing state
8
8
  * commandmate remote stop # close the door, keeping the server running
9
9
  *
10
+ * commandmate remote --auth remote-only # only the phone's route authenticates
11
+ *
10
12
  * ## What lives here rather than in a Provider (§6.2)
11
13
  *
12
14
  * Two things, and both for the same reason — they are decisions about an
@@ -21,6 +23,17 @@
21
23
  * Provider would have to re-derive interactive-vs-not per Provider, and its
22
24
  * answer would be invisible to the caller that has to honour `--yes`.
23
25
  *
26
+ * ## How far the token reaches (Issue #2489)
27
+ *
28
+ * `--auth all` (the default) authenticates every listener, which is what #1937
29
+ * shipped. `--auth remote-only` runs a SECOND loopback listener, points the
30
+ * Provider at that one alone, and exempts the original from authentication — so
31
+ * the phone still pairs and the PC in front of the machine keeps working. The
32
+ * exemption is decided by which listener a request arrived on, never by its
33
+ * source address: a Provider's upstream IS 127.0.0.1, so every IP- and
34
+ * header-based answer here fails open. See `src/lib/ws-server.ts`'s ingress
35
+ * section for the full argument.
36
+ *
24
37
  * ## What this command deliberately does not have
25
38
  *
26
39
  * - **`--token`.** `remote` is the side that MINTS a token; one supplied from
@@ -34,10 +47,13 @@
34
47
  * local session down along with the remote one (§5.3).
35
48
  */
36
49
  Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.REMOTE_LAUNCH_ENV_KEYS = exports.PUBLIC_TUNNEL_PROVIDERS = exports.REMOTE_PROVIDER_ALIASES = exports.MAX_PAIRING_TTL_MS = exports.MIN_PAIRING_TTL_MS = exports.DEFAULT_PAIRING_EXPIRES = exports.DEFAULT_REMOTE_EXPIRES = void 0;
50
+ exports.REMOTE_INGRESS_HOST = exports.DEFAULT_REMOTE_AUTH_SCOPE = exports.REMOTE_AUTH_SCOPES = exports.REMOTE_ONLY_LAUNCH_ENV_KEYS = exports.REMOTE_LAUNCH_ENV_KEYS = exports.PUBLIC_TUNNEL_PROVIDERS = exports.REMOTE_PROVIDER_ALIASES = exports.MAX_PAIRING_TTL_MS = exports.MIN_PAIRING_TTL_MS = exports.DEFAULT_PAIRING_EXPIRES = exports.DEFAULT_REMOTE_EXPIRES = void 0;
38
51
  exports.buildRemoteLaunchEnv = buildRemoteLaunchEnv;
39
52
  exports.applyRemoteLaunchEnv = applyRemoteLaunchEnv;
40
53
  exports.parsePairingDuration = parsePairingDuration;
54
+ exports.parseAuthScope = parseAuthScope;
55
+ exports.resolveEffectiveBind = resolveEffectiveBind;
56
+ exports.isLoopbackBind = isLoopbackBind;
41
57
  exports.selectProvider = selectProvider;
42
58
  exports.runRemoteUp = runRemoteUp;
43
59
  exports.buildPairingUrl = buildPairingUrl;
@@ -56,6 +72,7 @@ const logger_1 = require("../utils/logger");
56
72
  const prompt_1 = require("../utils/prompt");
57
73
  const qr_terminal_1 = require("../utils/qr-terminal");
58
74
  const remote_state_1 = require("../utils/remote-state");
75
+ const server_url_1 = require("../utils/server-url");
59
76
  const security_logger_1 = require("../utils/security-logger");
60
77
  const server_ready_1 = require("../utils/server-ready");
61
78
  const remote_1 = require("../../lib/remote");
@@ -106,6 +123,12 @@ exports.PUBLIC_TUNNEL_PROVIDERS = ['cloudflare-quick'];
106
123
  * put here would be readable by the very agents CommandMate is driving
107
124
  * (§7.2).
108
125
  *
126
+ * - `CM_AUTH_SCOPE` — the `--auth` value (#2489). Not a secret and not a path:
127
+ * the string `all` or `remote-only`, which is what `middleware.ts` and
128
+ * `ws-server.ts` read to decide whether the local listener may skip the
129
+ * token. Always exported, including for `all`, so the server is told what
130
+ * was chosen rather than inferring it from a missing variable.
131
+ *
109
132
  * `tests/unit/cli/commands/remote-launch-env-1937.test.ts` holds the measured
110
133
  * set to this declaration in BOTH directions, the way
111
134
  * `agent-launch-plan-secrets-1933.test.ts` does for `prepareLaunch`. Adding a
@@ -115,6 +138,19 @@ exports.REMOTE_LAUNCH_ENV_KEYS = [
115
138
  'CM_AUTH_TOKEN_HASH',
116
139
  'CM_AUTH_EXPIRE',
117
140
  'CM_REMOTE_PAIRING_FILE',
141
+ 'CM_AUTH_SCOPE',
142
+ ];
143
+ /**
144
+ * The measured set for `--auth remote-only` (Issue #2489).
145
+ *
146
+ * One key more than {@link REMOTE_LAUNCH_ENV_KEYS}, and declared separately
147
+ * rather than as an "optional extra" so the exact-set measurement keeps working
148
+ * in BOTH directions for BOTH modes. A conditional key checked against a single
149
+ * list would be a list that describes neither mode.
150
+ */
151
+ exports.REMOTE_ONLY_LAUNCH_ENV_KEYS = [
152
+ ...exports.REMOTE_LAUNCH_ENV_KEYS,
153
+ 'CM_REMOTE_INGRESS_PORT',
118
154
  ];
119
155
  /**
120
156
  * Build the exact environment `remote` contributes to the server it starts.
@@ -124,15 +160,20 @@ exports.REMOTE_LAUNCH_ENV_KEYS = [
124
160
  * {@link REMOTE_LAUNCH_ENV_KEYS} — "what did remote add" is otherwise only
125
161
  * observable by diffing a global.
126
162
  *
127
- * @param input - Hash, expiry and handoff path
128
- * @returns The three variables, and nothing else
163
+ * @param input - Hash, expiry, handoff path and auth scope
164
+ * @returns Those variables, and nothing else
129
165
  */
130
166
  function buildRemoteLaunchEnv(input) {
131
- return {
167
+ const env = {
132
168
  CM_AUTH_TOKEN_HASH: input.authTokenHash,
133
169
  CM_AUTH_EXPIRE: input.authExpire,
134
170
  CM_REMOTE_PAIRING_FILE: input.pairingFilePath,
171
+ CM_AUTH_SCOPE: input.authScope,
135
172
  };
173
+ if (input.authScope === 'remote-only' && input.remoteIngressPort !== undefined) {
174
+ env.CM_REMOTE_INGRESS_PORT = String(input.remoteIngressPort);
175
+ }
176
+ return env;
136
177
  }
137
178
  /**
138
179
  * Copy the launch env into `process.env`, where `daemon.ts` reads it.
@@ -187,6 +228,79 @@ function parsePairingDuration(value) {
187
228
  }
188
229
  return ms;
189
230
  }
231
+ /**
232
+ * What the user may type after `--auth`, and the default when they type nothing.
233
+ *
234
+ * Issue #2489. `all` is the default deliberately: `remote-only` leaves every
235
+ * process on this machine — including the agents CommandMate itself runs in tmux
236
+ * — able to reach the API without a token, which is the same exposure as a
237
+ * CommandMate started without `--auth` at all, and weaker than `all`. Opting
238
+ * into that is the user's call to make, not a default to inherit.
239
+ */
240
+ exports.REMOTE_AUTH_SCOPES = ['all', 'remote-only'];
241
+ /** Auth scope applied when `--auth` is not given (Issue #2489). */
242
+ exports.DEFAULT_REMOTE_AUTH_SCOPE = 'all';
243
+ /**
244
+ * Where the `remote-only` ingress listener lives (Issue #2489).
245
+ *
246
+ * The literal loopback address, matching `REMOTE_INGRESS_BIND` in `server.ts`:
247
+ * both Providers dial `http://127.0.0.1:<port>`, and the listener must not be
248
+ * reachable from anywhere else.
249
+ */
250
+ exports.REMOTE_INGRESS_HOST = '127.0.0.1';
251
+ /**
252
+ * Loopback bind addresses that keep the local listener off the network.
253
+ *
254
+ * Issue #2489: `remote-only` makes the local listener unauthenticated, so it is
255
+ * refused when the server would bind anywhere a second machine can reach —
256
+ * otherwise "local means trusted" quietly becomes "the LAN means trusted".
257
+ * `server.ts` re-checks this against its own effective `CM_BIND`; this copy is
258
+ * what turns the mistake into an exit code instead of a degraded server.
259
+ */
260
+ const LOOPBACK_BINDS = ['127.0.0.1', 'localhost', '::1', '[::1]'];
261
+ /**
262
+ * Parse an `--auth` value.
263
+ *
264
+ * @param value - Raw flag value; undefined means the flag was not given
265
+ * @returns The scope to use
266
+ * @throws Error naming the valid values, for CONFIG_ERROR
267
+ */
268
+ function parseAuthScope(value) {
269
+ if (value === undefined)
270
+ return exports.DEFAULT_REMOTE_AUTH_SCOPE;
271
+ const normalized = value.trim().toLowerCase();
272
+ const match = exports.REMOTE_AUTH_SCOPES.find((scope) => scope === normalized);
273
+ if (match === undefined) {
274
+ throw new Error(`Unknown --auth value: "${value}". Valid values: ${exports.REMOTE_AUTH_SCOPES.join(', ')}.`);
275
+ }
276
+ return match;
277
+ }
278
+ /**
279
+ * The bind address the server this session starts will actually listen on.
280
+ *
281
+ * Read through `loadEffectiveEnv()` rather than `process.env` because that is
282
+ * what `daemon.start()` hands the child: it layers `.env` OVER the exported
283
+ * environment, so a `CM_BIND=0.0.0.0` written in `~/.commandmate/.env` is
284
+ * invisible to `process.env` here and decisive for the server. Checking the
285
+ * wrong one is how this guard would pass while the thing it guards against
286
+ * happened anyway.
287
+ *
288
+ * This is the one place `remote` reads `CM_BIND`, and only in `remote-only`
289
+ * mode — §9.1's "remote neither reads nor writes CM_BIND" still holds for every
290
+ * other path, and `remote` never writes it.
291
+ *
292
+ * @returns The effective `CM_BIND`, defaulted the way `server.ts` defaults it
293
+ */
294
+ function resolveEffectiveBind() {
295
+ return (0, server_url_1.loadEffectiveEnv)().CM_BIND || '127.0.0.1';
296
+ }
297
+ /**
298
+ * @param bind - An effective `CM_BIND` value
299
+ * @returns true when nothing outside this machine can reach that address
300
+ */
301
+ function isLoopbackBind(bind) {
302
+ return LOOPBACK_BINDS.includes(bind.trim().toLowerCase());
303
+ }
190
304
  /**
191
305
  * Apply the Provider selection rule (§6.2).
192
306
  *
@@ -376,6 +490,33 @@ async function runRemoteUp(options) {
376
490
  logger.error(`Invalid --pairing-expires value: ${(0, types_1.getErrorMessage)(error)}`);
377
491
  return types_1.ExitCode.CONFIG_ERROR;
378
492
  }
493
+ // Issue #2489. Both checks happen BEFORE any Provider is probed: neither an
494
+ // unknown `--auth` value nor a LAN-facing bind should cost the user a
495
+ // `tailscale serve` that then has to be reverted.
496
+ let authScope;
497
+ try {
498
+ authScope = parseAuthScope(options.auth);
499
+ }
500
+ catch (error) {
501
+ logger.error((0, types_1.getErrorMessage)(error));
502
+ return types_1.ExitCode.CONFIG_ERROR;
503
+ }
504
+ if (authScope === 'remote-only') {
505
+ const bind = resolveEffectiveBind();
506
+ if (!isLoopbackBind(bind)) {
507
+ logger.error(`--auth remote-only requires a loopback CM_BIND, but this server would bind to ${bind}.`);
508
+ logger.info('In this mode the local listener answers without a token, so a non-loopback bind would ' +
509
+ 'extend that to every host that can reach this machine.');
510
+ logger.info('Set CM_BIND=127.0.0.1, or run "commandmate remote --auth all".');
511
+ (0, security_logger_1.logSecurityEvent)({
512
+ timestamp: new Date().toISOString(),
513
+ command: 'remote',
514
+ action: 'failure',
515
+ details: `up: remote-only refused (CM_BIND=${bind})`,
516
+ });
517
+ return types_1.ExitCode.CONFIG_ERROR;
518
+ }
519
+ }
379
520
  // 1. Probe every Provider, then apply the selection rule here (§6.2).
380
521
  const candidates = await (0, remote_1.detectRemoteProviders)();
381
522
  const selection = selectProvider(candidates, options.provider);
@@ -416,9 +557,31 @@ async function runRemoteUp(options) {
416
557
  const sessionToken = (0, auth_1.generateToken)();
417
558
  const authTokenHash = (0, auth_1.hashToken)(sessionToken);
418
559
  const pairing = (0, pairing_code_1.createPairingHandoff)({ ttlMs: pairingTtlMs, sessionToken });
560
+ // 4b. Issue #2489: in `remote-only` the Provider gets a socket of its own, so
561
+ // "which listener did this arrive on" can answer "does this need a token".
562
+ // Picked here rather than by the server because the Provider is started from
563
+ // this process and has to be pointed somewhere; the server re-validates the
564
+ // value and falls back to authenticating everything if it cannot use it.
565
+ let remoteIngressPort;
566
+ if (authScope === 'remote-only') {
567
+ try {
568
+ remoteIngressPort = await (0, remote_1.findFreeLoopbackPort)();
569
+ }
570
+ catch (error) {
571
+ logger.error(`Could not reserve a loopback port for the remote listener: ${(0, types_1.getErrorMessage)(error)}`);
572
+ (0, pairing_code_1.consumePairingHandoff)(pairing.filePath);
573
+ return types_1.ExitCode.START_FAILED;
574
+ }
575
+ }
419
576
  // 5. Start the server through the existing exit-free core. Not reimplemented:
420
577
  // `runStart` already owns .env loading, port allocation and the daemon spawn.
421
- const restoreEnv = applyRemoteLaunchEnv(buildRemoteLaunchEnv({ authTokenHash, authExpire: expires, pairingFilePath: pairing.filePath }));
578
+ const restoreEnv = applyRemoteLaunchEnv(buildRemoteLaunchEnv({
579
+ authTokenHash,
580
+ authExpire: expires,
581
+ pairingFilePath: pairing.filePath,
582
+ authScope,
583
+ remoteIngressPort,
584
+ }));
422
585
  logger.info('Starting the CommandMate server...');
423
586
  const started = await (0, start_1.runStart)({ daemon: true, port: options.port });
424
587
  if (!started.ok) {
@@ -442,11 +605,31 @@ async function runRemoteUp(options) {
442
605
  return types_1.ExitCode.START_FAILED;
443
606
  }
444
607
  logger.success(`Server: ${started.url} (pid ${started.pid})`);
608
+ // 6b. Issue #2489: the remote listener is fatal in exactly the same way. The
609
+ // server refuses `remote-only` rather than dying when it cannot open this
610
+ // socket — it must not take the user's local session down — so its absence
611
+ // reaches us as a port that never answers, and publishing a URL that fronts
612
+ // it would hand the user a QR code for nothing. Roll the whole session back.
613
+ if (remoteIngressPort !== undefined) {
614
+ if (!(await (0, server_ready_1.waitForServer)(exports.REMOTE_INGRESS_HOST, remoteIngressPort))) {
615
+ logger.error(`The server did not open its remote listener on ${exports.REMOTE_INGRESS_HOST}:${remoteIngressPort} in time.`);
616
+ logger.info('Nothing was published. Re-run, or use "commandmate remote --auth all".');
617
+ await rollback(daemonManager, pairing.filePath, restoreEnv);
618
+ return types_1.ExitCode.START_FAILED;
619
+ }
620
+ logger.success(`Remote listener: ${exports.REMOTE_INGRESS_HOST}:${remoteIngressPort} (authentication required)`);
621
+ }
445
622
  // 7. Open the outside door. The Provider is handed 127.0.0.1 explicitly; it
446
623
  // never reads CM_BIND (§9.1).
624
+ //
625
+ // Issue #2489: in `remote-only` it is handed the SEPARATE loopback port
626
+ // instead. That substitution is the whole mechanism — the Provider reaches
627
+ // only the listener that always authenticates, and the port the user's own
628
+ // browser and CLI dial is never published.
629
+ const publishedPort = remoteIngressPort ?? endpoint.port;
447
630
  let handle;
448
631
  try {
449
- handle = await provider.start({ port: endpoint.port, signal: new AbortController().signal });
632
+ handle = await provider.start({ port: publishedPort, signal: new AbortController().signal });
450
633
  }
451
634
  catch (error) {
452
635
  logger.error(`Provider ${provider.id} failed to start: ${(0, types_1.getErrorMessage)(error)}`);
@@ -472,7 +655,12 @@ async function runRemoteUp(options) {
472
655
  expiresAt: now + expiresMs,
473
656
  pairing: { filePath: pairing.filePath, expiresAt: pairing.expiresAt },
474
657
  handle,
475
- server: { pid: started.pid ?? null, port: endpoint.port },
658
+ server: {
659
+ pid: started.pid ?? null,
660
+ port: endpoint.port,
661
+ remoteIngressPort: remoteIngressPort ?? null,
662
+ },
663
+ authScope,
476
664
  };
477
665
  try {
478
666
  (0, remote_state_1.writeRemoteState)(state);
@@ -493,7 +681,7 @@ async function runRemoteUp(options) {
493
681
  command: 'remote',
494
682
  action: 'success',
495
683
  // Neither the pairing code nor the token appears here (§5.2).
496
- details: `up: provider=${handle.provider} port=${endpoint.port}`,
684
+ details: `up: provider=${handle.provider} port=${publishedPort} auth=${authScope}`,
497
685
  });
498
686
  if (options.json) {
499
687
  // NOT a pure-JSON stream, and saying so is better than implying otherwise:
@@ -504,13 +692,19 @@ async function runRemoteUp(options) {
504
692
  console.log(JSON.stringify({
505
693
  action: 'up',
506
694
  provider: state.provider,
695
+ authScope: state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE,
507
696
  url: state.url,
508
697
  // The one-time display, in the form a machine caller can use. `status`
509
698
  // never emits this field - the code is shown by `up` or not at all.
510
699
  pairingUrl,
511
700
  expiresAt: new Date(state.expiresAt).toISOString(),
512
701
  pairing: { expiresAt: new Date(state.pairing.expiresAt).toISOString() },
513
- server: { pid: state.server.pid, port: state.server.port, url: started.url },
702
+ server: {
703
+ pid: state.server.pid,
704
+ port: state.server.port,
705
+ url: started.url,
706
+ remoteIngressPort: state.server.remoteIngressPort ?? null,
707
+ },
514
708
  }, null, 2));
515
709
  }
516
710
  return types_1.ExitCode.SUCCESS;
@@ -685,6 +879,9 @@ async function runRemoteStatus(options) {
685
879
  action: 'status',
686
880
  remote: {
687
881
  provider: state.provider,
882
+ // Issue #2489: what `--auth` this session ran with. A record written
883
+ // before #2489 has no such field and was, by construction, `all`.
884
+ authScope: state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE,
688
885
  // The URL is public information; the pairing code and the token are
689
886
  // not, and neither appears here or anywhere else in `status` (§5.4).
690
887
  url: state.url,
@@ -696,6 +893,10 @@ async function runRemoteStatus(options) {
696
893
  state: pairing,
697
894
  expiresAt: new Date(state.pairing.expiresAt).toISOString(),
698
895
  },
896
+ server: {
897
+ port: state.server.port,
898
+ remoteIngressPort: state.server.remoteIngressPort ?? null,
899
+ },
699
900
  },
700
901
  server,
701
902
  }, null, 2));
@@ -703,6 +904,7 @@ async function runRemoteStatus(options) {
703
904
  else {
704
905
  logger.info(`Provider: ${state.provider}`);
705
906
  logger.info(`URL: ${state.url}`);
907
+ logger.info(`Auth scope: ${describeAuthScope(state)}`);
706
908
  logger.info(`Remote expires: ${new Date(state.expiresAt).toISOString()} (${formatRemaining(state.expiresAt - now)})`);
707
909
  logger.info(`Pairing: ${pairing}`);
708
910
  logger.info(`Server: ${describeServer(server)}`);
@@ -718,6 +920,26 @@ async function runRemoteStatus(options) {
718
920
  }
719
921
  return types_1.ExitCode.SUCCESS;
720
922
  }
923
+ /**
924
+ * Render the `Auth scope:` line (Issue #2489).
925
+ *
926
+ * `remote-only` says where the exemption applies as well as that it exists: the
927
+ * difference between the two ports is the entire security boundary, so a line
928
+ * that named only the mode would leave the reader to guess which socket is
929
+ * which.
930
+ *
931
+ * @param state - The recorded session
932
+ * @returns The text after `Auth scope:`
933
+ */
934
+ function describeAuthScope(state) {
935
+ const scope = state.authScope ?? exports.DEFAULT_REMOTE_AUTH_SCOPE;
936
+ if (scope !== 'remote-only') {
937
+ return 'all (every request needs the paired token)';
938
+ }
939
+ const ingress = state.server.remoteIngressPort;
940
+ return (`remote-only (provider port ${ingress ?? 'unknown'} needs the paired token; ` +
941
+ `http://${exports.REMOTE_INGRESS_HOST}:${state.server.port} on this machine does not)`);
942
+ }
721
943
  /**
722
944
  * @param server - Daemon status, or null when there is no PID file
723
945
  * @returns The `Server:` line
@@ -839,6 +1061,7 @@ function createRemoteCommand() {
839
1061
  .option('--pairing-expires <duration>', `Pairing code TTL, 1m-24h (default: ${exports.DEFAULT_PAIRING_EXPIRES})`)
840
1062
  .option('-p, --port <number>', 'Port for the server to expose', parseInt)
841
1063
  .option('--yes', 'Approve creating a public tunnel without prompting (required when non-interactive)')
1064
+ .option('--auth <scope>', `How far authentication reaches: all or remote-only (default: ${exports.DEFAULT_REMOTE_AUTH_SCOPE})`)
842
1065
  .option('--json', 'JSON output')
843
1066
  // Deliberately absent: --token (remote mints its own; see the file header)
844
1067
  // and every --auto-yes flag (§5.5).
@@ -1 +1 @@
1
- {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2JpC,wBAAgB,oBAAoB,IAAI,OAAO,CAwK9C"}
1
+ {"version":3,"file":"respond.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/respond.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA2JpC,wBAAgB,oBAAoB,IAAI,OAAO,CA4K9C"}
@@ -207,10 +207,14 @@ function createRespondCommand() {
207
207
  if (result && !result.success) {
208
208
  // [DR2-06] Check reason for failure
209
209
  const reason = result.reason || 'unknown';
210
- // Issue #1681 / #1726: these two mean the server refused BEFORE
211
- // sending, so the terminal is untouched — worth saying plainly,
212
- // because the other reasons leave the answer's fate unknown.
213
- const refusedBeforeSending = reason === 'unresolvable_answer' || reason === 'answer_out_of_range';
210
+ // Issue #1681 / #1726: these mean the server refused BEFORE sending,
211
+ // so the terminal is untouched — worth saying plainly, because the
212
+ // other reasons leave the answer's fate unknown. Issue #2486 adds
213
+ // `unsupported_dialog_layout`: a picker IS on screen but its layout
214
+ // could not be verified, and the server's message says what to do.
215
+ const refusedBeforeSending = reason === 'unresolvable_answer' ||
216
+ reason === 'answer_out_of_range' ||
217
+ reason === 'unsupported_dialog_layout';
214
218
  // Issue #1898: the verdict was addressed to the agent's own API and
215
219
  // the POST did not land. Distinct from the two above — the answer was
216
220
  // resolved and an attempt was made — and distinct from a keystroke,
@@ -1 +1 @@
1
- {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoMpC,wBAAgB,iBAAiB,IAAI,OAAO,CAkP3C"}
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/send.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+MpC,wBAAgB,iBAAiB,IAAI,OAAO,CA0P3C"}
@@ -18,6 +18,16 @@ const instances_1 = require("./instances");
18
18
  const relays_1 = require("./relays");
19
19
  /** Auto-yes duration used when --duration is omitted. */
20
20
  const DEFAULT_AUTO_YES_DURATION = '1h';
21
+ /**
22
+ * The message length `send` is verified to deliver whole (Issue #2464): the
23
+ * largest body sent through the paste path to claude, codex, command-code and
24
+ * antigravity and found byte-identical in each tool's own transcript
25
+ * (`docs/design/2464-long-body-repro-matrix.md`). Stated in `--help` so a
26
+ * caller can choose "put it in a file" instead. A documented guarantee, not an
27
+ * enforced cap: a longer message takes the same path and the same check.
28
+ */
29
+ const SEND_VERIFIED_MAX_KIB = 48;
30
+ const SEND_VERIFIED_MAX_LINES = 240;
21
31
  /**
22
32
  * Code the send API returns when the session is blocked on a prompt (Issue
23
33
  * #1708). Mirrors PROMPT_WAITING_CODE in src/lib/session/prompt-waiting-guard.ts;
@@ -172,6 +182,14 @@ no pane to scrape. Watch it with \`commandmate relays\`, withdraw it with
172
182
  Exit 2 when the relay is refused: you are answering a relayed message already
173
183
  (pass --allow-relay-chain), the chain would exceed 3 hops, or an open relay
174
184
  between these two sessions exists. Nothing is sent in that case.
185
+
186
+ Message length (Issue #2464): up to ${SEND_VERIFIED_MAX_KIB} KiB and ${SEND_VERIFIED_MAX_LINES} lines is verified
187
+ to arrive whole on claude, codex, command-code and antigravity. A message over
188
+ 512 bytes is pasted into the agent's composer as one bracketed paste, and Enter
189
+ waits until the composer shows all of it. If it never does, nothing is
190
+ submitted and send exits 99 with "Message body did not arrive intact" -- it
191
+ does not print "Message sent.". For a longer brief, write it to a file in the
192
+ worktree and send a short message that tells the agent to read that file.
175
193
  `)
176
194
  .action(async (worktreeId, message, options) => {
177
195
  try {
@@ -8,7 +8,9 @@
8
8
  * selection lists — Issue #1628 — and interactive frames the detection
9
9
  * layer could not classify at all — Issue #1708. Both are reported as
10
10
  * exit 10 with a distinguishing `type` rather than a new exit code, so
11
- * callers that already branch on 10 keep working.)
11
+ * callers that already branch on 10 keep working. Issue #2463: a prompt
12
+ * the target's own Auto-Yes is answering is held for --auto-yes-grace
13
+ * seconds before it is reported.)
12
14
  * - 11: UPSTREAM_FAULT (--fail-on-upstream-fault only, Issue #1839: the agent
13
15
  * came back to its composer with an upstream API failure on the frame)
14
16
  * - 124: TIMEOUT (--timeout exceeded)
@@ -48,6 +50,18 @@ import { ApiClient } from '../utils/api-client';
48
50
  * `"paths": {}`), so the test is the only thing holding the two together.
49
51
  */
50
52
  export declare const TURN_OPENING_EVENT_TYPES: ReadonlySet<string>;
53
+ /**
54
+ * {@link pollWorktree}'s options: {@link WaitOptions} plus the Auto-Yes grace
55
+ * (Issue #2463).
56
+ */
57
+ export interface PollWorktreeOptions extends WaitOptions {
58
+ /**
59
+ * `--auto-yes-grace`, in seconds; 0 turns the hold off. Absent means
60
+ * {@link AUTO_YES_GRACE_DEFAULT_SECONDS}, which is what `ask` gets: it calls
61
+ * {@link pollWorktree} without the flag.
62
+ */
63
+ autoYesGrace?: number;
64
+ }
51
65
  /**
52
66
  * Poll a single worktree until completion, prompt, or timeout.
53
67
  *
@@ -56,12 +70,13 @@ export declare const TURN_OPENING_EVENT_TYPES: ReadonlySet<string>;
56
70
  * `send` + `wait` + "read the reply", and a private copy of the turn-boundary
57
71
  * rules here (#1839's `basis`, #1975's unanswered-prompt hold, #1708's
58
72
  * unclassified dwell) is a copy that would drift into reporting a completion
59
- * this one refuses.
73
+ * this one refuses. #2463's Auto-Yes hold is shared the same way: `ask` passes
74
+ * no `autoYesGrace` and holds for the default.
60
75
  *
61
76
  * `options.instance` must already be a resolved instance ID — see
62
77
  * {@link resolveWaitInstance}.
63
78
  */
64
- export declare function pollWorktree(client: ApiClient, worktreeId: string, options: WaitOptions): Promise<{
79
+ export declare function pollWorktree(client: ApiClient, worktreeId: string, options: PollWorktreeOptions): Promise<{
65
80
  exitCode: number;
66
81
  output?: WaitPromptOutput;
67
82
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAMV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAA+B,MAAM,qBAAqB,CAAC;AAwD7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAIvD,CAAC;AA2bH;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC,CA6X1D;AAwKD,wBAAgB,iBAAiB,IAAI,OAAO,CA2J3C"}
1
+ {"version":3,"file":"wait.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAMV,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,SAAS,EAA+B,MAAM,qBAAqB,CAAC;AAwD7E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAIvD,CAAC;AA2dH;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,WAAW;IACtD;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAwCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAqb1D;AAwKD,wBAAgB,iBAAiB,IAAI,OAAO,CAsL3C"}