neural-loom 0.2.19 → 0.2.41

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 (226) hide show
  1. package/.next/build-manifest.json +3 -3
  2. package/.next/cache/.previewinfo +1 -1
  3. package/.next/cache/.rscinfo +1 -1
  4. package/.next/cache/.tsbuildinfo +1 -1
  5. package/.next/diagnostics/build-diagnostics.json +1 -1
  6. package/.next/fallback-build-manifest.json +3 -3
  7. package/.next/server/app/_global-error/page.js +6 -7
  8. package/.next/server/app/_global-error/page.js.nft.json +1 -1
  9. package/.next/server/app/_not-found/page.js +6 -7
  10. package/.next/server/app/_not-found/page.js.nft.json +1 -1
  11. package/.next/server/app/api/context/aider/route.js +2 -2
  12. package/.next/server/app/api/context/aider/route.js.nft.json +1 -1
  13. package/.next/server/app/api/context/claude/route.js +2 -2
  14. package/.next/server/app/api/context/claude/route.js.nft.json +1 -1
  15. package/.next/server/app/api/context/route.js +2 -2
  16. package/.next/server/app/api/context/route.js.nft.json +1 -1
  17. package/.next/server/app/api/context/ssh/route.js +2 -2
  18. package/.next/server/app/api/context/ssh/route.js.nft.json +1 -1
  19. package/.next/server/app/api/files/route.js +2 -2
  20. package/.next/server/app/api/files/route.js.nft.json +1 -1
  21. package/.next/server/app/api/git/route.js +2 -2
  22. package/.next/server/app/api/git/route.js.nft.json +1 -1
  23. package/.next/server/app/api/recents/route.js +2 -2
  24. package/.next/server/app/api/recents/route.js.nft.json +1 -1
  25. package/.next/server/app/api/sessions/inject/route.js +2 -2
  26. package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -1
  27. package/.next/server/app/api/sessions/input/route.js +2 -2
  28. package/.next/server/app/api/sessions/input/route.js.nft.json +1 -1
  29. package/.next/server/app/api/sessions/launch/route.js +2 -2
  30. package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -1
  31. package/.next/server/app/api/sessions/route.js +2 -2
  32. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  33. package/.next/server/app/api/sessions/scope/route.js +2 -2
  34. package/.next/server/app/api/sessions/scope/route.js.nft.json +1 -1
  35. package/.next/server/app/api/sessions/start/route.js +2 -2
  36. package/.next/server/app/api/sessions/start/route.js.nft.json +1 -1
  37. package/.next/server/app/api/sessions/stats/route.js +2 -2
  38. package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
  39. package/.next/server/app/api/sessions/stop/route.js +2 -2
  40. package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -1
  41. package/.next/server/app/page/react-loadable-manifest.json +4 -4
  42. package/.next/server/app/page.js +6 -7
  43. package/.next/server/app/page.js.nft.json +1 -1
  44. package/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/.next/server/app-paths-manifest.json +0 -1
  46. package/.next/server/chunks/{[externals]_next_dist_0arv.vj._.js → [externals]__048y_op._.js} +2 -2
  47. package/.next/server/chunks/[root-of-the-server]__005xmeg._.js +15 -0
  48. package/.next/server/chunks/{[root-of-the-server]__0iqaxhx._.js.map → [root-of-the-server]__005xmeg._.js.map} +1 -1
  49. package/.next/server/chunks/{[root-of-the-server]__0k6w___._.js → [root-of-the-server]__0656ruo._.js} +3 -3
  50. package/.next/server/chunks/{[root-of-the-server]__0k6w___._.js.map → [root-of-the-server]__0656ruo._.js.map} +1 -1
  51. package/.next/server/chunks/[root-of-the-server]__0969ozy._.js +3 -0
  52. package/.next/server/chunks/{[root-of-the-server]__0l7c-gn._.js.map → [root-of-the-server]__0969ozy._.js.map} +1 -1
  53. package/.next/server/chunks/[root-of-the-server]__0_~zjnf._.js +15 -0
  54. package/.next/server/chunks/{[root-of-the-server]__0qz~w0~._.js.map → [root-of-the-server]__0_~zjnf._.js.map} +1 -1
  55. package/.next/server/chunks/[root-of-the-server]__0d0pykb._.js +9 -9
  56. package/.next/server/chunks/[root-of-the-server]__0d0pykb._.js.map +1 -1
  57. package/.next/server/chunks/[root-of-the-server]__0hl8jxx._.js +15 -0
  58. package/.next/server/chunks/{[root-of-the-server]__0bi3d5z._.js.map → [root-of-the-server]__0hl8jxx._.js.map} +1 -1
  59. package/.next/server/chunks/[root-of-the-server]__0ho7s6e._.js +15 -0
  60. package/.next/server/chunks/{[root-of-the-server]__0-lisav._.js.map → [root-of-the-server]__0ho7s6e._.js.map} +1 -1
  61. package/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js → [root-of-the-server]__0i83~95._.js} +2 -2
  62. package/.next/server/chunks/{[root-of-the-server]__0j8-xkl._.js.map → [root-of-the-server]__0i83~95._.js.map} +1 -1
  63. package/.next/server/chunks/[root-of-the-server]__0kn5tap._.js +4 -0
  64. package/.next/server/chunks/{[root-of-the-server]__0ntt3om._.js.map → [root-of-the-server]__0kn5tap._.js.map} +1 -1
  65. package/.next/server/chunks/[root-of-the-server]__0lh_jn-._.js +15 -0
  66. package/.next/server/chunks/{[root-of-the-server]__0__9rdk._.js.map → [root-of-the-server]__0lh_jn-._.js.map} +1 -1
  67. package/.next/server/chunks/[root-of-the-server]__0mq3k0u._.js +15 -0
  68. package/.next/server/chunks/{[root-of-the-server]__0_2_i_q._.js.map → [root-of-the-server]__0mq3k0u._.js.map} +1 -1
  69. package/.next/server/chunks/[root-of-the-server]__0n-zban._.js +3 -0
  70. package/.next/server/chunks/{[root-of-the-server]__0p~u94k._.js.map → [root-of-the-server]__0n-zban._.js.map} +1 -1
  71. package/.next/server/chunks/[root-of-the-server]__0rr36fm._.js +15 -0
  72. package/.next/server/chunks/{[root-of-the-server]__0m91xif._.js.map → [root-of-the-server]__0rr36fm._.js.map} +1 -1
  73. package/.next/server/chunks/[root-of-the-server]__0sa_gpm._.js +3 -0
  74. package/.next/server/chunks/[root-of-the-server]__0sa_gpm._.js.map +1 -0
  75. package/.next/server/chunks/[root-of-the-server]__0vp8-ka._.js +3 -0
  76. package/.next/server/chunks/{[root-of-the-server]__0qyrt6_._.js.map → [root-of-the-server]__0vp8-ka._.js.map} +1 -1
  77. package/.next/server/chunks/[root-of-the-server]__0xcrc-1._.js +15 -0
  78. package/.next/server/chunks/[root-of-the-server]__0xcrc-1._.js.map +1 -0
  79. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0ev3h.z.js +1 -1
  80. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0ev3h.z.js.map +1 -1
  81. package/.next/server/chunks/ssr/[root-of-the-server]__0cbmrds._.js +3 -0
  82. package/.next/server/chunks/ssr/[root-of-the-server]__0cbmrds._.js.map +1 -0
  83. package/.next/server/chunks/ssr/[root-of-the-server]__0ni-l5l._.js +3 -0
  84. package/.next/server/chunks/ssr/[root-of-the-server]__0ni-l5l._.js.map +1 -0
  85. package/.next/server/chunks/ssr/{[root-of-the-server]__089dc4i._.js → [root-of-the-server]__0tcyn68._.js} +2 -2
  86. package/.next/server/chunks/ssr/[root-of-the-server]__0tcyn68._.js.map +1 -0
  87. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +1 -1
  88. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +1 -1
  89. package/.next/server/chunks/ssr/[root-of-the-server]__0yj_dfr._.js +3 -0
  90. package/.next/server/chunks/ssr/[root-of-the-server]__0yj_dfr._.js.map +1 -0
  91. package/.next/server/chunks/ssr/_0t7oqy6._.js +1 -1
  92. package/.next/server/chunks/ssr/_0t7oqy6._.js.map +1 -1
  93. package/.next/server/chunks/ssr/{node_modules_next_dist_0ppctuh._.js → node_modules_next_dist_0-g.jog._.js} +2 -2
  94. package/.next/server/chunks/ssr/node_modules_next_dist_0-g.jog._.js.map +1 -0
  95. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0bj8dkg.js +4 -0
  96. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0bj8dkg.js.map +1 -0
  97. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0cvrgh7.js +4 -0
  98. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0cvrgh7.js.map +1 -0
  99. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js +4 -0
  100. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0rc3ul_.js.map +1 -0
  101. package/.next/server/middleware-build-manifest.js +3 -3
  102. package/.next/server/pages-manifest.json +1 -4
  103. package/.next/server/server-reference-manifest.js +1 -1
  104. package/.next/server/server-reference-manifest.json +1 -1
  105. package/.next/static/ZtSBLhTiGqKpNetcymWiC/_ssgManifest.js +1 -0
  106. package/.next/static/chunks/{0x__nd4avi0fg.js → 070hz362~_h8n.js} +1 -1
  107. package/.next/static/chunks/0bclk7hf35ac4.js +1 -0
  108. package/.next/static/chunks/0kkoif8x_kxrq.js +1 -0
  109. package/.next/static/chunks/{0pp.lp89pntpv.css → 0m-_sw1425nkp.css} +1 -1
  110. package/.next/static/chunks/17jifiroq0_q..js +1 -0
  111. package/package.json +1 -1
  112. package/public/logo.png +0 -0
  113. package/public/manifest.json +22 -0
  114. package/public/sw.js +12 -0
  115. package/src/app/api/context/aider/route.ts +6 -1
  116. package/src/app/api/files/route.ts +20 -8
  117. package/src/app/api/git/route.ts +117 -1
  118. package/src/app/api/sessions/route.ts +4 -1
  119. package/src/app/components/AiderWizard.tsx +19 -1
  120. package/src/app/components/IdeLayout.tsx +1215 -112
  121. package/src/app/components/MarkdownPreview.tsx +528 -0
  122. package/src/app/components/TerminalConsole.tsx +2 -2
  123. package/src/app/layout.tsx +5 -0
  124. package/src/app/page.module.css +2 -0
  125. package/src/app/page.tsx +42 -19
  126. package/src/lib/agents/AiderRunner.ts +83 -44
  127. package/src/lib/agents/ClaudeRunner.ts +43 -18
  128. package/src/lib/agents/DockerRunner.ts +1 -3
  129. package/src/lib/agents/SSHRunner.ts +1 -3
  130. package/src/lib/agents/SessionManager.ts +18 -9
  131. package/src/lib/agents/SessionPersister.ts +10 -0
  132. package/src/lib/agents/ShellRunner.ts +1 -3
  133. package/src/lib/agents/WebSocketServer.ts +20 -13
  134. package/.next/BUILD_ID +0 -1
  135. package/.next/app-path-routes-manifest.json +0 -21
  136. package/.next/diagnostics/route-bundle-stats.json +0 -25
  137. package/.next/export-marker.json +0 -6
  138. package/.next/images-manifest.json +0 -68
  139. package/.next/prerender-manifest.json +0 -114
  140. package/.next/required-server-files.js +0 -335
  141. package/.next/required-server-files.json +0 -335
  142. package/.next/routes-manifest.json +0 -159
  143. package/.next/server/app/_global-error.html +0 -1
  144. package/.next/server/app/_global-error.meta +0 -15
  145. package/.next/server/app/_global-error.rsc +0 -15
  146. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +0 -5
  147. package/.next/server/app/_global-error.segments/_full.segment.rsc +0 -15
  148. package/.next/server/app/_global-error.segments/_head.segment.rsc +0 -6
  149. package/.next/server/app/_global-error.segments/_index.segment.rsc +0 -5
  150. package/.next/server/app/_global-error.segments/_tree.segment.rsc +0 -1
  151. package/.next/server/app/_not-found.html +0 -1
  152. package/.next/server/app/_not-found.meta +0 -16
  153. package/.next/server/app/_not-found.rsc +0 -16
  154. package/.next/server/app/_not-found.segments/_full.segment.rsc +0 -16
  155. package/.next/server/app/_not-found.segments/_head.segment.rsc +0 -6
  156. package/.next/server/app/_not-found.segments/_index.segment.rsc +0 -5
  157. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +0 -5
  158. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +0 -5
  159. package/.next/server/app/_not-found.segments/_tree.segment.rsc +0 -2
  160. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +0 -3
  161. package/.next/server/app/favicon.ico/route/build-manifest.json +0 -9
  162. package/.next/server/app/favicon.ico/route.js +0 -7
  163. package/.next/server/app/favicon.ico/route.js.map +0 -5
  164. package/.next/server/app/favicon.ico/route.js.nft.json +0 -1
  165. package/.next/server/app/favicon.ico.body +0 -0
  166. package/.next/server/app/favicon.ico.meta +0 -1
  167. package/.next/server/app/index.html +0 -1
  168. package/.next/server/app/index.meta +0 -14
  169. package/.next/server/app/index.rsc +0 -21
  170. package/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -10
  171. package/.next/server/app/index.segments/_full.segment.rsc +0 -21
  172. package/.next/server/app/index.segments/_head.segment.rsc +0 -6
  173. package/.next/server/app/index.segments/_index.segment.rsc +0 -5
  174. package/.next/server/app/index.segments/_tree.segment.rsc +0 -5
  175. package/.next/server/chunks/[externals]__1334_78._.js +0 -3
  176. package/.next/server/chunks/[externals]_next_dist_0arv.vj._.js.map +0 -1
  177. package/.next/server/chunks/[root-of-the-server]__0-lisav._.js +0 -15
  178. package/.next/server/chunks/[root-of-the-server]__0_2_i_q._.js +0 -15
  179. package/.next/server/chunks/[root-of-the-server]__0__9rdk._.js +0 -15
  180. package/.next/server/chunks/[root-of-the-server]__0bi3d5z._.js +0 -15
  181. package/.next/server/chunks/[root-of-the-server]__0iqaxhx._.js +0 -15
  182. package/.next/server/chunks/[root-of-the-server]__0l7c-gn._.js +0 -3
  183. package/.next/server/chunks/[root-of-the-server]__0m91xif._.js +0 -15
  184. package/.next/server/chunks/[root-of-the-server]__0ntt3om._.js +0 -3
  185. package/.next/server/chunks/[root-of-the-server]__0p~u94k._.js +0 -3
  186. package/.next/server/chunks/[root-of-the-server]__0qyrt6_._.js +0 -3
  187. package/.next/server/chunks/[root-of-the-server]__0qz~w0~._.js +0 -15
  188. package/.next/server/chunks/[root-of-the-server]__0ty8hwz._.js +0 -15
  189. package/.next/server/chunks/[root-of-the-server]__0ty8hwz._.js.map +0 -1
  190. package/.next/server/chunks/[root-of-the-server]__0ylcu31._.js +0 -3
  191. package/.next/server/chunks/[root-of-the-server]__0ylcu31._.js.map +0 -1
  192. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +0 -3
  193. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js.map +0 -1
  194. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0m.429v.js +0 -3
  195. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0m.429v.js.map +0 -1
  196. package/.next/server/chunks/ssr/[root-of-the-server]__089dc4i._.js.map +0 -1
  197. package/.next/server/chunks/ssr/[root-of-the-server]__0_7i5h0._.js +0 -3
  198. package/.next/server/chunks/ssr/[root-of-the-server]__0_7i5h0._.js.map +0 -1
  199. package/.next/server/chunks/ssr/[root-of-the-server]__0hw~y-4._.js +0 -3
  200. package/.next/server/chunks/ssr/[root-of-the-server]__0hw~y-4._.js.map +0 -1
  201. package/.next/server/chunks/ssr/[root-of-the-server]__0~y8ue.._.js +0 -3
  202. package/.next/server/chunks/ssr/[root-of-the-server]__0~y8ue.._.js.map +0 -1
  203. package/.next/server/chunks/ssr/node_modules_05l396c._.js +0 -3
  204. package/.next/server/chunks/ssr/node_modules_05l396c._.js.map +0 -1
  205. package/.next/server/chunks/ssr/node_modules_next_dist_0ppctuh._.js.map +0 -1
  206. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03-z2qq.js +0 -4
  207. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03-z2qq.js.map +0 -1
  208. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07vh7rm.js +0 -4
  209. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07vh7rm.js.map +0 -1
  210. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qp4u6g.js +0 -4
  211. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qp4u6g.js.map +0 -1
  212. package/.next/server/functions-config-manifest.json +0 -4
  213. package/.next/server/pages/404.html +0 -1
  214. package/.next/server/pages/500.html +0 -1
  215. package/.next/server/prefetch-hints.json +0 -1
  216. package/.next/static/W3UxhE_D02EcHxTzdXKHX/_ssgManifest.js +0 -1
  217. package/.next/static/chunks/01.1lqu6kmllv.js +0 -1
  218. package/.next/static/chunks/0ek0280331wie.js +0 -1
  219. package/.next/static/chunks/0jxar8nsw_py3.js +0 -1
  220. package/.next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
  221. package/.next/trace +0 -1
  222. package/.next/trace-build +0 -1
  223. package/src/app/favicon.ico +0 -0
  224. /package/.next/server/chunks/{[externals]__1334_78._.js.map → [externals]__048y_op._.js.map} +0 -0
  225. /package/.next/static/{W3UxhE_D02EcHxTzdXKHX → ZtSBLhTiGqKpNetcymWiC}/_buildManifest.js +0 -0
  226. /package/.next/static/{W3UxhE_D02EcHxTzdXKHX → ZtSBLhTiGqKpNetcymWiC}/_clientMiddlewareManifest.js +0 -0
