commandmate 0.20.0 → 0.21.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 (558) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +252 -238
  3. package/.next/app-path-routes-manifest.json +38 -36
  4. package/.next/build-manifest.json +2 -2
  5. package/.next/prerender-manifest.json +3 -3
  6. package/.next/required-server-files.json +1 -1
  7. package/.next/routes-manifest.json +18 -0
  8. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update-check/route.js +1 -1
  11. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/messages/route.js +1 -1
  15. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/session/route.js +1 -1
  17. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/login/route.js +1 -1
  22. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/auth/logout/route.js +1 -1
  24. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/auth/status/route.js +1 -1
  26. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  29. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/fs/recent-paths/route.js +1 -1
  34. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/hooks/agent-event/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  37. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/metrics/vibe/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  41. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  42. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  45. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  47. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/repositories/route.js +1 -1
  53. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  54. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  55. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  56. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -1
  57. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/skills/installations/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/skills/operations/route.js +2 -2
  61. package/.next/server/app/api/skills/operations/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/skills/reindex/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/tasks/[taskId]/cancel/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/tasks/[taskId]/route.js +1 -1
  67. package/.next/server/app/api/tasks/[taskId]/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  70. package/.next/server/app/api/todos/route.js +1 -1
  71. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  72. package/.next/server/app/api/verification/runs/[runId]/route.js +1 -1
  73. package/.next/server/app/api/verification/runs/[runId]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/verification/runs/route.js +1 -1
  75. package/.next/server/app/api/verification/runs/route_client-reference-manifest.js +1 -1
  76. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  79. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  82. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  85. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  88. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  91. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  94. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  97. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  100. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  103. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  106. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  121. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  124. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  127. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  130. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  133. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  136. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  139. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  142. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route.js.nft.json +1 -1
  147. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route_client-reference-manifest.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  150. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  153. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  156. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  159. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js +1 -0
  161. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route.js.nft.json +1 -0
  162. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update/route_client-reference-manifest.js +1 -0
  163. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js +1 -0
  164. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.js.nft.json +1 -0
  165. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/update-plan/route_client-reference-manifest.js +1 -0
  166. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/tasks/route.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/tasks/route_client-reference-manifest.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  175. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  178. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  181. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  184. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  187. package/.next/server/app/api/worktrees/[id]/verify/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/verify/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/verify/runs/[runId]/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/verify/runs/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/verify/runs/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  197. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  198. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  199. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  200. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  201. package/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  204. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  205. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  206. package/.next/server/app/skills/[skillId]/page.js +2 -2
  207. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  208. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  209. package/.next/server/app/skills/installed/page_client-reference-manifest.js +1 -1
  210. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  211. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  212. package/.next/server/app/worktrees/[id]/page.js +5 -5
  213. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  214. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  215. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  216. package/.next/server/app-paths-manifest.json +38 -36
  217. package/.next/server/chunks/1029.js +1 -1
  218. package/.next/server/chunks/1503.js +1 -1
  219. package/.next/server/chunks/22.js +1 -1
  220. package/.next/server/chunks/2328.js +1 -1
  221. package/.next/server/chunks/2546.js +1 -0
  222. package/.next/server/chunks/2710.js +2 -2
  223. package/.next/server/chunks/28.js +2 -2
  224. package/.next/server/chunks/3417.js +1 -1
  225. package/.next/server/chunks/365.js +1 -0
  226. package/.next/server/chunks/3736.js +1 -1
  227. package/.next/server/chunks/3753.js +14 -5
  228. package/.next/server/chunks/4444.js +1 -1
  229. package/.next/server/chunks/5064.js +1 -1
  230. package/.next/server/chunks/5737.js +1 -1
  231. package/.next/server/chunks/5959.js +10 -3
  232. package/.next/server/chunks/6130.js +1 -1
  233. package/.next/server/chunks/6274.js +1 -1
  234. package/.next/server/chunks/6401.js +1 -1
  235. package/.next/server/chunks/848.js +1 -0
  236. package/.next/server/chunks/8536.js +1 -1
  237. package/.next/server/chunks/8584.js +1 -1
  238. package/.next/server/chunks/8807.js +1 -1
  239. package/.next/server/chunks/8856.js +1 -1
  240. package/.next/server/chunks/9058.js +1 -1
  241. package/.next/server/chunks/9360.js +2 -0
  242. package/.next/server/chunks/9687.js +1 -1
  243. package/.next/server/middleware-manifest.json +5 -5
  244. package/.next/server/pages/500.html +1 -1
  245. package/.next/server/server-reference-manifest.json +1 -1
  246. package/.next/static/chunks/{8562-6e2ab32452f4fa5b.js → 2053-52d3c82014e1cd54.js} +1 -1
  247. package/.next/static/chunks/2751-9ef0f4b450bd4ef0.js +1 -0
  248. package/.next/static/chunks/{6488-3e7539550c3ef358.js → 6488-d3cf14e8d95b2d03.js} +1 -1
  249. package/.next/static/chunks/app/api/app/update/route-be21650964d61b1d.js +1 -0
  250. package/.next/static/chunks/app/api/app/update-check/route-be21650964d61b1d.js +1 -0
  251. package/.next/static/chunks/app/api/assistant/conversation/route-be21650964d61b1d.js +1 -0
  252. package/.next/static/chunks/app/api/assistant/current-output/route-be21650964d61b1d.js +1 -0
  253. package/.next/static/chunks/app/api/assistant/messages/route-be21650964d61b1d.js +1 -0
  254. package/.next/static/chunks/app/api/assistant/session/route-be21650964d61b1d.js +1 -0
  255. package/.next/static/chunks/app/api/assistant/start/route-be21650964d61b1d.js +1 -0
  256. package/.next/static/chunks/app/api/assistant/terminal/route-be21650964d61b1d.js +1 -0
  257. package/.next/static/chunks/app/api/assistant/tools/route-be21650964d61b1d.js +1 -0
  258. package/.next/static/chunks/app/api/auth/login/route-be21650964d61b1d.js +1 -0
  259. package/.next/static/chunks/app/api/auth/logout/route-be21650964d61b1d.js +1 -0
  260. package/.next/static/chunks/app/api/auth/status/route-be21650964d61b1d.js +1 -0
  261. package/.next/static/chunks/app/api/daily-summary/route-be21650964d61b1d.js +1 -0
  262. package/.next/static/chunks/app/api/daily-summary/status/route-be21650964d61b1d.js +1 -0
  263. package/.next/static/chunks/app/api/external-apps/[id]/health/route-be21650964d61b1d.js +1 -0
  264. package/.next/static/chunks/app/api/external-apps/[id]/route-be21650964d61b1d.js +1 -0
  265. package/.next/static/chunks/app/api/external-apps/route-be21650964d61b1d.js +1 -0
  266. package/.next/static/chunks/app/api/fs/browse/route-be21650964d61b1d.js +1 -0
  267. package/.next/static/chunks/app/api/fs/recent-paths/route-be21650964d61b1d.js +1 -0
  268. package/.next/static/chunks/app/api/hooks/agent-event/route-be21650964d61b1d.js +1 -0
  269. package/.next/static/chunks/app/api/hooks/claude-done/route-be21650964d61b1d.js +1 -0
  270. package/.next/static/chunks/app/api/metrics/vibe/route-be21650964d61b1d.js +1 -0
  271. package/.next/static/chunks/app/api/ollama/models/route-be21650964d61b1d.js +1 -0
  272. package/.next/static/chunks/app/api/push/subscriptions/route-be21650964d61b1d.js +1 -0
  273. package/.next/static/chunks/app/api/push/vapid/route-be21650964d61b1d.js +1 -0
  274. package/.next/static/chunks/app/api/repositories/[id]/route-be21650964d61b1d.js +1 -0
  275. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-be21650964d61b1d.js +1 -0
  276. package/.next/static/chunks/app/api/repositories/[id]/todos/route-be21650964d61b1d.js +1 -0
  277. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-be21650964d61b1d.js +1 -0
  278. package/.next/static/chunks/app/api/repositories/clone/route-be21650964d61b1d.js +1 -0
  279. package/.next/static/chunks/app/api/repositories/excluded/route-be21650964d61b1d.js +1 -0
  280. package/.next/static/chunks/app/api/repositories/restore/route-be21650964d61b1d.js +1 -0
  281. package/.next/static/chunks/app/api/repositories/route-be21650964d61b1d.js +1 -0
  282. package/.next/static/chunks/app/api/repositories/scan/route-be21650964d61b1d.js +1 -0
  283. package/.next/static/chunks/app/api/repositories/sync/route-be21650964d61b1d.js +1 -0
  284. package/.next/static/chunks/app/api/repositories/validate-path/route-be21650964d61b1d.js +1 -0
  285. package/.next/static/chunks/app/api/sidebar/group-order/route-be21650964d61b1d.js +1 -0
  286. package/.next/static/chunks/app/api/skills/[id]/route-be21650964d61b1d.js +1 -0
  287. package/.next/static/chunks/app/api/skills/installations/route-be21650964d61b1d.js +1 -0
  288. package/.next/static/chunks/app/api/skills/operations/route-be21650964d61b1d.js +1 -0
  289. package/.next/static/chunks/app/api/skills/reindex/route-be21650964d61b1d.js +1 -0
  290. package/.next/static/chunks/app/api/skills/route-be21650964d61b1d.js +1 -0
  291. package/.next/static/chunks/app/api/slash-commands/route-be21650964d61b1d.js +1 -0
  292. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-be21650964d61b1d.js +1 -0
  293. package/.next/static/chunks/app/api/tasks/[taskId]/route-be21650964d61b1d.js +1 -0
  294. package/.next/static/chunks/app/api/templates/[id]/route-be21650964d61b1d.js +1 -0
  295. package/.next/static/chunks/app/api/templates/route-be21650964d61b1d.js +1 -0
  296. package/.next/static/chunks/app/api/todos/route-be21650964d61b1d.js +1 -0
  297. package/.next/static/chunks/app/api/verification/runs/[runId]/route-be21650964d61b1d.js +1 -0
  298. package/.next/static/chunks/app/api/verification/runs/route-be21650964d61b1d.js +1 -0
  299. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-be21650964d61b1d.js +1 -0
  300. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-be21650964d61b1d.js +1 -0
  301. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-be21650964d61b1d.js +1 -0
  302. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-be21650964d61b1d.js +1 -0
  303. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-be21650964d61b1d.js +1 -0
  304. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-be21650964d61b1d.js +1 -0
  305. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-be21650964d61b1d.js +1 -0
  306. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-be21650964d61b1d.js +1 -0
  307. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-be21650964d61b1d.js +1 -0
  308. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-be21650964d61b1d.js +1 -0
  309. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-be21650964d61b1d.js +1 -0
  310. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-be21650964d61b1d.js +1 -0
  311. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-be21650964d61b1d.js +1 -0
  312. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-be21650964d61b1d.js +1 -0
  313. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-be21650964d61b1d.js +1 -0
  314. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-be21650964d61b1d.js +1 -0
  315. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-be21650964d61b1d.js +1 -0
  316. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-be21650964d61b1d.js +1 -0
  317. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-be21650964d61b1d.js +1 -0
  318. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-be21650964d61b1d.js +1 -0
  319. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-be21650964d61b1d.js +1 -0
  320. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-be21650964d61b1d.js +1 -0
  321. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-be21650964d61b1d.js +1 -0
  322. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-be21650964d61b1d.js +1 -0
  323. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-be21650964d61b1d.js +1 -0
  324. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-be21650964d61b1d.js +1 -0
  325. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-be21650964d61b1d.js +1 -0
  326. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-be21650964d61b1d.js +1 -0
  327. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-be21650964d61b1d.js +1 -0
  328. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-be21650964d61b1d.js +1 -0
  329. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-be21650964d61b1d.js +1 -0
  330. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-be21650964d61b1d.js +1 -0
  331. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-be21650964d61b1d.js +1 -0
  332. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-be21650964d61b1d.js +1 -0
  333. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-be21650964d61b1d.js +1 -0
  334. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-be21650964d61b1d.js +1 -0
  335. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-be21650964d61b1d.js +1 -0
  336. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-be21650964d61b1d.js +1 -0
  337. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-be21650964d61b1d.js +1 -0
  338. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-be21650964d61b1d.js +1 -0
  339. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-be21650964d61b1d.js +1 -0
  340. package/.next/static/chunks/app/api/worktrees/[id]/route-be21650964d61b1d.js +1 -0
  341. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-be21650964d61b1d.js +1 -0
  342. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-be21650964d61b1d.js +1 -0
  343. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-be21650964d61b1d.js +1 -0
  344. package/.next/static/chunks/app/api/worktrees/[id]/search/route-be21650964d61b1d.js +1 -0
  345. package/.next/static/chunks/app/api/worktrees/[id]/send/route-be21650964d61b1d.js +1 -0
  346. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-be21650964d61b1d.js +1 -0
  347. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-be21650964d61b1d.js +1 -0
  348. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-be21650964d61b1d.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-be21650964d61b1d.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-be21650964d61b1d.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update/route-be21650964d61b1d.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/update-plan/route-be21650964d61b1d.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-be21650964d61b1d.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-be21650964d61b1d.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-be21650964d61b1d.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-be21650964d61b1d.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-be21650964d61b1d.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-be21650964d61b1d.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-be21650964d61b1d.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-be21650964d61b1d.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-be21650964d61b1d.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-be21650964d61b1d.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-be21650964d61b1d.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-be21650964d61b1d.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-be21650964d61b1d.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-be21650964d61b1d.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-be21650964d61b1d.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-be21650964d61b1d.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-be21650964d61b1d.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/route-be21650964d61b1d.js +1 -0
  371. package/.next/static/chunks/app/manifest.webmanifest/route-be21650964d61b1d.js +1 -0
  372. package/.next/static/chunks/app/proxy/[...path]/route-be21650964d61b1d.js +1 -0
  373. package/.next/static/chunks/app/skills/[skillId]/page-10d6f983e5f06ffb.js +1 -0
  374. package/.next/static/chunks/app/worktrees/[id]/layout-be21650964d61b1d.js +1 -0
  375. package/.next/static/chunks/app/worktrees/[id]/page-77b0ee35da06da00.js +1 -0
  376. package/.next/trace +12 -12
  377. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/update/route.ts +347 -0
  378. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/update-plan/route.ts +347 -0
  379. package/.next/types/routes.d.ts +3 -1
  380. package/.next/types/validator.ts +18 -0
  381. package/dist/cli/commands/auto-yes.js +1 -1
  382. package/dist/cli/commands/capture.d.ts +1 -0
  383. package/dist/cli/commands/capture.d.ts.map +1 -1
  384. package/dist/cli/commands/capture.js +112 -0
  385. package/dist/cli/commands/respond.d.ts.map +1 -1
  386. package/dist/cli/commands/respond.js +31 -6
  387. package/dist/cli/commands/send.js +2 -2
  388. package/dist/cli/commands/skill-format.d.ts +7 -1
  389. package/dist/cli/commands/skill-format.d.ts.map +1 -1
  390. package/dist/cli/commands/skill-format.js +67 -0
  391. package/dist/cli/commands/skill.d.ts +2 -0
  392. package/dist/cli/commands/skill.d.ts.map +1 -1
  393. package/dist/cli/commands/skill.js +149 -0
  394. package/dist/cli/commands/sync.d.ts +14 -0
  395. package/dist/cli/commands/sync.d.ts.map +1 -0
  396. package/dist/cli/commands/sync.js +53 -0
  397. package/dist/cli/commands/wait.d.ts.map +1 -1
  398. package/dist/cli/commands/wait.js +72 -1
  399. package/dist/cli/docs/agent-operations.d.ts +1 -1
  400. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  401. package/dist/cli/docs/agent-operations.js +25 -3
  402. package/dist/cli/program.d.ts.map +1 -1
  403. package/dist/cli/program.js +3 -0
  404. package/dist/cli/types/api-responses.d.ts +201 -0
  405. package/dist/cli/types/api-responses.d.ts.map +1 -1
  406. package/dist/cli/types/index.d.ts +31 -0
  407. package/dist/cli/types/index.d.ts.map +1 -1
  408. package/dist/cli/utils/verify-runner.d.ts +9 -0
  409. package/dist/cli/utils/verify-runner.d.ts.map +1 -1
  410. package/dist/cli/utils/verify-runner.js +28 -2
  411. package/dist/config/history-display-config.d.ts +61 -0
  412. package/dist/config/history-display-config.d.ts.map +1 -0
  413. package/dist/config/history-display-config.js +62 -0
  414. package/dist/server/src/lib/auto-yes-poller.js +49 -0
  415. package/dist/server/src/lib/db/chat-db.js +75 -1
  416. package/dist/server/src/lib/db/db.js +4 -3
  417. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +122 -4
  418. package/dist/server/src/lib/detection/prompt-detector.js +39 -3
  419. package/dist/server/src/lib/polling/auto-yes-resolver.js +14 -5
  420. package/dist/server/src/lib/polling/auto-yes-suppression-state.js +54 -0
  421. package/dist/server/src/lib/session/current-output-builder.js +2 -0
  422. package/dist/server/src/lib/skills/install-apply.js +63 -23
  423. package/dist/server/src/lib/skills/operation-audit.js +5 -6
  424. package/dist/server/src/lib/skills/startup-reconcile.js +26 -5
  425. package/dist/server/src/lib/skills/updater.js +830 -0
  426. package/package.json +1 -1
  427. package/.next/server/chunks/3042.js +0 -1
  428. package/.next/server/chunks/4440.js +0 -2
  429. package/.next/server/chunks/4548.js +0 -1
  430. package/.next/server/chunks/5793.js +0 -1
  431. package/.next/static/chunks/2751-7fabd91275b14ca3.js +0 -1
  432. package/.next/static/chunks/app/api/app/update/route-5bdd550ed6386f57.js +0 -1
  433. package/.next/static/chunks/app/api/app/update-check/route-5bdd550ed6386f57.js +0 -1
  434. package/.next/static/chunks/app/api/assistant/conversation/route-5bdd550ed6386f57.js +0 -1
  435. package/.next/static/chunks/app/api/assistant/current-output/route-5bdd550ed6386f57.js +0 -1
  436. package/.next/static/chunks/app/api/assistant/messages/route-5bdd550ed6386f57.js +0 -1
  437. package/.next/static/chunks/app/api/assistant/session/route-5bdd550ed6386f57.js +0 -1
  438. package/.next/static/chunks/app/api/assistant/start/route-5bdd550ed6386f57.js +0 -1
  439. package/.next/static/chunks/app/api/assistant/terminal/route-5bdd550ed6386f57.js +0 -1
  440. package/.next/static/chunks/app/api/assistant/tools/route-5bdd550ed6386f57.js +0 -1
  441. package/.next/static/chunks/app/api/auth/login/route-5bdd550ed6386f57.js +0 -1
  442. package/.next/static/chunks/app/api/auth/logout/route-5bdd550ed6386f57.js +0 -1
  443. package/.next/static/chunks/app/api/auth/status/route-5bdd550ed6386f57.js +0 -1
  444. package/.next/static/chunks/app/api/daily-summary/route-5bdd550ed6386f57.js +0 -1
  445. package/.next/static/chunks/app/api/daily-summary/status/route-5bdd550ed6386f57.js +0 -1
  446. package/.next/static/chunks/app/api/external-apps/[id]/health/route-5bdd550ed6386f57.js +0 -1
  447. package/.next/static/chunks/app/api/external-apps/[id]/route-5bdd550ed6386f57.js +0 -1
  448. package/.next/static/chunks/app/api/external-apps/route-5bdd550ed6386f57.js +0 -1
  449. package/.next/static/chunks/app/api/fs/browse/route-5bdd550ed6386f57.js +0 -1
  450. package/.next/static/chunks/app/api/fs/recent-paths/route-5bdd550ed6386f57.js +0 -1
  451. package/.next/static/chunks/app/api/hooks/agent-event/route-5bdd550ed6386f57.js +0 -1
  452. package/.next/static/chunks/app/api/hooks/claude-done/route-5bdd550ed6386f57.js +0 -1
  453. package/.next/static/chunks/app/api/metrics/vibe/route-5bdd550ed6386f57.js +0 -1
  454. package/.next/static/chunks/app/api/ollama/models/route-5bdd550ed6386f57.js +0 -1
  455. package/.next/static/chunks/app/api/push/subscriptions/route-5bdd550ed6386f57.js +0 -1
  456. package/.next/static/chunks/app/api/push/vapid/route-5bdd550ed6386f57.js +0 -1
  457. package/.next/static/chunks/app/api/repositories/[id]/route-5bdd550ed6386f57.js +0 -1
  458. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +0 -1
  459. package/.next/static/chunks/app/api/repositories/[id]/todos/route-5bdd550ed6386f57.js +0 -1
  460. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-5bdd550ed6386f57.js +0 -1
  461. package/.next/static/chunks/app/api/repositories/clone/route-5bdd550ed6386f57.js +0 -1
  462. package/.next/static/chunks/app/api/repositories/excluded/route-5bdd550ed6386f57.js +0 -1
  463. package/.next/static/chunks/app/api/repositories/restore/route-5bdd550ed6386f57.js +0 -1
  464. package/.next/static/chunks/app/api/repositories/route-5bdd550ed6386f57.js +0 -1
  465. package/.next/static/chunks/app/api/repositories/scan/route-5bdd550ed6386f57.js +0 -1
  466. package/.next/static/chunks/app/api/repositories/sync/route-5bdd550ed6386f57.js +0 -1
  467. package/.next/static/chunks/app/api/repositories/validate-path/route-5bdd550ed6386f57.js +0 -1
  468. package/.next/static/chunks/app/api/sidebar/group-order/route-5bdd550ed6386f57.js +0 -1
  469. package/.next/static/chunks/app/api/skills/[id]/route-5bdd550ed6386f57.js +0 -1
  470. package/.next/static/chunks/app/api/skills/installations/route-5bdd550ed6386f57.js +0 -1
  471. package/.next/static/chunks/app/api/skills/operations/route-5bdd550ed6386f57.js +0 -1
  472. package/.next/static/chunks/app/api/skills/reindex/route-5bdd550ed6386f57.js +0 -1
  473. package/.next/static/chunks/app/api/skills/route-5bdd550ed6386f57.js +0 -1
  474. package/.next/static/chunks/app/api/slash-commands/route-5bdd550ed6386f57.js +0 -1
  475. package/.next/static/chunks/app/api/tasks/[taskId]/cancel/route-5bdd550ed6386f57.js +0 -1
  476. package/.next/static/chunks/app/api/tasks/[taskId]/route-5bdd550ed6386f57.js +0 -1
  477. package/.next/static/chunks/app/api/templates/[id]/route-5bdd550ed6386f57.js +0 -1
  478. package/.next/static/chunks/app/api/templates/route-5bdd550ed6386f57.js +0 -1
  479. package/.next/static/chunks/app/api/todos/route-5bdd550ed6386f57.js +0 -1
  480. package/.next/static/chunks/app/api/verification/runs/[runId]/route-5bdd550ed6386f57.js +0 -1
  481. package/.next/static/chunks/app/api/verification/runs/route-5bdd550ed6386f57.js +0 -1
  482. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-5bdd550ed6386f57.js +0 -1
  483. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-5bdd550ed6386f57.js +0 -1
  484. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-5bdd550ed6386f57.js +0 -1
  485. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-5bdd550ed6386f57.js +0 -1
  486. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-5bdd550ed6386f57.js +0 -1
  487. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-5bdd550ed6386f57.js +0 -1
  488. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-5bdd550ed6386f57.js +0 -1
  489. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-5bdd550ed6386f57.js +0 -1
  490. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-5bdd550ed6386f57.js +0 -1
  491. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-5bdd550ed6386f57.js +0 -1
  492. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-5bdd550ed6386f57.js +0 -1
  493. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-5bdd550ed6386f57.js +0 -1
  494. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-5bdd550ed6386f57.js +0 -1
  495. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-5bdd550ed6386f57.js +0 -1
  496. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-5bdd550ed6386f57.js +0 -1
  497. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-5bdd550ed6386f57.js +0 -1
  498. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-5bdd550ed6386f57.js +0 -1
  499. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-5bdd550ed6386f57.js +0 -1
  500. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-5bdd550ed6386f57.js +0 -1
  501. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-5bdd550ed6386f57.js +0 -1
  502. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-5bdd550ed6386f57.js +0 -1
  503. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-5bdd550ed6386f57.js +0 -1
  504. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-5bdd550ed6386f57.js +0 -1
  505. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-5bdd550ed6386f57.js +0 -1
  506. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-5bdd550ed6386f57.js +0 -1
  507. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-5bdd550ed6386f57.js +0 -1
  508. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-5bdd550ed6386f57.js +0 -1
  509. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-5bdd550ed6386f57.js +0 -1
  510. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-5bdd550ed6386f57.js +0 -1
  511. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-5bdd550ed6386f57.js +0 -1
  512. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-5bdd550ed6386f57.js +0 -1
  513. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-5bdd550ed6386f57.js +0 -1
  514. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-5bdd550ed6386f57.js +0 -1
  515. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-5bdd550ed6386f57.js +0 -1
  516. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-5bdd550ed6386f57.js +0 -1
  517. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-5bdd550ed6386f57.js +0 -1
  518. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-5bdd550ed6386f57.js +0 -1
  519. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-5bdd550ed6386f57.js +0 -1
  520. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-5bdd550ed6386f57.js +0 -1
  521. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-5bdd550ed6386f57.js +0 -1
  522. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-5bdd550ed6386f57.js +0 -1
  523. package/.next/static/chunks/app/api/worktrees/[id]/route-5bdd550ed6386f57.js +0 -1
  524. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-5bdd550ed6386f57.js +0 -1
  525. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-5bdd550ed6386f57.js +0 -1
  526. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-5bdd550ed6386f57.js +0 -1
  527. package/.next/static/chunks/app/api/worktrees/[id]/search/route-5bdd550ed6386f57.js +0 -1
  528. package/.next/static/chunks/app/api/worktrees/[id]/send/route-5bdd550ed6386f57.js +0 -1
  529. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/git-workflow/route-5bdd550ed6386f57.js +0 -1
  530. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-5bdd550ed6386f57.js +0 -1
  531. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-5bdd550ed6386f57.js +0 -1
  532. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-5bdd550ed6386f57.js +0 -1
  533. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-5bdd550ed6386f57.js +0 -1
  534. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-5bdd550ed6386f57.js +0 -1
  535. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-5bdd550ed6386f57.js +0 -1
  536. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-5bdd550ed6386f57.js +0 -1
  537. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-5bdd550ed6386f57.js +0 -1
  538. package/.next/static/chunks/app/api/worktrees/[id]/tasks/route-5bdd550ed6386f57.js +0 -1
  539. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-5bdd550ed6386f57.js +0 -1
  540. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-5bdd550ed6386f57.js +0 -1
  541. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-5bdd550ed6386f57.js +0 -1
  542. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-5bdd550ed6386f57.js +0 -1
  543. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-5bdd550ed6386f57.js +0 -1
  544. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-5bdd550ed6386f57.js +0 -1
  545. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-5bdd550ed6386f57.js +0 -1
  546. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-5bdd550ed6386f57.js +0 -1
  547. package/.next/static/chunks/app/api/worktrees/[id]/verify/route-5bdd550ed6386f57.js +0 -1
  548. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/[runId]/route-5bdd550ed6386f57.js +0 -1
  549. package/.next/static/chunks/app/api/worktrees/[id]/verify/runs/route-5bdd550ed6386f57.js +0 -1
  550. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-5bdd550ed6386f57.js +0 -1
  551. package/.next/static/chunks/app/api/worktrees/route-5bdd550ed6386f57.js +0 -1
  552. package/.next/static/chunks/app/manifest.webmanifest/route-5bdd550ed6386f57.js +0 -1
  553. package/.next/static/chunks/app/proxy/[...path]/route-5bdd550ed6386f57.js +0 -1
  554. package/.next/static/chunks/app/skills/[skillId]/page-6008b904225ebb25.js +0 -1
  555. package/.next/static/chunks/app/worktrees/[id]/layout-5bdd550ed6386f57.js +0 -1
  556. package/.next/static/chunks/app/worktrees/[id]/page-214ee8b97dca856b.js +0 -1
  557. /package/.next/static/{C01FQOE5FCmB3I_GhMa4_ → E2SxtJGbNcRMnWbCC3i_-}/_buildManifest.js +0 -0
  558. /package/.next/static/{C01FQOE5FCmB3I_GhMa4_ → E2SxtJGbNcRMnWbCC3i_-}/_ssgManifest.js +0 -0
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  /** Multiple choice prompt detection logic extracted from prompt-detector.ts (Issue #575). */
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.APPROVAL_TARGET_MAX_LOOKBACK = void 0;
5
+ exports.findApprovalContextStart = findApprovalContextStart;
6
+ exports.joinApprovalTarget = joinApprovalTarget;
4
7
  exports.buildMultipleChoiceResult = buildMultipleChoiceResult;
