commandmate 0.14.0 → 0.15.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 (646) hide show
  1. package/.env.example +7 -0
  2. package/.next/BUILD_ID +1 -1
  3. package/.next/app-build-manifest.json +362 -343
  4. package/.next/app-path-routes-manifest.json +28 -25
  5. package/.next/build-manifest.json +5 -5
  6. package/.next/prerender-manifest.json +9 -9
  7. package/.next/react-loadable-manifest.json +11 -13
  8. package/.next/required-server-files.json +1 -1
  9. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  10. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update-check/route.js +1 -1
  12. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  13. package/.next/server/app/api/assistant/conversation/route.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route.js.nft.json +1 -1
  15. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/current-output/route.js +1 -1
  17. package/.next/server/app/api/assistant/current-output/route.js.nft.json +1 -1
  18. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/messages/route.js +1 -1
  20. package/.next/server/app/api/assistant/messages/route.js.nft.json +1 -1
  21. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/assistant/session/route.js +1 -1
  23. package/.next/server/app/api/assistant/session/route.js.nft.json +1 -1
  24. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  25. package/.next/server/app/api/assistant/start/route.js +1 -1
  26. package/.next/server/app/api/assistant/start/route.js.nft.json +1 -1
  27. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  28. package/.next/server/app/api/assistant/terminal/route.js +1 -1
  29. package/.next/server/app/api/assistant/terminal/route.js.nft.json +1 -1
  30. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/assistant/tools/route.js +1 -1
  32. package/.next/server/app/api/assistant/tools/route.js.nft.json +1 -1
  33. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  36. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/daily-summary/route.js +1 -1
  38. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  39. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  40. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  41. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  42. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/external-apps/[id]/health/route.js +1 -1
  44. package/.next/server/app/api/external-apps/[id]/health/route.js.nft.json +1 -1
  45. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/external-apps/[id]/route.js +1 -1
  47. package/.next/server/app/api/external-apps/[id]/route.js.nft.json +1 -1
  48. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/external-apps/route.js +1 -1
  50. package/.next/server/app/api/external-apps/route.js.nft.json +1 -1
  51. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  52. package/.next/server/app/api/fs/browse/route.js +7 -0
  53. package/.next/server/app/api/fs/browse/route.js.nft.json +1 -0
  54. package/.next/server/app/api/fs/browse/route_client-reference-manifest.js +1 -0
  55. package/.next/server/app/api/fs/recent-paths/route.js +7 -0
  56. package/.next/server/app/api/fs/recent-paths/route.js.nft.json +1 -0
  57. package/.next/server/app/api/fs/recent-paths/route_client-reference-manifest.js +1 -0
  58. package/.next/server/app/api/hooks/claude-done/route.js +1 -1
  59. package/.next/server/app/api/hooks/claude-done/route.js.nft.json +1 -1
  60. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  61. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  63. package/.next/server/app/api/push/subscriptions/route.js.nft.json +1 -1
  64. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  65. package/.next/server/app/api/push/vapid/route.js +1 -1
  66. package/.next/server/app/api/push/vapid/route.js.nft.json +1 -1
  67. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/repositories/[id]/route.js +1 -1
  69. package/.next/server/app/api/repositories/[id]/route.js.nft.json +1 -1
  70. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  72. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js.nft.json +1 -1
  73. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  75. package/.next/server/app/api/repositories/[id]/todos/route.js.nft.json +1 -1
  76. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/repositories/clone/[jobId]/route.js +1 -1
  78. package/.next/server/app/api/repositories/clone/[jobId]/route.js.nft.json +1 -1
  79. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/repositories/clone/route.js +1 -1
  81. package/.next/server/app/api/repositories/clone/route.js.nft.json +1 -1
  82. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/repositories/excluded/route.js +1 -1
  84. package/.next/server/app/api/repositories/excluded/route.js.nft.json +1 -1
  85. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/repositories/restore/route.js +1 -1
  87. package/.next/server/app/api/repositories/restore/route.js.nft.json +1 -1
  88. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/repositories/route.js +1 -1
  90. package/.next/server/app/api/repositories/route.js.nft.json +1 -1
  91. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/repositories/scan/route.js +1 -1
  93. package/.next/server/app/api/repositories/scan/route.js.nft.json +1 -1
  94. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/repositories/sync/route.js +1 -1
  96. package/.next/server/app/api/repositories/sync/route.js.nft.json +1 -1
  97. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/repositories/validate-path/route.js +1 -0
  99. package/.next/server/app/api/repositories/validate-path/route.js.nft.json +1 -0
  100. package/.next/server/app/api/repositories/validate-path/route_client-reference-manifest.js +1 -0
  101. package/.next/server/app/api/sidebar/group-order/route.js +2 -2
  102. package/.next/server/app/api/sidebar/group-order/route.js.nft.json +1 -1
  103. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/skills/[id]/route.js +1 -1
  105. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -1
  106. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/skills/route.js +1 -1
  108. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  109. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/slash-commands/route.js +1 -1
  111. package/.next/server/app/api/slash-commands/route.js.nft.json +1 -1
  112. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/templates/[id]/route.js +1 -1
  114. package/.next/server/app/api/templates/[id]/route.js.nft.json +1 -1
  115. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/templates/route.js +1 -1
  117. package/.next/server/app/api/templates/route.js.nft.json +1 -1
  118. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/todos/route.js +1 -1
  120. package/.next/server/app/api/todos/route.js.nft.json +1 -1
  121. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/auto-yes/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/capture/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/capture/route.js.nft.json +1 -1
  127. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/current-output/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/current-output/route.js.nft.json +1 -1
  136. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js.nft.json +1 -1
  139. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js.nft.json +1 -1
  142. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/files/[...path]/route.js.nft.json +1 -1
  145. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  148. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  151. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  154. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  157. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  160. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  161. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  163. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  166. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  169. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  171. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  172. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  173. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  174. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  175. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  176. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  177. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  178. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  179. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  180. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  181. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  182. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  183. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  184. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  185. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  186. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  187. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  190. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  193. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  196. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  199. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  202. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  205. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  207. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  208. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  209. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  210. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  211. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  212. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  213. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  214. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  215. package/.next/server/app/api/worktrees/[id]/interrupt/route.js +1 -1
  216. package/.next/server/app/api/worktrees/[id]/interrupt/route.js.nft.json +1 -1
  217. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  218. package/.next/server/app/api/worktrees/[id]/kill-session/route.js +1 -1
  219. package/.next/server/app/api/worktrees/[id]/kill-session/route.js.nft.json +1 -1
  220. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  221. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  222. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js.nft.json +1 -1
  223. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  224. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  225. package/.next/server/app/api/worktrees/[id]/logs/route.js.nft.json +1 -1
  226. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  227. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  228. package/.next/server/app/api/worktrees/[id]/marp-render/route.js.nft.json +1 -1
  229. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  230. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  231. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js.nft.json +1 -1
  232. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  233. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  234. package/.next/server/app/api/worktrees/[id]/memos/route.js.nft.json +1 -1
  235. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  236. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  237. package/.next/server/app/api/worktrees/[id]/messages/route.js.nft.json +1 -1
  238. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  239. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js +1 -1
  240. package/.next/server/app/api/worktrees/[id]/prompt-response/route.js.nft.json +1 -1
  241. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  242. package/.next/server/app/api/worktrees/[id]/respond/route.js +1 -1
  243. package/.next/server/app/api/worktrees/[id]/respond/route.js.nft.json +1 -1
  244. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  245. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  246. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  247. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  248. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  249. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js.nft.json +1 -1
  250. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  251. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  252. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js.nft.json +1 -1
  253. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  254. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  255. package/.next/server/app/api/worktrees/[id]/schedules/route.js.nft.json +1 -1
  256. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  257. package/.next/server/app/api/worktrees/[id]/search/route.js +1 -1
  258. package/.next/server/app/api/worktrees/[id]/search/route.js.nft.json +1 -1
  259. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  260. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  261. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  262. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  263. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -1
  264. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -1
  265. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -1
  266. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -1
  267. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -1
  268. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -1
  269. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -1
  270. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -1
  271. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -1
  272. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -1
  273. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -1
  274. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -1
  275. package/.next/server/app/api/worktrees/[id]/skills/route.js +1 -1
  276. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -1
  277. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -1
  278. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  279. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js.nft.json +1 -1
  280. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  281. package/.next/server/app/api/worktrees/[id]/special-keys/route.js +1 -1
  282. package/.next/server/app/api/worktrees/[id]/special-keys/route.js.nft.json +1 -1
  283. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  284. package/.next/server/app/api/worktrees/[id]/start-polling/route.js +1 -1
  285. package/.next/server/app/api/worktrees/[id]/start-polling/route.js.nft.json +1 -1
  286. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  287. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  288. package/.next/server/app/api/worktrees/[id]/terminal/route.js.nft.json +1 -1
  289. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  290. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  291. package/.next/server/app/api/worktrees/[id]/timers/history/route.js.nft.json +1 -1
  292. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  293. package/.next/server/app/api/worktrees/[id]/timers/route.js +1 -1
  294. package/.next/server/app/api/worktrees/[id]/timers/route.js.nft.json +1 -1
  295. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  296. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  297. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js.nft.json +1 -1
  298. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  299. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  300. package/.next/server/app/api/worktrees/[id]/todos/route.js.nft.json +1 -1
  301. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  302. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  303. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js.nft.json +1 -1
  304. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  305. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  306. package/.next/server/app/api/worktrees/[id]/tree/route.js.nft.json +1 -1
  307. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  308. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js +1 -1
  309. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route.js.nft.json +1 -1
  310. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  311. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  312. package/.next/server/app/api/worktrees/[id]/viewed/route.js.nft.json +1 -1
  313. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  314. package/.next/server/app/api/worktrees/route.js +1 -1
  315. package/.next/server/app/api/worktrees/route.js.nft.json +1 -1
  316. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  317. package/.next/server/app/chat/page.js +1 -1
  318. package/.next/server/app/chat/page.js.nft.json +1 -1
  319. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  320. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  321. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  322. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  323. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  324. package/.next/server/app/page_client-reference-manifest.js +1 -1
  325. package/.next/server/app/proxy/[...path]/route.js +1 -1
  326. package/.next/server/app/proxy/[...path]/route.js.nft.json +1 -1
  327. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  328. package/.next/server/app/repositories/page.js +2 -2
  329. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  330. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  331. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  332. package/.next/server/app/skills/[skillId]/page.js +2 -2
  333. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -1
  334. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -1
  335. package/.next/server/app/skills/page.js +1 -1
  336. package/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  337. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +1 -1
  338. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  339. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  340. package/.next/server/app/worktrees/[id]/page.js +12 -12
  341. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  342. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  343. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  344. package/.next/server/app-paths-manifest.json +28 -25
  345. package/.next/server/chunks/1355.js +1 -0
  346. package/.next/server/chunks/1808.js +1 -1
  347. package/.next/server/chunks/2119.js +1 -1
  348. package/.next/server/chunks/2404.js +1 -1
  349. package/.next/server/chunks/2445.js +1 -1
  350. package/.next/server/chunks/3543.js +1 -1
  351. package/.next/server/chunks/3722.js +1 -1
  352. package/.next/server/chunks/3736.js +1 -1
  353. package/.next/server/chunks/3753.js +1 -1
  354. package/.next/server/chunks/3945.js +1 -1
  355. package/.next/server/chunks/4390.js +1 -0
  356. package/.next/server/chunks/4444.js +1 -1
  357. package/.next/server/chunks/5326.js +1 -1
  358. package/.next/server/chunks/593.js +1 -0
  359. package/.next/server/chunks/5959.js +3 -3
  360. package/.next/server/chunks/6065.js +1 -1
  361. package/.next/server/chunks/6130.js +1 -1
  362. package/.next/server/chunks/6283.js +1 -1
  363. package/.next/server/chunks/646.js +2 -2
  364. package/.next/server/chunks/7593.js +1 -0
  365. package/.next/server/chunks/8356.js +1 -1
  366. package/.next/server/chunks/9123.js +1 -1
  367. package/.next/server/chunks/9192.js +1 -1
  368. package/.next/server/chunks/9687.js +1 -1
  369. package/.next/server/middleware-build-manifest.js +1 -1
  370. package/.next/server/middleware-manifest.json +5 -5
  371. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  372. package/.next/server/pages/500.html +1 -1
  373. package/.next/server/server-reference-manifest.json +1 -1
  374. package/.next/server/src/middleware.js.map +1 -1
  375. package/.next/static/MqlW91_Se_kEW6mtm-1x0/_buildManifest.js +1 -0
  376. package/.next/static/chunks/1191-b7dfdfe86b1d31d1.js +1 -0
  377. package/.next/static/chunks/{4560-04e5aebcab96bfa1.js → 4560-8ffb0bb19f2ba998.js} +1 -1
  378. package/.next/static/chunks/530.e31cc754677fed0f.js +1 -0
  379. package/.next/static/chunks/5542-b6457f305d724a6b.js +1 -0
  380. package/.next/static/chunks/{6488-1a37ccee1d444c10.js → 6488-93870a55f4a3e3cd.js} +1 -1
  381. package/.next/static/chunks/8566-a6a7c70558927410.js +1 -0
  382. package/.next/static/chunks/9142-41b13a2f278529cc.js +1 -0
  383. package/.next/static/chunks/9263.5259f73f89220d64.js +1 -0
  384. package/.next/static/chunks/9599-d29d2f8eeaf7c249.js +1 -0
  385. package/.next/static/chunks/app/api/app/update/route-8c8bebe20cebf964.js +1 -0
  386. package/.next/static/chunks/app/api/app/update-check/route-8c8bebe20cebf964.js +1 -0
  387. package/.next/static/chunks/app/api/assistant/conversation/route-8c8bebe20cebf964.js +1 -0
  388. package/.next/static/chunks/app/api/assistant/current-output/route-8c8bebe20cebf964.js +1 -0
  389. package/.next/static/chunks/app/api/assistant/messages/route-8c8bebe20cebf964.js +1 -0
  390. package/.next/static/chunks/app/api/assistant/session/route-8c8bebe20cebf964.js +1 -0
  391. package/.next/static/chunks/app/api/assistant/start/route-8c8bebe20cebf964.js +1 -0
  392. package/.next/static/chunks/app/api/assistant/terminal/route-8c8bebe20cebf964.js +1 -0
  393. package/.next/static/chunks/app/api/assistant/tools/route-8c8bebe20cebf964.js +1 -0
  394. package/.next/static/chunks/app/api/auth/login/route-8c8bebe20cebf964.js +1 -0
  395. package/.next/static/chunks/app/api/auth/logout/route-8c8bebe20cebf964.js +1 -0
  396. package/.next/static/chunks/app/api/auth/status/route-8c8bebe20cebf964.js +1 -0
  397. package/.next/static/chunks/app/api/daily-summary/route-8c8bebe20cebf964.js +1 -0
  398. package/.next/static/chunks/app/api/daily-summary/status/route-8c8bebe20cebf964.js +1 -0
  399. package/.next/static/chunks/app/api/external-apps/[id]/health/route-8c8bebe20cebf964.js +1 -0
  400. package/.next/static/chunks/app/api/external-apps/[id]/route-8c8bebe20cebf964.js +1 -0
  401. package/.next/static/chunks/app/api/external-apps/route-8c8bebe20cebf964.js +1 -0
  402. package/.next/static/chunks/app/api/fs/browse/route-8c8bebe20cebf964.js +1 -0
  403. package/.next/static/chunks/app/api/fs/recent-paths/route-8c8bebe20cebf964.js +1 -0
  404. package/.next/static/chunks/app/api/hooks/claude-done/route-8c8bebe20cebf964.js +1 -0
  405. package/.next/static/chunks/app/api/ollama/models/route-8c8bebe20cebf964.js +1 -0
  406. package/.next/static/chunks/app/api/push/subscriptions/route-8c8bebe20cebf964.js +1 -0
  407. package/.next/static/chunks/app/api/push/vapid/route-8c8bebe20cebf964.js +1 -0
  408. package/.next/static/chunks/app/api/repositories/[id]/route-8c8bebe20cebf964.js +1 -0
  409. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-8c8bebe20cebf964.js +1 -0
  410. package/.next/static/chunks/app/api/repositories/[id]/todos/route-8c8bebe20cebf964.js +1 -0
  411. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-8c8bebe20cebf964.js +1 -0
  412. package/.next/static/chunks/app/api/repositories/clone/route-8c8bebe20cebf964.js +1 -0
  413. package/.next/static/chunks/app/api/repositories/excluded/route-8c8bebe20cebf964.js +1 -0
  414. package/.next/static/chunks/app/api/repositories/restore/route-8c8bebe20cebf964.js +1 -0
  415. package/.next/static/chunks/app/api/repositories/route-8c8bebe20cebf964.js +1 -0
  416. package/.next/static/chunks/app/api/repositories/scan/route-8c8bebe20cebf964.js +1 -0
  417. package/.next/static/chunks/app/api/repositories/sync/route-8c8bebe20cebf964.js +1 -0
  418. package/.next/static/chunks/app/api/repositories/validate-path/route-8c8bebe20cebf964.js +1 -0
  419. package/.next/static/chunks/app/api/sidebar/group-order/route-8c8bebe20cebf964.js +1 -0
  420. package/.next/static/chunks/app/api/skills/[id]/route-8c8bebe20cebf964.js +1 -0
  421. package/.next/static/chunks/app/api/skills/route-8c8bebe20cebf964.js +1 -0
  422. package/.next/static/chunks/app/api/slash-commands/route-8c8bebe20cebf964.js +1 -0
  423. package/.next/static/chunks/app/api/templates/[id]/route-8c8bebe20cebf964.js +1 -0
  424. package/.next/static/chunks/app/api/templates/route-8c8bebe20cebf964.js +1 -0
  425. package/.next/static/chunks/app/api/todos/route-8c8bebe20cebf964.js +1 -0
  426. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-8c8bebe20cebf964.js +1 -0
  427. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-8c8bebe20cebf964.js +1 -0
  428. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-8c8bebe20cebf964.js +1 -0
  429. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-8c8bebe20cebf964.js +1 -0
  430. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-8c8bebe20cebf964.js +1 -0
  431. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-8c8bebe20cebf964.js +1 -0
  432. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-8c8bebe20cebf964.js +1 -0
  433. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-8c8bebe20cebf964.js +1 -0
  434. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-8c8bebe20cebf964.js +1 -0
  435. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-8c8bebe20cebf964.js +1 -0
  436. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-8c8bebe20cebf964.js +1 -0
  437. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-8c8bebe20cebf964.js +1 -0
  438. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-8c8bebe20cebf964.js +1 -0
  439. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-8c8bebe20cebf964.js +1 -0
  440. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-8c8bebe20cebf964.js +1 -0
  441. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-8c8bebe20cebf964.js +1 -0
  442. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-8c8bebe20cebf964.js +1 -0
  443. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-8c8bebe20cebf964.js +1 -0
  444. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-8c8bebe20cebf964.js +1 -0
  445. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-8c8bebe20cebf964.js +1 -0
  446. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-8c8bebe20cebf964.js +1 -0
  447. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-8c8bebe20cebf964.js +1 -0
  448. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-8c8bebe20cebf964.js +1 -0
  449. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-8c8bebe20cebf964.js +1 -0
  450. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-8c8bebe20cebf964.js +1 -0
  451. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-8c8bebe20cebf964.js +1 -0
  452. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-8c8bebe20cebf964.js +1 -0
  453. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-8c8bebe20cebf964.js +1 -0
  454. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-8c8bebe20cebf964.js +1 -0
  455. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-8c8bebe20cebf964.js +1 -0
  456. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-8c8bebe20cebf964.js +1 -0
  457. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-8c8bebe20cebf964.js +1 -0
  458. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-8c8bebe20cebf964.js +1 -0
  459. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-8c8bebe20cebf964.js +1 -0
  460. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-8c8bebe20cebf964.js +1 -0
  461. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-8c8bebe20cebf964.js +1 -0
  462. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-8c8bebe20cebf964.js +1 -0
  463. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-8c8bebe20cebf964.js +1 -0
  464. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-8c8bebe20cebf964.js +1 -0
  465. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-8c8bebe20cebf964.js +1 -0
  466. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-8c8bebe20cebf964.js +1 -0
  467. package/.next/static/chunks/app/api/worktrees/[id]/route-8c8bebe20cebf964.js +1 -0
  468. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-8c8bebe20cebf964.js +1 -0
  469. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-8c8bebe20cebf964.js +1 -0
  470. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-8c8bebe20cebf964.js +1 -0
  471. package/.next/static/chunks/app/api/worktrees/[id]/search/route-8c8bebe20cebf964.js +1 -0
  472. package/.next/static/chunks/app/api/worktrees/[id]/send/route-8c8bebe20cebf964.js +1 -0
  473. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-8c8bebe20cebf964.js +1 -0
  474. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-8c8bebe20cebf964.js +1 -0
  475. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-8c8bebe20cebf964.js +1 -0
  476. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-8c8bebe20cebf964.js +1 -0
  477. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-8c8bebe20cebf964.js +1 -0
  478. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-8c8bebe20cebf964.js +1 -0
  479. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-8c8bebe20cebf964.js +1 -0
  480. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-8c8bebe20cebf964.js +1 -0
  481. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-8c8bebe20cebf964.js +1 -0
  482. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-8c8bebe20cebf964.js +1 -0
  483. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-8c8bebe20cebf964.js +1 -0
  484. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-8c8bebe20cebf964.js +1 -0
  485. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-8c8bebe20cebf964.js +1 -0
  486. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-8c8bebe20cebf964.js +1 -0
  487. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-8c8bebe20cebf964.js +1 -0
  488. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-8c8bebe20cebf964.js +1 -0
  489. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-8c8bebe20cebf964.js +1 -0
  490. package/.next/static/chunks/app/api/worktrees/route-8c8bebe20cebf964.js +1 -0
  491. package/.next/static/chunks/app/chat/page-83a2238ab453afaa.js +1 -0
  492. package/.next/static/chunks/app/manifest.webmanifest/route-8c8bebe20cebf964.js +1 -0
  493. package/.next/static/chunks/app/proxy/[...path]/route-8c8bebe20cebf964.js +1 -0
  494. package/.next/static/chunks/app/repositories/page-3c4fb889da48ce24.js +1 -0
  495. package/.next/static/chunks/app/skills/[skillId]/page-8c40c9683f242207.js +1 -0
  496. package/.next/static/chunks/app/worktrees/[id]/files/[...path]/{page-9ff4d065483cdfe9.js → page-6041d3c3db326317.js} +1 -1
  497. package/.next/static/chunks/app/worktrees/[id]/page-6da38f0a06dfd9db.js +1 -0
  498. package/.next/static/chunks/webpack-6b35d37d50302d27.js +1 -0
  499. package/.next/static/css/5127edd9aa8f3b49.css +1 -0
  500. package/.next/trace +11 -11
  501. package/.next/types/app/api/fs/browse/route.ts +347 -0
  502. package/.next/types/app/api/fs/recent-paths/route.ts +347 -0
  503. package/.next/types/app/api/repositories/validate-path/route.ts +347 -0
  504. package/.next/types/routes.d.ts +4 -1
  505. package/.next/types/validator.ts +27 -0
  506. package/dist/cli/commands/init.d.ts.map +1 -1
  507. package/dist/cli/commands/init.js +15 -0
  508. package/dist/cli/types/index.d.ts +6 -0
  509. package/dist/cli/types/index.d.ts.map +1 -1
  510. package/dist/cli/utils/env-setup.d.ts +8 -0
  511. package/dist/cli/utils/env-setup.d.ts.map +1 -1
  512. package/dist/cli/utils/env-setup.js +23 -0
  513. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +120 -34
  514. package/dist/server/src/lib/detection/cli-patterns.js +27 -3
  515. package/dist/server/src/lib/detection/prompt-detect-multiple-choice.js +19 -0
  516. package/dist/server/src/lib/git/git-exec.js +48 -1
  517. package/dist/server/src/lib/selected-agents-validator.js +3 -2
  518. package/dist/server/src/lib/session/current-output-builder.js +10 -1
  519. package/dist/server/src/lib/tmux/tmux.js +26 -0
  520. package/dist/server/src/types/markdown-editor.js +13 -1
  521. package/package.json +1 -1
  522. package/.next/server/chunks/186.js +0 -1
  523. package/.next/server/chunks/7013.js +0 -1
  524. package/.next/server/chunks/9067.js +0 -1
  525. package/.next/static/Etea8LidpB8eWOTac-R8b/_buildManifest.js +0 -1
  526. package/.next/static/chunks/1668-e703b8b55775844b.js +0 -1
  527. package/.next/static/chunks/2069-c55de93eb6403961.js +0 -1
  528. package/.next/static/chunks/4027-0c529b322be7d4d8.js +0 -1
  529. package/.next/static/chunks/530.e377b0f1a7a89620.js +0 -1
  530. package/.next/static/chunks/6007-de36119357dcd418.js +0 -1
  531. package/.next/static/chunks/6497-dc26c6c6b0b15adf.js +0 -1
  532. package/.next/static/chunks/8361.4bf062be2d2962f4.js +0 -1
  533. package/.next/static/chunks/8566-b8bbcfd837cc338b.js +0 -1
  534. package/.next/static/chunks/934-a37509667baa86ee.js +0 -1
  535. package/.next/static/chunks/app/api/app/update/route-56dad0523d3c4a92.js +0 -1
  536. package/.next/static/chunks/app/api/app/update-check/route-56dad0523d3c4a92.js +0 -1
  537. package/.next/static/chunks/app/api/assistant/conversation/route-56dad0523d3c4a92.js +0 -1
  538. package/.next/static/chunks/app/api/assistant/current-output/route-56dad0523d3c4a92.js +0 -1
  539. package/.next/static/chunks/app/api/assistant/messages/route-56dad0523d3c4a92.js +0 -1
  540. package/.next/static/chunks/app/api/assistant/session/route-56dad0523d3c4a92.js +0 -1
  541. package/.next/static/chunks/app/api/assistant/start/route-56dad0523d3c4a92.js +0 -1
  542. package/.next/static/chunks/app/api/assistant/terminal/route-56dad0523d3c4a92.js +0 -1
  543. package/.next/static/chunks/app/api/assistant/tools/route-56dad0523d3c4a92.js +0 -1
  544. package/.next/static/chunks/app/api/auth/login/route-56dad0523d3c4a92.js +0 -1
  545. package/.next/static/chunks/app/api/auth/logout/route-56dad0523d3c4a92.js +0 -1
  546. package/.next/static/chunks/app/api/auth/status/route-56dad0523d3c4a92.js +0 -1
  547. package/.next/static/chunks/app/api/daily-summary/route-56dad0523d3c4a92.js +0 -1
  548. package/.next/static/chunks/app/api/daily-summary/status/route-56dad0523d3c4a92.js +0 -1
  549. package/.next/static/chunks/app/api/external-apps/[id]/health/route-56dad0523d3c4a92.js +0 -1
  550. package/.next/static/chunks/app/api/external-apps/[id]/route-56dad0523d3c4a92.js +0 -1
  551. package/.next/static/chunks/app/api/external-apps/route-56dad0523d3c4a92.js +0 -1
  552. package/.next/static/chunks/app/api/hooks/claude-done/route-56dad0523d3c4a92.js +0 -1
  553. package/.next/static/chunks/app/api/ollama/models/route-56dad0523d3c4a92.js +0 -1
  554. package/.next/static/chunks/app/api/push/subscriptions/route-56dad0523d3c4a92.js +0 -1
  555. package/.next/static/chunks/app/api/push/vapid/route-56dad0523d3c4a92.js +0 -1
  556. package/.next/static/chunks/app/api/repositories/[id]/route-56dad0523d3c4a92.js +0 -1
  557. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +0 -1
  558. package/.next/static/chunks/app/api/repositories/[id]/todos/route-56dad0523d3c4a92.js +0 -1
  559. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-56dad0523d3c4a92.js +0 -1
  560. package/.next/static/chunks/app/api/repositories/clone/route-56dad0523d3c4a92.js +0 -1
  561. package/.next/static/chunks/app/api/repositories/excluded/route-56dad0523d3c4a92.js +0 -1
  562. package/.next/static/chunks/app/api/repositories/restore/route-56dad0523d3c4a92.js +0 -1
  563. package/.next/static/chunks/app/api/repositories/route-56dad0523d3c4a92.js +0 -1
  564. package/.next/static/chunks/app/api/repositories/scan/route-56dad0523d3c4a92.js +0 -1
  565. package/.next/static/chunks/app/api/repositories/sync/route-56dad0523d3c4a92.js +0 -1
  566. package/.next/static/chunks/app/api/sidebar/group-order/route-56dad0523d3c4a92.js +0 -1
  567. package/.next/static/chunks/app/api/skills/[id]/route-56dad0523d3c4a92.js +0 -1
  568. package/.next/static/chunks/app/api/skills/route-56dad0523d3c4a92.js +0 -1
  569. package/.next/static/chunks/app/api/slash-commands/route-56dad0523d3c4a92.js +0 -1
  570. package/.next/static/chunks/app/api/templates/[id]/route-56dad0523d3c4a92.js +0 -1
  571. package/.next/static/chunks/app/api/templates/route-56dad0523d3c4a92.js +0 -1
  572. package/.next/static/chunks/app/api/todos/route-56dad0523d3c4a92.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-56dad0523d3c4a92.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-56dad0523d3c4a92.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-56dad0523d3c4a92.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-56dad0523d3c4a92.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-56dad0523d3c4a92.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-56dad0523d3c4a92.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-56dad0523d3c4a92.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-56dad0523d3c4a92.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-56dad0523d3c4a92.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-56dad0523d3c4a92.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-56dad0523d3c4a92.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-56dad0523d3c4a92.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-56dad0523d3c4a92.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-56dad0523d3c4a92.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-56dad0523d3c4a92.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-56dad0523d3c4a92.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-56dad0523d3c4a92.js +0 -1
  590. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-56dad0523d3c4a92.js +0 -1
  591. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-56dad0523d3c4a92.js +0 -1
  592. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-56dad0523d3c4a92.js +0 -1
  593. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-56dad0523d3c4a92.js +0 -1
  594. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-56dad0523d3c4a92.js +0 -1
  595. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-56dad0523d3c4a92.js +0 -1
  596. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-56dad0523d3c4a92.js +0 -1
  597. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-56dad0523d3c4a92.js +0 -1
  598. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-56dad0523d3c4a92.js +0 -1
  599. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-56dad0523d3c4a92.js +0 -1
  600. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-56dad0523d3c4a92.js +0 -1
  601. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-56dad0523d3c4a92.js +0 -1
  602. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-56dad0523d3c4a92.js +0 -1
  603. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-56dad0523d3c4a92.js +0 -1
  604. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-56dad0523d3c4a92.js +0 -1
  605. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-56dad0523d3c4a92.js +0 -1
  606. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-56dad0523d3c4a92.js +0 -1
  607. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-56dad0523d3c4a92.js +0 -1
  608. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-56dad0523d3c4a92.js +0 -1
  609. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-56dad0523d3c4a92.js +0 -1
  610. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-56dad0523d3c4a92.js +0 -1
  611. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-56dad0523d3c4a92.js +0 -1
  612. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-56dad0523d3c4a92.js +0 -1
  613. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-56dad0523d3c4a92.js +0 -1
  614. package/.next/static/chunks/app/api/worktrees/[id]/route-56dad0523d3c4a92.js +0 -1
  615. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-56dad0523d3c4a92.js +0 -1
  616. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-56dad0523d3c4a92.js +0 -1
  617. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-56dad0523d3c4a92.js +0 -1
  618. package/.next/static/chunks/app/api/worktrees/[id]/search/route-56dad0523d3c4a92.js +0 -1
  619. package/.next/static/chunks/app/api/worktrees/[id]/send/route-56dad0523d3c4a92.js +0 -1
  620. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-56dad0523d3c4a92.js +0 -1
  621. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-56dad0523d3c4a92.js +0 -1
  622. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-56dad0523d3c4a92.js +0 -1
  623. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-56dad0523d3c4a92.js +0 -1
  624. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-56dad0523d3c4a92.js +0 -1
  625. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-56dad0523d3c4a92.js +0 -1
  626. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-56dad0523d3c4a92.js +0 -1
  627. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-56dad0523d3c4a92.js +0 -1
  628. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-56dad0523d3c4a92.js +0 -1
  629. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-56dad0523d3c4a92.js +0 -1
  630. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-56dad0523d3c4a92.js +0 -1
  631. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +0 -1
  632. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-56dad0523d3c4a92.js +0 -1
  633. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-56dad0523d3c4a92.js +0 -1
  634. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-56dad0523d3c4a92.js +0 -1
  635. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-56dad0523d3c4a92.js +0 -1
  636. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-56dad0523d3c4a92.js +0 -1
  637. package/.next/static/chunks/app/api/worktrees/route-56dad0523d3c4a92.js +0 -1
  638. package/.next/static/chunks/app/chat/page-9cf4ba62e21d9074.js +0 -1
  639. package/.next/static/chunks/app/manifest.webmanifest/route-56dad0523d3c4a92.js +0 -1
  640. package/.next/static/chunks/app/proxy/[...path]/route-56dad0523d3c4a92.js +0 -1
  641. package/.next/static/chunks/app/repositories/page-70d4b997492884b8.js +0 -1
  642. package/.next/static/chunks/app/skills/[skillId]/page-68ed5e9186efe56d.js +0 -1
  643. package/.next/static/chunks/app/worktrees/[id]/page-f2801662a721faab.js +0 -1
  644. package/.next/static/chunks/webpack-0f9275e279c058eb.js +0 -1
  645. package/.next/static/css/b4bdb1f3457fe9a7.css +0 -1
  646. /package/.next/static/{Etea8LidpB8eWOTac-R8b → MqlW91_Se_kEW6mtm-1x0}/_ssgManifest.js +0 -0
