commandmate 0.46.1 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (711) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +223 -216
  3. package/.next/app-path-routes-manifest.json +19 -18
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +9 -9
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +8 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/agents/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/agents/versions/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/release-notes/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update/route.js +4 -2
  13. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/capabilities/route.js +1 -1
  19. package/.next/server/app/api/capabilities/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/daily-summary/route.js +1 -1
  21. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  22. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  24. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  25. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  26. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/hooks/agent-event/route.js +2 -2
  32. package/.next/server/app/api/hooks/agent-event/route.js.nft.json +1 -1
  33. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/hooks/claude-done/route.js +2 -2
  35. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  36. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/hooks/permission-request/route.js +1 -1
  38. package/.next/server/app/api/hooks/permission-request/route.js.nft.json +1 -1
  39. package/.next/server/app/api/hooks/permission-request/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/escalation/route.js +1 -7
  43. package/.next/server/app/api/push/escalation/route.js.nft.json +1 -1
  44. package/.next/server/app/api/push/escalation/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/push/vapid/route.js +1 -7
  47. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  48. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/relays/[relayId]/cancel/route.js +1 -1
  50. package/.next/server/app/api/relays/[relayId]/cancel/route.js.nft.json +1 -1
  51. package/.next/server/app/api/relays/[relayId]/cancel/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/relays/route.js +1 -1
  53. package/.next/server/app/api/relays/route.js.nft.json +1 -1
  54. package/.next/server/app/api/relays/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/remote/pair/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  58. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  59. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/repositories/clone/route.js +1 -1
  61. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  62. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/repositories/restore/route.js +1 -1
  65. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  66. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  67. package/.next/server/app/api/repositories/route.js +1 -1
  68. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  69. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/repositories/scan/route.js +1 -1
  71. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  72. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/repositories/sync/route.js +1 -1
  74. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  75. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/settings/default-agents/route.js +1 -1
  78. package/.next/server/app/api/settings/default-agents/route.js.nft.json +1 -1
  79. package/.next/server/app/api/settings/default-agents/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/settings/default-surface-mode/route_client-reference-manifest.js +1 -1
  81. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  84. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  91. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  96. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  99. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/clear-composer/route.js.nft.json +1 -1
  102. package/.next/server/app/api/worktrees/[id]/clear-composer/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/cli-reference/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  107. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  110. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/direct-input/route.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/direct-input/route.js.nft.json +1 -1
  113. package/.next/server/app/api/worktrees/[id]/direct-input/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/env/route_client-reference-manifest.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/instances/notes/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/instances/opencode/route.js.nft.json +1 -1
  146. package/.next/server/app/api/worktrees/[id]/instances/opencode/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  149. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  152. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/opencode/diff/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/opencode/session/route.js.nft.json +1 -1
  162. package/.next/server/app/api/worktrees/[id]/opencode/session/route_client-reference-manifest.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/opencode/share/route.js.nft.json +1 -1
  165. package/.next/server/app/api/worktrees/[id]/opencode/share/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  168. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js +1 -0
  170. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route.js.nft.json +1 -0
  171. package/.next/server/app/api/worktrees/[id]/prompt-response/strict/route_client-reference-manifest.js +1 -0
  172. package/.next/server/app/api/worktrees/[id]/resolve-target/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +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.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  191. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +2 -2
  193. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  194. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/terminal/route.js +2 -2
  208. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  209. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  211. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  213. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  217. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/verify/config/route_client-reference-manifest.js +1 -1
  220. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/verify/route.js.nft.json +1 -1
  222. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route.js.nft.json +1 -1
  225. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route_client-reference-manifest.js +1 -1
  226. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  229. package/.next/server/app/api/worktrees/apply-default-agents/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/route.js +1 -1
  231. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  234. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  235. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  236. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  237. package/.next/server/app/page_client-reference-manifest.js +1 -1
  238. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  240. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/sessions/page.js +1 -1
  242. package/.next/server/app/sessions/page.js.nft.json +1 -1
  243. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  245. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  246. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  248. package/.next/server/app/worktrees/[id]/page.js +11 -11
  249. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  250. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  251. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  252. package/.next/server/app-paths-manifest.json +19 -18
  253. package/.next/server/chunks/1210.js +1 -1
  254. package/.next/server/chunks/1559.js +1 -1
  255. package/.next/server/chunks/1601.js +7 -0
  256. package/.next/server/chunks/1836.js +1 -0
  257. package/.next/server/chunks/1945.js +14 -0
  258. package/.next/server/chunks/2119.js +1 -1
  259. package/.next/server/chunks/2404.js +1 -1
  260. package/.next/server/chunks/2422.js +1 -0
  261. package/.next/server/chunks/2445.js +1 -1
  262. package/.next/server/chunks/2460.js +1 -1
  263. package/.next/server/chunks/2534.js +1 -1
  264. package/.next/server/chunks/3241.js +1 -1
  265. package/.next/server/chunks/{3077.js → 4194.js} +12 -12
  266. package/.next/server/chunks/4207.js +1 -1
  267. package/.next/server/chunks/4248.js +1 -1
  268. package/.next/server/chunks/5209.js +1 -1
  269. package/.next/server/chunks/5292.js +1 -1
  270. package/.next/server/chunks/5595.js +1 -1
  271. package/.next/server/chunks/5845.js +1 -1
  272. package/.next/server/chunks/6130.js +1 -1
  273. package/.next/server/chunks/6401.js +1 -1
  274. package/.next/server/chunks/{2283.js → 6486.js} +7 -7
  275. package/.next/server/chunks/6722.js +1 -1
  276. package/.next/server/chunks/6781.js +1 -1
  277. package/.next/server/chunks/6793.js +2 -2
  278. package/.next/server/chunks/7166.js +19 -0
  279. package/.next/server/chunks/7905.js +1 -1
  280. package/.next/server/chunks/8581.js +10 -10
  281. package/.next/server/chunks/8728.js +2 -2
  282. package/.next/server/chunks/8791.js +1 -1
  283. package/.next/server/chunks/8918.js +4 -4
  284. package/.next/server/chunks/9199.js +1 -0
  285. package/.next/server/chunks/936.js +1 -0
  286. package/.next/server/chunks/9390.js +1 -1
  287. package/.next/server/chunks/9540.js +1 -0
  288. package/.next/server/chunks/9627.js +1 -1
  289. package/.next/server/chunks/9731.js +3 -3
  290. package/.next/server/middleware-manifest.json +5 -5
  291. package/.next/server/pages/500.html +1 -1
  292. package/.next/server/server-reference-manifest.json +1 -1
  293. package/.next/static/chunks/{2407-9703c569370b8a9d.js → 2407-b2f524f99f7fc353.js} +1 -1
  294. package/.next/static/chunks/5371-a549a0d2c2044d41.js +1 -0
  295. package/.next/static/chunks/{5794-4eee51ff1e878aa6.js → 5794-80ac3f06f098ea29.js} +1 -1
  296. package/.next/static/chunks/602-1c1488959215e140.js +1 -0
  297. package/.next/static/chunks/9079-24f9fa549ed298f1.js +1 -0
  298. package/.next/static/chunks/app/api/agents/update/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  299. package/.next/static/chunks/app/api/agents/versions/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  300. package/.next/static/chunks/app/api/app/release-notes/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  301. package/.next/static/chunks/app/api/app/update/route-c81284a9d8b35304.js +1 -0
  302. package/.next/static/chunks/app/api/app/update-check/{route-0468c3c4baa46028.js → route-c81284a9d8b35304.js} +1 -1
  303. package/.next/static/chunks/app/api/auth/login/route-c81284a9d8b35304.js +1 -0
  304. package/.next/static/chunks/app/api/auth/logout/route-c81284a9d8b35304.js +1 -0
  305. package/.next/static/chunks/app/api/auth/status/route-c81284a9d8b35304.js +1 -0
  306. package/.next/static/chunks/app/api/capabilities/route-c81284a9d8b35304.js +1 -0
  307. package/.next/static/chunks/app/api/daily-summary/route-c81284a9d8b35304.js +1 -0
  308. package/.next/static/chunks/app/api/daily-summary/status/route-c81284a9d8b35304.js +1 -0
  309. package/.next/static/chunks/app/api/external-apps/[id]/health/route-c81284a9d8b35304.js +1 -0
  310. package/.next/static/chunks/app/api/external-apps/[id]/route-c81284a9d8b35304.js +1 -0
  311. package/.next/static/chunks/app/api/external-apps/route-c81284a9d8b35304.js +1 -0
  312. package/.next/static/chunks/app/api/fs/browse/route-c81284a9d8b35304.js +1 -0
  313. package/.next/static/chunks/app/api/fs/recent-paths/route-c81284a9d8b35304.js +1 -0
  314. package/.next/static/chunks/app/api/hooks/agent-event/route-c81284a9d8b35304.js +1 -0
  315. package/.next/static/chunks/app/api/hooks/claude-done/route-c81284a9d8b35304.js +1 -0
  316. package/.next/static/chunks/app/api/hooks/permission-request/route-c81284a9d8b35304.js +1 -0
  317. package/.next/static/chunks/app/api/metrics/vibe/route-c81284a9d8b35304.js +1 -0
  318. package/.next/static/chunks/app/api/ollama/models/route-c81284a9d8b35304.js +1 -0
  319. package/.next/static/chunks/app/api/push/escalation/route-c81284a9d8b35304.js +1 -0
  320. package/.next/static/chunks/app/api/push/subscriptions/route-c81284a9d8b35304.js +1 -0
  321. package/.next/static/chunks/app/api/push/vapid/route-c81284a9d8b35304.js +1 -0
  322. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-c81284a9d8b35304.js +1 -0
  323. package/.next/static/chunks/app/api/relays/route-c81284a9d8b35304.js +1 -0
  324. package/.next/static/chunks/app/api/remote/pair/route-c81284a9d8b35304.js +1 -0
  325. package/.next/static/chunks/app/api/repositories/[id]/route-c81284a9d8b35304.js +1 -0
  326. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-c81284a9d8b35304.js +1 -0
  327. package/.next/static/chunks/app/api/repositories/clone/route-c81284a9d8b35304.js +1 -0
  328. package/.next/static/chunks/app/api/repositories/excluded/route-c81284a9d8b35304.js +1 -0
  329. package/.next/static/chunks/app/api/repositories/restore/route-c81284a9d8b35304.js +1 -0
  330. package/.next/static/chunks/app/api/repositories/route-c81284a9d8b35304.js +1 -0
  331. package/.next/static/chunks/app/api/repositories/scan/route-c81284a9d8b35304.js +1 -0
  332. package/.next/static/chunks/app/api/repositories/sync/route-c81284a9d8b35304.js +1 -0
  333. package/.next/static/chunks/app/api/repositories/validate-path/route-c81284a9d8b35304.js +1 -0
  334. package/.next/static/chunks/app/api/settings/default-agents/route-c81284a9d8b35304.js +1 -0
  335. package/.next/static/chunks/app/api/settings/default-surface-mode/route-c81284a9d8b35304.js +1 -0
  336. package/.next/static/chunks/app/api/sidebar/group-order/route-c81284a9d8b35304.js +1 -0
  337. package/.next/static/chunks/app/api/skills/[id]/route-c81284a9d8b35304.js +1 -0
  338. package/.next/static/chunks/app/api/skills/installations/route-c81284a9d8b35304.js +1 -0
  339. package/.next/static/chunks/app/api/skills/operations/route-c81284a9d8b35304.js +1 -0
  340. package/.next/static/chunks/app/api/skills/reindex/route-c81284a9d8b35304.js +1 -0
  341. package/.next/static/chunks/app/api/skills/route-c81284a9d8b35304.js +1 -0
  342. package/.next/static/chunks/app/api/slash-commands/route-c81284a9d8b35304.js +1 -0
  343. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-c81284a9d8b35304.js +1 -0
  344. package/.next/static/chunks/app/api/tasks/[taskId]/route-c81284a9d8b35304.js +1 -0
  345. package/.next/static/chunks/app/api/templates/[id]/route-c81284a9d8b35304.js +1 -0
  346. package/.next/static/chunks/app/api/templates/route-c81284a9d8b35304.js +1 -0
  347. package/.next/static/chunks/app/api/verification/runs/[runId]/route-c81284a9d8b35304.js +1 -0
  348. package/.next/static/chunks/app/api/verification/runs/route-c81284a9d8b35304.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-c81284a9d8b35304.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-c81284a9d8b35304.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-c81284a9d8b35304.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-c81284a9d8b35304.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-c81284a9d8b35304.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-c81284a9d8b35304.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-c81284a9d8b35304.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-c81284a9d8b35304.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/env/route-c81284a9d8b35304.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-c81284a9d8b35304.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-c81284a9d8b35304.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-c81284a9d8b35304.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-c81284a9d8b35304.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-c81284a9d8b35304.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-c81284a9d8b35304.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-c81284a9d8b35304.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-c81284a9d8b35304.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-c81284a9d8b35304.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-c81284a9d8b35304.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-c81284a9d8b35304.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-c81284a9d8b35304.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-c81284a9d8b35304.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-c81284a9d8b35304.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-c81284a9d8b35304.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-c81284a9d8b35304.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-c81284a9d8b35304.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-c81284a9d8b35304.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-c81284a9d8b35304.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-c81284a9d8b35304.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-c81284a9d8b35304.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-c81284a9d8b35304.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-c81284a9d8b35304.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-c81284a9d8b35304.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-c81284a9d8b35304.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-c81284a9d8b35304.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-c81284a9d8b35304.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-c81284a9d8b35304.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-c81284a9d8b35304.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-c81284a9d8b35304.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-c81284a9d8b35304.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-c81284a9d8b35304.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-c81284a9d8b35304.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-c81284a9d8b35304.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-c81284a9d8b35304.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-c81284a9d8b35304.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-c81284a9d8b35304.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-c81284a9d8b35304.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-c81284a9d8b35304.js +1 -0
  397. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-c81284a9d8b35304.js +1 -0
  398. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/strict/route-c81284a9d8b35304.js +1 -0
  399. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-c81284a9d8b35304.js +1 -0
  400. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-c81284a9d8b35304.js +1 -0
  401. package/.next/static/chunks/app/api/worktrees/[id]/route-c81284a9d8b35304.js +1 -0
  402. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-c81284a9d8b35304.js +1 -0
  403. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-c81284a9d8b35304.js +1 -0
  404. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-c81284a9d8b35304.js +1 -0
  405. package/.next/static/chunks/app/api/worktrees/[id]/search/route-c81284a9d8b35304.js +1 -0
  406. package/.next/static/chunks/app/api/worktrees/[id]/send/route-c81284a9d8b35304.js +1 -0
  407. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-c81284a9d8b35304.js +1 -0
  408. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-c81284a9d8b35304.js +1 -0
  409. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-c81284a9d8b35304.js +1 -0
  410. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-c81284a9d8b35304.js +1 -0
  411. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-c81284a9d8b35304.js +1 -0
  412. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-c81284a9d8b35304.js +1 -0
  413. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-c81284a9d8b35304.js +1 -0
  414. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-c81284a9d8b35304.js +1 -0
  415. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-c81284a9d8b35304.js +1 -0
  416. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-c81284a9d8b35304.js +1 -0
  417. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-c81284a9d8b35304.js +1 -0
  418. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-c81284a9d8b35304.js +1 -0
  419. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-c81284a9d8b35304.js +1 -0
  420. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-c81284a9d8b35304.js +1 -0
  421. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-c81284a9d8b35304.js +1 -0
  422. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-c81284a9d8b35304.js +1 -0
  423. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-c81284a9d8b35304.js +1 -0
  424. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-c81284a9d8b35304.js +1 -0
  425. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-c81284a9d8b35304.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-c81284a9d8b35304.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-c81284a9d8b35304.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-c81284a9d8b35304.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-c81284a9d8b35304.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-c81284a9d8b35304.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-c81284a9d8b35304.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-c81284a9d8b35304.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/route-c81284a9d8b35304.js +1 -0
  434. package/.next/static/chunks/app/layout-419eaf7de340f4ab.js +1 -0
  435. package/.next/static/chunks/app/manifest.webmanifest/route-c81284a9d8b35304.js +1 -0
  436. package/.next/static/chunks/app/proxy/[...path]/route-c81284a9d8b35304.js +1 -0
  437. package/.next/static/chunks/app/sessions/page-e02f1adb1d1c1ccc.js +1 -0
  438. package/.next/static/chunks/app/worktrees/[id]/layout-c81284a9d8b35304.js +1 -0
  439. package/.next/static/chunks/app/worktrees/[id]/page-45294052ee3032f1.js +1 -0
  440. package/.next/trace +13 -13
  441. package/.next/types/app/api/worktrees/[id]/prompt-response/strict/route.ts +347 -0
  442. package/.next/types/routes.d.ts +2 -1
  443. package/.next/types/validator.ts +9 -0
  444. package/dist/cli/commands/auto-yes.d.ts +19 -0
  445. package/dist/cli/commands/auto-yes.d.ts.map +1 -1
  446. package/dist/cli/commands/auto-yes.js +45 -0
  447. package/dist/cli/commands/instances.d.ts.map +1 -1
  448. package/dist/cli/commands/instances.js +23 -18
  449. package/dist/cli/commands/ls.d.ts +15 -1
  450. package/dist/cli/commands/ls.d.ts.map +1 -1
  451. package/dist/cli/commands/ls.js +39 -3
  452. package/dist/cli/commands/prompt.d.ts +42 -0
  453. package/dist/cli/commands/prompt.d.ts.map +1 -0
  454. package/dist/cli/commands/prompt.js +211 -0
  455. package/dist/cli/commands/relays.d.ts.map +1 -1
  456. package/dist/cli/commands/relays.js +13 -1
  457. package/dist/cli/commands/respond-strict.d.ts +31 -0
  458. package/dist/cli/commands/respond-strict.d.ts.map +1 -0
  459. package/dist/cli/commands/respond-strict.js +214 -0
  460. package/dist/cli/commands/respond.d.ts.map +1 -1
  461. package/dist/cli/commands/respond.js +38 -0
  462. package/dist/cli/commands/send.d.ts.map +1 -1
  463. package/dist/cli/commands/send.js +41 -5
  464. package/dist/cli/commands/start.d.ts.map +1 -1
  465. package/dist/cli/commands/start.js +2 -1
  466. package/dist/cli/commands/status.d.ts.map +1 -1
  467. package/dist/cli/commands/status.js +18 -0
  468. package/dist/cli/commands/wait.d.ts +21 -1
  469. package/dist/cli/commands/wait.d.ts.map +1 -1
  470. package/dist/cli/commands/wait.js +108 -12
  471. package/dist/cli/docs/agent-operations.d.ts +1 -1
  472. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  473. package/dist/cli/docs/agent-operations.js +63 -1
  474. package/dist/cli/program.d.ts.map +1 -1
  475. package/dist/cli/program.js +6 -2
  476. package/dist/cli/types/api-responses.d.ts +54 -0
  477. package/dist/cli/types/api-responses.d.ts.map +1 -1
  478. package/dist/cli/types/index.d.ts +30 -0
  479. package/dist/cli/types/index.d.ts.map +1 -1
  480. package/dist/cli/types/index.js +12 -1
  481. package/dist/cli/utils/api-client.d.ts +13 -1
  482. package/dist/cli/utils/api-client.d.ts.map +1 -1
  483. package/dist/cli/utils/api-client.js +10 -2
  484. package/dist/cli/utils/daemon-factory.d.ts.map +1 -1
  485. package/dist/cli/utils/daemon-factory.js +3 -1
  486. package/dist/cli/utils/daemon.d.ts +38 -1
  487. package/dist/cli/utils/daemon.d.ts.map +1 -1
  488. package/dist/cli/utils/daemon.js +161 -8
  489. package/dist/cli/utils/paths.d.ts +12 -0
  490. package/dist/cli/utils/paths.d.ts.map +1 -1
  491. package/dist/cli/utils/paths.js +17 -0
  492. package/dist/lib/polling/auto-yes-suppression-reason.d.ts +43 -1
  493. package/dist/lib/polling/auto-yes-suppression-reason.d.ts.map +1 -1
  494. package/dist/lib/polling/auto-yes-suppression-reason.js +18 -1
  495. package/dist/lib/prompt-observation/kinds.d.ts +101 -0
  496. package/dist/lib/prompt-observation/kinds.d.ts.map +1 -0
  497. package/dist/lib/prompt-observation/kinds.js +123 -0
  498. package/dist/lib/prompt-observation/types.d.ts +271 -0
  499. package/dist/lib/prompt-observation/types.d.ts.map +1 -0
  500. package/dist/lib/prompt-observation/types.js +14 -0
  501. package/dist/lib/session/send-attempt-types.d.ts +66 -0
  502. package/dist/lib/session/send-attempt-types.d.ts.map +1 -0
  503. package/dist/lib/session/send-attempt-types.js +17 -0
  504. package/dist/server/locales/en/worktree.json +4 -0
  505. package/dist/server/locales/ja/worktree.json +4 -0
  506. package/dist/server/server.js +20 -1
  507. package/dist/server/src/config/auto-yes-config.js +11 -0
  508. package/dist/server/src/lib/auto-yes-lifecycle.js +28 -2
  509. package/dist/server/src/lib/auto-yes-poller.js +345 -28
  510. package/dist/server/src/lib/auto-yes-shutdown-record.js +257 -0
  511. package/dist/server/src/lib/auto-yes-state.js +197 -4
  512. package/dist/server/src/lib/cli-tools/antigravity-startup-trust.js +135 -0
  513. package/dist/server/src/lib/cli-tools/antigravity.js +162 -29
  514. package/dist/server/src/lib/cli-tools/command-code.js +10 -2
  515. package/dist/server/src/lib/cli-tools/copilot.js +21 -10
  516. package/dist/server/src/lib/cli-tools/gemini.js +60 -13
  517. package/dist/server/src/lib/cli-tools/launch-dialog.js +203 -0
  518. package/dist/server/src/lib/cli-tools/launch-window.js +96 -0
  519. package/dist/server/src/lib/detection/selection-shape.js +35 -1
  520. package/dist/server/src/lib/detection/tools/antigravity/detect.js +38 -9
  521. package/dist/server/src/lib/detection/tools/antigravity/dialog.js +88 -1
  522. package/dist/server/src/lib/detection/tools/antigravity/patterns.js +41 -1
  523. package/dist/server/src/lib/detection/tools/claude/detect.js +60 -0
  524. package/dist/server/src/lib/detection/tools/command-code/selection-shape.js +63 -13
  525. package/dist/server/src/lib/detection/tools/copilot/patterns.js +7 -1
  526. package/dist/server/src/lib/hooks/sources/opencode-v2/history.js +11 -2
  527. package/dist/server/src/lib/hooks/sources/opencode-v2/subscription.js +5 -3
  528. package/dist/server/src/lib/polling/antigravity-permission-receipts.js +15 -0
  529. package/dist/server/src/lib/polling/antigravity-receipt-episodes.js +281 -0
  530. package/dist/server/src/lib/polling/auto-yes-confirm-page.js +56 -0
  531. package/dist/server/src/lib/polling/auto-yes-dialog-gate.js +8 -1
  532. package/dist/server/src/lib/polling/auto-yes-policy.js +61 -7
  533. package/dist/server/src/lib/polling/auto-yes-poller-stop-reason.js +50 -0
  534. package/dist/server/src/lib/polling/auto-yes-prompt-suppression.js +220 -5
  535. package/dist/server/src/lib/polling/auto-yes-suppression-reason.js +18 -1
  536. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +10 -0
  537. package/dist/server/src/lib/polling/response-checker-dialog-gate.js +2 -2
  538. package/dist/server/src/lib/polling/response-checker.js +9 -0
  539. package/dist/server/src/lib/polling/response-poller-core.js +136 -104
  540. package/dist/server/src/lib/prompt-observation/kinds.js +123 -0
  541. package/dist/server/src/lib/prompt-observation/types.js +14 -0
  542. package/dist/server/src/lib/push/prompt-push-gate.js +195 -3
  543. package/dist/server/src/lib/push/waiting-push-notifier.js +74 -7
  544. package/dist/server/src/lib/relay/relay-delivery-claims.js +46 -0
  545. package/dist/server/src/lib/relay/relay-delivery.js +76 -30
  546. package/dist/server/src/lib/schedule-manager.js +28 -0
  547. package/dist/server/src/lib/session/cli-session.js +38 -3
  548. package/dist/server/src/lib/session/send-attempt-state.js +155 -0
  549. package/dist/server/src/lib/session/send-attempt-types.js +17 -0
  550. package/dist/server/src/lib/session/send-user-message.js +46 -0
  551. package/dist/server/src/lib/session/worktree-session-reconcile.js +2 -1
  552. package/dist/server/src/lib/tmux/session-created-signal.js +76 -0
  553. package/dist/server/src/lib/tmux/tmux-capture-cache.js +58 -6
  554. package/dist/server/src/lib/tmux/tmux.js +4 -0
  555. package/dist/server/src/lib/verification/scope-gate-format.js +100 -0
  556. package/dist/server/src/lib/verification/scope-gate-glob.js +185 -0
  557. package/dist/server/src/lib/verification/scope-gate.js +19 -271
  558. package/dist/server/src/lib/ws-server.js +48 -6
  559. package/docs/en/user-guide/cli-setup-guide.md +12 -1
  560. package/docs/en/user-guide/webapp-guide.md +2 -0
  561. package/package.json +1 -1
  562. package/release-notes/0.47.0.json +118 -0
  563. package/.next/server/chunks/1789.js +0 -1
  564. package/.next/server/chunks/2908.js +0 -1
  565. package/.next/server/chunks/2984.js +0 -25
  566. package/.next/server/chunks/3718.js +0 -1
  567. package/.next/server/chunks/4837.js +0 -14
  568. package/.next/server/chunks/611.js +0 -1
  569. package/.next/server/chunks/850.js +0 -1
  570. package/.next/static/chunks/3201-c01f1feed69020e6.js +0 -1
  571. package/.next/static/chunks/5371-0dc947683e46e78c.js +0 -1
  572. package/.next/static/chunks/602-25e45a2422d2a3ea.js +0 -1
  573. package/.next/static/chunks/app/api/app/update/route-0468c3c4baa46028.js +0 -1
  574. package/.next/static/chunks/app/api/auth/login/route-0468c3c4baa46028.js +0 -1
  575. package/.next/static/chunks/app/api/auth/logout/route-0468c3c4baa46028.js +0 -1
  576. package/.next/static/chunks/app/api/auth/status/route-0468c3c4baa46028.js +0 -1
  577. package/.next/static/chunks/app/api/capabilities/route-0468c3c4baa46028.js +0 -1
  578. package/.next/static/chunks/app/api/daily-summary/route-0468c3c4baa46028.js +0 -1
  579. package/.next/static/chunks/app/api/daily-summary/status/route-0468c3c4baa46028.js +0 -1
  580. package/.next/static/chunks/app/api/external-apps/[id]/health/route-0468c3c4baa46028.js +0 -1
  581. package/.next/static/chunks/app/api/external-apps/[id]/route-0468c3c4baa46028.js +0 -1
  582. package/.next/static/chunks/app/api/external-apps/route-0468c3c4baa46028.js +0 -1
  583. package/.next/static/chunks/app/api/fs/browse/route-0468c3c4baa46028.js +0 -1
  584. package/.next/static/chunks/app/api/fs/recent-paths/route-0468c3c4baa46028.js +0 -1
  585. package/.next/static/chunks/app/api/hooks/agent-event/route-0468c3c4baa46028.js +0 -1
  586. package/.next/static/chunks/app/api/hooks/claude-done/route-0468c3c4baa46028.js +0 -1
  587. package/.next/static/chunks/app/api/hooks/permission-request/route-0468c3c4baa46028.js +0 -1
  588. package/.next/static/chunks/app/api/metrics/vibe/route-0468c3c4baa46028.js +0 -1
  589. package/.next/static/chunks/app/api/ollama/models/route-0468c3c4baa46028.js +0 -1
  590. package/.next/static/chunks/app/api/push/escalation/route-0468c3c4baa46028.js +0 -1
  591. package/.next/static/chunks/app/api/push/subscriptions/route-0468c3c4baa46028.js +0 -1
  592. package/.next/static/chunks/app/api/push/vapid/route-0468c3c4baa46028.js +0 -1
  593. package/.next/static/chunks/app/api/relays/[relayId]/cancel/route-0468c3c4baa46028.js +0 -1
  594. package/.next/static/chunks/app/api/relays/route-0468c3c4baa46028.js +0 -1
  595. package/.next/static/chunks/app/api/remote/pair/route-0468c3c4baa46028.js +0 -1
  596. package/.next/static/chunks/app/api/repositories/[id]/route-0468c3c4baa46028.js +0 -1
  597. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-0468c3c4baa46028.js +0 -1
  598. package/.next/static/chunks/app/api/repositories/clone/route-0468c3c4baa46028.js +0 -1
  599. package/.next/static/chunks/app/api/repositories/excluded/route-0468c3c4baa46028.js +0 -1
  600. package/.next/static/chunks/app/api/repositories/restore/route-0468c3c4baa46028.js +0 -1
  601. package/.next/static/chunks/app/api/repositories/route-0468c3c4baa46028.js +0 -1
  602. package/.next/static/chunks/app/api/repositories/scan/route-0468c3c4baa46028.js +0 -1
  603. package/.next/static/chunks/app/api/repositories/sync/route-0468c3c4baa46028.js +0 -1
  604. package/.next/static/chunks/app/api/repositories/validate-path/route-0468c3c4baa46028.js +0 -1
  605. package/.next/static/chunks/app/api/settings/default-agents/route-0468c3c4baa46028.js +0 -1
  606. package/.next/static/chunks/app/api/settings/default-surface-mode/route-0468c3c4baa46028.js +0 -1
  607. package/.next/static/chunks/app/api/sidebar/group-order/route-0468c3c4baa46028.js +0 -1
  608. package/.next/static/chunks/app/api/skills/[id]/route-0468c3c4baa46028.js +0 -1
  609. package/.next/static/chunks/app/api/skills/installations/route-0468c3c4baa46028.js +0 -1
  610. package/.next/static/chunks/app/api/skills/operations/route-0468c3c4baa46028.js +0 -1
  611. package/.next/static/chunks/app/api/skills/reindex/route-0468c3c4baa46028.js +0 -1
  612. package/.next/static/chunks/app/api/skills/route-0468c3c4baa46028.js +0 -1
  613. package/.next/static/chunks/app/api/slash-commands/route-0468c3c4baa46028.js +0 -1
  614. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-0468c3c4baa46028.js +0 -1
  615. package/.next/static/chunks/app/api/tasks/[taskId]/route-0468c3c4baa46028.js +0 -1
  616. package/.next/static/chunks/app/api/templates/[id]/route-0468c3c4baa46028.js +0 -1
  617. package/.next/static/chunks/app/api/templates/route-0468c3c4baa46028.js +0 -1
  618. package/.next/static/chunks/app/api/verification/runs/[runId]/route-0468c3c4baa46028.js +0 -1
  619. package/.next/static/chunks/app/api/verification/runs/route-0468c3c4baa46028.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-0468c3c4baa46028.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-0468c3c4baa46028.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/clear-composer/route-0468c3c4baa46028.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/cli-reference/route-0468c3c4baa46028.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-0468c3c4baa46028.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-0468c3c4baa46028.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-0468c3c4baa46028.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/direct-input/route-0468c3c4baa46028.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/env/route-0468c3c4baa46028.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-0468c3c4baa46028.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-0468c3c4baa46028.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-0468c3c4baa46028.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-0468c3c4baa46028.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-0468c3c4baa46028.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-0468c3c4baa46028.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-0468c3c4baa46028.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-0468c3c4baa46028.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-0468c3c4baa46028.js +0 -1
  638. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-0468c3c4baa46028.js +0 -1
  639. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-0468c3c4baa46028.js +0 -1
  640. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-0468c3c4baa46028.js +0 -1
  641. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-0468c3c4baa46028.js +0 -1
  642. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-0468c3c4baa46028.js +0 -1
  643. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-0468c3c4baa46028.js +0 -1
  644. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-0468c3c4baa46028.js +0 -1
  645. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-0468c3c4baa46028.js +0 -1
  646. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-0468c3c4baa46028.js +0 -1
  647. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-0468c3c4baa46028.js +0 -1
  648. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-0468c3c4baa46028.js +0 -1
  649. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-0468c3c4baa46028.js +0 -1
  650. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-0468c3c4baa46028.js +0 -1
  651. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-0468c3c4baa46028.js +0 -1
  652. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-0468c3c4baa46028.js +0 -1
  653. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-0468c3c4baa46028.js +0 -1
  654. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-0468c3c4baa46028.js +0 -1
  655. package/.next/static/chunks/app/api/worktrees/[id]/instances/notes/route-0468c3c4baa46028.js +0 -1
  656. package/.next/static/chunks/app/api/worktrees/[id]/instances/opencode/route-0468c3c4baa46028.js +0 -1
  657. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-0468c3c4baa46028.js +0 -1
  658. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-0468c3c4baa46028.js +0 -1
  659. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-0468c3c4baa46028.js +0 -1
  660. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-0468c3c4baa46028.js +0 -1
  661. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-0468c3c4baa46028.js +0 -1
  662. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-0468c3c4baa46028.js +0 -1
  663. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-0468c3c4baa46028.js +0 -1
  664. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-0468c3c4baa46028.js +0 -1
  665. package/.next/static/chunks/app/api/worktrees/[id]/opencode/diff/route-0468c3c4baa46028.js +0 -1
  666. package/.next/static/chunks/app/api/worktrees/[id]/opencode/session/route-0468c3c4baa46028.js +0 -1
  667. package/.next/static/chunks/app/api/worktrees/[id]/opencode/share/route-0468c3c4baa46028.js +0 -1
  668. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-0468c3c4baa46028.js +0 -1
  669. package/.next/static/chunks/app/api/worktrees/[id]/resolve-target/route-0468c3c4baa46028.js +0 -1
  670. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-0468c3c4baa46028.js +0 -1
  671. package/.next/static/chunks/app/api/worktrees/[id]/route-0468c3c4baa46028.js +0 -1
  672. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-0468c3c4baa46028.js +0 -1
  673. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-0468c3c4baa46028.js +0 -1
  674. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-0468c3c4baa46028.js +0 -1
  675. package/.next/static/chunks/app/api/worktrees/[id]/search/route-0468c3c4baa46028.js +0 -1
  676. package/.next/static/chunks/app/api/worktrees/[id]/send/route-0468c3c4baa46028.js +0 -1
  677. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-0468c3c4baa46028.js +0 -1
  678. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-0468c3c4baa46028.js +0 -1
  679. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-0468c3c4baa46028.js +0 -1
  680. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-0468c3c4baa46028.js +0 -1
  681. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-0468c3c4baa46028.js +0 -1
  682. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-0468c3c4baa46028.js +0 -1
  683. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-0468c3c4baa46028.js +0 -1
  684. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-0468c3c4baa46028.js +0 -1
  685. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-0468c3c4baa46028.js +0 -1
  686. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-0468c3c4baa46028.js +0 -1
  687. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-0468c3c4baa46028.js +0 -1
  688. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-0468c3c4baa46028.js +0 -1
  689. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-0468c3c4baa46028.js +0 -1
  690. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-0468c3c4baa46028.js +0 -1
  691. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-0468c3c4baa46028.js +0 -1
  692. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-0468c3c4baa46028.js +0 -1
  693. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-0468c3c4baa46028.js +0 -1
  694. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-0468c3c4baa46028.js +0 -1
  695. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-0468c3c4baa46028.js +0 -1
  696. package/.next/static/chunks/app/api/worktrees/[id]/verify/config/route-0468c3c4baa46028.js +0 -1
  697. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-0468c3c4baa46028.js +0 -1
  698. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/cancel/route-0468c3c4baa46028.js +0 -1
  699. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-0468c3c4baa46028.js +0 -1
  700. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-0468c3c4baa46028.js +0 -1
  701. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-0468c3c4baa46028.js +0 -1
  702. package/.next/static/chunks/app/api/worktrees/apply-default-agents/route-0468c3c4baa46028.js +0 -1
  703. package/.next/static/chunks/app/api/worktrees/route-0468c3c4baa46028.js +0 -1
  704. package/.next/static/chunks/app/layout-3e357690446cd2da.js +0 -1
  705. package/.next/static/chunks/app/manifest.webmanifest/route-0468c3c4baa46028.js +0 -1
  706. package/.next/static/chunks/app/proxy/[...path]/route-0468c3c4baa46028.js +0 -1
  707. package/.next/static/chunks/app/sessions/page-9859ed61e93e6890.js +0 -1
  708. package/.next/static/chunks/app/worktrees/[id]/layout-0468c3c4baa46028.js +0 -1
  709. package/.next/static/chunks/app/worktrees/[id]/page-effbf0796881dd5a.js +0 -1
  710. /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_buildManifest.js +0 -0
  711. /package/.next/static/{QxDf7lm-JJkWoj-TyWiSB → b5BiQC9F6r_XFPdA9cuSj}/_ssgManifest.js +0 -0