5
8
  exports.detectMultipleChoicePrompt = detectMultipleChoicePrompt;
6
9
  const tui_detection_frame_1 = require("./tui-detection-frame");
@@ -56,6 +59,12 @@ const NORMAL_OPTION_PATTERN = /^\s*[^\d]{0,3}(\d+)(?:\.(?!\d)|\s+)\s*(.+)$/;
56
59
  * Anchored at both ends -- ReDoS safe (S4-001).
57
60
  */
58
61
  const SEPARATOR_LINE_PATTERN = /^[-─]+$/;
62
+ /**
63
+ * How many lines above `questionEndIndex` the question text is collected from.
64
+ * Also the point the Issue #1699 approval-context scan starts walking up from,
65
+ * since everything inside this window is already part of `question`.
66
+ */
67
+ const QUESTION_CONTEXT_LINES = 5;
59
68
  /**
60
69
  * Pattern for collapsed-output summary lines rendered by Codex/OpenAI TUI.
61
70
  * Example: "[… 12 lines] ctrl + a view all"
@@ -461,7 +470,7 @@ function extractQuestionText(lines, questionEndIndex) {
461
470
  return 'Please select an option:';
462
471
  }
463
472
  const questionLines = [];
464
- for (let i = Math.max(0, questionEndIndex - 5); i <= questionEndIndex; i++) {
473
+ for (let i = Math.max(0, questionEndIndex - QUESTION_CONTEXT_LINES); i <= questionEndIndex; i++) {
465
474
  const line = lines[i].trim();
466
475
  if (line && !SEPARATOR_LINE_PATTERN.test(line)) {
467
476
  questionLines.push(line);
@@ -489,6 +498,108 @@ function extractInstructionText(lines, questionEndIndex, effectiveEnd) {
489
498
  const joined = blockLines.join('\n').trim();
490
499
  return joined.length > 0 ? joined : undefined;
491
500
  }
501
+ /**
502
+ * Lines that mean "the previous turn ended here" when scanning upward.
503
+ *
504
+ * Every supported CLI renders its transcript as marker-prefixed rows — Claude's
505
+ * tool-use `⏺` and result `⎿`, Codex's activity `•`, its approval receipts `✔`
506
+ * / `✗`, the user's own `›` / `❯` / `>` echo, and its output continuation `└`.
507
+ * The lines a prompt panel puts above its question (a header such as "Bash
508
+ * command", the command itself, a one-line description) never carry one, which
509
+ * is what makes this usable as the panel's upper edge after `stripBoxDrawing`
510
+ * has erased the real box border.
511
+ *
512
+ * Horizontal rules count too: Codex draws one between turns.
513
+ *
514
+ * Anchored at the start of the trimmed line — ReDoS safe (no repetition).
515
+ */
516
+ const TURN_BOUNDARY_PATTERN = /^[⏺⎿●○•✔✓✖✗✘›»❯└├>]/;
517
+ /**
518
+ * How far above the question the approval context may reach (Issue #1699).
519
+ *
520
+ * The boundary marker above is the actual fix; this cap only exists so a frame
521
+ * that happens to contain no marker at all (a bare shell `(y/n)` prompt under
522
+ * plain command output) cannot drag an unbounded scrollback window into the
523
+ * deny surface the way the old fixed 19-line lookback did. Sized for the
524
+ * tallest real permission panel measured: header + blank + a wrapped multi-line
525
+ * command + description + blank.
526
+ */
527
+ exports.APPROVAL_TARGET_MAX_LOOKBACK = 12;
528
+ /** True when this line belongs to a previous turn rather than the prompt panel. */
529
+ function isTurnBoundaryLine(rawLine) {
530
+ if (rawLine === undefined)
531
+ return false;
532
+ const line = rawLine.trim();
533
+ if (line === '')
534
+ return false;
535
+ return TURN_BOUNDARY_PATTERN.test(line) || SEPARATOR_LINE_PATTERN.test(line);
536
+ }
537
+ /**
538
+ * First line index that still belongs to *this* prompt, scanning upward.
539
+ *
540
+ * Walks up from `questionLineIndex - 1` and stops just below the nearest turn
541
+ * boundary; with no boundary in reach it falls back to the lookback cap.
542
+ * Everything above the returned index is a previous turn and must never reach a
543
+ * deny pattern — that poisoning is Issue #1699.
544
+ *
545
+ * Shared by both detector paths: multiple_choice passes its `questionEndIndex`,
546
+ * yes_no the line its pattern matched on.
547
+ *
548
+ * @param lines - Full frame, already ANSI/box stripped
549
+ * @param questionLineIndex - Line the prompt's own question sits on
550
+ * @returns Index of the first line of the current prompt's own block
551
+ */
552
+ function findApprovalContextStart(lines, questionLineIndex) {
553
+ const floor = Math.max(0, questionLineIndex - exports.APPROVAL_TARGET_MAX_LOOKBACK);
554
+ for (let i = questionLineIndex - 1; i >= floor; i--) {
555
+ if (isTurnBoundaryLine(lines[i])) {
556
+ return i + 1;
557
+ }
558
+ }
559
+ return floor;
560
+ }
561
+ /**
562
+ * Join a slice of the frame into an approval-target string.
563
+ *
564
+ * @returns The trimmed block, or undefined when it is empty
565
+ */
566
+ function joinApprovalTarget(lines, start, end) {
567
+ const joined = lines
568
+ .slice(start, end)
569
+ .map(l => l.trimEnd())
570
+ .join('\n')
571
+ .trim();
572
+ return joined.length > 0 ? joined : undefined;
573
+ }
574
+ /**
575
+ * Extract what this multiple-choice prompt is asking approval for (Issue #1699).
576
+ *
577
+ * Same lower bound as {@link extractInstructionText} — the panel runs through
578
+ * its options — but the upper bound is the previous turn's boundary instead of
579
+ * a fixed 19-line lookback.
580
+ *
581
+ * Measured against the live Codex captures in `fixtures/codex-live-1628`: the
582
+ * two `✔ You approved codex to run …` receipts and the `• Ran …` echoes that
583
+ * `instructionText` carries all fall outside, while the `$ git add …` the
584
+ * prompt is actually asking about, and the diff an apply-patch prompt is asking
585
+ * about, both stay inside.
586
+ *
587
+ * Residual, deliberately left alone: `question` itself is built from up to
588
+ * {@link QUESTION_CONTEXT_LINES} lines above `questionEndIndex` and is also part
589
+ * of the deny surface. Narrowing that would change prompt dedup keys and what
590
+ * the UI renders, and it is bounded by the options below it either way.
591
+ *
592
+ * @param lines - Array of output lines
593
+ * @param questionEndIndex - Index of the last line before options, or -1 if not found
594
+ * @param effectiveEnd - End index of non-trailing-empty lines
595
+ * @returns Approval target string, or undefined if no question line found
596
+ */
597
+ function extractApprovalTarget(lines, questionEndIndex, effectiveEnd) {
598
+ if (questionEndIndex < 0) {
599
+ return undefined;
600
+ }
601
+ return joinApprovalTarget(lines, findApprovalContextStart(lines, questionEndIndex), effectiveEnd);
602
+ }
492
603
  /**
493
604
  * Build the final PromptDetectionResult for a multiple choice prompt.
494
605
  * Maps collected options to the output format, checking each option for
@@ -496,14 +607,17 @@ function extractInstructionText(lines, questionEndIndex, effectiveEnd) {
496
607
  *
497
608
  * @param question - Extracted question text
498
609
  * @param collectedOptions - Options collected during Pass 2 scanning
499
- * @param instructionText - Instruction text for the prompt block
610
+ * @param context - Human-facing `instructionText` and machine-facing
611
+ * `approvalTarget` for the prompt block (Issue #1699 split them; an
612
+ * `undefined` here means neither, which is what the pre-#1699 callers meant)
500
613
  * @param output - Original output text (used for rawContent truncation)
501
614
  * @param truncateRawContentFn - Function to truncate raw content
502
615
  * @param submitMode - Optional submit mode for the prompt (Issue #616)
503
616
  * @param isAskUserQuestion - Whether this is a Claude Code v2.x AskUserQuestion picker (Issue #807)
504
617
  * @returns PromptDetectionResult with isPrompt: true and multiple_choice data
505
618
  */