@@ -29,8 +29,18 @@
29
29
  * `[Pasted text #\d+` placeholder. That placeholder is used only as one
30
30
  * "still pending" positive signal (broadened to be version-resilient); the
31
31
  * primary decision is "is the message still sitting on the input line?".
32
+ *
33
+ * Issue #1501 hardens the "still pending" branch. A TUI completion popup can
34
+ * REPLACE the typed body with a different command (`/status` -> `/statusline`,
35
+ * `/review` -> `/teamwork-preview`) when Enter selects a highlighted suggestion.
36
+ * The old substring check misread the replacement as "still typed" and resent
37
+ * Enter (executing the wrong command), or as "submitted" and left the residual
38
+ * behind (detonating on the next send). The decision is now three-valued —
39
+ * submitted / pending / replaced — and a `replaced` verdict clears the input
40
+ * line and THROWS instead of resending Enter (see classifySubmit).
32
41
  */
33
42
  Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.classifySubmit = classifySubmit;
34
44
  exports.isSubmitted = isSubmitted;
35
45
  exports.sendMessageWithSubmitVerification = sendMessageWithSubmitVerification;
36
46
  const tmux_1 = require("../tmux/tmux");
@@ -49,6 +59,18 @@ const logger = (0, logger_1.createLogger)('cli-tools/submit-verified-sender');
49
59
  * a tool that never renders it simply never matches.