@@ -27,6 +27,8 @@ export async function GET(request: Request) {
27
27
  const lines = stdout.split(/\r?\n/).filter(Boolean);
28
28
  const files = lines.map(line => {
29
29
  // porcelain format: XY path or XY "path"
30
+ const indexStatus = line.substring(0, 1);
31
+ const worktreeStatus = line.substring(1, 2);
30
32
  const status = line.substring(0, 2);
31
33
  let relativePath = line.substring(3).trim();
32
34
  // Remove quotes if git quoted the path
@@ -36,13 +38,34 @@ export async function GET(request: Request) {
36
38
  const absolutePath = path.join(targetRoot, relativePath).replace(/\\/g, "/");
37
39
  return {
38
40
  status: status.trim(),
41
+ indexStatus,
42
+ worktreeStatus,
39
43
  relativePath,
40
44
  absolutePath,
41
45
  name: path.basename(relativePath)
42
46
  };
43
47
  });
44
48
 
45
- return NextResponse.json({ success: true, isGit: true, files });
49
+ // Get branch name
50
+ let branch = "";
51
+ try {
52
+ const { stdout: branchOut } = await execPromise("git rev-parse --abbrev-ref HEAD", { cwd: targetRoot });
53
+ branch = branchOut.trim();
54
+ } catch {}
55
+
56
+ // Get ahead/behind sync count
57
+ let ahead = 0;
58
+ let behind = 0;
59
+ try {
60
+ const { stdout: syncOut } = await execPromise("git rev-list --left-right --count HEAD...@{u}", { cwd: targetRoot });
61
+ const parts = syncOut.trim().split(/\s+/);
62
+ if (parts.length === 2) {
63
+ ahead = parseInt(parts[0], 10) || 0;
64
+ behind = parseInt(parts[1], 10) || 0;
65
+ }
66
+ } catch {}
67
+
68
+ return NextResponse.json({ success: true, isGit: true, files, branch, ahead, behind });
46
69
  }
47
70
 
48
71
  if (action === "diff") {
@@ -79,3 +102,96 @@ export async function GET(request: Request) {
79
102
  return NextResponse.json({ error: errorMessage }, { status: 500 });
80
103
  }
81
104
  }
105
+
106
+ export async function POST(request: Request) {
107
+ try {
108
+ const body = await request.json();
109
+ const { action, rootPath, file, message } = body;
110
+
111
+ const targetRoot = ((rootPath && fs.existsSync(rootPath)) ? rootPath : process.env.ORIGINAL_CWD || process.cwd()).replace(/\\/g, "/");
112
+
113
+ // Check if it's a git repo
114
+ try {
115
+ await execPromise("git rev-parse --is-inside-work-tree", { cwd: targetRoot });
116
+ } catch {
117
+ return NextResponse.json({ error: "Not a git repository" }, { status: 400 });
118
+ }
119
+
120
+ if (action === "stage") {
121
+ if (file) {
122
+ await execPromise(`git add ${JSON.stringify(file)}`, { cwd: targetRoot });
123
+ } else {
124
+ await execPromise("git add -A", { cwd: targetRoot });
125
+ }
126
+ return NextResponse.json({ success: true });
127
+ }
128
+
129
+ if (action === "unstage") {
130
+ if (file) {
131
+ await execPromise(`git reset HEAD -- ${JSON.stringify(file)}`, { cwd: targetRoot });
132
+ } else {
133
+ await execPromise("git reset HEAD -- .", { cwd: targetRoot });
134
+ }
135
+ return NextResponse.json({ success: true });
136
+ }
137
+
138
+ if (action === "discard") {
139
+ if (!file) {
140
+ return NextResponse.json({ error: "Missing file parameter" }, { status: 400 });
141
+ }
142
+ const absolutePath = path.resolve(targetRoot, file).replace(/\\/g, "/");
143
+ // Check status to see if it is untracked
144
+ const { stdout: statusOut } = await execPromise("git status --porcelain -- " + JSON.stringify(file), { cwd: targetRoot });
145
+ const isUntracked = statusOut.startsWith("??");
146
+
147
+ if (isUntracked) {
148
+ if (fs.existsSync(absolutePath)) {
149
+ fs.unlinkSync(absolutePath);
150
+ }
151
+ } else {
152
+ await execPromise(`git checkout -- ${JSON.stringify(file)}`, { cwd: targetRoot });
153
+ }
154
+ return NextResponse.json({ success: true });
155
+ }
156
+
157
+ if (action === "commit") {
158
+ if (!message || !message.trim()) {
159
+ return NextResponse.json({ error: "Commit message cannot be empty" }, { status: 400 });
160
+ }
161
+ const { stdout } = await execPromise(`git commit -m ${JSON.stringify(message.trim())}`, { cwd: targetRoot });
162
+ return NextResponse.json({ success: true, output: stdout });
163
+ }
164
+
165
+ if (action === "ignore") {
166
+ if (!file) {
167
+ return NextResponse.json({ error: "Missing file parameter" }, { status: 400 });
168
+ }
169
+ const gitignorePath = path.join(targetRoot, ".gitignore");
170
+ let content = "";
171
+ if (fs.existsSync(gitignorePath)) {
172
+ content = fs.readFileSync(gitignorePath, "utf8");
173
+ }
174
+ const lines = content.split(/\r?\n/);
175
+ if (!lines.includes(file)) {
176
+ const separator = (content.endsWith("\n") || content === "") ? "" : "\n";
177
+ fs.appendFileSync(gitignorePath, `${separator}${file}\n`);
178
+ }
179
+ return NextResponse.json({ success: true });
180
+ }
181
+
182
+ if (action === "pull") {
183
+ const { stdout, stderr } = await execPromise("git pull", { cwd: targetRoot });
184
+ return NextResponse.json({ success: true, output: stdout + stderr });
185
+ }
186
+
187
+ if (action === "push") {
188
+ const { stdout, stderr } = await execPromise("git push", { cwd: targetRoot });
189
+ return NextResponse.json({ success: true, output: stdout + stderr });
190
+ }
191
+
192
+ return NextResponse.json({ error: "Invalid action" }, { status: 400 });
193
+ } catch (error) {
194
+ const errorMessage = error instanceof Error ? error.message : "Unknown error";
195
+ return NextResponse.json({ error: errorMessage }, { status: 500 });
196
+ }
197
+ }
@@ -1,5 +1,6 @@
1
1
  import { NextResponse } from "next/server";
2
2
  import { SessionManager } from "@/lib/agents/SessionManager";
3
+ import pkg from "../../../../package.json";
3
4
 
4
5
  declare global {
5
6
  var wsPort: number | undefined;
@@ -20,15 +21,17 @@ export async function GET(request: Request) {
20
21
  ...session.getStatus(),
21
22
  logs: session.logs,
22
23
  wsPort: global.wsPort || 3001,
24
+ version: pkg.version,
23
25
  });
24
26
  }