506
- function buildMultipleChoiceResult(question, collectedOptions, instructionText, output, truncateRawContentFn, submitMode, isAskUserQuestion) {
619
+ function buildMultipleChoiceResult(question, collectedOptions, context, output, truncateRawContentFn, submitMode, isAskUserQuestion) {
620
+ const { instructionText, approvalTarget } = context ?? {};
507
621
  return {
508
622
  isPrompt: true,
509
623
  promptData: {
@@ -520,6 +634,7 @@ function buildMultipleChoiceResult(question, collectedOptions, instructionText,
520
634
  }),
521
635
  status: 'pending',
522
636
  instructionText,
637
+ ...(approvalTarget !== undefined ? { approvalTarget } : {}),
523
638
  ...(submitMode ? { submitMode } : {}),
524
639
  ...(isAskUserQuestion ? { isAskUserQuestion: true } : {}),
525
640
  },
@@ -818,9 +933,12 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
818
933
  }
819
934
  const question = extractQuestionText(lines, questionEndIndex);
820
935
  const instructionText = extractInstructionText(lines, questionEndIndex, effectiveEnd);
936
+ // Issue #1699: the same block, cut at the previous turn's boundary. Display
937
+ // keeps the wide window; deny patterns are judged against this one.
938
+ const approvalTarget = extractApprovalTarget(lines, questionEndIndex, effectiveEnd);
821
939
  // Issue #616: Determine submitMode from confirmation footer (detected in single-pass above)
822
940
  const submitMode = hasConfirmationFooter
823
941
  ? (hasNumberFooter ? 'answer_only' : 'answer_then_enter')
824
942
  : undefined;
825
- return buildMultipleChoiceResult(question, collectedOptions, instructionText, output, truncateRawContentFn, submitMode, hasAskUserQuestionFooter);
943
+ return buildMultipleChoiceResult(question, collectedOptions, { instructionText, approvalTarget }, output, truncateRawContentFn, submitMode, hasAskUserQuestionFooter);
826
944
  }