50
60
  */
51
61
  const PASTE_PLACEHOLDER_PATTERN = /\[Pasted text[\s#]/;
62
+ /**
63
+ * A slash-command sitting on the input line (Issue #1501).
64
+ *
65
+ * TUI completion popups replace a typed slash command with a highlighted menu
66
+ * item (`/status` -> `/statusline`, `/review` -> `/teamwork-preview`); the
67
+ * result is always another slash command. Scoping the "replaced" verdict to
68
+ * `/…` text keeps idle-prompt placeholders that some TUIs paint on an empty
69
+ * composer (gemini's "Type your message or @path", claude's hints, "? for
70
+ * shortcuts") — none of which start with `/` — from being mistaken for a
71
+ * substitution, so a genuinely-submitted message never fails spuriously.
72
+ */
73
+ const REPLACEMENT_COMMAND_PATTERN = /^\/[A-Za-z]/;
52
74
  /**
53
75
  * Prompt input-line markers across the supported TUIs.
54
76
  * claude/gemini/copilot: `>` or `❯`; codex: `›`; antigravity: `>`;
@@ -59,22 +81,18 @@ const INPUT_LINE_MARKER = /^\s*(?:ctx:\d+%\s*)?[>❯›]/;
59
81
  const VERIFY_WINDOW_LINES = 12;
60
82
  /** Default bounded read-back attempts before giving up (throwing). */
61
83
  const DEFAULT_VERIFY_ATTEMPTS = 4;
62
- /** Minimum fragment length used to decide the body is still on the input line. */
63
- const MIN_FRAGMENT_LENGTH = 3;
64
- const MAX_FRAGMENT_LENGTH = 24;
65
84
  /**
66
- * First non-blank fragment of the message, used to decide whether the body is
67
- * still sitting on the input line. Only the first line matters because that is
68
- * what a TUI shows on the prompt line before folding into a paste placeholder.
85
+ * First non-blank line of the message, trimmed. This is what a TUI shows on the
86
+ * prompt line before the body folds into a paste placeholder. NOT truncated:
87
+ * the replacement check (inputMatchesBody) needs the full first line so that a
88
+ * completion suffix (`/status` -> `/statusline`) is not mistaken for the body.
69
89
  */
70
- function comparableFragment(message) {
71
- const firstLine = message
90
+ function firstNonBlankLine(message) {
91
+ const line = message
72
92
  .split('\n')
73
93
  .map((l) => l.trim())
74
94
  .find((l) => l.length > 0);
75
- if (!firstLine)
76
- return '';
77
- return firstLine.slice(0, MAX_FRAGMENT_LENGTH);
95
+ return line ?? '';
78
96
  }
79
97
  /**
80
98
  * Locate the active input line within the pane tail: the last line that begins
@@ -90,40 +108,87 @@ function findInputLine(windowLines) {
90
108
  }
91
109
  return null;
92
110
  }
111
+ /** Input line text with the prompt marker stripped and surrounding space trimmed. */
112
+ function stripInputMarker(inputLine) {
113
+ return inputLine.replace(INPUT_LINE_MARKER, '').trim();
114
+ }
93
115
  /**
94
- * Decide whether a captured pane shows the message as submitted.
116
+ * Whether the (marker-stripped, non-empty) input-line text is still our
117
+ * unsent body rather than a TUI-substituted command.
118
+ *
119
+ * The still-unsent body appears verbatim on the input line. Line wrapping can
120
+ * visually truncate it to a PREFIX of the first line, but a completion popup
121
+ * always produces a DIFFERENT string — the body plus a completion suffix
122
+ * (`/status` -> `/statusline`) or an unrelated command (`/review` ->
123
+ * `/teamwork-preview`) — which is never a prefix of the body. So the body is
124
+ * "still there" iff the input text is a prefix of (or equals) the body's first
125
+ * line. This deliberately rejects `/statusline` for a `/status` body: the safe
126
+ * rule is "input text that is not the body (or a prefix of it) is NOT resent".
127
+ */
128
+ function inputMatchesBody(strippedInput, message) {
129
+ const bodyFirstLine = firstNonBlankLine(message);
130
+ if (bodyFirstLine.length === 0)
131
+ return false;
132
+ return bodyFirstLine.startsWith(strippedInput);
133
+ }
134
+ /**
135
+ * Classify a captured pane into submitted / pending / replaced (Issue #1501).
95
136
  *
96
137
  * Version-independent by design — does NOT require the paste placeholder:
97
- * A. The tool is generating a response -> submitted.
98
- * B. A paste placeholder is on the input line -> NOT submitted (Enter eaten).
99
- * C. The body fragment is still on the input line -> NOT submitted.
100
- * D. Otherwise (empty input line / moved to history) -> submitted.
138
+ * A. The tool is generating a response -> submitted.
139
+ * B. No input line, or the input line is empty -> submitted.
140
+ * C. A paste placeholder is folded on the input line -> pending (Enter eaten).
141
+ * D. The body is still verbatim on the input line -> pending (resend Enter).
142
+ * E. A DIFFERENT slash command is on the input line -> replaced (TUI popup
143
+ * autocompleted the command; clear the line and throw, never resend Enter).
144
+ * F. Any other non-empty text (idle placeholder/hint) -> submitted (unchanged
145
+ * pre-#1501 permissive default, so normal sends never spuriously fail).
101
146
  *
102
- * B and C are scoped to the input line only, so the user-message echo that a
103
- * TUI prints into its history above the prompt never causes a false "pending".
147
+ * C–F are scoped to the input line only, so the user-message echo that a TUI
148
+ * prints into its history above the prompt never causes a false verdict.
104
149
  */
105
- function isSubmitted(output, cliToolId, message) {
150
+ function classifySubmit(output, cliToolId, message) {
106
151
  const clean = (0, cli_patterns_1.stripAnsi)(output);
107
152
  const windowLines = clean.split('\n').slice(-VERIFY_WINDOW_LINES);
108
153
  const windowStr = windowLines.join('\n');
109
154
  // A. Actively generating a response => the message was accepted.
110
155
  if ((0, cli_patterns_1.detectThinking)(cliToolId, windowStr)) {
111
- return true;
156
+ return 'submitted';
112
157
  }
113
158
  const inputLine = findInputLine(windowLines);
114
- if (inputLine) {
115
- // B. A paste placeholder is still folded on the input line => not submitted.
116
- if (PASTE_PLACEHOLDER_PATTERN.test(inputLine)) {
117
- return false;
118
- }
119
- // C. The typed body is still sitting on the input line => not submitted.
120
- const fragment = comparableFragment(message);
121
- if (fragment.length >= MIN_FRAGMENT_LENGTH && inputLine.includes(fragment)) {
122
- return false;
123
- }
159
+ // B. No input line visible => the prompt scrolled off / moved on => submitted.
160
+ if (!inputLine) {
161
+ return 'submitted';
162
+ }
163
+ const strippedInput = stripInputMarker(inputLine);
164
+ // B. Empty input line => the message left the box => submitted.
165
+ if (strippedInput.length === 0) {
166
+ return 'submitted';
167
+ }
168
+ // C. A paste placeholder is still folded on the input line => body is there.
169
+ if (PASTE_PLACEHOLDER_PATTERN.test(inputLine)) {
170
+ return 'pending';
124
171
  }
125
- // D. Input line is clear (or absent) and nothing is generating => submitted.
126
- return true;
172
+ // D. The typed body is still sitting on the input line => resend Enter.
173
+ if (inputMatchesBody(strippedInput, message)) {
174
+ return 'pending';
175
+ }
176
+ // E. A different slash command is on the input line => a completion popup
177
+ // replaced what we typed. (Scoped to `/…` so idle-prompt placeholders that
178
+ // some TUIs paint on an empty composer are never mistaken for this.)
179
+ if (REPLACEMENT_COMMAND_PATTERN.test(strippedInput)) {
180
+ return 'replaced';
181
+ }
182
+ // F. Non-empty, non-command steady-state text (idle placeholder / hint) =>
183
+ // submitted, preserving the pre-#1501 permissive default.
184
+ return 'submitted';
185
+ }
186
+ /**
187
+ * Backward-compatible boolean view of {@link classifySubmit}: submitted vs not.
188
+ * A `replaced` verdict is NOT "submitted", so this returns false for it too.
189
+ */
190
+ function isSubmitted(output, cliToolId, message) {
191
+ return classifySubmit(output, cliToolId, message) === 'submitted';
127
192
  }
128
193
  /**
129
194
  * Type a message body and submit it, then verify the submit actually happened.
@@ -156,11 +221,32 @@ async function sendMessageWithSubmitVerification(params) {
156
221
  for (let attempt = 0; attempt < attempts; attempt++) {
157
222
  await new Promise((resolve) => setTimeout(resolve, verifyDelayMs));
158
223
  const output = await (0, tmux_1.capturePane)(sessionName, { startLine: -VERIFY_WINDOW_LINES });
159
- if (isSubmitted(output, cliToolId, message)) {
224
+ const state = classifySubmit(output, cliToolId, message);
225
+ if (state === 'submitted') {
160
226
  (0, tmux_capture_cache_1.invalidateCache)(sessionName);
161
227
  return;
162
228
  }
163
- // Still typed-but-unsent resend a single Enter and re-check.
229
+ if (state === 'replaced') {
230
+ // A TUI completion popup replaced our command with a different one.
231
+ // Resending Enter would EXECUTE that command (Issue #1501 flavor A);
232
+ // leaving it in place lets the residual detonate on the next send
233
+ // (flavor B). Clear the input line (best-effort) and surface the failure
234
+ // to the caller instead of ever resending Enter.
235
+ try {
236
+ await (0, tmux_1.clearInputLine)(sessionName);
237
+ }
238
+ catch (clearError) {
239
+ logger.error('submit-clear-input-failed', {
240
+ sessionName,
241
+ cliToolId,
242
+ error: clearError instanceof Error ? clearError.message : String(clearError),
243
+ });
244
+ }
245
+ (0, tmux_capture_cache_1.invalidateCache)(sessionName);
246
+ logger.error('submit-replaced-by-tui-completion', { sessionName, cliToolId, attempt });
247
+ throw new Error(`Message was replaced by a TUI autocompletion for session ${sessionName}; the input no longer matches the sent text. Cleared the input line without submitting to avoid executing a different command.`);
248
+ }
249
+ // state === 'pending' — still typed-but-unsent, resend a single Enter and re-check.
164
250
  logger.warn('submit-not-confirmed:resending-enter', {
165
251
  sessionName,
166
252
  cliToolId,
@@ -4,7 +4,7 @@
4
4
  * Shared between response-poller.ts and API routes
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_SELECTION_LIST_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
7
+ exports.CLAUDE_SESSION_ERROR_REGEX_PATTERNS = exports.CLAUDE_SESSION_ERROR_PATTERNS = exports.extractAnsiSequences = exports.stripAnsi = exports.ANTIGRAVITY_SKIP_PATTERNS = exports.ANTIGRAVITY_SELECTION_LIST_PATTERN = exports.ANTIGRAVITY_SEPARATOR_PATTERN = exports.ANTIGRAVITY_THINKING_PATTERN = exports.ANTIGRAVITY_PROMPT_PATTERN = exports.VIBE_LOCAL_THINKING_PATTERN = exports.VIBE_LOCAL_PROMPT_PATTERN = exports.COPILOT_SKIP_PATTERNS = exports.COPILOT_SELECTION_LIST_PATTERN = exports.COPILOT_SEPARATOR_PATTERN = exports.COPILOT_THINKING_PATTERN = exports.COPILOT_PROMPT_PATTERN = exports.OPENCODE_SKIP_PATTERNS = exports.OPENCODE_SEPARATOR_PATTERN = exports.CLAUDE_SELECTION_LIST_FOOTER = exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = exports.OPENCODE_SELECTION_LIST_PATTERN = exports.OPENCODE_PROCESSING_INDICATOR = exports.OPENCODE_RESPONSE_COMPLETE = exports.OPENCODE_LOADING_PATTERN = exports.OPENCODE_THINKING_PATTERN = exports.OPENCODE_PROMPT_AFTER_RESPONSE = exports.OPENCODE_PROMPT_PATTERN = exports.GEMINI_THINKING_PATTERN = exports.GEMINI_PROMPT_PATTERN = exports.MAX_PASTED_TEXT_RETRIES = exports.PASTED_TEXT_DETECT_DELAY = exports.PASTED_TEXT_PATTERN = exports.CODEX_STATUS_BAR_PATTERN = exports.CODEX_PAGER_FOOTER_PATTERN = exports.CODEX_SELECTION_LIST_PATTERN = exports.CODEX_SEPARATOR_PATTERN = exports.CODEX_DIALOG_PATTERN = exports.CODEX_PROMPT_PATTERN = exports.CLAUDE_TRUST_DIALOG_PATTERN = exports.CLAUDE_SEPARATOR_PATTERN = exports.CLAUDE_PROMPT_PATTERN = exports.CODEX_THINKING_PATTERN = exports.CLAUDE_INTERRUPT_HINT_PATTERN = exports.CLAUDE_THINKING_PATTERN = exports.CLAUDE_SPINNER_CHARS = void 0;
8
8
  exports.findClaudeChromeStart = findClaudeChromeStart;
9
9
  exports.isCodexPromptReady = isCodexPromptReady;
10
10
  exports.getCodexActiveDialog = getCodexActiveDialog;
@@ -464,6 +464,23 @@ exports.OPENCODE_PROCESSING_INDICATOR = /esc interrupt/;
464
464
  * " Connect a provider esc"
465
465
  */
466
466
  exports.OPENCODE_SELECTION_LIST_PATTERN = /^\s*(Select\s+(model|provider)|Connect\s+a\s+provider)/m;
467
+ /**
468
+ * [Issue #1495] Footer signature of Claude Code's `/model` local-settings overlay.
469
+ * Verified against a real Claude Code v2.1.218 capture, the footer reads:
470
+ * "Enter to set as default · s to use this session only · Esc to cancel"
471
+ *
472
+ * The overlay renders a ❯-marked numbered model list ("1. Default … 5. Haiku")
473
+ * under a "Select model" header that detectMultipleChoicePrompt() otherwise
474
+ * matches as a genuine multiple_choice prompt — which let Auto-Yes Enter-confirm
475
+ * a selection and silently change the user's default model. This "set as default"
476
+ * phrasing is unique to the model picker: genuine confirmation prompts never
477
+ * contain it (the trust dialog uses "Enter to confirm · Esc to cancel", Bash-tool
478
+ * approvals use "Esc to cancel · Tab to amend", AskUserQuestion uses
479
+ * "Enter to select · … to navigate"), so it is a safe exclusion signal.
480
+ *
481
+ * Linear pattern, no nested quantifiers — ReDoS safe (S4-001).
482
+ */
483
+ exports.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN = /Enter\s+to\s+set\s+as\s+default\b/i;
467
484
  /**
468
485
  * Claude CLI selection list footer pattern
469
486
  * Detects Claude CLI's interactive selection prompts that require
@@ -472,9 +489,16 @@ exports.OPENCODE_SELECTION_LIST_PATTERN = /^\s*(Select\s+(model|provider)|Connec
472
489
  * Matches footer instruction lines (known variants):
473
490
  * "Enter to select · Tab/Arrow keys to navigate · Esc to cancel"
474
491
  * "Enter to select · ↑/↓ to navigate · n to add notes · Esc to cancel"
475
- * "Enter to confirm · Esc to exit" (/model command)
492
+ * "Enter to confirm · Esc to exit" (legacy /model command footer)
493
+ * "Enter to set as default · s to use this session only · Esc to cancel"
494
+ * (/model command footer as of Claude Code v2.1.218 — Issue #1495)
495
+ *
496
+ * The "set as default" branch lets status-detector classify the `/model` overlay
497
+ * as a Claude selection list (NavigationButtons + ESC hatch, hasActivePrompt=false)
498
+ * once detectPrompt() no longer reports it as a prompt (see
499
+ * CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN).
476
500
  */
477
- exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc)/;
501
+ exports.CLAUDE_SELECTION_LIST_FOOTER = /Enter\s+to\s+(?:select\s+.*to\s+navigate|confirm\s+·\s+Esc|set\s+as\s+default)/;
478
502
  /**
479
503
  * OpenCode TUI separator pattern (Issue #379)
480
504
  * Matches lines composed entirely of box-drawing / TUI decoration characters.
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
4
4
  exports.buildMultipleChoiceResult = buildMultipleChoiceResult;
5
5
  exports.detectMultipleChoicePrompt = detectMultipleChoicePrompt;
6
6
  const tui_detection_frame_1 = require("./tui-detection-frame");
7
+ const cli_patterns_1 = require("./cli-patterns");
7
8
  // ============================================================================
8
9
  // Constants
9
10
  // ============================================================================
@@ -590,6 +591,24 @@ function detectMultipleChoicePrompt(output, options, truncateRawContentFn) {
590
591
  }
591
592
  }
592
593
  const scanWindow = lines.slice(scanStart, effectiveEnd);
594
+ // [Issue #1495] Claude `/model` local-settings overlay guard.
595
+ // The `/model` overlay renders a ❯-marked numbered model list ("1. Default …
596
+ // 5. Haiku") under a "Select model" header, which the option-collection logic
597
+ // below would otherwise return as a genuine multiple_choice prompt. Auto-Yes
598
+ // (detectAndRespondToPrompt) calls detectPrompt() directly and would resolve +
599
+ // Enter-confirm the default option — silently changing the user's default model.
600
+ // The overlay-unique "Enter to set as default …" footer never appears in real
601
+ // confirmation prompts (permission dialogs, the trust dialog, AskUserQuestion),
602
+ // so bailing out here stops Auto-Yes without touching any real-prompt path. The
603
+ // overlay is modal — no genuine prompt can be active at the same time, and the
604
+ // Claude TUI repaints the overlay away on close, so a stale footer cannot linger
605
+ // in the captured pane. status-detector then reclassifies it as a Claude
606
+ // selection list via CLAUDE_SELECTION_LIST_FOOTER (NavigationButtons + ESC hatch).
607
+ for (const rawLine of scanWindow) {
608
+ if (cli_patterns_1.CLAUDE_MODEL_OVERLAY_FOOTER_PATTERN.test(rawLine)) {
609
+ return noPromptResult(output);
610
+ }
611
+ }
593
612
  // Single-pass footer detection: identify both confirmation footer presence and
594
613
  // specific "press number to confirm" variant in one iteration (Issue #616).
595
614
  let hasConfirmationFooter = false;
@@ -20,6 +20,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
20
20
  Object.defineProperty(exports, "__esModule", { value: true });
21
21
  exports.GIT_LOG_TIMEOUT_MS = exports.execFileAsync = void 0;
22
22
  exports.execGitCommand = execGitCommand;
23
+ exports.execGitCommandCapture = execGitCommandCapture;
23
24
  exports.execGitCommandTyped = execGitCommandTyped;
24
25
  exports.runSerializedWrite = runSerializedWrite;
25
26
  exports.execGitConflictAware = execGitConflictAware;
@@ -66,6 +67,42 @@ async function execGitCommand(args, cwd) {
66
67
  return null;
67
68
  }
68
69
  }
70
+ /**
71
+ * Execute a READ-ONLY git command like {@link execGitCommand} (never throws,
72
+ * same default 1s timeout) but return the stderr alongside the outcome instead
73
+ * of collapsing every failure into `null` (Issue #1515, B-1).
74
+ *
75
+ * execGitCommand is intentionally left untouched: its all-failures-to-null
76
+ * contract is relied on by the high-frequency getGitStatus path. This variant
77
+ * exists for the single caller (getAheadBehind) that must tell "no upstream"
78
+ * apart from "upstream gone" / "detached" / "error".
79
+ *
80
+ * Deliberately does NOT log: the failures it reports are EXPECTED states
81
+ * (a branch with no upstream) polled every few seconds, and its caller logs a
82
+ * classified reason instead of the raw stderr.
83
+ *
84
+ * @param args - Git command arguments (static array; no shell)
85
+ * @param cwd - Working directory (must be from DB, trusted source)
86
+ * @param timeout - Timeout in ms (defaults to the 1s status-read timeout)
87
+ */
88
+ async function execGitCommandCapture(args, cwd, timeout = GIT_COMMAND_TIMEOUT_MS) {
89
+ try {
90
+ const { stdout, stderr } = await (0, exports.execFileAsync)('git', args, { cwd, timeout });
91
+ return { ok: true, stdout: stdout.trim(), stderr: stderr ?? '', timedOut: false };
92
+ }
93
+ catch (error) {
94
+ const err = error;
95
+ const timedOut = err.killed === true ||
96
+ err.code === 'ERR_CHILD_PROCESS_EXEC_TIMEOUT' ||
97
+ err.code === 'ETIMEDOUT';
98
+ return {
99
+ ok: false,
100
+ stdout: '',
101
+ stderr: `${err.stderr ?? ''} ${err.message ?? ''}`,
102
+ timedOut,
103
+ };
104
+ }
105
+ }
69
106
  /**
70
107
  * Execute a git command with timeout, distinguishing error types
71
108
  * Unlike execGitCommand, this throws typed errors for API-level error handling.
@@ -265,10 +302,20 @@ classifyNetwork = false) {
265
302
  * Does NOT use execGitCommandTyped (whose preserve regex stays unmodified) and
266
303
  * does NOT log the raw stderr/message (DR4-002): a failed network op's stderr can
267
304
  * echo a credential-bearing remote URL, and the typed error carries no message.
305
+ *
306
+ * Issue #1515 (E-1): runs with `GIT_TERMINAL_PROMPT=0` so a remote that needs
307
+ * credentials fails FAST with "could not read Username" (-> GitAuthFailedError,
308
+ * 401) instead of blocking on an interactive prompt until the timeout. This is
309
+ * load-bearing for the Current Status refresh button, which now fetches (A-1) on
310
+ * a user click and must never leave the UI waiting on an invisible prompt.
268
311
  */
269
312
  async function execGitNetworkAware(args, worktreePath, timeout) {
270
313
  try {
271
- const { stdout } = await (0, exports.execFileAsync)('git', args, { cwd: worktreePath, timeout });
314
+ const { stdout } = await (0, exports.execFileAsync)('git', args, {
315
+ cwd: worktreePath,
316
+ timeout,
317
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
318
+ });
272
319
  return stdout;
273
320
  }
274
321
  catch (error) {
@@ -20,9 +20,10 @@ exports.MIN_SELECTED_AGENTS = 2;
20
20
  exports.MAX_SELECTED_AGENTS = 6;
21
21
  /**
22
22
  * Default selected agents when DB value is missing or invalid.
23
- * Issue #989: PC default expands to 6 agents (claude/codex/gemini/opencode/copilot/antigravity).
23
+ * Issue #1516: narrowed to the 3 agents in routine use (claude/codex/antigravity).
24
+ * The others stay selectable via CLI_TOOL_IDS — they are just not preselected.
24
25
  */
25
- exports.DEFAULT_SELECTED_AGENTS = ['claude', 'codex', 'gemini', 'opencode', 'copilot', 'antigravity'];
26
+ exports.DEFAULT_SELECTED_AGENTS = ['claude', 'codex', 'antigravity'];
26
27
  /**
27
28
  * Core validation function for CLI tool ID arrays (R1-001)
28
29
  * Accepts 2-5 unique valid CLI tool IDs (Issue #836).
@@ -53,7 +53,16 @@ async function buildCurrentOutput(db, worktreeId, cliToolId, instanceId) {
53
53
  const isPromptWaiting = statusResult.hasActivePrompt;
54
54
  const isSelectionListActive = statusResult.status === 'waiting' && status_detector_1.SELECTION_LIST_REASONS.has(statusResult.reason);
55
55
  const isPagerActive = statusResult.reason === status_detector_1.STATUS_REASON.CODEX_PAGER;
56
- const isUnclassifiedActive = statusResult.status === 'running' && statusResult.reason === status_detector_1.STATUS_REASON.DEFAULT;
56
+ // Issue #1497: the detection-independent nav hatch (#1017/#1494) is gated on
57
+ // isUnclassifiedActive. A static, unrecognized TUI overlay (e.g. Claude `/help`)
58
+ // whose frame stops changing degrades from `running`/`default` to `ready`/
59
+ // `no_recent_output` once the Auto-Yes poller has stamped lastOutputTimestamp
60
+ // (its sole writer, auto-yes-poller.ts). That is still an interactive-but-
61
+ // unclassified frame — a real idle prompt (`❯`) is classified earlier as
62
+ // `input_prompt`, never as `no_recent_output` — so treat the timed-out fallback
63
+ // as unclassified too and keep the hatch open instead of stranding the user.
64
+ const isUnclassifiedActive = (statusResult.status === 'running' && statusResult.reason === status_detector_1.STATUS_REASON.DEFAULT) ||
65
+ (statusResult.status === 'ready' && statusResult.reason === status_detector_1.STATUS_REASON.NO_RECENT_OUTPUT);
57
66
  const realtimeSnippet = lines.slice(-100).join('\n');
58
67
  const autoYesState = (0, auto_yes_manager_1.getAutoYesState)(worktreeId, cliToolId, instanceId);
59
68
  return {
@@ -17,6 +17,7 @@ exports.capturePane = capturePane;
17
17
  exports.killSession = killSession;
18
18
  exports.ensureSession = ensureSession;
19
19
  exports.sendSpecialKey = sendSpecialKey;
20
+ exports.clearInputLine = clearInputLine;
20
21
  exports.isAllowedSpecialKey = isAllowedSpecialKey;
21
22
  exports.sendSpecialKeysAndInvalidate = sendSpecialKeysAndInvalidate;
22
23
  const child_process_1 = require("child_process");
@@ -477,6 +478,31 @@ async function sendSpecialKey(sessionName, key) {
477
478
  throw new Error(`Failed to send special key: ${errorMessage}`);
478
479
  }
479
480
  }
481
+ /**
482
+ * Clear whatever text is currently sitting on the TUI input line (Issue #1501).
483
+ *
484
+ * Sends a single `C-u` (kill-line-before-cursor) so the prompt is wiped. Used by
485
+ * the submit-verified sender when it detects that a TUI popup autocompleted the
486
+ * typed command into a DIFFERENT one (e.g. `/status` -> `/statusline`): the
487
+ * residual text must be removed so it can neither be executed by a stray Enter
488
+ * nor detonate on the next send.
489
+ *
490
+ * `C-u` is a fixed literal passed via execFile (no shell, no injection) and is
491
+ * intentionally NOT added to ALLOWED_SPECIAL_KEYS / NAVIGATION_KEY_VALUES — it is
492
+ * an internal recovery primitive, never exposed through the special-keys API.
493
+ *
494
+ * @param sessionName - Target session name
495
+ * @throws {Error} If the tmux command fails
496
+ */
497
+ async function clearInputLine(sessionName) {
498
+ try {
499
+ await execFileAsync('tmux', ['send-keys', '-t', exactTarget(sessionName), 'C-u'], { timeout: DEFAULT_TIMEOUT });
500
+ }
501
+ catch (error) {
502
+ const errorMessage = error instanceof Error ? error.message : String(error);
503
+ throw new Error(`Failed to clear tmux input line: ${errorMessage}`);
504
+ }
505
+ }
480
506
  /**
481
507
  * Allowed navigation key names for special-keys API validation.
482
508
  * Used for TUI navigation sequences (e.g., Up/Down cursor, Enter/Escape selection).
@@ -5,7 +5,7 @@
5
5
  * @module types/markdown-editor
6
6
  */
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.DEFAULT_LAYOUT_STATE = exports.AUTO_SAVE_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_AUTO_SAVE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
8
+ exports.DEFAULT_LAYOUT_STATE = exports.INDENT_UNIT = exports.LOCAL_STORAGE_KEY_TAB_MOVES_FOCUS = exports.AUTO_SAVE_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_AUTO_SAVE = exports.MAX_SPLIT_RATIO = exports.MIN_SPLIT_RATIO = exports.DEFAULT_SPLIT_RATIO = exports.FILE_SIZE_LIMITS = exports.PREVIEW_DEBOUNCE_MS = exports.LOCAL_STORAGE_KEY_MAXIMIZED = exports.LOCAL_STORAGE_KEY_SPLIT_RATIO = exports.LOCAL_STORAGE_KEY = exports.VIEW_MODE_STRATEGIES = void 0;
9
9
  exports.isValidSplitRatio = isValidSplitRatio;
10
10
  exports.isValidBoolean = isValidBoolean;
11
11
  /**
@@ -79,6 +79,18 @@ exports.LOCAL_STORAGE_KEY_AUTO_SAVE = 'commandmate:md-editor-auto-save';
79
79
  * Auto-save debounce delay (3 seconds)
80
80
  */
81
81
  exports.AUTO_SAVE_DEBOUNCE_MS = 3000;
82
+ /**
83
+ * Local storage key for the "Tab moves focus" accessibility toggle (Issue #1518)
84
+ */
85
+ exports.LOCAL_STORAGE_KEY_TAB_MOVES_FOCUS = 'commandmate:md-editor-tab-moves-focus';
86
+ /**
87
+ * Indent unit inserted by Tab (Issue #1518).
88
+ *
89
+ * Spaces, never a tab character: the same textarea edits YAML in text mode and
90
+ * YAML forbids tabs, and a literal tab renders at the browser's default 8-column
91
+ * `tab-size` which breaks Markdown nested lists.
92
+ */
93
+ exports.INDENT_UNIT = ' ';
82
94
  /**
83
95
  * Default editor layout state
84
96
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "commandmate",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "A local control plane for agent CLIs — orchestration and visibility for Claude Code, Codex, Gemini CLI, and more across Git worktrees",
5
5
  "keywords": [
6
6
  "claude-code",
@@ -1 +0,0 @@
1
- "use strict";exports.id=186,exports.ids=[186],exports.modules={9815:(a,b,c)=>{c.d(b,{B:()=>A});var d=c(21124),e=c(38301),f=c(20481),g=c(73451),h=c(17252),i=c(90349),j=c(3805);let k={status:"loading",options:[]};function l({selectedWorktreeId:a,onSelect:b,disabled:c=!1}){let h=(0,f.c)("skills"),[i,l]=(0,e.useState)(k),[n,o]=(0,e.useState)(0),p=(0,e.useCallback)(()=>o(a=>a+1),[]);return"loading"===i.status?(0,d.jsxs)("div",{className:"space-y-2","data-testid":"skill-target-loading",children:[(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:h("target.loading")}),(0,d.jsx)(g.EA,{className:"h-24 w-full rounded-lg"})]}):"error"===i.status?(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-target-error",children:[(0,d.jsx)(j.u,{tone:"danger",children:h("target.errorNotice")}),(0,d.jsx)(g.$n,{variant:"secondary",size:"sm",onClick:p,"data-testid":"skill-target-retry",children:h("target.retry")})]}):0===i.options.length?(0,d.jsx)(g.Zp,{"data-testid":"skill-target-empty",children:(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:h("target.empty")})}):(0,d.jsxs)("div",{className:"space-y-3","data-testid":"skill-target-selector",children:[(0,d.jsx)("div",{role:"radiogroup","aria-label":h("target.heading"),className:"space-y-2",children:i.options.map(e=>(0,d.jsx)(m,{option:e,selected:e.id===a,disabled:c,onSelect:b},e.id))}),(0,d.jsx)(j.u,{tone:"neutral","data-testid":"skill-target-branch-notice",children:h("target.branchFreshnessNotice")})]})}function m({option:a,selected:b,disabled:c,onSelect:e}){let h=(0,f.c)("skills"),i=a.liveBranch??a.syncedBranch;return(0,d.jsxs)("button",{type:"button",role:"radio","aria-checked":b,disabled:c,onClick:()=>e(a.id),"data-testid":`skill-target-option-${a.id}`,className:`w-full rounded-lg border px-3 py-2.5 text-left transition-colors disabled:cursor-not-allowed disabled:opacity-60 ${b?"border-accent-500 bg-accent-50 dark:bg-accent-950/40":"border-border bg-card hover:bg-muted"}`,children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)("span",{className:"text-sm font-semibold text-foreground break-all",children:a.name}),b&&(0,d.jsx)(g.Ex,{variant:"info",children:h("target.selected")})]}),(0,d.jsxs)("dl",{className:"mt-1.5 grid grid-cols-1 gap-x-4 gap-y-1 sm:grid-cols-2",children:[(0,d.jsx)(n,{label:h("target.repository"),children:a.repositoryName}),(0,d.jsx)(n,{label:h("target.branch"),children:i??h("target.branchUnknown")}),(0,d.jsx)(n,{label:h("target.agents"),children:a.agents.length>0?a.agents.join(", "):h("target.agentsNone")}),(0,d.jsx)(n,{label:h("target.workingTree"),children:h(null===a.dirty?"target.workingTreeUnknown":a.dirty?"target.workingTreeDirty":"target.workingTreeClean")})]}),a.sessionRunning&&(0,d.jsx)("p",{className:"mt-1.5 text-xs text-muted-foreground","data-testid":`skill-target-session-${a.id}`,children:h("target.sessionRunning")})]})}function n({label:a,children:b}){return(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("dt",{className:"text-xs font-medium text-muted-foreground",children:a}),(0,d.jsx)("dd",{className:"text-xs text-foreground break-words",children:b})]})}var o=c(27884);function p({label:a,children:b}){return(0,d.jsxs)("div",{className:"min-w-0",children:[(0,d.jsx)("dt",{className:"text-xs font-medium text-muted-foreground",children:a}),(0,d.jsx)("dd",{className:"mt-0.5 break-words text-sm text-foreground",children:b})]})}function q({level:a,kind:b,label:c}){let e=(0,f.c)("skills");return(0,d.jsxs)(g.Ex,{variant:o.eK[a],"data-testid":`skill-plan-risk-${b}-${a}`,children:[c,": ",e(o.pP[a])]})}function r({entry:a}){let b=(0,f.c)("skills"),c=o.KL[a.reason];return(0,d.jsxs)("li",{className:"space-y-1.5 rounded-md border border-border px-3 py-2","data-testid":`skill-plan-file-${a.path}`,children:[(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,d.jsx)(g.Ex,{variant:o.tC[a.change],children:b(o.AS[a.change])}),(0,d.jsx)("span",{className:"break-all font-mono text-xs text-foreground",children:a.path}),a.generated&&(0,d.jsx)(g.Ex,{variant:"gray",children:b("plan.fileGenerated")})]}),c&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b(c)}),a.gitIgnored&&(0,d.jsx)("p",{className:"text-xs text-warning-foreground",children:b("plan.gitIgnored")}),a.binary?(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b("plan.diffBinary")}):a.diff?(0,d.jsxs)("details",{children:[(0,d.jsx)("summary",{className:"cursor-pointer text-xs text-accent-600 dark:text-accent-400",children:b("plan.diffToggle",{additions:a.additions,deletions:a.deletions})}),(0,d.jsx)("pre",{className:"mt-1 overflow-x-auto rounded bg-muted p-2 font-mono text-[11px] leading-snug text-foreground",children:a.diff}),a.diffTruncated&&(0,d.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:b("plan.diffTruncated")})]}):null]})}function s({plan:a}){let b=(0,f.c)("skills"),{target:c,skill:e}=a,h=e.compatibility.commandmate;return(0,d.jsxs)(g.Zp,{className:"space-y-4","data-testid":"skill-install-plan",children:[(0,d.jsxs)("div",{className:"space-y-1",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:b("plan.heading")}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b("plan.expiresAt",{timestamp:a.expiresAt})})]}),(0,d.jsxs)("section",{className:"space-y-2",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.targetHeading")}),(0,d.jsxs)("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,d.jsx)(p,{label:b("target.repository"),children:c.repositoryName}),(0,d.jsx)(p,{label:b("target.heading"),children:c.worktreeName}),(0,d.jsx)(p,{label:b("target.branch"),children:c.branch??b("target.branchUnknown")}),(0,d.jsx)(p,{label:b("plan.headStateLabel"),children:b(o.kF[c.headState]??"plan.headState.unknown")}),(0,d.jsx)(p,{label:b("target.workingTree"),children:c.workingTreeDirty?b("target.workingTreeDirty"):b("target.workingTreeClean")}),(0,d.jsx)(p,{label:b("plan.installRoot"),children:(0,d.jsx)("span",{className:"break-all font-mono text-xs",children:(c.installRoots&&c.installRoots.length>0?c.installRoots:[c.installRoot]).map(a=>(0,d.jsx)("span",{className:"block",children:a},a))})}),(0,d.jsx)(p,{label:b("plan.existingInstall"),children:c.existingInstall?b("plan.existingInstallVersion",{version:c.existingInstall.version}):b("plan.existingInstallNone")}),(0,d.jsx)(p,{label:b("detail.recommendedVersion"),children:(0,d.jsx)("span",{className:"font-mono text-xs",children:e.version})})]})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-risk-section",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.riskHeading")}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-1.5",children:[(0,d.jsx)(q,{level:e.declaredRisk,kind:"declared",label:b("plan.riskDeclared")}),(0,d.jsx)(q,{level:e.computedRisk,kind:"computed",label:b("plan.riskComputed")}),(0,d.jsx)(q,{level:e.effectiveRisk,kind:"effective",label:b("plan.riskEffective")})]}),(0,d.jsx)("p",{className:"break-words text-sm text-foreground",children:e.riskRationale}),(0,d.jsx)(j.u,{tone:"neutral",children:b("plan.riskNotice")})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-permissions",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("permissions.heading")}),e.declaredPermissions.length>0?(0,d.jsx)("div",{className:"flex flex-wrap gap-1.5",children:e.declaredPermissions.map(a=>(0,d.jsx)(g.Ex,{variant:"warning",children:o.z2[a]?b(o.z2[a]):a},a))}):(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.permissionsNone")}),(0,d.jsx)(j.u,{tone:"warning",children:b("permissions.declarationOnlyNotice")})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-requirements",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("requirements.heading")}),0===e.requirements.commands.length&&0===e.requirements.networkHosts.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.requirementsNone")}):(0,d.jsxs)("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[e.requirements.commands.length>0&&(0,d.jsx)(p,{label:b("plan.requirementsCommands"),children:e.requirements.commands.map(a=>`${a.name} ${a.versionRange??b("plan.commandAnyVersion")}`).join(", ")}),e.requirements.networkHosts.length>0&&(0,d.jsx)(p,{label:b("plan.requirementsHosts"),children:e.requirements.networkHosts.join(", ")})]})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-scripts",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.scriptsHeading")}),0===e.executablePaths.length&&0===e.scriptPaths.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.scriptsNone")}):(0,d.jsx)("ul",{className:"space-y-1",children:[...new Set([...e.scriptPaths,...e.executablePaths])].map(a=>(0,d.jsx)("li",{className:"break-all font-mono text-xs text-foreground",children:a},a))})]}),"compatible"!==h.status&&(0,d.jsx)(j.u,{tone:"warning","data-testid":"skill-plan-compatibility-notice",children:b((0,o.e5)(h.messageKey),{range:h.requiredRange,currentVersion:h.currentVersion??""})}),a.warnings.length>0&&(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-warnings",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.warningsHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.warnings.map(a=>(0,d.jsx)("li",{className:"text-xs text-warning-foreground",children:o.RO[a]?b(o.RO[a]):a},a))})]}),(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-plan-files",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("plan.filesHeading")}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"skill-plan-stats",children:b("plan.stats",{added:a.stats.added,modified:a.stats.modified,unchanged:a.stats.unchanged,conflicted:a.stats.conflicted,unmanaged:a.stats.unmanaged})}),0===a.files.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("plan.filesEmpty")}):(0,d.jsx)("ul",{className:"space-y-2",children:a.files.map(a=>(0,d.jsx)(r,{entry:a},a.path))})]}),a.blockers.length>0&&(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-install-blockers",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-danger-foreground",children:b("plan.blockersHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.blockers.map(a=>(0,d.jsxs)("li",{className:"text-xs text-danger-foreground",children:[a.path&&(0,d.jsx)("span",{className:"mr-1 break-all font-mono",children:a.path}),a.code.startsWith("skills.")?b((0,o.e5)(a.code),{range:h.requiredRange,currentVersion:h.currentVersion??""}):o.KL[a.code]?b(o.KL[a.code]):a.code]},`${a.code}:${a.path??""}`))}),(0,d.jsx)(j.u,{tone:"danger",children:b("plan.blockedNotice")})]})]})}function t({entry:a}){let b=(0,f.c)("skills"),c=o.Mj[a.disposition],e=o.hJ[a.reason];return(0,d.jsxs)("li",{className:"flex flex-wrap items-center gap-2","data-testid":`skill-uninstall-file-${a.path}`,children:[(0,d.jsx)(g.Ex,{variant:"remove"===a.disposition?"info":"warning",children:c?b(c):a.disposition}),(0,d.jsx)("span",{className:"break-all font-mono text-xs text-foreground",children:a.path}),e&&(0,d.jsx)("span",{className:"text-xs text-muted-foreground",children:b(e)})]})}function u({plan:a}){let b=(0,f.c)("skills"),{target:c,skill:e}=a;return(0,d.jsxs)(g.Zp,{className:"space-y-4","data-testid":"skill-uninstall-plan",children:[(0,d.jsxs)("div",{className:"space-y-1",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:b("uninstall.heading")}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:b("uninstall.expiresAt",{timestamp:a.expiresAt})})]}),(0,d.jsxs)("dl",{className:"grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,d.jsx)(p,{label:b("target.repository"),children:c.repositoryName}),(0,d.jsx)(p,{label:b("target.heading"),children:c.worktreeName}),(0,d.jsx)(p,{label:b("target.branch"),children:c.branch??b("target.branchUnknown")}),(0,d.jsx)(p,{label:b("uninstall.installedVersion"),children:(0,d.jsx)("span",{className:"font-mono text-xs",children:e.version||b("uninstall.versionUnknown")})}),(0,d.jsx)(p,{label:b("plan.installRoot"),children:(0,d.jsx)("span",{className:"break-all font-mono text-xs",children:c.installRoot})}),(0,d.jsx)(p,{label:b("target.workingTree"),children:c.workingTreeDirty?b("target.workingTreeDirty"):b("target.workingTreeClean")})]}),(0,d.jsx)("p",{className:"text-xs text-muted-foreground","data-testid":"skill-uninstall-stats",children:b("uninstall.stats",{removable:a.stats.removable,modified:a.stats.modified,missing:a.stats.missing,unknown:a.stats.unknown,irregular:a.stats.irregular})}),(0,d.jsxs)("section",{className:"space-y-2",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("uninstall.removalsHeading")}),0===a.removals.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("uninstall.removalsEmpty")}):(0,d.jsx)("ul",{className:"space-y-1.5",children:a.removals.map(a=>(0,d.jsx)(t,{entry:a},a.path))})]}),(0,d.jsxs)("section",{className:"space-y-2",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:b("uninstall.retainedHeading")}),0===a.retained.length?(0,d.jsx)("p",{className:"text-sm text-muted-foreground",children:b("uninstall.retainedEmpty")}):(0,d.jsx)("ul",{className:"space-y-1.5",children:a.retained.map(a=>(0,d.jsx)(t,{entry:a},a.path))})]}),(0,d.jsxs)("div",{className:"space-y-2",children:[a.skill.agents.length>0&&(0,d.jsx)("div",{className:"flex flex-wrap gap-1.5","data-testid":"skill-uninstall-agents",children:a.skill.agents.map(a=>(0,d.jsx)(g.Ex,{variant:"gray",children:(0,h.f_)(a.agent)},a.agent))}),(0,d.jsx)(j.u,{tone:"neutral",children:b((0,o.e5)(a.nextActionKey))})]}),a.blockers.length>0&&(0,d.jsxs)("section",{className:"space-y-2","data-testid":"skill-uninstall-blockers",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-danger-foreground",children:b("uninstall.blockersHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.blockers.map(a=>(0,d.jsxs)("li",{className:"text-xs text-danger-foreground",children:[a.path&&(0,d.jsx)("span",{className:"mr-1 break-all font-mono",children:a.path}),b((0,o.e5)(a.messageKey))]},`${a.code}:${a.path??""}`))})]})]})}var v=c(30156);let w={worktreeId:null,busy:null,installPlan:null,uninstallPlan:null,installResult:null,uninstallResult:null,riskAcknowledged:!1,failure:null};function x(a){return{...a,installPlan:null,uninstallPlan:null,installResult:null,uninstallResult:null,riskAcknowledged:!1,failure:null}}function y({failure:a}){let b=(0,f.c)("skills");return(0,d.jsxs)("div",{className:"space-y-2","data-testid":"skill-operation-error",children:[(0,d.jsxs)(j.u,{tone:"danger",children:[(0,d.jsx)("p",{className:"font-medium",children:b("operation.errorHeading")}),(0,d.jsx)("p",{className:"mt-1",children:b((0,o.FW)(a.code))}),(0,d.jsx)("p",{className:"mt-1 break-words",children:b("state.errorCode",{code:a.code})})]}),a.nextActionKey&&(0,d.jsx)(j.u,{tone:"warning",children:b((0,o.e5)(a.nextActionKey))}),a.blockers&&a.blockers.length>0&&(0,d.jsx)("ul",{className:"space-y-1","data-testid":"skill-operation-error-blockers",children:a.blockers.map(a=>(0,d.jsxs)("li",{className:"text-xs text-danger-foreground",children:[a.path&&(0,d.jsx)("span",{className:"mr-1 break-all font-mono",children:a.path}),b((0,o.e5)(a.messageKey))]},`${a.code}:${a.path??""}`))})]})}function z({agents:a,skillId:b,version:c}){let e=(0,f.c)("skills");return 0===a.length?null:(0,d.jsxs)("div",{className:"space-y-1","data-testid":"skill-operation-reload",children:[(0,d.jsx)("h4",{className:"text-xs font-semibold uppercase tracking-wide text-muted-foreground",children:e("operation.reloadHeading")}),(0,d.jsx)("ul",{className:"space-y-1",children:a.map(a=>(0,d.jsx)("li",{className:"text-xs text-muted-foreground",children:e((0,o.e5)(a.messageKey),{agent:(0,h.f_)(a.agent),skillId:b,version:c})},a.agent))})]})}function A({skillId:a,version:b,blockedReason:c,worktreeId:h}){let k=(0,f.c)("skills"),[m,n]=(0,e.useState)(()=>h?{...w,worktreeId:h}:w),p=(0,e.useCallback)(a=>{n(b=>b.worktreeId===a?b:x({...b,worktreeId:a,busy:null}))},[]),q=(0,e.useCallback)(async()=>{let c=m.worktreeId;if(!c)return;n(a=>({...x(a),busy:"install-plan"}));let d=await (0,v.Q6)(c,a,{version:b??void 0});n(a=>({...a,busy:null,installPlan:d.ok?d.data.plan:null,failure:d.ok?null:d.failure}))},[a,m.worktreeId,b]),r=(0,e.useCallback)(async()=>{var b;let c=m.worktreeId,d=m.installPlan;if(!c||!d||d.requiresRiskAcknowledgement&&!m.riskAcknowledged)return;n(a=>({...a,busy:"install-apply",failure:null}));let e=await (0,v.Xi)(c,a,{planToken:d.token,version:d.skill.version,acknowledgeRisk:!!d.requiresRiskAcknowledgement||void 0,idempotencyKey:(b=d.token,`skill-install-${b}`)});e.ok&&(0,i.k)(c),n(a=>({...a,busy:null,installPlan:e.ok?null:a.installPlan,installResult:e.ok?e.data:null,failure:e.ok?null:e.failure}))},[a,m.installPlan,m.riskAcknowledged,m.worktreeId]),t=(0,e.useCallback)(async()=>{let b=m.worktreeId;if(!b)return;n(a=>({...x(a),busy:"uninstall-plan"}));let c=await (0,v.hN)(b,a);n(a=>({...a,busy:null,uninstallPlan:c.ok?c.data.plan:null,failure:c.ok?null:c.failure}))},[a,m.worktreeId]),A=(0,e.useCallback)(async()=>{var b;let c=m.worktreeId,d=m.uninstallPlan;if(!c||!d)return;n(a=>({...a,busy:"uninstall-apply",failure:null}));let e=await (0,v.E)(c,a,{planToken:d.token,idempotencyKey:(b=d.token,`skill-uninstall-${b}`)});n(a=>({...a,busy:null,uninstallPlan:e.ok?null:a.uninstallPlan,uninstallResult:e.ok?e.data:null,failure:e.ok?null:e.failure}))},[a,m.uninstallPlan,m.worktreeId]),B=(0,e.useCallback)(()=>{n(a=>x(a))},[]),C=null!==m.busy,D=m.installPlan,E=m.uninstallPlan,F=c??k(m.worktreeId?"plan.ready":"plan.chooseTarget"),G=null!==D&&D.requiresRiskAcknowledgement&&!m.riskAcknowledged;return(0,d.jsxs)("div",{className:"space-y-3","data-testid":"skill-install-panel",children:[!h&&(0,d.jsx)(l,{selectedWorktreeId:m.worktreeId,onSelect:p,disabled:C}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.$n,{variant:"primary",disabled:C||null!==c||!m.worktreeId,onClick:q,"data-testid":"skill-install-action","aria-describedby":"skill-install-reason",children:k("install-plan"===m.busy?"plan.building":"plan.build")}),(0,d.jsx)(g.$n,{variant:"secondary",disabled:C||!m.worktreeId,onClick:t,"data-testid":"skill-uninstall-action",children:k("uninstall-plan"===m.busy?"uninstall.building":"uninstall.build")})]}),(0,d.jsx)("p",{id:"skill-install-reason",className:"text-sm text-muted-foreground","data-testid":"skill-install-reason",children:F}),m.failure&&(0,d.jsx)(y,{failure:m.failure}),D&&(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)(s,{plan:D}),D.requiresRiskAcknowledgement&&(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-install-risk-acknowledgement",children:[(0,d.jsx)(j.u,{tone:"danger",children:k((0,o.e5)(D.riskAcknowledgementMessageKey??"skills.plan.highRiskAcknowledgement"))}),(0,d.jsxs)("label",{className:"flex items-start gap-2 text-sm text-foreground",children:[(0,d.jsx)(g.Sc,{checked:m.riskAcknowledged,onCheckedChange:a=>n(b=>({...b,riskAcknowledged:!0===a})),disabled:C,"data-testid":"skill-install-risk-checkbox",className:"mt-0.5"}),(0,d.jsx)("span",{children:k("plan.acknowledgeLabel")})]})]}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.$n,{variant:D.requiresRiskAcknowledgement?"danger":"primary",disabled:C||!D.installable||G,onClick:r,"data-testid":"skill-install-confirm",children:k("install-apply"===m.busy?"plan.confirming":"plan.confirm")}),(0,d.jsx)(g.$n,{variant:"ghost",disabled:C,onClick:B,"data-testid":"skill-install-discard",children:k("plan.discard")})]})]}),E&&(0,d.jsxs)("div",{className:"space-y-3",children:[(0,d.jsx)(u,{plan:E}),(0,d.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,d.jsx)(g.$n,{variant:"danger",disabled:C||!E.removable,onClick:A,"data-testid":"skill-uninstall-confirm",children:k("uninstall-apply"===m.busy?"uninstall.confirming":"uninstall.confirm")}),(0,d.jsx)(g.$n,{variant:"ghost",disabled:C,onClick:B,"data-testid":"skill-uninstall-discard",children:k("plan.discard")})]})]}),m.installResult&&(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-install-result",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:k("operation.installedHeading")}),(0,d.jsx)(j.u,{tone:"info",children:k((0,o.e5)(m.installResult.operation.nextActionKey))}),m.installResult.operation.replayed&&(0,d.jsx)(j.u,{tone:"neutral","data-testid":"skill-operation-replayed",children:k("operation.replayNotice")}),m.installResult.install&&"files"in m.installResult.install&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:k("operation.filesWritten",{count:m.installResult.install.files.length})}),"reload"in m.installResult&&(0,d.jsx)(z,{agents:m.installResult.reload.agents,skillId:m.installResult.reload.skillId,version:m.installResult.reload.version}),(0,d.jsx)(g.$n,{variant:"secondary",size:"sm",onClick:B,"data-testid":"skill-operation-reset",children:k("operation.startOver")})]}),m.uninstallResult&&(0,d.jsxs)(g.Zp,{className:"space-y-3","data-testid":"skill-uninstall-result",children:[(0,d.jsx)("h3",{className:"text-sm font-semibold text-foreground",children:k("operation.uninstalledHeading")}),(0,d.jsx)(j.u,{tone:"info",children:k((0,o.e5)(m.uninstallResult.operation.nextActionKey))}),m.uninstallResult.operation.replayed&&(0,d.jsx)(j.u,{tone:"neutral","data-testid":"skill-operation-replayed",children:k("operation.replayNotice")}),m.uninstallResult.uninstall&&"removedFiles"in m.uninstallResult.uninstall&&(0,d.jsx)("p",{className:"text-xs text-muted-foreground",children:k("operation.filesRemoved",{count:m.uninstallResult.uninstall.removedFiles.length})}),"reload"in m.uninstallResult&&(0,d.jsx)(z,{agents:m.uninstallResult.reload.agents,skillId:m.uninstallResult.reload.skillId,version:m.uninstallResult.reload.version}),(0,d.jsx)(g.$n,{variant:"secondary",size:"sm",onClick:B,"data-testid":"skill-operation-reset",children:k("operation.startOver")})]})]})}},12894:(a,b,c)=>{c.d(b,{o:()=>d});function d(a){return a?a.split("/").map(encodeURIComponent).join("/"):""}},13973:(a,b,c)=>{c.d(b,{default:()=>e.a});var d=c(33540),e=c.n(d)},24207:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"BailoutToCSR",{enumerable:!0,get:function(){return e}});let d=c(84339);function e(a){let{reason:b,children:c}=a;throw Object.defineProperty(new d.BailoutToCSRError(b),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0})}},33540:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return e}});let d=c(35288)._(c(43972));function e(a,b){var c;let e={};"function"==typeof a&&(e.loader=a);let f={...e,...b};return(0,d.default)({...f,modules:null==(c=f.loadableGenerated)?void 0:c.modules})}("function"==typeof b.default||"object"==typeof b.default&&null!==b.default)&&void 0===b.default.__esModule&&(Object.defineProperty(b.default,"__esModule",{value:!0}),Object.assign(b.default,b),a.exports=b.default)},43972:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"default",{enumerable:!0,get:function(){return j}});let d=c(21124),e=c(38301),f=c(24207),g=c(52402);function h(a){return{default:a&&"default"in a?a.default:a}}let i={loader:()=>Promise.resolve(h(()=>null)),loading:null,ssr:!0},j=function(a){let b={...i,...a},c=(0,e.lazy)(()=>b.loader().then(h)),j=b.loading;function k(a){let h=j?(0,d.jsx)(j,{isLoading:!0,pastDelay:!0,error:null}):null,i=!b.ssr||!!b.loading,k=i?e.Suspense:e.Fragment,l=b.ssr?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(g.PreloadChunks,{moduleIds:b.modules}),(0,d.jsx)(c,{...a})]}):(0,d.jsx)(f.BailoutToCSR,{reason:"next/dynamic",children:(0,d.jsx)(c,{...a})});return(0,d.jsx)(k,{...i?{fallback:h}:{},children:l})}return k.displayName="LoadableComponent",k}},52402:(a,b,c)=>{Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"PreloadChunks",{enumerable:!0,get:function(){return h}});let d=c(21124),e=c(23312),f=c(29294),g=c(61348);function h(a){let{moduleIds:b}=a,c=f.workAsyncStorage.getStore();if(void 0===c)return null;let h=[];if(c.reactLoadableManifest&&b){let a=c.reactLoadableManifest;for(let c of b){if(!a[c])continue;let b=a[c].files;h.push(...b)}}return 0===h.length?null:(0,d.jsx)(d.Fragment,{children:h.map(a=>{let b=c.assetPrefix+"/_next/"+(0,g.encodeURIPath)(a);return a.endsWith(".css")?(0,d.jsx)("link",{precedence:"dynamic",href:b,rel:"stylesheet",as:"style"},a):((0,e.preload)(b,{as:"script",fetchPriority:"low"}),null)})})}},61348:(a,b)=>{function c(a){return a.split("/").map(a=>encodeURIComponent(a)).join("/")}Object.defineProperty(b,"__esModule",{value:!0}),Object.defineProperty(b,"encodeURIPath",{enumerable:!0,get:function(){return c}})},62484:(a,b,c)=>{c.d(b,{i:()=>j});var d=c(21124),e=c(38301),f=c(63156),g=c(58970);function h(){return(0,d.jsx)("svg",{className:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"})})}function i(){return(0,d.jsx)("svg",{className:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})}function j({text:a,className:b="",label:c="Copy"}){let[j,k]=(0,e.useState)(!1),l=(0,e.useRef)(null),m=(0,e.useCallback)(async()=>{try{await (0,f.l)(a),k(!0),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>k(!1),g.s7)}catch{}},[a]);return(0,d.jsxs)("button",{type:"button",onClick:m,className:`inline-flex items-center gap-1 rounded border border-border bg-surface px-2 py-0.5 text-[11px] font-medium text-foreground transition-colors hover:bg-muted ${b}`,"aria-label":j?"Copied":c,title:j?"Copied!":c,children:[j?(0,d.jsx)(i,{}):(0,d.jsx)(h,{}),(0,d.jsx)("span",{children:j?"Copied":c})]})}},63156:(a,b,c)=>{c.d(b,{l:()=>e});let d=/\x1b\[[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\[[0-9;]*m/g;async function e(a){if(!a||0===a.trim().length)return;let b=a.replace(d,"");if(navigator.clipboard?.writeText)try{await navigator.clipboard.writeText(b);return}catch{}let c=document.createElement("textarea");c.value=b,c.style.position="fixed",c.style.left="-9999px",c.style.top="-9999px",c.style.opacity="0",document.body.appendChild(c),c.focus(),c.select();try{document.execCommand("copy")}finally{document.body.removeChild(c)}}},79944:(a,b,c)=>{c.d(b,{A:()=>d});let d=(0,c(23339).A)("arrow-left",[["path",{d:"m12 19-7-7 7-7",key:"1l729n"}],["path",{d:"M19 12H5",key:"x3x0zl"}]])},90349:(a,b,c)=>{c.d(b,{I:()=>d,k:()=>e});let d="skill:installed";function e(a){}}};
@@ -1 +0,0 @@
1
- exports.id=7013,exports.ids=[7013],exports.modules={27013:a=>{class b{constructor(a){void 0===a.data&&(a.data={}),this.data=a.data,this.isMatchIgnored=!1}ignoreMatch(){this.isMatchIgnored=!0}}function c(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")}function d(a,...b){let c=Object.create(null);for(let b in a)c[b]=a[b];return b.forEach(function(a){for(let b in a)c[b]=a[b]}),c}class e{constructor(a,b){this.buffer="",this.classPrefix=b.classPrefix,a.walk(this)}addText(a){this.buffer+=c(a)}openNode(a){if(!a.scope)return;let b=((a,{prefix:b})=>{if(a.startsWith("language:"))return a.replace("language:","language-");if(a.includes(".")){let c=a.split(".");return[`${b}${c.shift()}`,...c.map((a,b)=>`${a}${"_".repeat(b+1)}`)].join(" ")}return`${b}${a}`})(a.scope,{prefix:this.classPrefix});this.span(b)}closeNode(a){a.scope&&(this.buffer+="</span>")}value(){return this.buffer}span(a){this.buffer+=`<span class="${a}">`}}let f=(a={})=>{let b={children:[]};return Object.assign(b,a),b};class g{constructor(){this.rootNode=f(),this.stack=[this.rootNode]}get top(){return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(a){this.top.children.push(a)}openNode(a){let b=f({scope:a});this.add(b),this.stack.push(b)}closeNode(){if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)}walk(a){return this.constructor._walk(a,this.rootNode)}static _walk(a,b){return"string"==typeof b?a.addText(b):b.children&&(a.openNode(b),b.children.forEach(b=>this._walk(a,b)),a.closeNode(b)),a}static _collapse(a){"string"!=typeof a&&a.children&&(a.children.every(a=>"string"==typeof a)?a.children=[a.children.join("")]:a.children.forEach(a=>{g._collapse(a)}))}}class h extends g{constructor(a){super(),this.options=a}addText(a){""!==a&&this.add(a)}startScope(a){this.openNode(a)}endScope(){this.closeNode()}__addSublanguage(a,b){let c=a.root;b&&(c.scope=`language:${b}`),this.add(c)}toHTML(){return new e(this,this.options).value()}finalize(){return this.closeAllNodes(),!0}}function i(a){return a?"string"==typeof a?a:a.source:null}function j(a){return m("(?=",a,")")}function k(a){return m("(?:",a,")*")}function l(a){return m("(?:",a,")?")}function m(...a){return a.map(a=>i(a)).join("")}function n(...a){return"("+(function(a){let b=a[a.length-1];return"object"==typeof b&&b.constructor===Object?(a.splice(a.length-1,1),b):{}}(a).capture?"":"?:")+a.map(a=>i(a)).join("|")+")"}function o(a){return RegExp(a.toString()+"|").exec("").length-1}let p=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./;function q(a,{joinWith:b}){let c=0;return a.map(a=>{let b=c+=1,d=i(a),e="";for(;d.length>0;){let a=p.exec(d);if(!a){e+=d;break}e+=d.substring(0,a.index),d=d.substring(a.index+a[0].length),"\\"===a[0][0]&&a[1]?e+="\\"+String(Number(a[1])+b):(e+=a[0],"("===a[0]&&c++)}return e}).map(a=>`(${a})`).join(b)}let r="[a-zA-Z]\\w*",s="[a-zA-Z_]\\w*",t="\\b\\d+(\\.\\d+)?",u="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",v="\\b(0b[01]+)",w={begin:"\\\\[\\s\\S]",relevance:0},x=function(a,b,c={}){let e=d({scope:"comment",begin:a,end:b,contains:[]},c);e.contains.push({scope:"doctag",begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)",end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0});let f=n("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/);return e.contains.push({begin:m(/[ ]+/,"(",f,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),e},y=x("//","$"),z=x("/\\*","\\*/"),A=x("#","$");var B=Object.freeze({__proto__:null,APOS_STRING_MODE:{scope:"string",begin:"'",end:"'",illegal:"\\n",contains:[w]},BACKSLASH_ESCAPE:w,BINARY_NUMBER_MODE:{scope:"number",begin:v,relevance:0},BINARY_NUMBER_RE:v,COMMENT:x,C_BLOCK_COMMENT_MODE:z,C_LINE_COMMENT_MODE:y,C_NUMBER_MODE:{scope:"number",begin:u,relevance:0},C_NUMBER_RE:u,END_SAME_AS_BEGIN:function(a){return Object.assign(a,{"on:begin":(a,b)=>{b.data._beginMatch=a[1]},"on:end":(a,b)=>{b.data._beginMatch!==a[1]&&b.ignoreMatch()}})},HASH_COMMENT_MODE:A,IDENT_RE:r,MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+s,relevance:0},NUMBER_MODE:{scope:"number",begin:t,relevance:0},NUMBER_RE:t,PHRASAL_WORDS_MODE:{begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},QUOTE_STRING_MODE:{scope:"string",begin:'"',end:'"',illegal:"\\n",contains:[w]},REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/,end:/\/[gimuy]*/,contains:[w,{begin:/\[/,end:/\]/,relevance:0,contains:[w]}]},RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",SHEBANG:(a={})=>{let b=/^#![ ]*\//;return a.binary&&(a.begin=m(b,/.*\b/,a.binary,/\b.*/)),d({scope:"meta",begin:b,end:/$/,relevance:0,"on:begin":(a,b)=>{0!==a.index&&b.ignoreMatch()}},a)},TITLE_MODE:{scope:"title",begin:r,relevance:0},UNDERSCORE_IDENT_RE:s,UNDERSCORE_TITLE_MODE:{scope:"title",begin:s,relevance:0}});function C(a,b){"."===a.input[a.index-1]&&b.ignoreMatch()}function D(a,b){void 0!==a.className&&(a.scope=a.className,delete a.className)}function E(a,b){b&&a.beginKeywords&&(a.begin="\\b("+a.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)",a.__beforeBegin=C,a.keywords=a.keywords||a.beginKeywords,delete a.beginKeywords,void 0===a.relevance&&(a.relevance=0))}function F(a,b){Array.isArray(a.illegal)&&(a.illegal=n(...a.illegal))}function G(a,b){if(a.match){if(a.begin||a.end)throw Error("begin & end are not supported with match");a.begin=a.match,delete a.match}}function H(a,b){void 0===a.relevance&&(a.relevance=1)}let I=(a,b)=>{if(!a.beforeMatch)return;if(a.starts)throw Error("beforeMatch cannot be used with starts");let c=Object.assign({},a);Object.keys(a).forEach(b=>{delete a[b]}),a.keywords=c.keywords,a.begin=m(c.beforeMatch,j(c.begin)),a.starts={relevance:0,contains:[Object.assign(c,{endsParent:!0})]},a.relevance=0,delete c.beforeMatch},J=["of","and","for","in","not","or","if","then","parent","list","value"],K={},L=a=>{console.error(a)},M=(a,...b)=>{console.log(`WARN: ${a}`,...b)},N=(a,b)=>{K[`${a}/${b}`]||(console.log(`Deprecated as of ${a}. ${b}`),K[`${a}/${b}`]=!0)},O=Error();function P(a,b,{key:c}){let d=0,e=a[c],f={},g={};for(let a=1;a<=b.length;a++)g[a+d]=e[a],f[a+d]=!0,d+=o(b[a-1]);a[c]=g,a[c]._emit=f,a[c]._multi=!0}function Q(a){if(a.scope&&"object"==typeof a.scope&&null!==a.scope&&(a.beginScope=a.scope,delete a.scope),"string"==typeof a.beginScope&&(a.beginScope={_wrap:a.beginScope}),"string"==typeof a.endScope&&(a.endScope={_wrap:a.endScope}),Array.isArray(a.begin)){if(a.skip||a.excludeBegin||a.returnBegin)throw L("skip, excludeBegin, returnBegin not compatible with beginScope: {}"),O;if("object"!=typeof a.beginScope||null===a.beginScope)throw L("beginScope must be object"),O;P(a,a.begin,{key:"beginScope"}),a.begin=q(a.begin,{joinWith:""})}if(Array.isArray(a.end)){if(a.skip||a.excludeEnd||a.returnEnd)throw L("skip, excludeEnd, returnEnd not compatible with endScope: {}"),O;if("object"!=typeof a.endScope||null===a.endScope)throw L("endScope must be object"),O;P(a,a.end,{key:"endScope"}),a.end=q(a.end,{joinWith:""})}}class R extends Error{constructor(a,b){super(a),this.name="HTMLInjectionError",this.html=b}}let S=Symbol("nomatch"),T=function(a){let e=Object.create(null),f=Object.create(null),g=[],p=!0,r="Could not find the language '{}', did you forget to load/include a language module?",s={disableAutodetect:!0,name:"Plain text",contains:[]},t={ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i,languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-",cssSelector:"pre code",languages:null,__emitter:h};function u(a){return t.noHighlightRe.test(a)}function v(a,b,c){let d="",e="";"object"==typeof b?(d=a,c=b.ignoreIllegals,e=b.language):(N("10.7.0","highlight(lang, code, ...args) has been deprecated."),N("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"),e=a,d=b),void 0===c&&(c=!0);let f={code:d,language:e};P("before:highlight",f);let g=f.result?f.result:w(f.language,f.code,c);return g.code=f.code,P("after:highlight",g),g}function w(a,f,g,h){let j=Object.create(null);function k(){if(!B.keywords)return void M.addText(O);let a=0;B.keywordPatternRe.lastIndex=0;let b=B.keywordPatternRe.exec(O),c="";for(;b;){c+=O.substring(a,b.index);let d=y.case_insensitive?b[0].toLowerCase():b[0],e=B.keywords[d];if(e){let[a,f]=e;if(M.addText(c),c="",j[d]=(j[d]||0)+1,j[d]<=7&&(P+=f),a.startsWith("_"))c+=b[0];else{let c=y.classNameAliases[a]||a;m(b[0],c)}}else c+=b[0];a=B.keywordPatternRe.lastIndex,b=B.keywordPatternRe.exec(O)}c+=O.substring(a),M.addText(c)}function l(){null!=B.subLanguage?function(){if(""===O)return;let a=null;if("string"==typeof B.subLanguage){if(!e[B.subLanguage])return M.addText(O);a=w(B.subLanguage,O,!0,K[B.subLanguage]),K[B.subLanguage]=a._top}else a=x(O,B.subLanguage.length?B.subLanguage:null);B.relevance>0&&(P+=a.relevance),M.__addSublanguage(a._emitter,a.language)}():k(),O=""}function m(a,b){""!==a&&(M.startScope(b),M.addText(a),M.endScope())}function n(a,b){let c=1,d=b.length-1;for(;c<=d;){if(!a._emit[c]){c++;continue}let d=y.classNameAliases[a[c]]||a[c],e=b[c];d?m(e,d):(O=e,k(),O=""),c++}}function s(a,b){return a.scope&&"string"==typeof a.scope&&M.openNode(y.classNameAliases[a.scope]||a.scope),a.beginScope&&(a.beginScope._wrap?(m(O,y.classNameAliases[a.beginScope._wrap]||a.beginScope._wrap),O=""):a.beginScope._multi&&(n(a.beginScope,b),O="")),B=Object.create(a,{parent:{value:B}})}let u={};function v(c,d){let e=d&&d[0];if(O+=c,null==e)return l(),0;if("begin"===u.type&&"end"===d.type&&u.index===d.index&&""===e){if(O+=f.slice(d.index,d.index+1),!p){let b=Error(`0 width match regex (${a})`);throw b.languageName=a,b.badRule=u.rule,b}return 1}if(u=d,"begin"===d.type){let a=d[0],c=d.rule,e=new b(c);for(let b of[c.__beforeBegin,c["on:begin"]])if(b&&(b(d,e),e.isMatchIgnored))return 0===B.matcher.regexIndex?(O+=a[0],1):(U=!0,0);return c.skip?O+=a:(c.excludeBegin&&(O+=a),l(),c.returnBegin||c.excludeBegin||(O=a)),s(c,d),c.returnBegin?0:a.length}if("illegal"!==d.type||g){if("end"===d.type){let a=function(a){let c=a[0],d=f.substring(a.index),e=function a(c,d,e){let f=function(a,b){let c=a&&a.exec(b);return c&&0===c.index}(c.endRe,e);if(f){if(c["on:end"]){let a=new b(c);c["on:end"](d,a),a.isMatchIgnored&&(f=!1)}if(f){for(;c.endsParent&&c.parent;)c=c.parent;return c}}if(c.endsWithParent)return a(c.parent,d,e)}(B,a,d);if(!e)return S;let g=B;B.endScope&&B.endScope._wrap?(l(),m(c,B.endScope._wrap)):B.endScope&&B.endScope._multi?(l(),n(B.endScope,a)):g.skip?O+=c:(g.returnEnd||g.excludeEnd||(O+=c),l(),g.excludeEnd&&(O=c));do B.scope&&M.closeNode(),B.skip||B.subLanguage||(P+=B.relevance),B=B.parent;while(B!==e.parent);return e.starts&&s(e.starts,a),g.returnEnd?0:c.length}(d);if(a!==S)return a}}else{let a=Error('Illegal lexeme "'+e+'" for mode "'+(B.scope||"<unnamed>")+'"');throw a.mode=B,a}if("illegal"===d.type&&""===e)return O+="\n",1;if(T>1e5&&T>3*d.index)throw Error("potential infinite loop, way more iterations than matches");return O+=e,e.length}let y=C(a);if(!y)throw L(r.replace("{}",a)),Error('Unknown language: "'+a+'"');let z=function(a){function b(b,c){return RegExp(i(b),"m"+(a.case_insensitive?"i":"")+(a.unicodeRegex?"u":"")+(c?"g":""))}class c{constructor(){this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0}addRule(a,b){b.position=this.position++,this.matchIndexes[this.matchAt]=b,this.regexes.push([b,a]),this.matchAt+=o(a)+1}compile(){0===this.regexes.length&&(this.exec=()=>null);let a=this.regexes.map(a=>a[1]);this.matcherRe=b(q(a,{joinWith:"|"}),!0),this.lastIndex=0}exec(a){this.matcherRe.lastIndex=this.lastIndex;let b=this.matcherRe.exec(a);if(!b)return null;let c=b.findIndex((a,b)=>b>0&&void 0!==a),d=this.matchIndexes[c];return b.splice(0,c),Object.assign(b,d)}}class e{constructor(){this.rules=[],this.multiRegexes=[],this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(a){if(this.multiRegexes[a])return this.multiRegexes[a];let b=new c;return this.rules.slice(a).forEach(([a,c])=>b.addRule(a,c)),b.compile(),this.multiRegexes[a]=b,b}resumingScanAtSamePosition(){return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(a,b){this.rules.push([a,b]),"begin"===b.type&&this.count++}exec(a){let b=this.getMatcher(this.regexIndex);b.lastIndex=this.lastIndex;let c=b.exec(a);if(this.resumingScanAtSamePosition())if(c&&c.index===this.lastIndex);else{let b=this.getMatcher(0);b.lastIndex=this.lastIndex+1,c=b.exec(a)}return c&&(this.regexIndex+=c.position+1,this.regexIndex===this.count&&this.considerAll()),c}}if(a.compilerExtensions||(a.compilerExtensions=[]),a.contains&&a.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.");return a.classNameAliases=d(a.classNameAliases||{}),function c(f,g){if(f.isCompiled)return f;[D,G,Q,I].forEach(a=>a(f,g)),a.compilerExtensions.forEach(a=>a(f,g)),f.__beforeBegin=null,[E,F,H].forEach(a=>a(f,g)),f.isCompiled=!0;let h=null;return"object"==typeof f.keywords&&f.keywords.$pattern&&(f.keywords=Object.assign({},f.keywords),h=f.keywords.$pattern,delete f.keywords.$pattern),h=h||/\w+/,f.keywords&&(f.keywords=function a(b,c,d="keyword"){let e=Object.create(null);return"string"==typeof b?f(d,b.split(" ")):Array.isArray(b)?f(d,b):Object.keys(b).forEach(function(d){Object.assign(e,a(b[d],c,d))}),e;function f(a,b){c&&(b=b.map(a=>a.toLowerCase())),b.forEach(function(b){var c,d,f;let g=b.split("|");e[g[0]]=[a,(c=g[0],(d=g[1])?Number(d):+(f=c,!J.includes(f.toLowerCase())))]})}}(f.keywords,a.case_insensitive)),f.keywordPatternRe=b(h,!0),g&&(f.begin||(f.begin=/\B|\b/),f.beginRe=b(f.begin),f.end||f.endsWithParent||(f.end=/\B|\b/),f.end&&(f.endRe=b(f.end)),f.terminatorEnd=i(f.end)||"",f.endsWithParent&&g.terminatorEnd&&(f.terminatorEnd+=(f.end?"|":"")+g.terminatorEnd)),f.illegal&&(f.illegalRe=b(f.illegal)),f.contains||(f.contains=[]),f.contains=[].concat(...f.contains.map(function(a){var b;return((b="self"===a?f:a).variants&&!b.cachedVariants&&(b.cachedVariants=b.variants.map(function(a){return d(b,{variants:null},a)})),b.cachedVariants)?b.cachedVariants:!function a(b){return!!b&&(b.endsWithParent||a(b.starts))}(b)?Object.isFrozen(b)?d(b):b:d(b,{starts:b.starts?d(b.starts):null})})),f.contains.forEach(function(a){c(a,f)}),f.starts&&c(f.starts,g),f.matcher=function(a){let b=new e;return a.contains.forEach(a=>b.addRule(a.begin,{rule:a,type:"begin"})),a.terminatorEnd&&b.addRule(a.terminatorEnd,{type:"end"}),a.illegal&&b.addRule(a.illegal,{type:"illegal"}),b}(f),f}(a)}(y),A="",B=h||z,K={},M=new t.__emitter(t),N=[];for(let a=B;a!==y;a=a.parent)a.scope&&N.unshift(a.scope);N.forEach(a=>M.openNode(a));let O="",P=0,R=0,T=0,U=!1;try{if(y.__emitTokens)y.__emitTokens(f,M);else{for(B.matcher.considerAll();;){T++,U?U=!1:B.matcher.considerAll(),B.matcher.lastIndex=R;let a=B.matcher.exec(f);if(!a)break;let b=f.substring(R,a.index),c=v(b,a);R=a.index+c}v(f.substring(R))}return M.finalize(),A=M.toHTML(),{language:a,value:A,relevance:P,illegal:!1,_emitter:M,_top:B}}catch(b){if(b.message&&b.message.includes("Illegal"))return{language:a,value:c(f),illegal:!0,relevance:0,_illegalBy:{message:b.message,index:R,context:f.slice(R-100,R+100),mode:b.mode,resultSoFar:A},_emitter:M};if(p)return{language:a,value:c(f),illegal:!1,relevance:0,errorRaised:b,_emitter:M,_top:B};throw b}}function x(a,b){b=b||t.languages||Object.keys(e);let d=function(a){let b={value:c(a),illegal:!1,relevance:0,_top:s,_emitter:new t.__emitter(t)};return b._emitter.addText(a),b}(a),f=b.filter(C).filter(O).map(b=>w(b,a,!1));f.unshift(d);let[g,h]=f.sort((a,b)=>{if(a.relevance!==b.relevance)return b.relevance-a.relevance;if(a.language&&b.language){if(C(a.language).supersetOf===b.language)return 1;else if(C(b.language).supersetOf===a.language)return -1}return 0});return g.secondBest=h,g}function y(a){let b=function(a){let b=a.className+" ";b+=a.parentNode?a.parentNode.className:"";let c=t.languageDetectRe.exec(b);if(c){let b=C(c[1]);return b||(M(r.replace("{}",c[1])),M("Falling back to no-highlight mode for this block.",a)),b?c[1]:"no-highlight"}return b.split(/\s+/).find(a=>u(a)||C(a))}(a);if(u(b))return;if(P("before:highlightElement",{el:a,language:b}),a.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",a);if(a.children.length>0&&(t.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."),console.warn("https://github.com/highlightjs/highlight.js/wiki/security"),console.warn("The element with unescaped HTML:"),console.warn(a)),t.throwUnescapedHTML))throw new R("One of your code blocks includes unescaped HTML.",a.innerHTML);let c=a.textContent,d=b?v(c,{language:b,ignoreIllegals:!0}):x(c);a.innerHTML=d.value,a.dataset.highlighted="yes";var e=d.language;let g=b&&f[b]||e;a.classList.add("hljs"),a.classList.add(`language-${g}`),a.result={language:d.language,re:d.relevance,relevance:d.relevance},d.secondBest&&(a.secondBest={language:d.secondBest.language,relevance:d.secondBest.relevance}),P("after:highlightElement",{el:a,result:d,text:c})}let z=!1;function A(){if("loading"===document.readyState){z||window.addEventListener("DOMContentLoaded",function(){A()},!1),z=!0;return}document.querySelectorAll(t.cssSelector).forEach(y)}function C(a){return e[a=(a||"").toLowerCase()]||e[f[a]]}function K(a,{languageName:b}){"string"==typeof a&&(a=[a]),a.forEach(a=>{f[a.toLowerCase()]=b})}function O(a){let b=C(a);return b&&!b.disableAutodetect}function P(a,b){g.forEach(function(c){c[a]&&c[a](b)})}for(let b in Object.assign(a,{highlight:v,highlightAuto:x,highlightAll:A,highlightElement:y,highlightBlock:function(a){return N("10.7.0","highlightBlock will be removed entirely in v12.0"),N("10.7.0","Please use highlightElement now."),y(a)},configure:function(a){t=d(t,a)},initHighlighting:()=>{A(),N("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")},initHighlightingOnLoad:function(){A(),N("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.")},registerLanguage:function(b,c){let d=null;try{d=c(a)}catch(a){if(L("Language definition for '{}' could not be registered.".replace("{}",b)),p)L(a);else throw a;d=s}d.name||(d.name=b),e[b]=d,d.rawDefinition=c.bind(null,a),d.aliases&&K(d.aliases,{languageName:b})},unregisterLanguage:function(a){for(let b of(delete e[a],Object.keys(f)))f[b]===a&&delete f[b]},listLanguages:function(){return Object.keys(e)},getLanguage:C,registerAliases:K,autoDetection:O,inherit:d,addPlugin:function(a){var b;(b=a)["before:highlightBlock"]&&!b["before:highlightElement"]&&(b["before:highlightElement"]=a=>{b["before:highlightBlock"](Object.assign({block:a.el},a))}),b["after:highlightBlock"]&&!b["after:highlightElement"]&&(b["after:highlightElement"]=a=>{b["after:highlightBlock"](Object.assign({block:a.el},a))}),g.push(a)},removePlugin:function(a){let b=g.indexOf(a);-1!==b&&g.splice(b,1)}}),a.debugMode=function(){p=!1},a.safeMode=function(){p=!0},a.versionString="11.11.1",a.regex={concat:m,lookahead:j,either:n,optional:l,anyNumberOfTimes:k},B)"object"==typeof B[b]&&function a(b){return b instanceof Map?b.clear=b.delete=b.set=function(){throw Error("map is read-only")}:b instanceof Set&&(b.add=b.clear=b.delete=function(){throw Error("set is read-only")}),Object.freeze(b),Object.getOwnPropertyNames(b).forEach(c=>{let d=b[c],e=typeof d;"object"!==e&&"function"!==e||Object.isFrozen(d)||a(d)}),b}(B[b]);return Object.assign(a,B),a},U=T({});U.newInstance=()=>T({}),a.exports=U,U.HighlightJS=U,U.default=U}};