25
27
 
26
28
  const sessions = manager.listSessions();
27
29
  const originalCwd = process.env.ORIGINAL_CWD || process.cwd();
28
30
  const wsPort = global.wsPort || 3001;
29
- return NextResponse.json({ sessions, originalCwd, wsPort });
31
+ return NextResponse.json({ sessions, originalCwd, wsPort, version: pkg.version });
30
32
  } catch (error) {
31
33
  const errorMessage = error instanceof Error ? error.message : "Unknown error";
32
34
  return NextResponse.json({ error: errorMessage }, { status: 500 });
33
35
  }
34
36
  }
37
+
@@ -11,6 +11,7 @@ interface AiderConfig {
11
11
  extraFlags: string;
12
12
  workspaceRoot: string;
13
13
  scopedDirs: string[];
14
+ loadAllFiles: boolean;
14
15
  }
15
16
 
16
17
  interface AiderWizardProps {
@@ -28,6 +29,7 @@ export default function AiderWizard({ onClose, onConfirmLaunch, isDocker }: Aide
28
29
  extraFlags: "",
29
30
  workspaceRoot: "",
30
31
  scopedDirs: [],
32
+ loadAllFiles: true,
31
33
  });
32
34
 
33
35
  const [newScopePath, setNewScopePath] = useState("");