@@ -78,6 +78,33 @@ const YES_NO_PATTERNS = [
78
78
  // (yes/no) - no default
79
79
  { regex: /^(.+)\s+\(yes\/no\)\s*$/m },
80
80
  ];
81
+ /**
82
+ * Where in `lines` a regex match against the joined tail window started and ended.
83
+ *
84
+ * The yes/no patterns are matched against the last 20 lines joined into one
85
+ * string, so a match carries no line number of its own. Issue #1699 needs one:
86
+ * the approval target is bounded relative to the line the prompt is actually on,
87
+ * not relative to the bottom of the pane.
88
+ */
89
+ function locateMatchLines(tailText, tailStart, match) {
90
+ const offset = match.index ?? 0;
91
+ const countNewlines = (text) => text.split('\n').length - 1;
92
+ const startLine = tailStart + countNewlines(tailText.slice(0, offset));
93
+ return { startLine, endLine: startLine + countNewlines(match[0]) };
94
+ }
95
+ /**
96
+ * What a yes/no prompt is asking approval for (Issue #1699).
97
+ *
98
+ * Bounded on both sides, unlike `instructionText`: below at the prompt line
99
+ * itself (nothing printed after the question is part of what it approves) and
100
+ * above at the previous turn's boundary. A shell that echoes the command
101
+ * directly above its `(y/n)` — the case the deny patterns were written for —
102
+ * still lands inside; a command approved in an earlier turn does not.
103
+ */
104
+ function yesNoApprovalTarget(lines, tailText, tailStart, match) {
105
+ const { startLine, endLine } = locateMatchLines(tailText, tailStart, match);
106
+ return (0, prompt_detect_multiple_choice_1.joinApprovalTarget)(lines, (0, prompt_detect_multiple_choice_1.findApprovalContextStart)(lines, startLine), endLine + 1);
107
+ }
81
108
  /**
82
109
  * Creates a yes/no prompt detection result.
83
110
  * Centralizes the repeated construction of yes_no PromptDetectionResult objects
@@ -86,10 +113,11 @@ const YES_NO_PATTERNS = [
86
113
  * @param question - The question text
87
114
  * @param cleanContent - The clean content string
88
115
  * @param rawContent - The raw content string (last 20 lines, trimmed)
116
+ * @param approvalTarget - Issue #1699 deny-match surface for this prompt
89
117
  * @param defaultOption - Optional default option ('yes' or 'no')
90
118
  * @returns PromptDetectionResult with isPrompt: true and yes_no prompt data
91
119
  */
