neural-loom 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (368) hide show
  1. package/.next/BUILD_ID +1 -0
  2. package/.next/app-path-routes-manifest.json +18 -0
  3. package/.next/build-manifest.json +20 -0
  4. package/.next/cache/.previewinfo +1 -0
  5. package/.next/cache/.rscinfo +1 -0
  6. package/.next/cache/.tsbuildinfo +1 -0
  7. package/.next/diagnostics/build-diagnostics.json +6 -0
  8. package/.next/diagnostics/framework.json +1 -0
  9. package/.next/diagnostics/route-bundle-stats.json +25 -0
  10. package/.next/export-marker.json +6 -0
  11. package/.next/fallback-build-manifest.json +13 -0
  12. package/.next/images-manifest.json +68 -0
  13. package/.next/next-minimal-server.js.nft.json +1 -0
  14. package/.next/next-server.js.nft.json +1 -0
  15. package/.next/package.json +1 -0
  16. package/.next/prerender-manifest.json +114 -0
  17. package/.next/required-server-files.js +332 -0
  18. package/.next/required-server-files.json +332 -0
  19. package/.next/routes-manifest.json +141 -0
  20. package/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  21. package/.next/server/app/_global-error/page/build-manifest.json +16 -0
  22. package/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  23. package/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  24. package/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  25. package/.next/server/app/_global-error/page.js +10 -0
  26. package/.next/server/app/_global-error/page.js.map +5 -0
  27. package/.next/server/app/_global-error/page.js.nft.json +1 -0
  28. package/.next/server/app/_global-error/page_client-reference-manifest.js +3 -0
  29. package/.next/server/app/_global-error.html +1 -0
  30. package/.next/server/app/_global-error.meta +15 -0
  31. package/.next/server/app/_global-error.rsc +15 -0
  32. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  33. package/.next/server/app/_global-error.segments/_full.segment.rsc +15 -0
  34. package/.next/server/app/_global-error.segments/_head.segment.rsc +6 -0
  35. package/.next/server/app/_global-error.segments/_index.segment.rsc +5 -0
  36. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  37. package/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  38. package/.next/server/app/_not-found/page/build-manifest.json +16 -0
  39. package/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  40. package/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  41. package/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  42. package/.next/server/app/_not-found/page.js +13 -0
  43. package/.next/server/app/_not-found/page.js.map +5 -0
  44. package/.next/server/app/_not-found/page.js.nft.json +1 -0
  45. package/.next/server/app/_not-found/page_client-reference-manifest.js +3 -0
  46. package/.next/server/app/_not-found.html +1 -0
  47. package/.next/server/app/_not-found.meta +16 -0
  48. package/.next/server/app/_not-found.rsc +16 -0
  49. package/.next/server/app/_not-found.segments/_full.segment.rsc +16 -0
  50. package/.next/server/app/_not-found.segments/_head.segment.rsc +6 -0
  51. package/.next/server/app/_not-found.segments/_index.segment.rsc +5 -0
  52. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  53. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +5 -0
  54. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -0
  55. package/.next/server/app/api/context/aider/route/app-paths-manifest.json +3 -0
  56. package/.next/server/app/api/context/aider/route/build-manifest.json +9 -0
  57. package/.next/server/app/api/context/aider/route/server-reference-manifest.json +4 -0
  58. package/.next/server/app/api/context/aider/route.js +6 -0
  59. package/.next/server/app/api/context/aider/route.js.map +5 -0
  60. package/.next/server/app/api/context/aider/route.js.nft.json +1 -0
  61. package/.next/server/app/api/context/aider/route_client-reference-manifest.js +3 -0
  62. package/.next/server/app/api/context/claude/route/app-paths-manifest.json +3 -0
  63. package/.next/server/app/api/context/claude/route/build-manifest.json +9 -0
  64. package/.next/server/app/api/context/claude/route/server-reference-manifest.json +4 -0
  65. package/.next/server/app/api/context/claude/route.js +6 -0
  66. package/.next/server/app/api/context/claude/route.js.map +5 -0
  67. package/.next/server/app/api/context/claude/route.js.nft.json +1 -0
  68. package/.next/server/app/api/context/claude/route_client-reference-manifest.js +3 -0
  69. package/.next/server/app/api/context/route/app-paths-manifest.json +3 -0
  70. package/.next/server/app/api/context/route/build-manifest.json +9 -0
  71. package/.next/server/app/api/context/route/server-reference-manifest.json +4 -0
  72. package/.next/server/app/api/context/route.js +6 -0
  73. package/.next/server/app/api/context/route.js.map +5 -0
  74. package/.next/server/app/api/context/route.js.nft.json +1 -0
  75. package/.next/server/app/api/context/route_client-reference-manifest.js +3 -0
  76. package/.next/server/app/api/context/ssh/route/app-paths-manifest.json +3 -0
  77. package/.next/server/app/api/context/ssh/route/build-manifest.json +9 -0
  78. package/.next/server/app/api/context/ssh/route/server-reference-manifest.json +4 -0
  79. package/.next/server/app/api/context/ssh/route.js +6 -0
  80. package/.next/server/app/api/context/ssh/route.js.map +5 -0
  81. package/.next/server/app/api/context/ssh/route.js.nft.json +1 -0
  82. package/.next/server/app/api/context/ssh/route_client-reference-manifest.js +3 -0
  83. package/.next/server/app/api/files/route/app-paths-manifest.json +3 -0
  84. package/.next/server/app/api/files/route/build-manifest.json +9 -0
  85. package/.next/server/app/api/files/route/server-reference-manifest.json +4 -0
  86. package/.next/server/app/api/files/route.js +7 -0
  87. package/.next/server/app/api/files/route.js.map +5 -0
  88. package/.next/server/app/api/files/route.js.nft.json +1 -0
  89. package/.next/server/app/api/files/route_client-reference-manifest.js +3 -0
  90. package/.next/server/app/api/git/route/app-paths-manifest.json +3 -0
  91. package/.next/server/app/api/git/route/build-manifest.json +9 -0
  92. package/.next/server/app/api/git/route/server-reference-manifest.json +4 -0
  93. package/.next/server/app/api/git/route.js +6 -0
  94. package/.next/server/app/api/git/route.js.map +5 -0
  95. package/.next/server/app/api/git/route.js.nft.json +1 -0
  96. package/.next/server/app/api/git/route_client-reference-manifest.js +3 -0
  97. package/.next/server/app/api/sessions/inject/route/app-paths-manifest.json +3 -0
  98. package/.next/server/app/api/sessions/inject/route/build-manifest.json +9 -0
  99. package/.next/server/app/api/sessions/inject/route/server-reference-manifest.json +4 -0
  100. package/.next/server/app/api/sessions/inject/route.js +7 -0
  101. package/.next/server/app/api/sessions/inject/route.js.map +5 -0
  102. package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -0
  103. package/.next/server/app/api/sessions/inject/route_client-reference-manifest.js +3 -0
  104. package/.next/server/app/api/sessions/input/route/app-paths-manifest.json +3 -0
  105. package/.next/server/app/api/sessions/input/route/build-manifest.json +9 -0
  106. package/.next/server/app/api/sessions/input/route/server-reference-manifest.json +4 -0
  107. package/.next/server/app/api/sessions/input/route.js +7 -0
  108. package/.next/server/app/api/sessions/input/route.js.map +5 -0
  109. package/.next/server/app/api/sessions/input/route.js.nft.json +1 -0
  110. package/.next/server/app/api/sessions/input/route_client-reference-manifest.js +3 -0
  111. package/.next/server/app/api/sessions/launch/route/app-paths-manifest.json +3 -0
  112. package/.next/server/app/api/sessions/launch/route/build-manifest.json +9 -0
  113. package/.next/server/app/api/sessions/launch/route/server-reference-manifest.json +4 -0
  114. package/.next/server/app/api/sessions/launch/route.js +7 -0
  115. package/.next/server/app/api/sessions/launch/route.js.map +5 -0
  116. package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -0
  117. package/.next/server/app/api/sessions/launch/route_client-reference-manifest.js +3 -0
  118. package/.next/server/app/api/sessions/route/app-paths-manifest.json +3 -0
  119. package/.next/server/app/api/sessions/route/build-manifest.json +9 -0
  120. package/.next/server/app/api/sessions/route/server-reference-manifest.json +4 -0
  121. package/.next/server/app/api/sessions/route.js +7 -0
  122. package/.next/server/app/api/sessions/route.js.map +5 -0
  123. package/.next/server/app/api/sessions/route.js.nft.json +1 -0
  124. package/.next/server/app/api/sessions/route_client-reference-manifest.js +3 -0
  125. package/.next/server/app/api/sessions/stats/route/app-paths-manifest.json +3 -0
  126. package/.next/server/app/api/sessions/stats/route/build-manifest.json +9 -0
  127. package/.next/server/app/api/sessions/stats/route/server-reference-manifest.json +4 -0
  128. package/.next/server/app/api/sessions/stats/route.js +7 -0
  129. package/.next/server/app/api/sessions/stats/route.js.map +5 -0
  130. package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -0
  131. package/.next/server/app/api/sessions/stats/route_client-reference-manifest.js +3 -0
  132. package/.next/server/app/api/sessions/stop/route/app-paths-manifest.json +3 -0
  133. package/.next/server/app/api/sessions/stop/route/build-manifest.json +9 -0
  134. package/.next/server/app/api/sessions/stop/route/server-reference-manifest.json +4 -0
  135. package/.next/server/app/api/sessions/stop/route.js +7 -0
  136. package/.next/server/app/api/sessions/stop/route.js.map +5 -0
  137. package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -0
  138. package/.next/server/app/api/sessions/stop/route_client-reference-manifest.js +3 -0
  139. package/.next/server/app/favicon.ico/route/app-paths-manifest.json +3 -0
  140. package/.next/server/app/favicon.ico/route/build-manifest.json +9 -0
  141. package/.next/server/app/favicon.ico/route.js +7 -0
  142. package/.next/server/app/favicon.ico/route.js.map +5 -0
  143. package/.next/server/app/favicon.ico/route.js.nft.json +1 -0
  144. package/.next/server/app/favicon.ico.body +0 -0
  145. package/.next/server/app/favicon.ico.meta +1 -0
  146. package/.next/server/app/index.html +1 -0
  147. package/.next/server/app/index.meta +14 -0
  148. package/.next/server/app/index.rsc +21 -0
  149. package/.next/server/app/index.segments/__PAGE__.segment.rsc +10 -0
  150. package/.next/server/app/index.segments/_full.segment.rsc +21 -0
  151. package/.next/server/app/index.segments/_head.segment.rsc +6 -0
  152. package/.next/server/app/index.segments/_index.segment.rsc +5 -0
  153. package/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  154. package/.next/server/app/page/app-paths-manifest.json +3 -0
  155. package/.next/server/app/page/build-manifest.json +16 -0
  156. package/.next/server/app/page/next-font-manifest.json +11 -0
  157. package/.next/server/app/page/react-loadable-manifest.json +42 -0
  158. package/.next/server/app/page/server-reference-manifest.json +4 -0
  159. package/.next/server/app/page.js +14 -0
  160. package/.next/server/app/page.js.map +5 -0
  161. package/.next/server/app/page.js.nft.json +1 -0
  162. package/.next/server/app/page_client-reference-manifest.js +3 -0
  163. package/.next/server/app-paths-manifest.json +18 -0
  164. package/.next/server/chunks/[externals]__0shxiss._.js +3 -0
  165. package/.next/server/chunks/[externals]__0shxiss._.js.map +1 -0
  166. package/.next/server/chunks/[externals]_next_dist_0arv.vj._.js +3 -0
  167. package/.next/server/chunks/[externals]_next_dist_0arv.vj._.js.map +1 -0
  168. package/.next/server/chunks/[externals]_node-pty_12c-8pf._.js +3 -0
  169. package/.next/server/chunks/[externals]_node-pty_12c-8pf._.js.map +1 -0
  170. package/.next/server/chunks/[root-of-the-server]__0-k9zyi._.js +15 -0
  171. package/.next/server/chunks/[root-of-the-server]__0-k9zyi._.js.map +1 -0
  172. package/.next/server/chunks/[root-of-the-server]__04kdofw._.js +15 -0
  173. package/.next/server/chunks/[root-of-the-server]__04kdofw._.js.map +1 -0
  174. package/.next/server/chunks/[root-of-the-server]__0c.5qbe._.js +15 -0
  175. package/.next/server/chunks/[root-of-the-server]__0c.5qbe._.js.map +1 -0
  176. package/.next/server/chunks/[root-of-the-server]__0d0pykb._.js +28 -0
  177. package/.next/server/chunks/[root-of-the-server]__0d0pykb._.js.map +1 -0
  178. package/.next/server/chunks/[root-of-the-server]__0e5cwnx._.js +3 -0
  179. package/.next/server/chunks/[root-of-the-server]__0e5cwnx._.js.map +1 -0
  180. package/.next/server/chunks/[root-of-the-server]__0efi5cr._.js +3 -0
  181. package/.next/server/chunks/[root-of-the-server]__0efi5cr._.js.map +1 -0
  182. package/.next/server/chunks/[root-of-the-server]__0j8-xkl._.js +13 -0
  183. package/.next/server/chunks/[root-of-the-server]__0j8-xkl._.js.map +1 -0
  184. package/.next/server/chunks/[root-of-the-server]__0k6w___._.js +15 -0
  185. package/.next/server/chunks/[root-of-the-server]__0k6w___._.js.map +1 -0
  186. package/.next/server/chunks/[root-of-the-server]__0l7c-gn._.js +3 -0
  187. package/.next/server/chunks/[root-of-the-server]__0l7c-gn._.js.map +1 -0
  188. package/.next/server/chunks/[root-of-the-server]__0l_q72g._.js +15 -0
  189. package/.next/server/chunks/[root-of-the-server]__0l_q72g._.js.map +1 -0
  190. package/.next/server/chunks/[root-of-the-server]__0m7-xfc._.js +15 -0
  191. package/.next/server/chunks/[root-of-the-server]__0m7-xfc._.js.map +1 -0
  192. package/.next/server/chunks/[root-of-the-server]__0m_~dan._.js +15 -0
  193. package/.next/server/chunks/[root-of-the-server]__0m_~dan._.js.map +1 -0
  194. package/.next/server/chunks/[root-of-the-server]__0ntt3om._.js +3 -0
  195. package/.next/server/chunks/[root-of-the-server]__0ntt3om._.js.map +1 -0
  196. package/.next/server/chunks/[turbopack]_runtime.js +903 -0
  197. package/.next/server/chunks/[turbopack]_runtime.js.map +11 -0
  198. package/.next/server/chunks/_next-internal_server_app_api_context_aider_route_actions_0dszia..js +3 -0
  199. package/.next/server/chunks/_next-internal_server_app_api_context_aider_route_actions_0dszia..js.map +1 -0
  200. package/.next/server/chunks/_next-internal_server_app_api_context_claude_route_actions_12srkdn.js +3 -0
  201. package/.next/server/chunks/_next-internal_server_app_api_context_claude_route_actions_12srkdn.js.map +1 -0
  202. package/.next/server/chunks/_next-internal_server_app_api_context_route_actions_03ko8ta.js +3 -0
  203. package/.next/server/chunks/_next-internal_server_app_api_context_route_actions_03ko8ta.js.map +1 -0
  204. package/.next/server/chunks/_next-internal_server_app_api_context_ssh_route_actions_0~0~96d.js +3 -0
  205. package/.next/server/chunks/_next-internal_server_app_api_context_ssh_route_actions_0~0~96d.js.map +1 -0
  206. package/.next/server/chunks/_next-internal_server_app_api_files_route_actions_0x8kqqx.js +3 -0
  207. package/.next/server/chunks/_next-internal_server_app_api_files_route_actions_0x8kqqx.js.map +1 -0
  208. package/.next/server/chunks/_next-internal_server_app_api_git_route_actions_0xetuf~.js +3 -0
  209. package/.next/server/chunks/_next-internal_server_app_api_git_route_actions_0xetuf~.js.map +1 -0
  210. package/.next/server/chunks/_next-internal_server_app_api_sessions_inject_route_actions_0y2_m1_.js +3 -0
  211. package/.next/server/chunks/_next-internal_server_app_api_sessions_inject_route_actions_0y2_m1_.js.map +1 -0
  212. package/.next/server/chunks/_next-internal_server_app_api_sessions_input_route_actions_032sdjp.js +3 -0
  213. package/.next/server/chunks/_next-internal_server_app_api_sessions_input_route_actions_032sdjp.js.map +1 -0
  214. package/.next/server/chunks/_next-internal_server_app_api_sessions_launch_route_actions_0_qrmsm.js +3 -0
  215. package/.next/server/chunks/_next-internal_server_app_api_sessions_launch_route_actions_0_qrmsm.js.map +1 -0
  216. package/.next/server/chunks/_next-internal_server_app_api_sessions_route_actions_0y1t9w0.js +3 -0
  217. package/.next/server/chunks/_next-internal_server_app_api_sessions_route_actions_0y1t9w0.js.map +1 -0
  218. package/.next/server/chunks/_next-internal_server_app_api_sessions_stats_route_actions_0gc_vw-.js +3 -0
  219. package/.next/server/chunks/_next-internal_server_app_api_sessions_stats_route_actions_0gc_vw-.js.map +1 -0
  220. package/.next/server/chunks/_next-internal_server_app_api_sessions_stop_route_actions_0xg1t9k.js +3 -0
  221. package/.next/server/chunks/_next-internal_server_app_api_sessions_stop_route_actions_0xg1t9k.js.map +1 -0
  222. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js +3 -0
  223. package/.next/server/chunks/_next-internal_server_app_favicon_ico_route_actions_095lj93.js.map +1 -0
  224. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0ev3h.z.js +3 -0
  225. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0ev3h.z.js.map +1 -0
  226. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0m.429v.js +3 -0
  227. package/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0m.429v.js.map +1 -0
  228. package/.next/server/chunks/ssr/[root-of-the-server]__0.kd7dh._.js +33 -0
  229. package/.next/server/chunks/ssr/[root-of-the-server]__0.kd7dh._.js.map +1 -0
  230. package/.next/server/chunks/ssr/[root-of-the-server]__089dc4i._.js +33 -0
  231. package/.next/server/chunks/ssr/[root-of-the-server]__089dc4i._.js.map +1 -0
  232. package/.next/server/chunks/ssr/[root-of-the-server]__0_7i5h0._.js +3 -0
  233. package/.next/server/chunks/ssr/[root-of-the-server]__0_7i5h0._.js.map +1 -0
  234. package/.next/server/chunks/ssr/[root-of-the-server]__0hw~y-4._.js +3 -0
  235. package/.next/server/chunks/ssr/[root-of-the-server]__0hw~y-4._.js.map +1 -0
  236. package/.next/server/chunks/ssr/[root-of-the-server]__0uk0awy._.js +3 -0
  237. package/.next/server/chunks/ssr/[root-of-the-server]__0uk0awy._.js.map +1 -0
  238. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js +3 -0
  239. package/.next/server/chunks/ssr/[root-of-the-server]__0v73tbn._.js.map +1 -0
  240. package/.next/server/chunks/ssr/[root-of-the-server]__0~y8ue.._.js +3 -0
  241. package/.next/server/chunks/ssr/[root-of-the-server]__0~y8ue.._.js.map +1 -0
  242. package/.next/server/chunks/ssr/[turbopack]_runtime.js +903 -0
  243. package/.next/server/chunks/ssr/[turbopack]_runtime.js.map +11 -0
  244. package/.next/server/chunks/ssr/_0t7oqy6._.js +3 -0
  245. package/.next/server/chunks/ssr/_0t7oqy6._.js.map +1 -0
  246. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js +3 -0
  247. package/.next/server/chunks/ssr/_next-internal_server_app__global-error_page_actions_0k77kol.js.map +1 -0
  248. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js +3 -0
  249. package/.next/server/chunks/ssr/_next-internal_server_app__not-found_page_actions_0eq97pa.js.map +1 -0
  250. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js +3 -0
  251. package/.next/server/chunks/ssr/_next-internal_server_app_page_actions_09-gtaw.js.map +1 -0
  252. package/.next/server/chunks/ssr/node_modules_05l396c._.js +3 -0
  253. package/.next/server/chunks/ssr/node_modules_05l396c._.js.map +1 -0
  254. package/.next/server/chunks/ssr/node_modules_09w7yel._.js +33 -0
  255. package/.next/server/chunks/ssr/node_modules_09w7yel._.js.map +1 -0
  256. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js +3 -0
  257. package/.next/server/chunks/ssr/node_modules_@swc_helpers_cjs__interop_require_default_cjs_11~q6fv._.js.map +1 -0
  258. package/.next/server/chunks/ssr/node_modules_next_dist_0ppctuh._.js +19 -0
  259. package/.next/server/chunks/ssr/node_modules_next_dist_0ppctuh._.js.map +1 -0
  260. package/.next/server/chunks/ssr/node_modules_next_dist_0qoh8ry._.js +6 -0
  261. package/.next/server/chunks/ssr/node_modules_next_dist_0qoh8ry._.js.map +1 -0
  262. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js +3 -0
  263. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_0inhx6q._.js.map +1 -0
  264. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js +3 -0
  265. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_forbidden_0ghu-f7.js.map +1 -0
  266. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js +3 -0
  267. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_global-error_0lgvd_..js.map +1 -0
  268. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js +3 -0
  269. package/.next/server/chunks/ssr/node_modules_next_dist_client_components_builtin_unauthorized_0cjv-23.js.map +1 -0
  270. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03-z2qq.js +4 -0
  271. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_03-z2qq.js.map +1 -0
  272. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07vh7rm.js +4 -0
  273. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_07vh7rm.js.map +1 -0
  274. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qp4u6g.js +4 -0
  275. package/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_0qp4u6g.js.map +1 -0
  276. package/.next/server/functions-config-manifest.json +4 -0
  277. package/.next/server/interception-route-rewrite-manifest.js +1 -0
  278. package/.next/server/middleware-build-manifest.js +20 -0
  279. package/.next/server/middleware-manifest.json +6 -0
  280. package/.next/server/next-font-manifest.js +1 -0
  281. package/.next/server/next-font-manifest.json +15 -0
  282. package/.next/server/pages/404.html +1 -0
  283. package/.next/server/pages/500.html +1 -0
  284. package/.next/server/pages-manifest.json +4 -0
  285. package/.next/server/prefetch-hints.json +1 -0
  286. package/.next/server/server-reference-manifest.js +1 -0
  287. package/.next/server/server-reference-manifest.json +5 -0
  288. package/.next/static/chunks/03g6xpslyid3~.js +1 -0
  289. package/.next/static/chunks/03~yq9q893hmn.js +1 -0
  290. package/.next/static/chunks/07b7-dl8gh17u.js +5 -0
  291. package/.next/static/chunks/07lhk_q6pmm3r.js +1 -0
  292. package/.next/static/chunks/0dbhjjzl8qfwv.js +1 -0
  293. package/.next/static/chunks/0ewdhgxsa_h.q.js +1 -0
  294. package/.next/static/chunks/0f4at4_v-tkgj.js +1 -0
  295. package/.next/static/chunks/0fpki3y6aj230.js +31 -0
  296. package/.next/static/chunks/0ga14ztvrhau2.css +1 -0
  297. package/.next/static/chunks/0lnobx4eh3~-_.js +1 -0
  298. package/.next/static/chunks/0mej.ad_ddvf1.js +1 -0
  299. package/.next/static/chunks/0q4suv6uexpud.css +1 -0
  300. package/.next/static/chunks/0xq6bhmghl02_.js +1 -0
  301. package/.next/static/chunks/139c54uo1w7.4.css +3 -0
  302. package/.next/static/chunks/140ovxvjat1ch.js +5 -0
  303. package/.next/static/chunks/16w4~t4h7gk13.js +1 -0
  304. package/.next/static/chunks/turbopack-08fpdsd.-ns2y.js +1 -0
  305. package/.next/static/media/4fa387ec64143e14-s.0wkzw~je483f-.woff2 +0 -0
  306. package/.next/static/media/53b9e256198e5412-s.0-wfv7uh4i7h9.woff2 +0 -0
  307. package/.next/static/media/5ce348bf30bf5439-s.0zgw-jeven.3w.woff2 +0 -0
  308. package/.next/static/media/6306c77e7c8268e4-s.0rhz0arwfsn~5.woff2 +0 -0
  309. package/.next/static/media/7178b3e590c64307-s.0nx0ww8fni_q3.woff2 +0 -0
  310. package/.next/static/media/797e433ab948586e-s.p.08e28id.o-okb.woff2 +0 -0
  311. package/.next/static/media/7d817b4c03b0c5f1-s.0l76wvqk9d84w.woff2 +0 -0
  312. package/.next/static/media/8a480f0b521d4e75-s.0jzbimsg8vl84.woff2 +0 -0
  313. package/.next/static/media/bbc41e54d2fcbd21-s.0k4k9394f2q-k.woff2 +0 -0
  314. package/.next/static/media/caa3a2e1cccd8315-s.p.09~u27dqhyhd6.woff2 +0 -0
  315. package/.next/static/media/favicon.0x3dzn~oxb6tn.ico +0 -0
  316. package/.next/static/media/fef07dbb0973bf53-s.12tyk43_3sh9u.woff2 +0 -0
  317. package/.next/static/r-T5V6BKLiZ32Ai9Boe1d/_buildManifest.js +11 -0
  318. package/.next/static/r-T5V6BKLiZ32Ai9Boe1d/_clientMiddlewareManifest.js +1 -0
  319. package/.next/static/r-T5V6BKLiZ32Ai9Boe1d/_ssgManifest.js +1 -0
  320. package/.next/trace +1 -0
  321. package/.next/trace-build +1 -0
  322. package/.next/turbopack +0 -0
  323. package/.next/types/cache-life.d.ts +145 -0
  324. package/.next/types/routes.d.ts +84 -0
  325. package/.next/types/validator.ts +178 -0
  326. package/README.md +125 -0
  327. package/bin/cli.js +36 -0
  328. package/next.config.ts +7 -0
  329. package/package.json +40 -0
  330. package/public/file.svg +1 -0
  331. package/public/globe.svg +1 -0
  332. package/public/next.svg +1 -0
  333. package/public/vercel.svg +1 -0
  334. package/public/window.svg +1 -0
  335. package/src/app/api/context/aider/route.ts +113 -0
  336. package/src/app/api/context/claude/route.ts +64 -0
  337. package/src/app/api/context/route.ts +37 -0
  338. package/src/app/api/context/ssh/route.ts +88 -0
  339. package/src/app/api/files/route.ts +276 -0
  340. package/src/app/api/git/route.ts +81 -0
  341. package/src/app/api/sessions/inject/route.ts +21 -0
  342. package/src/app/api/sessions/input/route.ts +30 -0
  343. package/src/app/api/sessions/launch/route.ts +25 -0
  344. package/src/app/api/sessions/route.ts +27 -0
  345. package/src/app/api/sessions/stats/route.ts +76 -0
  346. package/src/app/api/sessions/stop/route.ts +26 -0
  347. package/src/app/components/AiderWizard.tsx +412 -0
  348. package/src/app/components/ClaudeWizard.tsx +335 -0
  349. package/src/app/components/ContextEditor.tsx +169 -0
  350. package/src/app/components/IdeLayout.tsx +2095 -0
  351. package/src/app/components/SshWizard.tsx +379 -0
  352. package/src/app/components/TerminalConsole.tsx +228 -0
  353. package/src/app/favicon.ico +0 -0
  354. package/src/app/globals.css +81 -0
  355. package/src/app/layout.tsx +30 -0
  356. package/src/app/page.module.css +330 -0
  357. package/src/app/page.tsx +581 -0
  358. package/src/lib/agents/AgentRunner.ts +86 -0
  359. package/src/lib/agents/AiderRunner.ts +261 -0
  360. package/src/lib/agents/ClaudeRunner.ts +148 -0
  361. package/src/lib/agents/ContextManager.ts +142 -0
  362. package/src/lib/agents/DockerRunner.ts +182 -0
  363. package/src/lib/agents/MockRunner.ts +126 -0
  364. package/src/lib/agents/SSHRunner.ts +180 -0
  365. package/src/lib/agents/SessionManager.ts +147 -0
  366. package/src/lib/agents/SessionPersister.ts +85 -0
  367. package/src/lib/agents/WebSocketServer.ts +118 -0
  368. package/tsconfig.json +34 -0