@@ -54,6 +56,7 @@ export default function AiderWizard({ onClose, onConfirmLaunch, isDocker }: Aide
54
56
  extraFlags: data.config.extraFlags || "",
55
57
  workspaceRoot: data.config.workspaceRoot || "",
56
58
  scopedDirs: data.config.scopedDirs || [],
59
+ loadAllFiles: data.config.loadAllFiles !== false,
57
60
  });
58
61
  }
59
62
  }
@@ -314,9 +317,11 @@ export default function AiderWizard({ onClose, onConfirmLaunch, isDocker }: Aide
314
317
  style={selectStyle}
315
318
  >
316
319
  <option value="claude-3-5-sonnet">Claude 3.5 Sonnet (Recommended)</option>
320
+ <option value="gemini/gemini-2.5-flash">Gemini 2.5 Flash (Recommended for Free Tier)</option>
321
+ <option value="gemini/gemini-2.5-pro">Gemini 2.5 Pro (Requires Paid/Billing Tier)</option>
322
+ <option value="gemini/gemini-2.0-flash-exp">Gemini 2.0 Flash Exp</option>
317
323
  <option value="gemini/gemini-1.5-pro">Gemini 1.5 Pro</option>
318
324
  <option value="gemini/gemini-1.5-flash">Gemini 1.5 Flash</option>
319
- <option value="gemini/gemini-2.0-flash-exp">Gemini 2.0 Flash Exp</option>
320
325
  <option value="gpt-4o">GPT-4o</option>
321
326
  <option value="deepseek/deepseek-coder">DeepSeek Coder</option>
322
327
  <option value="gpt-4-turbo">GPT-4 Turbo</option>
@@ -337,6 +342,19 @@ export default function AiderWizard({ onClose, onConfirmLaunch, isDocker }: Aide
337
342
  </span>
338
343
  </div>
339
344
 
345
+ <div style={{ display: "flex", alignItems: "center", gap: "0.5rem", marginTop: "0.25rem", marginBottom: "1.25rem" }}>
346
+ <input
347
+ type="checkbox"
348
+ id="loadAllFiles"
349
+ checked={config.loadAllFiles}
350
+ onChange={(e) => setConfig({ ...config, loadAllFiles: e.target.checked })}
351
+ style={{ width: "16px", height: "16px", cursor: "pointer", accentColor: "var(--accent)" }}
352
+ />
353
+ <label htmlFor="loadAllFiles" style={{ fontSize: "0.8rem", color: "var(--foreground)", cursor: "pointer", userSelect: "none" }}>
354
+ Load all files in root directory on startup
355
+ </label>
356
+ </div>
357
+
340
358
  {errorMessage && (
341
359
  <div style={errorBoxStyle}>
342
360
  ✗ {errorMessage}