commandmate 0.11.4 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-build-manifest.json +406 -314
  3. package/.next/app-path-routes-manifest.json +35 -26
  4. package/.next/build-manifest.json +5 -5
  5. package/.next/prerender-manifest.json +15 -15
  6. package/.next/react-loadable-manifest.json +8 -6
  7. package/.next/required-server-files.json +1 -1
  8. package/.next/routes-manifest.json +66 -0
  9. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  10. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/api/app/update/route_client-reference-manifest.js +1 -1
  12. package/.next/server/app/api/app/update-check/route.js +1 -1
  13. package/.next/server/app/api/app/update-check/route_client-reference-manifest.js +1 -1
  14. package/.next/server/app/api/assistant/conversation/route_client-reference-manifest.js +1 -1
  15. package/.next/server/app/api/assistant/current-output/route_client-reference-manifest.js +1 -1
  16. package/.next/server/app/api/assistant/messages/route_client-reference-manifest.js +1 -1
  17. package/.next/server/app/api/assistant/session/route_client-reference-manifest.js +1 -1
  18. package/.next/server/app/api/assistant/start/route_client-reference-manifest.js +1 -1
  19. package/.next/server/app/api/assistant/terminal/route_client-reference-manifest.js +1 -1
  20. package/.next/server/app/api/assistant/tools/route_client-reference-manifest.js +1 -1
  21. package/.next/server/app/api/auth/login/route_client-reference-manifest.js +1 -1
  22. package/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  23. package/.next/server/app/api/auth/status/route_client-reference-manifest.js +1 -1
  24. package/.next/server/app/api/daily-summary/route.js +1 -1
  25. package/.next/server/app/api/daily-summary/route.js.nft.json +1 -1
  26. package/.next/server/app/api/daily-summary/route_client-reference-manifest.js +1 -1
  27. package/.next/server/app/api/daily-summary/status/route.js +1 -1
  28. package/.next/server/app/api/daily-summary/status/route.js.nft.json +1 -1
  29. package/.next/server/app/api/daily-summary/status/route_client-reference-manifest.js +1 -1
  30. package/.next/server/app/api/external-apps/[id]/health/route_client-reference-manifest.js +1 -1
  31. package/.next/server/app/api/external-apps/[id]/route_client-reference-manifest.js +1 -1
  32. package/.next/server/app/api/external-apps/route_client-reference-manifest.js +1 -1
  33. package/.next/server/app/api/hooks/claude-done/route_client-reference-manifest.js +1 -1
  34. package/.next/server/app/api/ollama/models/route_client-reference-manifest.js +1 -1
  35. package/.next/server/app/api/push/subscriptions/route.js +1 -1
  36. package/.next/server/app/api/push/subscriptions/route_client-reference-manifest.js +1 -1
  37. package/.next/server/app/api/push/vapid/route_client-reference-manifest.js +1 -1
  38. package/.next/server/app/api/repositories/[id]/route_client-reference-manifest.js +1 -1
  39. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route.js +1 -1
  40. package/.next/server/app/api/repositories/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  41. package/.next/server/app/api/repositories/[id]/todos/route.js +1 -1
  42. package/.next/server/app/api/repositories/[id]/todos/route_client-reference-manifest.js +1 -1
  43. package/.next/server/app/api/repositories/clone/[jobId]/route_client-reference-manifest.js +1 -1
  44. package/.next/server/app/api/repositories/clone/route_client-reference-manifest.js +1 -1
  45. package/.next/server/app/api/repositories/excluded/route_client-reference-manifest.js +1 -1
  46. package/.next/server/app/api/repositories/restore/route_client-reference-manifest.js +1 -1
  47. package/.next/server/app/api/repositories/route_client-reference-manifest.js +1 -1
  48. package/.next/server/app/api/repositories/scan/route_client-reference-manifest.js +1 -1
  49. package/.next/server/app/api/repositories/sync/route_client-reference-manifest.js +1 -1
  50. package/.next/server/app/api/sidebar/group-order/route_client-reference-manifest.js +1 -1
  51. package/.next/server/app/api/skills/[id]/route.js +1 -0
  52. package/.next/server/app/api/skills/[id]/route.js.nft.json +1 -0
  53. package/.next/server/app/api/skills/[id]/route_client-reference-manifest.js +1 -0
  54. package/.next/server/app/api/skills/route.js +1 -0
  55. package/.next/server/app/api/skills/route.js.nft.json +1 -0
  56. package/.next/server/app/api/skills/route_client-reference-manifest.js +1 -0
  57. package/.next/server/app/api/slash-commands/route_client-reference-manifest.js +1 -1
  58. package/.next/server/app/api/templates/[id]/route_client-reference-manifest.js +1 -1
  59. package/.next/server/app/api/templates/route_client-reference-manifest.js +1 -1
  60. package/.next/server/app/api/todos/route.js +1 -1
  61. package/.next/server/app/api/todos/route_client-reference-manifest.js +1 -1
  62. package/.next/server/app/api/worktrees/[id]/auto-yes/route_client-reference-manifest.js +1 -1
  63. package/.next/server/app/api/worktrees/[id]/capture/route_client-reference-manifest.js +1 -1
  64. package/.next/server/app/api/worktrees/[id]/cli-tool/route.js +1 -1
  65. package/.next/server/app/api/worktrees/[id]/cli-tool/route_client-reference-manifest.js +1 -1
  66. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route.js +1 -1
  67. package/.next/server/app/api/worktrees/[id]/cmate/schedules/route_client-reference-manifest.js +1 -1
  68. package/.next/server/app/api/worktrees/[id]/current-output/route_client-reference-manifest.js +1 -1
  69. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route.js +1 -1
  70. package/.next/server/app/api/worktrees/[id]/execution-logs/[logId]/route_client-reference-manifest.js +1 -1
  71. package/.next/server/app/api/worktrees/[id]/execution-logs/route.js +1 -1
  72. package/.next/server/app/api/worktrees/[id]/execution-logs/route_client-reference-manifest.js +1 -1
  73. package/.next/server/app/api/worktrees/[id]/files/[...path]/route_client-reference-manifest.js +1 -1
  74. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js +1 -1
  75. package/.next/server/app/api/worktrees/[id]/git/branch/create/route.js.nft.json +1 -1
  76. package/.next/server/app/api/worktrees/[id]/git/branch/create/route_client-reference-manifest.js +1 -1
  77. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js +1 -1
  78. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route.js.nft.json +1 -1
  79. package/.next/server/app/api/worktrees/[id]/git/branch/delete/route_client-reference-manifest.js +1 -1
  80. package/.next/server/app/api/worktrees/[id]/git/branches/route.js +1 -1
  81. package/.next/server/app/api/worktrees/[id]/git/branches/route.js.nft.json +1 -1
  82. package/.next/server/app/api/worktrees/[id]/git/branches/route_client-reference-manifest.js +1 -1
  83. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js +1 -1
  84. package/.next/server/app/api/worktrees/[id]/git/checkout/route.js.nft.json +1 -1
  85. package/.next/server/app/api/worktrees/[id]/git/checkout/route_client-reference-manifest.js +1 -1
  86. package/.next/server/app/api/worktrees/[id]/git/commit/route.js +1 -1
  87. package/.next/server/app/api/worktrees/[id]/git/commit/route.js.nft.json +1 -1
  88. package/.next/server/app/api/worktrees/[id]/git/commit/route_client-reference-manifest.js +1 -1
  89. package/.next/server/app/api/worktrees/[id]/git/diff/route.js +1 -1
  90. package/.next/server/app/api/worktrees/[id]/git/diff/route.js.nft.json +1 -1
  91. package/.next/server/app/api/worktrees/[id]/git/diff/route_client-reference-manifest.js +1 -1
  92. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js +1 -1
  93. package/.next/server/app/api/worktrees/[id]/git/fetch/route.js.nft.json +1 -1
  94. package/.next/server/app/api/worktrees/[id]/git/fetch/route_client-reference-manifest.js +1 -1
  95. package/.next/server/app/api/worktrees/[id]/git/log/route.js +1 -1
  96. package/.next/server/app/api/worktrees/[id]/git/log/route.js.nft.json +1 -1
  97. package/.next/server/app/api/worktrees/[id]/git/log/route_client-reference-manifest.js +1 -1
  98. package/.next/server/app/api/worktrees/[id]/git/pull/route.js +1 -1
  99. package/.next/server/app/api/worktrees/[id]/git/pull/route.js.nft.json +1 -1
  100. package/.next/server/app/api/worktrees/[id]/git/pull/route_client-reference-manifest.js +1 -1
  101. package/.next/server/app/api/worktrees/[id]/git/push/route.js +1 -1
  102. package/.next/server/app/api/worktrees/[id]/git/push/route.js.nft.json +1 -1
  103. package/.next/server/app/api/worktrees/[id]/git/push/route_client-reference-manifest.js +1 -1
  104. package/.next/server/app/api/worktrees/[id]/git/reset/route.js +1 -1
  105. package/.next/server/app/api/worktrees/[id]/git/reset/route.js.nft.json +1 -1
  106. package/.next/server/app/api/worktrees/[id]/git/reset/route_client-reference-manifest.js +1 -1
  107. package/.next/server/app/api/worktrees/[id]/git/revert/route.js +1 -1
  108. package/.next/server/app/api/worktrees/[id]/git/revert/route.js.nft.json +1 -1
  109. package/.next/server/app/api/worktrees/[id]/git/revert/route_client-reference-manifest.js +1 -1
  110. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js +1 -1
  111. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route.js.nft.json +1 -1
  112. package/.next/server/app/api/worktrees/[id]/git/show/[commitHash]/route_client-reference-manifest.js +1 -1
  113. package/.next/server/app/api/worktrees/[id]/git/stage/route.js +1 -1
  114. package/.next/server/app/api/worktrees/[id]/git/stage/route.js.nft.json +1 -1
  115. package/.next/server/app/api/worktrees/[id]/git/stage/route_client-reference-manifest.js +1 -1
  116. package/.next/server/app/api/worktrees/[id]/git/staged/route.js +1 -1
  117. package/.next/server/app/api/worktrees/[id]/git/staged/route.js.nft.json +1 -1
  118. package/.next/server/app/api/worktrees/[id]/git/staged/route_client-reference-manifest.js +1 -1
  119. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js +1 -1
  120. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route.js.nft.json +1 -1
  121. package/.next/server/app/api/worktrees/[id]/git/stash/[index]/route_client-reference-manifest.js +1 -1
  122. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js +1 -1
  123. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route.js.nft.json +1 -1
  124. package/.next/server/app/api/worktrees/[id]/git/stash/apply/route_client-reference-manifest.js +1 -1
  125. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js +1 -1
  126. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route.js.nft.json +1 -1
  127. package/.next/server/app/api/worktrees/[id]/git/stash/pop/route_client-reference-manifest.js +1 -1
  128. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js +1 -1
  129. package/.next/server/app/api/worktrees/[id]/git/stash/push/route.js.nft.json +1 -1
  130. package/.next/server/app/api/worktrees/[id]/git/stash/push/route_client-reference-manifest.js +1 -1
  131. package/.next/server/app/api/worktrees/[id]/git/stash/route.js +1 -1
  132. package/.next/server/app/api/worktrees/[id]/git/stash/route.js.nft.json +1 -1
  133. package/.next/server/app/api/worktrees/[id]/git/stash/route_client-reference-manifest.js +1 -1
  134. package/.next/server/app/api/worktrees/[id]/git/status/route.js +1 -1
  135. package/.next/server/app/api/worktrees/[id]/git/status/route.js.nft.json +1 -1
  136. package/.next/server/app/api/worktrees/[id]/git/status/route_client-reference-manifest.js +1 -1
  137. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js +1 -1
  138. package/.next/server/app/api/worktrees/[id]/git/unstage/route.js.nft.json +1 -1
  139. package/.next/server/app/api/worktrees/[id]/git/unstage/route_client-reference-manifest.js +1 -1
  140. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js +1 -1
  141. package/.next/server/app/api/worktrees/[id]/git/working-diff/route.js.nft.json +1 -1
  142. package/.next/server/app/api/worktrees/[id]/git/working-diff/route_client-reference-manifest.js +1 -1
  143. package/.next/server/app/api/worktrees/[id]/interrupt/route_client-reference-manifest.js +1 -1
  144. package/.next/server/app/api/worktrees/[id]/kill-session/route_client-reference-manifest.js +1 -1
  145. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route.js +1 -1
  146. package/.next/server/app/api/worktrees/[id]/logs/[filename]/route_client-reference-manifest.js +1 -1
  147. package/.next/server/app/api/worktrees/[id]/logs/route.js +1 -1
  148. package/.next/server/app/api/worktrees/[id]/logs/route_client-reference-manifest.js +1 -1
  149. package/.next/server/app/api/worktrees/[id]/marp-render/route.js +1 -1
  150. package/.next/server/app/api/worktrees/[id]/marp-render/route_client-reference-manifest.js +1 -1
  151. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route.js +1 -1
  152. package/.next/server/app/api/worktrees/[id]/memos/[memoId]/route_client-reference-manifest.js +1 -1
  153. package/.next/server/app/api/worktrees/[id]/memos/route.js +1 -1
  154. package/.next/server/app/api/worktrees/[id]/memos/route_client-reference-manifest.js +1 -1
  155. package/.next/server/app/api/worktrees/[id]/messages/route.js +1 -1
  156. package/.next/server/app/api/worktrees/[id]/messages/route_client-reference-manifest.js +1 -1
  157. package/.next/server/app/api/worktrees/[id]/prompt-response/route_client-reference-manifest.js +1 -1
  158. package/.next/server/app/api/worktrees/[id]/respond/route_client-reference-manifest.js +1 -1
  159. package/.next/server/app/api/worktrees/[id]/route.js +1 -1
  160. package/.next/server/app/api/worktrees/[id]/route.js.nft.json +1 -1
  161. package/.next/server/app/api/worktrees/[id]/route_client-reference-manifest.js +1 -1
  162. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route.js +1 -1
  163. package/.next/server/app/api/worktrees/[id]/schedules/[scheduleId]/route_client-reference-manifest.js +1 -1
  164. package/.next/server/app/api/worktrees/[id]/schedules/active/route.js +1 -1
  165. package/.next/server/app/api/worktrees/[id]/schedules/active/route_client-reference-manifest.js +1 -1
  166. package/.next/server/app/api/worktrees/[id]/schedules/route.js +1 -1
  167. package/.next/server/app/api/worktrees/[id]/schedules/route_client-reference-manifest.js +1 -1
  168. package/.next/server/app/api/worktrees/[id]/search/route_client-reference-manifest.js +1 -1
  169. package/.next/server/app/api/worktrees/[id]/send/route.js +1 -1
  170. package/.next/server/app/api/worktrees/[id]/send/route.js.nft.json +1 -1
  171. package/.next/server/app/api/worktrees/[id]/send/route_client-reference-manifest.js +1 -1
  172. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js +1 -0
  173. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route.js.nft.json +1 -0
  174. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/install/route_client-reference-manifest.js +1 -0
  175. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js +1 -0
  176. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route.js.nft.json +1 -0
  177. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/plan/route_client-reference-manifest.js +1 -0
  178. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js +1 -0
  179. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.js.nft.json +1 -0
  180. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall/route_client-reference-manifest.js +1 -0
  181. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js +1 -0
  182. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.js.nft.json +1 -0
  183. package/.next/server/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route_client-reference-manifest.js +1 -0
  184. package/.next/server/app/api/worktrees/[id]/skills/route.js +23 -0
  185. package/.next/server/app/api/worktrees/[id]/skills/route.js.nft.json +1 -0
  186. package/.next/server/app/api/worktrees/[id]/skills/route_client-reference-manifest.js +1 -0
  187. package/.next/server/app/api/worktrees/[id]/slash-commands/route.js +1 -1
  188. package/.next/server/app/api/worktrees/[id]/slash-commands/route_client-reference-manifest.js +1 -1
  189. package/.next/server/app/api/worktrees/[id]/special-keys/route_client-reference-manifest.js +1 -1
  190. package/.next/server/app/api/worktrees/[id]/start-polling/route_client-reference-manifest.js +1 -1
  191. package/.next/server/app/api/worktrees/[id]/terminal/route.js +1 -1
  192. package/.next/server/app/api/worktrees/[id]/terminal/route_client-reference-manifest.js +1 -1
  193. package/.next/server/app/api/worktrees/[id]/timers/history/route.js +1 -1
  194. package/.next/server/app/api/worktrees/[id]/timers/history/route_client-reference-manifest.js +1 -1
  195. package/.next/server/app/api/worktrees/[id]/timers/route_client-reference-manifest.js +1 -1
  196. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route.js +1 -1
  197. package/.next/server/app/api/worktrees/[id]/todos/[todoId]/route_client-reference-manifest.js +1 -1
  198. package/.next/server/app/api/worktrees/[id]/todos/route.js +1 -1
  199. package/.next/server/app/api/worktrees/[id]/todos/route_client-reference-manifest.js +1 -1
  200. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route.js +1 -1
  201. package/.next/server/app/api/worktrees/[id]/tree/[...path]/route_client-reference-manifest.js +1 -1
  202. package/.next/server/app/api/worktrees/[id]/tree/route.js +1 -1
  203. package/.next/server/app/api/worktrees/[id]/tree/route_client-reference-manifest.js +1 -1
  204. package/.next/server/app/api/worktrees/[id]/upload/[...path]/route_client-reference-manifest.js +1 -1
  205. package/.next/server/app/api/worktrees/[id]/viewed/route.js +1 -1
  206. package/.next/server/app/api/worktrees/[id]/viewed/route_client-reference-manifest.js +1 -1
  207. package/.next/server/app/api/worktrees/route_client-reference-manifest.js +1 -1
  208. package/.next/server/app/chat/page.js +2 -2
  209. package/.next/server/app/chat/page.js.nft.json +1 -1
  210. package/.next/server/app/chat/page_client-reference-manifest.js +1 -1
  211. package/.next/server/app/login/page.js.nft.json +1 -1
  212. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  213. package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
  214. package/.next/server/app/more/page.js +2 -2
  215. package/.next/server/app/more/page.js.nft.json +1 -1
  216. package/.next/server/app/more/page_client-reference-manifest.js +1 -1
  217. package/.next/server/app/offline/page.js.nft.json +1 -1
  218. package/.next/server/app/offline/page_client-reference-manifest.js +1 -1
  219. package/.next/server/app/page.js +1 -1
  220. package/.next/server/app/page.js.nft.json +1 -1
  221. package/.next/server/app/page_client-reference-manifest.js +1 -1
  222. package/.next/server/app/proxy/[...path]/route_client-reference-manifest.js +1 -1
  223. package/.next/server/app/repositories/page.js +1 -1
  224. package/.next/server/app/repositories/page.js.nft.json +1 -1
  225. package/.next/server/app/repositories/page_client-reference-manifest.js +1 -1
  226. package/.next/server/app/review/page.js +1 -1
  227. package/.next/server/app/review/page.js.nft.json +1 -1
  228. package/.next/server/app/review/page_client-reference-manifest.js +1 -1
  229. package/.next/server/app/sessions/page.js +1 -1
  230. package/.next/server/app/sessions/page.js.nft.json +1 -1
  231. package/.next/server/app/sessions/page_client-reference-manifest.js +1 -1
  232. package/.next/server/app/skills/[skillId]/page.js +2 -0
  233. package/.next/server/app/skills/[skillId]/page.js.nft.json +1 -0
  234. package/.next/server/app/skills/[skillId]/page_client-reference-manifest.js +1 -0
  235. package/.next/server/app/skills/page.js +2 -0
  236. package/.next/server/app/skills/page.js.nft.json +1 -0
  237. package/.next/server/app/skills/page_client-reference-manifest.js +1 -0
  238. package/.next/server/app/worktrees/[id]/files/[...path]/page.js +2 -2
  239. package/.next/server/app/worktrees/[id]/files/[...path]/page.js.nft.json +1 -1
  240. package/.next/server/app/worktrees/[id]/files/[...path]/page_client-reference-manifest.js +1 -1
  241. package/.next/server/app/worktrees/[id]/page.js +9 -9
  242. package/.next/server/app/worktrees/[id]/page.js.nft.json +1 -1
  243. package/.next/server/app/worktrees/[id]/page_client-reference-manifest.js +1 -1
  244. package/.next/server/app/worktrees/[id]/terminal/page.js +3 -3
  245. package/.next/server/app/worktrees/[id]/terminal/page.js.nft.json +1 -1
  246. package/.next/server/app/worktrees/[id]/terminal/page_client-reference-manifest.js +1 -1
  247. package/.next/server/app-paths-manifest.json +35 -26
  248. package/.next/server/chunks/1117.js +1 -1
  249. package/.next/server/chunks/120.js +1 -0
  250. package/.next/server/chunks/1808.js +1 -0
  251. package/.next/server/chunks/186.js +1 -0
  252. package/.next/server/chunks/2119.js +1 -1
  253. package/.next/server/chunks/22.js +1 -0
  254. package/.next/server/chunks/2328.js +1 -0
  255. package/.next/server/chunks/2445.js +1 -1
  256. package/.next/server/chunks/3042.js +2 -0
  257. package/.next/server/chunks/3543.js +1 -1
  258. package/.next/server/chunks/3708.js +1 -0
  259. package/.next/server/chunks/3945.js +1 -1
  260. package/.next/server/chunks/5064.js +1 -0
  261. package/.next/server/chunks/5226.js +28 -0
  262. package/.next/server/chunks/5306.js +2 -0
  263. package/.next/server/chunks/5312.js +1 -0
  264. package/.next/server/chunks/5326.js +1 -0
  265. package/.next/server/chunks/5381.js +1 -1
  266. package/.next/server/chunks/5456.js +1 -0
  267. package/.next/server/chunks/5571.js +1 -1
  268. package/.next/server/chunks/5959.js +3 -3
  269. package/.next/server/chunks/6065.js +1 -0
  270. package/.next/server/chunks/6130.js +1 -0
  271. package/.next/server/chunks/6283.js +1 -1
  272. package/.next/server/chunks/6285.js +1 -1
  273. package/.next/server/chunks/646.js +6 -6
  274. package/.next/server/chunks/{9968.js → 7587.js} +1 -1
  275. package/.next/server/chunks/8584.js +1 -0
  276. package/.next/server/chunks/8681.js +1 -1
  277. package/.next/server/chunks/8807.js +950 -804
  278. package/.next/server/chunks/9123.js +1 -1
  279. package/.next/server/middleware-build-manifest.js +1 -1
  280. package/.next/server/middleware-manifest.json +5 -5
  281. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  282. package/.next/server/pages/500.html +1 -1
  283. package/.next/server/server-reference-manifest.json +1 -1
  284. package/.next/static/ZYti9g9gICKnjtmkfvvB2/_buildManifest.js +1 -0
  285. package/.next/static/chunks/1668-7484081c45a44f89.js +1 -0
  286. package/.next/static/chunks/3418-7e47651340d940b0.js +1 -0
  287. package/.next/static/chunks/4027-0c529b322be7d4d8.js +1 -0
  288. package/.next/static/chunks/{4560-64b1461fd996127a.js → 4560-04e5aebcab96bfa1.js} +1 -1
  289. package/.next/static/chunks/6007-de36119357dcd418.js +1 -0
  290. package/.next/static/chunks/{6488-76295bf0184b101f.js → 6488-624d4b6d2d4cc236.js} +1 -1
  291. package/.next/static/chunks/{8965-872d8de254196cec.js → 6497-dc26c6c6b0b15adf.js} +1 -1
  292. package/.next/static/chunks/790-d8e6acd26e03679c.js +1 -0
  293. package/.next/static/chunks/8361.4bf062be2d2962f4.js +1 -0
  294. package/.next/static/chunks/app/api/app/update/route-56dad0523d3c4a92.js +1 -0
  295. package/.next/static/chunks/app/api/app/update-check/route-56dad0523d3c4a92.js +1 -0
  296. package/.next/static/chunks/app/api/assistant/conversation/route-56dad0523d3c4a92.js +1 -0
  297. package/.next/static/chunks/app/api/assistant/current-output/route-56dad0523d3c4a92.js +1 -0
  298. package/.next/static/chunks/app/api/assistant/messages/route-56dad0523d3c4a92.js +1 -0
  299. package/.next/static/chunks/app/api/assistant/session/route-56dad0523d3c4a92.js +1 -0
  300. package/.next/static/chunks/app/api/assistant/start/route-56dad0523d3c4a92.js +1 -0
  301. package/.next/static/chunks/app/api/assistant/terminal/route-56dad0523d3c4a92.js +1 -0
  302. package/.next/static/chunks/app/api/assistant/tools/route-56dad0523d3c4a92.js +1 -0
  303. package/.next/static/chunks/app/api/auth/login/route-56dad0523d3c4a92.js +1 -0
  304. package/.next/static/chunks/app/api/auth/logout/route-56dad0523d3c4a92.js +1 -0
  305. package/.next/static/chunks/app/api/auth/status/route-56dad0523d3c4a92.js +1 -0
  306. package/.next/static/chunks/app/api/daily-summary/route-56dad0523d3c4a92.js +1 -0
  307. package/.next/static/chunks/app/api/daily-summary/status/route-56dad0523d3c4a92.js +1 -0
  308. package/.next/static/chunks/app/api/external-apps/[id]/health/route-56dad0523d3c4a92.js +1 -0
  309. package/.next/static/chunks/app/api/external-apps/[id]/route-56dad0523d3c4a92.js +1 -0
  310. package/.next/static/chunks/app/api/external-apps/route-56dad0523d3c4a92.js +1 -0
  311. package/.next/static/chunks/app/api/hooks/claude-done/route-56dad0523d3c4a92.js +1 -0
  312. package/.next/static/chunks/app/api/ollama/models/route-56dad0523d3c4a92.js +1 -0
  313. package/.next/static/chunks/app/api/push/subscriptions/route-56dad0523d3c4a92.js +1 -0
  314. package/.next/static/chunks/app/api/push/vapid/route-56dad0523d3c4a92.js +1 -0
  315. package/.next/static/chunks/app/api/repositories/[id]/route-56dad0523d3c4a92.js +1 -0
  316. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +1 -0
  317. package/.next/static/chunks/app/api/repositories/[id]/todos/route-56dad0523d3c4a92.js +1 -0
  318. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-56dad0523d3c4a92.js +1 -0
  319. package/.next/static/chunks/app/api/repositories/clone/route-56dad0523d3c4a92.js +1 -0
  320. package/.next/static/chunks/app/api/repositories/excluded/route-56dad0523d3c4a92.js +1 -0
  321. package/.next/static/chunks/app/api/repositories/restore/route-56dad0523d3c4a92.js +1 -0
  322. package/.next/static/chunks/app/api/repositories/route-56dad0523d3c4a92.js +1 -0
  323. package/.next/static/chunks/app/api/repositories/scan/route-56dad0523d3c4a92.js +1 -0
  324. package/.next/static/chunks/app/api/repositories/sync/route-56dad0523d3c4a92.js +1 -0
  325. package/.next/static/chunks/app/api/sidebar/group-order/route-56dad0523d3c4a92.js +1 -0
  326. package/.next/static/chunks/app/api/skills/[id]/route-56dad0523d3c4a92.js +1 -0
  327. package/.next/static/chunks/app/api/skills/route-56dad0523d3c4a92.js +1 -0
  328. package/.next/static/chunks/app/api/slash-commands/route-56dad0523d3c4a92.js +1 -0
  329. package/.next/static/chunks/app/api/templates/[id]/route-56dad0523d3c4a92.js +1 -0
  330. package/.next/static/chunks/app/api/templates/route-56dad0523d3c4a92.js +1 -0
  331. package/.next/static/chunks/app/api/todos/route-56dad0523d3c4a92.js +1 -0
  332. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-56dad0523d3c4a92.js +1 -0
  333. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-56dad0523d3c4a92.js +1 -0
  334. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-56dad0523d3c4a92.js +1 -0
  335. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-56dad0523d3c4a92.js +1 -0
  336. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-56dad0523d3c4a92.js +1 -0
  337. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-56dad0523d3c4a92.js +1 -0
  338. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-56dad0523d3c4a92.js +1 -0
  339. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-56dad0523d3c4a92.js +1 -0
  340. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-56dad0523d3c4a92.js +1 -0
  341. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-56dad0523d3c4a92.js +1 -0
  342. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-56dad0523d3c4a92.js +1 -0
  343. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-56dad0523d3c4a92.js +1 -0
  344. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-56dad0523d3c4a92.js +1 -0
  345. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-56dad0523d3c4a92.js +1 -0
  346. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-56dad0523d3c4a92.js +1 -0
  347. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-56dad0523d3c4a92.js +1 -0
  348. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-56dad0523d3c4a92.js +1 -0
  349. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-56dad0523d3c4a92.js +1 -0
  350. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-56dad0523d3c4a92.js +1 -0
  351. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-56dad0523d3c4a92.js +1 -0
  352. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-56dad0523d3c4a92.js +1 -0
  353. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-56dad0523d3c4a92.js +1 -0
  354. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-56dad0523d3c4a92.js +1 -0
  355. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-56dad0523d3c4a92.js +1 -0
  356. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-56dad0523d3c4a92.js +1 -0
  357. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-56dad0523d3c4a92.js +1 -0
  358. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-56dad0523d3c4a92.js +1 -0
  359. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-56dad0523d3c4a92.js +1 -0
  360. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-56dad0523d3c4a92.js +1 -0
  361. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-56dad0523d3c4a92.js +1 -0
  362. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-56dad0523d3c4a92.js +1 -0
  363. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-56dad0523d3c4a92.js +1 -0
  364. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-56dad0523d3c4a92.js +1 -0
  365. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-56dad0523d3c4a92.js +1 -0
  366. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-56dad0523d3c4a92.js +1 -0
  367. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-56dad0523d3c4a92.js +1 -0
  368. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-56dad0523d3c4a92.js +1 -0
  369. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-56dad0523d3c4a92.js +1 -0
  370. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-56dad0523d3c4a92.js +1 -0
  371. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-56dad0523d3c4a92.js +1 -0
  372. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-56dad0523d3c4a92.js +1 -0
  373. package/.next/static/chunks/app/api/worktrees/[id]/route-56dad0523d3c4a92.js +1 -0
  374. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-56dad0523d3c4a92.js +1 -0
  375. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-56dad0523d3c4a92.js +1 -0
  376. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-56dad0523d3c4a92.js +1 -0
  377. package/.next/static/chunks/app/api/worktrees/[id]/search/route-56dad0523d3c4a92.js +1 -0
  378. package/.next/static/chunks/app/api/worktrees/[id]/send/route-56dad0523d3c4a92.js +1 -0
  379. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/install/route-56dad0523d3c4a92.js +1 -0
  380. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/plan/route-56dad0523d3c4a92.js +1 -0
  381. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall/route-56dad0523d3c4a92.js +1 -0
  382. package/.next/static/chunks/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route-56dad0523d3c4a92.js +1 -0
  383. package/.next/static/chunks/app/api/worktrees/[id]/skills/route-56dad0523d3c4a92.js +1 -0
  384. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-56dad0523d3c4a92.js +1 -0
  385. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-56dad0523d3c4a92.js +1 -0
  386. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-56dad0523d3c4a92.js +1 -0
  387. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-56dad0523d3c4a92.js +1 -0
  388. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-56dad0523d3c4a92.js +1 -0
  389. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-56dad0523d3c4a92.js +1 -0
  390. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-56dad0523d3c4a92.js +1 -0
  391. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-56dad0523d3c4a92.js +1 -0
  392. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-56dad0523d3c4a92.js +1 -0
  393. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-56dad0523d3c4a92.js +1 -0
  394. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-56dad0523d3c4a92.js +1 -0
  395. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-56dad0523d3c4a92.js +1 -0
  396. package/.next/static/chunks/app/api/worktrees/route-56dad0523d3c4a92.js +1 -0
  397. package/.next/static/chunks/app/chat/{page-9ed2ffd98eb4ae18.js → page-9cf4ba62e21d9074.js} +1 -1
  398. package/.next/static/chunks/app/manifest.webmanifest/route-56dad0523d3c4a92.js +1 -0
  399. package/.next/static/chunks/app/more/{page-a496425bba427b48.js → page-082d4ae496f9a36e.js} +1 -1
  400. package/.next/static/chunks/app/{page-15bfd76bcf65842d.js → page-af457ca5876ed616.js} +1 -1
  401. package/.next/static/chunks/app/proxy/[...path]/route-56dad0523d3c4a92.js +1 -0
  402. package/.next/static/chunks/app/repositories/{page-d214522ab8792ce7.js → page-75f0d70452c6b6c0.js} +1 -1
  403. package/.next/static/chunks/app/review/{page-1dadf0b5d7129598.js → page-f431d630097c2e85.js} +1 -1
  404. package/.next/static/chunks/app/sessions/{page-96f007d986c5f327.js → page-20f07a99db64d2ca.js} +1 -1
  405. package/.next/static/chunks/app/skills/[skillId]/page-68ed5e9186efe56d.js +1 -0
  406. package/.next/static/chunks/app/skills/page-46242c428ee8bccf.js +1 -0
  407. package/.next/static/chunks/app/worktrees/[id]/page-7dd929bfc978742e.js +1 -0
  408. package/.next/static/chunks/app/worktrees/[id]/terminal/page-a75fe180a7233b2b.js +1 -0
  409. package/.next/static/chunks/webpack-0f9275e279c058eb.js +1 -0
  410. package/.next/static/css/b4bdb1f3457fe9a7.css +1 -0
  411. package/.next/trace +11 -10
  412. package/.next/types/app/api/skills/[id]/route.ts +347 -0
  413. package/.next/types/app/api/skills/route.ts +347 -0
  414. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/install/route.ts +347 -0
  415. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/plan/route.ts +347 -0
  416. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/uninstall/route.ts +347 -0
  417. package/.next/types/app/api/worktrees/[id]/skills/[skillId]/uninstall-plan/route.ts +347 -0
  418. package/.next/types/app/api/worktrees/[id]/skills/route.ts +347 -0
  419. package/.next/types/app/skills/[skillId]/page.ts +84 -0
  420. package/.next/types/app/skills/page.ts +84 -0
  421. package/.next/types/routes.d.ts +11 -2
  422. package/.next/types/validator.ts +81 -0
  423. package/dist/cli/commands/skill-format.d.ts +28 -0
  424. package/dist/cli/commands/skill-format.d.ts.map +1 -0
  425. package/dist/cli/commands/skill-format.js +163 -0
  426. package/dist/cli/commands/skill-guards.d.ts +53 -0
  427. package/dist/cli/commands/skill-guards.d.ts.map +1 -0
  428. package/dist/cli/commands/skill-guards.js +188 -0
  429. package/dist/cli/commands/skill.d.ts +24 -0
  430. package/dist/cli/commands/skill.d.ts.map +1 -0
  431. package/dist/cli/commands/skill.js +365 -0
  432. package/dist/cli/docs/agent-operations.d.ts +1 -1
  433. package/dist/cli/docs/agent-operations.d.ts.map +1 -1
  434. package/dist/cli/docs/agent-operations.js +36 -0
  435. package/dist/cli/program.d.ts.map +1 -1
  436. package/dist/cli/program.js +11 -0
  437. package/dist/cli/types/api-responses.d.ts +215 -0
  438. package/dist/cli/types/api-responses.d.ts.map +1 -1
  439. package/dist/cli/types/index.d.ts +60 -0
  440. package/dist/cli/types/index.d.ts.map +1 -1
  441. package/dist/cli/types/index.js +23 -1
  442. package/dist/cli/utils/api-client.d.ts +19 -1
  443. package/dist/cli/utils/api-client.d.ts.map +1 -1
  444. package/dist/cli/utils/api-client.js +41 -4
  445. package/dist/server/server.js +57 -0
  446. package/dist/server/src/config/activity-bar-config.js +2 -0
  447. package/dist/server/src/config/git-status-config.js +83 -0
  448. package/dist/server/src/config/skill-security-config.js +139 -0
  449. package/dist/server/src/lib/cli-tools/antigravity.js +8 -13
  450. package/dist/server/src/lib/cli-tools/codex.js +8 -14
  451. package/dist/server/src/lib/cli-tools/copilot.js +12 -13
  452. package/dist/server/src/lib/cli-tools/gemini.js +8 -13
  453. package/dist/server/src/lib/cli-tools/opencode.js +8 -13
  454. package/dist/server/src/lib/cli-tools/submit-verified-sender.js +174 -0
  455. package/dist/server/src/lib/cli-tools/vibe-local.js +12 -17
  456. package/dist/server/src/lib/db/migrations/index.js +8 -0
  457. package/dist/server/src/lib/db/migrations/runner.js +1 -1
  458. package/dist/server/src/lib/db/migrations/v44-skill-operations.js +81 -0
  459. package/dist/server/src/lib/db/migrations/v45-skill-installations.js +59 -0
  460. package/dist/server/src/lib/db/migrations/v46-skill-installations-cascade.js +107 -0
  461. package/dist/server/src/lib/db/migrations/v47-skill-installations-roots.js +70 -0
  462. package/dist/server/src/lib/db/worktree-db.js +9 -4
  463. package/dist/server/src/lib/git/git-errors.js +336 -0
  464. package/dist/server/src/lib/git/git-exec.js +285 -0
  465. package/dist/server/src/lib/session-key-sender.js +11 -9
  466. package/dist/server/src/lib/skills/compatibility.js +194 -0
  467. package/dist/server/src/lib/skills/constants.js +252 -0
  468. package/dist/server/src/lib/skills/errors.js +82 -0
  469. package/dist/server/src/lib/skills/index.js +91 -0
  470. package/dist/server/src/lib/skills/install-apply.js +670 -0
  471. package/dist/server/src/lib/skills/install-plan.js +582 -0
  472. package/dist/server/src/lib/skills/installed-state.js +127 -0
  473. package/dist/server/src/lib/skills/integrity.js +225 -0
  474. package/dist/server/src/lib/skills/json-schema.js +365 -0
  475. package/dist/server/src/lib/skills/operation-audit.js +120 -0
  476. package/dist/server/src/lib/skills/operation-journal.js +286 -0
  477. package/dist/server/src/lib/skills/operation-lock.js +339 -0
  478. package/dist/server/src/lib/skills/operation-reconciler.js +107 -0
  479. package/dist/server/src/lib/skills/operation-store.js +153 -0
  480. package/dist/server/src/lib/skills/package-reader.js +495 -0
  481. package/dist/server/src/lib/skills/package-validator.js +451 -0
  482. package/dist/server/src/lib/skills/preview-diff.js +627 -0
  483. package/dist/server/src/lib/skills/safe-yaml.js +593 -0
  484. package/dist/server/src/lib/skills/schema.js +1248 -0
  485. package/dist/server/src/lib/skills/semver.js +193 -0
  486. package/dist/server/src/lib/skills/snapshot-store.js +334 -0
  487. package/dist/server/src/lib/skills/startup-reconcile.js +138 -0
  488. package/dist/server/src/lib/skills/uninstall-apply.js +495 -0
  489. package/dist/server/src/lib/skills/uninstall-plan.js +479 -0
  490. package/dist/server/src/types/skills.js +17 -0
  491. package/package.json +1 -1
  492. package/.next/server/chunks/129.js +0 -1
  493. package/.next/server/chunks/2478.js +0 -1
  494. package/.next/server/chunks/9886.js +0 -1
  495. package/.next/static/0_lnKsT0DH-MnHhnV5n-l/_buildManifest.js +0 -1
  496. package/.next/static/chunks/3165-87bf884f7f3d15cf.js +0 -1
  497. package/.next/static/chunks/6416.6756b7ad06dd96f7.js +0 -1
  498. package/.next/static/chunks/8676.57260a06f6554e7e.js +0 -1
  499. package/.next/static/chunks/app/api/app/update/route-7536041a7a89616d.js +0 -1
  500. package/.next/static/chunks/app/api/app/update-check/route-7536041a7a89616d.js +0 -1
  501. package/.next/static/chunks/app/api/assistant/conversation/route-7536041a7a89616d.js +0 -1
  502. package/.next/static/chunks/app/api/assistant/current-output/route-7536041a7a89616d.js +0 -1
  503. package/.next/static/chunks/app/api/assistant/messages/route-7536041a7a89616d.js +0 -1
  504. package/.next/static/chunks/app/api/assistant/session/route-7536041a7a89616d.js +0 -1
  505. package/.next/static/chunks/app/api/assistant/start/route-7536041a7a89616d.js +0 -1
  506. package/.next/static/chunks/app/api/assistant/terminal/route-7536041a7a89616d.js +0 -1
  507. package/.next/static/chunks/app/api/assistant/tools/route-7536041a7a89616d.js +0 -1
  508. package/.next/static/chunks/app/api/auth/login/route-7536041a7a89616d.js +0 -1
  509. package/.next/static/chunks/app/api/auth/logout/route-7536041a7a89616d.js +0 -1
  510. package/.next/static/chunks/app/api/auth/status/route-7536041a7a89616d.js +0 -1
  511. package/.next/static/chunks/app/api/daily-summary/route-7536041a7a89616d.js +0 -1
  512. package/.next/static/chunks/app/api/daily-summary/status/route-7536041a7a89616d.js +0 -1
  513. package/.next/static/chunks/app/api/external-apps/[id]/health/route-7536041a7a89616d.js +0 -1
  514. package/.next/static/chunks/app/api/external-apps/[id]/route-7536041a7a89616d.js +0 -1
  515. package/.next/static/chunks/app/api/external-apps/route-7536041a7a89616d.js +0 -1
  516. package/.next/static/chunks/app/api/hooks/claude-done/route-7536041a7a89616d.js +0 -1
  517. package/.next/static/chunks/app/api/ollama/models/route-7536041a7a89616d.js +0 -1
  518. package/.next/static/chunks/app/api/push/subscriptions/route-7536041a7a89616d.js +0 -1
  519. package/.next/static/chunks/app/api/push/vapid/route-7536041a7a89616d.js +0 -1
  520. package/.next/static/chunks/app/api/repositories/[id]/route-7536041a7a89616d.js +0 -1
  521. package/.next/static/chunks/app/api/repositories/[id]/todos/[todoId]/route-7536041a7a89616d.js +0 -1
  522. package/.next/static/chunks/app/api/repositories/[id]/todos/route-7536041a7a89616d.js +0 -1
  523. package/.next/static/chunks/app/api/repositories/clone/[jobId]/route-7536041a7a89616d.js +0 -1
  524. package/.next/static/chunks/app/api/repositories/clone/route-7536041a7a89616d.js +0 -1
  525. package/.next/static/chunks/app/api/repositories/excluded/route-7536041a7a89616d.js +0 -1
  526. package/.next/static/chunks/app/api/repositories/restore/route-7536041a7a89616d.js +0 -1
  527. package/.next/static/chunks/app/api/repositories/route-7536041a7a89616d.js +0 -1
  528. package/.next/static/chunks/app/api/repositories/scan/route-7536041a7a89616d.js +0 -1
  529. package/.next/static/chunks/app/api/repositories/sync/route-7536041a7a89616d.js +0 -1
  530. package/.next/static/chunks/app/api/sidebar/group-order/route-7536041a7a89616d.js +0 -1
  531. package/.next/static/chunks/app/api/slash-commands/route-7536041a7a89616d.js +0 -1
  532. package/.next/static/chunks/app/api/templates/[id]/route-7536041a7a89616d.js +0 -1
  533. package/.next/static/chunks/app/api/templates/route-7536041a7a89616d.js +0 -1
  534. package/.next/static/chunks/app/api/todos/route-7536041a7a89616d.js +0 -1
  535. package/.next/static/chunks/app/api/worktrees/[id]/auto-yes/route-7536041a7a89616d.js +0 -1
  536. package/.next/static/chunks/app/api/worktrees/[id]/capture/route-7536041a7a89616d.js +0 -1
  537. package/.next/static/chunks/app/api/worktrees/[id]/cli-tool/route-7536041a7a89616d.js +0 -1
  538. package/.next/static/chunks/app/api/worktrees/[id]/cmate/schedules/route-7536041a7a89616d.js +0 -1
  539. package/.next/static/chunks/app/api/worktrees/[id]/current-output/route-7536041a7a89616d.js +0 -1
  540. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/[logId]/route-7536041a7a89616d.js +0 -1
  541. package/.next/static/chunks/app/api/worktrees/[id]/execution-logs/route-7536041a7a89616d.js +0 -1
  542. package/.next/static/chunks/app/api/worktrees/[id]/files/[...path]/route-7536041a7a89616d.js +0 -1
  543. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/create/route-7536041a7a89616d.js +0 -1
  544. package/.next/static/chunks/app/api/worktrees/[id]/git/branch/delete/route-7536041a7a89616d.js +0 -1
  545. package/.next/static/chunks/app/api/worktrees/[id]/git/branches/route-7536041a7a89616d.js +0 -1
  546. package/.next/static/chunks/app/api/worktrees/[id]/git/checkout/route-7536041a7a89616d.js +0 -1
  547. package/.next/static/chunks/app/api/worktrees/[id]/git/commit/route-7536041a7a89616d.js +0 -1
  548. package/.next/static/chunks/app/api/worktrees/[id]/git/diff/route-7536041a7a89616d.js +0 -1
  549. package/.next/static/chunks/app/api/worktrees/[id]/git/fetch/route-7536041a7a89616d.js +0 -1
  550. package/.next/static/chunks/app/api/worktrees/[id]/git/log/route-7536041a7a89616d.js +0 -1
  551. package/.next/static/chunks/app/api/worktrees/[id]/git/pull/route-7536041a7a89616d.js +0 -1
  552. package/.next/static/chunks/app/api/worktrees/[id]/git/push/route-7536041a7a89616d.js +0 -1
  553. package/.next/static/chunks/app/api/worktrees/[id]/git/reset/route-7536041a7a89616d.js +0 -1
  554. package/.next/static/chunks/app/api/worktrees/[id]/git/revert/route-7536041a7a89616d.js +0 -1
  555. package/.next/static/chunks/app/api/worktrees/[id]/git/show/[commitHash]/route-7536041a7a89616d.js +0 -1
  556. package/.next/static/chunks/app/api/worktrees/[id]/git/stage/route-7536041a7a89616d.js +0 -1
  557. package/.next/static/chunks/app/api/worktrees/[id]/git/staged/route-7536041a7a89616d.js +0 -1
  558. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/[index]/route-7536041a7a89616d.js +0 -1
  559. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/apply/route-7536041a7a89616d.js +0 -1
  560. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/pop/route-7536041a7a89616d.js +0 -1
  561. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/push/route-7536041a7a89616d.js +0 -1
  562. package/.next/static/chunks/app/api/worktrees/[id]/git/stash/route-7536041a7a89616d.js +0 -1
  563. package/.next/static/chunks/app/api/worktrees/[id]/git/status/route-7536041a7a89616d.js +0 -1
  564. package/.next/static/chunks/app/api/worktrees/[id]/git/unstage/route-7536041a7a89616d.js +0 -1
  565. package/.next/static/chunks/app/api/worktrees/[id]/git/working-diff/route-7536041a7a89616d.js +0 -1
  566. package/.next/static/chunks/app/api/worktrees/[id]/interrupt/route-7536041a7a89616d.js +0 -1
  567. package/.next/static/chunks/app/api/worktrees/[id]/kill-session/route-7536041a7a89616d.js +0 -1
  568. package/.next/static/chunks/app/api/worktrees/[id]/logs/[filename]/route-7536041a7a89616d.js +0 -1
  569. package/.next/static/chunks/app/api/worktrees/[id]/logs/route-7536041a7a89616d.js +0 -1
  570. package/.next/static/chunks/app/api/worktrees/[id]/marp-render/route-7536041a7a89616d.js +0 -1
  571. package/.next/static/chunks/app/api/worktrees/[id]/memos/[memoId]/route-7536041a7a89616d.js +0 -1
  572. package/.next/static/chunks/app/api/worktrees/[id]/memos/route-7536041a7a89616d.js +0 -1
  573. package/.next/static/chunks/app/api/worktrees/[id]/messages/route-7536041a7a89616d.js +0 -1
  574. package/.next/static/chunks/app/api/worktrees/[id]/prompt-response/route-7536041a7a89616d.js +0 -1
  575. package/.next/static/chunks/app/api/worktrees/[id]/respond/route-7536041a7a89616d.js +0 -1
  576. package/.next/static/chunks/app/api/worktrees/[id]/route-7536041a7a89616d.js +0 -1
  577. package/.next/static/chunks/app/api/worktrees/[id]/schedules/[scheduleId]/route-7536041a7a89616d.js +0 -1
  578. package/.next/static/chunks/app/api/worktrees/[id]/schedules/active/route-7536041a7a89616d.js +0 -1
  579. package/.next/static/chunks/app/api/worktrees/[id]/schedules/route-7536041a7a89616d.js +0 -1
  580. package/.next/static/chunks/app/api/worktrees/[id]/search/route-7536041a7a89616d.js +0 -1
  581. package/.next/static/chunks/app/api/worktrees/[id]/send/route-7536041a7a89616d.js +0 -1
  582. package/.next/static/chunks/app/api/worktrees/[id]/slash-commands/route-7536041a7a89616d.js +0 -1
  583. package/.next/static/chunks/app/api/worktrees/[id]/special-keys/route-7536041a7a89616d.js +0 -1
  584. package/.next/static/chunks/app/api/worktrees/[id]/start-polling/route-7536041a7a89616d.js +0 -1
  585. package/.next/static/chunks/app/api/worktrees/[id]/terminal/route-7536041a7a89616d.js +0 -1
  586. package/.next/static/chunks/app/api/worktrees/[id]/timers/history/route-7536041a7a89616d.js +0 -1
  587. package/.next/static/chunks/app/api/worktrees/[id]/timers/route-7536041a7a89616d.js +0 -1
  588. package/.next/static/chunks/app/api/worktrees/[id]/todos/[todoId]/route-7536041a7a89616d.js +0 -1
  589. package/.next/static/chunks/app/api/worktrees/[id]/todos/route-7536041a7a89616d.js +0 -1
  590. package/.next/static/chunks/app/api/worktrees/[id]/tree/[...path]/route-7536041a7a89616d.js +0 -1
  591. package/.next/static/chunks/app/api/worktrees/[id]/tree/route-7536041a7a89616d.js +0 -1
  592. package/.next/static/chunks/app/api/worktrees/[id]/upload/[...path]/route-7536041a7a89616d.js +0 -1
  593. package/.next/static/chunks/app/api/worktrees/[id]/viewed/route-7536041a7a89616d.js +0 -1
  594. package/.next/static/chunks/app/api/worktrees/route-7536041a7a89616d.js +0 -1
  595. package/.next/static/chunks/app/manifest.webmanifest/route-7536041a7a89616d.js +0 -1
  596. package/.next/static/chunks/app/proxy/[...path]/route-7536041a7a89616d.js +0 -1
  597. package/.next/static/chunks/app/worktrees/[id]/page-9a4ce51e697baac6.js +0 -1
  598. package/.next/static/chunks/app/worktrees/[id]/terminal/page-ed4590b024edd8d6.js +0 -1
  599. package/.next/static/chunks/webpack-2e3739a831868daa.js +0 -1
  600. package/.next/static/css/d7e2e8d1b8d69d36.css +0 -1
  601. package/dist/server/src/lib/pasted-text-helper.js +0 -58
  602. /package/.next/static/{0_lnKsT0DH-MnHhnV5n-l → ZYti9g9gICKnjtmkfvvB2}/_ssgManifest.js +0 -0
