@vibedeckx/linux-x64 0.1.10

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 (579) hide show
  1. package/dist/agent-provider.d.ts +92 -0
  2. package/dist/agent-provider.js +8 -0
  3. package/dist/agent-session-manager.d.ts +165 -0
  4. package/dist/agent-session-manager.js +985 -0
  5. package/dist/agent-types.d.ts +148 -0
  6. package/dist/agent-types.js +4 -0
  7. package/dist/bin.d.ts +2 -0
  8. package/dist/bin.js +4 -0
  9. package/dist/browser-manager.d.ts +46 -0
  10. package/dist/browser-manager.js +182 -0
  11. package/dist/chat-session-manager.d.ts +101 -0
  12. package/dist/chat-session-manager.js +1425 -0
  13. package/dist/command.d.ts +1 -0
  14. package/dist/command.js +163 -0
  15. package/dist/constants.d.ts +3 -0
  16. package/dist/constants.js +5 -0
  17. package/dist/conversation-patch.d.ts +103 -0
  18. package/dist/conversation-patch.js +69 -0
  19. package/dist/dialog.d.ts +1 -0
  20. package/dist/dialog.js +41 -0
  21. package/dist/entry-index-provider.d.ts +74 -0
  22. package/dist/entry-index-provider.js +105 -0
  23. package/dist/event-bus.d.ts +47 -0
  24. package/dist/event-bus.js +16 -0
  25. package/dist/index.d.ts +3 -0
  26. package/dist/index.js +2 -0
  27. package/dist/plugins/shared-services.d.ts +8 -0
  28. package/dist/plugins/shared-services.js +65 -0
  29. package/dist/process-manager.d.ts +146 -0
  30. package/dist/process-manager.js +779 -0
  31. package/dist/providers/claude-code-provider.d.ts +13 -0
  32. package/dist/providers/claude-code-provider.js +127 -0
  33. package/dist/providers/codex-provider.d.ts +41 -0
  34. package/dist/providers/codex-provider.js +354 -0
  35. package/dist/providers/index.d.ts +5 -0
  36. package/dist/providers/index.js +19 -0
  37. package/dist/remote-patch-cache.d.ts +67 -0
  38. package/dist/remote-patch-cache.js +190 -0
  39. package/dist/reverse-connect-client.d.ts +27 -0
  40. package/dist/reverse-connect-client.js +255 -0
  41. package/dist/reverse-connect-manager.d.ts +31 -0
  42. package/dist/reverse-connect-manager.js +287 -0
  43. package/dist/reverse-connect-types.d.ts +55 -0
  44. package/dist/reverse-connect-types.js +7 -0
  45. package/dist/routes/agent-session-routes.d.ts +4 -0
  46. package/dist/routes/agent-session-routes.js +442 -0
  47. package/dist/routes/browser-proxy-routes.d.ts +25 -0
  48. package/dist/routes/browser-proxy-routes.js +421 -0
  49. package/dist/routes/browser-routes.d.ts +4 -0
  50. package/dist/routes/browser-routes.js +73 -0
  51. package/dist/routes/chat-session-routes.d.ts +7 -0
  52. package/dist/routes/chat-session-routes.js +69 -0
  53. package/dist/routes/diff-routes.d.ts +4 -0
  54. package/dist/routes/diff-routes.js +208 -0
  55. package/dist/routes/event-routes.d.ts +4 -0
  56. package/dist/routes/event-routes.js +52 -0
  57. package/dist/routes/executor-group-routes.d.ts +4 -0
  58. package/dist/routes/executor-group-routes.js +76 -0
  59. package/dist/routes/executor-routes.d.ts +4 -0
  60. package/dist/routes/executor-routes.js +106 -0
  61. package/dist/routes/file-routes.d.ts +4 -0
  62. package/dist/routes/file-routes.js +331 -0
  63. package/dist/routes/process-routes.d.ts +4 -0
  64. package/dist/routes/process-routes.js +183 -0
  65. package/dist/routes/project-remote-routes.d.ts +4 -0
  66. package/dist/routes/project-remote-routes.js +82 -0
  67. package/dist/routes/project-routes.d.ts +4 -0
  68. package/dist/routes/project-routes.js +286 -0
  69. package/dist/routes/remote-routes.d.ts +4 -0
  70. package/dist/routes/remote-routes.js +59 -0
  71. package/dist/routes/remote-server-routes.d.ts +4 -0
  72. package/dist/routes/remote-server-routes.js +157 -0
  73. package/dist/routes/reverse-connect-routes.d.ts +4 -0
  74. package/dist/routes/reverse-connect-routes.js +33 -0
  75. package/dist/routes/settings-routes.d.ts +4 -0
  76. package/dist/routes/settings-routes.js +129 -0
  77. package/dist/routes/task-routes.d.ts +4 -0
  78. package/dist/routes/task-routes.js +107 -0
  79. package/dist/routes/terminal-routes.d.ts +4 -0
  80. package/dist/routes/terminal-routes.js +187 -0
  81. package/dist/routes/translate-routes.d.ts +4 -0
  82. package/dist/routes/translate-routes.js +38 -0
  83. package/dist/routes/websocket-routes.d.ts +4 -0
  84. package/dist/routes/websocket-routes.js +604 -0
  85. package/dist/routes/worktree-routes.d.ts +4 -0
  86. package/dist/routes/worktree-routes.js +511 -0
  87. package/dist/server-types.d.ts +41 -0
  88. package/dist/server-types.js +1 -0
  89. package/dist/server.d.ts +23 -0
  90. package/dist/server.js +238 -0
  91. package/dist/storage/sqlite.d.ts +2 -0
  92. package/dist/storage/sqlite.js +1073 -0
  93. package/dist/storage/types.d.ts +281 -0
  94. package/dist/storage/types.js +1 -0
  95. package/dist/ui/404/index.html +1 -0
  96. package/dist/ui/404.html +1 -0
  97. package/dist/ui/__next.__PAGE__.txt +10 -0
  98. package/dist/ui/__next._full.txt +25 -0
  99. package/dist/ui/__next._head.txt +6 -0
  100. package/dist/ui/__next._index.txt +9 -0
  101. package/dist/ui/__next._tree.txt +6 -0
  102. package/dist/ui/_next/static/7vIIuOQPJu8rdb6uAhwtg/_buildManifest.js +11 -0
  103. package/dist/ui/_next/static/7vIIuOQPJu8rdb6uAhwtg/_clientMiddlewareManifest.json +1 -0
  104. package/dist/ui/_next/static/7vIIuOQPJu8rdb6uAhwtg/_ssgManifest.js +1 -0
  105. package/dist/ui/_next/static/chunks/002f5a047b8d07d4.js +1 -0
  106. package/dist/ui/_next/static/chunks/01178e167ba3e5b4.js +1 -0
  107. package/dist/ui/_next/static/chunks/020d675d21be28d4.js +1 -0
  108. package/dist/ui/_next/static/chunks/024926197424b4a5.js +1 -0
  109. package/dist/ui/_next/static/chunks/02c93f6ca211a65d.js +1 -0
  110. package/dist/ui/_next/static/chunks/0364437dee56dc96.js +1 -0
  111. package/dist/ui/_next/static/chunks/03fc6b527b16efdc.js +1 -0
  112. package/dist/ui/_next/static/chunks/04f9a7932751cf2d.js +1 -0
  113. package/dist/ui/_next/static/chunks/0624b8204e5ae457.js +136 -0
  114. package/dist/ui/_next/static/chunks/067d8978cf41b901.js +1 -0
  115. package/dist/ui/_next/static/chunks/06d96238e85cdbb3.js +1 -0
  116. package/dist/ui/_next/static/chunks/071b9575dbdf1dcb.js +1 -0
  117. package/dist/ui/_next/static/chunks/073d5b9dc87ceab0.js +1 -0
  118. package/dist/ui/_next/static/chunks/0876a7111934d6f7.js +1 -0
  119. package/dist/ui/_next/static/chunks/08ffc3bf406c665d.js +1 -0
  120. package/dist/ui/_next/static/chunks/0969e8274c92c2d8.js +1 -0
  121. package/dist/ui/_next/static/chunks/0a3f62f00d7bec78.js +1 -0
  122. package/dist/ui/_next/static/chunks/0b80166023d89049.js +5 -0
  123. package/dist/ui/_next/static/chunks/0c2a941e61c395b6.js +1 -0
  124. package/dist/ui/_next/static/chunks/0c5eac8493334420.js +1 -0
  125. package/dist/ui/_next/static/chunks/0cc61d37b2333469.js +1 -0
  126. package/dist/ui/_next/static/chunks/0d440843348b2871.js +1 -0
  127. package/dist/ui/_next/static/chunks/0da3d15845f17208.js +1 -0
  128. package/dist/ui/_next/static/chunks/0e1982b1a6cbd127.js +53 -0
  129. package/dist/ui/_next/static/chunks/0e81d5bc1c725b75.js +1 -0
  130. package/dist/ui/_next/static/chunks/0e862e51b01e904b.js +63 -0
  131. package/dist/ui/_next/static/chunks/0ed7b6d86744b723.js +1 -0
  132. package/dist/ui/_next/static/chunks/0f0b3025f4e268b1.js +1 -0
  133. package/dist/ui/_next/static/chunks/10a30eb52825da36.js +1 -0
  134. package/dist/ui/_next/static/chunks/10c48da576fd8eef.js +1 -0
  135. package/dist/ui/_next/static/chunks/133e9f1435ca5f45.js +29 -0
  136. package/dist/ui/_next/static/chunks/16f4db3a54f167fd.js +1 -0
  137. package/dist/ui/_next/static/chunks/1988e3ecf5ad06d3.js +1 -0
  138. package/dist/ui/_next/static/chunks/1acfae010fd77014.js +152 -0
  139. package/dist/ui/_next/static/chunks/1ae53c2f1fff8cc2.js +1 -0
  140. package/dist/ui/_next/static/chunks/1af4fbc6c1256fae.js +1 -0
  141. package/dist/ui/_next/static/chunks/1b758c732032b236.js +1 -0
  142. package/dist/ui/_next/static/chunks/1ba26455a9f70c08.js +1 -0
  143. package/dist/ui/_next/static/chunks/1d22644cb4049d6b.css +1 -0
  144. package/dist/ui/_next/static/chunks/1d241f3b57c14cf7.js +1 -0
  145. package/dist/ui/_next/static/chunks/1d640bbe1c2c7869.js +1 -0
  146. package/dist/ui/_next/static/chunks/1da6354c9cb6f0de.js +1 -0
  147. package/dist/ui/_next/static/chunks/1dcd49914412f67b.js +1 -0
  148. package/dist/ui/_next/static/chunks/1e3b3771294825a4.js +1 -0
  149. package/dist/ui/_next/static/chunks/1eaa8ad7eca7f957.js +1 -0
  150. package/dist/ui/_next/static/chunks/1ebc88f60cadb128.js +1 -0
  151. package/dist/ui/_next/static/chunks/1ecb57b258088259.js +1 -0
  152. package/dist/ui/_next/static/chunks/1f5ba6b80fe19200.js +1 -0
  153. package/dist/ui/_next/static/chunks/20a5531534828366.js +1 -0
  154. package/dist/ui/_next/static/chunks/20b511fc299dfe9a.js +1 -0
  155. package/dist/ui/_next/static/chunks/20bff4eb9a0a6872.css +1 -0
  156. package/dist/ui/_next/static/chunks/219b7d9e437c6bd8.js +15 -0
  157. package/dist/ui/_next/static/chunks/21b32f530e0df2c5.js +1 -0
  158. package/dist/ui/_next/static/chunks/21fc6dc60e7647b1.js +1 -0
  159. package/dist/ui/_next/static/chunks/221a27e65aa5fbfd.js +1 -0
  160. package/dist/ui/_next/static/chunks/23a1e247c32bcc61.js +93 -0
  161. package/dist/ui/_next/static/chunks/2473c16c0c2f6b5f.css +2 -0
  162. package/dist/ui/_next/static/chunks/2615c71c0f8fe9bd.js +1 -0
  163. package/dist/ui/_next/static/chunks/263327288d5e2703.js +1 -0
  164. package/dist/ui/_next/static/chunks/2663fbaf43239e38.js +1 -0
  165. package/dist/ui/_next/static/chunks/27332c590d59f4e5.js +1 -0
  166. package/dist/ui/_next/static/chunks/27ca4a4e8191093f.js +1 -0
  167. package/dist/ui/_next/static/chunks/29b7618dcaa8edba.js +1 -0
  168. package/dist/ui/_next/static/chunks/2ba1d2b55b82f4da.js +21 -0
  169. package/dist/ui/_next/static/chunks/2cb23686e72468c8.js +1 -0
  170. package/dist/ui/_next/static/chunks/2d46f05dcbf1cbc2.js +1 -0
  171. package/dist/ui/_next/static/chunks/2d4c0fd06ca34510.js +2 -0
  172. package/dist/ui/_next/static/chunks/2f3d1d07474b8f79.js +1 -0
  173. package/dist/ui/_next/static/chunks/2f85c2849249a0dd.js +1 -0
  174. package/dist/ui/_next/static/chunks/3001d378f166eec9.js +1 -0
  175. package/dist/ui/_next/static/chunks/3018714f3827e360.js +1 -0
  176. package/dist/ui/_next/static/chunks/301cc25e0d489351.js +1 -0
  177. package/dist/ui/_next/static/chunks/305242b22ba8b49b.js +1 -0
  178. package/dist/ui/_next/static/chunks/3067c6e369066bd6.js +1 -0
  179. package/dist/ui/_next/static/chunks/311a77c9d5cb9de9.js +1 -0
  180. package/dist/ui/_next/static/chunks/320c001380e81470.js +1 -0
  181. package/dist/ui/_next/static/chunks/329db6c551df0faf.js +1 -0
  182. package/dist/ui/_next/static/chunks/33da178724072b3d.js +1 -0
  183. package/dist/ui/_next/static/chunks/33e8248c9296537a.js +1 -0
  184. package/dist/ui/_next/static/chunks/35a9992a8958f93b.js +1 -0
  185. package/dist/ui/_next/static/chunks/35bb90cf09892b72.js +1 -0
  186. package/dist/ui/_next/static/chunks/379f91b92366dc15.js +1 -0
  187. package/dist/ui/_next/static/chunks/391f22359769763f.js +1 -0
  188. package/dist/ui/_next/static/chunks/39231cb1044f7823.js +1 -0
  189. package/dist/ui/_next/static/chunks/394e8b7a1c2c58c6.js +1 -0
  190. package/dist/ui/_next/static/chunks/3a2cfdeb5f76ebd2.js +1 -0
  191. package/dist/ui/_next/static/chunks/3a3bd015fd042386.js +1 -0
  192. package/dist/ui/_next/static/chunks/3ad1bee238af9b5a.js +1 -0
  193. package/dist/ui/_next/static/chunks/3b2b2f7a9b7b130d.js +1 -0
  194. package/dist/ui/_next/static/chunks/3b586f80547e3a22.js +1 -0
  195. package/dist/ui/_next/static/chunks/3ca412e72bd3707a.js +1 -0
  196. package/dist/ui/_next/static/chunks/3cbb3bdceb4230af.js +1 -0
  197. package/dist/ui/_next/static/chunks/3ed1465109fecc2d.js +1 -0
  198. package/dist/ui/_next/static/chunks/3fd0801238b3b099.js +1 -0
  199. package/dist/ui/_next/static/chunks/401df66bd5da2115.js +15 -0
  200. package/dist/ui/_next/static/chunks/4211f4efe510f7ac.js +1 -0
  201. package/dist/ui/_next/static/chunks/43085364d0a41d1d.js +1 -0
  202. package/dist/ui/_next/static/chunks/4310c821dbee7a16.js +1 -0
  203. package/dist/ui/_next/static/chunks/46382f31f63e59cf.js +1 -0
  204. package/dist/ui/_next/static/chunks/468836b90ddf24d6.js +1 -0
  205. package/dist/ui/_next/static/chunks/470d091143104517.js +1 -0
  206. package/dist/ui/_next/static/chunks/4712e4f7e6b6ddc1.js +1 -0
  207. package/dist/ui/_next/static/chunks/4899f1e3f21c077e.js +1 -0
  208. package/dist/ui/_next/static/chunks/492ce6930bf61811.js +1 -0
  209. package/dist/ui/_next/static/chunks/494485a20952ffa3.js +1 -0
  210. package/dist/ui/_next/static/chunks/49535db309898f43.js +1 -0
  211. package/dist/ui/_next/static/chunks/4b8d2612d69e2013.js +1 -0
  212. package/dist/ui/_next/static/chunks/4c4a0f67891826a3.js +1 -0
  213. package/dist/ui/_next/static/chunks/4cc11ce32f4453b0.js +1 -0
  214. package/dist/ui/_next/static/chunks/4d03a0bc963fc3d4.js +1 -0
  215. package/dist/ui/_next/static/chunks/4d603a66c067134e.js +1 -0
  216. package/dist/ui/_next/static/chunks/4d8d7e62c2743f71.js +15 -0
  217. package/dist/ui/_next/static/chunks/4da42f10a5460b36.js +1 -0
  218. package/dist/ui/_next/static/chunks/4e832ffb65e75807.js +1 -0
  219. package/dist/ui/_next/static/chunks/4e954e1cec89a9ea.js +1 -0
  220. package/dist/ui/_next/static/chunks/4f2bc7a7a6b05a8b.js +55 -0
  221. package/dist/ui/_next/static/chunks/4f9c934abf34ceb9.js +1 -0
  222. package/dist/ui/_next/static/chunks/4fa248b0d2586928.js +1 -0
  223. package/dist/ui/_next/static/chunks/4fafbac2156844ca.js +1 -0
  224. package/dist/ui/_next/static/chunks/502039e483cc5e48.js +1 -0
  225. package/dist/ui/_next/static/chunks/509c91c38224448a.js +1 -0
  226. package/dist/ui/_next/static/chunks/5159d6f8d4307f36.js +1 -0
  227. package/dist/ui/_next/static/chunks/5179ab56aaaed42d.js +1 -0
  228. package/dist/ui/_next/static/chunks/5269ea07faff562d.js +1 -0
  229. package/dist/ui/_next/static/chunks/529f3f0f7d42444a.js +1 -0
  230. package/dist/ui/_next/static/chunks/5317db6783ee8dc9.js +1 -0
  231. package/dist/ui/_next/static/chunks/53a7b7c0ab020902.js +1 -0
  232. package/dist/ui/_next/static/chunks/544869c670c1dd8e.js +1 -0
  233. package/dist/ui/_next/static/chunks/547c0db6a433370e.js +1 -0
  234. package/dist/ui/_next/static/chunks/54d5670f5fa2abbe.css +1 -0
  235. package/dist/ui/_next/static/chunks/55761e35a8946a1d.js +15 -0
  236. package/dist/ui/_next/static/chunks/558f73c16b7ff14f.js +1 -0
  237. package/dist/ui/_next/static/chunks/55c76f605958d671.js +1 -0
  238. package/dist/ui/_next/static/chunks/55dc6750fb117bf9.js +1 -0
  239. package/dist/ui/_next/static/chunks/584bad9cf2498405.js +1 -0
  240. package/dist/ui/_next/static/chunks/593b85b9abea3ea6.js +1 -0
  241. package/dist/ui/_next/static/chunks/5a79af73c96155d4.js +1 -0
  242. package/dist/ui/_next/static/chunks/5ee54b9b6b400134.js +1 -0
  243. package/dist/ui/_next/static/chunks/5f27ee48dc820109.js +1 -0
  244. package/dist/ui/_next/static/chunks/5ffd50a08d82e2f3.js +1 -0
  245. package/dist/ui/_next/static/chunks/61d65fe807f69413.js +62 -0
  246. package/dist/ui/_next/static/chunks/626a650bcaaecdb8.js +1 -0
  247. package/dist/ui/_next/static/chunks/62baecafed4dbced.js +1 -0
  248. package/dist/ui/_next/static/chunks/634a4b5b6a38ccab.js +1 -0
  249. package/dist/ui/_next/static/chunks/643c359cf3f7364e.js +1 -0
  250. package/dist/ui/_next/static/chunks/649e65f4820a772b.js +1 -0
  251. package/dist/ui/_next/static/chunks/65028938188a230c.js +1 -0
  252. package/dist/ui/_next/static/chunks/65b3658348e8d4fd.js +1 -0
  253. package/dist/ui/_next/static/chunks/65eed220466cbdbc.js +1 -0
  254. package/dist/ui/_next/static/chunks/66714687cfd91953.js +1 -0
  255. package/dist/ui/_next/static/chunks/66ccaa3e69ed7a69.js +1 -0
  256. package/dist/ui/_next/static/chunks/6754600af0c6b3a8.js +1 -0
  257. package/dist/ui/_next/static/chunks/67a1d37727697340.js +1 -0
  258. package/dist/ui/_next/static/chunks/67e965a7f9531cee.js +1 -0
  259. package/dist/ui/_next/static/chunks/6816bf02e4c22a55.js +1 -0
  260. package/dist/ui/_next/static/chunks/68621b90909ec4e6.js +1 -0
  261. package/dist/ui/_next/static/chunks/6929ceb718c6e4c6.js +1 -0
  262. package/dist/ui/_next/static/chunks/69362fff2240a17b.js +1 -0
  263. package/dist/ui/_next/static/chunks/69dab47a307b1a37.js +1 -0
  264. package/dist/ui/_next/static/chunks/6afa71c8b3358dd5.js +1 -0
  265. package/dist/ui/_next/static/chunks/6bf54dc328e667f7.js +1 -0
  266. package/dist/ui/_next/static/chunks/6c44508faf13f6f0.js +1 -0
  267. package/dist/ui/_next/static/chunks/6c9c2b61c905a2de.js +1 -0
  268. package/dist/ui/_next/static/chunks/6cc2e3d7873522b9.js +1 -0
  269. package/dist/ui/_next/static/chunks/6d01e8902e85bfe0.js +1 -0
  270. package/dist/ui/_next/static/chunks/6dc69e4a91f7a353.js +1 -0
  271. package/dist/ui/_next/static/chunks/6e832e016b60ae19.js +1 -0
  272. package/dist/ui/_next/static/chunks/6eab0d8815c18a6d.js +1 -0
  273. package/dist/ui/_next/static/chunks/6f862eb588fa3b7e.js +1 -0
  274. package/dist/ui/_next/static/chunks/6ff7b0a8653036b2.js +1 -0
  275. package/dist/ui/_next/static/chunks/710ce144a9645f3c.js +1 -0
  276. package/dist/ui/_next/static/chunks/71293e300c639b6b.js +1 -0
  277. package/dist/ui/_next/static/chunks/7186d7cce354a012.js +1 -0
  278. package/dist/ui/_next/static/chunks/7215d586009e8158.js +1 -0
  279. package/dist/ui/_next/static/chunks/726fdeaff53a89ac.js +1 -0
  280. package/dist/ui/_next/static/chunks/7322a00d61e7ffad.js +1 -0
  281. package/dist/ui/_next/static/chunks/73c60ee9f233051d.js +1 -0
  282. package/dist/ui/_next/static/chunks/740f5627b5c57baa.js +1 -0
  283. package/dist/ui/_next/static/chunks/74438794a8e9ba80.js +1 -0
  284. package/dist/ui/_next/static/chunks/74ffcd7d13b3fea0.js +1 -0
  285. package/dist/ui/_next/static/chunks/7510496048ab1ad4.js +1 -0
  286. package/dist/ui/_next/static/chunks/7636f89f38cbc3e3.js +1 -0
  287. package/dist/ui/_next/static/chunks/782a93ec4348b666.js +1 -0
  288. package/dist/ui/_next/static/chunks/7850bbac1925646c.js +1 -0
  289. package/dist/ui/_next/static/chunks/790dcc1e825d2504.js +1 -0
  290. package/dist/ui/_next/static/chunks/798597a1c1248d29.js +1 -0
  291. package/dist/ui/_next/static/chunks/7a70641f70a5c72d.js +60 -0
  292. package/dist/ui/_next/static/chunks/7c62789391c35dce.js +1 -0
  293. package/dist/ui/_next/static/chunks/7d533d3f2ab624f2.js +1 -0
  294. package/dist/ui/_next/static/chunks/7d6087c3fabf9ded.js +1 -0
  295. package/dist/ui/_next/static/chunks/7d84c9cb810e6902.js +1 -0
  296. package/dist/ui/_next/static/chunks/7dc4f5ba8c25c409.js +1 -0
  297. package/dist/ui/_next/static/chunks/7e10c0644fbb99d1.js +1 -0
  298. package/dist/ui/_next/static/chunks/7e7aaacf104c17f4.js +1 -0
  299. package/dist/ui/_next/static/chunks/7e92979509de57ed.js +1 -0
  300. package/dist/ui/_next/static/chunks/7f9a52e36f9f001e.js +1 -0
  301. package/dist/ui/_next/static/chunks/7fc4ae2e7cf2e37e.js +1 -0
  302. package/dist/ui/_next/static/chunks/801232fdde8ce252.js +1 -0
  303. package/dist/ui/_next/static/chunks/808ed0f189237446.js +1 -0
  304. package/dist/ui/_next/static/chunks/8199e6b3fa54b2ff.js +1 -0
  305. package/dist/ui/_next/static/chunks/81fa0fa05a94eb02.js +1 -0
  306. package/dist/ui/_next/static/chunks/821b5389566b82d2.js +1 -0
  307. package/dist/ui/_next/static/chunks/82b9e04f88e657df.js +1 -0
  308. package/dist/ui/_next/static/chunks/830c79cc12f2c5a4.js +1 -0
  309. package/dist/ui/_next/static/chunks/8388ae863590404b.js +4 -0
  310. package/dist/ui/_next/static/chunks/83ab70f11a82a8c6.js +1 -0
  311. package/dist/ui/_next/static/chunks/83faf7904ac18d7f.js +1 -0
  312. package/dist/ui/_next/static/chunks/850d850bd879606f.js +1 -0
  313. package/dist/ui/_next/static/chunks/864d4b5cf4ae2226.js +1 -0
  314. package/dist/ui/_next/static/chunks/86d8962196053f53.js +139 -0
  315. package/dist/ui/_next/static/chunks/8723d7000b263475.js +1 -0
  316. package/dist/ui/_next/static/chunks/87e5597a4336e2c1.js +1 -0
  317. package/dist/ui/_next/static/chunks/899fe56c4c707c65.js +1 -0
  318. package/dist/ui/_next/static/chunks/8bda52f55493ae9b.js +1 -0
  319. package/dist/ui/_next/static/chunks/8ce5668c3da0679a.js +1 -0
  320. package/dist/ui/_next/static/chunks/8d1c22aafb4783c5.js +1 -0
  321. package/dist/ui/_next/static/chunks/8deda0adfe811d18.js +1 -0
  322. package/dist/ui/_next/static/chunks/8eed597098a27801.js +1 -0
  323. package/dist/ui/_next/static/chunks/8ff7a1947b8d114b.js +1 -0
  324. package/dist/ui/_next/static/chunks/90367a2ee1e720b2.js +1 -0
  325. package/dist/ui/_next/static/chunks/9097640e1931c0de.js +1 -0
  326. package/dist/ui/_next/static/chunks/912457473a4c91c3.js +1 -0
  327. package/dist/ui/_next/static/chunks/91f7dd388c6b88c6.js +1 -0
  328. package/dist/ui/_next/static/chunks/932d4334e5f98b7c.js +1 -0
  329. package/dist/ui/_next/static/chunks/94b1efc14d44707b.js +1 -0
  330. package/dist/ui/_next/static/chunks/956107bc3ba52911.js +1 -0
  331. package/dist/ui/_next/static/chunks/962e5cad8ea716fc.js +36 -0
  332. package/dist/ui/_next/static/chunks/96acf903dff8ecf7.js +1 -0
  333. package/dist/ui/_next/static/chunks/96b274c82c194b4f.js +1 -0
  334. package/dist/ui/_next/static/chunks/96b3c1b1afe3201d.js +1 -0
  335. package/dist/ui/_next/static/chunks/9880c26551206d33.js +1 -0
  336. package/dist/ui/_next/static/chunks/98ea228d01556617.js +1 -0
  337. package/dist/ui/_next/static/chunks/9951c25a8b05148f.js +1 -0
  338. package/dist/ui/_next/static/chunks/9b10895d33be5f6e.js +1 -0
  339. package/dist/ui/_next/static/chunks/9b50a76ddbe4934d.js +1 -0
  340. package/dist/ui/_next/static/chunks/9bbb1c0146042008.js +1 -0
  341. package/dist/ui/_next/static/chunks/9ccab70823e99451.js +1 -0
  342. package/dist/ui/_next/static/chunks/9cd7bcb29e0b3418.js +24 -0
  343. package/dist/ui/_next/static/chunks/9d06bd5d701ace73.js +1 -0
  344. package/dist/ui/_next/static/chunks/9e5d9fc30c12fbdd.js +1 -0
  345. package/dist/ui/_next/static/chunks/9ec3bc5544bcc15a.js +1 -0
  346. package/dist/ui/_next/static/chunks/9f47133184a7455a.js +1 -0
  347. package/dist/ui/_next/static/chunks/a002d3850b7c7c59.js +1 -0
  348. package/dist/ui/_next/static/chunks/a0bc5573cadd1377.js +1 -0
  349. package/dist/ui/_next/static/chunks/a1d3de9e7615662e.js +160 -0
  350. package/dist/ui/_next/static/chunks/a2ce60768a8373e7.js +1 -0
  351. package/dist/ui/_next/static/chunks/a305087b1a55b367.js +1 -0
  352. package/dist/ui/_next/static/chunks/a41df0d443f66c68.js +1 -0
  353. package/dist/ui/_next/static/chunks/a49d2e9f31886b5e.js +1 -0
  354. package/dist/ui/_next/static/chunks/a50922e0883f65cd.js +1 -0
  355. package/dist/ui/_next/static/chunks/a60e84ee8b6c5ffc.js +43 -0
  356. package/dist/ui/_next/static/chunks/a6dad97d9634a72d.js +1 -0
  357. package/dist/ui/_next/static/chunks/a6dad97d9634a72d.js.map +1 -0
  358. package/dist/ui/_next/static/chunks/a7c40c289b5e2384.js +1 -0
  359. package/dist/ui/_next/static/chunks/a7fdfeea5fd894c1.js +59 -0
  360. package/dist/ui/_next/static/chunks/a81381241f4f484c.js +1 -0
  361. package/dist/ui/_next/static/chunks/a8a3989305bcc136.js +215 -0
  362. package/dist/ui/_next/static/chunks/a8cf26088e63128c.js +1 -0
  363. package/dist/ui/_next/static/chunks/aac4ca816d9ccdb6.js +1 -0
  364. package/dist/ui/_next/static/chunks/ab432bc28a971c8f.js +1 -0
  365. package/dist/ui/_next/static/chunks/abccff1b09b6effa.js +1 -0
  366. package/dist/ui/_next/static/chunks/ac8a8986f09ec520.js +1 -0
  367. package/dist/ui/_next/static/chunks/accbf306b5ddb732.js +1 -0
  368. package/dist/ui/_next/static/chunks/af7b09aba1d477ff.js +1 -0
  369. package/dist/ui/_next/static/chunks/af8114430894d79e.js +1 -0
  370. package/dist/ui/_next/static/chunks/afe2ff5d0727a240.js +1 -0
  371. package/dist/ui/_next/static/chunks/b096fa008120f0ae.js +1 -0
  372. package/dist/ui/_next/static/chunks/b0bc568eaff56dad.js +1 -0
  373. package/dist/ui/_next/static/chunks/b225dddc0852f85c.js +215 -0
  374. package/dist/ui/_next/static/chunks/b2342c5099957971.js +1 -0
  375. package/dist/ui/_next/static/chunks/b2d8c64d7d6a06b7.js +1 -0
  376. package/dist/ui/_next/static/chunks/b331c855cfc8fd57.js +1 -0
  377. package/dist/ui/_next/static/chunks/b356ee8615740392.js +1 -0
  378. package/dist/ui/_next/static/chunks/b3beaac9b7957d3f.js +1 -0
  379. package/dist/ui/_next/static/chunks/b4e7d4a109c4c080.js +1 -0
  380. package/dist/ui/_next/static/chunks/b5010f2ea9df9d00.js +77 -0
  381. package/dist/ui/_next/static/chunks/b5f9d21bd1b51a48.js +1 -0
  382. package/dist/ui/_next/static/chunks/b6a16eb77c5c9831.js +1 -0
  383. package/dist/ui/_next/static/chunks/b6a8e7c2216683ca.js +262 -0
  384. package/dist/ui/_next/static/chunks/b873c4d327a450e0.js +1 -0
  385. package/dist/ui/_next/static/chunks/b8aec8caed569fd2.js +24 -0
  386. package/dist/ui/_next/static/chunks/b8e7601e2379fd74.js +1 -0
  387. package/dist/ui/_next/static/chunks/ba3d03bf2f33f2a3.js +1 -0
  388. package/dist/ui/_next/static/chunks/ba698805336b2cb2.js +1 -0
  389. package/dist/ui/_next/static/chunks/bc48735eee7d1345.js +1 -0
  390. package/dist/ui/_next/static/chunks/bcb48aab1bdae96a.js +1 -0
  391. package/dist/ui/_next/static/chunks/bde2ca9d150d96ff.js +1 -0
  392. package/dist/ui/_next/static/chunks/be4af851547fc916.js +1 -0
  393. package/dist/ui/_next/static/chunks/be70ba8c4ba5cdb6.js +1 -0
  394. package/dist/ui/_next/static/chunks/be87578ee895734b.js +1 -0
  395. package/dist/ui/_next/static/chunks/c0aeb40fcca7d006.js +1 -0
  396. package/dist/ui/_next/static/chunks/c32156843c32ebca.js +1 -0
  397. package/dist/ui/_next/static/chunks/c57a3e045f3722c1.js +1 -0
  398. package/dist/ui/_next/static/chunks/c5add23cde4a234a.js +1 -0
  399. package/dist/ui/_next/static/chunks/c60897f3554a9388.js +1 -0
  400. package/dist/ui/_next/static/chunks/c648a36722afd12a.js +1 -0
  401. package/dist/ui/_next/static/chunks/c652f05e0a0d7b81.js +1 -0
  402. package/dist/ui/_next/static/chunks/c678d9303ed453b4.js +1 -0
  403. package/dist/ui/_next/static/chunks/c681430c24597d06.js +1 -0
  404. package/dist/ui/_next/static/chunks/c890870fb65940bc.js +1 -0
  405. package/dist/ui/_next/static/chunks/c94c394aeec71e21.js +1 -0
  406. package/dist/ui/_next/static/chunks/ca1eb1e2978389e4.js +1 -0
  407. package/dist/ui/_next/static/chunks/ca3512025a981c82.js +1 -0
  408. package/dist/ui/_next/static/chunks/ca6db0d999bad46b.js +1 -0
  409. package/dist/ui/_next/static/chunks/ca926babdf75597c.js +1 -0
  410. package/dist/ui/_next/static/chunks/cb0877764d4a31f2.js +1 -0
  411. package/dist/ui/_next/static/chunks/cb15e0c2ff49cf52.js +1 -0
  412. package/dist/ui/_next/static/chunks/cb1ae84204260ecd.js +1 -0
  413. package/dist/ui/_next/static/chunks/cb2ef733c53d80f7.js +1 -0
  414. package/dist/ui/_next/static/chunks/cbaa87ba8930fb75.js +1 -0
  415. package/dist/ui/_next/static/chunks/cbd29ba61906e19f.js +1 -0
  416. package/dist/ui/_next/static/chunks/ccf1e618faea3d02.js +148 -0
  417. package/dist/ui/_next/static/chunks/cd91712ea04f43ba.js +13 -0
  418. package/dist/ui/_next/static/chunks/cdd85dc039d450f3.js +1 -0
  419. package/dist/ui/_next/static/chunks/ce663833f73b1ec5.js +1 -0
  420. package/dist/ui/_next/static/chunks/ceda8fcac21d8e70.js +1 -0
  421. package/dist/ui/_next/static/chunks/cf565875b66f8cad.js +1 -0
  422. package/dist/ui/_next/static/chunks/d127ded39a594c84.js +1 -0
  423. package/dist/ui/_next/static/chunks/d34124988f5b8f6d.js +1 -0
  424. package/dist/ui/_next/static/chunks/d36807add3e11d59.js +60 -0
  425. package/dist/ui/_next/static/chunks/d3f2e4603faebed8.js +1 -0
  426. package/dist/ui/_next/static/chunks/d414302c23047b9b.js +1 -0
  427. package/dist/ui/_next/static/chunks/d42adc0237103e65.js +1 -0
  428. package/dist/ui/_next/static/chunks/d4a06b205f0a641b.js +1 -0
  429. package/dist/ui/_next/static/chunks/d4e5289ace3acef0.js +1 -0
  430. package/dist/ui/_next/static/chunks/d53b4725d3328076.js +1 -0
  431. package/dist/ui/_next/static/chunks/d5bd04634f922925.js +1 -0
  432. package/dist/ui/_next/static/chunks/d642c9229900dc48.js +1 -0
  433. package/dist/ui/_next/static/chunks/d6651bb78c09d144.js +5 -0
  434. package/dist/ui/_next/static/chunks/d7276c56aa62ceed.js +1 -0
  435. package/dist/ui/_next/static/chunks/d85cd9cda46f2d1b.js +1 -0
  436. package/dist/ui/_next/static/chunks/d8978f4b468bbad4.js +1 -0
  437. package/dist/ui/_next/static/chunks/d8fb9668a83c0603.js +1 -0
  438. package/dist/ui/_next/static/chunks/d95c62472fc41baf.js +1 -0
  439. package/dist/ui/_next/static/chunks/da13170b983f7ebf.js +1 -0
  440. package/dist/ui/_next/static/chunks/dae86e12c7741e6c.js +19 -0
  441. package/dist/ui/_next/static/chunks/db44023a744297d1.js +1 -0
  442. package/dist/ui/_next/static/chunks/dbe7840308be36b8.js +1 -0
  443. package/dist/ui/_next/static/chunks/dc0a4df8f7080b29.js +1 -0
  444. package/dist/ui/_next/static/chunks/dc4a6f59be156511.js +1 -0
  445. package/dist/ui/_next/static/chunks/dcda5e7b57ed88e0.js +1 -0
  446. package/dist/ui/_next/static/chunks/de9ff8c97f75b947.js +1 -0
  447. package/dist/ui/_next/static/chunks/df6abcdb3eb0b236.js +1 -0
  448. package/dist/ui/_next/static/chunks/df8a0933ca385a63.js +1 -0
  449. package/dist/ui/_next/static/chunks/dff6434c44c2dfaa.js +1 -0
  450. package/dist/ui/_next/static/chunks/e037ec5e62b2bdc3.js +1 -0
  451. package/dist/ui/_next/static/chunks/e212cf1f5a503899.js +1 -0
  452. package/dist/ui/_next/static/chunks/e2bfdac0a2305cc1.js +1 -0
  453. package/dist/ui/_next/static/chunks/e2dce648399ad4d4.js +1 -0
  454. package/dist/ui/_next/static/chunks/e318291bb8d74aee.js +1 -0
  455. package/dist/ui/_next/static/chunks/e33e40c2e7ab7629.js +1 -0
  456. package/dist/ui/_next/static/chunks/e410dfbcccddc478.js +1 -0
  457. package/dist/ui/_next/static/chunks/e411d58b52ab342b.js +1 -0
  458. package/dist/ui/_next/static/chunks/e57f7ffd0803a922.js +117 -0
  459. package/dist/ui/_next/static/chunks/e6b56ceb762e84c4.js +1 -0
  460. package/dist/ui/_next/static/chunks/e6d9a6ca68017eef.js +1 -0
  461. package/dist/ui/_next/static/chunks/e6ec2663605cf5a7.js +29 -0
  462. package/dist/ui/_next/static/chunks/e834330589be0639.js +1 -0
  463. package/dist/ui/_next/static/chunks/e8f662ba8bc76802.js +1 -0
  464. package/dist/ui/_next/static/chunks/e9e8e72d7ff45812.js +1 -0
  465. package/dist/ui/_next/static/chunks/eadd25eb66104a63.js +1 -0
  466. package/dist/ui/_next/static/chunks/ec3a7a7f48a8aca9.js +1 -0
  467. package/dist/ui/_next/static/chunks/ed62e349fb1ce14c.js +1 -0
  468. package/dist/ui/_next/static/chunks/ed6caa113f5769a5.js +1 -0
  469. package/dist/ui/_next/static/chunks/f02ac565bb5bc450.js +1 -0
  470. package/dist/ui/_next/static/chunks/f1a7a173e3da4ff4.js +1 -0
  471. package/dist/ui/_next/static/chunks/f268093817d3b260.js +1 -0
  472. package/dist/ui/_next/static/chunks/f6f811ccfe79e963.js +1 -0
  473. package/dist/ui/_next/static/chunks/f8955634331fd956.js +1 -0
  474. package/dist/ui/_next/static/chunks/f8c965a996875e30.js +56 -0
  475. package/dist/ui/_next/static/chunks/f9bb8411d37b06d7.js +1 -0
  476. package/dist/ui/_next/static/chunks/f9d4f77d8c130497.js +1 -0
  477. package/dist/ui/_next/static/chunks/fba113a516eb485f.js +1 -0
  478. package/dist/ui/_next/static/chunks/fc069e49a569d83c.js +1 -0
  479. package/dist/ui/_next/static/chunks/fc245016ffebdde3.js +1 -0
  480. package/dist/ui/_next/static/chunks/fc2d01d74dcf3921.js +1 -0
  481. package/dist/ui/_next/static/chunks/fe2ad0e00041a87d.js +1 -0
  482. package/dist/ui/_next/static/chunks/fe571740188dea3a.js +1 -0
  483. package/dist/ui/_next/static/chunks/turbopack-a5ce95b200d58f7a.js +4 -0
  484. package/dist/ui/_next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  485. package/dist/ui/_next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  486. package/dist/ui/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  487. package/dist/ui/_next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  488. package/dist/ui/_next/static/media/KaTeX_AMS-Regular.892f691b.ttf +0 -0
  489. package/dist/ui/_next/static/media/KaTeX_AMS-Regular.c30af439.woff2 +0 -0
  490. package/dist/ui/_next/static/media/KaTeX_AMS-Regular.e6a3cada.woff +0 -0
  491. package/dist/ui/_next/static/media/KaTeX_Caligraphic-Bold.2f97783e.woff +0 -0
  492. package/dist/ui/_next/static/media/KaTeX_Caligraphic-Bold.a36b8125.ttf +0 -0
  493. package/dist/ui/_next/static/media/KaTeX_Caligraphic-Bold.db991531.woff2 +0 -0
  494. package/dist/ui/_next/static/media/KaTeX_Caligraphic-Regular.2b13f013.woff +0 -0
  495. package/dist/ui/_next/static/media/KaTeX_Caligraphic-Regular.7c50032c.ttf +0 -0
  496. package/dist/ui/_next/static/media/KaTeX_Caligraphic-Regular.c20eee08.woff2 +0 -0
  497. package/dist/ui/_next/static/media/KaTeX_Fraktur-Bold.5fa2f5e4.woff +0 -0
  498. package/dist/ui/_next/static/media/KaTeX_Fraktur-Bold.d514bd28.woff2 +0 -0
  499. package/dist/ui/_next/static/media/KaTeX_Fraktur-Bold.e311399d.ttf +0 -0
  500. package/dist/ui/_next/static/media/KaTeX_Fraktur-Regular.18139813.woff +0 -0
  501. package/dist/ui/_next/static/media/KaTeX_Fraktur-Regular.2a73476d.ttf +0 -0
  502. package/dist/ui/_next/static/media/KaTeX_Fraktur-Regular.5d62e468.woff2 +0 -0
  503. package/dist/ui/_next/static/media/KaTeX_Main-Bold.6d137c77.ttf +0 -0
  504. package/dist/ui/_next/static/media/KaTeX_Main-Bold.c24b5ba7.woff +0 -0
  505. package/dist/ui/_next/static/media/KaTeX_Main-Bold.f4e2828d.woff2 +0 -0
  506. package/dist/ui/_next/static/media/KaTeX_Main-BoldItalic.079b33ae.woff +0 -0
  507. package/dist/ui/_next/static/media/KaTeX_Main-BoldItalic.c003d3ec.ttf +0 -0
  508. package/dist/ui/_next/static/media/KaTeX_Main-BoldItalic.f1884480.woff2 +0 -0
  509. package/dist/ui/_next/static/media/KaTeX_Main-Italic.26a3619b.woff +0 -0
  510. package/dist/ui/_next/static/media/KaTeX_Main-Italic.61da3e93.ttf +0 -0
  511. package/dist/ui/_next/static/media/KaTeX_Main-Italic.a3746929.woff2 +0 -0
  512. package/dist/ui/_next/static/media/KaTeX_Main-Regular.12644167.woff2 +0 -0
  513. package/dist/ui/_next/static/media/KaTeX_Main-Regular.876b86ad.ttf +0 -0
  514. package/dist/ui/_next/static/media/KaTeX_Main-Regular.d511f158.woff +0 -0
  515. package/dist/ui/_next/static/media/KaTeX_Math-BoldItalic.5c6a6a93.woff2 +0 -0
  516. package/dist/ui/_next/static/media/KaTeX_Math-BoldItalic.ad4dffd5.woff +0 -0
  517. package/dist/ui/_next/static/media/KaTeX_Math-BoldItalic.e73b3bf0.ttf +0 -0
  518. package/dist/ui/_next/static/media/KaTeX_Math-Italic.03974bc4.ttf +0 -0
  519. package/dist/ui/_next/static/media/KaTeX_Math-Italic.1cd2c488.woff +0 -0
  520. package/dist/ui/_next/static/media/KaTeX_Math-Italic.d8564edb.woff2 +0 -0
  521. package/dist/ui/_next/static/media/KaTeX_SansSerif-Bold.a03f9428.woff2 +0 -0
  522. package/dist/ui/_next/static/media/KaTeX_SansSerif-Bold.d4608ed5.ttf +0 -0
  523. package/dist/ui/_next/static/media/KaTeX_SansSerif-Bold.ff51ef5c.woff +0 -0
  524. package/dist/ui/_next/static/media/KaTeX_SansSerif-Italic.8ed740d6.woff +0 -0
  525. package/dist/ui/_next/static/media/KaTeX_SansSerif-Italic.9245afda.woff2 +0 -0
  526. package/dist/ui/_next/static/media/KaTeX_SansSerif-Italic.c0b22b1e.ttf +0 -0
  527. package/dist/ui/_next/static/media/KaTeX_SansSerif-Regular.128c9bc2.woff2 +0 -0
  528. package/dist/ui/_next/static/media/KaTeX_SansSerif-Regular.156dbd4e.ttf +0 -0
  529. package/dist/ui/_next/static/media/KaTeX_SansSerif-Regular.ee7b0a16.woff +0 -0
  530. package/dist/ui/_next/static/media/KaTeX_Script-Regular.00d9a561.ttf +0 -0
  531. package/dist/ui/_next/static/media/KaTeX_Script-Regular.186c7155.woff2 +0 -0
  532. package/dist/ui/_next/static/media/KaTeX_Script-Regular.afc2fd5a.woff +0 -0
  533. package/dist/ui/_next/static/media/KaTeX_Size1-Regular.4450ef36.woff2 +0 -0
  534. package/dist/ui/_next/static/media/KaTeX_Size1-Regular.9aaff96b.ttf +0 -0
  535. package/dist/ui/_next/static/media/KaTeX_Size1-Regular.e5bf4c74.woff +0 -0
  536. package/dist/ui/_next/static/media/KaTeX_Size2-Regular.6a97527b.woff2 +0 -0
  537. package/dist/ui/_next/static/media/KaTeX_Size2-Regular.8fbd32af.woff +0 -0
  538. package/dist/ui/_next/static/media/KaTeX_Size2-Regular.f11810ed.ttf +0 -0
  539. package/dist/ui/_next/static/media/KaTeX_Size3-Regular.45ae8eba.woff +0 -0
  540. package/dist/ui/_next/static/media/KaTeX_Size3-Regular.54b7ce9d.woff2 +0 -0
  541. package/dist/ui/_next/static/media/KaTeX_Size3-Regular.9812ade2.ttf +0 -0
  542. package/dist/ui/_next/static/media/KaTeX_Size4-Regular.44a4d487.ttf +0 -0
  543. package/dist/ui/_next/static/media/KaTeX_Size4-Regular.927fc5b9.woff2 +0 -0
  544. package/dist/ui/_next/static/media/KaTeX_Size4-Regular.b211e3d3.woff +0 -0
  545. package/dist/ui/_next/static/media/KaTeX_Typewriter-Regular.68b6c3a9.woff +0 -0
  546. package/dist/ui/_next/static/media/KaTeX_Typewriter-Regular.a1a7ff52.ttf +0 -0
  547. package/dist/ui/_next/static/media/KaTeX_Typewriter-Regular.ff99d643.woff2 +0 -0
  548. package/dist/ui/_next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  549. package/dist/ui/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  550. package/dist/ui/_next/static/media/favicon.0b3bf435.ico +0 -0
  551. package/dist/ui/_not-found/__next._full.txt +18 -0
  552. package/dist/ui/_not-found/__next._head.txt +6 -0
  553. package/dist/ui/_not-found/__next._index.txt +9 -0
  554. package/dist/ui/_not-found/__next._not-found.__PAGE__.txt +5 -0
  555. package/dist/ui/_not-found/__next._not-found.txt +4 -0
  556. package/dist/ui/_not-found/__next._tree.txt +3 -0
  557. package/dist/ui/_not-found/index.html +1 -0
  558. package/dist/ui/_not-found/index.txt +18 -0
  559. package/dist/ui/favicon.ico +0 -0
  560. package/dist/ui/file.svg +1 -0
  561. package/dist/ui/globe.svg +1 -0
  562. package/dist/ui/index.html +1 -0
  563. package/dist/ui/index.txt +25 -0
  564. package/dist/ui/next.svg +1 -0
  565. package/dist/ui/vercel.svg +1 -0
  566. package/dist/ui/window.svg +1 -0
  567. package/dist/utils/chat-model.d.ts +11 -0
  568. package/dist/utils/chat-model.js +37 -0
  569. package/dist/utils/diff-parser.d.ts +20 -0
  570. package/dist/utils/diff-parser.js +100 -0
  571. package/dist/utils/proxy-manager.d.ts +18 -0
  572. package/dist/utils/proxy-manager.js +42 -0
  573. package/dist/utils/remote-proxy.d.ts +40 -0
  574. package/dist/utils/remote-proxy.js +145 -0
  575. package/dist/utils/worktree-paths.d.ts +13 -0
  576. package/dist/utils/worktree-paths.js +64 -0
  577. package/dist/virtual-ws-adapter.d.ts +26 -0
  578. package/dist/virtual-ws-adapter.js +54 -0
  579. package/package.json +19 -0