@@ -29,6 +29,10 @@
29
29
  * 8. clearInProgressMessageId
30
30
  * 9. startPolling — record the assistant response afterwards
31
31
  *
32
+ * Every attempt that reaches the ownership check also records how it ended —
33
+ * not-sent / sent / indeterminate — for `prompt --json`'s `lastSend` (Issue
34
+ * #3759, `./send-attempt-state`). Nothing is resent on any outcome.
35
+ *
32
36
  * Out of scope (kept in the HTTP layer / caller): request/body validation,
33
37
  * content trimming/size limits, imagePath validation, CLI-tool availability
34
38
  * and session-start (running) checks. The caller passes already-validated input.
@@ -48,6 +52,10 @@ const worktree_session_ownership_1 = require("../../lib/cli-tools/worktree-sessi
48
52
  const session_name_1 = require("../../lib/cli-tools/session-name");
49
53
  const prompt_waiting_guard_1 = require("../../lib/session/prompt-waiting-guard");
50
54
  const session_start_error_1 = require("../../lib/session/session-start-error");
55
+ const cli_session_1 = require("../../lib/session/cli-session");
56
+ const send_attempt_state_1 = require("../../lib/session/send-attempt-state");
57
+ const composer_text_1 = require("../../lib/detection/composer-text");
58
+ const status_capture_config_1 = require("../../config/status-capture-config");
51
59
  const opencode_1 = require("../../lib/cli-tools/opencode");
52
60
  const logger = (0, logger_1.createLogger)('session/send-user-message');
53
61
  function getErrorMessage(error) {
@@ -92,6 +100,28 @@ async function waitForPreviousTurnRecorded(worktreeId, resolvedInstanceId) {
92
100
  }
93
101
  return true;
94
102
  }
103
+ /**
104
+ * Whether the composer still shows the message after a send whose submit was
105
+ * never confirmed (Issue #3759) — evidence that it is typed but unsent.
106
+ *
107
+ * Only for the composers `extractComposerText` has measured; any other tool,
108
+ * and any read that fails, answers false and the state stays
109
+ * `submit-unconfirmed`. Either way the state is `indeterminate`: a message in
110
+ * the composer is not one to type again.
111
+ */
112
+ async function composerStillHolds(worktreeId, cliToolId, instanceId, content) {
113
+ if (!composer_text_1.SUPPORTED_COMPOSER_TOOLS.has(cliToolId))
114
+ return false;
115
+ try {
116
+ const output = await (0, cli_session_1.captureSessionOutputFresh)(worktreeId, cliToolId, status_capture_config_1.STATUS_CAPTURE_LINES, instanceId);
117
+ const read = (0, composer_text_1.extractComposerText)(output, cliToolId);
118
+ return read.state === 'content' && (0, send_attempt_state_1.composerHoldsMessage)(read.text, content);
119
+ }
120
+ catch (error) {
121
+ logger.warn('send-composer-residue-read-failed', { error: getErrorMessage(error) });
122
+ return false;
123
+ }
124
+ }
95
125
  /**
96
126
  * Send a validated user message to the CLI tool and record it in history.
97
127
  *
@@ -111,6 +141,12 @@ async function sendUserMessage(db, params) {
111
141
  */
112
142
  const resolvedInstanceId = instanceId ?? cliToolId;
113
143
  const cliTool = manager_1.CLIToolManager.getInstance().getTool(cliToolId);
144
+ // Issue #3759: how this attempt left the message, kept for `lastSend` (and
145
+ // read back by the send route for its error). The result's shape is
146
+ // unchanged; recording never throws.
147
+ const settle = (state, reason) => {
148
+ (0, send_attempt_state_1.recordSendAttempt)({ worktreeId, cliToolId, instanceId: resolvedInstanceId }, { state, reason, content });
149
+ };
114
150
  // Issue #2865: the send route checks ownership itself, but the timer manager
115
151
  // and relay delivery reach tmux only through here. A session under this
116
152
  // worktree's name that was created in another directory belongs to another
@@ -119,6 +155,7 @@ async function sendUserMessage(db, params) {
119
155
  const sessionName = (0, session_name_1.resolveSessionName)(cliToolId, worktreeId, instanceId);
120
156
  const ownership = await (0, worktree_session_ownership_1.checkWorktreeSessionOwnership)(worktreeId, sessionName, db);
121
157
  if (ownership === null || ownership.verdict === 'foreign') {
158
+ settle('not-sent', 'foreign-session');
122
159
  logger.warn('send-refused-foreign-session', {
123
160
  worktreeId,
124
161
  cliToolId,
@@ -157,6 +194,7 @@ async function sendUserMessage(db, params) {
157
194
  ignoreStructured: params.ignoreStructuredPromptGuard,
158
195
  });
159
196
  if (promptGuard.waiting) {
197
+ settle('not-sent', 'prompt-waiting');
160
198
  logger.info('send-refused-prompt-waiting', {
161
199
  worktreeId,
162
200
  cliToolId,
@@ -194,6 +232,7 @@ async function sendUserMessage(db, params) {
194
232
  }
195
233
  catch (error) {
196
234
  logger.error('failed-to-send-model-command:', { error: getErrorMessage(error) });
235
+ settle('not-sent', 'model-switch-failed');
197
236
  return { ok: false, stage: 'model', error: getErrorMessage(error) };
198
237
  }
199
238
  // Issue #2630: copilot is idle now, and if the previous turn ended during the
@@ -314,11 +353,18 @@ async function sendUserMessage(db, params) {
314
353
  }
315
354
  catch (error) {
316
355
  logger.error('failed-to-send-message-to:', { error: getErrorMessage(error) });
356
+ // Issue #3759: not-sent only when the error says the body was never typed.
357
+ let failure = (0, send_attempt_state_1.classifySendFailure)(error);
358
+ if (failure.reason === 'submit-unconfirmed' && (await composerStillHolds(worktreeId, cliToolId, instanceId, content))) {
359
+ failure = { state: 'indeterminate', reason: 'composer-residue' };
360
+ }
361
+ settle(failure.state, failure.reason);
317
362
  if ((0, session_start_error_1.isSessionStartTimeoutError)(error)) {
318
363
  return { ok: false, stage: 'send', error: error.message, code: session_start_error_1.SESSION_STARTING_CODE };
319
364
  }
320
365
  return { ok: false, stage: 'send', error: getErrorMessage(error) };
321
366
  }
367
+ settle('sent', 'submitted');
322
368
  // 5. Create user message in database (History source: chat_messages).
323
369
  const message = (0, db_1.createMessage)(db, {
324
370
  worktreeId,
@@ -533,7 +533,8 @@ function migrateRuntimeState(db, renames, result) {
533
533
  if (!runningAutoYesPollers.has(move.oldKey))
534
534
  continue;
535
535
  try {
536
- (0, auto_yes_manager_1.stopAutoYesPolling)(move.oldKey);
536
+ // Issue #3730: a move, not a release — the grant goes on under newKey.
537
+ (0, auto_yes_manager_1.stopAutoYesPolling)(move.oldKey, 'worktree-id-migrated');
537
538
  restarts.push(move);
538
539
  }
539
540
  catch (error) {
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * "A tmux session of this name was just created" (Issue #3796).
4
+ *
5
+ * The Auto-Yes poller that found no session waits `MAX_BACKOFF_MS` for its next
6
+ * tick, and the push gate holds a prompt wait until that tick (#3791), so a
7
+ * session created right after the poller looked was answered — or its human
8
+ * notified — up to about 64 s late. {@link createSession} reports every session
9
+ * it creates here, and a waiting poller listens for its own session's name and
10
+ * ticks early.
11
+ *
12
+ * Synchronous and dependency-free on purpose: `tmux.ts` is the lowest layer and
13
+ * must not import the poller (it would be a cycle). A listener that throws is
14
+ * isolated from the others and from the session creation that fired it.
15
+ *
16
+ * @module lib/tmux/session-created-signal
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.onTmuxSessionCreated = onTmuxSessionCreated;
20
+ exports.notifyTmuxSessionCreated = notifyTmuxSessionCreated;
21
+ exports.countTmuxSessionCreatedListeners = countTmuxSessionCreatedListeners;
22
+ exports.clearTmuxSessionCreatedListeners = clearTmuxSessionCreatedListeners;
23
+ const global_state_1 = require("../global-state");
24
+ /**
25
+ * sessionName -> listeners. globalThis for the reason every shared in-memory
26
+ * state is (#1736): the creator (a route bundle) and the poller (the server's)
27
+ * can hold separate copies of this module.
28
+ */
29
+ const listeners = (0, global_state_1.getOrInitGlobal)('__tmuxSessionCreatedListeners', () => new Map());
30
+ /**
31
+ * Call `listener` the next time a session named `sessionName` is created.
32
+ *
33
+ * @returns Unsubscribe; calling it more than once does nothing
34
+ */
35
+ function onTmuxSessionCreated(sessionName, listener) {
36
+ let set = listeners.get(sessionName);
37
+ if (set === undefined) {
38
+ set = new Set();
39
+ listeners.set(sessionName, set);
40
+ }
41
+ set.add(listener);
42
+ return () => {
43
+ const current = listeners.get(sessionName);
44
+ if (current === undefined)
45
+ return;
46
+ current.delete(listener);
47
+ if (current.size === 0)
48
+ listeners.delete(sessionName);
49
+ };
50
+ }
51
+ /** Tell the listeners of `sessionName` that it was created. Each one is called once and dropped. */
52
+ function notifyTmuxSessionCreated(sessionName) {
53
+ const set = listeners.get(sessionName);
54
+ if (set === undefined)
55
+ return;
56
+ listeners.delete(sessionName);
57
+ for (const listener of set) {
58
+ try {
59
+ listener();
60
+ }
61
+ catch {
62
+ // A listener's failure must not fail the session creation that fired it.
63
+ }
64
+ }
65
+ }
66
+ /** Number of sessions someone is waiting for. Test seam. */
67
+ function countTmuxSessionCreatedListeners() {
68
+ let n = 0;
69
+ for (const set of listeners.values())
70
+ n += set.size;
71
+ return n;
72
+ }
73
+ /** Drop every listener. Test seam. */
74
+ function clearTmuxSessionCreatedListeners() {
75
+ listeners.clear();
76
+ }
@@ -21,6 +21,8 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.CACHE_MAX_CAPTURE_LINES = exports.CACHE_MAX_ENTRIES = exports.CACHE_TTL_MS = void 0;
23
23
  exports.isCaptureWindowSaturated = isCaptureWindowSaturated;
24
+ exports.getCaptureGeneration = getCaptureGeneration;
25
+ exports.isCaptureGenerationCurrent = isCaptureGenerationCurrent;
24
26
  exports.sliceOutput = sliceOutput;
25
27
  exports.getCachedCapture = getCachedCapture;
26
28
  exports.setCachedCapture = setCachedCapture;
@@ -85,6 +87,37 @@ function getCache() {
85
87
  function getInflight() {
86
88
  return (0, global_state_1.getOrInitGlobal)('__tmuxCaptureCacheInflight', () => new Map());
87
89
  }
90
+ function getGenerationState() {
91
+ return (0, global_state_1.getOrInitGlobal)('__tmuxCaptureCacheGeneration', () => ({ global: 0, sessions: new Map() }));
92
+ }
93
+ // =========================================================================
94
+ // getCaptureGeneration() / isCaptureGenerationCurrent()
95
+ // =========================================================================
96
+ /**
97
+ * Take the invalidation generation for a session before starting a capture
98
+ * (Issue #3734). Pass it to isCaptureGenerationCurrent() after the await.
99
+ *
100
+ * @param sessionName - tmux session name
101
+ * @returns Generation snapshot
102
+ */
103
+ function getCaptureGeneration(sessionName) {
104
+ const state = getGenerationState();
105
+ return { global: state.global, session: state.sessions.get(sessionName) ?? 0 };
106
+ }
107
+ /**
108
+ * Whether no invalidateCache(sessionName) / clearAllCache() ran since the
109
+ * snapshot was taken (Issue #3734). A capture that started before the
110
+ * invalidation may show the screen from before a send, so it must not be
111
+ * written back to the cache.
112
+ *
113
+ * @param sessionName - tmux session name
114
+ * @param generation - Snapshot from getCaptureGeneration()
115
+ * @returns True when the capture may be written back
116
+ */
117
+ function isCaptureGenerationCurrent(sessionName, generation) {
118
+ const current = getCaptureGeneration(sessionName);
119
+ return current.global === generation.global && current.session === generation.session;
120
+ }
88
121
  // =========================================================================
89
122
  // sliceOutput()
90
123
  // =========================================================================
@@ -183,6 +216,9 @@ function setCachedCapture(sessionName, output, capturedLines) {
183
216
  // =========================================================================
184
217
  /**
185
218
  * Invalidate cache for a specific session.
219
+ * Issue #3734: also advances the session's generation and drops its inflight
220
+ * entry, so a capture started before the invalidation is neither written back
221
+ * nor joined by callers that arrive after it (they start a fresh capture).
186
222
  * [SEC4-006] Logs debug message with session name for troubleshooting.
187
223
  *
188
224
  * @param sessionName - tmux session name to invalidate
@@ -190,6 +226,9 @@ function setCachedCapture(sessionName, output, capturedLines) {
190
226
  function invalidateCache(sessionName) {
191
227
  const cache = getCache();
192
228
  cache.delete(sessionName);
229
+ const generations = getGenerationState().sessions;
230
+ generations.set(sessionName, (generations.get(sessionName) ?? 0) + 1);
231
+ getInflight().delete(sessionName);
193
232
  // [SEC4-006] Debug log for cache invalidation chain tracking
194
233
  logger.debug('cache:invalidate', { sessionName });
195
234
  }
@@ -197,14 +236,20 @@ function invalidateCache(sessionName) {
197
236
  // clearAllCache()
198
237
  // =========================================================================
199
238
  /**
200
- * Clear all cache entries and inflight requests.
201
- * Used for graceful shutdown.
239
+ * Clear all cache entries and inflight requests for every session.
240
+ * Called at the start of a worktree's session cleanup (session-cleanup.ts).
241
+ * Issue #3734: advances the global generation so captures started before the
242
+ * clear are not written back. Per-session counts are dropped here because the
243
+ * global generation alone already tells every older snapshot apart.
202
244
  */
203
245
  function clearAllCache() {
204
246
  const cache = getCache();
205
247
  cache.clear();
206
248
  const inflight = getInflight();
207
249
  inflight.clear();
250
+ const state = getGenerationState();
251
+ state.global += 1;
252
+ state.sessions.clear();
208
253
  }
209
254
  // =========================================================================
210
255
  // resetCacheForTesting()
@@ -216,6 +261,7 @@ function clearAllCache() {
216
261
  function resetCacheForTesting() {
217
262
  globalThis.__tmuxCaptureCache = undefined;
218
263
  globalThis.__tmuxCaptureCacheInflight = undefined;
264
+ globalThis.__tmuxCaptureCacheGeneration = undefined;
219
265
  }
220
266
  // =========================================================================
221
267
  // getOrFetchCapture() - singleflight pattern
@@ -247,18 +293,24 @@ async function getOrFetchCapture(sessionName, requestedLines, fetchFn) {
247
293
  return sliceOutput(result, requestedLines);
248
294
  }
249
295
  // 3. Create new fetch promise
296
+ // Issue #3734: snapshot the generation before fetchFn() starts
297
+ const generation = getCaptureGeneration(sessionName);
250
298
  const fetchPromise = fetchFn();
251
299
  inflight.set(sessionName, fetchPromise);
252
300
  try {
253
301
  const output = await fetchPromise;
254
- // Cache non-empty results only [SEC4-007]
255
- if (output.length > 0) {
302
+ // Cache non-empty results only [SEC4-007], and only when no invalidation
303
+ // happened while waiting (Issue #3734)
304
+ if (output.length > 0 && isCaptureGenerationCurrent(sessionName, generation)) {
256
305
  setCachedCapture(sessionName, output, exports.CACHE_MAX_CAPTURE_LINES);
257
306
  }
258
307
  return sliceOutput(output, requestedLines);
259
308
  }
260
309
  finally {
261
- // Clean up inflight entry
262
- inflight.delete(sessionName);
310
+ // Clean up inflight entry, unless an invalidation already replaced it
311
+ // with a newer fetch (Issue #3734)
312
+ if (inflight.get(sessionName) === fetchPromise) {
313
+ inflight.delete(sessionName);
314
+ }
263
315
  }
264
316
  }
@@ -31,6 +31,7 @@ const util_1 = require("util");
31
31
  const tmux_capture_cache_1 = require("./tmux-capture-cache");
32
32
  const geometry_delegation_1 = require("./geometry-delegation");
33
33
  const legacy_session_alias_1 = require("./legacy-session-alias");
34
+ const session_created_signal_1 = require("./session-created-signal");
34
35
  const validation_1 = require("../../lib/cli-tools/validation");
35
36
  const tmux_pane_config_1 = require("../../config/tmux-pane-config");
36
37
  const logger_1 = require("../../lib/logger");
@@ -449,6 +450,9 @@ async function createSession(sessionNameOrOptions, cwd) {
449
450
  const errorMessage = error instanceof Error ? error.message : String(error);
450
451
  throw new Error(`Failed to create tmux session: ${errorMessage}`);
451
452
  }
453
+ // Issue #3796: an Auto-Yes poller waiting for this session ticks now rather
454
+ // than a backoff later. Outside the try: a listener cannot fail the creation.
455
+ (0, session_created_signal_1.notifyTmuxSessionCreated)(sessionName);
452
456
  }
453
457
  /**
454
458
  * Send keys to a tmux session
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * `log_tail` formatting for the built-in `scope` gate (Issue #3647: split out of
4
+ * scope-gate.ts, which re-exports everything public here).
5
+ *
6
+ * @module lib/verification/scope-gate-format
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.SCOPE_PATTERN_ARROW = exports.MAX_REPORTED_VIOLATIONS = void 0;
10
+ exports.formatPatterns = formatPatterns;
11
+ exports.formatDecidedPath = formatDecidedPath;
12
+ exports.formatAdmitted = formatAdmitted;
13
+ exports.formatAgentStateExcluded = formatAgentStateExcluded;
14
+ exports.formatOrchestratorExcluded = formatOrchestratorExcluded;
15
+ /**
16
+ * Violations listed in `log_tail` before the rest are summarised as a count.
17
+ *
18
+ * A worker that ran in the wrong directory can put thousands of paths out of
19
+ * scope, and log_tail is stored per gate in SQLite.
20
+ */
21
+ exports.MAX_REPORTED_VIOLATIONS = 100;
22
+ /**
23
+ * Separator between a reported path and the pattern that decided it (#1841).
24
+ *
25
+ * Mirrored by the CLI's scope-evidence parser (`src/cli/commands/verify.ts`,
26
+ * SCOPE_PATTERN_ARROW): the gate's report is the only carrier for this evidence
27
+ * — `verification_gate_results` has columns for a status, an exit code and a log
28
+ * body, and nothing else — so the two constants have to agree. A round-trip
29
+ * test feeds a real `evaluateScope` report through that parser rather than
30
+ * trusting the two copies to be edited together.
31
+ *
32
+ * A path containing this exact three-character sequence would split wrongly on
33
+ * the way back. Nothing prevents such a filename; it is accepted because the
34
+ * alternative — encoding paths in a log a human reads first — costs every
35
+ * reader something to protect against a file no repository has.
36
+ */
37
+ exports.SCOPE_PATTERN_ARROW = ' \u2190 ';
38
+ function formatPatterns(patterns) {
39
+ return patterns.length > 0 ? patterns.join(', ') : '(none)';
40
+ }
41
+ /**
42
+ * One reported path, optionally naming the rule that decided it (#1841).
43
+ *
44
+ * Admitted paths lead with `+` rather than `-` so the two sections cannot be
45
+ * confused by a reader — or by a grep — that has only one line in front of it.
46
+ */
47
+ function formatDecidedPath(marker, path, pattern) {
48
+ if (pattern === null)
49
+ return ` ${marker} ${path}`;
50
+ return ` ${marker} ${path}${exports.SCOPE_PATTERN_ARROW}${pattern}`;
51
+ }
52
+ /**
53
+ * The `admitted:` section: what this run was allowed to change, and by which
54
+ * rule (#1841).
55
+ *
56
+ * With an `allow` of exact paths the pattern *is* the file and this adds
57
+ * nothing, but #1546 made globs legal, and `src/**` leaves no record of what it
58
+ * actually covered on the day it ran. The contract is the claim; this is the
59
+ * evidence for it, and it has to survive in `log_tail` because the run's own
60
+ * working tree will have moved on by the time anyone asks.
61
+ *
62
+ * Capped by the same rule as the violations, for the same reason (log_tail is
63
+ * stored per gate in SQLite), and the truncation is stated rather than silent —
64
+ * a list that stops at 100 with no marker reads as a complete one.
65
+ */
66
+ function formatAdmitted(admitted) {
67
+ if (admitted.length === 0)
68
+ return [];
69
+ const listed = admitted.slice(0, exports.MAX_REPORTED_VIOLATIONS);
70
+ const remainder = admitted.length - listed.length;
71
+ return [
72
+ 'admitted:',
73
+ ...listed.map((entry) => formatDecidedPath('+', entry.path, entry.pattern)),
74
+ // Worded `(+N more)` rather than the violations' `... and N more`: the two
75
+ // sections are capped independently and a reader scanning a truncated
76
+ // report should not have to work out which count belongs to which list.
77
+ ...(remainder > 0 ? [` ... (+${remainder} more)`] : []),
78
+ ];
79
+ }
80
+ /** The `excluded:` section naming agent-managed state files left out (#3126). */
81
+ function formatAgentStateExcluded(excluded) {
82
+ if (excluded.length === 0)
83
+ return [];
84
+ const listed = excluded.slice(0, exports.MAX_REPORTED_VIOLATIONS);
85
+ const remainder = excluded.length - listed.length;
86
+ return [
87
+ 'excluded (agent-managed state files, not counted as change):',
88
+ ...listed.map((path) => ` ~ ${path}`),
89
+ ...(remainder > 0 ? [` ... (+${remainder} more)`] : []),
90
+ ];
91
+ }
92
+ /** The `excluded:` section naming orchestrator-only committed paths (#3588). */
93
+ function formatOrchestratorExcluded(excluded) {
94
+ if (excluded.length === 0)
95
+ return [];
96
+ return [
97
+ 'excluded (changed only by orchestrator commits, not counted as change):',
98
+ ...excluded.map((path) => ` ~ ${path}`),
99
+ ];
100
+ }
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ /**
3
+ * Scope glob matching for the built-in `scope` gate (Issue #3647: split out of
4
+ * scope-gate.ts, which re-exports everything public here).
5
+ *
6
+ * @module lib/verification/scope-gate-glob
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ScopeMatcher = exports.SCOPE_EXEMPT_CONTRACT_PATH = exports.SCOPE_EXEMPT_ALWAYS_ALLOWED = exports.ALWAYS_ALLOWED_PREFIX = void 0;
10
+ /**
11
+ * Paths that are in scope no matter what the contract says.
12
+ *
13
+ * The contract file lives here, so a contract whose own `allow` list forgot to
14
+ * mention `.commandmate/` would fail the moment it was committed — the scope
15
+ * declaration would make its own storage a violation. The exemption covers the
16
+ * `allow` requirement only; an explicit `deny` still applies, because a deny is
17
+ * a deliberate prohibition and silently ignoring one is worse than the accident
18
+ * this exemption prevents.
19
+ */
20
+ exports.ALWAYS_ALLOWED_PREFIX = '.commandmate/';
21
+ /**
22
+ * Stand-ins for the two ways a path is admitted without matching `allow`.
23
+ *
24
+ * Parenthesised so they cannot be mistaken for a pattern the contract declared:
25
+ * a reader who greps the contract for `(exempt: .commandmate/)` should find
26
+ * nothing, because nothing there put it in scope.
27
+ */
28
+ exports.SCOPE_EXEMPT_ALWAYS_ALLOWED = `(exempt: ${exports.ALWAYS_ALLOWED_PREFIX})`;
29
+ exports.SCOPE_EXEMPT_CONTRACT_PATH = '(exempt: contract path)';
30
+ // =============================================================================
31
+ // Glob matching
32
+ // =============================================================================
33
+ /**
34
+ * Translate a scope glob into an anchored regular expression.
35
+ *
36
+ * Deliberately a small, documented subset rather than a glob library. The
37
+ * semantics are fixed in docs/design/task-contract.md §2.2:
38
+ *
39
+ * - `**` as a whole path segment crosses directory boundaries, including zero of
40
+ * them: `a/**` matches `a/b` and `a/b/c`, `**\/*.ts` matches `x.ts`.
41
+ * - `*` and `?` never cross `/`. Leading dots are ordinary characters, so
42
+ * `.github/**` and `*.md` behave the way they read.
43
+ * - `{a,b}` is alternation, nestable. Unbalanced braces are literal, as in a
44
+ * shell — `src/{a` is a path with a brace in it, not a syntax error.
45
+ * - `[` and `]` are **literal**. This repository routes through
46
+ * `src/app/proxy/[...path]/`, and treating those as character classes would
47
+ * make the pattern that names them match nothing at all — a silent no-match is
48
+ * the failure mode this gate exists to avoid.
49
+ * - A pattern that matches a directory also matches everything beneath it, so
50
+ * `src/lib`, `src/lib/` and `src/lib/**` all mean the same thing. Without this
51
+ * rule, `allow: ["src/lib/verification"]` — the way people write a directory —
52
+ * would put every file inside it out of scope.
53
+ */
54
+ function globToRegExp(rawPattern) {
55
+ // A trailing slash carries no information once the rule above applies.
56
+ const pattern = rawPattern.replace(/\/+$/, '');
57
+ const bracesBalanced = hasBalancedBraces(pattern);
58
+ let source = '';
59
+ let depth = 0;
60
+ let i = 0;
61
+ while (i < pattern.length) {
62
+ const char = pattern[i];
63
+ if (char === '*') {
64
+ let end = i;
65
+ while (pattern[end] === '*')
66
+ end += 1;
67
+ const isGlobstar = end - i > 1;
68
+ const atSegmentStart = i === 0 || pattern[i - 1] === '/';
69
+ if (isGlobstar && atSegmentStart && pattern[end] === '/') {
70
+ // Consume the following slash too: `a/**/b` has to match `a/b`.
71
+ source += '(?:[^/]*/)*';
72
+ i = end + 1;
73
+ continue;
74
+ }
75
+ if (isGlobstar && atSegmentStart && end === pattern.length) {
76
+ source += '.*';
77
+ i = end;
78
+ continue;
79
+ }
80
+ // `**` that is not a whole segment (`a**b`) cannot mean "cross
81
+ // directories" without also matching `a/x/b`, which the pattern does not
82
+ // say. Collapse it to a single-segment wildcard.
83
+ source += '[^/]*';
84
+ i = end;
85
+ continue;
86
+ }
87
+ if (char === '?') {
88
+ source += '[^/]';
89
+ i += 1;
90
+ continue;
91
+ }
92
+ if (bracesBalanced && char === '{') {
93
+ depth += 1;
94
+ source += '(?:';
95
+ i += 1;
96
+ continue;
97
+ }
98
+ if (bracesBalanced && char === '}' && depth > 0) {
99
+ depth -= 1;
100
+ source += ')';
101
+ i += 1;
102
+ continue;
103
+ }
104
+ if (bracesBalanced && char === ',' && depth > 0) {
105
+ source += '|';
106
+ i += 1;
107
+ continue;
108
+ }
109
+ source += char.replace(/[.*+?^${}()|[\]\\]/, '\\$&');
110
+ i += 1;
111
+ }
112
+ return new RegExp(`^${source}(?:/.*)?$`);
113
+ }
114
+ function hasBalancedBraces(pattern) {
115
+ let depth = 0;
116
+ for (const char of pattern) {
117
+ if (char === '{')
118
+ depth += 1;
119
+ else if (char === '}') {
120
+ depth -= 1;
121
+ if (depth < 0)
122
+ return false;
123
+ }
124
+ }
125
+ return depth === 0;
126
+ }
127
+ function compilePattern(pattern) {
128
+ return { pattern, regexp: globToRegExp(pattern) };
129
+ }
130
+ /**
131
+ * A scope declaration compiled once per run.
132
+ *
133
+ * Compiling per pattern per file would rebuild the same regexes for every one of
134
+ * potentially thousands of changed paths.
135
+ */
136
+ class ScopeMatcher {
137
+ contractPath;
138
+ allow;
139
+ deny;
140
+ /**
141
+ * @param contractPath the contract's own path, exempted alongside
142
+ * {@link ALWAYS_ALLOWED_PREFIX} for contracts kept outside `.commandmate/`
143
+ */
144
+ constructor(scope, contractPath = null) {
145
+ this.contractPath = contractPath;
146
+ this.allow = scope.allow.map(compilePattern);
147
+ this.deny = scope.deny.map(compilePattern);
148
+ }
149
+ /**
150
+ * Which declared rule decided `path`, and which way (#1841).
151
+ *
152
+ * The **first** matching pattern is reported, in the contract's declaration
153
+ * order, on both sides. Reporting the last would name a rule the reader
154
+ * cannot use: `allow: ["src/**", "src/lib/**"]` admits `src/lib/a.ts` under
155
+ * the first entry, and deleting the second changes nothing about the verdict.
156
+ *
157
+ * `path` is a repository-root-relative POSIX path as git reports it.
158
+ */
159
+ classify(path) {
160
+ const denied = this.deny.find((entry) => entry.regexp.test(path));
161
+ if (denied)
162
+ return { admitted: false, pattern: denied.pattern };
163
+ if (path.startsWith(exports.ALWAYS_ALLOWED_PREFIX)) {
164
+ return { admitted: true, pattern: exports.SCOPE_EXEMPT_ALWAYS_ALLOWED };
165
+ }
166
+ if (path === this.contractPath) {
167
+ return { admitted: true, pattern: exports.SCOPE_EXEMPT_CONTRACT_PATH };
168
+ }
169
+ const allowed = this.allow.find((entry) => entry.regexp.test(path));
170
+ return allowed
171
+ ? { admitted: true, pattern: allowed.pattern }
172
+ : { admitted: false, pattern: null };
173
+ }
174
+ /**
175
+ * Whether `path` is a scope violation.
176
+ *
177
+ * Delegates to {@link classify} rather than repeating the rules: the verdict
178
+ * and the evidence for it must never be able to disagree, and two copies of
179
+ * "deny wins, then the exemptions, then allow" is exactly how they would.
180
+ */
181
+ isViolation(path) {
182
+ return !this.classify(path).admitted;
183
+ }
184
+ }
185
+ exports.ScopeMatcher = ScopeMatcher;