@@ -1,807 +1,51 @@
1
- "use strict";exports.id=8807,exports.ids=[8807],exports.modules={19006:(a,b,c)=>{c.d(b,{vI:()=>j});var d=c(33873),e=c.n(d);function f(a){try{let b=a.prepare("SELECT MAX(version) as version FROM schema_version").get();return b?.version??0}catch{return 0}}function g(a){let b=c(29021),d=a;for(;d!==e().dirname(d);){let a=e().join(d,".git");if(b.existsSync(a)){let c=b.statSync(a);if(c.isDirectory())return d;if(c.isFile()){let c=b.readFileSync(a,"utf-8").trim().match(/^gitdir:\s*(.+)$/);if(c)return c[1].split("/.git/")[0]}}d=e().dirname(d)}return a}var h=c(25537);let i=[{version:1,name:"initial-schema",up:a=>{(0,h.s4)(a)},down:a=>{a.exec("DROP TABLE IF EXISTS session_states;"),a.exec("DROP TABLE IF EXISTS chat_messages;"),a.exec("DROP TABLE IF EXISTS worktrees;")}},{version:2,name:"add-multi-repo-and-memo-support",up:a=>{a.exec(`
2
- ALTER TABLE worktrees ADD COLUMN repository_path TEXT;
3
- ALTER TABLE worktrees ADD COLUMN repository_name TEXT;
4
- ALTER TABLE worktrees ADD COLUMN memo TEXT;
5
- ALTER TABLE worktrees ADD COLUMN last_user_message TEXT;
6
- ALTER TABLE worktrees ADD COLUMN last_user_message_at INTEGER;
7
- `),a.exec(`
8
- CREATE INDEX IF NOT EXISTS idx_worktrees_repository
9
- ON worktrees(repository_path);
10
- `);let b=a.prepare("SELECT id, path FROM worktrees").all(),c=a.prepare(`
11
- UPDATE worktrees
12
- SET repository_path = ?,
13
- repository_name = ?
14
- WHERE id = ?
15
- `);for(let a of b){let b=g(a.path),d=e().basename(b);c.run(b,d,a.id)}let d=a.prepare(`
16
- UPDATE worktrees
17
- SET last_user_message = ?,
18
- last_user_message_at = ?
19
- WHERE id = ?
20
- `);for(let c of b){let b=a.prepare(`
21
- SELECT content, timestamp
22
- FROM chat_messages
23
- WHERE worktree_id = ? AND role = 'user'
24
- ORDER BY timestamp DESC
25
- LIMIT 1
26
- `).get(c.id);if(b){let a=b.content.substring(0,200);d.run(a,b.timestamp,c.id)}}},down:a=>{a.exec(`
27
- -- Create backup table
28
- CREATE TABLE worktrees_backup AS
29
- SELECT id, name, path, last_message_summary, updated_at
30
- FROM worktrees;
31
-
32
- -- Drop original table
33
- DROP TABLE worktrees;
34
-
35
- -- Recreate original table
36
- CREATE TABLE worktrees (
37
- id TEXT PRIMARY KEY,
38
- name TEXT NOT NULL,
39
- path TEXT NOT NULL UNIQUE,
40
- last_message_summary TEXT,
41
- updated_at INTEGER
42
- );
43
-
44
- -- Restore data
45
- INSERT INTO worktrees (id, name, path, last_message_summary, updated_at)
46
- SELECT id, name, path, last_message_summary, updated_at
47
- FROM worktrees_backup;
48
-
49
- -- Drop backup table
50
- DROP TABLE worktrees_backup;
51
-
52
- -- Drop index
53
- DROP INDEX IF EXISTS idx_worktrees_repository;
54
- `)}},{version:3,name:"fix-worktree-repository-paths",up:a=>{let b=a.prepare("SELECT id, path FROM worktrees").all(),c=a.prepare(`
55
- UPDATE worktrees
56
- SET repository_path = ?,
57
- repository_name = ?
58
- WHERE id = ?
59
- `);for(let a of b){let b=g(a.path),d=e().basename(b);c.run(b,d,a.id)}},down:()=>{console.log("No rollback needed for repository path fix")}},{version:4,name:"add-favorite-field",up:a=>{a.exec(`
60
- ALTER TABLE worktrees ADD COLUMN favorite INTEGER DEFAULT 0;
61
- `),a.exec(`
62
- CREATE INDEX IF NOT EXISTS idx_worktrees_favorite
63
- ON worktrees(favorite DESC, updated_at DESC);
64
- `)},down:a=>{a.exec(`
65
- DROP INDEX IF EXISTS idx_worktrees_favorite;
66
- `)}},{version:5,name:"add-status-field",up:a=>{a.exec(`
67
- ALTER TABLE worktrees ADD COLUMN status TEXT DEFAULT NULL;
68
- `),a.exec(`
69
- CREATE INDEX IF NOT EXISTS idx_worktrees_status
70
- ON worktrees(status);
71
- `)},down:a=>{a.exec(`
72
- DROP INDEX IF EXISTS idx_worktrees_status;
73
- `)}},{version:6,name:"add-link-field",up:a=>{a.exec(`
74
- ALTER TABLE worktrees ADD COLUMN link TEXT DEFAULT NULL;
75
- `)},down:()=>{console.log("No rollback needed for link field")}},{version:7,name:"add-cli-tool-id",up:a=>{a.exec(`
76
- ALTER TABLE worktrees ADD COLUMN cli_tool_id TEXT DEFAULT 'claude';
77
- `),a.exec(`
78
- CREATE INDEX IF NOT EXISTS idx_worktrees_cli_tool
79
- ON worktrees(cli_tool_id);
80
- `),a.exec(`
81
- UPDATE worktrees SET cli_tool_id = 'claude' WHERE cli_tool_id IS NULL;
82
- `)},down:a=>{a.exec(`
83
- DROP INDEX IF EXISTS idx_worktrees_cli_tool;
84
- `),console.log("No full rollback for cli_tool_id column (SQLite limitation)")}},{version:8,name:"change-role-claude-to-assistant",up:a=>{a.exec(`
85
- CREATE TABLE chat_messages_new (
86
- id TEXT PRIMARY KEY,
87
- worktree_id TEXT NOT NULL,
88
- role TEXT NOT NULL CHECK (role IN ('user', 'assistant')),
89
- content TEXT NOT NULL,
90
- summary TEXT,
91
- timestamp INTEGER NOT NULL,
92
- log_file_name TEXT,
93
- request_id TEXT,
94
- message_type TEXT DEFAULT 'normal',
95
- prompt_data TEXT,
96
- cli_tool_id TEXT DEFAULT 'claude',
97
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
98
- );
99
- `),a.exec(`
100
- INSERT INTO chat_messages_new
101
- SELECT
102
- id,
103
- worktree_id,
104
- CASE WHEN role = 'claude' THEN 'assistant' ELSE role END as role,
105
- content,
106
- summary,
107
- timestamp,
108
- log_file_name,
109
- request_id,
110
- message_type,
111
- prompt_data,
112
- cli_tool_id
113
- FROM chat_messages;
114
- `),a.exec("DROP TABLE chat_messages;"),a.exec("ALTER TABLE chat_messages_new RENAME TO chat_messages;"),a.exec(`
115
- CREATE INDEX IF NOT EXISTS idx_chat_messages_worktree
116
- ON chat_messages(worktree_id);
117
- `),a.exec(`
118
- CREATE INDEX IF NOT EXISTS idx_chat_messages_timestamp
119
- ON chat_messages(timestamp);
120
- `),console.log('Changed role constraint from "claude" to "assistant"'),console.log('Updated existing messages with role="claude" to role="assistant"')},down:a=>{a.exec(`
121
- CREATE TABLE chat_messages_new (
122
- id TEXT PRIMARY KEY,
123
- worktree_id TEXT NOT NULL,
124
- role TEXT NOT NULL CHECK (role IN ('user', 'claude')),
125
- content TEXT NOT NULL,
126
- summary TEXT,
127
- timestamp INTEGER NOT NULL,
128
- log_file_name TEXT,
129
- request_id TEXT,
130
- message_type TEXT DEFAULT 'normal',
131
- prompt_data TEXT,
132
- cli_tool_id TEXT DEFAULT 'claude',
133
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
134
- );
135
- `),a.exec(`
136
- INSERT INTO chat_messages_new
137
- SELECT
138
- id,
139
- worktree_id,
140
- CASE WHEN role = 'assistant' THEN 'claude' ELSE role END as role,
141
- content,
142
- summary,
143
- timestamp,
144
- log_file_name,
145
- request_id,
146
- message_type,
147
- prompt_data,
148
- cli_tool_id
149
- FROM chat_messages;
150
- `),a.exec("DROP TABLE chat_messages;"),a.exec("ALTER TABLE chat_messages_new RENAME TO chat_messages;"),a.exec(`
151
- CREATE INDEX IF NOT EXISTS idx_chat_messages_worktree
152
- ON chat_messages(worktree_id);
153
- `),a.exec(`
154
- CREATE INDEX IF NOT EXISTS idx_chat_messages_timestamp
155
- ON chat_messages(timestamp);
156
- `),console.log('Rolled back: Changed role constraint from "assistant" to "claude"')}},{version:9,name:"add-in-progress-message-id-to-session-states",up:a=>{a.exec(`
157
- ALTER TABLE session_states ADD COLUMN in_progress_message_id TEXT DEFAULT NULL;
158
- `),console.log("Added in_progress_message_id column to session_states table")},down:()=>{console.log("No full rollback for in_progress_message_id column (SQLite limitation)")}},{version:10,name:"add-worktree-memos-table",up:a=>{a.exec(`
159
- CREATE TABLE worktree_memos (
160
- id TEXT PRIMARY KEY,
161
- worktree_id TEXT NOT NULL,
162
- title TEXT NOT NULL DEFAULT 'Memo',
163
- content TEXT NOT NULL DEFAULT '',
164
- position INTEGER NOT NULL DEFAULT 0,
165
- created_at INTEGER NOT NULL,
166
- updated_at INTEGER NOT NULL,
167
-
168
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE,
169
- UNIQUE(worktree_id, position)
170
- );
171
- `),a.exec(`
172
- CREATE INDEX idx_worktree_memos_worktree
173
- ON worktree_memos(worktree_id, position);
174
- `);let{randomUUID:b}=c(55511),d=a.prepare(`
175
- SELECT id, memo FROM worktrees WHERE memo IS NOT NULL AND memo != ''
176
- `).all(),e=a.prepare(`
177
- INSERT INTO worktree_memos (id, worktree_id, title, content, position, created_at, updated_at)
178
- VALUES (?, ?, 'Memo', ?, 0, ?, ?)
179
- `),f=Date.now();for(let a of d)e.run(b(),a.id,a.memo,f,f);console.log("Created worktree_memos table"),console.log(`Migrated ${d.length} existing memos to new table`)},down:a=>{a.exec("DROP TABLE IF EXISTS worktree_memos"),console.log("Dropped worktree_memos table")}},{version:11,name:"add-viewed-tracking",up:a=>{a.exec(`
180
- ALTER TABLE worktrees ADD COLUMN last_viewed_at TEXT;
181
- `),a.exec(`
182
- CREATE INDEX IF NOT EXISTS idx_chat_messages_assistant_latest
183
- ON chat_messages(worktree_id, role, timestamp DESC);
184
- `),console.log("Added last_viewed_at column to worktrees table"),console.log("Created index for assistant message queries")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_chat_messages_assistant_latest"),console.log("Dropped idx_chat_messages_assistant_latest index")}},{version:12,name:"add-external-apps-table",up:a=>{a.exec(`
185
- CREATE TABLE IF NOT EXISTS external_apps (
186
- id TEXT PRIMARY KEY,
187
-
188
- -- Basic info
189
- name TEXT NOT NULL UNIQUE,
190
- display_name TEXT NOT NULL,
191
- description TEXT,
192
-
193
- -- Routing config
194
- path_prefix TEXT NOT NULL UNIQUE,
195
- target_port INTEGER NOT NULL,
196
- target_host TEXT DEFAULT 'localhost',
197
-
198
- -- App type
199
- app_type TEXT NOT NULL CHECK(app_type IN ('sveltekit', 'streamlit', 'nextjs', 'other')),
200
-
201
- -- WebSocket config
202
- websocket_enabled INTEGER DEFAULT 0,
203
- websocket_path_pattern TEXT,
1
+ "use strict";exports.id=8807,exports.ids=[8807],exports.modules={25537:(a,b,c)=>{function d(a){a.exec(`
2
+ CREATE TABLE IF NOT EXISTS worktrees (
3
+ id TEXT PRIMARY KEY,
4
+ name TEXT NOT NULL,
5
+ path TEXT NOT NULL UNIQUE,
6
+ last_message_summary TEXT,
7
+ updated_at INTEGER
8
+ );
9
+ `),a.exec(`
10
+ CREATE INDEX IF NOT EXISTS idx_worktrees_updated_at
11
+ ON worktrees(updated_at DESC);
12
+ `),a.exec(`
13
+ CREATE TABLE IF NOT EXISTS chat_messages (
14
+ id TEXT PRIMARY KEY,
15
+ worktree_id TEXT NOT NULL,
16
+ role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
17
+ content TEXT NOT NULL,
18
+ summary TEXT,
19
+ timestamp INTEGER NOT NULL,
20
+ log_file_name TEXT,
21
+ request_id TEXT,
22
+ message_type TEXT DEFAULT 'normal',
23
+ prompt_data TEXT,
24
+ cli_tool_id TEXT DEFAULT 'claude',
25
+ archived INTEGER DEFAULT 0,
204
26
 
205
- -- Status
206
- enabled INTEGER DEFAULT 1,
207
-
208
- -- Metadata
209
- created_at INTEGER NOT NULL,
210
- updated_at INTEGER NOT NULL
211
- );
212
- `),a.exec(`
213
- CREATE INDEX idx_external_apps_path_prefix ON external_apps(path_prefix);
214
- `),a.exec(`
215
- CREATE INDEX idx_external_apps_enabled ON external_apps(enabled);
216
- `),console.log("Created external_apps table"),console.log("Created indexes for external_apps")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_external_apps_enabled"),a.exec("DROP INDEX IF EXISTS idx_external_apps_path_prefix"),a.exec("DROP TABLE IF EXISTS external_apps"),console.log("Dropped external_apps table and indexes")}},{version:13,name:"rename-worktree-memo-to-description",up:a=>{a.exec(`
217
- ALTER TABLE worktrees RENAME COLUMN memo TO description;
218
- `),console.log("Renamed worktrees.memo column to description")},down:a=>{a.exec(`
219
- ALTER TABLE worktrees RENAME COLUMN description TO memo;
220
- `),console.log("Rolled back: Renamed worktrees.description column back to memo")}},{version:14,name:"add-repositories-and-clone-jobs-tables",up:a=>{a.exec(`
221
- CREATE TABLE IF NOT EXISTS repositories (
222
- id TEXT PRIMARY KEY,
223
- name TEXT NOT NULL,
224
- path TEXT NOT NULL UNIQUE,
225
- enabled INTEGER NOT NULL DEFAULT 1,
226
- clone_url TEXT,
227
- normalized_clone_url TEXT,
228
- clone_source TEXT CHECK(clone_source IN ('local', 'https', 'ssh')) DEFAULT 'local',
229
- is_env_managed INTEGER NOT NULL DEFAULT 0,
230
- created_at INTEGER NOT NULL,
231
- updated_at INTEGER NOT NULL
232
- );
233
- `),a.exec(`
234
- CREATE UNIQUE INDEX IF NOT EXISTS idx_repositories_normalized_clone_url
235
- ON repositories(normalized_clone_url)
236
- WHERE normalized_clone_url IS NOT NULL;
237
- `),a.exec(`
238
- CREATE INDEX IF NOT EXISTS idx_repositories_path
239
- ON repositories(path);
240
- `),a.exec(`
241
- CREATE TABLE IF NOT EXISTS clone_jobs (
242
- id TEXT PRIMARY KEY,
243
- clone_url TEXT NOT NULL,
244
- normalized_clone_url TEXT NOT NULL,
245
- target_path TEXT NOT NULL,
246
- repository_id TEXT,
247
- status TEXT NOT NULL CHECK(status IN ('pending', 'running', 'completed', 'failed', 'cancelled')) DEFAULT 'pending',
248
- pid INTEGER,
249
- progress INTEGER NOT NULL DEFAULT 0,
250
- error_category TEXT,
251
- error_code TEXT,
252
- error_message TEXT,
253
- started_at INTEGER,
254
- completed_at INTEGER,
255
- created_at INTEGER NOT NULL,
256
-
257
- FOREIGN KEY (repository_id) REFERENCES repositories(id) ON DELETE SET NULL
258
- );
259
- `),a.exec(`
260
- CREATE INDEX IF NOT EXISTS idx_clone_jobs_status
261
- ON clone_jobs(status);
262
- `),a.exec(`
263
- CREATE INDEX IF NOT EXISTS idx_clone_jobs_normalized_clone_url
264
- ON clone_jobs(normalized_clone_url);
265
- `),console.log("Created repositories table"),console.log("Created clone_jobs table"),console.log("Created indexes for repositories and clone_jobs")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_clone_jobs_normalized_clone_url"),a.exec("DROP INDEX IF EXISTS idx_clone_jobs_status"),a.exec("DROP TABLE IF EXISTS clone_jobs"),a.exec("DROP INDEX IF EXISTS idx_repositories_path"),a.exec("DROP INDEX IF EXISTS idx_repositories_normalized_clone_url"),a.exec("DROP TABLE IF EXISTS repositories"),console.log("Dropped repositories and clone_jobs tables")}},{version:15,name:"add-initial-branch-column",up:a=>{a.exec(`
266
- ALTER TABLE worktrees ADD COLUMN initial_branch TEXT;
267
- `),console.log("Added initial_branch column to worktrees table")},down:a=>{a.exec(`
268
- -- 1. Create backup table without initial_branch
269
- CREATE TABLE worktrees_backup AS
270
- SELECT id, name, path, repository_path, repository_name, description,
271
- last_user_message, last_user_message_at, last_message_summary,
272
- favorite, status, link, cli_tool_id, updated_at, last_viewed_at
273
- FROM worktrees;
274
-
275
- -- 2. Drop original table
276
- DROP TABLE worktrees;
277
-
278
- -- 3. Recreate table without initial_branch
279
- CREATE TABLE worktrees (
280
- id TEXT PRIMARY KEY,
281
- name TEXT NOT NULL,
282
- path TEXT NOT NULL UNIQUE,
283
- repository_path TEXT,
284
- repository_name TEXT,
285
- description TEXT,
286
- last_user_message TEXT,
287
- last_user_message_at INTEGER,
288
- last_message_summary TEXT,
289
- favorite INTEGER DEFAULT 0,
290
- status TEXT DEFAULT NULL,
291
- link TEXT DEFAULT NULL,
292
- cli_tool_id TEXT DEFAULT 'claude',
293
- updated_at INTEGER,
294
- last_viewed_at TEXT
295
- );
296
-
297
- -- 4. Restore data
298
- INSERT INTO worktrees (id, name, path, repository_path, repository_name,
299
- description, last_user_message, last_user_message_at, last_message_summary,
300
- favorite, status, link, cli_tool_id, updated_at, last_viewed_at)
301
- SELECT id, name, path, repository_path, repository_name,
302
- description, last_user_message, last_user_message_at, last_message_summary,
303
- favorite, status, link, cli_tool_id, updated_at, last_viewed_at
304
- FROM worktrees_backup;
305
-
306
- -- 5. Drop backup
307
- DROP TABLE worktrees_backup;
308
-
309
- -- 6. Recreate indexes
310
- CREATE INDEX IF NOT EXISTS idx_worktrees_updated_at
311
- ON worktrees(updated_at DESC);
312
-
313
- CREATE INDEX IF NOT EXISTS idx_worktrees_repository
314
- ON worktrees(repository_path);
315
-
316
- CREATE INDEX IF NOT EXISTS idx_worktrees_favorite
317
- ON worktrees(favorite DESC, updated_at DESC);
318
-
319
- CREATE INDEX IF NOT EXISTS idx_worktrees_status
320
- ON worktrees(status);
321
-
322
- CREATE INDEX IF NOT EXISTS idx_worktrees_cli_tool
323
- ON worktrees(cli_tool_id);
324
- `),console.log("Removed initial_branch column from worktrees table")}},{version:16,name:"add-issue-no-to-external-apps",up:a=>{a.exec(`
325
- ALTER TABLE external_apps ADD COLUMN issue_no INTEGER;
326
- `),a.exec(`
327
- CREATE INDEX IF NOT EXISTS idx_external_apps_issue_no ON external_apps(issue_no);
328
- `),console.log("Added issue_no column to external_apps table"),console.log("Created index idx_external_apps_issue_no")},down:a=>{a.exec(`
329
- -- 1. Create backup table without issue_no
330
- CREATE TABLE external_apps_backup AS
331
- SELECT id, name, display_name, description, path_prefix, target_port,
332
- target_host, app_type, websocket_enabled, websocket_path_pattern,
333
- enabled, created_at, updated_at
334
- FROM external_apps;
335
-
336
- -- 2. Drop original table (this also drops indexes)
337
- DROP TABLE external_apps;
338
-
339
- -- 3. Recreate table without issue_no
340
- CREATE TABLE external_apps (
341
- id TEXT PRIMARY KEY,
342
- name TEXT NOT NULL UNIQUE,
343
- display_name TEXT NOT NULL,
344
- description TEXT,
345
- path_prefix TEXT NOT NULL UNIQUE,
346
- target_port INTEGER NOT NULL,
347
- target_host TEXT DEFAULT 'localhost',
348
- app_type TEXT NOT NULL CHECK(app_type IN ('sveltekit', 'streamlit', 'nextjs', 'other')),
349
- websocket_enabled INTEGER DEFAULT 0,
350
- websocket_path_pattern TEXT,
351
- enabled INTEGER DEFAULT 1,
352
- created_at INTEGER NOT NULL,
353
- updated_at INTEGER NOT NULL
354
- );
355
-
356
- -- 4. Restore data
357
- INSERT INTO external_apps (id, name, display_name, description, path_prefix,
358
- target_port, target_host, app_type, websocket_enabled, websocket_path_pattern,
359
- enabled, created_at, updated_at)
360
- SELECT id, name, display_name, description, path_prefix,
361
- target_port, target_host, app_type, websocket_enabled, websocket_path_pattern,
362
- enabled, created_at, updated_at
363
- FROM external_apps_backup;
364
-
365
- -- 5. Drop backup
366
- DROP TABLE external_apps_backup;
367
-
368
- -- 6. Recreate original indexes
369
- CREATE INDEX idx_external_apps_path_prefix ON external_apps(path_prefix);
370
- CREATE INDEX idx_external_apps_enabled ON external_apps(enabled);
371
- `),console.log("Removed issue_no column from external_apps table")}},{version:17,name:"add-scheduled-executions-and-execution-logs",up:a=>{a.exec(`
372
- DELETE FROM chat_messages WHERE worktree_id NOT IN (SELECT id FROM worktrees);
373
- `),a.exec(`
374
- DELETE FROM session_states WHERE worktree_id NOT IN (SELECT id FROM worktrees);
375
- `),a.exec(`
376
- DELETE FROM worktree_memos WHERE worktree_id NOT IN (SELECT id FROM worktrees);
377
- `),a.exec(`
378
- UPDATE clone_jobs SET repository_id = NULL
379
- WHERE repository_id IS NOT NULL AND repository_id NOT IN (SELECT id FROM repositories);
380
- `),a.exec(`
381
- CREATE TABLE scheduled_executions (
382
- id TEXT PRIMARY KEY,
383
- worktree_id TEXT NOT NULL,
384
- cli_tool_id TEXT DEFAULT 'claude',
385
- name TEXT NOT NULL,
386
- message TEXT NOT NULL,
387
- cron_expression TEXT,
388
- enabled INTEGER DEFAULT 1,
389
- last_executed_at INTEGER,
390
- next_execute_at INTEGER,
391
- created_at INTEGER NOT NULL,
392
- updated_at INTEGER NOT NULL,
393
- UNIQUE(worktree_id, name),
394
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
395
- );
396
- `),a.exec(`
397
- CREATE INDEX idx_scheduled_executions_worktree
398
- ON scheduled_executions(worktree_id);
399
- `),a.exec(`
400
- CREATE INDEX idx_scheduled_executions_enabled
401
- ON scheduled_executions(enabled);
402
- `),a.exec(`
403
- CREATE TABLE execution_logs (
404
- id TEXT PRIMARY KEY,
405
- schedule_id TEXT NOT NULL,
406
- worktree_id TEXT NOT NULL,
407
- message TEXT NOT NULL,
408
- result TEXT,
409
- exit_code INTEGER,
410
- status TEXT DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'timeout', 'cancelled')),
411
- started_at INTEGER NOT NULL,
412
- completed_at INTEGER,
413
- created_at INTEGER NOT NULL,
414
- FOREIGN KEY (schedule_id) REFERENCES scheduled_executions(id) ON DELETE CASCADE,
415
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
416
- );
417
- `),a.exec(`
418
- CREATE INDEX idx_execution_logs_schedule
419
- ON execution_logs(schedule_id);
420
- `),a.exec(`
421
- CREATE INDEX idx_execution_logs_worktree
422
- ON execution_logs(worktree_id);
423
- `),a.exec(`
424
- CREATE INDEX idx_execution_logs_status
425
- ON execution_logs(status);
426
- `),console.log("Cleaned up orphan records"),console.log("Created scheduled_executions table"),console.log("Created execution_logs table"),console.log("Created indexes for schedule tables")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_execution_logs_status"),a.exec("DROP INDEX IF EXISTS idx_execution_logs_worktree"),a.exec("DROP INDEX IF EXISTS idx_execution_logs_schedule"),a.exec("DROP TABLE IF EXISTS execution_logs"),a.exec("DROP INDEX IF EXISTS idx_scheduled_executions_enabled"),a.exec("DROP INDEX IF EXISTS idx_scheduled_executions_worktree"),a.exec("DROP TABLE IF EXISTS scheduled_executions"),console.log("Dropped scheduled_executions and execution_logs tables")}},{version:18,name:"add-selected-agents-column",up:a=>{a.exec(`
427
- ALTER TABLE worktrees ADD COLUMN selected_agents TEXT;
428
- `),a.exec(`
429
- UPDATE worktrees SET selected_agents =
430
- CASE
431
- WHEN cli_tool_id NOT IN ('claude', 'codex')
432
- THEN json_array(cli_tool_id, 'claude')
433
- ELSE '["claude","codex"]'
434
- END;
435
- `),console.log("Added selected_agents column to worktrees table"),console.log("Initialized selected_agents based on cli_tool_id")},down:()=>{console.log("No rollback for selected_agents column (SQLite limitation)")}},{version:19,name:"add-vibe-local-model-column",up:a=>{a.exec(`
436
- ALTER TABLE worktrees ADD COLUMN vibe_local_model TEXT DEFAULT NULL;
437
- `),console.log("Added vibe_local_model column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_model column (SQLite limitation)")}},{version:20,name:"add-vibe-local-context-window-column",up:a=>{a.exec(`
438
- ALTER TABLE worktrees ADD COLUMN vibe_local_context_window INTEGER DEFAULT NULL;
439
- `),console.log("Added vibe_local_context_window column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_context_window column (SQLite limitation)")}},{version:21,name:"add-scheduled-executions-worktree-enabled-index",up:a=>{a.exec(`
440
- CREATE INDEX IF NOT EXISTS idx_scheduled_executions_worktree_enabled
441
- ON scheduled_executions(worktree_id, enabled);
442
- `),console.log("Created composite index idx_scheduled_executions_worktree_enabled")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_scheduled_executions_worktree_enabled"),console.log("Dropped idx_scheduled_executions_worktree_enabled index")}},{version:22,name:"add-archived-column-to-chat-messages",up:a=>{a.exec(`
443
- ALTER TABLE chat_messages ADD COLUMN archived INTEGER DEFAULT 0;
444
- `),a.exec(`
445
- UPDATE chat_messages SET archived = 0 WHERE archived IS NULL;
446
- `),a.exec(`
447
- CREATE INDEX IF NOT EXISTS idx_messages_archived
448
- ON chat_messages(worktree_id, archived, timestamp DESC);
449
- `),console.log("Added archived column to chat_messages table"),console.log("Created composite index idx_messages_archived")},down:()=>{console.log("No rollback for archived column (SQLite limitation)")}},{version:23,name:"add-timer-messages-table",up:a=>{a.exec(`
450
- CREATE TABLE timer_messages (
451
- id TEXT PRIMARY KEY,
452
- worktree_id TEXT NOT NULL,
453
- cli_tool_id TEXT NOT NULL,
454
- message TEXT NOT NULL,
455
- delay_ms INTEGER NOT NULL,
456
- scheduled_send_time INTEGER NOT NULL,
457
- status TEXT NOT NULL DEFAULT 'pending',
458
- created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
459
- sent_at INTEGER,
460
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
461
- );
462
-
463
- CREATE INDEX idx_timer_messages_worktree_status
464
- ON timer_messages(worktree_id, status);
465
-
466
- CREATE INDEX idx_timer_messages_status_scheduled
467
- ON timer_messages(status, scheduled_send_time);
468
- `),console.log("Created timer_messages table with indexes")},down:a=>{a.exec(`
469
- DROP INDEX IF EXISTS idx_timer_messages_status_scheduled;
470
- DROP INDEX IF EXISTS idx_timer_messages_worktree_status;
471
- DROP TABLE IF EXISTS timer_messages;
472
- `)}},{version:24,name:"add-daily-reports-table",up:a=>{a.exec(`
473
- CREATE TABLE daily_reports (
474
- date TEXT PRIMARY KEY,
475
- content TEXT NOT NULL,
476
- generated_by_tool TEXT NOT NULL,
477
- model TEXT,
478
- created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
479
- updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
480
- );
481
- `),console.log("Created daily_reports table")},down:a=>{a.exec("DROP TABLE IF EXISTS daily_reports"),console.log("Dropped daily_reports table")}},{version:25,name:"add-report-templates-table",up:a=>{a.exec(`
482
- CREATE TABLE report_templates (
483
- id TEXT PRIMARY KEY,
484
- name TEXT NOT NULL,
485
- content TEXT NOT NULL,
486
- sort_order INTEGER NOT NULL DEFAULT 0,
487
- created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
488
- updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
489
- );
490
- `),console.log("Created report_templates table")},down:a=>{a.exec("DROP TABLE IF EXISTS report_templates"),console.log("Dropped report_templates table")}},{version:26,name:"add-repository-display-name",up:a=>{a.exec("ALTER TABLE repositories ADD COLUMN display_name TEXT;"),console.log("Added display_name column to repositories table")},down:a=>{a.exec("ALTER TABLE repositories DROP COLUMN display_name;"),console.log("Removed display_name column from repositories table")}},{version:27,name:"add-app-settings-table",up:a=>{a.exec(`
491
- CREATE TABLE IF NOT EXISTS app_settings (
492
- key TEXT PRIMARY KEY,
493
- value TEXT NOT NULL,
494
- created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
495
- updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
496
- );
497
- `)},down:a=>{a.exec("DROP TABLE IF EXISTS app_settings")}},{version:28,name:"add-assistant-conversation-tables",up:a=>{a.exec(`
498
- CREATE TABLE IF NOT EXISTS assistant_conversations (
499
- id TEXT PRIMARY KEY,
500
- repository_id TEXT NOT NULL,
501
- cli_tool_id TEXT NOT NULL,
502
- working_directory TEXT NOT NULL,
503
- session_name TEXT,
504
- status TEXT NOT NULL DEFAULT 'idle',
505
- last_started_at INTEGER,
506
- last_stopped_at INTEGER,
507
- context_sent_at INTEGER,
508
- created_at INTEGER NOT NULL,
509
- updated_at INTEGER NOT NULL,
510
- archived INTEGER NOT NULL DEFAULT 0,
511
- UNIQUE(repository_id, cli_tool_id),
512
- FOREIGN KEY (repository_id) REFERENCES repositories(id) ON DELETE CASCADE
513
- );
514
-
515
- CREATE INDEX IF NOT EXISTS idx_assistant_conversations_repository_tool
516
- ON assistant_conversations(repository_id, cli_tool_id);
517
-
518
- CREATE INDEX IF NOT EXISTS idx_assistant_conversations_status
519
- ON assistant_conversations(status, archived, updated_at DESC);
520
-
521
- CREATE TABLE IF NOT EXISTS assistant_messages (
522
- id TEXT PRIMARY KEY,
523
- conversation_id TEXT NOT NULL,
524
- role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system')),
525
- content TEXT NOT NULL,
526
- summary TEXT,
527
- timestamp INTEGER NOT NULL,
528
- message_type TEXT NOT NULL DEFAULT 'normal',
529
- delivery_status TEXT CHECK(delivery_status IN ('pending', 'sent', 'failed')),
530
- archived INTEGER NOT NULL DEFAULT 0,
531
- FOREIGN KEY (conversation_id) REFERENCES assistant_conversations(id) ON DELETE CASCADE
532
- );
533
-
534
- CREATE INDEX IF NOT EXISTS idx_assistant_messages_conversation_time
535
- ON assistant_messages(conversation_id, timestamp DESC);
536
-
537
- CREATE INDEX IF NOT EXISTS idx_assistant_messages_delivery
538
- ON assistant_messages(conversation_id, delivery_status, timestamp DESC);
539
-
540
- CREATE TABLE IF NOT EXISTS assistant_session_states (
541
- conversation_id TEXT PRIMARY KEY,
542
- last_captured_line INTEGER NOT NULL DEFAULT 0,
543
- in_progress_message_id TEXT,
544
- FOREIGN KEY (conversation_id) REFERENCES assistant_conversations(id) ON DELETE CASCADE
545
- );
546
- `)},down:a=>{a.exec(`
547
- DROP TABLE IF EXISTS assistant_session_states;
548
- DROP TABLE IF EXISTS assistant_messages;
549
- DROP TABLE IF EXISTS assistant_conversations;
550
- `)}},{version:29,name:"add-assistant-non-interactive-executions",up:a=>{a.exec(`
551
- ALTER TABLE assistant_conversations
552
- ADD COLUMN execution_mode TEXT NOT NULL DEFAULT 'interactive';
553
-
554
- ALTER TABLE assistant_conversations
555
- ADD COLUMN resume_session_id TEXT;
556
-
557
- ALTER TABLE assistant_conversations
558
- ADD COLUMN last_execution_id TEXT;
559
-
560
- UPDATE assistant_conversations
561
- SET status = CASE
562
- WHEN status = 'idle' THEN 'stopped'
563
- ELSE status
564
- END;
565
-
566
- UPDATE assistant_conversations
567
- SET execution_mode = CASE
568
- WHEN cli_tool_id IN ('claude', 'codex') THEN 'non_interactive'
569
- ELSE 'interactive'
570
- END;
571
-
572
- CREATE TABLE IF NOT EXISTS assistant_executions (
573
- id TEXT PRIMARY KEY,
574
- conversation_id TEXT NOT NULL,
575
- cli_tool_id TEXT NOT NULL,
576
- status TEXT NOT NULL,
577
- pid INTEGER,
578
- command_line TEXT NOT NULL,
579
- prompt_text TEXT NOT NULL,
580
- stdout_text TEXT,
581
- stderr_text TEXT,
582
- final_message_text TEXT,
583
- exit_code INTEGER,
584
- resume_session_id_before TEXT,
585
- resume_session_id_after TEXT,
586
- started_at INTEGER,
587
- finished_at INTEGER,
588
- created_at INTEGER NOT NULL,
589
- updated_at INTEGER NOT NULL,
590
- FOREIGN KEY (conversation_id) REFERENCES assistant_conversations(id) ON DELETE CASCADE
591
- );
592
-
593
- CREATE INDEX IF NOT EXISTS idx_assistant_executions_conversation
594
- ON assistant_executions(conversation_id, created_at DESC);
595
-
596
- CREATE INDEX IF NOT EXISTS idx_assistant_executions_status
597
- ON assistant_executions(status, updated_at DESC);
598
- `)},down:a=>{a.exec(`
599
- DROP TABLE IF EXISTS assistant_executions;
600
- `)}},{version:30,name:"add-assistant-context-snapshot",up:a=>{a.exec(`
601
- ALTER TABLE assistant_conversations
602
- ADD COLUMN context_snapshot TEXT;
603
- `)},down:a=>{a.exec(`
604
- ALTER TABLE assistant_conversations
605
- DROP COLUMN context_snapshot;
606
- `)}},{version:31,name:"add-repository-visible",up:a=>{a.exec("ALTER TABLE repositories ADD COLUMN visible INTEGER NOT NULL DEFAULT 1;")},down:a=>{a.exec("ALTER TABLE repositories DROP COLUMN visible;")}},{version:32,name:"add-messages-role-composite-index",up:a=>{a.exec(`
607
- CREATE INDEX IF NOT EXISTS idx_messages_worktree_role_archived_time
608
- ON chat_messages(worktree_id, role, archived, timestamp DESC);
609
- `),a.exec("DROP INDEX IF EXISTS idx_messages_archived;")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_messages_worktree_role_archived_time;"),a.exec(`
610
- CREATE INDEX IF NOT EXISTS idx_messages_archived
611
- ON chat_messages(worktree_id, archived, timestamp DESC);
612
- `)}},{version:33,name:"add-agent-instances",up:a=>{a.exec(`
613
- CREATE TABLE session_states_new (
614
- worktree_id TEXT NOT NULL,
615
- cli_tool_id TEXT NOT NULL DEFAULT 'claude',
616
- instance_id TEXT NOT NULL DEFAULT 'claude',
617
- last_captured_line INTEGER DEFAULT 0,
618
- in_progress_message_id TEXT DEFAULT NULL,
619
-
620
- PRIMARY KEY (worktree_id, instance_id),
621
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
622
- );
623
- `),a.exec(`
624
- INSERT INTO session_states_new
625
- (worktree_id, cli_tool_id, instance_id, last_captured_line, in_progress_message_id)
626
- SELECT
627
- worktree_id,
628
- COALESCE(cli_tool_id, 'claude'),
629
- COALESCE(cli_tool_id, 'claude'),
630
- last_captured_line,
631
- in_progress_message_id
632
- FROM session_states
633
- WHERE worktree_id IN (SELECT id FROM worktrees);
634
- `),a.exec("DROP TABLE session_states;"),a.exec("ALTER TABLE session_states_new RENAME TO session_states;"),a.exec(`
635
- ALTER TABLE chat_messages ADD COLUMN instance_id TEXT DEFAULT NULL;
636
- `),a.exec(`
637
- UPDATE chat_messages
638
- SET instance_id = COALESCE(cli_tool_id, 'claude')
639
- WHERE instance_id IS NULL;
640
- `),a.exec(`
641
- CREATE INDEX IF NOT EXISTS idx_messages_instance
642
- ON chat_messages(worktree_id, instance_id, timestamp DESC);
643
- `),a.exec(`
644
- CREATE TABLE agent_instances (
645
- worktree_id TEXT NOT NULL,
646
- instance_id TEXT NOT NULL,
647
- cli_tool_id TEXT NOT NULL,
648
- alias TEXT NOT NULL DEFAULT '',
649
- sort_order INTEGER NOT NULL DEFAULT 0,
650
- created_at INTEGER NOT NULL,
651
-
652
- PRIMARY KEY (worktree_id, instance_id),
653
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
654
- );
655
- `),a.exec(`
656
- CREATE INDEX idx_agent_instances_worktree
657
- ON agent_instances(worktree_id, sort_order);
658
- `);let b=a.prepare(`
659
- SELECT id, selected_agents, cli_tool_id FROM worktrees
660
- `).all(),c=a.prepare(`
661
- INSERT OR IGNORE INTO agent_instances
662
- (worktree_id, instance_id, cli_tool_id, alias, sort_order, created_at)
663
- VALUES (?, ?, ?, '', ?, ?)
664
- `),d=Date.now(),e=0;for(let a of b){let b=function(a){if(!a)return[];try{let b=JSON.parse(a);if(!Array.isArray(b))return[];let c=new Set,d=[];for(let a of b)"string"==typeof a&&a.length>0&&!c.has(a)&&(c.add(a),d.push(a));return d}catch{return[]}}(a.selected_agents);0===b.length&&(b=[a.cli_tool_id||"claude"]),b.forEach((b,f)=>{c.run(a.id,b,b,f,d),e+=1})}console.log("Rebuilt session_states with (worktree_id, instance_id) primary key"),console.log("Added instance_id column + idx_messages_instance to chat_messages"),console.log(`Created agent_instances table; backfilled ${e} primary instance(s)`)},down:a=>{a.exec("DROP INDEX IF EXISTS idx_agent_instances_worktree;"),a.exec("DROP TABLE IF EXISTS agent_instances;"),a.exec("DROP INDEX IF EXISTS idx_messages_instance;"),a.exec(`
665
- CREATE TABLE session_states_old (
666
- worktree_id TEXT NOT NULL,
667
- cli_tool_id TEXT NOT NULL DEFAULT 'claude',
668
- last_captured_line INTEGER DEFAULT 0,
669
- in_progress_message_id TEXT DEFAULT NULL,
670
-
671
- PRIMARY KEY (worktree_id, cli_tool_id),
672
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
673
- );
674
- `),a.exec(`
675
- INSERT OR IGNORE INTO session_states_old
676
- (worktree_id, cli_tool_id, last_captured_line, in_progress_message_id)
677
- SELECT worktree_id, cli_tool_id, last_captured_line, in_progress_message_id
678
- FROM session_states
679
- WHERE instance_id = cli_tool_id;
680
- `),a.exec("DROP TABLE session_states;"),a.exec("ALTER TABLE session_states_old RENAME TO session_states;"),console.log("Rolled back agent_instances migration (v33)")}},{version:34,name:"add-repository-todos",up:a=>{a.exec(`
681
- CREATE TABLE IF NOT EXISTS repository_todos (
682
- id TEXT PRIMARY KEY,
683
- repository_id TEXT NOT NULL,
684
- content TEXT NOT NULL,
685
- done INTEGER NOT NULL DEFAULT 0,
686
- position INTEGER NOT NULL DEFAULT 0,
687
- created_at INTEGER NOT NULL,
688
- updated_at INTEGER NOT NULL,
689
- FOREIGN KEY (repository_id) REFERENCES repositories(id) ON DELETE CASCADE
690
- );
691
- `),a.exec(`
692
- CREATE INDEX IF NOT EXISTS idx_repository_todos_repo
693
- ON repository_todos(repository_id, position);
694
- `)},down:a=>{a.exec("DROP TABLE IF EXISTS repository_todos;")}},{version:35,name:"add-instance-id-to-timer-messages",up:a=>{a.exec(`
695
- ALTER TABLE timer_messages ADD COLUMN instance_id TEXT;
696
- `),a.exec(`
697
- UPDATE timer_messages SET instance_id = cli_tool_id WHERE instance_id IS NULL;
698
- `),console.log("Added instance_id column to timer_messages table")},down:()=>{console.log("No rollback for instance_id column (SQLite limitation)")}},{version:36,name:"add-branch-to-worktrees",up:a=>{a.exec(`
699
- ALTER TABLE worktrees ADD COLUMN branch TEXT;
700
- `),console.log("Added branch column to worktrees table")},down:()=>{console.log("No rollback for branch column (SQLite limitation)")}},{version:37,name:"add-worktree-todos",up:a=>{a.exec(`
701
- CREATE TABLE IF NOT EXISTS worktree_todos (
702
- id TEXT PRIMARY KEY,
703
- worktree_id TEXT NOT NULL,
704
- content TEXT NOT NULL,
705
- done INTEGER NOT NULL DEFAULT 0,
706
- position INTEGER NOT NULL DEFAULT 0,
707
- created_at INTEGER NOT NULL,
708
- updated_at INTEGER NOT NULL,
709
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
710
- );
711
- `),a.exec(`
712
- CREATE INDEX IF NOT EXISTS idx_worktree_todos_wt
713
- ON worktree_todos(worktree_id, position);
714
- `)},down:a=>{a.exec("DROP TABLE IF EXISTS worktree_todos;")}},{version:38,name:"add-status-to-worktree-todos",up:a=>{a.exec(`
715
- ALTER TABLE worktree_todos
716
- ADD COLUMN status TEXT NOT NULL DEFAULT 'todo';
717
- `),a.exec(`
718
- UPDATE worktree_todos SET status = 'done' WHERE done = 1;
719
- `)},down:()=>{}},{version:39,name:"add-detail-to-worktree-todos",up:a=>{a.exec(`
720
- ALTER TABLE worktree_todos
721
- ADD COLUMN detail TEXT NOT NULL DEFAULT '';
722
- `)},down:()=>{}},{version:40,name:"add-error-to-timer-messages",up:a=>{a.exec(`
723
- ALTER TABLE timer_messages ADD COLUMN error TEXT;
724
- `),console.log("Added error column to timer_messages table")},down:()=>{console.log("No rollback for error column (SQLite limitation)")}},{version:41,name:"add-push-subscriptions",up:a=>{a.exec(`
725
- CREATE TABLE IF NOT EXISTS push_subscriptions (
726
- id TEXT PRIMARY KEY,
727
- endpoint TEXT NOT NULL UNIQUE,
728
- p256dh TEXT NOT NULL,
729
- auth TEXT NOT NULL,
730
- device_label TEXT,
731
- enabled_prompt INTEGER NOT NULL DEFAULT 1,
732
- enabled_completion INTEGER NOT NULL DEFAULT 1,
733
- created_at INTEGER NOT NULL,
734
- updated_at INTEGER NOT NULL
735
- );
736
- `),a.exec(`
737
- CREATE INDEX IF NOT EXISTS idx_push_subscriptions_endpoint
738
- ON push_subscriptions(endpoint);
739
- `)},down:a=>{a.exec("DROP TABLE IF EXISTS push_subscriptions;")}},{version:42,name:"add-locale-to-push-subscriptions",up:a=>{a.exec(`
740
- ALTER TABLE push_subscriptions ADD COLUMN locale TEXT;
741
- `)},down:a=>{a.exec(`
742
- ALTER TABLE push_subscriptions DROP COLUMN locale;
743
- `)}},{version:43,name:"remove-cm-root-dir-ghost-repository",up:a=>{let b=function(){let a=process.env.CM_ROOT_DIR??process.env.MCBD_ROOT_DIR;return a&&a.trim()?e().resolve(a.trim()):null}();return b?(function(){let a=process.env.WORKTREE_REPOS;return a&&a.trim()?a.split(",").map(a=>a.trim()).filter(a=>a.length>0).map(a=>e().resolve(a)):[]})().includes(b)?void console.log(`Migration 43: ${b} is a WORKTREE_REPOS entry; keeping its repository row`):void(a.prepare(`DELETE FROM repositories
744
- WHERE path = ?
745
- AND is_env_managed = 1
746
- AND NOT EXISTS (
747
- SELECT 1 FROM worktrees WHERE worktrees.repository_path = ?
748
- )`).run(b,b).changes>0?console.log(`Migration 43: removed CM_ROOT_DIR ghost repository row (${b})`):console.log(`Migration 43: no ghost repository row at ${b}`)):void console.log("Migration 43: CM_ROOT_DIR is not set; no ghost row to remove")},down:()=>{console.log("No rollback for the CM_ROOT_DIR ghost row removal")}}];function j(a){!function(a,b){a.exec(`
749
- CREATE TABLE IF NOT EXISTS schema_version (
750
- version INTEGER PRIMARY KEY,
751
- name TEXT NOT NULL,
752
- applied_at INTEGER NOT NULL
753
- );
754
- `);let c=f(a);if(console.log(`Current schema version: ${c}`),c>43)throw Error(`This database (schema v${c}) was created by a newer version of CommandMate (this build supports up to v43). Please update: commandmate update`);let d=b.filter(a=>a.version>c);if(0===d.length)return console.log("Schema is up to date");for(let b of(console.log(`Found ${d.length} pending migration(s)`),d)){console.log(`Applying migration ${b.version}: ${b.name}...`);try{a.transaction(()=>{b.up(a),a.prepare(`
755
- INSERT INTO schema_version (version, name, applied_at)
756
- VALUES (?, ?, ?)
757
- `).run(b.version,b.name,Date.now())})(),console.log(`Migration ${b.version} applied successfully`)}catch(c){let a=c instanceof Error?c.message:String(c);throw console.error(`Migration ${b.version} failed:`,a),Error(`Migration ${b.version} (${b.name}) failed: ${a}`)}}console.log(`All migrations completed. Current version: ${f(a)}`)}(a,i)}},25537:(a,b,c)=>{function d(a){a.exec(`
758
- CREATE TABLE IF NOT EXISTS worktrees (
759
- id TEXT PRIMARY KEY,
760
- name TEXT NOT NULL,
761
- path TEXT NOT NULL UNIQUE,
762
- last_message_summary TEXT,
763
- updated_at INTEGER
764
- );
765
- `),a.exec(`
766
- CREATE INDEX IF NOT EXISTS idx_worktrees_updated_at
767
- ON worktrees(updated_at DESC);
768
- `),a.exec(`
769
- CREATE TABLE IF NOT EXISTS chat_messages (
770
- id TEXT PRIMARY KEY,
771
- worktree_id TEXT NOT NULL,
772
- role TEXT NOT NULL CHECK(role IN ('user', 'assistant')),
773
- content TEXT NOT NULL,
774
- summary TEXT,
775
- timestamp INTEGER NOT NULL,
776
- log_file_name TEXT,
777
- request_id TEXT,
778
- message_type TEXT DEFAULT 'normal',
779
- prompt_data TEXT,
780
- cli_tool_id TEXT DEFAULT 'claude',
781
- archived INTEGER DEFAULT 0,
782
-
783
- FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
784
- );
785
- `),a.exec(`
786
- CREATE INDEX IF NOT EXISTS idx_messages_worktree_time
787
- ON chat_messages(worktree_id, timestamp DESC);
788
- `),a.exec(`
789
- CREATE INDEX IF NOT EXISTS idx_messages_request_id
790
- ON chat_messages(request_id);
791
- `),a.exec(`
792
- CREATE INDEX IF NOT EXISTS idx_messages_type
793
- ON chat_messages(message_type, worktree_id);
794
- `),a.exec(`
795
- CREATE INDEX IF NOT EXISTS idx_messages_cli_tool
796
- ON chat_messages(worktree_id, cli_tool_id, timestamp DESC);
797
- `),a.exec(`
798
- CREATE INDEX IF NOT EXISTS idx_messages_worktree_role_archived_time
799
- ON chat_messages(worktree_id, role, archived, timestamp DESC);
800
- `),a.exec(`
801
- CREATE TABLE IF NOT EXISTS session_states (
802
- worktree_id TEXT NOT NULL,
803
- cli_tool_id TEXT NOT NULL DEFAULT 'claude',
804
- last_captured_line INTEGER DEFAULT 0,
27
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
28
+ );
29
+ `),a.exec(`
30
+ CREATE INDEX IF NOT EXISTS idx_messages_worktree_time
31
+ ON chat_messages(worktree_id, timestamp DESC);
32
+ `),a.exec(`
33
+ CREATE INDEX IF NOT EXISTS idx_messages_request_id
34
+ ON chat_messages(request_id);
35
+ `),a.exec(`
36
+ CREATE INDEX IF NOT EXISTS idx_messages_type
37
+ ON chat_messages(message_type, worktree_id);
38
+ `),a.exec(`
39
+ CREATE INDEX IF NOT EXISTS idx_messages_cli_tool
40
+ ON chat_messages(worktree_id, cli_tool_id, timestamp DESC);
41
+ `),a.exec(`
42
+ CREATE INDEX IF NOT EXISTS idx_messages_worktree_role_archived_time
43
+ ON chat_messages(worktree_id, role, archived, timestamp DESC);
44
+ `),a.exec(`
45
+ CREATE TABLE IF NOT EXISTS session_states (
46
+ worktree_id TEXT NOT NULL,
47
+ cli_tool_id TEXT NOT NULL DEFAULT 'claude',
48
+ last_captured_line INTEGER DEFAULT 0,
805
49
 
806
50
  PRIMARY KEY (worktree_id, cli_tool_id),
807
51
  FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
@@ -1064,4 +308,906 @@
1064
308
  device_label = excluded.device_label,
1065
309
  locale = COALESCE(excluded.locale, push_subscriptions.locale),
1066
310
  updated_at = excluded.updated_at
1067
- `).run((0,d.randomUUID)(),b.endpoint,b.p256dh,b.auth,e,f,c,c);let g=h(a,b.endpoint);if(!g)throw Error("Failed to persist push subscription");return g}function h(a,b){let c=a.prepare(`SELECT ${f} FROM push_subscriptions WHERE endpoint = ?`).get(b);return c?e(c):null}function i(a,b){return a.prepare(`SELECT ${f} FROM push_subscriptions WHERE ${"prompt"===b?"enabled_prompt":"enabled_completion"} = 1 ORDER BY created_at ASC`).all().map(e)}function j(a,b,c){let d=["updated_at = ?"],e=[Date.now()];return void 0!==c.enabledPrompt&&(d.push("enabled_prompt = ?"),e.push(+!!c.enabledPrompt)),void 0!==c.enabledCompletion&&(d.push("enabled_completion = ?"),e.push(+!!c.enabledCompletion)),e.push(b),a.prepare(`UPDATE push_subscriptions SET ${d.join(", ")} WHERE endpoint = ?`).run(...e),h(a,b)}function k(a,b){return a.prepare("DELETE FROM push_subscriptions WHERE endpoint = ?").run(b).changes>0}},87374:(a,b,c)=>{c.d(b,{Dr:()=>i,HR:()=>h,Ky:()=>f,XS:()=>e,ms:()=>g,u8:()=>d}),Array.from({length:Math.floor(104)+1},(a,b)=>3e5+3e5*b);let d=5,e=50,f=100,g=1e4,h={PENDING:"pending",SENDING:"sending",SENT:"sent",FAILED:"failed",CANCELLED:"cancelled",NO_SESSION:"no_session"};function i(a){return"number"==typeof a&&a>=3e5&&a<=315e5&&a%3e5==0}},88807:(a,b,c)=>{c.r(b),c.d(b,{closeDbInstance:()=>p,getDbInstance:()=>o});var d=c(33873),e=c.n(d),f=c(19006),g=c(79646),h=c(87550),i=c.n(h);let j=!1;function k(a){return a instanceof Error&&"ERR_DLOPEN_FAILED"===a.code&&a.message.includes("NODE_MODULE_VERSION")}function l(a,b){let c=["better-sqlite3 could not be loaded: it was built for a different Node.js version.","This usually happens after switching Node.js versions (nvm, fnm, Homebrew, ...).","",`Automatic recovery failed: ${a}`,"","How to fix it manually:"];return b?c.push(" The install directory is not writable by the current user, so the addon"," cannot be rebuilt in place. Do not re-run this with sudo — root-owned"," files there will break future installs and updates.",""," Either switch back to the Node.js version CommandMate was installed with:",` node -v (currently ${process.version}, NODE_MODULE_VERSION ${process.versions.modules})`,""," Or reinstall CommandMate under a Node.js version manager, which keeps"," global packages in a user-owned directory:"," nvm use <version> && npm install -g commandmate"):c.push(` 1. cd ${process.cwd()}`," 2. npm rebuild better-sqlite3"," 3. Start CommandMate again",""," If that fails, reinstalling picks up the current Node.js version:"," npm install -g commandmate"),c.join("\n")}var m=c(87447);let n=null;function o(){if(!n){let a=(0,m._$)().CM_DB_PATH,b=c(29021),d=e().dirname(a);b.existsSync(d)||b.mkdirSync(d,{recursive:!0,mode:448});let h=function(a){try{return new(i())(a)}catch(c){if(!k(c))throw c;if(j)throw Error(l("a rebuild was already attempted in this process.",!1));j=!0,console.error("[commandmate] better-sqlite3 was built for a different Node.js version.\n[commandmate] Rebuilding it automatically — this can take a few minutes...");let b=function(){let a=(0,g.spawnSync)("npm",["rebuild","better-sqlite3"],{cwd:process.cwd(),encoding:"utf-8",timeout:3e5,env:{...process.env,PATH:`${e().dirname(process.execPath)}${e().delimiter}${process.env.PATH??""}`}}),b=`${a.stdout??""}${a.stderr??""}`;return a.error||0!==a.status?{success:!1,permissionDenied:/EACCES|permission denied/i.test(b),output:b}:{success:!0,permissionDenied:!1,output:b}}();if(!b.success)throw Error(l("npm rebuild better-sqlite3 failed.",b.permissionDenied));console.error("[commandmate] Rebuild succeeded. Continuing startup.");try{return new(i())(a)}catch(a){if(k(a))throw Error(l("the addon still reports a version mismatch after rebuilding.",!1));throw a}}}(a);h.pragma("foreign_keys = ON"),h.pragma("journal_mode = WAL"),h.pragma("busy_timeout = 5000");try{(0,f.vI)(h)}catch(a){throw h.close(),a}n=h}return n}function p(){n&&(n.close(),n=null)}}};
311
+ `).run((0,d.randomUUID)(),b.endpoint,b.p256dh,b.auth,e,f,c,c);let g=h(a,b.endpoint);if(!g)throw Error("Failed to persist push subscription");return g}function h(a,b){let c=a.prepare(`SELECT ${f} FROM push_subscriptions WHERE endpoint = ?`).get(b);return c?e(c):null}function i(a,b){return a.prepare(`SELECT ${f} FROM push_subscriptions WHERE ${"prompt"===b?"enabled_prompt":"enabled_completion"} = 1 ORDER BY created_at ASC`).all().map(e)}function j(a,b,c){let d=["updated_at = ?"],e=[Date.now()];return void 0!==c.enabledPrompt&&(d.push("enabled_prompt = ?"),e.push(+!!c.enabledPrompt)),void 0!==c.enabledCompletion&&(d.push("enabled_completion = ?"),e.push(+!!c.enabledCompletion)),e.push(b),a.prepare(`UPDATE push_subscriptions SET ${d.join(", ")} WHERE endpoint = ?`).run(...e),h(a,b)}function k(a,b){return a.prepare("DELETE FROM push_subscriptions WHERE endpoint = ?").run(b).changes>0}},80499:(a,b,c)=>{c.d(b,{vI:()=>m});var d=c(33873),e=c.n(d);function f(a){try{let b=a.prepare("SELECT MAX(version) as version FROM schema_version").get();return b?.version??0}catch{return 0}}function g(a){let b=c(29021),d=a;for(;d!==e().dirname(d);){let a=e().join(d,".git");if(b.existsSync(a)){let c=b.statSync(a);if(c.isDirectory())return d;if(c.isFile()){let c=b.readFileSync(a,"utf-8").trim().match(/^gitdir:\s*(.+)$/);if(c)return c[1].split("/.git/")[0]}}d=e().dirname(d)}return a}var h=c(25537);let i=`
312
+ id, worktree_id, skill_id, version, install_root, receipt_sha256,
313
+ source_repository, source_ref, source_commit, artifact_sha256,
314
+ effective_risk, operation_id, installed_at, updated_at
315
+ `,j=`
316
+ id TEXT PRIMARY KEY,
317
+ worktree_id TEXT NOT NULL,
318
+ skill_id TEXT NOT NULL,
319
+ version TEXT NOT NULL,
320
+ install_root TEXT NOT NULL,
321
+ receipt_sha256 TEXT NOT NULL,
322
+ source_repository TEXT NOT NULL,
323
+ source_ref TEXT NOT NULL,
324
+ source_commit TEXT NOT NULL,
325
+ artifact_sha256 TEXT NOT NULL,
326
+ effective_risk TEXT NOT NULL,
327
+ operation_id TEXT NOT NULL,
328
+ installed_at INTEGER NOT NULL,
329
+ updated_at INTEGER NOT NULL,
330
+ UNIQUE (worktree_id, skill_id)
331
+ `;function k(a){a.exec(`
332
+ CREATE INDEX IF NOT EXISTS idx_skill_installations_worktree
333
+ ON skill_installations(worktree_id);
334
+ `),a.exec(`
335
+ CREATE INDEX IF NOT EXISTS idx_skill_installations_skill
336
+ ON skill_installations(skill_id, version);
337
+ `)}let l=[{version:1,name:"initial-schema",up:a=>{(0,h.s4)(a)},down:a=>{a.exec("DROP TABLE IF EXISTS session_states;"),a.exec("DROP TABLE IF EXISTS chat_messages;"),a.exec("DROP TABLE IF EXISTS worktrees;")}},{version:2,name:"add-multi-repo-and-memo-support",up:a=>{a.exec(`
338
+ ALTER TABLE worktrees ADD COLUMN repository_path TEXT;
339
+ ALTER TABLE worktrees ADD COLUMN repository_name TEXT;
340
+ ALTER TABLE worktrees ADD COLUMN memo TEXT;
341
+ ALTER TABLE worktrees ADD COLUMN last_user_message TEXT;
342
+ ALTER TABLE worktrees ADD COLUMN last_user_message_at INTEGER;
343
+ `),a.exec(`
344
+ CREATE INDEX IF NOT EXISTS idx_worktrees_repository
345
+ ON worktrees(repository_path);
346
+ `);let b=a.prepare("SELECT id, path FROM worktrees").all(),c=a.prepare(`
347
+ UPDATE worktrees
348
+ SET repository_path = ?,
349
+ repository_name = ?
350
+ WHERE id = ?
351
+ `);for(let a of b){let b=g(a.path),d=e().basename(b);c.run(b,d,a.id)}let d=a.prepare(`
352
+ UPDATE worktrees
353
+ SET last_user_message = ?,
354
+ last_user_message_at = ?
355
+ WHERE id = ?
356
+ `);for(let c of b){let b=a.prepare(`
357
+ SELECT content, timestamp
358
+ FROM chat_messages
359
+ WHERE worktree_id = ? AND role = 'user'
360
+ ORDER BY timestamp DESC
361
+ LIMIT 1
362
+ `).get(c.id);if(b){let a=b.content.substring(0,200);d.run(a,b.timestamp,c.id)}}},down:a=>{a.exec(`
363
+ -- Create backup table
364
+ CREATE TABLE worktrees_backup AS
365
+ SELECT id, name, path, last_message_summary, updated_at
366
+ FROM worktrees;
367
+
368
+ -- Drop original table
369
+ DROP TABLE worktrees;
370
+
371
+ -- Recreate original table
372
+ CREATE TABLE worktrees (
373
+ id TEXT PRIMARY KEY,
374
+ name TEXT NOT NULL,
375
+ path TEXT NOT NULL UNIQUE,
376
+ last_message_summary TEXT,
377
+ updated_at INTEGER
378
+ );
379
+
380
+ -- Restore data
381
+ INSERT INTO worktrees (id, name, path, last_message_summary, updated_at)
382
+ SELECT id, name, path, last_message_summary, updated_at
383
+ FROM worktrees_backup;
384
+
385
+ -- Drop backup table
386
+ DROP TABLE worktrees_backup;
387
+
388
+ -- Drop index
389
+ DROP INDEX IF EXISTS idx_worktrees_repository;
390
+ `)}},{version:3,name:"fix-worktree-repository-paths",up:a=>{let b=a.prepare("SELECT id, path FROM worktrees").all(),c=a.prepare(`
391
+ UPDATE worktrees
392
+ SET repository_path = ?,
393
+ repository_name = ?
394
+ WHERE id = ?
395
+ `);for(let a of b){let b=g(a.path),d=e().basename(b);c.run(b,d,a.id)}},down:()=>{console.log("No rollback needed for repository path fix")}},{version:4,name:"add-favorite-field",up:a=>{a.exec(`
396
+ ALTER TABLE worktrees ADD COLUMN favorite INTEGER DEFAULT 0;
397
+ `),a.exec(`
398
+ CREATE INDEX IF NOT EXISTS idx_worktrees_favorite
399
+ ON worktrees(favorite DESC, updated_at DESC);
400
+ `)},down:a=>{a.exec(`
401
+ DROP INDEX IF EXISTS idx_worktrees_favorite;
402
+ `)}},{version:5,name:"add-status-field",up:a=>{a.exec(`
403
+ ALTER TABLE worktrees ADD COLUMN status TEXT DEFAULT NULL;
404
+ `),a.exec(`
405
+ CREATE INDEX IF NOT EXISTS idx_worktrees_status
406
+ ON worktrees(status);
407
+ `)},down:a=>{a.exec(`
408
+ DROP INDEX IF EXISTS idx_worktrees_status;
409
+ `)}},{version:6,name:"add-link-field",up:a=>{a.exec(`
410
+ ALTER TABLE worktrees ADD COLUMN link TEXT DEFAULT NULL;
411
+ `)},down:()=>{console.log("No rollback needed for link field")}},{version:7,name:"add-cli-tool-id",up:a=>{a.exec(`
412
+ ALTER TABLE worktrees ADD COLUMN cli_tool_id TEXT DEFAULT 'claude';
413
+ `),a.exec(`
414
+ CREATE INDEX IF NOT EXISTS idx_worktrees_cli_tool
415
+ ON worktrees(cli_tool_id);
416
+ `),a.exec(`
417
+ UPDATE worktrees SET cli_tool_id = 'claude' WHERE cli_tool_id IS NULL;
418
+ `)},down:a=>{a.exec(`
419
+ DROP INDEX IF EXISTS idx_worktrees_cli_tool;
420
+ `),console.log("No full rollback for cli_tool_id column (SQLite limitation)")}},{version:8,name:"change-role-claude-to-assistant",up:a=>{a.exec(`
421
+ CREATE TABLE chat_messages_new (
422
+ id TEXT PRIMARY KEY,
423
+ worktree_id TEXT NOT NULL,
424
+ role TEXT NOT NULL CHECK (role IN ('user', 'assistant')),
425
+ content TEXT NOT NULL,
426
+ summary TEXT,
427
+ timestamp INTEGER NOT NULL,
428
+ log_file_name TEXT,
429
+ request_id TEXT,
430
+ message_type TEXT DEFAULT 'normal',
431
+ prompt_data TEXT,
432
+ cli_tool_id TEXT DEFAULT 'claude',
433
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
434
+ );
435
+ `),a.exec(`
436
+ INSERT INTO chat_messages_new
437
+ SELECT
438
+ id,
439
+ worktree_id,
440
+ CASE WHEN role = 'claude' THEN 'assistant' ELSE role END as role,
441
+ content,
442
+ summary,
443
+ timestamp,
444
+ log_file_name,
445
+ request_id,
446
+ message_type,
447
+ prompt_data,
448
+ cli_tool_id
449
+ FROM chat_messages;
450
+ `),a.exec("DROP TABLE chat_messages;"),a.exec("ALTER TABLE chat_messages_new RENAME TO chat_messages;"),a.exec(`
451
+ CREATE INDEX IF NOT EXISTS idx_chat_messages_worktree
452
+ ON chat_messages(worktree_id);
453
+ `),a.exec(`
454
+ CREATE INDEX IF NOT EXISTS idx_chat_messages_timestamp
455
+ ON chat_messages(timestamp);
456
+ `),console.log('Changed role constraint from "claude" to "assistant"'),console.log('Updated existing messages with role="claude" to role="assistant"')},down:a=>{a.exec(`
457
+ CREATE TABLE chat_messages_new (
458
+ id TEXT PRIMARY KEY,
459
+ worktree_id TEXT NOT NULL,
460
+ role TEXT NOT NULL CHECK (role IN ('user', 'claude')),
461
+ content TEXT NOT NULL,
462
+ summary TEXT,
463
+ timestamp INTEGER NOT NULL,
464
+ log_file_name TEXT,
465
+ request_id TEXT,
466
+ message_type TEXT DEFAULT 'normal',
467
+ prompt_data TEXT,
468
+ cli_tool_id TEXT DEFAULT 'claude',
469
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
470
+ );
471
+ `),a.exec(`
472
+ INSERT INTO chat_messages_new
473
+ SELECT
474
+ id,
475
+ worktree_id,
476
+ CASE WHEN role = 'assistant' THEN 'claude' ELSE role END as role,
477
+ content,
478
+ summary,
479
+ timestamp,
480
+ log_file_name,
481
+ request_id,
482
+ message_type,
483
+ prompt_data,
484
+ cli_tool_id
485
+ FROM chat_messages;
486
+ `),a.exec("DROP TABLE chat_messages;"),a.exec("ALTER TABLE chat_messages_new RENAME TO chat_messages;"),a.exec(`
487
+ CREATE INDEX IF NOT EXISTS idx_chat_messages_worktree
488
+ ON chat_messages(worktree_id);
489
+ `),a.exec(`
490
+ CREATE INDEX IF NOT EXISTS idx_chat_messages_timestamp
491
+ ON chat_messages(timestamp);
492
+ `),console.log('Rolled back: Changed role constraint from "assistant" to "claude"')}},{version:9,name:"add-in-progress-message-id-to-session-states",up:a=>{a.exec(`
493
+ ALTER TABLE session_states ADD COLUMN in_progress_message_id TEXT DEFAULT NULL;
494
+ `),console.log("Added in_progress_message_id column to session_states table")},down:()=>{console.log("No full rollback for in_progress_message_id column (SQLite limitation)")}},{version:10,name:"add-worktree-memos-table",up:a=>{a.exec(`
495
+ CREATE TABLE worktree_memos (
496
+ id TEXT PRIMARY KEY,
497
+ worktree_id TEXT NOT NULL,
498
+ title TEXT NOT NULL DEFAULT 'Memo',
499
+ content TEXT NOT NULL DEFAULT '',
500
+ position INTEGER NOT NULL DEFAULT 0,
501
+ created_at INTEGER NOT NULL,
502
+ updated_at INTEGER NOT NULL,
503
+
504
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE,
505
+ UNIQUE(worktree_id, position)
506
+ );
507
+ `),a.exec(`
508
+ CREATE INDEX idx_worktree_memos_worktree
509
+ ON worktree_memos(worktree_id, position);
510
+ `);let{randomUUID:b}=c(55511),d=a.prepare(`
511
+ SELECT id, memo FROM worktrees WHERE memo IS NOT NULL AND memo != ''
512
+ `).all(),e=a.prepare(`
513
+ INSERT INTO worktree_memos (id, worktree_id, title, content, position, created_at, updated_at)
514
+ VALUES (?, ?, 'Memo', ?, 0, ?, ?)
515
+ `),f=Date.now();for(let a of d)e.run(b(),a.id,a.memo,f,f);console.log("Created worktree_memos table"),console.log(`Migrated ${d.length} existing memos to new table`)},down:a=>{a.exec("DROP TABLE IF EXISTS worktree_memos"),console.log("Dropped worktree_memos table")}},{version:11,name:"add-viewed-tracking",up:a=>{a.exec(`
516
+ ALTER TABLE worktrees ADD COLUMN last_viewed_at TEXT;
517
+ `),a.exec(`
518
+ CREATE INDEX IF NOT EXISTS idx_chat_messages_assistant_latest
519
+ ON chat_messages(worktree_id, role, timestamp DESC);
520
+ `),console.log("Added last_viewed_at column to worktrees table"),console.log("Created index for assistant message queries")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_chat_messages_assistant_latest"),console.log("Dropped idx_chat_messages_assistant_latest index")}},{version:12,name:"add-external-apps-table",up:a=>{a.exec(`
521
+ CREATE TABLE IF NOT EXISTS external_apps (
522
+ id TEXT PRIMARY KEY,
523
+
524
+ -- Basic info
525
+ name TEXT NOT NULL UNIQUE,
526
+ display_name TEXT NOT NULL,
527
+ description TEXT,
528
+
529
+ -- Routing config
530
+ path_prefix TEXT NOT NULL UNIQUE,
531
+ target_port INTEGER NOT NULL,
532
+ target_host TEXT DEFAULT 'localhost',
533
+
534
+ -- App type
535
+ app_type TEXT NOT NULL CHECK(app_type IN ('sveltekit', 'streamlit', 'nextjs', 'other')),
536
+
537
+ -- WebSocket config
538
+ websocket_enabled INTEGER DEFAULT 0,
539
+ websocket_path_pattern TEXT,
540
+
541
+ -- Status
542
+ enabled INTEGER DEFAULT 1,
543
+
544
+ -- Metadata
545
+ created_at INTEGER NOT NULL,
546
+ updated_at INTEGER NOT NULL
547
+ );
548
+ `),a.exec(`
549
+ CREATE INDEX idx_external_apps_path_prefix ON external_apps(path_prefix);
550
+ `),a.exec(`
551
+ CREATE INDEX idx_external_apps_enabled ON external_apps(enabled);
552
+ `),console.log("Created external_apps table"),console.log("Created indexes for external_apps")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_external_apps_enabled"),a.exec("DROP INDEX IF EXISTS idx_external_apps_path_prefix"),a.exec("DROP TABLE IF EXISTS external_apps"),console.log("Dropped external_apps table and indexes")}},{version:13,name:"rename-worktree-memo-to-description",up:a=>{a.exec(`
553
+ ALTER TABLE worktrees RENAME COLUMN memo TO description;
554
+ `),console.log("Renamed worktrees.memo column to description")},down:a=>{a.exec(`
555
+ ALTER TABLE worktrees RENAME COLUMN description TO memo;
556
+ `),console.log("Rolled back: Renamed worktrees.description column back to memo")}},{version:14,name:"add-repositories-and-clone-jobs-tables",up:a=>{a.exec(`
557
+ CREATE TABLE IF NOT EXISTS repositories (
558
+ id TEXT PRIMARY KEY,
559
+ name TEXT NOT NULL,
560
+ path TEXT NOT NULL UNIQUE,
561
+ enabled INTEGER NOT NULL DEFAULT 1,
562
+ clone_url TEXT,
563
+ normalized_clone_url TEXT,
564
+ clone_source TEXT CHECK(clone_source IN ('local', 'https', 'ssh')) DEFAULT 'local',
565
+ is_env_managed INTEGER NOT NULL DEFAULT 0,
566
+ created_at INTEGER NOT NULL,
567
+ updated_at INTEGER NOT NULL
568
+ );
569
+ `),a.exec(`
570
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_repositories_normalized_clone_url
571
+ ON repositories(normalized_clone_url)
572
+ WHERE normalized_clone_url IS NOT NULL;
573
+ `),a.exec(`
574
+ CREATE INDEX IF NOT EXISTS idx_repositories_path
575
+ ON repositories(path);
576
+ `),a.exec(`
577
+ CREATE TABLE IF NOT EXISTS clone_jobs (
578
+ id TEXT PRIMARY KEY,
579
+ clone_url TEXT NOT NULL,
580
+ normalized_clone_url TEXT NOT NULL,
581
+ target_path TEXT NOT NULL,
582
+ repository_id TEXT,
583
+ status TEXT NOT NULL CHECK(status IN ('pending', 'running', 'completed', 'failed', 'cancelled')) DEFAULT 'pending',
584
+ pid INTEGER,
585
+ progress INTEGER NOT NULL DEFAULT 0,
586
+ error_category TEXT,
587
+ error_code TEXT,
588
+ error_message TEXT,
589
+ started_at INTEGER,
590
+ completed_at INTEGER,
591
+ created_at INTEGER NOT NULL,
592
+
593
+ FOREIGN KEY (repository_id) REFERENCES repositories(id) ON DELETE SET NULL
594
+ );
595
+ `),a.exec(`
596
+ CREATE INDEX IF NOT EXISTS idx_clone_jobs_status
597
+ ON clone_jobs(status);
598
+ `),a.exec(`
599
+ CREATE INDEX IF NOT EXISTS idx_clone_jobs_normalized_clone_url
600
+ ON clone_jobs(normalized_clone_url);
601
+ `),console.log("Created repositories table"),console.log("Created clone_jobs table"),console.log("Created indexes for repositories and clone_jobs")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_clone_jobs_normalized_clone_url"),a.exec("DROP INDEX IF EXISTS idx_clone_jobs_status"),a.exec("DROP TABLE IF EXISTS clone_jobs"),a.exec("DROP INDEX IF EXISTS idx_repositories_path"),a.exec("DROP INDEX IF EXISTS idx_repositories_normalized_clone_url"),a.exec("DROP TABLE IF EXISTS repositories"),console.log("Dropped repositories and clone_jobs tables")}},{version:15,name:"add-initial-branch-column",up:a=>{a.exec(`
602
+ ALTER TABLE worktrees ADD COLUMN initial_branch TEXT;
603
+ `),console.log("Added initial_branch column to worktrees table")},down:a=>{a.exec(`
604
+ -- 1. Create backup table without initial_branch
605
+ CREATE TABLE worktrees_backup AS
606
+ SELECT id, name, path, repository_path, repository_name, description,
607
+ last_user_message, last_user_message_at, last_message_summary,
608
+ favorite, status, link, cli_tool_id, updated_at, last_viewed_at
609
+ FROM worktrees;
610
+
611
+ -- 2. Drop original table
612
+ DROP TABLE worktrees;
613
+
614
+ -- 3. Recreate table without initial_branch
615
+ CREATE TABLE worktrees (
616
+ id TEXT PRIMARY KEY,
617
+ name TEXT NOT NULL,
618
+ path TEXT NOT NULL UNIQUE,
619
+ repository_path TEXT,
620
+ repository_name TEXT,
621
+ description TEXT,
622
+ last_user_message TEXT,
623
+ last_user_message_at INTEGER,
624
+ last_message_summary TEXT,
625
+ favorite INTEGER DEFAULT 0,
626
+ status TEXT DEFAULT NULL,
627
+ link TEXT DEFAULT NULL,
628
+ cli_tool_id TEXT DEFAULT 'claude',
629
+ updated_at INTEGER,
630
+ last_viewed_at TEXT
631
+ );
632
+
633
+ -- 4. Restore data
634
+ INSERT INTO worktrees (id, name, path, repository_path, repository_name,
635
+ description, last_user_message, last_user_message_at, last_message_summary,
636
+ favorite, status, link, cli_tool_id, updated_at, last_viewed_at)
637
+ SELECT id, name, path, repository_path, repository_name,
638
+ description, last_user_message, last_user_message_at, last_message_summary,
639
+ favorite, status, link, cli_tool_id, updated_at, last_viewed_at
640
+ FROM worktrees_backup;
641
+
642
+ -- 5. Drop backup
643
+ DROP TABLE worktrees_backup;
644
+
645
+ -- 6. Recreate indexes
646
+ CREATE INDEX IF NOT EXISTS idx_worktrees_updated_at
647
+ ON worktrees(updated_at DESC);
648
+
649
+ CREATE INDEX IF NOT EXISTS idx_worktrees_repository
650
+ ON worktrees(repository_path);
651
+
652
+ CREATE INDEX IF NOT EXISTS idx_worktrees_favorite
653
+ ON worktrees(favorite DESC, updated_at DESC);
654
+
655
+ CREATE INDEX IF NOT EXISTS idx_worktrees_status
656
+ ON worktrees(status);
657
+
658
+ CREATE INDEX IF NOT EXISTS idx_worktrees_cli_tool
659
+ ON worktrees(cli_tool_id);
660
+ `),console.log("Removed initial_branch column from worktrees table")}},{version:16,name:"add-issue-no-to-external-apps",up:a=>{a.exec(`
661
+ ALTER TABLE external_apps ADD COLUMN issue_no INTEGER;
662
+ `),a.exec(`
663
+ CREATE INDEX IF NOT EXISTS idx_external_apps_issue_no ON external_apps(issue_no);
664
+ `),console.log("Added issue_no column to external_apps table"),console.log("Created index idx_external_apps_issue_no")},down:a=>{a.exec(`
665
+ -- 1. Create backup table without issue_no
666
+ CREATE TABLE external_apps_backup AS
667
+ SELECT id, name, display_name, description, path_prefix, target_port,
668
+ target_host, app_type, websocket_enabled, websocket_path_pattern,
669
+ enabled, created_at, updated_at
670
+ FROM external_apps;
671
+
672
+ -- 2. Drop original table (this also drops indexes)
673
+ DROP TABLE external_apps;
674
+
675
+ -- 3. Recreate table without issue_no
676
+ CREATE TABLE external_apps (
677
+ id TEXT PRIMARY KEY,
678
+ name TEXT NOT NULL UNIQUE,
679
+ display_name TEXT NOT NULL,
680
+ description TEXT,
681
+ path_prefix TEXT NOT NULL UNIQUE,
682
+ target_port INTEGER NOT NULL,
683
+ target_host TEXT DEFAULT 'localhost',
684
+ app_type TEXT NOT NULL CHECK(app_type IN ('sveltekit', 'streamlit', 'nextjs', 'other')),
685
+ websocket_enabled INTEGER DEFAULT 0,
686
+ websocket_path_pattern TEXT,
687
+ enabled INTEGER DEFAULT 1,
688
+ created_at INTEGER NOT NULL,
689
+ updated_at INTEGER NOT NULL
690
+ );
691
+
692
+ -- 4. Restore data
693
+ INSERT INTO external_apps (id, name, display_name, description, path_prefix,
694
+ target_port, target_host, app_type, websocket_enabled, websocket_path_pattern,
695
+ enabled, created_at, updated_at)
696
+ SELECT id, name, display_name, description, path_prefix,
697
+ target_port, target_host, app_type, websocket_enabled, websocket_path_pattern,
698
+ enabled, created_at, updated_at
699
+ FROM external_apps_backup;
700
+
701
+ -- 5. Drop backup
702
+ DROP TABLE external_apps_backup;
703
+
704
+ -- 6. Recreate original indexes
705
+ CREATE INDEX idx_external_apps_path_prefix ON external_apps(path_prefix);
706
+ CREATE INDEX idx_external_apps_enabled ON external_apps(enabled);
707
+ `),console.log("Removed issue_no column from external_apps table")}},{version:17,name:"add-scheduled-executions-and-execution-logs",up:a=>{a.exec(`
708
+ DELETE FROM chat_messages WHERE worktree_id NOT IN (SELECT id FROM worktrees);
709
+ `),a.exec(`
710
+ DELETE FROM session_states WHERE worktree_id NOT IN (SELECT id FROM worktrees);
711
+ `),a.exec(`
712
+ DELETE FROM worktree_memos WHERE worktree_id NOT IN (SELECT id FROM worktrees);
713
+ `),a.exec(`
714
+ UPDATE clone_jobs SET repository_id = NULL
715
+ WHERE repository_id IS NOT NULL AND repository_id NOT IN (SELECT id FROM repositories);
716
+ `),a.exec(`
717
+ CREATE TABLE scheduled_executions (
718
+ id TEXT PRIMARY KEY,
719
+ worktree_id TEXT NOT NULL,
720
+ cli_tool_id TEXT DEFAULT 'claude',
721
+ name TEXT NOT NULL,
722
+ message TEXT NOT NULL,
723
+ cron_expression TEXT,
724
+ enabled INTEGER DEFAULT 1,
725
+ last_executed_at INTEGER,
726
+ next_execute_at INTEGER,
727
+ created_at INTEGER NOT NULL,
728
+ updated_at INTEGER NOT NULL,
729
+ UNIQUE(worktree_id, name),
730
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
731
+ );
732
+ `),a.exec(`
733
+ CREATE INDEX idx_scheduled_executions_worktree
734
+ ON scheduled_executions(worktree_id);
735
+ `),a.exec(`
736
+ CREATE INDEX idx_scheduled_executions_enabled
737
+ ON scheduled_executions(enabled);
738
+ `),a.exec(`
739
+ CREATE TABLE execution_logs (
740
+ id TEXT PRIMARY KEY,
741
+ schedule_id TEXT NOT NULL,
742
+ worktree_id TEXT NOT NULL,
743
+ message TEXT NOT NULL,
744
+ result TEXT,
745
+ exit_code INTEGER,
746
+ status TEXT DEFAULT 'running' CHECK(status IN ('running', 'completed', 'failed', 'timeout', 'cancelled')),
747
+ started_at INTEGER NOT NULL,
748
+ completed_at INTEGER,
749
+ created_at INTEGER NOT NULL,
750
+ FOREIGN KEY (schedule_id) REFERENCES scheduled_executions(id) ON DELETE CASCADE,
751
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
752
+ );
753
+ `),a.exec(`
754
+ CREATE INDEX idx_execution_logs_schedule
755
+ ON execution_logs(schedule_id);
756
+ `),a.exec(`
757
+ CREATE INDEX idx_execution_logs_worktree
758
+ ON execution_logs(worktree_id);
759
+ `),a.exec(`
760
+ CREATE INDEX idx_execution_logs_status
761
+ ON execution_logs(status);
762
+ `),console.log("Cleaned up orphan records"),console.log("Created scheduled_executions table"),console.log("Created execution_logs table"),console.log("Created indexes for schedule tables")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_execution_logs_status"),a.exec("DROP INDEX IF EXISTS idx_execution_logs_worktree"),a.exec("DROP INDEX IF EXISTS idx_execution_logs_schedule"),a.exec("DROP TABLE IF EXISTS execution_logs"),a.exec("DROP INDEX IF EXISTS idx_scheduled_executions_enabled"),a.exec("DROP INDEX IF EXISTS idx_scheduled_executions_worktree"),a.exec("DROP TABLE IF EXISTS scheduled_executions"),console.log("Dropped scheduled_executions and execution_logs tables")}},{version:18,name:"add-selected-agents-column",up:a=>{a.exec(`
763
+ ALTER TABLE worktrees ADD COLUMN selected_agents TEXT;
764
+ `),a.exec(`
765
+ UPDATE worktrees SET selected_agents =
766
+ CASE
767
+ WHEN cli_tool_id NOT IN ('claude', 'codex')
768
+ THEN json_array(cli_tool_id, 'claude')
769
+ ELSE '["claude","codex"]'
770
+ END;
771
+ `),console.log("Added selected_agents column to worktrees table"),console.log("Initialized selected_agents based on cli_tool_id")},down:()=>{console.log("No rollback for selected_agents column (SQLite limitation)")}},{version:19,name:"add-vibe-local-model-column",up:a=>{a.exec(`
772
+ ALTER TABLE worktrees ADD COLUMN vibe_local_model TEXT DEFAULT NULL;
773
+ `),console.log("Added vibe_local_model column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_model column (SQLite limitation)")}},{version:20,name:"add-vibe-local-context-window-column",up:a=>{a.exec(`
774
+ ALTER TABLE worktrees ADD COLUMN vibe_local_context_window INTEGER DEFAULT NULL;
775
+ `),console.log("Added vibe_local_context_window column to worktrees table")},down:()=>{console.log("No rollback for vibe_local_context_window column (SQLite limitation)")}},{version:21,name:"add-scheduled-executions-worktree-enabled-index",up:a=>{a.exec(`
776
+ CREATE INDEX IF NOT EXISTS idx_scheduled_executions_worktree_enabled
777
+ ON scheduled_executions(worktree_id, enabled);
778
+ `),console.log("Created composite index idx_scheduled_executions_worktree_enabled")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_scheduled_executions_worktree_enabled"),console.log("Dropped idx_scheduled_executions_worktree_enabled index")}},{version:22,name:"add-archived-column-to-chat-messages",up:a=>{a.exec(`
779
+ ALTER TABLE chat_messages ADD COLUMN archived INTEGER DEFAULT 0;
780
+ `),a.exec(`
781
+ UPDATE chat_messages SET archived = 0 WHERE archived IS NULL;
782
+ `),a.exec(`
783
+ CREATE INDEX IF NOT EXISTS idx_messages_archived
784
+ ON chat_messages(worktree_id, archived, timestamp DESC);
785
+ `),console.log("Added archived column to chat_messages table"),console.log("Created composite index idx_messages_archived")},down:()=>{console.log("No rollback for archived column (SQLite limitation)")}},{version:23,name:"add-timer-messages-table",up:a=>{a.exec(`
786
+ CREATE TABLE timer_messages (
787
+ id TEXT PRIMARY KEY,
788
+ worktree_id TEXT NOT NULL,
789
+ cli_tool_id TEXT NOT NULL,
790
+ message TEXT NOT NULL,
791
+ delay_ms INTEGER NOT NULL,
792
+ scheduled_send_time INTEGER NOT NULL,
793
+ status TEXT NOT NULL DEFAULT 'pending',
794
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
795
+ sent_at INTEGER,
796
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
797
+ );
798
+
799
+ CREATE INDEX idx_timer_messages_worktree_status
800
+ ON timer_messages(worktree_id, status);
801
+
802
+ CREATE INDEX idx_timer_messages_status_scheduled
803
+ ON timer_messages(status, scheduled_send_time);
804
+ `),console.log("Created timer_messages table with indexes")},down:a=>{a.exec(`
805
+ DROP INDEX IF EXISTS idx_timer_messages_status_scheduled;
806
+ DROP INDEX IF EXISTS idx_timer_messages_worktree_status;
807
+ DROP TABLE IF EXISTS timer_messages;
808
+ `)}},{version:24,name:"add-daily-reports-table",up:a=>{a.exec(`
809
+ CREATE TABLE daily_reports (
810
+ date TEXT PRIMARY KEY,
811
+ content TEXT NOT NULL,
812
+ generated_by_tool TEXT NOT NULL,
813
+ model TEXT,
814
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
815
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
816
+ );
817
+ `),console.log("Created daily_reports table")},down:a=>{a.exec("DROP TABLE IF EXISTS daily_reports"),console.log("Dropped daily_reports table")}},{version:25,name:"add-report-templates-table",up:a=>{a.exec(`
818
+ CREATE TABLE report_templates (
819
+ id TEXT PRIMARY KEY,
820
+ name TEXT NOT NULL,
821
+ content TEXT NOT NULL,
822
+ sort_order INTEGER NOT NULL DEFAULT 0,
823
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
824
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
825
+ );
826
+ `),console.log("Created report_templates table")},down:a=>{a.exec("DROP TABLE IF EXISTS report_templates"),console.log("Dropped report_templates table")}},{version:26,name:"add-repository-display-name",up:a=>{a.exec("ALTER TABLE repositories ADD COLUMN display_name TEXT;"),console.log("Added display_name column to repositories table")},down:a=>{a.exec("ALTER TABLE repositories DROP COLUMN display_name;"),console.log("Removed display_name column from repositories table")}},{version:27,name:"add-app-settings-table",up:a=>{a.exec(`
827
+ CREATE TABLE IF NOT EXISTS app_settings (
828
+ key TEXT PRIMARY KEY,
829
+ value TEXT NOT NULL,
830
+ created_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000),
831
+ updated_at INTEGER NOT NULL DEFAULT (unixepoch() * 1000)
832
+ );
833
+ `)},down:a=>{a.exec("DROP TABLE IF EXISTS app_settings")}},{version:28,name:"add-assistant-conversation-tables",up:a=>{a.exec(`
834
+ CREATE TABLE IF NOT EXISTS assistant_conversations (
835
+ id TEXT PRIMARY KEY,
836
+ repository_id TEXT NOT NULL,
837
+ cli_tool_id TEXT NOT NULL,
838
+ working_directory TEXT NOT NULL,
839
+ session_name TEXT,
840
+ status TEXT NOT NULL DEFAULT 'idle',
841
+ last_started_at INTEGER,
842
+ last_stopped_at INTEGER,
843
+ context_sent_at INTEGER,
844
+ created_at INTEGER NOT NULL,
845
+ updated_at INTEGER NOT NULL,
846
+ archived INTEGER NOT NULL DEFAULT 0,
847
+ UNIQUE(repository_id, cli_tool_id),
848
+ FOREIGN KEY (repository_id) REFERENCES repositories(id) ON DELETE CASCADE
849
+ );
850
+
851
+ CREATE INDEX IF NOT EXISTS idx_assistant_conversations_repository_tool
852
+ ON assistant_conversations(repository_id, cli_tool_id);
853
+
854
+ CREATE INDEX IF NOT EXISTS idx_assistant_conversations_status
855
+ ON assistant_conversations(status, archived, updated_at DESC);
856
+
857
+ CREATE TABLE IF NOT EXISTS assistant_messages (
858
+ id TEXT PRIMARY KEY,
859
+ conversation_id TEXT NOT NULL,
860
+ role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system')),
861
+ content TEXT NOT NULL,
862
+ summary TEXT,
863
+ timestamp INTEGER NOT NULL,
864
+ message_type TEXT NOT NULL DEFAULT 'normal',
865
+ delivery_status TEXT CHECK(delivery_status IN ('pending', 'sent', 'failed')),
866
+ archived INTEGER NOT NULL DEFAULT 0,
867
+ FOREIGN KEY (conversation_id) REFERENCES assistant_conversations(id) ON DELETE CASCADE
868
+ );
869
+
870
+ CREATE INDEX IF NOT EXISTS idx_assistant_messages_conversation_time
871
+ ON assistant_messages(conversation_id, timestamp DESC);
872
+
873
+ CREATE INDEX IF NOT EXISTS idx_assistant_messages_delivery
874
+ ON assistant_messages(conversation_id, delivery_status, timestamp DESC);
875
+
876
+ CREATE TABLE IF NOT EXISTS assistant_session_states (
877
+ conversation_id TEXT PRIMARY KEY,
878
+ last_captured_line INTEGER NOT NULL DEFAULT 0,
879
+ in_progress_message_id TEXT,
880
+ FOREIGN KEY (conversation_id) REFERENCES assistant_conversations(id) ON DELETE CASCADE
881
+ );
882
+ `)},down:a=>{a.exec(`
883
+ DROP TABLE IF EXISTS assistant_session_states;
884
+ DROP TABLE IF EXISTS assistant_messages;
885
+ DROP TABLE IF EXISTS assistant_conversations;
886
+ `)}},{version:29,name:"add-assistant-non-interactive-executions",up:a=>{a.exec(`
887
+ ALTER TABLE assistant_conversations
888
+ ADD COLUMN execution_mode TEXT NOT NULL DEFAULT 'interactive';
889
+
890
+ ALTER TABLE assistant_conversations
891
+ ADD COLUMN resume_session_id TEXT;
892
+
893
+ ALTER TABLE assistant_conversations
894
+ ADD COLUMN last_execution_id TEXT;
895
+
896
+ UPDATE assistant_conversations
897
+ SET status = CASE
898
+ WHEN status = 'idle' THEN 'stopped'
899
+ ELSE status
900
+ END;
901
+
902
+ UPDATE assistant_conversations
903
+ SET execution_mode = CASE
904
+ WHEN cli_tool_id IN ('claude', 'codex') THEN 'non_interactive'
905
+ ELSE 'interactive'
906
+ END;
907
+
908
+ CREATE TABLE IF NOT EXISTS assistant_executions (
909
+ id TEXT PRIMARY KEY,
910
+ conversation_id TEXT NOT NULL,
911
+ cli_tool_id TEXT NOT NULL,
912
+ status TEXT NOT NULL,
913
+ pid INTEGER,
914
+ command_line TEXT NOT NULL,
915
+ prompt_text TEXT NOT NULL,
916
+ stdout_text TEXT,
917
+ stderr_text TEXT,
918
+ final_message_text TEXT,
919
+ exit_code INTEGER,
920
+ resume_session_id_before TEXT,
921
+ resume_session_id_after TEXT,
922
+ started_at INTEGER,
923
+ finished_at INTEGER,
924
+ created_at INTEGER NOT NULL,
925
+ updated_at INTEGER NOT NULL,
926
+ FOREIGN KEY (conversation_id) REFERENCES assistant_conversations(id) ON DELETE CASCADE
927
+ );
928
+
929
+ CREATE INDEX IF NOT EXISTS idx_assistant_executions_conversation
930
+ ON assistant_executions(conversation_id, created_at DESC);
931
+
932
+ CREATE INDEX IF NOT EXISTS idx_assistant_executions_status
933
+ ON assistant_executions(status, updated_at DESC);
934
+ `)},down:a=>{a.exec(`
935
+ DROP TABLE IF EXISTS assistant_executions;
936
+ `)}},{version:30,name:"add-assistant-context-snapshot",up:a=>{a.exec(`
937
+ ALTER TABLE assistant_conversations
938
+ ADD COLUMN context_snapshot TEXT;
939
+ `)},down:a=>{a.exec(`
940
+ ALTER TABLE assistant_conversations
941
+ DROP COLUMN context_snapshot;
942
+ `)}},{version:31,name:"add-repository-visible",up:a=>{a.exec("ALTER TABLE repositories ADD COLUMN visible INTEGER NOT NULL DEFAULT 1;")},down:a=>{a.exec("ALTER TABLE repositories DROP COLUMN visible;")}},{version:32,name:"add-messages-role-composite-index",up:a=>{a.exec(`
943
+ CREATE INDEX IF NOT EXISTS idx_messages_worktree_role_archived_time
944
+ ON chat_messages(worktree_id, role, archived, timestamp DESC);
945
+ `),a.exec("DROP INDEX IF EXISTS idx_messages_archived;")},down:a=>{a.exec("DROP INDEX IF EXISTS idx_messages_worktree_role_archived_time;"),a.exec(`
946
+ CREATE INDEX IF NOT EXISTS idx_messages_archived
947
+ ON chat_messages(worktree_id, archived, timestamp DESC);
948
+ `)}},{version:33,name:"add-agent-instances",up:a=>{a.exec(`
949
+ CREATE TABLE session_states_new (
950
+ worktree_id TEXT NOT NULL,
951
+ cli_tool_id TEXT NOT NULL DEFAULT 'claude',
952
+ instance_id TEXT NOT NULL DEFAULT 'claude',
953
+ last_captured_line INTEGER DEFAULT 0,
954
+ in_progress_message_id TEXT DEFAULT NULL,
955
+
956
+ PRIMARY KEY (worktree_id, instance_id),
957
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
958
+ );
959
+ `),a.exec(`
960
+ INSERT INTO session_states_new
961
+ (worktree_id, cli_tool_id, instance_id, last_captured_line, in_progress_message_id)
962
+ SELECT
963
+ worktree_id,
964
+ COALESCE(cli_tool_id, 'claude'),
965
+ COALESCE(cli_tool_id, 'claude'),
966
+ last_captured_line,
967
+ in_progress_message_id
968
+ FROM session_states
969
+ WHERE worktree_id IN (SELECT id FROM worktrees);
970
+ `),a.exec("DROP TABLE session_states;"),a.exec("ALTER TABLE session_states_new RENAME TO session_states;"),a.exec(`
971
+ ALTER TABLE chat_messages ADD COLUMN instance_id TEXT DEFAULT NULL;
972
+ `),a.exec(`
973
+ UPDATE chat_messages
974
+ SET instance_id = COALESCE(cli_tool_id, 'claude')
975
+ WHERE instance_id IS NULL;
976
+ `),a.exec(`
977
+ CREATE INDEX IF NOT EXISTS idx_messages_instance
978
+ ON chat_messages(worktree_id, instance_id, timestamp DESC);
979
+ `),a.exec(`
980
+ CREATE TABLE agent_instances (
981
+ worktree_id TEXT NOT NULL,
982
+ instance_id TEXT NOT NULL,
983
+ cli_tool_id TEXT NOT NULL,
984
+ alias TEXT NOT NULL DEFAULT '',
985
+ sort_order INTEGER NOT NULL DEFAULT 0,
986
+ created_at INTEGER NOT NULL,
987
+
988
+ PRIMARY KEY (worktree_id, instance_id),
989
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
990
+ );
991
+ `),a.exec(`
992
+ CREATE INDEX idx_agent_instances_worktree
993
+ ON agent_instances(worktree_id, sort_order);
994
+ `);let b=a.prepare(`
995
+ SELECT id, selected_agents, cli_tool_id FROM worktrees
996
+ `).all(),c=a.prepare(`
997
+ INSERT OR IGNORE INTO agent_instances
998
+ (worktree_id, instance_id, cli_tool_id, alias, sort_order, created_at)
999
+ VALUES (?, ?, ?, '', ?, ?)
1000
+ `),d=Date.now(),e=0;for(let a of b){let b=function(a){if(!a)return[];try{let b=JSON.parse(a);if(!Array.isArray(b))return[];let c=new Set,d=[];for(let a of b)"string"==typeof a&&a.length>0&&!c.has(a)&&(c.add(a),d.push(a));return d}catch{return[]}}(a.selected_agents);0===b.length&&(b=[a.cli_tool_id||"claude"]),b.forEach((b,f)=>{c.run(a.id,b,b,f,d),e+=1})}console.log("Rebuilt session_states with (worktree_id, instance_id) primary key"),console.log("Added instance_id column + idx_messages_instance to chat_messages"),console.log(`Created agent_instances table; backfilled ${e} primary instance(s)`)},down:a=>{a.exec("DROP INDEX IF EXISTS idx_agent_instances_worktree;"),a.exec("DROP TABLE IF EXISTS agent_instances;"),a.exec("DROP INDEX IF EXISTS idx_messages_instance;"),a.exec(`
1001
+ CREATE TABLE session_states_old (
1002
+ worktree_id TEXT NOT NULL,
1003
+ cli_tool_id TEXT NOT NULL DEFAULT 'claude',
1004
+ last_captured_line INTEGER DEFAULT 0,
1005
+ in_progress_message_id TEXT DEFAULT NULL,
1006
+
1007
+ PRIMARY KEY (worktree_id, cli_tool_id),
1008
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
1009
+ );
1010
+ `),a.exec(`
1011
+ INSERT OR IGNORE INTO session_states_old
1012
+ (worktree_id, cli_tool_id, last_captured_line, in_progress_message_id)
1013
+ SELECT worktree_id, cli_tool_id, last_captured_line, in_progress_message_id
1014
+ FROM session_states
1015
+ WHERE instance_id = cli_tool_id;
1016
+ `),a.exec("DROP TABLE session_states;"),a.exec("ALTER TABLE session_states_old RENAME TO session_states;"),console.log("Rolled back agent_instances migration (v33)")}},{version:34,name:"add-repository-todos",up:a=>{a.exec(`
1017
+ CREATE TABLE IF NOT EXISTS repository_todos (
1018
+ id TEXT PRIMARY KEY,
1019
+ repository_id TEXT NOT NULL,
1020
+ content TEXT NOT NULL,
1021
+ done INTEGER NOT NULL DEFAULT 0,
1022
+ position INTEGER NOT NULL DEFAULT 0,
1023
+ created_at INTEGER NOT NULL,
1024
+ updated_at INTEGER NOT NULL,
1025
+ FOREIGN KEY (repository_id) REFERENCES repositories(id) ON DELETE CASCADE
1026
+ );
1027
+ `),a.exec(`
1028
+ CREATE INDEX IF NOT EXISTS idx_repository_todos_repo
1029
+ ON repository_todos(repository_id, position);
1030
+ `)},down:a=>{a.exec("DROP TABLE IF EXISTS repository_todos;")}},{version:35,name:"add-instance-id-to-timer-messages",up:a=>{a.exec(`
1031
+ ALTER TABLE timer_messages ADD COLUMN instance_id TEXT;
1032
+ `),a.exec(`
1033
+ UPDATE timer_messages SET instance_id = cli_tool_id WHERE instance_id IS NULL;
1034
+ `),console.log("Added instance_id column to timer_messages table")},down:()=>{console.log("No rollback for instance_id column (SQLite limitation)")}},{version:36,name:"add-branch-to-worktrees",up:a=>{a.exec(`
1035
+ ALTER TABLE worktrees ADD COLUMN branch TEXT;
1036
+ `),console.log("Added branch column to worktrees table")},down:()=>{console.log("No rollback for branch column (SQLite limitation)")}},{version:37,name:"add-worktree-todos",up:a=>{a.exec(`
1037
+ CREATE TABLE IF NOT EXISTS worktree_todos (
1038
+ id TEXT PRIMARY KEY,
1039
+ worktree_id TEXT NOT NULL,
1040
+ content TEXT NOT NULL,
1041
+ done INTEGER NOT NULL DEFAULT 0,
1042
+ position INTEGER NOT NULL DEFAULT 0,
1043
+ created_at INTEGER NOT NULL,
1044
+ updated_at INTEGER NOT NULL,
1045
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
1046
+ );
1047
+ `),a.exec(`
1048
+ CREATE INDEX IF NOT EXISTS idx_worktree_todos_wt
1049
+ ON worktree_todos(worktree_id, position);
1050
+ `)},down:a=>{a.exec("DROP TABLE IF EXISTS worktree_todos;")}},{version:38,name:"add-status-to-worktree-todos",up:a=>{a.exec(`
1051
+ ALTER TABLE worktree_todos
1052
+ ADD COLUMN status TEXT NOT NULL DEFAULT 'todo';
1053
+ `),a.exec(`
1054
+ UPDATE worktree_todos SET status = 'done' WHERE done = 1;
1055
+ `)},down:()=>{}},{version:39,name:"add-detail-to-worktree-todos",up:a=>{a.exec(`
1056
+ ALTER TABLE worktree_todos
1057
+ ADD COLUMN detail TEXT NOT NULL DEFAULT '';
1058
+ `)},down:()=>{}},{version:40,name:"add-error-to-timer-messages",up:a=>{a.exec(`
1059
+ ALTER TABLE timer_messages ADD COLUMN error TEXT;
1060
+ `),console.log("Added error column to timer_messages table")},down:()=>{console.log("No rollback for error column (SQLite limitation)")}},{version:41,name:"add-push-subscriptions",up:a=>{a.exec(`
1061
+ CREATE TABLE IF NOT EXISTS push_subscriptions (
1062
+ id TEXT PRIMARY KEY,
1063
+ endpoint TEXT NOT NULL UNIQUE,
1064
+ p256dh TEXT NOT NULL,
1065
+ auth TEXT NOT NULL,
1066
+ device_label TEXT,
1067
+ enabled_prompt INTEGER NOT NULL DEFAULT 1,
1068
+ enabled_completion INTEGER NOT NULL DEFAULT 1,
1069
+ created_at INTEGER NOT NULL,
1070
+ updated_at INTEGER NOT NULL
1071
+ );
1072
+ `),a.exec(`
1073
+ CREATE INDEX IF NOT EXISTS idx_push_subscriptions_endpoint
1074
+ ON push_subscriptions(endpoint);
1075
+ `)},down:a=>{a.exec("DROP TABLE IF EXISTS push_subscriptions;")}},{version:42,name:"add-locale-to-push-subscriptions",up:a=>{a.exec(`
1076
+ ALTER TABLE push_subscriptions ADD COLUMN locale TEXT;
1077
+ `)},down:a=>{a.exec(`
1078
+ ALTER TABLE push_subscriptions DROP COLUMN locale;
1079
+ `)}},{version:43,name:"remove-cm-root-dir-ghost-repository",up:a=>{let b=function(){let a=process.env.CM_ROOT_DIR??process.env.MCBD_ROOT_DIR;return a&&a.trim()?e().resolve(a.trim()):null}();return b?(function(){let a=process.env.WORKTREE_REPOS;return a&&a.trim()?a.split(",").map(a=>a.trim()).filter(a=>a.length>0).map(a=>e().resolve(a)):[]})().includes(b)?void console.log(`Migration 43: ${b} is a WORKTREE_REPOS entry; keeping its repository row`):void(a.prepare(`DELETE FROM repositories
1080
+ WHERE path = ?
1081
+ AND is_env_managed = 1
1082
+ AND NOT EXISTS (
1083
+ SELECT 1 FROM worktrees WHERE worktrees.repository_path = ?
1084
+ )`).run(b,b).changes>0?console.log(`Migration 43: removed CM_ROOT_DIR ghost repository row (${b})`):console.log(`Migration 43: no ghost repository row at ${b}`)):void console.log("Migration 43: CM_ROOT_DIR is not set; no ghost row to remove")},down:()=>{console.log("No rollback for the CM_ROOT_DIR ghost row removal")}},{version:44,name:"add-skill-operations",up:a=>{a.exec(`
1085
+ CREATE TABLE IF NOT EXISTS skill_operations (
1086
+ id TEXT PRIMARY KEY,
1087
+ operation_id TEXT NOT NULL,
1088
+ idempotency_key TEXT NOT NULL,
1089
+ binding_hash TEXT NOT NULL,
1090
+ operation TEXT NOT NULL,
1091
+ state TEXT NOT NULL,
1092
+ result TEXT NOT NULL,
1093
+ actor_type TEXT NOT NULL,
1094
+ actor_id TEXT,
1095
+ worktree_id TEXT NOT NULL,
1096
+ skill_id TEXT NOT NULL,
1097
+ skill_version TEXT,
1098
+ source_origin TEXT,
1099
+ source_repository TEXT,
1100
+ source_ref TEXT,
1101
+ source_commit TEXT,
1102
+ artifact_sha256 TEXT,
1103
+ error_code TEXT,
1104
+ error_message TEXT,
1105
+ recorded_at INTEGER NOT NULL
1106
+ );
1107
+ `),a.exec(`
1108
+ CREATE INDEX IF NOT EXISTS idx_skill_operations_operation_id
1109
+ ON skill_operations(operation_id);
1110
+ `),a.exec(`
1111
+ CREATE INDEX IF NOT EXISTS idx_skill_operations_idempotency_key
1112
+ ON skill_operations(idempotency_key);
1113
+ `),a.exec(`
1114
+ CREATE INDEX IF NOT EXISTS idx_skill_operations_target
1115
+ ON skill_operations(worktree_id, skill_id, recorded_at);
1116
+ `),a.exec(`
1117
+ CREATE TRIGGER IF NOT EXISTS skill_operations_no_update
1118
+ BEFORE UPDATE ON skill_operations
1119
+ BEGIN
1120
+ SELECT RAISE(ABORT, 'skill_operations is append-only');
1121
+ END;
1122
+ `),a.exec(`
1123
+ CREATE TRIGGER IF NOT EXISTS skill_operations_no_delete
1124
+ BEFORE DELETE ON skill_operations
1125
+ BEGIN
1126
+ SELECT RAISE(ABORT, 'skill_operations is append-only');
1127
+ END;
1128
+ `)},down:a=>{a.exec("DROP TRIGGER IF EXISTS skill_operations_no_delete;"),a.exec("DROP TRIGGER IF EXISTS skill_operations_no_update;"),a.exec("DROP TABLE IF EXISTS skill_operations;")}},{version:45,name:"add-skill-installations",up:a=>{a.exec(`
1129
+ CREATE TABLE IF NOT EXISTS skill_installations (
1130
+ id TEXT PRIMARY KEY,
1131
+ worktree_id TEXT NOT NULL,
1132
+ skill_id TEXT NOT NULL,
1133
+ version TEXT NOT NULL,
1134
+ install_root TEXT NOT NULL,
1135
+ receipt_sha256 TEXT NOT NULL,
1136
+ source_repository TEXT NOT NULL,
1137
+ source_ref TEXT NOT NULL,
1138
+ source_commit TEXT NOT NULL,
1139
+ artifact_sha256 TEXT NOT NULL,
1140
+ effective_risk TEXT NOT NULL,
1141
+ operation_id TEXT NOT NULL,
1142
+ installed_at INTEGER NOT NULL,
1143
+ updated_at INTEGER NOT NULL,
1144
+ UNIQUE (worktree_id, skill_id)
1145
+ );
1146
+ `),a.exec(`
1147
+ CREATE INDEX IF NOT EXISTS idx_skill_installations_worktree
1148
+ ON skill_installations(worktree_id);
1149
+ `),a.exec(`
1150
+ CREATE INDEX IF NOT EXISTS idx_skill_installations_skill
1151
+ ON skill_installations(skill_id, version);
1152
+ `)},down:a=>{a.exec("DROP INDEX IF EXISTS idx_skill_installations_skill;"),a.exec("DROP INDEX IF EXISTS idx_skill_installations_worktree;"),a.exec("DROP TABLE IF EXISTS skill_installations;")}},{version:46,name:"skill-installations-worktree-cascade",up:a=>{a.exec(`
1153
+ CREATE TABLE skill_installations_new (
1154
+ ${j},
1155
+ FOREIGN KEY (worktree_id) REFERENCES worktrees(id) ON DELETE CASCADE
1156
+ );
1157
+ `),a.exec(`
1158
+ INSERT INTO skill_installations_new (${i})
1159
+ SELECT ${i} FROM skill_installations
1160
+ WHERE worktree_id IN (SELECT id FROM worktrees);
1161
+ `);let b=a.prepare(`SELECT COUNT(*) AS n FROM skill_installations
1162
+ WHERE worktree_id NOT IN (SELECT id FROM worktrees)`).get();a.exec("DROP TABLE skill_installations;"),a.exec("ALTER TABLE skill_installations_new RENAME TO skill_installations;"),k(a),b.n>0&&console.log(`Removed ${b.n} skill_installations row(s) with no worktree`),console.log("skill_installations now cascades with its worktree")},down:a=>{a.exec(`
1163
+ CREATE TABLE skill_installations_old (
1164
+ ${j}
1165
+ );
1166
+ `),a.exec(`
1167
+ INSERT INTO skill_installations_old (${i})
1168
+ SELECT ${i} FROM skill_installations;
1169
+ `),a.exec("DROP TABLE skill_installations;"),a.exec("ALTER TABLE skill_installations_old RENAME TO skill_installations;"),k(a),console.log("Rolled back skill_installations cascade (v46)")}},{version:47,name:"add-skill-installations-roots",up:a=>{a.exec("ALTER TABLE skill_installations ADD COLUMN install_roots TEXT;")},down:a=>{a.exec(`
1170
+ CREATE TABLE skill_installations__v46 (
1171
+ id TEXT PRIMARY KEY,
1172
+ worktree_id TEXT NOT NULL,
1173
+ skill_id TEXT NOT NULL,
1174
+ version TEXT NOT NULL,
1175
+ install_root TEXT NOT NULL,
1176
+ receipt_sha256 TEXT NOT NULL,
1177
+ source_repository TEXT NOT NULL,
1178
+ source_ref TEXT NOT NULL,
1179
+ source_commit TEXT NOT NULL,
1180
+ artifact_sha256 TEXT NOT NULL,
1181
+ effective_risk TEXT NOT NULL,
1182
+ operation_id TEXT NOT NULL,
1183
+ installed_at INTEGER NOT NULL,
1184
+ updated_at INTEGER NOT NULL,
1185
+ UNIQUE (worktree_id, skill_id)
1186
+ );
1187
+ `),a.exec(`
1188
+ INSERT INTO skill_installations__v46 (
1189
+ id, worktree_id, skill_id, version, install_root, receipt_sha256,
1190
+ source_repository, source_ref, source_commit, artifact_sha256,
1191
+ effective_risk, operation_id, installed_at, updated_at
1192
+ )
1193
+ SELECT
1194
+ id, worktree_id, skill_id, version, install_root, receipt_sha256,
1195
+ source_repository, source_ref, source_commit, artifact_sha256,
1196
+ effective_risk, operation_id, installed_at, updated_at
1197
+ FROM skill_installations;
1198
+ `),a.exec("DROP TABLE skill_installations;"),a.exec("ALTER TABLE skill_installations__v46 RENAME TO skill_installations;"),a.exec(`
1199
+ CREATE INDEX IF NOT EXISTS idx_skill_installations_worktree
1200
+ ON skill_installations(worktree_id);
1201
+ `),a.exec(`
1202
+ CREATE INDEX IF NOT EXISTS idx_skill_installations_skill
1203
+ ON skill_installations(skill_id, version);
1204
+ `)}}];function m(a){!function(a,b){a.exec(`
1205
+ CREATE TABLE IF NOT EXISTS schema_version (
1206
+ version INTEGER PRIMARY KEY,
1207
+ name TEXT NOT NULL,
1208
+ applied_at INTEGER NOT NULL
1209
+ );
1210
+ `);let c=f(a);if(console.log(`Current schema version: ${c}`),c>47)throw Error(`This database (schema v${c}) was created by a newer version of CommandMate (this build supports up to v47). Please update: commandmate update`);let d=b.filter(a=>a.version>c);if(0===d.length)return console.log("Schema is up to date");for(let b of(console.log(`Found ${d.length} pending migration(s)`),d)){console.log(`Applying migration ${b.version}: ${b.name}...`);try{a.transaction(()=>{b.up(a),a.prepare(`
1211
+ INSERT INTO schema_version (version, name, applied_at)
1212
+ VALUES (?, ?, ?)
1213
+ `).run(b.version,b.name,Date.now())})(),console.log(`Migration ${b.version} applied successfully`)}catch(c){let a=c instanceof Error?c.message:String(c);throw console.error(`Migration ${b.version} failed:`,a),Error(`Migration ${b.version} (${b.name}) failed: ${a}`)}}console.log(`All migrations completed. Current version: ${f(a)}`)}(a,l)}},87374:(a,b,c)=>{c.d(b,{Dr:()=>i,HR:()=>h,Ky:()=>f,XS:()=>e,ms:()=>g,u8:()=>d}),Array.from({length:Math.floor(104)+1},(a,b)=>3e5+3e5*b);let d=5,e=50,f=100,g=1e4,h={PENDING:"pending",SENDING:"sending",SENT:"sent",FAILED:"failed",CANCELLED:"cancelled",NO_SESSION:"no_session"};function i(a){return"number"==typeof a&&a>=3e5&&a<=315e5&&a%3e5==0}},88807:(a,b,c)=>{c.r(b),c.d(b,{closeDbInstance:()=>p,getDbInstance:()=>o});var d=c(33873),e=c.n(d),f=c(80499),g=c(79646),h=c(87550),i=c.n(h);let j=!1;function k(a){return a instanceof Error&&"ERR_DLOPEN_FAILED"===a.code&&a.message.includes("NODE_MODULE_VERSION")}function l(a,b){let c=["better-sqlite3 could not be loaded: it was built for a different Node.js version.","This usually happens after switching Node.js versions (nvm, fnm, Homebrew, ...).","",`Automatic recovery failed: ${a}`,"","How to fix it manually:"];return b?c.push(" The install directory is not writable by the current user, so the addon"," cannot be rebuilt in place. Do not re-run this with sudo — root-owned"," files there will break future installs and updates.",""," Either switch back to the Node.js version CommandMate was installed with:",` node -v (currently ${process.version}, NODE_MODULE_VERSION ${process.versions.modules})`,""," Or reinstall CommandMate under a Node.js version manager, which keeps"," global packages in a user-owned directory:"," nvm use <version> && npm install -g commandmate"):c.push(` 1. cd ${process.cwd()}`," 2. npm rebuild better-sqlite3"," 3. Start CommandMate again",""," If that fails, reinstalling picks up the current Node.js version:"," npm install -g commandmate"),c.join("\n")}var m=c(87447);let n=null;function o(){if(!n){let a=(0,m._$)().CM_DB_PATH,b=c(29021),d=e().dirname(a);b.existsSync(d)||b.mkdirSync(d,{recursive:!0,mode:448});let h=function(a){try{return new(i())(a)}catch(c){if(!k(c))throw c;if(j)throw Error(l("a rebuild was already attempted in this process.",!1));j=!0,console.error("[commandmate] better-sqlite3 was built for a different Node.js version.\n[commandmate] Rebuilding it automatically — this can take a few minutes...");let b=function(){let a=(0,g.spawnSync)("npm",["rebuild","better-sqlite3"],{cwd:process.cwd(),encoding:"utf-8",timeout:3e5,env:{...process.env,PATH:`${e().dirname(process.execPath)}${e().delimiter}${process.env.PATH??""}`}}),b=`${a.stdout??""}${a.stderr??""}`;return a.error||0!==a.status?{success:!1,permissionDenied:/EACCES|permission denied/i.test(b),output:b}:{success:!0,permissionDenied:!1,output:b}}();if(!b.success)throw Error(l("npm rebuild better-sqlite3 failed.",b.permissionDenied));console.error("[commandmate] Rebuild succeeded. Continuing startup.");try{return new(i())(a)}catch(a){if(k(a))throw Error(l("the addon still reports a version mismatch after rebuilding.",!1));throw a}}}(a);h.pragma("foreign_keys = ON"),h.pragma("journal_mode = WAL"),h.pragma("busy_timeout = 5000");try{(0,f.vI)(h)}catch(a){throw h.close(),a}n=h}return n}function p(){n&&(n.close(),n=null)}}};