@@ -0,0 +1,1073 @@
1
+ import Database from "better-sqlite3";
2
+ import { mkdir } from "fs/promises";
3
+ import path from "path";
4
+ import crypto from "crypto";
5
+ const createDatabase = (dbPath) => {
6
+ const db = new Database(dbPath);
7
+ db.pragma("journal_mode = WAL");
8
+ // Disable FK enforcement during schema creation/migration to avoid errors
9
+ // when DROP TABLE + recreate migrations run on existing databases with FK references
10
+ db.pragma("foreign_keys = OFF");
11
+ db.exec(`
12
+ CREATE TABLE IF NOT EXISTS projects (
13
+ id TEXT PRIMARY KEY,
14
+ name TEXT NOT NULL,
15
+ path TEXT,
16
+ remote_path TEXT,
17
+ is_remote INTEGER DEFAULT 0,
18
+ remote_url TEXT,
19
+ remote_api_key TEXT,
20
+ remote_project_id TEXT,
21
+ user_id TEXT NOT NULL DEFAULT '',
22
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
23
+ );
24
+
25
+ CREATE TABLE IF NOT EXISTS executor_groups (
26
+ id TEXT PRIMARY KEY,
27
+ project_id TEXT NOT NULL,
28
+ name TEXT NOT NULL,
29
+ branch TEXT NOT NULL DEFAULT '',
30
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
31
+ UNIQUE(project_id, branch),
32
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
33
+ );
34
+
35
+ CREATE TABLE IF NOT EXISTS executors (
36
+ id TEXT PRIMARY KEY,
37
+ project_id TEXT NOT NULL,
38
+ group_id TEXT,
39
+ name TEXT NOT NULL,
40
+ command TEXT NOT NULL,
41
+ executor_type TEXT DEFAULT 'command',
42
+ prompt_provider TEXT,
43
+ cwd TEXT,
44
+ pty INTEGER DEFAULT 1,
45
+ position INTEGER DEFAULT 0,
46
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
47
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
48
+ FOREIGN KEY (group_id) REFERENCES executor_groups(id) ON DELETE CASCADE
49
+ );
50
+
51
+ CREATE TABLE IF NOT EXISTS executor_processes (
52
+ id TEXT PRIMARY KEY,
53
+ executor_id TEXT NOT NULL,
54
+ pid INTEGER,
55
+ status TEXT NOT NULL DEFAULT 'running',
56
+ exit_code INTEGER,
57
+ started_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
58
+ finished_at TIMESTAMP,
59
+ FOREIGN KEY (executor_id) REFERENCES executors(id) ON DELETE CASCADE
60
+ );
61
+
62
+ CREATE TABLE IF NOT EXISTS agent_sessions (
63
+ id TEXT PRIMARY KEY,
64
+ project_id TEXT NOT NULL,
65
+ branch TEXT NOT NULL DEFAULT '',
66
+ status TEXT NOT NULL DEFAULT 'running',
67
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
68
+ UNIQUE(project_id, branch),
69
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
70
+ );
71
+
72
+ CREATE TABLE IF NOT EXISTS tasks (
73
+ id TEXT PRIMARY KEY,
74
+ project_id TEXT NOT NULL,
75
+ title TEXT NOT NULL,
76
+ description TEXT,
77
+ status TEXT NOT NULL DEFAULT 'todo',
78
+ priority TEXT NOT NULL DEFAULT 'medium',
79
+ position INTEGER NOT NULL DEFAULT 0,
80
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
81
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
82
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
83
+ );
84
+
85
+ CREATE TABLE IF NOT EXISTS global_settings (
86
+ key TEXT PRIMARY KEY,
87
+ value TEXT NOT NULL
88
+ );
89
+
90
+ CREATE TABLE IF NOT EXISTS remote_servers (
91
+ id TEXT PRIMARY KEY,
92
+ name TEXT NOT NULL,
93
+ url TEXT UNIQUE,
94
+ api_key TEXT,
95
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
96
+ updated_at TEXT NOT NULL DEFAULT (datetime('now'))
97
+ );
98
+
99
+ CREATE TABLE IF NOT EXISTS project_remotes (
100
+ id TEXT PRIMARY KEY,
101
+ project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
102
+ remote_server_id TEXT NOT NULL REFERENCES remote_servers(id),
103
+ remote_path TEXT NOT NULL,
104
+ sort_order INTEGER NOT NULL DEFAULT 0,
105
+ sync_up_config TEXT,
106
+ sync_down_config TEXT,
107
+ UNIQUE(project_id, remote_server_id)
108
+ );
109
+ `);
110
+ // Migration: add pty column to existing executors table if not present
111
+ const tableInfo = db.prepare("PRAGMA table_info(executors)").all();
112
+ const hasPtyColumn = tableInfo.some((col) => col.name === "pty");
113
+ if (!hasPtyColumn) {
114
+ db.exec("ALTER TABLE executors ADD COLUMN pty INTEGER DEFAULT 1");
115
+ }
116
+ // Migration: add position column to existing executors table if not present
117
+ const hasPositionColumn = tableInfo.some((col) => col.name === "position");
118
+ if (!hasPositionColumn) {
119
+ db.exec("ALTER TABLE executors ADD COLUMN position INTEGER DEFAULT 0");
120
+ // Initialize positions based on created_at order
121
+ db.exec(`
122
+ UPDATE executors SET position = (
123
+ SELECT COUNT(*) FROM executors e2
124
+ WHERE e2.project_id = executors.project_id
125
+ AND e2.created_at <= executors.created_at
126
+ ) - 1
127
+ `);
128
+ }
129
+ // Migration: add executor_type column to executors table
130
+ const hasExecutorTypeColumn = tableInfo.some((col) => col.name === "executor_type");
131
+ if (!hasExecutorTypeColumn) {
132
+ db.exec("ALTER TABLE executors ADD COLUMN executor_type TEXT DEFAULT 'command'");
133
+ }
134
+ // Migration: add prompt_provider column to executors table
135
+ const hasPromptProviderColumn = tableInfo.some((col) => col.name === "prompt_provider");
136
+ if (!hasPromptProviderColumn) {
137
+ db.exec("ALTER TABLE executors ADD COLUMN prompt_provider TEXT DEFAULT NULL");
138
+ }
139
+ // Migration: add remote project columns to existing projects table if not present
140
+ const projectTableInfo = db.prepare("PRAGMA table_info(projects)").all();
141
+ const hasIsRemoteColumn = projectTableInfo.some((col) => col.name === "is_remote");
142
+ if (!hasIsRemoteColumn) {
143
+ db.exec("ALTER TABLE projects ADD COLUMN is_remote INTEGER DEFAULT 0");
144
+ db.exec("ALTER TABLE projects ADD COLUMN remote_url TEXT");
145
+ db.exec("ALTER TABLE projects ADD COLUMN remote_api_key TEXT");
146
+ db.exec("ALTER TABLE projects ADD COLUMN remote_project_id TEXT");
147
+ }
148
+ // Migration: add remote_path column and migrate existing remote projects
149
+ const hasRemotePathColumn = projectTableInfo.some((col) => col.name === "remote_path");
150
+ if (!hasRemotePathColumn) {
151
+ db.exec("ALTER TABLE projects ADD COLUMN remote_path TEXT");
152
+ // Migrate existing remote projects: move path to remote_path, clear path
153
+ db.exec("UPDATE projects SET remote_path = path, path = NULL WHERE is_remote = 1");
154
+ }
155
+ // Migration: add agent_mode and executor_mode columns
156
+ const hasAgentModeColumn = projectTableInfo.some((col) => col.name === "agent_mode");
157
+ if (!hasAgentModeColumn) {
158
+ db.exec("ALTER TABLE projects ADD COLUMN agent_mode TEXT DEFAULT 'local'");
159
+ db.exec("ALTER TABLE projects ADD COLUMN executor_mode TEXT DEFAULT 'local'");
160
+ db.exec("UPDATE projects SET agent_mode = 'local' WHERE agent_mode IS NULL");
161
+ db.exec("UPDATE projects SET executor_mode = 'local' WHERE executor_mode IS NULL");
162
+ }
163
+ // Migration: add sync button config columns
164
+ const hasSyncUpConfigColumn = projectTableInfo.some((col) => col.name === "sync_up_config");
165
+ if (!hasSyncUpConfigColumn) {
166
+ db.exec("ALTER TABLE projects ADD COLUMN sync_up_config TEXT");
167
+ db.exec("ALTER TABLE projects ADD COLUMN sync_down_config TEXT");
168
+ }
169
+ // Migration: add user_id column for Clerk authentication
170
+ const hasUserIdColumn = projectTableInfo.some((col) => col.name === "user_id");
171
+ if (!hasUserIdColumn) {
172
+ db.exec("ALTER TABLE projects ADD COLUMN user_id TEXT NOT NULL DEFAULT ''");
173
+ db.exec("CREATE INDEX IF NOT EXISTS idx_projects_user_id ON projects(user_id)");
174
+ }
175
+ // Migration: add executor_groups table and group_id column to executors
176
+ const hasGroupIdColumn = tableInfo.some((col) => col.name === "group_id");
177
+ if (!hasGroupIdColumn) {
178
+ db.exec(`
179
+ CREATE TABLE IF NOT EXISTS executor_groups (
180
+ id TEXT PRIMARY KEY,
181
+ project_id TEXT NOT NULL,
182
+ name TEXT NOT NULL,
183
+ branch TEXT NOT NULL DEFAULT '',
184
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
185
+ UNIQUE(project_id, branch),
186
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
187
+ )
188
+ `);
189
+ db.exec("ALTER TABLE executors ADD COLUMN group_id TEXT REFERENCES executor_groups(id) ON DELETE CASCADE");
190
+ // Create a "Default" group for each project and assign existing executors to it
191
+ const projects = db.prepare("SELECT DISTINCT project_id FROM executors").all();
192
+ for (const { project_id } of projects) {
193
+ const groupId = `default-${project_id}`;
194
+ db.prepare("INSERT OR IGNORE INTO executor_groups (id, project_id, name, branch) VALUES (@id, @project_id, 'Default', '')").run({ id: groupId, project_id });
195
+ db.prepare("UPDATE executors SET group_id = @group_id WHERE project_id = @project_id AND group_id IS NULL").run({ group_id: groupId, project_id });
196
+ }
197
+ }
198
+ // Migration: add assigned_branch column to tasks table
199
+ const taskTableInfo = db.prepare("PRAGMA table_info(tasks)").all();
200
+ const hasAssignedBranchColumn = taskTableInfo.some((col) => col.name === "assigned_branch");
201
+ if (!hasAssignedBranchColumn) {
202
+ db.exec("ALTER TABLE tasks ADD COLUMN assigned_branch TEXT DEFAULT NULL");
203
+ }
204
+ // Migration: rename worktree_path to branch in agent_sessions
205
+ const sessionTableInfo = db.prepare("PRAGMA table_info(agent_sessions)").all();
206
+ const hasWorktreePathColumn = sessionTableInfo.some((col) => col.name === "worktree_path");
207
+ if (hasWorktreePathColumn) {
208
+ // Sessions are ephemeral - clear stale rows and recreate table
209
+ db.exec("DROP TABLE agent_sessions");
210
+ db.exec(`
211
+ CREATE TABLE agent_sessions (
212
+ id TEXT PRIMARY KEY,
213
+ project_id TEXT NOT NULL,
214
+ branch TEXT NOT NULL DEFAULT '',
215
+ status TEXT NOT NULL DEFAULT 'running',
216
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
217
+ UNIQUE(project_id, branch),
218
+ FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
219
+ )
220
+ `);
221
+ }
222
+ // Migration: add permission_mode column to agent_sessions
223
+ const sessionInfo2 = db.prepare("PRAGMA table_info(agent_sessions)").all();
224
+ if (!sessionInfo2.some(col => col.name === "permission_mode")) {
225
+ db.exec("ALTER TABLE agent_sessions ADD COLUMN permission_mode TEXT DEFAULT 'edit'");
226
+ }
227
+ // Migration: add agent_type column to agent_sessions
228
+ if (!sessionInfo2.some(col => col.name === "agent_type")) {
229
+ db.exec("ALTER TABLE agent_sessions ADD COLUMN agent_type TEXT DEFAULT 'claude-code'");
230
+ }
231
+ // Migration: add pid column to executor_processes
232
+ const processTableInfo = db.prepare("PRAGMA table_info(executor_processes)").all();
233
+ if (!processTableInfo.some(col => col.name === "pid")) {
234
+ db.exec("ALTER TABLE executor_processes ADD COLUMN pid INTEGER");
235
+ }
236
+ // Clean up stale "running" processes from previous server instances
237
+ db.exec("UPDATE executor_processes SET status = 'killed', finished_at = CURRENT_TIMESTAMP WHERE status = 'running'");
238
+ // Create agent_session_entries table for conversation persistence
239
+ db.exec(`
240
+ CREATE TABLE IF NOT EXISTS agent_session_entries (
241
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
242
+ session_id TEXT NOT NULL,
243
+ entry_index INTEGER NOT NULL,
244
+ data TEXT NOT NULL,
245
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
246
+ UNIQUE(session_id, entry_index),
247
+ FOREIGN KEY (session_id) REFERENCES agent_sessions(id) ON DELETE CASCADE
248
+ )
249
+ `);
250
+ // Migration: existing remote projects → remote_servers + project_remotes
251
+ // This migrates data from the old single-remote model (remote_url on projects table)
252
+ // into the new multi-remote model (remote_servers + project_remotes tables).
253
+ // Idempotent: checks for existing records before inserting.
254
+ {
255
+ const existingRemotes = db.prepare(`SELECT DISTINCT remote_url, remote_api_key FROM projects WHERE remote_url IS NOT NULL AND remote_url != ''`).all();
256
+ for (const row of existingRemotes) {
257
+ const existing = db.prepare(`SELECT id FROM remote_servers WHERE url = ?`).get(row.remote_url);
258
+ if (!existing) {
259
+ let name;
260
+ try {
261
+ name = new URL(row.remote_url).hostname;
262
+ }
263
+ catch {
264
+ name = row.remote_url;
265
+ }
266
+ const id = crypto.randomUUID();
267
+ db.prepare(`INSERT INTO remote_servers (id, name, url, api_key, created_at, updated_at) VALUES (?, ?, ?, ?, datetime('now'), datetime('now'))`).run(id, name, row.remote_url, row.remote_api_key);
268
+ }
269
+ }
270
+ const projectsWithRemote = db.prepare(`SELECT id, remote_url, remote_path, sync_up_config, sync_down_config, agent_mode, executor_mode FROM projects WHERE remote_url IS NOT NULL AND remote_url != ''`).all();
271
+ for (const proj of projectsWithRemote) {
272
+ const server = db.prepare(`SELECT id FROM remote_servers WHERE url = ?`).get(proj.remote_url);
273
+ if (!server)
274
+ continue;
275
+ const existingLink = db.prepare(`SELECT id FROM project_remotes WHERE project_id = ? AND remote_server_id = ?`).get(proj.id, server.id);
276
+ if (!existingLink && proj.remote_path) {
277
+ db.prepare(`INSERT INTO project_remotes (id, project_id, remote_server_id, remote_path, sort_order, sync_up_config, sync_down_config) VALUES (?, ?, ?, ?, 0, ?, ?)`).run(crypto.randomUUID(), proj.id, server.id, proj.remote_path, proj.sync_up_config, proj.sync_down_config);
278
+ }
279
+ // Update agent_mode/executor_mode from 'remote' to the corresponding remote_server_id
280
+ if (proj.agent_mode === 'remote') {
281
+ db.prepare(`UPDATE projects SET agent_mode = ? WHERE id = ?`).run(server.id, proj.id);
282
+ }
283
+ if (proj.executor_mode === 'remote') {
284
+ db.prepare(`UPDATE projects SET executor_mode = ? WHERE id = ?`).run(server.id, proj.id);
285
+ }
286
+ }
287
+ }
288
+ // Migration: add reverse-connect columns to remote_servers
289
+ const remoteServerTableInfo = db.prepare("PRAGMA table_info(remote_servers)").all();
290
+ if (!remoteServerTableInfo.some(col => col.name === "connection_mode")) {
291
+ db.exec("ALTER TABLE remote_servers ADD COLUMN connection_mode TEXT NOT NULL DEFAULT 'outbound'");
292
+ db.exec("ALTER TABLE remote_servers ADD COLUMN connect_token TEXT");
293
+ db.exec("ALTER TABLE remote_servers ADD COLUMN connect_token_created_at TEXT");
294
+ db.exec("ALTER TABLE remote_servers ADD COLUMN status TEXT NOT NULL DEFAULT 'unknown'");
295
+ db.exec("ALTER TABLE remote_servers ADD COLUMN last_connected_at TEXT");
296
+ }
297
+ // Migration: add user_id column and change UNIQUE(url) to UNIQUE(url, user_id) for multi-user isolation
298
+ const remoteServerTableInfoV2 = db.prepare("PRAGMA table_info(remote_servers)").all();
299
+ if (!remoteServerTableInfoV2.some(col => col.name === "user_id")) {
300
+ db.exec(`
301
+ BEGIN;
302
+ ALTER TABLE remote_servers ADD COLUMN user_id TEXT NOT NULL DEFAULT '';
303
+ CREATE TABLE remote_servers_new (
304
+ id TEXT PRIMARY KEY,
305
+ name TEXT NOT NULL,
306
+ url TEXT,
307
+ api_key TEXT,
308
+ connection_mode TEXT NOT NULL DEFAULT 'outbound',
309
+ connect_token TEXT,
310
+ connect_token_created_at TEXT,
311
+ status TEXT NOT NULL DEFAULT 'unknown',
312
+ last_connected_at TEXT,
313
+ user_id TEXT NOT NULL DEFAULT '',
314
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
315
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
316
+ UNIQUE(url, user_id)
317
+ );
318
+ INSERT INTO remote_servers_new SELECT
319
+ id, name, url, api_key, connection_mode, connect_token, connect_token_created_at,
320
+ status, last_connected_at, user_id, created_at, updated_at
321
+ FROM remote_servers;
322
+ DROP TABLE remote_servers;
323
+ ALTER TABLE remote_servers_new RENAME TO remote_servers;
324
+ CREATE INDEX IF NOT EXISTS idx_remote_servers_user_id ON remote_servers(user_id);
325
+ COMMIT;
326
+ `);
327
+ }
328
+ // Migration: make url nullable in remote_servers (allows multiple inbound servers with NULL url)
329
+ {
330
+ const rsInfo = db.prepare("PRAGMA table_info(remote_servers)").all();
331
+ const urlCol = rsInfo.find(col => col.name === "url");
332
+ if (urlCol && urlCol.notnull === 1) {
333
+ db.exec(`
334
+ BEGIN;
335
+ CREATE TABLE remote_servers_new (
336
+ id TEXT PRIMARY KEY,
337
+ name TEXT NOT NULL,
338
+ url TEXT,
339
+ api_key TEXT,
340
+ connection_mode TEXT NOT NULL DEFAULT 'outbound',
341
+ connect_token TEXT,
342
+ connect_token_created_at TEXT,
343
+ status TEXT NOT NULL DEFAULT 'unknown',
344
+ last_connected_at TEXT,
345
+ user_id TEXT NOT NULL DEFAULT '',
346
+ created_at TEXT NOT NULL DEFAULT (datetime('now')),
347
+ updated_at TEXT NOT NULL DEFAULT (datetime('now')),
348
+ UNIQUE(url, user_id)
349
+ );
350
+ INSERT INTO remote_servers_new SELECT
351
+ id, name, url, api_key, connection_mode, connect_token, connect_token_created_at,
352
+ status, last_connected_at, user_id, created_at, updated_at
353
+ FROM remote_servers;
354
+ DROP TABLE remote_servers;
355
+ ALTER TABLE remote_servers_new RENAME TO remote_servers;
356
+ UPDATE remote_servers SET url = NULL WHERE url = '';
357
+ CREATE INDEX IF NOT EXISTS idx_remote_servers_user_id ON remote_servers(user_id);
358
+ COMMIT;
359
+ `);
360
+ }
361
+ }
362
+ // Migration: drop old UNIQUE(path, is_remote, remote_url) constraint on projects
363
+ // Commit b4ef7b5 removed it from CREATE TABLE but existing databases still have it,
364
+ // causing UNIQUE constraint failures when creating pseudo-project rows.
365
+ {
366
+ const oldIndex = db.prepare(`SELECT name FROM sqlite_master WHERE type='index' AND tbl_name='projects' AND sql LIKE '%path%is_remote%remote_url%'`).get();
367
+ if (oldIndex) {
368
+ db.exec(`
369
+ BEGIN;
370
+ CREATE TABLE projects_new (
371
+ id TEXT PRIMARY KEY,
372
+ name TEXT NOT NULL,
373
+ path TEXT,
374
+ remote_path TEXT,
375
+ is_remote INTEGER DEFAULT 0,
376
+ remote_url TEXT,
377
+ remote_api_key TEXT,
378
+ remote_project_id TEXT,
379
+ user_id TEXT NOT NULL DEFAULT '',
380
+ agent_mode TEXT DEFAULT 'local',
381
+ executor_mode TEXT DEFAULT 'local',
382
+ sync_up_config TEXT,
383
+ sync_down_config TEXT,
384
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
385
+ );
386
+ INSERT INTO projects_new SELECT
387
+ id, name, path, remote_path, is_remote, remote_url, remote_api_key, remote_project_id,
388
+ user_id, agent_mode, executor_mode, sync_up_config, sync_down_config, created_at
389
+ FROM projects;
390
+ DROP TABLE projects;
391
+ ALTER TABLE projects_new RENAME TO projects;
392
+ CREATE INDEX IF NOT EXISTS idx_projects_user_id ON projects(user_id);
393
+ COMMIT;
394
+ `);
395
+ }
396
+ }
397
+ // Re-enable FK enforcement for runtime operations
398
+ db.pragma("foreign_keys = ON");
399
+ return db;
400
+ };
401
+ export const createSqliteStorage = async (dbPath) => {
402
+ await mkdir(path.dirname(dbPath), { recursive: true });
403
+ const db = createDatabase(dbPath);
404
+ // Helper to convert SQLite project row to Project interface
405
+ const toProject = (row) => ({
406
+ id: row.id,
407
+ name: row.name,
408
+ path: row.path,
409
+ is_remote: row.is_remote === 1,
410
+ remote_path: row.remote_path ?? undefined,
411
+ remote_url: row.remote_url ?? undefined,
412
+ remote_api_key: row.remote_api_key ?? undefined,
413
+ agent_mode: row.agent_mode ?? 'local',
414
+ executor_mode: row.executor_mode ?? 'local',
415
+ sync_up_config: row.sync_up_config ? JSON.parse(row.sync_up_config) : undefined,
416
+ sync_down_config: row.sync_down_config ? JSON.parse(row.sync_down_config) : undefined,
417
+ created_at: row.created_at,
418
+ });
419
+ const toRemoteServer = (row) => ({
420
+ id: row.id,
421
+ name: row.name,
422
+ url: row.url,
423
+ api_key: row.api_key ?? undefined,
424
+ connection_mode: row.connection_mode ?? 'outbound',
425
+ connect_token: row.connect_token ?? undefined,
426
+ connect_token_created_at: row.connect_token_created_at ?? undefined,
427
+ status: row.status ?? 'unknown',
428
+ last_connected_at: row.last_connected_at ?? undefined,
429
+ created_at: row.created_at,
430
+ updated_at: row.updated_at,
431
+ });
432
+ const mapExecutorRow = (row) => ({
433
+ ...row,
434
+ executor_type: (row.executor_type || 'command'),
435
+ prompt_provider: row.prompt_provider ?? null,
436
+ pty: row.pty === 1,
437
+ });
438
+ return {
439
+ projects: {
440
+ create: ({ id, name, path: projectPath, remote_path, remote_url, remote_api_key, agent_mode, executor_mode, sync_up_config, sync_down_config }, userId) => {
441
+ const is_remote = remote_url ? 1 : 0;
442
+ db.prepare(`INSERT INTO projects (id, name, path, remote_path, is_remote, remote_url, remote_api_key, agent_mode, executor_mode, sync_up_config, sync_down_config, user_id)
443
+ VALUES (@id, @name, @path, @remote_path, @is_remote, @remote_url, @remote_api_key, @agent_mode, @executor_mode, @sync_up_config, @sync_down_config, @user_id)`).run({
444
+ id,
445
+ name,
446
+ path: projectPath ?? null,
447
+ remote_path: remote_path ?? null,
448
+ is_remote,
449
+ remote_url: remote_url ?? null,
450
+ remote_api_key: remote_api_key ?? null,
451
+ agent_mode: agent_mode ?? 'local',
452
+ executor_mode: executor_mode ?? 'local',
453
+ sync_up_config: sync_up_config ? JSON.stringify(sync_up_config) : null,
454
+ sync_down_config: sync_down_config ? JSON.stringify(sync_down_config) : null,
455
+ user_id: userId ?? '',
456
+ });
457
+ const row = db
458
+ .prepare(`SELECT * FROM projects WHERE id = @id`)
459
+ .get({ id });
460
+ return toProject(row);
461
+ },
462
+ getAll: (userId) => {
463
+ if (userId) {
464
+ const rows = db
465
+ .prepare(`SELECT * FROM projects WHERE user_id = @user_id ORDER BY created_at DESC`)
466
+ .all({ user_id: userId });
467
+ return rows.map(toProject);
468
+ }
469
+ const rows = db
470
+ .prepare(`SELECT * FROM projects ORDER BY created_at DESC`)
471
+ .all({});
472
+ return rows.map(toProject);
473
+ },
474
+ getById: (id, userId) => {
475
+ if (userId) {
476
+ const row = db
477
+ .prepare(`SELECT * FROM projects WHERE id = @id AND user_id = @user_id`)
478
+ .get({ id, user_id: userId });
479
+ return row ? toProject(row) : undefined;
480
+ }
481
+ const row = db
482
+ .prepare(`SELECT * FROM projects WHERE id = @id`)
483
+ .get({ id });
484
+ return row ? toProject(row) : undefined;
485
+ },
486
+ getByPath: (projectPath) => {
487
+ const row = db
488
+ .prepare(`SELECT * FROM projects WHERE path = @path`)
489
+ .get({ path: projectPath });
490
+ return row ? toProject(row) : undefined;
491
+ },
492
+ update: (id, opts, userId) => {
493
+ const updates = [];
494
+ const params = { id };
495
+ if (opts.name !== undefined) {
496
+ updates.push('name = @name');
497
+ params.name = opts.name;
498
+ }
499
+ if (opts.path !== undefined) {
500
+ updates.push('path = @path');
501
+ params.path = opts.path;
502
+ }
503
+ if (opts.remote_path !== undefined) {
504
+ updates.push('remote_path = @remote_path');
505
+ params.remote_path = opts.remote_path;
506
+ }
507
+ if (opts.remote_url !== undefined) {
508
+ updates.push('remote_url = @remote_url');
509
+ params.remote_url = opts.remote_url;
510
+ }
511
+ if (opts.remote_api_key !== undefined) {
512
+ updates.push('remote_api_key = @remote_api_key');
513
+ params.remote_api_key = opts.remote_api_key;
514
+ }
515
+ if (opts.agent_mode !== undefined) {
516
+ updates.push('agent_mode = @agent_mode');
517
+ params.agent_mode = opts.agent_mode;
518
+ }
519
+ if (opts.executor_mode !== undefined) {
520
+ updates.push('executor_mode = @executor_mode');
521
+ params.executor_mode = opts.executor_mode;
522
+ }
523
+ if (opts.sync_up_config !== undefined) {
524
+ updates.push('sync_up_config = @sync_up_config');
525
+ params.sync_up_config = opts.sync_up_config ? JSON.stringify(opts.sync_up_config) : null;
526
+ }
527
+ if (opts.sync_down_config !== undefined) {
528
+ updates.push('sync_down_config = @sync_down_config');
529
+ params.sync_down_config = opts.sync_down_config ? JSON.stringify(opts.sync_down_config) : null;
530
+ }
531
+ // Auto-derive is_remote from remote_url
532
+ if (opts.remote_url !== undefined) {
533
+ updates.push('is_remote = @is_remote');
534
+ params.is_remote = opts.remote_url ? 1 : 0;
535
+ }
536
+ const ownerFilter = userId ? ' AND user_id = @user_id' : '';
537
+ if (userId)
538
+ params.user_id = userId;
539
+ if (updates.length === 0) {
540
+ const row = db.prepare(`SELECT * FROM projects WHERE id = @id${ownerFilter}`).get(params);
541
+ return row ? toProject(row) : undefined;
542
+ }
543
+ db.prepare(`UPDATE projects SET ${updates.join(', ')} WHERE id = @id${ownerFilter}`).run(params);
544
+ const row = db.prepare(`SELECT * FROM projects WHERE id = @id${ownerFilter}`).get(params);
545
+ return row ? toProject(row) : undefined;
546
+ },
547
+ delete: (id, userId) => {
548
+ if (userId) {
549
+ db.prepare(`DELETE FROM projects WHERE id = @id AND user_id = @user_id`).run({ id, user_id: userId });
550
+ }
551
+ else {
552
+ db.prepare(`DELETE FROM projects WHERE id = @id`).run({ id });
553
+ }
554
+ },
555
+ },
556
+ remoteServers: {
557
+ create: (server, userId) => {
558
+ const id = crypto.randomUUID();
559
+ const connectionMode = server.connection_mode ?? 'outbound';
560
+ db.prepare(`INSERT INTO remote_servers (id, name, url, api_key, connection_mode, user_id) VALUES (@id, @name, @url, @api_key, @connection_mode, @user_id)`).run({ id, name: server.name, url: server.url, api_key: server.api_key ?? null, connection_mode: connectionMode, user_id: userId ?? '' });
561
+ return toRemoteServer(db
562
+ .prepare(`SELECT * FROM remote_servers WHERE id = @id`)
563
+ .get({ id }));
564
+ },
565
+ getAll: (userId) => {
566
+ if (userId) {
567
+ return db
568
+ .prepare(`SELECT * FROM remote_servers WHERE user_id = @user_id ORDER BY created_at DESC`)
569
+ .all({ user_id: userId })
570
+ .map(toRemoteServer);
571
+ }
572
+ return db
573
+ .prepare(`SELECT * FROM remote_servers ORDER BY created_at DESC`)
574
+ .all({})
575
+ .map(toRemoteServer);
576
+ },
577
+ getById: (id, userId) => {
578
+ if (userId) {
579
+ const row = db
580
+ .prepare(`SELECT * FROM remote_servers WHERE id = @id AND user_id = @user_id`)
581
+ .get({ id, user_id: userId });
582
+ return row ? toRemoteServer(row) : undefined;
583
+ }
584
+ const row = db
585
+ .prepare(`SELECT * FROM remote_servers WHERE id = @id`)
586
+ .get({ id });
587
+ return row ? toRemoteServer(row) : undefined;
588
+ },
589
+ getByUrl: (url) => {
590
+ const row = db
591
+ .prepare(`SELECT * FROM remote_servers WHERE url = @url`)
592
+ .get({ url });
593
+ return row ? toRemoteServer(row) : undefined;
594
+ },
595
+ getByToken: (token) => {
596
+ const row = db
597
+ .prepare(`SELECT * FROM remote_servers WHERE connect_token = @token`)
598
+ .get({ token });
599
+ return row ? toRemoteServer(row) : undefined;
600
+ },
601
+ update: (id, opts, userId) => {
602
+ const updates = [];
603
+ const params = { id };
604
+ if (opts.name !== undefined) {
605
+ updates.push('name = @name');
606
+ params.name = opts.name;
607
+ }
608
+ if (opts.url !== undefined) {
609
+ updates.push('url = @url');
610
+ params.url = opts.url;
611
+ }
612
+ if (opts.api_key !== undefined) {
613
+ updates.push('api_key = @api_key');
614
+ params.api_key = opts.api_key;
615
+ }
616
+ if (opts.connection_mode !== undefined) {
617
+ updates.push('connection_mode = @connection_mode');
618
+ params.connection_mode = opts.connection_mode;
619
+ }
620
+ const ownerFilter = userId ? ' AND user_id = @user_id' : '';
621
+ if (userId)
622
+ params.user_id = userId;
623
+ if (updates.length === 0) {
624
+ const row = db.prepare(`SELECT * FROM remote_servers WHERE id = @id${ownerFilter}`).get(params);
625
+ return row ? toRemoteServer(row) : undefined;
626
+ }
627
+ updates.push("updated_at = datetime('now')");
628
+ db.prepare(`UPDATE remote_servers SET ${updates.join(', ')} WHERE id = @id${ownerFilter}`).run(params);
629
+ const row = db.prepare(`SELECT * FROM remote_servers WHERE id = @id${ownerFilter}`).get(params);
630
+ return row ? toRemoteServer(row) : undefined;
631
+ },
632
+ updateStatus: (id, status) => {
633
+ const updates = status === 'online'
634
+ ? "status = @status, last_connected_at = datetime('now'), updated_at = datetime('now')"
635
+ : "status = @status, updated_at = datetime('now')";
636
+ db.prepare(`UPDATE remote_servers SET ${updates} WHERE id = @id`).run({ id, status });
637
+ },
638
+ generateToken: (id, userId) => {
639
+ const ownerFilter = userId ? ' AND user_id = @user_id' : '';
640
+ const params = { id };
641
+ if (userId)
642
+ params.user_id = userId;
643
+ const existing = db.prepare(`SELECT * FROM remote_servers WHERE id = @id${ownerFilter}`).get(params);
644
+ if (!existing)
645
+ return undefined;
646
+ const token = crypto.randomBytes(32).toString('hex');
647
+ db.prepare(`UPDATE remote_servers SET connect_token = @token, connect_token_created_at = datetime('now'), updated_at = datetime('now') WHERE id = @id${ownerFilter}`).run({ ...params, token });
648
+ return token;
649
+ },
650
+ revokeToken: (id, userId) => {
651
+ const ownerFilter = userId ? ' AND user_id = @user_id' : '';
652
+ const params = { id };
653
+ if (userId)
654
+ params.user_id = userId;
655
+ const result = db.prepare(`UPDATE remote_servers SET connect_token = NULL, connect_token_created_at = NULL, updated_at = datetime('now') WHERE id = @id${ownerFilter}`).run(params);
656
+ return result.changes > 0;
657
+ },
658
+ delete: (id, userId) => {
659
+ if (userId) {
660
+ const result = db.prepare(`DELETE FROM remote_servers WHERE id = @id AND user_id = @user_id`).run({ id, user_id: userId });
661
+ return result.changes > 0;
662
+ }
663
+ const result = db.prepare(`DELETE FROM remote_servers WHERE id = @id`).run({ id });
664
+ return result.changes > 0;
665
+ },
666
+ },
667
+ projectRemotes: {
668
+ getByProject: (projectId) => {
669
+ const rows = db
670
+ .prepare(`SELECT pr.id, pr.project_id, pr.remote_server_id, pr.remote_path, pr.sort_order,
671
+ pr.sync_up_config, pr.sync_down_config,
672
+ rs.name as server_name, rs.url as server_url, rs.api_key as server_api_key
673
+ FROM project_remotes pr
674
+ JOIN remote_servers rs ON pr.remote_server_id = rs.id
675
+ WHERE pr.project_id = @project_id
676
+ ORDER BY pr.sort_order ASC`)
677
+ .all({ project_id: projectId });
678
+ return rows.map((row) => ({
679
+ id: row.id,
680
+ project_id: row.project_id,
681
+ remote_server_id: row.remote_server_id,
682
+ remote_path: row.remote_path,
683
+ sort_order: row.sort_order,
684
+ sync_up_config: row.sync_up_config ? JSON.parse(row.sync_up_config) : undefined,
685
+ sync_down_config: row.sync_down_config ? JSON.parse(row.sync_down_config) : undefined,
686
+ server_name: row.server_name,
687
+ server_url: row.server_url,
688
+ server_api_key: row.server_api_key ?? undefined,
689
+ }));
690
+ },
691
+ getByProjectAndServer: (projectId, remoteServerId) => {
692
+ const row = db
693
+ .prepare(`SELECT pr.id, pr.project_id, pr.remote_server_id, pr.remote_path, pr.sort_order,
694
+ pr.sync_up_config, pr.sync_down_config,
695
+ rs.name as server_name, rs.url as server_url, rs.api_key as server_api_key
696
+ FROM project_remotes pr
697
+ JOIN remote_servers rs ON pr.remote_server_id = rs.id
698
+ WHERE pr.project_id = @project_id AND pr.remote_server_id = @remote_server_id`)
699
+ .get({ project_id: projectId, remote_server_id: remoteServerId });
700
+ if (!row)
701
+ return undefined;
702
+ return {
703
+ id: row.id,
704
+ project_id: row.project_id,
705
+ remote_server_id: row.remote_server_id,
706
+ remote_path: row.remote_path,
707
+ sort_order: row.sort_order,
708
+ sync_up_config: row.sync_up_config ? JSON.parse(row.sync_up_config) : undefined,
709
+ sync_down_config: row.sync_down_config ? JSON.parse(row.sync_down_config) : undefined,
710
+ server_name: row.server_name,
711
+ server_url: row.server_url,
712
+ server_api_key: row.server_api_key ?? undefined,
713
+ };
714
+ },
715
+ add: (opts) => {
716
+ const id = crypto.randomUUID();
717
+ db.prepare(`INSERT INTO project_remotes (id, project_id, remote_server_id, remote_path, sort_order, sync_up_config, sync_down_config)
718
+ VALUES (@id, @project_id, @remote_server_id, @remote_path, @sort_order, @sync_up_config, @sync_down_config)`).run({
719
+ id,
720
+ project_id: opts.project_id,
721
+ remote_server_id: opts.remote_server_id,
722
+ remote_path: opts.remote_path,
723
+ sort_order: opts.sort_order ?? 0,
724
+ sync_up_config: opts.sync_up_config ? JSON.stringify(opts.sync_up_config) : null,
725
+ sync_down_config: opts.sync_down_config ? JSON.stringify(opts.sync_down_config) : null,
726
+ });
727
+ const row = db
728
+ .prepare(`SELECT * FROM project_remotes WHERE id = @id`)
729
+ .get({ id });
730
+ return {
731
+ id: row.id,
732
+ project_id: row.project_id,
733
+ remote_server_id: row.remote_server_id,
734
+ remote_path: row.remote_path,
735
+ sort_order: row.sort_order,
736
+ sync_up_config: row.sync_up_config ? JSON.parse(row.sync_up_config) : undefined,
737
+ sync_down_config: row.sync_down_config ? JSON.parse(row.sync_down_config) : undefined,
738
+ };
739
+ },
740
+ update: (id, opts) => {
741
+ const updates = [];
742
+ const params = { id };
743
+ if (opts.remote_path !== undefined) {
744
+ updates.push('remote_path = @remote_path');
745
+ params.remote_path = opts.remote_path;
746
+ }
747
+ if (opts.sort_order !== undefined) {
748
+ updates.push('sort_order = @sort_order');
749
+ params.sort_order = opts.sort_order;
750
+ }
751
+ if (opts.sync_up_config !== undefined) {
752
+ updates.push('sync_up_config = @sync_up_config');
753
+ params.sync_up_config = opts.sync_up_config ? JSON.stringify(opts.sync_up_config) : null;
754
+ }
755
+ if (opts.sync_down_config !== undefined) {
756
+ updates.push('sync_down_config = @sync_down_config');
757
+ params.sync_down_config = opts.sync_down_config ? JSON.stringify(opts.sync_down_config) : null;
758
+ }
759
+ if (updates.length === 0) {
760
+ const row = db.prepare(`SELECT * FROM project_remotes WHERE id = @id`).get({ id });
761
+ if (!row)
762
+ return undefined;
763
+ return {
764
+ id: row.id,
765
+ project_id: row.project_id,
766
+ remote_server_id: row.remote_server_id,
767
+ remote_path: row.remote_path,
768
+ sort_order: row.sort_order,
769
+ sync_up_config: row.sync_up_config ? JSON.parse(row.sync_up_config) : undefined,
770
+ sync_down_config: row.sync_down_config ? JSON.parse(row.sync_down_config) : undefined,
771
+ };
772
+ }
773
+ db.prepare(`UPDATE project_remotes SET ${updates.join(', ')} WHERE id = @id`).run(params);
774
+ const row = db.prepare(`SELECT * FROM project_remotes WHERE id = @id`).get({ id });
775
+ if (!row)
776
+ return undefined;
777
+ return {
778
+ id: row.id,
779
+ project_id: row.project_id,
780
+ remote_server_id: row.remote_server_id,
781
+ remote_path: row.remote_path,
782
+ sort_order: row.sort_order,
783
+ sync_up_config: row.sync_up_config ? JSON.parse(row.sync_up_config) : undefined,
784
+ sync_down_config: row.sync_down_config ? JSON.parse(row.sync_down_config) : undefined,
785
+ };
786
+ },
787
+ remove: (id) => {
788
+ const result = db.prepare(`DELETE FROM project_remotes WHERE id = @id`).run({ id });
789
+ return result.changes > 0;
790
+ },
791
+ },
792
+ executorGroups: {
793
+ create: ({ id, project_id, name, branch }) => {
794
+ db.prepare(`INSERT INTO executor_groups (id, project_id, name, branch) VALUES (@id, @project_id, @name, @branch)`).run({ id, project_id, name, branch });
795
+ return db
796
+ .prepare(`SELECT * FROM executor_groups WHERE id = @id`)
797
+ .get({ id });
798
+ },
799
+ getByProjectId: (projectId) => {
800
+ return db
801
+ .prepare(`SELECT * FROM executor_groups WHERE project_id = @project_id ORDER BY created_at ASC`)
802
+ .all({ project_id: projectId });
803
+ },
804
+ getById: (id) => {
805
+ return db
806
+ .prepare(`SELECT * FROM executor_groups WHERE id = @id`)
807
+ .get({ id });
808
+ },
809
+ getByBranch: (projectId, branch) => {
810
+ return db
811
+ .prepare(`SELECT * FROM executor_groups WHERE project_id = @project_id AND branch = @branch`)
812
+ .get({ project_id: projectId, branch });
813
+ },
814
+ update: (id, opts) => {
815
+ if (opts.name !== undefined) {
816
+ db.prepare(`UPDATE executor_groups SET name = @name WHERE id = @id`).run({ id, name: opts.name });
817
+ }
818
+ return db
819
+ .prepare(`SELECT * FROM executor_groups WHERE id = @id`)
820
+ .get({ id });
821
+ },
822
+ delete: (id) => {
823
+ db.prepare(`DELETE FROM executor_groups WHERE id = @id`).run({ id });
824
+ },
825
+ },
826
+ executors: {
827
+ create: ({ id, project_id, group_id, name, command, executor_type, prompt_provider, cwd, pty }) => {
828
+ // Get max position for this group
829
+ const maxPos = db.prepare(`SELECT MAX(position) as max_pos FROM executors WHERE group_id = @group_id`).get({ group_id });
830
+ const position = (maxPos?.max_pos ?? -1) + 1;
831
+ db.prepare(`INSERT INTO executors (id, project_id, group_id, name, command, executor_type, prompt_provider, cwd, pty, position) VALUES (@id, @project_id, @group_id, @name, @command, @executor_type, @prompt_provider, @cwd, @pty, @position)`).run({ id, project_id, group_id, name, command, executor_type: executor_type ?? 'command', prompt_provider: prompt_provider ?? null, cwd: cwd ?? null, pty: pty !== false ? 1 : 0, position });
832
+ const row = db
833
+ .prepare(`SELECT * FROM executors WHERE id = @id`)
834
+ .get({ id });
835
+ return mapExecutorRow(row);
836
+ },
837
+ getByProjectId: (projectId) => {
838
+ const rows = db
839
+ .prepare(`SELECT * FROM executors WHERE project_id = @project_id ORDER BY position ASC`)
840
+ .all({ project_id: projectId });
841
+ return rows.map(mapExecutorRow);
842
+ },
843
+ getByGroupId: (groupId) => {
844
+ const rows = db
845
+ .prepare(`SELECT * FROM executors WHERE group_id = @group_id ORDER BY position ASC`)
846
+ .all({ group_id: groupId });
847
+ return rows.map(mapExecutorRow);
848
+ },
849
+ getById: (id) => {
850
+ const row = db
851
+ .prepare(`SELECT * FROM executors WHERE id = @id`)
852
+ .get({ id });
853
+ return row ? mapExecutorRow(row) : undefined;
854
+ },
855
+ update: (id, opts) => {
856
+ const updates = [];
857
+ const params = { id };
858
+ if (opts.name !== undefined) {
859
+ updates.push('name = @name');
860
+ params.name = opts.name;
861
+ }
862
+ if (opts.command !== undefined) {
863
+ updates.push('command = @command');
864
+ params.command = opts.command;
865
+ }
866
+ if (opts.executor_type !== undefined) {
867
+ updates.push('executor_type = @executor_type');
868
+ params.executor_type = opts.executor_type;
869
+ }
870
+ if (opts.prompt_provider !== undefined) {
871
+ updates.push('prompt_provider = @prompt_provider');
872
+ params.prompt_provider = opts.prompt_provider;
873
+ }
874
+ if (opts.cwd !== undefined) {
875
+ updates.push('cwd = @cwd');
876
+ params.cwd = opts.cwd;
877
+ }
878
+ if (opts.pty !== undefined) {
879
+ updates.push('pty = @pty');
880
+ params.pty = opts.pty ? 1 : 0;
881
+ }
882
+ if (updates.length === 0) {
883
+ const row = db.prepare(`SELECT * FROM executors WHERE id = @id`).get({ id });
884
+ return row ? mapExecutorRow(row) : undefined;
885
+ }
886
+ db.prepare(`UPDATE executors SET ${updates.join(', ')} WHERE id = @id`).run(params);
887
+ const row = db.prepare(`SELECT * FROM executors WHERE id = @id`).get({ id });
888
+ return row ? mapExecutorRow(row) : undefined;
889
+ },
890
+ delete: (id) => {
891
+ db.prepare(`DELETE FROM executors WHERE id = @id`).run({ id });
892
+ },
893
+ reorder: (groupId, orderedIds) => {
894
+ const transaction = db.transaction(() => {
895
+ for (let i = 0; i < orderedIds.length; i++) {
896
+ db.prepare(`UPDATE executors SET position = @position WHERE id = @id AND group_id = @group_id`).run({ id: orderedIds[i], group_id: groupId, position: i });
897
+ }
898
+ });
899
+ transaction();
900
+ },
901
+ },
902
+ executorProcesses: {
903
+ create: ({ id, executor_id, pid }) => {
904
+ db.prepare(`INSERT INTO executor_processes (id, executor_id, pid, status) VALUES (@id, @executor_id, @pid, 'running')`).run({ id, executor_id, pid: pid ?? null });
905
+ return db
906
+ .prepare(`SELECT * FROM executor_processes WHERE id = @id`)
907
+ .get({ id });
908
+ },
909
+ getById: (id) => {
910
+ return db
911
+ .prepare(`SELECT * FROM executor_processes WHERE id = @id`)
912
+ .get({ id });
913
+ },
914
+ getRunning: () => {
915
+ return db
916
+ .prepare(`SELECT * FROM executor_processes WHERE status = 'running'`)
917
+ .all({});
918
+ },
919
+ updateStatus: (id, status, exitCode) => {
920
+ const finishedAt = status !== 'running' ? new Date().toISOString() : null;
921
+ db.prepare(`UPDATE executor_processes SET status = @status, exit_code = @exit_code, finished_at = @finished_at WHERE id = @id`).run({ id, status, exit_code: exitCode ?? null, finished_at: finishedAt });
922
+ },
923
+ updatePid: (id, pid) => {
924
+ db.prepare(`UPDATE executor_processes SET pid = @pid WHERE id = @id`).run({ id, pid });
925
+ },
926
+ },
927
+ agentSessions: {
928
+ create: ({ id, project_id, branch, permission_mode, agent_type }) => {
929
+ // Delete any existing session for this branch (one-to-one binding)
930
+ db.prepare(`DELETE FROM agent_sessions WHERE project_id = @project_id AND branch = @branch`).run({ project_id, branch });
931
+ db.prepare(`INSERT INTO agent_sessions (id, project_id, branch, status, permission_mode, agent_type) VALUES (@id, @project_id, @branch, 'running', @permission_mode, @agent_type)`).run({ id, project_id, branch, permission_mode: permission_mode ?? 'edit', agent_type: agent_type ?? 'claude-code' });
932
+ return db
933
+ .prepare(`SELECT * FROM agent_sessions WHERE id = @id`)
934
+ .get({ id });
935
+ },
936
+ getAll: () => {
937
+ return db
938
+ .prepare(`SELECT * FROM agent_sessions ORDER BY created_at DESC`)
939
+ .all({});
940
+ },
941
+ getById: (id) => {
942
+ return db
943
+ .prepare(`SELECT * FROM agent_sessions WHERE id = @id`)
944
+ .get({ id });
945
+ },
946
+ getByProjectId: (projectId) => {
947
+ return db
948
+ .prepare(`SELECT * FROM agent_sessions WHERE project_id = @project_id ORDER BY created_at DESC`)
949
+ .all({ project_id: projectId });
950
+ },
951
+ getByBranch: (projectId, branch) => {
952
+ return db
953
+ .prepare(`SELECT * FROM agent_sessions WHERE project_id = @project_id AND branch = @branch`)
954
+ .get({ project_id: projectId, branch });
955
+ },
956
+ updateStatus: (id, status) => {
957
+ db.prepare(`UPDATE agent_sessions SET status = @status WHERE id = @id`).run({ id, status });
958
+ },
959
+ updatePermissionMode: (id, mode) => {
960
+ db.prepare(`UPDATE agent_sessions SET permission_mode = @mode WHERE id = @id`).run({ id, mode });
961
+ },
962
+ delete: (id) => {
963
+ db.prepare(`DELETE FROM agent_sessions WHERE id = @id`).run({ id });
964
+ },
965
+ upsertEntry: (sessionId, entryIndex, data) => {
966
+ db.prepare(`INSERT INTO agent_session_entries (session_id, entry_index, data)
967
+ VALUES (@session_id, @entry_index, @data)
968
+ ON CONFLICT(session_id, entry_index) DO UPDATE SET data = excluded.data`).run({ session_id: sessionId, entry_index: entryIndex, data });
969
+ },
970
+ getEntries: (sessionId) => {
971
+ return db
972
+ .prepare(`SELECT entry_index, data FROM agent_session_entries WHERE session_id = @session_id ORDER BY entry_index ASC`)
973
+ .all({ session_id: sessionId });
974
+ },
975
+ deleteEntries: (sessionId) => {
976
+ db.prepare(`DELETE FROM agent_session_entries WHERE session_id = @session_id`).run({ session_id: sessionId });
977
+ },
978
+ },
979
+ settings: {
980
+ get: (key) => {
981
+ const row = db
982
+ .prepare(`SELECT value FROM global_settings WHERE key = @key`)
983
+ .get({ key });
984
+ return row?.value;
985
+ },
986
+ set: (key, value) => {
987
+ db.prepare(`INSERT INTO global_settings (key, value) VALUES (@key, @value)
988
+ ON CONFLICT(key) DO UPDATE SET value = @value`).run({ key, value });
989
+ },
990
+ delete: (key) => {
991
+ db.prepare(`DELETE FROM global_settings WHERE key = @key`).run({ key });
992
+ },
993
+ },
994
+ tasks: {
995
+ create: ({ id, project_id, title, description, status, priority, assigned_branch }) => {
996
+ const maxPos = db.prepare(`SELECT MAX(position) as max_pos FROM tasks WHERE project_id = @project_id`).get({ project_id });
997
+ const position = (maxPos?.max_pos ?? -1) + 1;
998
+ db.prepare(`INSERT INTO tasks (id, project_id, title, description, status, priority, assigned_branch, position)
999
+ VALUES (@id, @project_id, @title, @description, @status, @priority, @assigned_branch, @position)`).run({
1000
+ id,
1001
+ project_id,
1002
+ title,
1003
+ description: description ?? null,
1004
+ status: status ?? 'todo',
1005
+ priority: priority ?? 'medium',
1006
+ assigned_branch: assigned_branch ?? null,
1007
+ position,
1008
+ });
1009
+ return db
1010
+ .prepare(`SELECT * FROM tasks WHERE id = @id`)
1011
+ .get({ id });
1012
+ },
1013
+ getByProjectId: (projectId) => {
1014
+ return db
1015
+ .prepare(`SELECT * FROM tasks WHERE project_id = @project_id ORDER BY position ASC`)
1016
+ .all({ project_id: projectId });
1017
+ },
1018
+ getById: (id) => {
1019
+ return db
1020
+ .prepare(`SELECT * FROM tasks WHERE id = @id`)
1021
+ .get({ id });
1022
+ },
1023
+ update: (id, opts) => {
1024
+ const updates = [];
1025
+ const params = { id };
1026
+ if (opts.title !== undefined) {
1027
+ updates.push('title = @title');
1028
+ params.title = opts.title;
1029
+ }
1030
+ if (opts.description !== undefined) {
1031
+ updates.push('description = @description');
1032
+ params.description = opts.description;
1033
+ }
1034
+ if (opts.status !== undefined) {
1035
+ updates.push('status = @status');
1036
+ params.status = opts.status;
1037
+ }
1038
+ if (opts.priority !== undefined) {
1039
+ updates.push('priority = @priority');
1040
+ params.priority = opts.priority;
1041
+ }
1042
+ if (opts.assigned_branch !== undefined) {
1043
+ updates.push('assigned_branch = @assigned_branch');
1044
+ params.assigned_branch = opts.assigned_branch;
1045
+ }
1046
+ if (opts.position !== undefined) {
1047
+ updates.push('position = @position');
1048
+ params.position = opts.position;
1049
+ }
1050
+ if (updates.length === 0) {
1051
+ return db.prepare(`SELECT * FROM tasks WHERE id = @id`).get({ id });
1052
+ }
1053
+ updates.push('updated_at = CURRENT_TIMESTAMP');
1054
+ db.prepare(`UPDATE tasks SET ${updates.join(', ')} WHERE id = @id`).run(params);
1055
+ return db.prepare(`SELECT * FROM tasks WHERE id = @id`).get({ id });
1056
+ },
1057
+ delete: (id) => {
1058
+ db.prepare(`DELETE FROM tasks WHERE id = @id`).run({ id });
1059
+ },
1060
+ reorder: (projectId, orderedIds) => {
1061
+ const transaction = db.transaction(() => {
1062
+ for (let i = 0; i < orderedIds.length; i++) {
1063
+ db.prepare(`UPDATE tasks SET position = @position, updated_at = CURRENT_TIMESTAMP WHERE id = @id AND project_id = @project_id`).run({ id: orderedIds[i], project_id: projectId, position: i });
1064
+ }
1065
+ });
1066
+ transaction();
1067
+ },
1068
+ },
1069
+ close: () => {
1070
+ db.close();
1071
+ },
1072
+ };
1073
+ };