@@ -0,0 +1,379 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+
5
+ interface SshConfig {
6
+ host: string;
7
+ port: number;
8
+ username: string;
9
+ privateKeyPath: string;
10
+ }
11
+
12
+ interface SshWizardProps {
13
+ onClose: () => void;
14
+ onConfirmLaunch: () => void;
15
+ }
16
+
17
+ export default function SshWizard({ onClose, onConfirmLaunch }: SshWizardProps) {
18
+ const [config, setConfig] = useState<SshConfig>({
19
+ host: "",
20
+ port: 22,
21
+ username: "",
22
+ privateKeyPath: "",
23
+ });
24
+
25
+ const [isLoading, setIsLoading] = useState(true);
26
+ const [isTesting, setIsTesting] = useState(false);
27
+ const [isSaving, setIsSaving] = useState(false);
28
+ const [testResult, setTestResult] = useState<{ success: boolean; message: string } | null>(null);
29
+
30
+ // Load saved credentials on mount
31
+ useEffect(() => {
32
+ const loadConfig = async () => {
33
+ try {
34
+ const res = await fetch("/api/context/ssh");
35
+ if (res.ok) {
36
+ const data = await res.json();
37
+ if (data.success && data.config) {
38
+ setConfig({
39
+ host: data.config.host || "",
40
+ port: data.config.port || 22,
41
+ username: data.config.username || "",
42
+ privateKeyPath: data.config.privateKeyPath || "",
43
+ });
44
+ }
45
+ }
46
+ } catch (err) {
47
+ console.error("Failed to load SSH configuration:", err);
48
+ } finally {
49
+ setIsLoading(false);
50
+ }
51
+ };
52
+
53
+ loadConfig();
54
+ }, []);
55
+
56
+ const handleTestConnection = async () => {
57
+ if (!config.host || !config.username) {
58
+ setTestResult({ success: false, message: "Host and Username are required to test connection." });
59
+ return;
60
+ }
61
+
62
+ setIsTesting(true);
63
+ setTestResult(null);
64
+
65
+ try {
66
+ const res = await fetch("/api/context/ssh", {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({
70
+ test: true,
71
+ ...config,
72
+ }),
73
+ });
74
+
75
+ if (res.ok) {
76
+ const data = await res.json();
77
+ setTestResult({
78
+ success: data.success,
79
+ message: data.message || (data.success ? "Connection successful!" : "Connection failed."),
80
+ });
81
+ } else {
82
+ const data = await res.json();
83
+ setTestResult({
84
+ success: false,
85
+ message: data.error || "Failed to reach testing endpoint.",
86
+ });
87
+ }
88
+ } catch (err) {
89
+ console.error(err);
90
+ setTestResult({
91
+ success: false,
92
+ message: "Network error occurred while testing connection.",
93
+ });
94
+ } finally {
95
+ setIsTesting(false);
96
+ }
97
+ };
98
+
99
+ const handleSaveAndLaunch = async () => {
100
+ if (!config.host || !config.username) {
101
+ setTestResult({ success: false, message: "Host and Username are required to save." });
102
+ return;
103
+ }
104
+
105
+ setIsSaving(true);
106
+ setTestResult(null);
107
+
108
+ try {
109
+ const res = await fetch("/api/context/ssh", {
110
+ method: "POST",
111
+ headers: { "Content-Type": "application/json" },
112
+ body: JSON.stringify({
113
+ test: false,
114
+ ...config,
115
+ }),
116
+ });
117
+
118
+ if (res.ok) {
119
+ setIsSaving(false);
120
+ onConfirmLaunch();
121
+ } else {
122
+ const data = await res.json();
123
+ setTestResult({
124
+ success: false,
125
+ message: data.error || "Failed to save settings.",
126
+ });
127
+ setIsSaving(false);
128
+ }
129
+ } catch (err) {
130
+ console.error(err);
131
+ setTestResult({
132
+ success: false,
133
+ message: "Failed to connect to NeuralLoom save endpoint.",
134
+ });
135
+ setIsSaving(false);
136
+ }
137
+ };
138
+
139
+ if (isLoading) {
140
+ return (
141
+ <div style={modalOverlayStyle}>
142
+ <div style={modalContainerStyle}>
143
+ <div style={{ textAlign: "center", padding: "2rem" }}>
144
+ <span style={{ color: "var(--muted)" }}>Loading SSH Configuration...</span>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ );
149
+ }
150
+
151
+ return (
152
+ <div style={modalOverlayStyle}>
153
+ <div style={modalContainerStyle}>
154
+ {/* Header */}
155
+ <div style={headerStyle}>
156
+ <h3 style={{ fontSize: "1.1rem", fontWeight: 700, margin: 0, display: "flex", alignItems: "center", gap: "0.5rem" }}>
157
+ 🌐 SSH Connection Wizard
158
+ </h3>
159
+ <button onClick={onClose} style={closeButtonStyle} aria-label="Close wizard">✖</button>
160
+ </div>
161
+
162
+ {/* Form Body */}
163
+ <div style={bodyStyle}>
164
+ <p style={{ fontSize: "0.825rem", color: "var(--muted)", marginBottom: "1.25rem", lineHeight: 1.4 }}>
165
+ Configure the remote VM connection. When you click <strong>Save & Launch</strong>, NeuralLoom will write to <code>ssh.json</code> and spawn Claude Code on the target host.
166
+ </p>
167
+
168
+ <div style={formGroupStyle}>
169
+ <label style={labelStyle}>Host IP or Domain Name</label>
170
+ <input
171
+ type="text"
172
+ value={config.host}
173
+ onChange={(e) => setConfig({ ...config, host: e.target.value })}
174
+ placeholder="e.g. 192.168.1.50 or host.remote.com"
175
+ style={inputStyle}
176
+ />
177
+ </div>
178
+
179
+ <div style={{ display: "flex", gap: "1rem" }}>
180
+ <div style={{ ...formGroupStyle, flex: 2 }}>
181
+ <label style={labelStyle}>Username</label>
182
+ <input
183
+ type="text"
184
+ value={config.username}
185
+ onChange={(e) => setConfig({ ...config, username: e.target.value })}
186
+ placeholder="e.g. ubuntu, root, or dave"
187
+ style={inputStyle}
188
+ />
189
+ </div>
190
+ <div style={{ ...formGroupStyle, flex: 1 }}>
191
+ <label style={labelStyle}>Port</label>
192
+ <input
193
+ type="number"
194
+ value={config.port}
195
+ onChange={(e) => setConfig({ ...config, port: parseInt(e.target.value, 10) || 22 })}
196
+ placeholder="22"
197
+ style={inputStyle}
198
+ />
199
+ </div>
200
+ </div>
201
+
202
+ <div style={formGroupStyle}>
203
+ <label style={labelStyle}>Private Key File Path (Optional)</label>
204
+ <input
205
+ type="text"
206
+ value={config.privateKeyPath}
207
+ onChange={(e) => setConfig({ ...config, privateKeyPath: e.target.value })}
208
+ placeholder="e.g. C:\Users\Dave\.ssh\id_rsa"
209
+ style={inputStyle}
210
+ />
211
+ <span style={{ fontSize: "0.7rem", color: "var(--muted)", marginTop: "0.25rem" }}>
212
+ Leave blank if using the default system SSH key agent.
213
+ </span>
214
+ </div>
215
+
216
+ {/* Test connection progress / alert */}
217
+ {isTesting && (
218
+ <div style={{ ...alertBoxStyle, borderColor: "var(--border)", color: "var(--muted)" }}>
219
+ <span className="pulseDot" style={{ marginRight: "0.5rem", display: "inline-block" }}></span>
220
+ Connecting and testing SSH tunnel... (ConnectTimeout=3s)
221
+ </div>
222
+ )}
223
+
224
+ {testResult && (
225
+ <div
226
+ style={{
227
+ ...alertBoxStyle,
228
+ borderColor: testResult.success ? "var(--success)" : "var(--danger)",
229
+ color: testResult.success ? "var(--success)" : "var(--danger)",
230
+ backgroundColor: testResult.success ? "rgba(16, 185, 129, 0.05)" : "rgba(239, 68, 68, 0.05)",
231
+ }}
232
+ >
233
+ {testResult.success ? "✓ " : "✗ "}
234
+ {testResult.message}
235
+ </div>
236
+ )}
237
+ </div>
238
+
239
+ {/* Footer Actions */}
240
+ <div style={footerStyle}>
241
+ <button onClick={onClose} style={secondaryButtonStyle} disabled={isSaving || isTesting}>
242
+ Cancel
243
+ </button>
244
+ <button onClick={handleTestConnection} style={secondaryButtonStyle} disabled={isSaving || isTesting}>
245
+ {isTesting ? "Testing..." : "Test Connection"}
246
+ </button>
247
+ <button
248
+ onClick={handleSaveAndLaunch}
249
+ style={primaryButtonStyle}
250
+ disabled={isSaving || isTesting || !config.host || !config.username}
251
+ >
252
+ {isSaving ? "Saving..." : "Save & Launch Session"}
253
+ </button>
254
+ </div>
255
+ </div>
256
+ </div>
257
+ );
258
+ }
259
+
260
+ // Styling definitions to keep dependencies clear and avoid style bleed
261
+ const modalOverlayStyle: React.CSSProperties = {
262
+ position: "fixed",
263
+ top: 0,
264
+ left: 0,
265
+ right: 0,
266
+ bottom: 0,
267
+ backgroundColor: "rgba(5, 7, 10, 0.8)",
268
+ backdropFilter: "blur(8px)",
269
+ zIndex: 1000,
270
+ display: "flex",
271
+ alignItems: "center",
272
+ justifyContent: "center",
273
+ animation: "fadeIn 0.2s ease-out",
274
+ };
275
+
276
+ const modalContainerStyle: React.CSSProperties = {
277
+ width: "90%",
278
+ maxWidth: "500px",
279
+ backgroundColor: "var(--card)",
280
+ border: "1px solid var(--border-focus)",
281
+ borderRadius: "12px",
282
+ boxShadow: "0 10px 25px -5px rgba(0, 0, 0, 0.5), 0 8px 10px -6px rgba(0, 0, 0, 0.5)",
283
+ overflow: "hidden",
284
+ display: "flex",
285
+ flexDirection: "column",
286
+ };
287
+
288
+ const headerStyle: React.CSSProperties = {
289
+ display: "flex",
290
+ alignItems: "center",
291
+ justifyContent: "space-between",
292
+ padding: "1rem 1.25rem",
293
+ borderBottom: "1px solid var(--border)",
294
+ background: "hsla(var(--border-hsl), 0.2)",
295
+ };
296
+
297
+ const closeButtonStyle: React.CSSProperties = {
298
+ background: "none",
299
+ border: "none",
300
+ color: "var(--muted)",
301
+ fontSize: "0.9rem",
302
+ cursor: "pointer",
303
+ padding: "0.25rem",
304
+ };
305
+
306
+ const bodyStyle: React.CSSProperties = {
307
+ padding: "1.25rem",
308
+ display: "flex",
309
+ flexDirection: "column",
310
+ };
311
+
312
+ const formGroupStyle: React.CSSProperties = {
313
+ display: "flex",
314
+ flexDirection: "column",
315
+ marginBottom: "1rem",
316
+ };
317
+
318
+ const labelStyle: React.CSSProperties = {
319
+ fontSize: "0.75rem",
320
+ fontWeight: 600,
321
+ color: "var(--foreground)",
322
+ marginBottom: "0.375rem",
323
+ textTransform: "uppercase",
324
+ letterSpacing: "0.05em",
325
+ };
326
+
327
+ const inputStyle: React.CSSProperties = {
328
+ width: "100%",
329
+ padding: "0.5rem 0.75rem",
330
+ backgroundColor: "#080c14",
331
+ border: "1px solid var(--border)",
332
+ borderRadius: "6px",
333
+ color: "var(--foreground)",
334
+ fontFamily: "var(--font-mono), monospace",
335
+ fontSize: "0.825rem",
336
+ outline: "none",
337
+ transition: "border-color 0.15s ease",
338
+ };
339
+
340
+ const alertBoxStyle: React.CSSProperties = {
341
+ marginTop: "0.75rem",
342
+ padding: "0.75rem",
343
+ borderRadius: "6px",
344
+ border: "1px solid",
345
+ fontSize: "0.8rem",
346
+ lineHeight: 1.4,
347
+ wordBreak: "break-word",
348
+ };
349
+
350
+ const footerStyle: React.CSSProperties = {
351
+ display: "flex",
352
+ justifyContent: "flex-end",
353
+ gap: "0.75rem",
354
+ padding: "1rem 1.25rem",
355
+ borderTop: "1px solid var(--border)",
356
+ background: "hsla(var(--border-hsl), 0.2)",
357
+ };
358
+
359
+ const primaryButtonStyle: React.CSSProperties = {
360
+ padding: "0.5rem 1rem",
361
+ borderRadius: "6px",
362
+ border: "none",
363
+ background: "linear-gradient(135deg, hsl(38, 92%, 50%) 0%, hsl(0, 84%, 60%) 100%)",
364
+ color: "#fff",
365
+ fontSize: "0.8rem",
366
+ fontWeight: 600,
367
+ cursor: "pointer",
368
+ };
369
+
370
+ const secondaryButtonStyle: React.CSSProperties = {
371
+ padding: "0.5rem 1rem",
372
+ borderRadius: "6px",
373
+ border: "1px solid var(--border)",
374
+ backgroundColor: "transparent",
375
+ color: "var(--foreground)",
376
+ fontSize: "0.8rem",
377
+ fontWeight: 600,
378
+ cursor: "pointer",
379
+ };
@@ -0,0 +1,228 @@
1
+ "use client";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+
4
+ import { useEffect, useRef } from "react";
5
+ import { Terminal } from "xterm";
6
+ import { FitAddon } from "xterm-addon-fit";
7
+ import "xterm/css/xterm.css";
8
+
9
+ interface TerminalConsoleProps {
10
+ sessionId: string;
11
+ height?: string | number;
12
+ }
13
+
14
+ export default function TerminalConsole({ sessionId, height = "400px" }: TerminalConsoleProps) {
15
+ const terminalRef = useRef<HTMLDivElement>(null);
16
+ const xtermRef = useRef<Terminal | null>(null);
17
+ const wsRef = useRef<WebSocket | null>(null);
18
+
19
+ useEffect(() => {
20
+ if (!terminalRef.current) return;
21
+
22
+ let isDisposed = false;
23
+
24
+ // Initialize xterm
25
+ const term = new Terminal({
26
+ cursorBlink: true,
27
+ fontFamily: "var(--font-mono), monospace",
28
+ fontSize: 13,
29
+ lineHeight: 1.4,
30
+ scrollback: 5000,
31
+ theme: {
32
+ background: "#05070a",
33
+ foreground: "#c9d1d9",
34
+ cursor: "#a855f7", // Purple matching primary theme
35
+ black: "#000000",
36
+ red: "#ff5555",
37
+ green: "#50fa7b",
38
+ yellow: "#f1fa8c",
39
+ blue: "#bd93f9",
40
+ magenta: "#ff79c6",
41
+ cyan: "#8be9fd",
42
+ white: "#ffffff",
43
+ },
44
+ });
45
+
46
+ const fitAddon = new FitAddon();
47
+ term.loadAddon(fitAddon);
48
+
49
+ term.open(terminalRef.current);
50
+
51
+ // Monkeypatch to prevent crash during unmount / disposal
52
+ try {
53
+ const core = (term as any)._core;
54
+ if (core) {
55
+ // 1. Patch viewport._innerRefresh
56
+ const viewports = [
57
+ core.viewport,
58
+ core._viewport,
59
+ (term as any).viewport,
60
+ (term as any)._viewport
61
+ ].filter(Boolean);
62
+
63
+ for (const vp of viewports) {
64
+ const originalInnerRefresh = vp._innerRefresh;
65
+ if (originalInnerRefresh && !vp._innerRefresh.__patched) {
66
+ const patchedFn = function(this: any, ...args: any[]) {
67
+ try {
68
+ return originalInnerRefresh.apply(this, args);
69
+ } catch (err) {
70
+ console.warn("Suppressed xterm viewport refresh error during unmount:", err);
71
+ }
72
+ };
73
+ (patchedFn as any).__patched = true;
74
+ vp._innerRefresh = patchedFn;
75
+ }
76
+ }
77
+
78
+ // 2. Patch renderService.dimensions getter
79
+ const renderServices = [
80
+ core._renderService,
81
+ core.renderService,
82
+ (term as any)._renderService,
83
+ (term as any).renderService
84
+ ].filter(Boolean);
85
+
86
+ for (const rs of renderServices) {
87
+ if (rs && !rs.__dimensionsPatched) {
88
+ rs.__dimensionsPatched = true;
89
+ Object.defineProperty(rs, 'dimensions', {
90
+ get() {
91
+ try {
92
+ if (this._renderer && this._renderer.value) {
93
+ return this._renderer.value.dimensions;
94
+ }
95
+ } catch {
96
+ // Ignore
97
+ }
98
+ // Return a safe dummy fallback object
99
+ return {
100
+ device: {
101
+ cell: { width: 0, height: 0 },
102
+ canvas: { width: 0, height: 0 }
103
+ },
104
+ css: {
105
+ cell: { width: 0, height: 0 },
106
+ canvas: { width: 0, height: 0 }
107
+ }
108
+ };
109
+ },
110
+ configurable: true
111
+ });
112
+ }
113
+ }
114
+ }
115
+ } catch (e) {
116
+ console.warn("Failed to apply xterm monkeypatch:", e);
117
+ }
118
+
119
+ // Fit the terminal to dimensions safely
120
+ const fitTimeout = setTimeout(() => {
121
+ if (isDisposed) return;
122
+ try {
123
+ if (terminalRef.current && terminalRef.current.clientWidth > 0 && terminalRef.current.clientHeight > 0) {
124
+ fitAddon.fit();
125
+ }
126
+ } catch (e) {
127
+ console.warn("Failed to fit terminal on mount", e);
128
+ }
129
+ }, 100);
130
+
131
+ xtermRef.current = term;
132
+
133
+ // Connect WebSocket client to gateway server on port 3001
134
+ const protocol = window.location.protocol === "https:" ? "wss:" : "ws:";
135
+ const wsUrl = `${protocol}//${window.location.hostname}:3001`;
136
+ const ws = new WebSocket(wsUrl);
137
+ wsRef.current = ws;
138
+
139
+ ws.onopen = () => {
140
+ if (isDisposed) return;
141
+ term.write("\r\n\x1b[1;36m[System] Console bridge connected to gateway WebSocket...\x1b[0m\r\n");
142
+ // Trigger session binding handshake
143
+ ws.send(JSON.stringify({ type: "handshake", sessionId }));
144
+ };
145
+
146
+ ws.onmessage = (event) => {
147
+ if (isDisposed) return;
148
+ try {
149
+ const msg = JSON.parse(event.data);
150
+ if (msg.type === "handshake-ack") {
151
+ term.clear();
152
+ if (msg.history) {
153
+ term.write(msg.history);
154
+ }
155
+ } else if (msg.type === "output") {
156
+ term.write(msg.data);
157
+ } else if (msg.type === "error") {
158
+ term.write(`\r\n\x1b[1;31m[System Error] ${msg.message}\x1b[0m\r\n`);
159
+ }
160
+ } catch {
161
+ // Fallback for raw stream chunks
162
+ term.write(event.data);
163
+ }
164
+ };
165
+
166
+ // User typing interaction: capture data and stream to WebSocket
167
+ term.onData((data) => {
168
+ if (isDisposed) return;
169
+ if (ws.readyState === WebSocket.OPEN) {
170
+ ws.send(JSON.stringify({ type: "input", data }));
171
+ }
172
+ });
173
+
174
+ // Resize listener using ResizeObserver
175
+ const resizeObserver = new ResizeObserver(() => {
176
+ if (isDisposed) return;
177
+ try {
178
+ if (
179
+ terminalRef.current &&
180
+ terminalRef.current.isConnected &&
181
+ terminalRef.current.clientWidth > 0 &&
182
+ terminalRef.current.clientHeight > 0
183
+ ) {
184
+ fitAddon.fit();
185
+ }
186
+ } catch {
187
+ // Suppress layout errors
188
+ }
189
+ });
190
+ resizeObserver.observe(terminalRef.current);
191
+
192
+ return () => {
193
+ isDisposed = true;
194
+ clearTimeout(fitTimeout);
195
+ resizeObserver.disconnect();
196
+ ws.close();
197
+ try {
198
+ fitAddon.dispose();
199
+ term.dispose();
200
+ } catch (e) {
201
+ console.warn("Error disposing terminal:", e);
202
+ }
203
+ };
204
+ }, [sessionId]);
205
+
206
+ return (
207
+ <div
208
+ style={{
209
+ width: "100%",
210
+ height: height,
211
+ backgroundColor: "#05070a",
212
+ border: "1px solid var(--border)",
213
+ borderBottomLeftRadius: "12px",
214
+ borderBottomRightRadius: "12px",
215
+ overflow: "hidden"
216
+ }}
217
+ >
218
+ <div
219
+ ref={terminalRef}
220
+ style={{
221
+ width: "100%",
222
+ height: "100%",
223
+ padding: "1rem"
224
+ }}
225
+ />
226
+ </div>
227
+ );
228
+ }
Binary file
@@ -0,0 +1,81 @@
1
+ :root {
2
+ --background-hsl: 222, 24%, 7%;
3
+ --foreground-hsl: 210, 40%, 98%;
4
+ --card-hsl: 222, 24%, 10%;
5
+ --card-hover-hsl: 222, 24%, 13%;
6
+ --border-hsl: 222, 15%, 16%;
7
+ --border-focus-hsl: 262, 83%, 67%;
8
+ --primary-hsl: 262, 83%, 67%;
9
+ --primary-hover-hsl: 262, 83%, 62%;
10
+ --accent-hsl: 195, 100%, 50%;
11
+ --muted-hsl: 215, 20%, 65%;
12
+ --success-hsl: 142, 72%, 45%;
13
+ --warning-hsl: 38, 92%, 50%;
14
+ --danger-hsl: 0, 84%, 60%;
15
+
16
+ --background: hsl(var(--background-hsl));
17
+ --foreground: hsl(var(--foreground-hsl));
18
+ --card: hsl(var(--card-hsl));
19
+ --card-hover: hsl(var(--card-hover-hsl));
20
+ --border: hsl(var(--border-hsl));
21
+ --border-focus: hsl(var(--border-focus-hsl));
22
+ --primary: hsl(var(--primary-hsl));
23
+ --primary-hover: hsl(var(--primary-hover-hsl));
24
+ --accent: hsl(var(--accent-hsl));
25
+ --muted: hsl(var(--muted-hsl));
26
+ --success: hsl(var(--success-hsl));
27
+ --warning: hsl(var(--warning-hsl));
28
+ --danger: hsl(var(--danger-hsl));
29
+
30
+ --font-sans: var(--font-geist-sans), system-ui, -apple-system, sans-serif;
31
+ --font-mono: var(--font-geist-mono), monospace;
32
+ }
33
+
34
+ * {
35
+ box-sizing: border-box;
36
+ padding: 0;
37
+ margin: 0;
38
+ }
39
+
40
+ html,
41
+ body {
42
+ height: 100%;
43
+ width: 100%;
44
+ max-width: 100vw;
45
+ overflow-x: hidden;
46
+ background-color: var(--background);
47
+ color: var(--foreground);
48
+ font-family: var(--font-sans);
49
+ -webkit-font-smoothing: antialiased;
50
+ -moz-osx-font-smoothing: grayscale;
51
+ }
52
+
53
+ body {
54
+ display: flex;
55
+ flex-direction: column;
56
+ }
57
+
58
+ a {
59
+ color: inherit;
60
+ text-decoration: none;
61
+ }
62
+
63
+ /* Micro-animations and utility styling */
64
+ button,
65
+ a.btn {
66
+ cursor: pointer;
67
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
68
+ }
69
+
70
+ .card {
71
+ background-color: var(--card);
72
+ border: 1px solid var(--border);
73
+ border-radius: 12px;
74
+ transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
75
+ }
76
+
77
+ .card:hover {
78
+ border-color: var(--border-focus);
79
+ background-color: var(--card-hover);
80
+ transform: translateY(-2px);
81
+ }