@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.
- package/dist/agent-provider.d.ts +92 -0
- package/dist/agent-provider.js +8 -0
- package/dist/agent-session-manager.d.ts +165 -0
- package/dist/agent-session-manager.js +985 -0
- package/dist/agent-types.d.ts +148 -0
- package/dist/agent-types.js +4 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +4 -0
- package/dist/browser-manager.d.ts +46 -0
- package/dist/browser-manager.js +182 -0
- package/dist/chat-session-manager.d.ts +101 -0
- package/dist/chat-session-manager.js +1425 -0
- package/dist/command.d.ts +1 -0
- package/dist/command.js +163 -0
- package/dist/constants.d.ts +3 -0
- package/dist/constants.js +5 -0
- package/dist/conversation-patch.d.ts +103 -0
- package/dist/conversation-patch.js +69 -0
- package/dist/dialog.d.ts +1 -0
- package/dist/dialog.js +41 -0
- package/dist/entry-index-provider.d.ts +74 -0
- package/dist/entry-index-provider.js +105 -0
- package/dist/event-bus.d.ts +47 -0
- package/dist/event-bus.js +16 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -0
- package/dist/plugins/shared-services.d.ts +8 -0
- package/dist/plugins/shared-services.js +65 -0
- package/dist/process-manager.d.ts +146 -0
- package/dist/process-manager.js +779 -0
- package/dist/providers/claude-code-provider.d.ts +13 -0
- package/dist/providers/claude-code-provider.js +127 -0
- package/dist/providers/codex-provider.d.ts +41 -0
- package/dist/providers/codex-provider.js +354 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.js +19 -0
- package/dist/remote-patch-cache.d.ts +67 -0
- package/dist/remote-patch-cache.js +190 -0
- package/dist/reverse-connect-client.d.ts +27 -0
- package/dist/reverse-connect-client.js +255 -0
- package/dist/reverse-connect-manager.d.ts +31 -0
- package/dist/reverse-connect-manager.js +287 -0
- package/dist/reverse-connect-types.d.ts +55 -0
- package/dist/reverse-connect-types.js +7 -0
- package/dist/routes/agent-session-routes.d.ts +4 -0
- package/dist/routes/agent-session-routes.js +442 -0
- package/dist/routes/browser-proxy-routes.d.ts +25 -0
- package/dist/routes/browser-proxy-routes.js +421 -0
- package/dist/routes/browser-routes.d.ts +4 -0
- package/dist/routes/browser-routes.js +73 -0
- package/dist/routes/chat-session-routes.d.ts +7 -0
- package/dist/routes/chat-session-routes.js +69 -0
- package/dist/routes/diff-routes.d.ts +4 -0
- package/dist/routes/diff-routes.js +208 -0
- package/dist/routes/event-routes.d.ts +4 -0
- package/dist/routes/event-routes.js +52 -0
- package/dist/routes/executor-group-routes.d.ts +4 -0
- package/dist/routes/executor-group-routes.js +76 -0
- package/dist/routes/executor-routes.d.ts +4 -0
- package/dist/routes/executor-routes.js +106 -0
- package/dist/routes/file-routes.d.ts +4 -0
- package/dist/routes/file-routes.js +331 -0
- package/dist/routes/process-routes.d.ts +4 -0
- package/dist/routes/process-routes.js +183 -0
- package/dist/routes/project-remote-routes.d.ts +4 -0
- package/dist/routes/project-remote-routes.js +82 -0
- package/dist/routes/project-routes.d.ts +4 -0
- package/dist/routes/project-routes.js +286 -0
- package/dist/routes/remote-routes.d.ts +4 -0
- package/dist/routes/remote-routes.js +59 -0
- package/dist/routes/remote-server-routes.d.ts +4 -0
- package/dist/routes/remote-server-routes.js +157 -0
- package/dist/routes/reverse-connect-routes.d.ts +4 -0
- package/dist/routes/reverse-connect-routes.js +33 -0
- package/dist/routes/settings-routes.d.ts +4 -0
- package/dist/routes/settings-routes.js +129 -0
- package/dist/routes/task-routes.d.ts +4 -0
- package/dist/routes/task-routes.js +107 -0
- package/dist/routes/terminal-routes.d.ts +4 -0
- package/dist/routes/terminal-routes.js +187 -0
- package/dist/routes/translate-routes.d.ts +4 -0
- package/dist/routes/translate-routes.js +38 -0
- package/dist/routes/websocket-routes.d.ts +4 -0
- package/dist/routes/websocket-routes.js +604 -0
- package/dist/routes/worktree-routes.d.ts +4 -0
- package/dist/routes/worktree-routes.js +511 -0
- package/dist/server-types.d.ts +41 -0
- package/dist/server-types.js +1 -0
- package/dist/server.d.ts +23 -0
- package/dist/server.js +238 -0
- package/dist/storage/sqlite.d.ts +2 -0
- package/dist/storage/sqlite.js +1073 -0
- package/dist/storage/types.d.ts +281 -0
- package/dist/storage/types.js +1 -0
- package/dist/ui/404/index.html +1 -0
- package/dist/ui/404.html +1 -0
- package/dist/ui/__next.__PAGE__.txt +10 -0
- package/dist/ui/__next._full.txt +25 -0
- package/dist/ui/__next._head.txt +6 -0
- package/dist/ui/__next._index.txt +9 -0
- package/dist/ui/__next._tree.txt +6 -0
- package/dist/ui/_next/static/7vIIuOQPJu8rdb6uAhwtg/_buildManifest.js +11 -0
- package/dist/ui/_next/static/7vIIuOQPJu8rdb6uAhwtg/_clientMiddlewareManifest.json +1 -0
- package/dist/ui/_next/static/7vIIuOQPJu8rdb6uAhwtg/_ssgManifest.js +1 -0
- package/dist/ui/_next/static/chunks/002f5a047b8d07d4.js +1 -0
- package/dist/ui/_next/static/chunks/01178e167ba3e5b4.js +1 -0
- package/dist/ui/_next/static/chunks/020d675d21be28d4.js +1 -0
- package/dist/ui/_next/static/chunks/024926197424b4a5.js +1 -0
- package/dist/ui/_next/static/chunks/02c93f6ca211a65d.js +1 -0
- package/dist/ui/_next/static/chunks/0364437dee56dc96.js +1 -0
- package/dist/ui/_next/static/chunks/03fc6b527b16efdc.js +1 -0
- package/dist/ui/_next/static/chunks/04f9a7932751cf2d.js +1 -0
- package/dist/ui/_next/static/chunks/0624b8204e5ae457.js +136 -0
- package/dist/ui/_next/static/chunks/067d8978cf41b901.js +1 -0
- package/dist/ui/_next/static/chunks/06d96238e85cdbb3.js +1 -0
- package/dist/ui/_next/static/chunks/071b9575dbdf1dcb.js +1 -0
- package/dist/ui/_next/static/chunks/073d5b9dc87ceab0.js +1 -0
- package/dist/ui/_next/static/chunks/0876a7111934d6f7.js +1 -0
- package/dist/ui/_next/static/chunks/08ffc3bf406c665d.js +1 -0
- package/dist/ui/_next/static/chunks/0969e8274c92c2d8.js +1 -0
- package/dist/ui/_next/static/chunks/0a3f62f00d7bec78.js +1 -0
- package/dist/ui/_next/static/chunks/0b80166023d89049.js +5 -0
- package/dist/ui/_next/static/chunks/0c2a941e61c395b6.js +1 -0
- package/dist/ui/_next/static/chunks/0c5eac8493334420.js +1 -0
- package/dist/ui/_next/static/chunks/0cc61d37b2333469.js +1 -0
- package/dist/ui/_next/static/chunks/0d440843348b2871.js +1 -0
- package/dist/ui/_next/static/chunks/0da3d15845f17208.js +1 -0
- package/dist/ui/_next/static/chunks/0e1982b1a6cbd127.js +53 -0
- package/dist/ui/_next/static/chunks/0e81d5bc1c725b75.js +1 -0
- package/dist/ui/_next/static/chunks/0e862e51b01e904b.js +63 -0
- package/dist/ui/_next/static/chunks/0ed7b6d86744b723.js +1 -0
- package/dist/ui/_next/static/chunks/0f0b3025f4e268b1.js +1 -0
- package/dist/ui/_next/static/chunks/10a30eb52825da36.js +1 -0
- package/dist/ui/_next/static/chunks/10c48da576fd8eef.js +1 -0
- package/dist/ui/_next/static/chunks/133e9f1435ca5f45.js +29 -0
- package/dist/ui/_next/static/chunks/16f4db3a54f167fd.js +1 -0
- package/dist/ui/_next/static/chunks/1988e3ecf5ad06d3.js +1 -0
- package/dist/ui/_next/static/chunks/1acfae010fd77014.js +152 -0
- package/dist/ui/_next/static/chunks/1ae53c2f1fff8cc2.js +1 -0
- package/dist/ui/_next/static/chunks/1af4fbc6c1256fae.js +1 -0
- package/dist/ui/_next/static/chunks/1b758c732032b236.js +1 -0
- package/dist/ui/_next/static/chunks/1ba26455a9f70c08.js +1 -0
- package/dist/ui/_next/static/chunks/1d22644cb4049d6b.css +1 -0
- package/dist/ui/_next/static/chunks/1d241f3b57c14cf7.js +1 -0
- package/dist/ui/_next/static/chunks/1d640bbe1c2c7869.js +1 -0
- package/dist/ui/_next/static/chunks/1da6354c9cb6f0de.js +1 -0
- package/dist/ui/_next/static/chunks/1dcd49914412f67b.js +1 -0
- package/dist/ui/_next/static/chunks/1e3b3771294825a4.js +1 -0
- package/dist/ui/_next/static/chunks/1eaa8ad7eca7f957.js +1 -0
- package/dist/ui/_next/static/chunks/1ebc88f60cadb128.js +1 -0
- package/dist/ui/_next/static/chunks/1ecb57b258088259.js +1 -0
- package/dist/ui/_next/static/chunks/1f5ba6b80fe19200.js +1 -0
- package/dist/ui/_next/static/chunks/20a5531534828366.js +1 -0
- package/dist/ui/_next/static/chunks/20b511fc299dfe9a.js +1 -0
- package/dist/ui/_next/static/chunks/20bff4eb9a0a6872.css +1 -0
- package/dist/ui/_next/static/chunks/219b7d9e437c6bd8.js +15 -0
- package/dist/ui/_next/static/chunks/21b32f530e0df2c5.js +1 -0
- package/dist/ui/_next/static/chunks/21fc6dc60e7647b1.js +1 -0
- package/dist/ui/_next/static/chunks/221a27e65aa5fbfd.js +1 -0
- package/dist/ui/_next/static/chunks/23a1e247c32bcc61.js +93 -0
- package/dist/ui/_next/static/chunks/2473c16c0c2f6b5f.css +2 -0
- package/dist/ui/_next/static/chunks/2615c71c0f8fe9bd.js +1 -0
- package/dist/ui/_next/static/chunks/263327288d5e2703.js +1 -0
- package/dist/ui/_next/static/chunks/2663fbaf43239e38.js +1 -0
- package/dist/ui/_next/static/chunks/27332c590d59f4e5.js +1 -0
- package/dist/ui/_next/static/chunks/27ca4a4e8191093f.js +1 -0
- package/dist/ui/_next/static/chunks/29b7618dcaa8edba.js +1 -0
- package/dist/ui/_next/static/chunks/2ba1d2b55b82f4da.js +21 -0
- package/dist/ui/_next/static/chunks/2cb23686e72468c8.js +1 -0
- package/dist/ui/_next/static/chunks/2d46f05dcbf1cbc2.js +1 -0
- package/dist/ui/_next/static/chunks/2d4c0fd06ca34510.js +2 -0
- package/dist/ui/_next/static/chunks/2f3d1d07474b8f79.js +1 -0
- package/dist/ui/_next/static/chunks/2f85c2849249a0dd.js +1 -0
- package/dist/ui/_next/static/chunks/3001d378f166eec9.js +1 -0
- package/dist/ui/_next/static/chunks/3018714f3827e360.js +1 -0
- package/dist/ui/_next/static/chunks/301cc25e0d489351.js +1 -0
- package/dist/ui/_next/static/chunks/305242b22ba8b49b.js +1 -0
- package/dist/ui/_next/static/chunks/3067c6e369066bd6.js +1 -0
- package/dist/ui/_next/static/chunks/311a77c9d5cb9de9.js +1 -0
- package/dist/ui/_next/static/chunks/320c001380e81470.js +1 -0
- package/dist/ui/_next/static/chunks/329db6c551df0faf.js +1 -0
- package/dist/ui/_next/static/chunks/33da178724072b3d.js +1 -0
- package/dist/ui/_next/static/chunks/33e8248c9296537a.js +1 -0
- package/dist/ui/_next/static/chunks/35a9992a8958f93b.js +1 -0
- package/dist/ui/_next/static/chunks/35bb90cf09892b72.js +1 -0
- package/dist/ui/_next/static/chunks/379f91b92366dc15.js +1 -0
- package/dist/ui/_next/static/chunks/391f22359769763f.js +1 -0
- package/dist/ui/_next/static/chunks/39231cb1044f7823.js +1 -0
- package/dist/ui/_next/static/chunks/394e8b7a1c2c58c6.js +1 -0
- package/dist/ui/_next/static/chunks/3a2cfdeb5f76ebd2.js +1 -0
- package/dist/ui/_next/static/chunks/3a3bd015fd042386.js +1 -0
- package/dist/ui/_next/static/chunks/3ad1bee238af9b5a.js +1 -0
- package/dist/ui/_next/static/chunks/3b2b2f7a9b7b130d.js +1 -0
- package/dist/ui/_next/static/chunks/3b586f80547e3a22.js +1 -0
- package/dist/ui/_next/static/chunks/3ca412e72bd3707a.js +1 -0
- package/dist/ui/_next/static/chunks/3cbb3bdceb4230af.js +1 -0
- package/dist/ui/_next/static/chunks/3ed1465109fecc2d.js +1 -0
- package/dist/ui/_next/static/chunks/3fd0801238b3b099.js +1 -0
- package/dist/ui/_next/static/chunks/401df66bd5da2115.js +15 -0
- package/dist/ui/_next/static/chunks/4211f4efe510f7ac.js +1 -0
- package/dist/ui/_next/static/chunks/43085364d0a41d1d.js +1 -0
- package/dist/ui/_next/static/chunks/4310c821dbee7a16.js +1 -0
- package/dist/ui/_next/static/chunks/46382f31f63e59cf.js +1 -0
- package/dist/ui/_next/static/chunks/468836b90ddf24d6.js +1 -0
- package/dist/ui/_next/static/chunks/470d091143104517.js +1 -0
- package/dist/ui/_next/static/chunks/4712e4f7e6b6ddc1.js +1 -0
- package/dist/ui/_next/static/chunks/4899f1e3f21c077e.js +1 -0
- package/dist/ui/_next/static/chunks/492ce6930bf61811.js +1 -0
- package/dist/ui/_next/static/chunks/494485a20952ffa3.js +1 -0
- package/dist/ui/_next/static/chunks/49535db309898f43.js +1 -0
- package/dist/ui/_next/static/chunks/4b8d2612d69e2013.js +1 -0
- package/dist/ui/_next/static/chunks/4c4a0f67891826a3.js +1 -0
- package/dist/ui/_next/static/chunks/4cc11ce32f4453b0.js +1 -0
- package/dist/ui/_next/static/chunks/4d03a0bc963fc3d4.js +1 -0
- package/dist/ui/_next/static/chunks/4d603a66c067134e.js +1 -0
- package/dist/ui/_next/static/chunks/4d8d7e62c2743f71.js +15 -0
- package/dist/ui/_next/static/chunks/4da42f10a5460b36.js +1 -0
- package/dist/ui/_next/static/chunks/4e832ffb65e75807.js +1 -0
- package/dist/ui/_next/static/chunks/4e954e1cec89a9ea.js +1 -0
- package/dist/ui/_next/static/chunks/4f2bc7a7a6b05a8b.js +55 -0
- package/dist/ui/_next/static/chunks/4f9c934abf34ceb9.js +1 -0
- package/dist/ui/_next/static/chunks/4fa248b0d2586928.js +1 -0
- package/dist/ui/_next/static/chunks/4fafbac2156844ca.js +1 -0
- package/dist/ui/_next/static/chunks/502039e483cc5e48.js +1 -0
- package/dist/ui/_next/static/chunks/509c91c38224448a.js +1 -0
- package/dist/ui/_next/static/chunks/5159d6f8d4307f36.js +1 -0
- package/dist/ui/_next/static/chunks/5179ab56aaaed42d.js +1 -0
- package/dist/ui/_next/static/chunks/5269ea07faff562d.js +1 -0
- package/dist/ui/_next/static/chunks/529f3f0f7d42444a.js +1 -0
- package/dist/ui/_next/static/chunks/5317db6783ee8dc9.js +1 -0
- package/dist/ui/_next/static/chunks/53a7b7c0ab020902.js +1 -0
- package/dist/ui/_next/static/chunks/544869c670c1dd8e.js +1 -0
- package/dist/ui/_next/static/chunks/547c0db6a433370e.js +1 -0
- package/dist/ui/_next/static/chunks/54d5670f5fa2abbe.css +1 -0
- package/dist/ui/_next/static/chunks/55761e35a8946a1d.js +15 -0
- package/dist/ui/_next/static/chunks/558f73c16b7ff14f.js +1 -0
- package/dist/ui/_next/static/chunks/55c76f605958d671.js +1 -0
- package/dist/ui/_next/static/chunks/55dc6750fb117bf9.js +1 -0
- package/dist/ui/_next/static/chunks/584bad9cf2498405.js +1 -0
- package/dist/ui/_next/static/chunks/593b85b9abea3ea6.js +1 -0
- package/dist/ui/_next/static/chunks/5a79af73c96155d4.js +1 -0
- package/dist/ui/_next/static/chunks/5ee54b9b6b400134.js +1 -0
- package/dist/ui/_next/static/chunks/5f27ee48dc820109.js +1 -0
- package/dist/ui/_next/static/chunks/5ffd50a08d82e2f3.js +1 -0
- package/dist/ui/_next/static/chunks/61d65fe807f69413.js +62 -0
- package/dist/ui/_next/static/chunks/626a650bcaaecdb8.js +1 -0
- package/dist/ui/_next/static/chunks/62baecafed4dbced.js +1 -0
- package/dist/ui/_next/static/chunks/634a4b5b6a38ccab.js +1 -0
- package/dist/ui/_next/static/chunks/643c359cf3f7364e.js +1 -0
- package/dist/ui/_next/static/chunks/649e65f4820a772b.js +1 -0
- package/dist/ui/_next/static/chunks/65028938188a230c.js +1 -0
- package/dist/ui/_next/static/chunks/65b3658348e8d4fd.js +1 -0
- package/dist/ui/_next/static/chunks/65eed220466cbdbc.js +1 -0
- package/dist/ui/_next/static/chunks/66714687cfd91953.js +1 -0
- package/dist/ui/_next/static/chunks/66ccaa3e69ed7a69.js +1 -0
- package/dist/ui/_next/static/chunks/6754600af0c6b3a8.js +1 -0
- package/dist/ui/_next/static/chunks/67a1d37727697340.js +1 -0
- package/dist/ui/_next/static/chunks/67e965a7f9531cee.js +1 -0
- package/dist/ui/_next/static/chunks/6816bf02e4c22a55.js +1 -0
- package/dist/ui/_next/static/chunks/68621b90909ec4e6.js +1 -0
- package/dist/ui/_next/static/chunks/6929ceb718c6e4c6.js +1 -0
- package/dist/ui/_next/static/chunks/69362fff2240a17b.js +1 -0
- package/dist/ui/_next/static/chunks/69dab47a307b1a37.js +1 -0
- package/dist/ui/_next/static/chunks/6afa71c8b3358dd5.js +1 -0
- package/dist/ui/_next/static/chunks/6bf54dc328e667f7.js +1 -0
- package/dist/ui/_next/static/chunks/6c44508faf13f6f0.js +1 -0
- package/dist/ui/_next/static/chunks/6c9c2b61c905a2de.js +1 -0
- package/dist/ui/_next/static/chunks/6cc2e3d7873522b9.js +1 -0
- package/dist/ui/_next/static/chunks/6d01e8902e85bfe0.js +1 -0
- package/dist/ui/_next/static/chunks/6dc69e4a91f7a353.js +1 -0
- package/dist/ui/_next/static/chunks/6e832e016b60ae19.js +1 -0
- package/dist/ui/_next/static/chunks/6eab0d8815c18a6d.js +1 -0
- package/dist/ui/_next/static/chunks/6f862eb588fa3b7e.js +1 -0
- package/dist/ui/_next/static/chunks/6ff7b0a8653036b2.js +1 -0
- package/dist/ui/_next/static/chunks/710ce144a9645f3c.js +1 -0
- package/dist/ui/_next/static/chunks/71293e300c639b6b.js +1 -0
- package/dist/ui/_next/static/chunks/7186d7cce354a012.js +1 -0
- package/dist/ui/_next/static/chunks/7215d586009e8158.js +1 -0
- package/dist/ui/_next/static/chunks/726fdeaff53a89ac.js +1 -0
- package/dist/ui/_next/static/chunks/7322a00d61e7ffad.js +1 -0
- package/dist/ui/_next/static/chunks/73c60ee9f233051d.js +1 -0
- package/dist/ui/_next/static/chunks/740f5627b5c57baa.js +1 -0
- package/dist/ui/_next/static/chunks/74438794a8e9ba80.js +1 -0
- package/dist/ui/_next/static/chunks/74ffcd7d13b3fea0.js +1 -0
- package/dist/ui/_next/static/chunks/7510496048ab1ad4.js +1 -0
- package/dist/ui/_next/static/chunks/7636f89f38cbc3e3.js +1 -0
- package/dist/ui/_next/static/chunks/782a93ec4348b666.js +1 -0
- package/dist/ui/_next/static/chunks/7850bbac1925646c.js +1 -0
- package/dist/ui/_next/static/chunks/790dcc1e825d2504.js +1 -0
- package/dist/ui/_next/static/chunks/798597a1c1248d29.js +1 -0
- package/dist/ui/_next/static/chunks/7a70641f70a5c72d.js +60 -0
- package/dist/ui/_next/static/chunks/7c62789391c35dce.js +1 -0
- package/dist/ui/_next/static/chunks/7d533d3f2ab624f2.js +1 -0
- package/dist/ui/_next/static/chunks/7d6087c3fabf9ded.js +1 -0
- package/dist/ui/_next/static/chunks/7d84c9cb810e6902.js +1 -0
- package/dist/ui/_next/static/chunks/7dc4f5ba8c25c409.js +1 -0
- package/dist/ui/_next/static/chunks/7e10c0644fbb99d1.js +1 -0
- package/dist/ui/_next/static/chunks/7e7aaacf104c17f4.js +1 -0
- package/dist/ui/_next/static/chunks/7e92979509de57ed.js +1 -0
- package/dist/ui/_next/static/chunks/7f9a52e36f9f001e.js +1 -0
- package/dist/ui/_next/static/chunks/7fc4ae2e7cf2e37e.js +1 -0
- package/dist/ui/_next/static/chunks/801232fdde8ce252.js +1 -0
- package/dist/ui/_next/static/chunks/808ed0f189237446.js +1 -0
- package/dist/ui/_next/static/chunks/8199e6b3fa54b2ff.js +1 -0
- package/dist/ui/_next/static/chunks/81fa0fa05a94eb02.js +1 -0
- package/dist/ui/_next/static/chunks/821b5389566b82d2.js +1 -0
- package/dist/ui/_next/static/chunks/82b9e04f88e657df.js +1 -0
- package/dist/ui/_next/static/chunks/830c79cc12f2c5a4.js +1 -0
- package/dist/ui/_next/static/chunks/8388ae863590404b.js +4 -0
- package/dist/ui/_next/static/chunks/83ab70f11a82a8c6.js +1 -0
- package/dist/ui/_next/static/chunks/83faf7904ac18d7f.js +1 -0
- package/dist/ui/_next/static/chunks/850d850bd879606f.js +1 -0
- package/dist/ui/_next/static/chunks/864d4b5cf4ae2226.js +1 -0
- package/dist/ui/_next/static/chunks/86d8962196053f53.js +139 -0
- package/dist/ui/_next/static/chunks/8723d7000b263475.js +1 -0
- package/dist/ui/_next/static/chunks/87e5597a4336e2c1.js +1 -0
- package/dist/ui/_next/static/chunks/899fe56c4c707c65.js +1 -0
- package/dist/ui/_next/static/chunks/8bda52f55493ae9b.js +1 -0
- package/dist/ui/_next/static/chunks/8ce5668c3da0679a.js +1 -0
- package/dist/ui/_next/static/chunks/8d1c22aafb4783c5.js +1 -0
- package/dist/ui/_next/static/chunks/8deda0adfe811d18.js +1 -0
- package/dist/ui/_next/static/chunks/8eed597098a27801.js +1 -0
- package/dist/ui/_next/static/chunks/8ff7a1947b8d114b.js +1 -0
- package/dist/ui/_next/static/chunks/90367a2ee1e720b2.js +1 -0
- package/dist/ui/_next/static/chunks/9097640e1931c0de.js +1 -0
- package/dist/ui/_next/static/chunks/912457473a4c91c3.js +1 -0
- package/dist/ui/_next/static/chunks/91f7dd388c6b88c6.js +1 -0
- package/dist/ui/_next/static/chunks/932d4334e5f98b7c.js +1 -0
- package/dist/ui/_next/static/chunks/94b1efc14d44707b.js +1 -0
- package/dist/ui/_next/static/chunks/956107bc3ba52911.js +1 -0
- package/dist/ui/_next/static/chunks/962e5cad8ea716fc.js +36 -0
- package/dist/ui/_next/static/chunks/96acf903dff8ecf7.js +1 -0
- package/dist/ui/_next/static/chunks/96b274c82c194b4f.js +1 -0
- package/dist/ui/_next/static/chunks/96b3c1b1afe3201d.js +1 -0
- package/dist/ui/_next/static/chunks/9880c26551206d33.js +1 -0
- package/dist/ui/_next/static/chunks/98ea228d01556617.js +1 -0
- package/dist/ui/_next/static/chunks/9951c25a8b05148f.js +1 -0
- package/dist/ui/_next/static/chunks/9b10895d33be5f6e.js +1 -0
- package/dist/ui/_next/static/chunks/9b50a76ddbe4934d.js +1 -0
- package/dist/ui/_next/static/chunks/9bbb1c0146042008.js +1 -0
- package/dist/ui/_next/static/chunks/9ccab70823e99451.js +1 -0
- package/dist/ui/_next/static/chunks/9cd7bcb29e0b3418.js +24 -0
- package/dist/ui/_next/static/chunks/9d06bd5d701ace73.js +1 -0
- package/dist/ui/_next/static/chunks/9e5d9fc30c12fbdd.js +1 -0
- package/dist/ui/_next/static/chunks/9ec3bc5544bcc15a.js +1 -0
- package/dist/ui/_next/static/chunks/9f47133184a7455a.js +1 -0
- package/dist/ui/_next/static/chunks/a002d3850b7c7c59.js +1 -0
- package/dist/ui/_next/static/chunks/a0bc5573cadd1377.js +1 -0
- package/dist/ui/_next/static/chunks/a1d3de9e7615662e.js +160 -0
- package/dist/ui/_next/static/chunks/a2ce60768a8373e7.js +1 -0
- package/dist/ui/_next/static/chunks/a305087b1a55b367.js +1 -0
- package/dist/ui/_next/static/chunks/a41df0d443f66c68.js +1 -0
- package/dist/ui/_next/static/chunks/a49d2e9f31886b5e.js +1 -0
- package/dist/ui/_next/static/chunks/a50922e0883f65cd.js +1 -0
- package/dist/ui/_next/static/chunks/a60e84ee8b6c5ffc.js +43 -0
- package/dist/ui/_next/static/chunks/a6dad97d9634a72d.js +1 -0
- package/dist/ui/_next/static/chunks/a6dad97d9634a72d.js.map +1 -0
- package/dist/ui/_next/static/chunks/a7c40c289b5e2384.js +1 -0
- package/dist/ui/_next/static/chunks/a7fdfeea5fd894c1.js +59 -0
- package/dist/ui/_next/static/chunks/a81381241f4f484c.js +1 -0
- package/dist/ui/_next/static/chunks/a8a3989305bcc136.js +215 -0
- package/dist/ui/_next/static/chunks/a8cf26088e63128c.js +1 -0
- package/dist/ui/_next/static/chunks/aac4ca816d9ccdb6.js +1 -0
- package/dist/ui/_next/static/chunks/ab432bc28a971c8f.js +1 -0
- package/dist/ui/_next/static/chunks/abccff1b09b6effa.js +1 -0
- package/dist/ui/_next/static/chunks/ac8a8986f09ec520.js +1 -0
- package/dist/ui/_next/static/chunks/accbf306b5ddb732.js +1 -0
- package/dist/ui/_next/static/chunks/af7b09aba1d477ff.js +1 -0
- package/dist/ui/_next/static/chunks/af8114430894d79e.js +1 -0
- package/dist/ui/_next/static/chunks/afe2ff5d0727a240.js +1 -0
- package/dist/ui/_next/static/chunks/b096fa008120f0ae.js +1 -0
- package/dist/ui/_next/static/chunks/b0bc568eaff56dad.js +1 -0
- package/dist/ui/_next/static/chunks/b225dddc0852f85c.js +215 -0
- package/dist/ui/_next/static/chunks/b2342c5099957971.js +1 -0
- package/dist/ui/_next/static/chunks/b2d8c64d7d6a06b7.js +1 -0
- package/dist/ui/_next/static/chunks/b331c855cfc8fd57.js +1 -0
- package/dist/ui/_next/static/chunks/b356ee8615740392.js +1 -0
- package/dist/ui/_next/static/chunks/b3beaac9b7957d3f.js +1 -0
- package/dist/ui/_next/static/chunks/b4e7d4a109c4c080.js +1 -0
- package/dist/ui/_next/static/chunks/b5010f2ea9df9d00.js +77 -0
- package/dist/ui/_next/static/chunks/b5f9d21bd1b51a48.js +1 -0
- package/dist/ui/_next/static/chunks/b6a16eb77c5c9831.js +1 -0
- package/dist/ui/_next/static/chunks/b6a8e7c2216683ca.js +262 -0
- package/dist/ui/_next/static/chunks/b873c4d327a450e0.js +1 -0
- package/dist/ui/_next/static/chunks/b8aec8caed569fd2.js +24 -0
- package/dist/ui/_next/static/chunks/b8e7601e2379fd74.js +1 -0
- package/dist/ui/_next/static/chunks/ba3d03bf2f33f2a3.js +1 -0
- package/dist/ui/_next/static/chunks/ba698805336b2cb2.js +1 -0
- package/dist/ui/_next/static/chunks/bc48735eee7d1345.js +1 -0
- package/dist/ui/_next/static/chunks/bcb48aab1bdae96a.js +1 -0
- package/dist/ui/_next/static/chunks/bde2ca9d150d96ff.js +1 -0
- package/dist/ui/_next/static/chunks/be4af851547fc916.js +1 -0
- package/dist/ui/_next/static/chunks/be70ba8c4ba5cdb6.js +1 -0
- package/dist/ui/_next/static/chunks/be87578ee895734b.js +1 -0
- package/dist/ui/_next/static/chunks/c0aeb40fcca7d006.js +1 -0
- package/dist/ui/_next/static/chunks/c32156843c32ebca.js +1 -0
- package/dist/ui/_next/static/chunks/c57a3e045f3722c1.js +1 -0
- package/dist/ui/_next/static/chunks/c5add23cde4a234a.js +1 -0
- package/dist/ui/_next/static/chunks/c60897f3554a9388.js +1 -0
- package/dist/ui/_next/static/chunks/c648a36722afd12a.js +1 -0
- package/dist/ui/_next/static/chunks/c652f05e0a0d7b81.js +1 -0
- package/dist/ui/_next/static/chunks/c678d9303ed453b4.js +1 -0
- package/dist/ui/_next/static/chunks/c681430c24597d06.js +1 -0
- package/dist/ui/_next/static/chunks/c890870fb65940bc.js +1 -0
- package/dist/ui/_next/static/chunks/c94c394aeec71e21.js +1 -0
- package/dist/ui/_next/static/chunks/ca1eb1e2978389e4.js +1 -0
- package/dist/ui/_next/static/chunks/ca3512025a981c82.js +1 -0
- package/dist/ui/_next/static/chunks/ca6db0d999bad46b.js +1 -0
- package/dist/ui/_next/static/chunks/ca926babdf75597c.js +1 -0
- package/dist/ui/_next/static/chunks/cb0877764d4a31f2.js +1 -0
- package/dist/ui/_next/static/chunks/cb15e0c2ff49cf52.js +1 -0
- package/dist/ui/_next/static/chunks/cb1ae84204260ecd.js +1 -0
- package/dist/ui/_next/static/chunks/cb2ef733c53d80f7.js +1 -0
- package/dist/ui/_next/static/chunks/cbaa87ba8930fb75.js +1 -0
- package/dist/ui/_next/static/chunks/cbd29ba61906e19f.js +1 -0
- package/dist/ui/_next/static/chunks/ccf1e618faea3d02.js +148 -0
- package/dist/ui/_next/static/chunks/cd91712ea04f43ba.js +13 -0
- package/dist/ui/_next/static/chunks/cdd85dc039d450f3.js +1 -0
- package/dist/ui/_next/static/chunks/ce663833f73b1ec5.js +1 -0
- package/dist/ui/_next/static/chunks/ceda8fcac21d8e70.js +1 -0
- package/dist/ui/_next/static/chunks/cf565875b66f8cad.js +1 -0
- package/dist/ui/_next/static/chunks/d127ded39a594c84.js +1 -0
- package/dist/ui/_next/static/chunks/d34124988f5b8f6d.js +1 -0
- package/dist/ui/_next/static/chunks/d36807add3e11d59.js +60 -0
- package/dist/ui/_next/static/chunks/d3f2e4603faebed8.js +1 -0
- package/dist/ui/_next/static/chunks/d414302c23047b9b.js +1 -0
- package/dist/ui/_next/static/chunks/d42adc0237103e65.js +1 -0
- package/dist/ui/_next/static/chunks/d4a06b205f0a641b.js +1 -0
- package/dist/ui/_next/static/chunks/d4e5289ace3acef0.js +1 -0
- package/dist/ui/_next/static/chunks/d53b4725d3328076.js +1 -0
- package/dist/ui/_next/static/chunks/d5bd04634f922925.js +1 -0
- package/dist/ui/_next/static/chunks/d642c9229900dc48.js +1 -0
- package/dist/ui/_next/static/chunks/d6651bb78c09d144.js +5 -0
- package/dist/ui/_next/static/chunks/d7276c56aa62ceed.js +1 -0
- package/dist/ui/_next/static/chunks/d85cd9cda46f2d1b.js +1 -0
- package/dist/ui/_next/static/chunks/d8978f4b468bbad4.js +1 -0
- package/dist/ui/_next/static/chunks/d8fb9668a83c0603.js +1 -0
- package/dist/ui/_next/static/chunks/d95c62472fc41baf.js +1 -0
- package/dist/ui/_next/static/chunks/da13170b983f7ebf.js +1 -0
- package/dist/ui/_next/static/chunks/dae86e12c7741e6c.js +19 -0
- package/dist/ui/_next/static/chunks/db44023a744297d1.js +1 -0
- package/dist/ui/_next/static/chunks/dbe7840308be36b8.js +1 -0
- package/dist/ui/_next/static/chunks/dc0a4df8f7080b29.js +1 -0
- package/dist/ui/_next/static/chunks/dc4a6f59be156511.js +1 -0
- package/dist/ui/_next/static/chunks/dcda5e7b57ed88e0.js +1 -0
- package/dist/ui/_next/static/chunks/de9ff8c97f75b947.js +1 -0
- package/dist/ui/_next/static/chunks/df6abcdb3eb0b236.js +1 -0
- package/dist/ui/_next/static/chunks/df8a0933ca385a63.js +1 -0
- package/dist/ui/_next/static/chunks/dff6434c44c2dfaa.js +1 -0
- package/dist/ui/_next/static/chunks/e037ec5e62b2bdc3.js +1 -0
- package/dist/ui/_next/static/chunks/e212cf1f5a503899.js +1 -0
- package/dist/ui/_next/static/chunks/e2bfdac0a2305cc1.js +1 -0
- package/dist/ui/_next/static/chunks/e2dce648399ad4d4.js +1 -0
- package/dist/ui/_next/static/chunks/e318291bb8d74aee.js +1 -0
- package/dist/ui/_next/static/chunks/e33e40c2e7ab7629.js +1 -0
- package/dist/ui/_next/static/chunks/e410dfbcccddc478.js +1 -0
- package/dist/ui/_next/static/chunks/e411d58b52ab342b.js +1 -0
- package/dist/ui/_next/static/chunks/e57f7ffd0803a922.js +117 -0
- package/dist/ui/_next/static/chunks/e6b56ceb762e84c4.js +1 -0
- package/dist/ui/_next/static/chunks/e6d9a6ca68017eef.js +1 -0
- package/dist/ui/_next/static/chunks/e6ec2663605cf5a7.js +29 -0
- package/dist/ui/_next/static/chunks/e834330589be0639.js +1 -0
- package/dist/ui/_next/static/chunks/e8f662ba8bc76802.js +1 -0
- package/dist/ui/_next/static/chunks/e9e8e72d7ff45812.js +1 -0
- package/dist/ui/_next/static/chunks/eadd25eb66104a63.js +1 -0
- package/dist/ui/_next/static/chunks/ec3a7a7f48a8aca9.js +1 -0
- package/dist/ui/_next/static/chunks/ed62e349fb1ce14c.js +1 -0
- package/dist/ui/_next/static/chunks/ed6caa113f5769a5.js +1 -0
- package/dist/ui/_next/static/chunks/f02ac565bb5bc450.js +1 -0
- package/dist/ui/_next/static/chunks/f1a7a173e3da4ff4.js +1 -0
- package/dist/ui/_next/static/chunks/f268093817d3b260.js +1 -0
- package/dist/ui/_next/static/chunks/f6f811ccfe79e963.js +1 -0
- package/dist/ui/_next/static/chunks/f8955634331fd956.js +1 -0
- package/dist/ui/_next/static/chunks/f8c965a996875e30.js +56 -0
- package/dist/ui/_next/static/chunks/f9bb8411d37b06d7.js +1 -0
- package/dist/ui/_next/static/chunks/f9d4f77d8c130497.js +1 -0
- package/dist/ui/_next/static/chunks/fba113a516eb485f.js +1 -0
- package/dist/ui/_next/static/chunks/fc069e49a569d83c.js +1 -0
- package/dist/ui/_next/static/chunks/fc245016ffebdde3.js +1 -0
- package/dist/ui/_next/static/chunks/fc2d01d74dcf3921.js +1 -0
- package/dist/ui/_next/static/chunks/fe2ad0e00041a87d.js +1 -0
- package/dist/ui/_next/static/chunks/fe571740188dea3a.js +1 -0
- package/dist/ui/_next/static/chunks/turbopack-a5ce95b200d58f7a.js +4 -0
- package/dist/ui/_next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
- package/dist/ui/_next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
- package/dist/ui/_next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
- package/dist/ui/_next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_AMS-Regular.892f691b.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_AMS-Regular.c30af439.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_AMS-Regular.e6a3cada.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Caligraphic-Bold.2f97783e.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Caligraphic-Bold.a36b8125.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Caligraphic-Bold.db991531.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Caligraphic-Regular.2b13f013.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Caligraphic-Regular.7c50032c.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Caligraphic-Regular.c20eee08.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Fraktur-Bold.5fa2f5e4.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Fraktur-Bold.d514bd28.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Fraktur-Bold.e311399d.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Fraktur-Regular.18139813.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Fraktur-Regular.2a73476d.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Fraktur-Regular.5d62e468.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Bold.6d137c77.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Bold.c24b5ba7.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Bold.f4e2828d.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-BoldItalic.079b33ae.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-BoldItalic.c003d3ec.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-BoldItalic.f1884480.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Italic.26a3619b.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Italic.61da3e93.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Italic.a3746929.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Regular.12644167.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Regular.876b86ad.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Main-Regular.d511f158.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Math-BoldItalic.5c6a6a93.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Math-BoldItalic.ad4dffd5.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Math-BoldItalic.e73b3bf0.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Math-Italic.03974bc4.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Math-Italic.1cd2c488.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Math-Italic.d8564edb.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Bold.a03f9428.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Bold.d4608ed5.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Bold.ff51ef5c.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Italic.8ed740d6.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Italic.9245afda.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Italic.c0b22b1e.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Regular.128c9bc2.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Regular.156dbd4e.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_SansSerif-Regular.ee7b0a16.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Script-Regular.00d9a561.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Script-Regular.186c7155.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Script-Regular.afc2fd5a.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size1-Regular.4450ef36.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size1-Regular.9aaff96b.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size1-Regular.e5bf4c74.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size2-Regular.6a97527b.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size2-Regular.8fbd32af.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size2-Regular.f11810ed.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size3-Regular.45ae8eba.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size3-Regular.54b7ce9d.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size3-Regular.9812ade2.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size4-Regular.44a4d487.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size4-Regular.927fc5b9.woff2 +0 -0
- package/dist/ui/_next/static/media/KaTeX_Size4-Regular.b211e3d3.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Typewriter-Regular.68b6c3a9.woff +0 -0
- package/dist/ui/_next/static/media/KaTeX_Typewriter-Regular.a1a7ff52.ttf +0 -0
- package/dist/ui/_next/static/media/KaTeX_Typewriter-Regular.ff99d643.woff2 +0 -0
- package/dist/ui/_next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
- package/dist/ui/_next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
- package/dist/ui/_next/static/media/favicon.0b3bf435.ico +0 -0
- package/dist/ui/_not-found/__next._full.txt +18 -0
- package/dist/ui/_not-found/__next._head.txt +6 -0
- package/dist/ui/_not-found/__next._index.txt +9 -0
- package/dist/ui/_not-found/__next._not-found.__PAGE__.txt +5 -0
- package/dist/ui/_not-found/__next._not-found.txt +4 -0
- package/dist/ui/_not-found/__next._tree.txt +3 -0
- package/dist/ui/_not-found/index.html +1 -0
- package/dist/ui/_not-found/index.txt +18 -0
- package/dist/ui/favicon.ico +0 -0
- package/dist/ui/file.svg +1 -0
- package/dist/ui/globe.svg +1 -0
- package/dist/ui/index.html +1 -0
- package/dist/ui/index.txt +25 -0
- package/dist/ui/next.svg +1 -0
- package/dist/ui/vercel.svg +1 -0
- package/dist/ui/window.svg +1 -0
- package/dist/utils/chat-model.d.ts +11 -0
- package/dist/utils/chat-model.js +37 -0
- package/dist/utils/diff-parser.d.ts +20 -0
- package/dist/utils/diff-parser.js +100 -0
- package/dist/utils/proxy-manager.d.ts +18 -0
- package/dist/utils/proxy-manager.js +42 -0
- package/dist/utils/remote-proxy.d.ts +40 -0
- package/dist/utils/remote-proxy.js +145 -0
- package/dist/utils/worktree-paths.d.ts +13 -0
- package/dist/utils/worktree-paths.js +64 -0
- package/dist/virtual-ws-adapter.d.ts +26 -0
- package/dist/virtual-ws-adapter.js +54 -0
- 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
|
+
};
|