92
- function yesNoPromptResult(question, cleanContent, rawContent, defaultOption) {
120
+ function yesNoPromptResult(question, cleanContent, rawContent, approvalTarget, defaultOption) {
93
121
  return {
94
122
  isPrompt: true,
95
123
  promptData: {
@@ -98,7 +126,12 @@ function yesNoPromptResult(question, cleanContent, rawContent, defaultOption) {
98
126
  options: ['yes', 'no'],
99
127
  status: 'pending',
100
128
  ...(defaultOption !== undefined && { defaultOption }),
129
+ // Issue #235: the wide window, for the human reading PromptPanel.
101
130
  instructionText: rawContent,
131
+ // Issue #1699: the narrow one, for machine judgement. Keeping the two
132
+ // apart is the whole fix — the wide window is a scrollback view and a
133
+ // deny pattern matched against it fires on turns that are already done.
134
+ ...(approvalTarget !== undefined && { approvalTarget }),
102
135
  },
103
136
  cleanContent,
104
137
  rawContent,
@@ -148,6 +181,9 @@ function detectPrompt(output, options) {
148
181
  lastOutputTail = tailForDedup;
149
182
  // [SF-003] [MF-S2-001] Expanded from 10 to 20 lines for rawContent coverage
150
183
  const lastLines = lines.slice(-20).join('\n');
184
+ // Absolute index of lastLines[0] in `lines`, so a match inside the joined tail
185
+ // can be mapped back to a line number (Issue #1699).
186
+ const tailStart = Math.max(0, lines.length - 20);
151
187
  // Pattern 0: Multiple choice (numbered options with indicator)
152
188
  // Example:
153
189
  // Do you want to proceed?
@@ -172,7 +208,7 @@ function detectPrompt(output, options) {
172
208
  const match = lastLines.match(pattern.regex);
173
209
  if (match) {
174
210
  const question = match[1].trim();
175
- return yesNoPromptResult(question, question, trimmedLastLines, pattern.defaultOption);
211
+ return yesNoPromptResult(question, question, trimmedLastLines, yesNoApprovalTarget(lines, lastLines, tailStart, match), pattern.defaultOption);
176
212
  }
177
213
  }
178
214
  // Pattern 5: Approve?
@@ -183,7 +219,7 @@ function detectPrompt(output, options) {
183
219
  const content = approveMatch[1].trim();
184
220
  // If there's content before "Approve?", include it in the question
185
221
  const question = content ? `${content} Approve?` : 'Approve?';
186
- return yesNoPromptResult(question, content || 'Approve?', trimmedLastLines);
222
+ return yesNoPromptResult(question, content || 'Approve?', trimmedLastLines, yesNoApprovalTarget(lines, lastLines, tailStart, approveMatch));
187
223
  }
188
224
  // No prompt detected
189
225
  // D2-005: Suppress duplicate complete log
@@ -59,14 +59,23 @@ function resolveBaseAnswer(promptData) {
59
59
  /**
60
60
  * Every piece of prompt text a deny pattern is matched against.
61
61
  *
62
- * `instructionText` is included because that is where the dangerous part
63
- * usually is — Claude's permission prompts put the command being approved in the
64
- * lines above the question, not in the question itself.
62
+ * `approvalTarget` is included because that is where the dangerous part usually
63
+ * is — Claude's permission prompts put the command being approved in the lines
64
+ * above the question, not in the question itself.
65
+ *
66
+ * Issue #1699: it used to be `instructionText` that was included here, and that
67
+ * was the bug. `instructionText` is a scrollback window sized for a human to
68
+ * read, so a `rm -rf` approved several turns earlier stayed inside it and went
69
+ * on matching — suppressing every later prompt, including edits that had
70
+ * nothing to do with it, until the line scrolled off the pane. `approvalTarget`
71
+ * is the same block bounded at the previous turn, so what is judged here is
72
+ * what *this* prompt is asking for. Prompts detected before the field existed
73
+ * (an old row replayed from the database) simply match on question and options.
65
74
  */
66
75
  function collectDenyMatchTexts(promptData) {
67
76
  const texts = [promptData.question];
68
- if (promptData.instructionText) {
69
- texts.push(promptData.instructionText);
77
+ if (promptData.approvalTarget) {
78
+ texts.push(promptData.approvalTarget);
70
79
  }
71
80
  if (promptData.type === 'multiple_choice') {
72
81
  for (const option of promptData.options) {
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * In-memory record of the last Auto-Yes answer withheld by a contract policy
4
+ * (Issue #1684).
5
+ *
6
+ * Until now a policy suppression (Issue #1547) was visible only in the server
7
+ * log (`poller:auto-yes-suppressed-by-policy`), so an unattended pipeline that
8
+ * stalled on a suppressed prompt looked identical to one that simply had no
9
+ * answer. This module keeps the last suppression per session so
10
+ * `buildCurrentOutput` can publish it and `commandmate capture --json` can show
11
+ * *why* the worker is waiting.
12
+ *
13
+ * Exposure only: nothing reads this to make a decision. The poller keeps
14
+ * re-evaluating a suppressed prompt every poll (the duplicate guard only
15
+ * remembers *answered* prompts), so while the prompt stays on screen the record
16
+ * is refreshed and `at` stays current; consumers combine it with
17
+ * `isPromptWaiting` to tell an active suppression from a historical one.
18
+ *
19
+ * In-memory and not in SQLite for the same reason `agent-event-state` is: the
20
+ * record describes a prompt on a live tmux session, and a session does not
21
+ * survive a server restart for the record to still be about.
22
+ *
23
+ * @module lib/polling/auto-yes-suppression-state
24
+ */
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.recordPolicySuppression = recordPolicySuppression;
27
+ exports.getLastPolicySuppression = getLastPolicySuppression;
28
+ exports.clearPolicySuppressions = clearPolicySuppressions;
29
+ const auto_yes_state_1 = require("../../lib/auto-yes-state");
30
+ /** compositeKey -> the most recent policy suppression for that session. */
31
+ const lastPolicySuppressions = new Map();
32
+ /**
33
+ * Record that the policy withheld an answer for `instanceId`'s current prompt.
34
+ *
35
+ * @param at - Epoch ms; defaults to now. Overridable so tests are deterministic.
36
+ */
37
+ function recordPolicySuppression(worktreeId, cliToolId, instanceId, suppression, at = Date.now()) {
38
+ lastPolicySuppressions.set((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId), {
39
+ ...suppression,
40
+ at,
41
+ });
42
+ }
43
+ /**
44
+ * @returns The last policy suppression for this session, or null when the
45
+ * policy has never withheld an answer — the ordinary case for a session
46
+ * running without a contract.
47
+ */
48
+ function getLastPolicySuppression(worktreeId, cliToolId, instanceId) {
49
+ return lastPolicySuppressions.get((0, auto_yes_state_1.buildCompositeKey)(worktreeId, cliToolId, instanceId)) ?? null;
50
+ }
51
+ /** Drop every recorded suppression. Test seam. */
52
+ function clearPolicySuppressions() {
53
+ lastPolicySuppressions.clear();
54
+ }
@@ -14,6 +14,7 @@ const manager_1 = require("../../lib/cli-tools/manager");
14
14
  const cli_session_1 = require("../../lib/session/cli-session");
15
15
  const status_detector_1 = require("../../lib/detection/status-detector");
16
16
  const auto_yes_manager_1 = require("../../lib/polling/auto-yes-manager");
17
+ const auto_yes_suppression_state_1 = require("../../lib/polling/auto-yes-suppression-state");
17
18
  const status_capture_config_1 = require("../../config/status-capture-config");
18
19
  const tmux_capture_cache_1 = require("../../lib/tmux/tmux-capture-cache");
19
20
  const agent_event_state_1 = require("../../lib/session/agent-event-state");
@@ -101,6 +102,7 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
101
102
  enabled: autoYesState?.enabled ?? false,
102
103
  expiresAt: autoYesState?.enabled ? autoYesState.expiresAt : null,
103
104
  stopReason: autoYesState?.stopReason,
105
+ lastSuppression: (0, auto_yes_suppression_state_1.getLastPolicySuppression)(worktreeId, cliToolId, instanceId),
104
106
  },
105
107
  isSelectionListActive,
106
108
  isPagerActive,
@@ -47,6 +47,8 @@ exports.inspectSkillDestination = inspectSkillDestination;
47
47
  exports.hasCommittedSkillPayload = hasCommittedSkillPayload;
48
48
  exports.writeSkillPayloadFile = writeSkillPayloadFile;
49
49
  exports.applySkillInstall = applySkillInstall;
50
+ exports.directoriesForSkillPayload = directoriesForSkillPayload;
51
+ exports.stageSkillRootPayload = stageSkillRootPayload;
50
52
  exports.completeSecondarySkillInstallRoots = completeSecondarySkillInstallRoots;
51
53
  exports.cleanupSkillInstallStaging = cleanupSkillInstallStaging;
52
54
  const fs_1 = require("fs");
@@ -397,7 +399,7 @@ function applySkillInstall(input) {
397
399
  }
398
400
  return { relativePath: file.path, bytes, executable: file.executable };
399
401
  });
400
- const directories = directoriesFor(input.snapshot.files.map((f) => f.path), input.snapshot.directories);
402
+ const directories = directoriesForSkillPayload(input.snapshot.files.map((f) => f.path), input.snapshot.directories);
401
403
  // Every destination is proven safe and absent *before* the primary commits, so
402
404
  // a secondary that is already blocked cannot leave a committed primary behind.
403
405
  for (const prefix of rootPrefixes) {
@@ -463,7 +465,7 @@ function applySkillInstall(input) {
463
465
  };
464
466
  }
465
467
  /** Sorted set of directories a payload implies, plus any the package declared. */
466
- function directoriesFor(filePaths, declared = []) {
468
+ function directoriesForSkillPayload(filePaths, declared = []) {
467
469
  const directories = new Set(declared);
468
470
  for (const filePath of filePaths) {
469
471
  const parents = filePath.split('/').slice(0, -1);
@@ -476,30 +478,29 @@ function directoriesFor(filePaths, declared = []) {
476
478
  return [...directories].sort();
477
479
  }
478
480
  /**
479
- * Stage the verified payload into one root and atomically publish it (#1460).
481
+ * Stage the verified payload for one root without publishing it (#1244).
480
482
  *
481
- * The single-root commit #1235 built, lifted to take the root prefix as a
482
- * parameter: staging lives under *that* root's reserved namespace so the rename
483
- * stays on one filesystem, and every check ancestor lstat walk, exclusive
484
- * no-follow writes, tree-hash gate, destination-absent, same-filesystem is
485
- * applied per root. Throws {@link SkillInstallError} on any failure, having
486
- * removed its own staging; the destination is untouched unless the rename ran.
483
+ * The staging half of {@link stageAndCommitSkillRoot}, exported so update can
484
+ * reuse the exact write path exclusive no-follow writes, tree-hash gate,
485
+ * same-filesystem check and supply its own rename sequence. On any failure the
486
+ * staging directory is removed and {@link SkillInstallError} is thrown; the
487
+ * destination is never touched. The caller owns the returned directory: it must
488
+ * either rename it into place or remove it.
489
+ *
490
+ * @internal Shared between install and update apply; not a public API.
487
491
  */
488
- function stageAndCommitSkillRoot(input) {
492
+ function stageSkillRootPayload(input) {
493
+ if (!exports.SKILL_INSTALL_OPERATION_ID_PATTERN.test(input.stagingName)) {
494
+ fail(exports.SkillInstallErrorCode.STAGING_IO, { reason: 'staging-name' });
495
+ }
489
496
  const installRootAbs = resolveSkillInstallTargetFor(input.worktreePath, input.rootPrefix, input.skillId);
490
497
  assertAncestorsAreRealDirectories(input.worktreeRealPath, input.worktreePath, input.rootPrefix);
491
- const destinationBefore = inspectSkillDestination(installRootAbs);
492
- if (destinationBefore.present) {
493
- fail(destinationBefore.managed
494
- ? exports.SkillInstallErrorCode.DESTINATION_EXISTS
495
- : exports.SkillInstallErrorCode.DESTINATION_UNMANAGED, destinationBefore.version ? { version: destinationBefore.version } : undefined);
496
- }
497
498
  const stagingRoot = (0, operation_store_1.getSkillInstallStagingRoot)(input.worktreePath, input.rootPrefix);
498
499
  makeDirectory(path_1.default.dirname(stagingRoot), 0o755, true);
499
500
  makeDirectory(stagingRoot, exports.SKILL_INSTALL_DIR_MODE, true);
500
501
  // Not recursive: a staging directory that already exists means another
501
- // operation is using this ID, and silently adopting it would merge two writes.
502
- const stagingDir = path_1.default.join(stagingRoot, input.operationId);
502
+ // operation is using this name, and silently adopting it would merge two writes.
503
+ const stagingDir = path_1.default.join(stagingRoot, input.stagingName);
503
504
  makeDirectory(stagingDir, exports.SKILL_INSTALL_DIR_MODE, false);
504
505
  try {
505
506
  for (const directory of input.directories) {
@@ -520,6 +521,45 @@ function stageAndCommitSkillRoot(input) {
520
521
  fail(exports.SkillInstallErrorCode.PAYLOAD_MISMATCH, { reason: 'tree-hash' });
521
522
  }
522
523
  assertSameFilesystem(stagingDir, path_1.default.dirname(installRootAbs));
524
+ }
525
+ catch (error) {
526
+ (0, fs_1.rmSync)(stagingDir, { recursive: true, force: true });
527
+ pruneStagingRoot(stagingRoot);
528
+ throw error;
529
+ }
530
+ return { stagingDir, stagingRoot, installRootAbs };
531
+ }
532
+ /**
533
+ * Stage the verified payload into one root and atomically publish it (#1460).
534
+ *
535
+ * The single-root commit #1235 built, lifted to take the root prefix as a
536
+ * parameter: staging lives under *that* root's reserved namespace so the rename
537
+ * stays on one filesystem, and every check — ancestor lstat walk, exclusive
538
+ * no-follow writes, tree-hash gate, destination-absent, same-filesystem — is
539
+ * applied per root. Throws {@link SkillInstallError} on any failure, having
540
+ * removed its own staging; the destination is untouched unless the rename ran.
541
+ */
542
+ function stageAndCommitSkillRoot(input) {
543
+ const installRootAbs = resolveSkillInstallTargetFor(input.worktreePath, input.rootPrefix, input.skillId);
544
+ assertAncestorsAreRealDirectories(input.worktreeRealPath, input.worktreePath, input.rootPrefix);
545
+ const destinationBefore = inspectSkillDestination(installRootAbs);
546
+ if (destinationBefore.present) {
547
+ fail(destinationBefore.managed
548
+ ? exports.SkillInstallErrorCode.DESTINATION_EXISTS
549
+ : exports.SkillInstallErrorCode.DESTINATION_UNMANAGED, destinationBefore.version ? { version: destinationBefore.version } : undefined);
550
+ }
551
+ const staged = stageSkillRootPayload({
552
+ worktreePath: input.worktreePath,
553
+ worktreeRealPath: input.worktreeRealPath,
554
+ rootPrefix: input.rootPrefix,
555
+ skillId: input.skillId,
556
+ stagingName: input.operationId,
557
+ payload: input.payload,
558
+ directories: input.directories,
559
+ receiptBytes: input.receiptBytes,
560
+ plannedTreeHash: input.plannedTreeHash,
561
+ });
562
+ try {
523
563
  // Re-checked immediately before the rename rather than only at entry: the
524
564
  // exclusive lock keeps CommandMate out, but nothing keeps the user's own
525
565
  // editor from creating this directory while the payload was being staged.
@@ -531,18 +571,18 @@ function stageAndCommitSkillRoot(input) {
531
571
  : exports.SkillInstallErrorCode.DESTINATION_UNMANAGED);
532
572
  }
533
573
  try {
534
- (0, fs_1.renameSync)(stagingDir, installRootAbs);
574
+ (0, fs_1.renameSync)(staged.stagingDir, installRootAbs);
535
575
  }
536
576
  catch {
537
577
  fail(exports.SkillInstallErrorCode.COMMIT_FAILED, { reason: 'rename' });
538
578
  }
539
579
  }
540
580
  catch (error) {
541
- (0, fs_1.rmSync)(stagingDir, { recursive: true, force: true });
542
- pruneStagingRoot(stagingRoot);
581
+ (0, fs_1.rmSync)(staged.stagingDir, { recursive: true, force: true });
582
+ pruneStagingRoot(staged.stagingRoot);
543
583
  throw error;
544
584
  }
545
- pruneStagingRoot(stagingRoot);
585
+ pruneStagingRoot(staged.stagingRoot);
546
586
  }
547
587
  /**
548
588
  * Converge a committed install's secondary roots forward from the primary (#1460).
@@ -573,7 +613,7 @@ function completeSecondarySkillInstallRoots(worktreePath, worktreeRealPath, skil
573
613
  }
574
614
  return { relativePath: file.path, bytes, executable: file.executable };
575
615
  });
576
- const directories = directoriesFor(receipt.files.map((file) => file.path));
616
+ const directories = directoriesForSkillPayload(receipt.files.map((file) => file.path));
577
617
  const plannedTreeHash = (0, preview_diff_1.computeSkillTreeHash)([
578
618
  ...receipt.files.map((file) => ({
579
619
  path: file.path,
@@ -61,11 +61,10 @@ const SELECT_COLUMNS = `
61
61
  * The journal already holds the actor, target, source and typed error.
62
62
  *
63
63
  * The version transition (#1248) is derived from the journal rather than passed
64
- * in, because for the two operations that exist today the journal fully
65
- * determines it: an install ends at its target version and starts nowhere, an
66
- * uninstall starts at the version it removes and ends nowhere. An `update` is
67
- * the one case where `fromVersion` is not derivable it has no writer yet
68
- * (#1243/#1244), and whoever adds one has to supply the replaced version here.
64
+ * in, because the journal fully determines it: an install ends at its target
65
+ * version and starts nowhere, an uninstall starts at the version it removes and
66
+ * ends nowhere, and an update (#1244) records the version it replaces on its
67
+ * own target (`fromVersion`) precisely so this derivation stays total.
69
68
  */
70
69
  function buildSkillOperationAuditInput(entry, result, recordedAt) {
71
70
  const isUninstall = entry.operation === 'uninstall';
@@ -81,7 +80,7 @@ function buildSkillOperationAuditInput(entry, result, recordedAt) {
81
80
  worktreeId: entry.target.worktreeId,
82
81
  skillId: entry.target.skillId,
83
82
  skillVersion: entry.target.version,
84
- fromVersion: isUninstall ? entry.target.version : null,
83
+ fromVersion: isUninstall ? entry.target.version : (entry.target.fromVersion ?? null),
85
84
  toVersion: isUninstall ? null : entry.target.version,
86
85
  sourceOrigin: entry.source?.origin ?? null,
87
86
  sourceRepository: entry.source?.repository ?? null,
@@ -32,6 +32,7 @@ const integrity_1 = require("../../lib/skills/integrity");
32
32
  const install_plan_1 = require("../../lib/skills/install-plan");
33
33
  const install_apply_1 = require("../../lib/skills/install-apply");
34
34
  const uninstall_apply_1 = require("../../lib/skills/uninstall-apply");
35
+ const updater_1 = require("../../lib/skills/updater");
35
36
  const installed_state_1 = require("../../lib/skills/installed-state");
36
37
  const operation_audit_1 = require("../../lib/skills/operation-audit");
37
38
  const operation_journal_1 = require("../../lib/skills/operation-journal");
@@ -65,6 +66,19 @@ function buildSkillReconcilerPorts(db, options = {}) {
65
66
  // and an uninstall's payload is by definition no longer present.
66
67
  return isRemovalOperation(entry);
67
68
  }
69
+ if (entry.operation === 'update') {
70
+ // An interrupted two-rename switch can leave the root empty (old in
71
+ // the aside directory, or a verified staged payload unpublished), so
72
+ // the probe first converges the root to old-complete or new-complete
73
+ // (#1244) and only then answers whether the *new* receipt landed. The
74
+ // pre-existing old receipt is why the install probe would misread this
75
+ // entry: with no recorded digest it accepts any parseable receipt.
76
+ return (0, updater_1.reconcileSkillUpdateTarget)(worktreePath, entry.target.skillId, {
77
+ operationId: entry.operationId,
78
+ toVersion: entry.target.version,
79
+ receiptDigest: entry.receiptDigest,
80
+ }).committed;
81
+ }
68
82
  return isRemovalOperation(entry)
69
83
  ? (0, uninstall_apply_1.hasRemovedSkillPayload)(worktreePath, entry.target.skillId, entry.receiptDigest)
70
84
  : (0, install_apply_1.hasCommittedSkillPayload)(worktreePath, entry.target.skillId, entry.receiptDigest);
@@ -80,12 +94,19 @@ function buildSkillReconcilerPorts(db, options = {}) {
80
94
  if (worktreePath === null) {
81
95
  throw new Error('worktree path is unavailable for reindex');
82
96
  }
83
- // Converge any secondary root a partial multi-root install did not reach,
84
- // copying the byte-identical payload forward from the committed primary
85
- // (#1460). Best-effort: a root blocked by a user file must not stall the
86
- // index write, which is what actually makes the install visible.
97
+ // Converge any secondary root the operation did not reach, forward from
98
+ // the committed primary (#1460). An install only fills absent roots; an
99
+ // update (#1244) additionally switches a secondary that still holds the
100
+ // provably clean previous version. Best-effort: a root blocked by a user
101
+ // file must not stall the index write, which is what actually makes the
102
+ // operation visible.
87
103
  try {
88
- (0, install_apply_1.completeSecondarySkillInstallRoots)(worktreePath, (0, fs_1.realpathSync)(worktreePath), entry.target.skillId);
104
+ if (entry.operation === 'update') {
105
+ (0, updater_1.completeSecondarySkillUpdateRoots)(worktreePath, (0, fs_1.realpathSync)(worktreePath), entry.target.skillId);
106
+ }
107
+ else {
108
+ (0, install_apply_1.completeSecondarySkillInstallRoots)(worktreePath, (0, fs_1.realpathSync)(worktreePath), entry.target.skillId);
109
+ }
89
110
  }
90
111
  catch (error) {
91
112
  reconcileLogger.warn('skill-secondary-root-convergence-failed', {