neural-loom 0.2.17 → 0.2.19

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 (70) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/cache/.previewinfo +1 -1
  4. package/.next/cache/.rscinfo +1 -1
  5. package/.next/cache/.tsbuildinfo +1 -1
  6. package/.next/diagnostics/route-bundle-stats.json +2 -2
  7. package/.next/fallback-build-manifest.json +3 -3
  8. package/.next/prerender-manifest.json +3 -3
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.html +1 -1
  17. package/.next/server/app/_not-found.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  19. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  20. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  22. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  23. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  24. package/.next/server/app/api/context/aider/route.js.nft.json +1 -1
  25. package/.next/server/app/api/context/claude/route.js.nft.json +1 -1
  26. package/.next/server/app/api/sessions/inject/route.js.nft.json +1 -1
  27. package/.next/server/app/api/sessions/input/route.js.nft.json +1 -1
  28. package/.next/server/app/api/sessions/launch/route.js.nft.json +1 -1
  29. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  30. package/.next/server/app/api/sessions/scope/route.js.nft.json +1 -1
  31. package/.next/server/app/api/sessions/start/route.js.nft.json +1 -1
  32. package/.next/server/app/api/sessions/stats/route.js.nft.json +1 -1
  33. package/.next/server/app/api/sessions/stop/route.js.nft.json +1 -1
  34. package/.next/server/app/index.html +1 -1
  35. package/.next/server/app/index.rsc +2 -2
  36. package/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  37. package/.next/server/app/index.segments/_full.segment.rsc +2 -2
  38. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  39. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  40. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  41. package/.next/server/app/page_client-reference-manifest.js +1 -1
  42. package/.next/server/chunks/[root-of-the-server]__0d0pykb._.js +7 -2
  43. package/.next/server/chunks/[root-of-the-server]__0d0pykb._.js.map +1 -1
  44. package/.next/server/chunks/[root-of-the-server]__0iqaxhx._.js +5 -5
  45. package/.next/server/chunks/[root-of-the-server]__0iqaxhx._.js.map +1 -1
  46. package/.next/server/chunks/[root-of-the-server]__0qyrt6_._.js +1 -1
  47. package/.next/server/chunks/[root-of-the-server]__0qyrt6_._.js.map +1 -1
  48. package/.next/server/chunks/[root-of-the-server]__0qz~w0~._.js +6 -6
  49. package/.next/server/chunks/[root-of-the-server]__0qz~w0~._.js.map +1 -1
  50. package/.next/server/chunks/ssr/_0t7oqy6._.js +1 -1
  51. package/.next/server/chunks/ssr/_0t7oqy6._.js.map +1 -1
  52. package/.next/server/middleware-build-manifest.js +3 -3
  53. package/.next/server/pages/404.html +1 -1
  54. package/.next/server/pages/500.html +1 -1
  55. package/.next/server/server-reference-manifest.js +1 -1
  56. package/.next/server/server-reference-manifest.json +1 -1
  57. package/.next/static/chunks/01.1lqu6kmllv.js +1 -0
  58. package/.next/trace +1 -1
  59. package/.next/trace-build +1 -1
  60. package/package.json +1 -1
  61. package/src/app/api/sessions/launch/route.ts +4 -1
  62. package/src/app/page.tsx +115 -18
  63. package/src/lib/agents/AgentRunner.ts +2 -2
  64. package/src/lib/agents/SessionManager.ts +7 -1
  65. package/src/lib/agents/ShellRunner.ts +159 -0
  66. package/src/lib/recents.ts +19 -2
  67. package/.next/static/chunks/0bd3rlzi9lh-u.js +0 -1
  68. /package/.next/static/{5kCkuutustVYfLkGO2JIi → W3UxhE_D02EcHxTzdXKHX}/_buildManifest.js +0 -0
  69. /package/.next/static/{5kCkuutustVYfLkGO2JIi → W3UxhE_D02EcHxTzdXKHX}/_clientMiddlewareManifest.js +0 -0
  70. /package/.next/static/{5kCkuutustVYfLkGO2JIi → W3UxhE_D02EcHxTzdXKHX}/_ssgManifest.js +0 -0
package/.next/trace CHANGED
@@ -1 +1 @@
1
- [{"name":"generate-buildid","duration":357,"timestamp":121258431658,"id":4,"parentId":1,"tags":{},"startTime":1781341994202,"traceId":"8688474b07a00073"},{"name":"load-custom-routes","duration":427,"timestamp":121258432151,"id":5,"parentId":1,"tags":{},"startTime":1781341994203,"traceId":"8688474b07a00073"},{"name":"create-dist-dir","duration":724,"timestamp":121258432616,"id":6,"parentId":1,"tags":{},"startTime":1781341994203,"traceId":"8688474b07a00073"},{"name":"clean","duration":614,"timestamp":121258436542,"id":7,"parentId":1,"tags":{},"startTime":1781341994207,"traceId":"8688474b07a00073"},{"name":"discover-routes","duration":9549,"timestamp":121258463121,"id":8,"parentId":1,"tags":{},"startTime":1781341994234,"traceId":"8688474b07a00073"},{"name":"create-root-mapping","duration":112,"timestamp":121258472741,"id":9,"parentId":1,"tags":{},"startTime":1781341994243,"traceId":"8688474b07a00073"},{"name":"generate-route-types","duration":18986,"timestamp":121258475084,"id":10,"parentId":1,"tags":{},"startTime":1781341994246,"traceId":"8688474b07a00073"},{"name":"public-dir-conflict-check","duration":106,"timestamp":121258494228,"id":11,"parentId":1,"tags":{},"startTime":1781341994265,"traceId":"8688474b07a00073"},{"name":"generate-routes-manifest","duration":2661,"timestamp":121258494452,"id":12,"parentId":1,"tags":{},"startTime":1781341994265,"traceId":"8688474b07a00073"},{"name":"run-turbopack","duration":2566029,"timestamp":121258505273,"id":14,"parentId":1,"tags":{},"startTime":1781341994276,"traceId":"8688474b07a00073"},{"name":"turbopack-build-events","duration":62,"timestamp":121258816573,"id":15,"parentId":1,"tags":{},"startTime":1781341994587,"traceId":"8688474b07a00073"},{"name":"run-typescript","duration":3916701,"timestamp":121261084165,"id":16,"parentId":1,"tags":{},"startTime":1781341996855,"traceId":"8688474b07a00073"},{"name":"generate-required-server-files","duration":1445,"timestamp":121265001724,"id":18,"parentId":1,"tags":{},"startTime":1781342000772,"traceId":"8688474b07a00073"},{"name":"check-static-error-page","duration":7320,"timestamp":121265134742,"id":20,"parentId":19,"tags":{},"startTime":1781342000905,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":599827,"timestamp":121265147251,"id":41,"parentId":22,"tags":{},"startTime":1781342000918,"traceId":"8688474b07a00073"},{"name":"check-page","duration":609618,"timestamp":121265137581,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1781342000908,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":721689,"timestamp":121265147363,"id":42,"parentId":23,"tags":{},"startTime":1781342000918,"traceId":"8688474b07a00073"},{"name":"check-page","duration":731239,"timestamp":121265137901,"id":23,"parentId":19,"tags":{"page":"/api/context/aider"},"startTime":1781342000908,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":722579,"timestamp":121265148140,"id":48,"parentId":29,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":731601,"timestamp":121265139185,"id":29,"parentId":19,"tags":{"page":"/api/recents"},"startTime":1781342000910,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":732541,"timestamp":121265147542,"id":44,"parentId":25,"tags":{},"startTime":1781342000918,"traceId":"8688474b07a00073"},{"name":"check-page","duration":741804,"timestamp":121265138333,"id":25,"parentId":19,"tags":{"page":"/api/context"},"startTime":1781342000909,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":735100,"timestamp":121265146927,"id":40,"parentId":21,"tags":{},"startTime":1781342000917,"traceId":"8688474b07a00073"},{"name":"check-page","duration":745605,"timestamp":121265136477,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1781342000907,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":742480,"timestamp":121265147635,"id":45,"parentId":26,"tags":{},"startTime":1781342000918,"traceId":"8688474b07a00073"},{"name":"check-page","duration":751644,"timestamp":121265138528,"id":26,"parentId":19,"tags":{"page":"/api/context/ssh"},"startTime":1781342000909,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":746750,"timestamp":121265147451,"id":43,"parentId":24,"tags":{},"startTime":1781342000918,"traceId":"8688474b07a00073"},{"name":"check-page","duration":756138,"timestamp":121265138121,"id":24,"parentId":19,"tags":{"page":"/api/context/claude"},"startTime":1781342000909,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":751038,"timestamp":121265147875,"id":46,"parentId":27,"tags":{},"startTime":1781342000918,"traceId":"8688474b07a00073"},{"name":"check-page","duration":760242,"timestamp":121265138721,"id":27,"parentId":19,"tags":{"page":"/api/files"},"startTime":1781342000909,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":754513,"timestamp":121265148731,"id":54,"parentId":35,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":762736,"timestamp":121265140568,"id":35,"parentId":19,"tags":{"page":"/api/sessions/start"},"startTime":1781342000911,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":755829,"timestamp":121265148349,"id":49,"parentId":30,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":764800,"timestamp":121265139427,"id":30,"parentId":19,"tags":{"page":"/api/sessions/inject"},"startTime":1781342000910,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":756959,"timestamp":121265148774,"id":55,"parentId":36,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":764801,"timestamp":121265140969,"id":36,"parentId":19,"tags":{"page":"/api/sessions/stats"},"startTime":1781342000912,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":757363,"timestamp":121265148686,"id":53,"parentId":34,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":765790,"timestamp":121265140286,"id":34,"parentId":19,"tags":{"page":"/api/sessions/scope"},"startTime":1781342000911,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":757209,"timestamp":121265152274,"id":58,"parentId":39,"tags":{},"startTime":1781342000923,"traceId":"8688474b07a00073"},{"name":"check-page","duration":767755,"timestamp":121265141769,"id":39,"parentId":19,"tags":{"page":"/"},"startTime":1781342000912,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":760672,"timestamp":121265148969,"id":57,"parentId":38,"tags":{},"startTime":1781342000920,"traceId":"8688474b07a00073"},{"name":"check-page","duration":768258,"timestamp":121265141400,"id":38,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1781342000912,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":762400,"timestamp":121265148557,"id":51,"parentId":32,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":771083,"timestamp":121265139908,"id":32,"parentId":19,"tags":{"page":"/api/sessions/launch"},"startTime":1781342000910,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":769142,"timestamp":121265148026,"id":47,"parentId":28,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":778260,"timestamp":121265138943,"id":28,"parentId":19,"tags":{"page":"/api/git"},"startTime":1781342000909,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":772960,"timestamp":121265148621,"id":52,"parentId":33,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":781528,"timestamp":121265140101,"id":33,"parentId":19,"tags":{"page":"/api/sessions"},"startTime":1781342000911,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":773942,"timestamp":121265148487,"id":50,"parentId":31,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":782781,"timestamp":121265139686,"id":31,"parentId":19,"tags":{"page":"/api/sessions/input"},"startTime":1781342000910,"traceId":"8688474b07a00073"},{"name":"is-page-static","duration":782103,"timestamp":121265148813,"id":56,"parentId":37,"tags":{},"startTime":1781342000919,"traceId":"8688474b07a00073"},{"name":"check-page","duration":789765,"timestamp":121265141194,"id":37,"parentId":19,"tags":{"page":"/api/sessions/stop"},"startTime":1781342000912,"traceId":"8688474b07a00073"},{"name":"static-check","duration":796716,"timestamp":121265134269,"id":19,"parentId":1,"tags":{},"startTime":1781342000905,"traceId":"8688474b07a00073"},{"name":"write-routes-manifest","duration":900,"timestamp":121265932156,"id":60,"parentId":1,"tags":{},"startTime":1781342001703,"traceId":"8688474b07a00073"},{"name":"load-dotenv","duration":41,"timestamp":121265953555,"id":63,"parentId":62,"tags":{},"startTime":1781342001724,"traceId":"8688474b07a00073"},{"name":"run-export-path-map","duration":498,"timestamp":121265958786,"id":64,"parentId":62,"tags":{},"startTime":1781342001729,"traceId":"8688474b07a00073"},{"name":"next-export","duration":691152,"timestamp":121265952393,"id":62,"parentId":1,"tags":{},"startTime":1781342001723,"traceId":"8688474b07a00073"},{"name":"move-exported-app-not-found-","duration":2309,"timestamp":121266645141,"id":65,"parentId":61,"tags":{},"startTime":1781342002416,"traceId":"8688474b07a00073"},{"name":"move-exported-app-global-error-","duration":1659,"timestamp":121266647573,"id":66,"parentId":61,"tags":{},"startTime":1781342002418,"traceId":"8688474b07a00073"},{"name":"static-generation","duration":715196,"timestamp":121265937993,"id":61,"parentId":1,"tags":{},"startTime":1781342001709,"traceId":"8688474b07a00073"},{"name":"write-routes-manifest","duration":804,"timestamp":121266653332,"id":67,"parentId":1,"tags":{},"startTime":1781342002424,"traceId":"8688474b07a00073"},{"name":"print-tree-view","duration":3790,"timestamp":121266670216,"id":68,"parentId":1,"tags":{},"startTime":1781342002441,"traceId":"8688474b07a00073"},{"name":"write-route-bundle-stats","duration":17557,"timestamp":121266674042,"id":69,"parentId":1,"tags":{},"startTime":1781342002445,"traceId":"8688474b07a00073"},{"name":"telemetry-flush","duration":163669,"timestamp":121266691641,"id":70,"parentId":1,"tags":{},"startTime":1781342002462,"traceId":"8688474b07a00073"},{"name":"next-build","duration":8479521,"timestamp":121258375813,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1781341994146,"traceId":"8688474b07a00073"}]
1
+ [{"name":"generate-buildid","duration":227,"timestamp":124430718032,"id":4,"parentId":1,"tags":{},"startTime":1781345166489,"traceId":"03ec074240b63189"},{"name":"load-custom-routes","duration":348,"timestamp":124430718377,"id":5,"parentId":1,"tags":{},"startTime":1781345166489,"traceId":"03ec074240b63189"},{"name":"create-dist-dir","duration":531,"timestamp":124430718757,"id":6,"parentId":1,"tags":{},"startTime":1781345166490,"traceId":"03ec074240b63189"},{"name":"clean","duration":532,"timestamp":124430720256,"id":7,"parentId":1,"tags":{},"startTime":1781345166491,"traceId":"03ec074240b63189"},{"name":"discover-routes","duration":7971,"timestamp":124430742739,"id":8,"parentId":1,"tags":{},"startTime":1781345166514,"traceId":"03ec074240b63189"},{"name":"create-root-mapping","duration":62,"timestamp":124430750764,"id":9,"parentId":1,"tags":{},"startTime":1781345166522,"traceId":"03ec074240b63189"},{"name":"generate-route-types","duration":18116,"timestamp":124430752252,"id":10,"parentId":1,"tags":{},"startTime":1781345166523,"traceId":"03ec074240b63189"},{"name":"public-dir-conflict-check","duration":93,"timestamp":124430770501,"id":11,"parentId":1,"tags":{},"startTime":1781345166542,"traceId":"03ec074240b63189"},{"name":"generate-routes-manifest","duration":2507,"timestamp":124430770697,"id":12,"parentId":1,"tags":{},"startTime":1781345166542,"traceId":"03ec074240b63189"},{"name":"run-turbopack","duration":2338917,"timestamp":124430780739,"id":14,"parentId":1,"tags":{},"startTime":1781345166552,"traceId":"03ec074240b63189"},{"name":"turbopack-build-events","duration":66,"timestamp":124431072169,"id":15,"parentId":1,"tags":{},"startTime":1781345166843,"traceId":"03ec074240b63189"},{"name":"run-typescript","duration":3601131,"timestamp":124433130391,"id":16,"parentId":1,"tags":{},"startTime":1781345168901,"traceId":"03ec074240b63189"},{"name":"generate-required-server-files","duration":1254,"timestamp":124436732323,"id":18,"parentId":1,"tags":{},"startTime":1781345172503,"traceId":"03ec074240b63189"},{"name":"check-static-error-page","duration":8735,"timestamp":124436875306,"id":20,"parentId":19,"tags":{},"startTime":1781345172646,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":576913,"timestamp":124436889280,"id":41,"parentId":22,"tags":{},"startTime":1781345172660,"traceId":"03ec074240b63189"},{"name":"check-page","duration":587619,"timestamp":124436878712,"id":22,"parentId":19,"tags":{"page":"/_global-error"},"startTime":1781345172650,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":703353,"timestamp":124436889470,"id":43,"parentId":24,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":713548,"timestamp":124436879347,"id":24,"parentId":19,"tags":{"page":"/api/context/claude"},"startTime":1781345172650,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":715786,"timestamp":124436889620,"id":45,"parentId":26,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":725606,"timestamp":124436879848,"id":26,"parentId":19,"tags":{"page":"/api/context/ssh"},"startTime":1781345172651,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":719164,"timestamp":124436890081,"id":48,"parentId":29,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":728653,"timestamp":124436880643,"id":29,"parentId":19,"tags":{"page":"/api/recents"},"startTime":1781345172652,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":723956,"timestamp":124436889980,"id":47,"parentId":28,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":733599,"timestamp":124436880379,"id":28,"parentId":19,"tags":{"page":"/api/git"},"startTime":1781345172651,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":726358,"timestamp":124436889389,"id":42,"parentId":23,"tags":{},"startTime":1781345172660,"traceId":"03ec074240b63189"},{"name":"check-page","duration":736713,"timestamp":124436879082,"id":23,"parentId":19,"tags":{"page":"/api/context/aider"},"startTime":1781345172650,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":728818,"timestamp":124436888959,"id":40,"parentId":21,"tags":{},"startTime":1781345172660,"traceId":"03ec074240b63189"},{"name":"check-page","duration":740525,"timestamp":124436877305,"id":21,"parentId":19,"tags":{"page":"/_not-found"},"startTime":1781345172648,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":735911,"timestamp":124436889544,"id":44,"parentId":25,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":745909,"timestamp":124436879596,"id":25,"parentId":19,"tags":{"page":"/api/context"},"startTime":1781345172651,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":745931,"timestamp":124436889829,"id":46,"parentId":27,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":755721,"timestamp":124436880097,"id":27,"parentId":19,"tags":{"page":"/api/files"},"startTime":1781345172651,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":748384,"timestamp":124436890632,"id":55,"parentId":36,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":756235,"timestamp":124436882831,"id":36,"parentId":19,"tags":{"page":"/api/sessions/stats"},"startTime":1781345172654,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":748845,"timestamp":124436890824,"id":57,"parentId":38,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":756420,"timestamp":124436883296,"id":38,"parentId":19,"tags":{"page":"/favicon.ico"},"startTime":1781345172654,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":751943,"timestamp":124436890559,"id":53,"parentId":34,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":760630,"timestamp":124436881918,"id":34,"parentId":19,"tags":{"page":"/api/sessions/scope"},"startTime":1781345172653,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":752277,"timestamp":124436890457,"id":51,"parentId":32,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":761339,"timestamp":124436881420,"id":32,"parentId":19,"tags":{"page":"/api/sessions/launch"},"startTime":1781345172653,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":754643,"timestamp":124436890597,"id":54,"parentId":35,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":762971,"timestamp":124436882300,"id":35,"parentId":19,"tags":{"page":"/api/sessions/start"},"startTime":1781345172653,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":751158,"timestamp":124436894177,"id":58,"parentId":39,"tags":{},"startTime":1781345172665,"traceId":"03ec074240b63189"},{"name":"check-page","duration":761642,"timestamp":124436883704,"id":39,"parentId":19,"tags":{"page":"/"},"startTime":1781345172655,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":755381,"timestamp":124436890269,"id":49,"parentId":30,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":764790,"timestamp":124436880891,"id":30,"parentId":19,"tags":{"page":"/api/sessions/inject"},"startTime":1781345172652,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":763680,"timestamp":124436890392,"id":50,"parentId":31,"tags":{},"startTime":1781345172661,"traceId":"03ec074240b63189"},{"name":"check-page","duration":772946,"timestamp":124436881170,"id":31,"parentId":19,"tags":{"page":"/api/sessions/input"},"startTime":1781345172652,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":763516,"timestamp":124436890671,"id":56,"parentId":37,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":771112,"timestamp":124436883086,"id":37,"parentId":19,"tags":{"page":"/api/sessions/stop"},"startTime":1781345172654,"traceId":"03ec074240b63189"},{"name":"is-page-static","duration":763727,"timestamp":124436890508,"id":52,"parentId":33,"tags":{},"startTime":1781345172662,"traceId":"03ec074240b63189"},{"name":"check-page","duration":772583,"timestamp":124436881663,"id":33,"parentId":19,"tags":{"page":"/api/sessions"},"startTime":1781345172653,"traceId":"03ec074240b63189"},{"name":"static-check","duration":779592,"timestamp":124436874671,"id":19,"parentId":1,"tags":{},"startTime":1781345172646,"traceId":"03ec074240b63189"},{"name":"write-routes-manifest","duration":863,"timestamp":124437655271,"id":60,"parentId":1,"tags":{},"startTime":1781345173426,"traceId":"03ec074240b63189"},{"name":"load-dotenv","duration":33,"timestamp":124437672218,"id":63,"parentId":62,"tags":{},"startTime":1781345173443,"traceId":"03ec074240b63189"},{"name":"run-export-path-map","duration":496,"timestamp":124437677617,"id":64,"parentId":62,"tags":{},"startTime":1781345173449,"traceId":"03ec074240b63189"},{"name":"next-export","duration":666604,"timestamp":124437671286,"id":62,"parentId":1,"tags":{},"startTime":1781345173442,"traceId":"03ec074240b63189"},{"name":"move-exported-app-not-found-","duration":2164,"timestamp":124438339682,"id":65,"parentId":61,"tags":{},"startTime":1781345174111,"traceId":"03ec074240b63189"},{"name":"move-exported-app-global-error-","duration":1470,"timestamp":124438341962,"id":66,"parentId":61,"tags":{},"startTime":1781345174113,"traceId":"03ec074240b63189"},{"name":"static-generation","duration":685947,"timestamp":124437660791,"id":61,"parentId":1,"tags":{},"startTime":1781345173432,"traceId":"03ec074240b63189"},{"name":"write-routes-manifest","duration":756,"timestamp":124438346845,"id":67,"parentId":1,"tags":{},"startTime":1781345174118,"traceId":"03ec074240b63189"},{"name":"print-tree-view","duration":3052,"timestamp":124438357942,"id":68,"parentId":1,"tags":{},"startTime":1781345174129,"traceId":"03ec074240b63189"},{"name":"write-route-bundle-stats","duration":10112,"timestamp":124438361029,"id":69,"parentId":1,"tags":{},"startTime":1781345174132,"traceId":"03ec074240b63189"},{"name":"telemetry-flush","duration":179267,"timestamp":124438371182,"id":70,"parentId":1,"tags":{},"startTime":1781345174142,"traceId":"03ec074240b63189"},{"name":"next-build","duration":7881949,"timestamp":124430668524,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1781345166440,"traceId":"03ec074240b63189"}]
package/.next/trace-build CHANGED
@@ -1 +1 @@
1
- [{"name":"run-turbopack","duration":2566029,"timestamp":121258505273,"id":14,"parentId":1,"tags":{},"startTime":1781341994276,"traceId":"8688474b07a00073"},{"name":"turbopack-build-events","duration":62,"timestamp":121258816573,"id":15,"parentId":1,"tags":{},"startTime":1781341994587,"traceId":"8688474b07a00073"},{"name":"run-typescript","duration":3916701,"timestamp":121261084165,"id":16,"parentId":1,"tags":{},"startTime":1781341996855,"traceId":"8688474b07a00073"},{"name":"static-check","duration":796716,"timestamp":121265134269,"id":19,"parentId":1,"tags":{},"startTime":1781342000905,"traceId":"8688474b07a00073"},{"name":"static-generation","duration":715196,"timestamp":121265937993,"id":61,"parentId":1,"tags":{},"startTime":1781342001709,"traceId":"8688474b07a00073"},{"name":"telemetry-flush","duration":163669,"timestamp":121266691641,"id":70,"parentId":1,"tags":{},"startTime":1781342002462,"traceId":"8688474b07a00073"},{"name":"next-build","duration":8479521,"timestamp":121258375813,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1781341994146,"traceId":"8688474b07a00073"}]
1
+ [{"name":"run-turbopack","duration":2338917,"timestamp":124430780739,"id":14,"parentId":1,"tags":{},"startTime":1781345166552,"traceId":"03ec074240b63189"},{"name":"turbopack-build-events","duration":66,"timestamp":124431072169,"id":15,"parentId":1,"tags":{},"startTime":1781345166843,"traceId":"03ec074240b63189"},{"name":"run-typescript","duration":3601131,"timestamp":124433130391,"id":16,"parentId":1,"tags":{},"startTime":1781345168901,"traceId":"03ec074240b63189"},{"name":"static-check","duration":779592,"timestamp":124436874671,"id":19,"parentId":1,"tags":{},"startTime":1781345172646,"traceId":"03ec074240b63189"},{"name":"static-generation","duration":685947,"timestamp":124437660791,"id":61,"parentId":1,"tags":{},"startTime":1781345173432,"traceId":"03ec074240b63189"},{"name":"telemetry-flush","duration":179267,"timestamp":124438371182,"id":70,"parentId":1,"tags":{},"startTime":1781345174142,"traceId":"03ec074240b63189"},{"name":"next-build","duration":7881949,"timestamp":124430668524,"id":1,"tags":{"buildMode":"default","version":"16.2.6","bundler":"turbopack","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1781345166440,"traceId":"03ec074240b63189"}]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neural-loom",
3
- "version": "0.2.17",
3
+ "version": "0.2.19",
4
4
  "bin": {
5
5
  "neural-loom": "./bin/cli.js"
6
6
  },
@@ -1,6 +1,6 @@
1
1
  import { NextResponse } from "next/server";
2
2
  import { SessionManager } from "@/lib/agents/SessionManager";
3
- import { addRecent } from "@/lib/recents";
3
+ import { addRecent, saveLastSession } from "@/lib/recents";
4
4
 
5
5
  export async function POST(request: Request) {
6
6
  try {
@@ -15,6 +15,9 @@ export async function POST(request: Request) {
15
15
  const manager = SessionManager.getInstance();
16
16
  const session = await manager.createSession(type, name, workspaceRoot, scopedDirs);
17
17
 
18
+ // Save session config to recents
19
+ saveLastSession({ type, name, workspaceRoot, scopedDirs });
20
+
18
21
  // Save workspace root to recents list
19
22
  if (workspaceRoot) {
20
23
  addRecent("workspace", workspaceRoot);
package/src/app/page.tsx CHANGED
@@ -89,10 +89,17 @@ export default function Home() {
89
89
  const [isClaudeDockerLaunch, setIsClaudeDockerLaunch] = useState<boolean>(false);
90
90
  const [serverCwd, setServerCwd] = useState<string>("");
91
91
  const [wsPort, setWsPort] = useState<number>(3001);
92
+ const [lastSessionConfig, setLastSessionConfig] = useState<{
93
+ type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker';
94
+ name?: string;
95
+ workspaceRoot?: string;
96
+ scopedDirs?: string[];
97
+ } | null>(null);
92
98
 
99
+ const activeAgents = sessions.filter(s => s.id !== "workspace-terminal");
93
100
  const activeSession = sessions.find(s => s.id === activeSessionId);
94
- const isDockerActive = sessions.some(s => (s.type === 'claude-docker' || s.type === 'aider-docker') && s.status === 'running');
95
- const isSshActive = sessions.some(s => s.type === 'claude-ssh' && s.status === 'running');
101
+ const isDockerActive = activeAgents.some(s => (s.type === 'claude-docker' || s.type === 'aider-docker') && s.status === 'running');
102
+ const isSshActive = activeAgents.some(s => s.type === 'claude-ssh' && s.status === 'running');
96
103
 
97
104
  // Fetch all sessions on mount & periodically
98
105
  const fetchSessions = async () => {
@@ -113,9 +120,24 @@ export default function Home() {
113
120
  }
114
121
  };
115
122
 
123
+ const fetchRecents = async () => {
124
+ try {
125
+ const res = await fetch("/api/recents");
126
+ if (res.ok) {
127
+ const data = await res.json();
128
+ if (data.success && data.recents && data.recents.lastSession) {
129
+ setLastSessionConfig(data.recents.lastSession);
130
+ }
131
+ }
132
+ } catch (err) {
133
+ console.error("Failed to fetch recents:", err);
134
+ }
135
+ };
136
+
116
137
  useEffect(() => {
117
138
  const initFetch = async () => {
118
139
  await fetchSessions();
140
+ await fetchRecents();
119
141
  };
120
142
  initFetch();
121
143
  const interval = setInterval(fetchSessions, 4000);
@@ -177,6 +199,7 @@ export default function Home() {
177
199
  if (data.success) {
178
200
  await fetchSessions();
179
201
  setActiveSessionId(data.session.id);
202
+ setLastSessionConfig({ type, name: sessionName, workspaceRoot: customWorkspaceRoot, scopedDirs: customScopedDirs });
180
203
  }
181
204
  } catch (err) {
182
205
  console.error("Failed to launch session:", err);
@@ -241,23 +264,78 @@ export default function Home() {
241
264
  <section>
242
265
  <h2 className={styles.sectionTitle}>Active AI Agents</h2>
243
266
 
244
- {sessions.length === 0 ? (
267
+ {activeAgents.length === 0 ? (
245
268
  <div className="card" style={{ padding: "3rem 1.5rem", textAlign: "center" }}>
246
269
  <p style={{ color: "var(--muted)", marginBottom: "1.5rem" }}>
247
- No active agent sessions in this workspace. Launch a simulated session to verify the control bridge.
270
+ No active agent sessions in this workspace. Launch a Claude or Aider agent session to begin.
248
271
  </p>
249
- <button
250
- className={styles.quickLaunchBtn}
251
- onClick={() => handleLaunchSession('mock')}
252
- disabled={isLoading}
253
- style={{ maxWidth: "240px", margin: "0 auto" }}
254
- >
255
- {isLoading ? "Launching..." : "⚡ Launch Simulated Session"}
256
- </button>
272
+ <div style={{ display: "flex", gap: "1rem", justifyContent: "center", flexWrap: "wrap" }}>
273
+ {lastSessionConfig && (
274
+ <button
275
+ className={styles.quickLaunchBtn}
276
+ onClick={() => {
277
+ handleLaunchSession(
278
+ lastSessionConfig.type,
279
+ lastSessionConfig.name,
280
+ lastSessionConfig.workspaceRoot,
281
+ lastSessionConfig.scopedDirs
282
+ );
283
+ }}
284
+ disabled={isLoading}
285
+ style={{
286
+ background: "linear-gradient(135deg, hsl(38, 92%, 50%) 0%, hsl(0, 84%, 60%) 100%)",
287
+ border: "none",
288
+ maxWidth: "200px"
289
+ }}
290
+ title={`Re-launch: ${lastSessionConfig.name || lastSessionConfig.type}`}
291
+ >
292
+ ⚡ Re-launch Last Session
293
+ </button>
294
+ )}
295
+ <button
296
+ className={styles.quickLaunchBtn}
297
+ onClick={() => {
298
+ setIsClaudeDockerLaunch(false);
299
+ setIsClaudeWizardOpen(true);
300
+ }}
301
+ disabled={isLoading}
302
+ style={{
303
+ background: "linear-gradient(135deg, hsl(262, 83%, 60%) 0%, hsl(195, 100%, 45%) 100%)",
304
+ border: "none",
305
+ maxWidth: "200px"
306
+ }}
307
+ >
308
+ Launch Claude PTY
309
+ </button>
310
+ <button
311
+ className={styles.quickLaunchBtn}
312
+ onClick={() => {
313
+ setIsAiderDockerLaunch(false);
314
+ setIsAiderWizardOpen(true);
315
+ }}
316
+ disabled={isLoading}
317
+ style={{
318
+ background: "linear-gradient(135deg, hsl(210, 80%, 45%) 0%, hsl(262, 80%, 55%) 100%)",
319
+ border: "none",
320
+ maxWidth: "200px"
321
+ }}
322
+ >
323
+ Launch Aider PTY
324
+ </button>
325
+ </div>
326
+ <div style={{ marginTop: "1.5rem", fontSize: "0.75rem", color: "var(--muted)" }}>
327
+ Want to verify layout features first?{" "}
328
+ <span
329
+ onClick={() => handleLaunchSession('mock')}
330
+ style={{ color: "var(--primary)", cursor: "pointer", textDecoration: "underline" }}
331
+ >
332
+ Start simulated sandbox session
333
+ </span>
334
+ </div>
257
335
  </div>
258
336
  ) : (
259
337
  <div className={styles.agentGrid}>
260
- {sessions.map(session => (
338
+ {activeAgents.map(session => (
261
339
  <div key={session.id} className={`${styles.agentCard} card ${activeSessionId === session.id ? styles.activeBorder : ""}`}>
262
340
  <div className={styles.agentHeader}>
263
341
  <span className={styles.agentName}>{session.name}</span>
@@ -333,7 +411,7 @@ export default function Home() {
333
411
  </section>
334
412
 
335
413
  {/* Interactive Session Terminal Display */}
336
- {activeSessionId && (
414
+ {activeSessionId && activeSessionId !== "workspace-terminal" && (
337
415
  <section className="card" style={{ display: "flex", flexDirection: "column", border: "1px solid var(--border-focus)" }}>
338
416
  <div className={styles.agentHeader} style={{ justifyContent: "space-between", background: "rgba(109, 40, 217, 0.08)" }}>
339
417
  <span style={{ fontWeight: 600, display: "flex", alignItems: "center", gap: "0.5rem" }}>
@@ -460,6 +538,20 @@ export default function Home() {
460
538
  </div>
461
539
  <ContextEditor />
462
540
  </section>
541
+
542
+ {/* Workspace Shell Terminal */}
543
+ <section style={{ marginTop: "2rem" }}>
544
+ <h2 className={styles.sectionTitle}>Workspace Shell Terminal</h2>
545
+ <div className="card" style={{ display: "flex", flexDirection: "column", border: "1px solid var(--border)", padding: 0 }}>
546
+ <div className={styles.agentHeader} style={{ justifyContent: "space-between", background: "rgba(255, 255, 255, 0.02)" }}>
547
+ <span style={{ fontWeight: 600, display: "flex", alignItems: "center", gap: "0.5rem", fontSize: "0.85rem" }}>
548
+ 💻 Local Workspace Shell (CWD: {serverCwd || "root"})
549
+ </span>
550
+ <span style={{ fontSize: "0.7rem", color: "var(--muted)" }}>Pre-configured environment</span>
551
+ </div>
552
+ <TerminalConsole sessionId="workspace-terminal" height="300px" wsPort={wsPort} />
553
+ </div>
554
+ </section>
463
555
  </main>
464
556
 
465
557
  {/* Right Panel: Environments & Actions */}
@@ -487,10 +579,6 @@ export default function Home() {
487
579
  </section>
488
580
 
489
581
  <section style={{ display: "flex", flexDirection: "column", gap: "0.75rem" }}>
490
- <button className={styles.quickLaunchBtn} onClick={() => handleLaunchSession('mock')} disabled={isLoading}>
491
- <span>⚡</span>
492
- <span>Launch Mock Agent</span>
493
- </button>
494
582
  <button
495
583
  className={styles.quickLaunchBtn}
496
584
  onClick={() => {
@@ -581,6 +669,15 @@ export default function Home() {
581
669
  <span style={{ color: "var(--primary)", cursor: "pointer" }}>→</span>
582
670
  </li>
583
671
  </ul>
672
+ <div style={{ marginTop: "1.2rem", textAlign: "center", fontSize: "0.72rem", color: "var(--muted)" }}>
673
+ Need to troubleshoot?{" "}
674
+ <span
675
+ onClick={() => handleLaunchSession('mock')}
676
+ style={{ color: "var(--primary)", cursor: "pointer", textDecoration: "underline" }}
677
+ >
678
+ Launch simulated playground sandbox
679
+ </span>
680
+ </div>
584
681
  </section>
585
682
  </aside>
586
683
 
@@ -1,7 +1,7 @@
1
1
  export interface RunnerStatus {
2
2
  id: string;
3
3
  name: string;
4
- type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker';
4
+ type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell';
5
5
  status: 'idle' | 'running' | 'stopped';
6
6
  createdAt: string;
7
7
  logsCount: number;
@@ -14,7 +14,7 @@ export interface RunnerStatus {
14
14
  export abstract class AgentRunner {
15
15
  abstract id: string;
16
16
  abstract name: string;
17
- abstract type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker';
17
+ abstract type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell';
18
18
  abstract status: 'idle' | 'running' | 'stopped';
19
19
  abstract createdAt: string;
20
20
  abstract logs: string[];
@@ -8,6 +8,7 @@ import { AiderRunner } from "./AiderRunner";
8
8
  import { initWebSocketServer } from "./WebSocketServer";
9
9
  import { ContextManager } from "./ContextManager";
10
10
  import { SessionPersister } from "./SessionPersister";
11
+ import { ShellRunner } from "./ShellRunner";
11
12
  import { getWorkspaceFileFolders } from "../workspaceParser";
12
13
 
13
14
  export class SessionManager {
@@ -19,6 +20,11 @@ export class SessionManager {
19
20
  ContextManager.initializeStaging();
20
21
  ContextManager.compileGlobalRules();
21
22
 
23
+ // Spawn/start permanent workspace terminal shell runner
24
+ const shellRunner = new ShellRunner();
25
+ shellRunner.start();
26
+ this.sessions.set(shellRunner.id, shellRunner);
27
+
22
28
  // Reload persisted sessions
23
29
  try {
24
30
  const saved = SessionPersister.loadAllSessions();
@@ -114,7 +120,7 @@ export class SessionManager {
114
120
  }
115
121
 
116
122
  public syncWorkspaceFolders(session: AgentRunner) {
117
- if (session.type === 'mock') return;
123
+ if (session.type === 'mock' || session.type === 'shell') return;
118
124
  const root = session.workspaceRoot || process.env.ORIGINAL_CWD || process.cwd();
119
125
  const currentWorkspaceFolders = getWorkspaceFileFolders(root);
120
126
 
@@ -0,0 +1,159 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import type { IPty } from "node-pty";
4
+ import { AgentRunner, RunnerStatus } from "./AgentRunner";
5
+
6
+ function isWindows(): boolean {
7
+ if (typeof process === "undefined") return false;
8
+ const key = Object.keys(process).find(k => k.startsWith("plat") && k.endsWith("form"));
9
+ return !!key && (process as unknown as Record<string, unknown>)[key] === "win32";
10
+ }
11
+
12
+ function findGitBash(): string | null {
13
+ if (!isWindows()) {
14
+ return "bash";
15
+ }
16
+ const pf = process.env.PROGRAMFILES || "C:\\Program Files";
17
+ const pf86 = process.env["PROGRAMFILES(X86)"] || "C:\\Program Files (x86)";
18
+ const local = process.env.LOCALAPPDATA || "";
19
+
20
+ const candidates: string[] = [
21
+ process.env.WINGMAN_BASH_PATH,
22
+ path.join(pf, "Git", "bin", "bash.exe"),
23
+ path.join(pf86, "Git", "bin", "bash.exe"),
24
+ local ? path.join(local, "Programs", "Git", "bin", "bash.exe") : "",
25
+ ].filter((p): p is string => typeof p === "string" && p !== "");
26
+
27
+ const found = candidates.find(p => fs.existsSync(p));
28
+ if (found) return found;
29
+
30
+ // Fallback to PowerShell or Cmd on Windows
31
+ const windir = process.env.windir || "C:\\Windows";
32
+ const powershell = path.join(windir, "System32", "WindowsPowerShell", "v1.0", "powershell.exe");
33
+ if (fs.existsSync(powershell)) return powershell;
34
+
35
+ const cmd = path.join(windir, "System32", "cmd.exe");
36
+ if (fs.existsSync(cmd)) return cmd;
37
+
38
+ return null;
39
+ }
40
+
41
+ export class ShellRunner extends AgentRunner {
42
+ id: string = "workspace-terminal";
43
+ name: string = "Workspace Shell";
44
+ type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker' | 'shell' = "shell";
45
+ status: 'idle' | 'running' | 'stopped' = 'idle';
46
+ createdAt: string = new Date().toISOString();
47
+ logs: string[] = [];
48
+
49
+ private ptyProcess: IPty | null = null;
50
+ private ptyModule: typeof import("node-pty") | null = null;
51
+
52
+ constructor() {
53
+ super();
54
+ }
55
+
56
+ private appendLog(line: string) {
57
+ this.logs.push(line);
58
+ if (this.logs.length > 5000) {
59
+ this.logs.shift();
60
+ }
61
+ this.emitOutput(line);
62
+ }
63
+
64
+ async start(): Promise<void> {
65
+ if (this.status === 'running') return;
66
+
67
+ const shellPath = findGitBash();
68
+ if (!shellPath) {
69
+ this.status = 'stopped';
70
+ this.appendLog("[System Error] Shell executable (Git Bash/PowerShell) not found.\r\n");
71
+ return;
72
+ }
73
+
74
+ try {
75
+ if (!this.ptyModule) {
76
+ this.ptyModule = eval("require")("node-pty");
77
+ }
78
+
79
+ this.status = 'running';
80
+ this.appendLog("\x1b[1;36m[System] Launching workspace terminal interactive shell...\x1b[0m\r\n");
81
+
82
+ const targetCwd = process.env.ORIGINAL_CWD || process.cwd();
83
+
84
+ // Spawn login/interactive shell
85
+ const spawnArgs = isWindows() && shellPath.endsWith("bash.exe") ? ["--login"] : [];
86
+
87
+ this.ptyProcess = this.ptyModule!.spawn(shellPath, spawnArgs, {
88
+ name: "xterm-256color",
89
+ cols: 120,
90
+ rows: 30,
91
+ cwd: targetCwd,
92
+ env: {
93
+ ...process.env,
94
+ TERM: "xterm-256color",
95
+ COLORTERM: "truecolor",
96
+ },
97
+ });
98
+
99
+ this.ptyProcess.onData((data: string) => {
100
+ this.appendLog(data);
101
+ });
102
+
103
+ this.ptyProcess.onExit(({ exitCode, signal }: { exitCode: number; signal?: number }) => {
104
+ this.status = 'stopped';
105
+ this.appendLog(`\r\n\x1b[1;31m[System] Shell process exited (code=${exitCode}, signal=${signal}).\x1b[0m\r\n`);
106
+ this.ptyProcess = null;
107
+ });
108
+
109
+ } catch (err) {
110
+ const errorMessage = err instanceof Error ? err.message : "Unknown error";
111
+ this.status = 'stopped';
112
+ this.appendLog(`[System Error] Failed to initialize shell runner: ${errorMessage}\r\n`);
113
+ }
114
+ }
115
+
116
+ async stop(): Promise<void> {
117
+ this.status = 'stopped';
118
+ if (this.ptyProcess) {
119
+ try {
120
+ this.ptyProcess.kill();
121
+ } catch (err) {
122
+ console.error("Error killing shell process:", err);
123
+ }
124
+ this.ptyProcess = null;
125
+ }
126
+ this.appendLog("\r\n\x1b[1;31m[System] Shell session stopped.\x1b[0m\r\n");
127
+ }
128
+
129
+ async sendInput(text: string, isRaw = false): Promise<void> {
130
+ if (this.status !== 'running' || !this.ptyProcess) {
131
+ this.appendLog(`\r\n[Error] Shell process is ${this.status}.\r\n`);
132
+ return;
133
+ }
134
+ this.ptyProcess.write(isRaw ? text : text + "\r");
135
+ }
136
+
137
+ override resize(cols: number, rows: number): void {
138
+ if (this.ptyProcess) {
139
+ try {
140
+ this.ptyProcess.resize(cols, rows);
141
+ } catch (err) {
142
+ console.error("[ShellRunner] Failed to resize:", err);
143
+ }
144
+ }
145
+ }
146
+
147
+ getStatus(): RunnerStatus {
148
+ return {
149
+ id: this.id,
150
+ name: this.name,
151
+ type: this.type,
152
+ status: this.status,
153
+ createdAt: this.createdAt,
154
+ logsCount: this.logs.length,
155
+ workspaceRoot: process.env.ORIGINAL_CWD || process.cwd(),
156
+ scopedDirs: [],
157
+ };
158
+ }
159
+ }
@@ -16,13 +16,30 @@ export function loadRecents() {
16
16
  const data = JSON.parse(fs.readFileSync(recentsPath, "utf8"));
17
17
  return {
18
18
  workspaces: Array.isArray(data.workspaces) ? (data.workspaces as string[]) : [],
19
- scopes: Array.isArray(data.scopes) ? (data.scopes as string[]) : []
19
+ scopes: Array.isArray(data.scopes) ? (data.scopes as string[]) : [],
20
+ lastSession: data.lastSession || null
20
21
  };
21
22
  } catch (e) {
22
23
  console.error("[Recents] Failed to parse recents.json:", e);
23
24
  }
24
25
  }
25
- return { workspaces: [], scopes: [] };
26
+ return { workspaces: [], scopes: [], lastSession: null };
27
+ }
28
+
29
+ export function saveLastSession(config: {
30
+ type: 'mock' | 'claude' | 'claude-docker' | 'claude-ssh' | 'aider' | 'aider-docker';
31
+ name?: string;
32
+ workspaceRoot?: string;
33
+ scopedDirs?: string[];
34
+ }) {
35
+ const recents = loadRecents();
36
+ recents.lastSession = config;
37
+ try {
38
+ ensureDir();
39
+ fs.writeFileSync(recentsPath, JSON.stringify(recents, null, 2), "utf8");
40
+ } catch (err) {
41
+ console.error("[Recents] Failed to write recents.json:", err);
42
+ }
26
43
  }
27
44
 
28
45
  export function addRecent(type: "workspace" | "scope", folderPath: string) {
@@ -1 +0,0 @@
1
- (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,67585,(e,a,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"BailoutToCSR",{enumerable:!0,get:function(){return n}});let t=e.r(32061);function n({reason:e,children:a}){if("u"<typeof window)throw Object.defineProperty(new t.BailoutToCSRError(e),"__NEXT_ERROR_CODE",{value:"E394",enumerable:!1,configurable:!0});return a}},9885,(e,a,s)=>{"use strict";function t(e){return e.split("/").map(e=>encodeURIComponent(e)).join("/")}Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"encodeURIPath",{enumerable:!0,get:function(){return t}})},52157,(e,a,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"PreloadChunks",{enumerable:!0,get:function(){return i}});let t=e.r(43476),n=e.r(74080),l=e.r(63599),r=e.r(9885),o=e.r(43369);function i({moduleIds:e}){if("u">typeof window)return null;let a=l.workAsyncStorage.getStore();if(void 0===a)return null;let s=[];if(a.reactLoadableManifest&&e){let t=a.reactLoadableManifest;for(let a of e){if(!t[a])continue;let e=t[a].files;s.push(...e)}}if(0===s.length)return null;let d=(0,o.getAssetTokenQuery)();return(0,t.jsx)(t.Fragment,{children:s.map(e=>{let s=`${a.assetPrefix}/_next/${(0,r.encodeURIPath)(e)}${d}`;return e.endsWith(".css")?(0,t.jsx)("link",{precedence:"dynamic",href:s,rel:"stylesheet",as:"style",nonce:a.nonce},e):((0,n.preload)(s,{as:"script",fetchPriority:"low",nonce:a.nonce}),null)})})}},69093,(e,a,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"default",{enumerable:!0,get:function(){return d}});let t=e.r(43476),n=e.r(71645),l=e.r(67585),r=e.r(52157);function o(e){return{default:e&&"default"in e?e.default:e}}let i={loader:()=>Promise.resolve(o(()=>null)),loading:null,ssr:!0},d=function(e){let a={...i,...e},s=(0,n.lazy)(()=>a.loader().then(o)),d=a.loading;function c(e){let o=d?(0,t.jsx)(d,{isLoading:!0,pastDelay:!0,error:null}):null,i=!a.ssr||!!a.loading,c=i?n.Suspense:n.Fragment,u=a.ssr?(0,t.jsxs)(t.Fragment,{children:["u"<typeof window?(0,t.jsx)(r.PreloadChunks,{moduleIds:a.modules}):null,(0,t.jsx)(s,{...e})]}):(0,t.jsx)(l.BailoutToCSR,{reason:"next/dynamic",children:(0,t.jsx)(s,{...e})});return(0,t.jsx)(c,{...i?{fallback:o}:{},children:u})}return c.displayName="LoadableComponent",c}},70703,(e,a,s)=>{"use strict";Object.defineProperty(s,"__esModule",{value:!0}),Object.defineProperty(s,"default",{enumerable:!0,get:function(){return n}});let t=e.r(55682)._(e.r(69093));function n(e,a){let s={};"function"==typeof e&&(s.loader=e);let n={...s,...a};return(0,t.default)({...n,modules:n.loadableGenerated?.modules})}("function"==typeof s.default||"object"==typeof s.default&&null!==s.default)&&void 0===s.default.__esModule&&(Object.defineProperty(s.default,"__esModule",{value:!0}),Object.assign(s.default,s),a.exports=s.default)},20897,e=>{e.v({activeBorder:"page-module___8aEwW__activeBorder",agentBadge:"page-module___8aEwW__agentBadge",agentCard:"page-module___8aEwW__agentCard",agentGrid:"page-module___8aEwW__agentGrid",agentHeader:"page-module___8aEwW__agentHeader",agentName:"page-module___8aEwW__agentName",ansiCyan:"page-module___8aEwW__ansiCyan",ansiGreen:"page-module___8aEwW__ansiGreen",ansiMagenta:"page-module___8aEwW__ansiMagenta",ansiRed:"page-module___8aEwW__ansiRed",ansiYellow:"page-module___8aEwW__ansiYellow",cardBody:"page-module___8aEwW__cardBody",container:"page-module___8aEwW__container",containerActive:"page-module___8aEwW__containerActive",contextDetails:"page-module___8aEwW__contextDetails",contextItem:"page-module___8aEwW__contextItem",contextList:"page-module___8aEwW__contextList",contextMeta:"page-module___8aEwW__contextMeta",contextTitle:"page-module___8aEwW__contextTitle",dashboardGrid:"page-module___8aEwW__dashboardGrid",envGrid:"page-module___8aEwW__envGrid",envName:"page-module___8aEwW__envName",envRow:"page-module___8aEwW__envRow",envStatus:"page-module___8aEwW__envStatus",footer:"page-module___8aEwW__footer",header:"page-module___8aEwW__header",logoArea:"page-module___8aEwW__logoArea",mainPanel:"page-module___8aEwW__mainPanel",pulse:"page-module___8aEwW__pulse",pulseDot:"page-module___8aEwW__pulseDot",quickLaunchBtn:"page-module___8aEwW__quickLaunchBtn",sectionTitle:"page-module___8aEwW__sectionTitle",sidePanel:"page-module___8aEwW__sidePanel",statusIndicator:"page-module___8aEwW__statusIndicator",stoppedBadge:"page-module___8aEwW__stoppedBadge",subtitle:"page-module___8aEwW__subtitle",terminalContainer:"page-module___8aEwW__terminalContainer",terminalInput:"page-module___8aEwW__terminalInput",terminalInputArea:"page-module___8aEwW__terminalInputArea",terminalLine:"page-module___8aEwW__terminalLine",terminalSendBtn:"page-module___8aEwW__terminalSendBtn",title:"page-module___8aEwW__title"})},52683,e=>{"use strict";var a=e.i(43476),s=e.i(71645),t=e.i(70703),n=e.i(20897);let l=(0,t.default)(()=>e.A(33779),{loadableGenerated:{modules:[37314]},ssr:!1,loading:()=>(0,a.jsx)("div",{style:{height:"400px",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"#05070a",color:"var(--muted)",border:"1px solid var(--border)",borderBottomLeftRadius:"12px",borderBottomRightRadius:"12px"},children:(0,a.jsx)("span",{children:"Initializing terminal emulator..."})})}),r=(0,t.default)(()=>e.A(39429),{loadableGenerated:{modules:[1985]},ssr:!1,loading:()=>(0,a.jsx)("div",{style:{height:"280px",display:"flex",alignItems:"center",justifyContent:"center",backgroundColor:"var(--card)",border:"1px solid var(--border)",borderRadius:"12px",marginTop:"1.5rem"},children:(0,a.jsx)("span",{style:{color:"var(--muted)"},children:"Initializing prompt editor..."})})}),o=(0,t.default)(()=>e.A(56915),{loadableGenerated:{modules:[99026]},ssr:!1}),i=(0,t.default)(()=>e.A(78716),{loadableGenerated:{modules:[9949]},ssr:!1}),d=(0,t.default)(()=>e.A(33789),{loadableGenerated:{modules:[20032]},ssr:!1}),c=(0,t.default)(()=>e.A(78003),{loadableGenerated:{modules:[97722]},ssr:!1});e.s(["default",0,function(){let[e,t]=(0,s.useState)([]),[u,p]=(0,s.useState)(null),[m,h]=(0,s.useState)(!1),[_,f]=(0,s.useState)(!1),[x,g]=(0,s.useState)(!1),[j,y]=(0,s.useState)(!1),[b,v]=(0,s.useState)(!1),[w,k]=(0,s.useState)(!1),[C,S]=(0,s.useState)(""),[N,P]=(0,s.useState)(3001),E=e.find(e=>e.id===u),W=e.some(e=>("claude-docker"===e.type||"aider-docker"===e.type)&&"running"===e.status),T=e.some(e=>"claude-ssh"===e.type&&"running"===e.status),L=async()=>{try{let e=await fetch("/api/sessions"),a=await e.json();a.sessions&&t(a.sessions),a.wsPort&&P(a.wsPort),a.originalCwd&&S(a.originalCwd)}catch(e){console.error("Failed to fetch sessions:",e)}};(0,s.useEffect)(()=>{(async()=>{await L()})();let e=setInterval(L,4e3);return()=>clearInterval(e)},[]);let R=async(e,a,s,t)=>{h(!0);try{let n=a;n||("claude"===e?n="Claude Local":"claude-docker"===e?n="Claude Docker":"claude-ssh"===e?n="Claude SSH":"aider"===e?n="Aider Local":"aider-docker"===e?n="Aider Docker":"mock"===e&&(n="Mock Session"));let l={type:e,name:n,workspaceRoot:s,scopedDirs:t};if(("aider"===e||"aider-docker"===e)&&!s)try{let e=await fetch("/api/context/aider");if(e.ok){let a=await e.json();a.success&&a.config&&(l.workspaceRoot=a.config.workspaceRoot,l.scopedDirs=a.config.scopedDirs)}}catch(e){console.error("Failed to load aider configuration before launch:",e)}let r=await fetch("/api/sessions/launch",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)}),o=await r.json();o.success&&(await L(),p(o.session.id))}catch(e){console.error("Failed to launch session:",e)}finally{h(!1)}},A=async(e,a=!1)=>{try{let s=await fetch("/api/sessions/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:e,delete:a})});(await s.json()).success&&(a&&u===e&&p(null),await L())}catch(e){console.error("Failed to stop session:",e)}};return(0,a.jsxs)("div",{className:`${n.default.container} ${E?n.default.containerActive:""}`,children:[(0,a.jsxs)("header",{className:n.default.header,children:[(0,a.jsxs)("div",{className:n.default.logoArea,children:[(0,a.jsx)("h1",{className:n.default.title,children:"NeuralLoom"}),(0,a.jsx)("span",{className:n.default.subtitle,children:"Unified AI Orchestrator & Context Bridge"})]}),(0,a.jsxs)("div",{className:n.default.statusIndicator,children:[(0,a.jsx)("span",{className:n.default.pulseDot}),(0,a.jsx)("span",{children:"Orchestrator Online"})]})]}),E?(0,a.jsx)("div",{style:{flex:1,minHeight:0,display:"flex",flexDirection:"column"},children:(0,a.jsx)(c,{sessionId:E.id,workspaceRoot:E.workspaceRoot||"",scopedDirs:E.scopedDirs||[],onClose:()=>p(null),sessions:e,onSwitchSession:e=>p(e),onRefreshSessions:L,wsPort:N})}):(0,a.jsxs)("div",{className:n.default.dashboardGrid,children:[(0,a.jsxs)("main",{className:n.default.mainPanel,children:[(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:n.default.sectionTitle,children:"Active AI Agents"}),0===e.length?(0,a.jsxs)("div",{className:"card",style:{padding:"3rem 1.5rem",textAlign:"center"},children:[(0,a.jsx)("p",{style:{color:"var(--muted)",marginBottom:"1.5rem"},children:"No active agent sessions in this workspace. Launch a simulated session to verify the control bridge."}),(0,a.jsx)("button",{className:n.default.quickLaunchBtn,onClick:()=>R("mock"),disabled:m,style:{maxWidth:"240px",margin:"0 auto"},children:m?"Launching...":"⚡ Launch Simulated Session"})]}):(0,a.jsx)("div",{className:n.default.agentGrid,children:e.map(e=>(0,a.jsxs)("div",{className:`${n.default.agentCard} card ${u===e.id?n.default.activeBorder:""}`,children:[(0,a.jsxs)("div",{className:n.default.agentHeader,children:[(0,a.jsx)("span",{className:n.default.agentName,children:e.name}),(0,a.jsx)("span",{className:`${n.default.agentBadge} ${"stopped"===e.status?n.default.stoppedBadge:""}`,children:e.status})]}),(0,a.jsxs)("div",{className:n.default.cardBody,children:[(0,a.jsxs)("p",{style:{fontSize:"0.825rem",color:"var(--muted)"},children:["ID: ",(0,a.jsx)("code",{style:{fontSize:"0.75rem"},children:e.id.substring(0,8)}),(0,a.jsx)("br",{}),"Type: ","claude"===e.type?"Claude Local PTY":"claude-docker"===e.type?"Claude Docker PTY":"claude-ssh"===e.type?"Claude SSH PTY":"aider"===e.type?"Aider Local PTY":"aider-docker"===e.type?"Aider Docker PTY":"mock"===e.type?"Simulated Mock PTY":"Unknown PTY",(0,a.jsx)("br",{}),"Logs: ",e.logsCount," captured lines"]}),(0,a.jsxs)("div",{style:{display:"flex",gap:"0.5rem",marginTop:"1rem"},children:["running"===e.status?(0,a.jsx)("button",{onClick:()=>A(e.id,!1),style:{flex:1,padding:"0.4rem 0.6rem",borderRadius:"6px",border:"1px solid var(--danger)",backgroundColor:"transparent",fontSize:"0.75rem",fontWeight:600,color:"var(--danger)"},children:"Stop"}):(0,a.jsx)("button",{onClick:()=>A(e.id,!0),style:{flex:1,padding:"0.4rem 0.6rem",borderRadius:"6px",border:"1px solid var(--border)",backgroundColor:"transparent",fontSize:"0.75rem",fontWeight:600,color:"var(--muted)"},children:"Delete"}),(0,a.jsx)("button",{onClick:()=>p(e.id),style:{flex:2,padding:"0.4rem 0.6rem",borderRadius:"6px",border:"none",backgroundColor:u===e.id?"var(--border-focus)":"var(--primary)",fontSize:"0.75rem",fontWeight:600,color:"#fff"},children:u===e.id?"Connected":"Open Session"})]})]})]},e.id))})]}),u&&(0,a.jsxs)("section",{className:"card",style:{display:"flex",flexDirection:"column",border:"1px solid var(--border-focus)"},children:[(0,a.jsxs)("div",{className:n.default.agentHeader,style:{justifyContent:"space-between",background:"rgba(109, 40, 217, 0.08)"},children:[(0,a.jsxs)("span",{style:{fontWeight:600,display:"flex",alignItems:"center",gap:"0.5rem"},children:["🖥️ Console Bridge — ",e.find(e=>e.id===u)?.name]}),(0,a.jsxs)("div",{style:{display:"flex",gap:"0.5rem",alignItems:"center"},children:[e.find(e=>e.id===u)?.status==="stopped"&&(0,a.jsx)("button",{onClick:async()=>{try{let e=await fetch("/api/sessions/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:u})});if(e.ok)await L();else{let a=await e.json();alert(a.error||"Failed to restart session.")}}catch(e){console.error("Failed to restart session:",e),alert("Network error: failed to restart session.")}},style:{padding:"0.2rem 0.5rem",borderRadius:"4px",border:"1px solid #eab308",backgroundColor:"rgba(234, 179, 8, 0.15)",color:"#eab308",fontSize:"0.7rem",fontWeight:600,cursor:"pointer",boxShadow:"0 0 8px rgba(234, 179, 8, 0.2)"},title:"Restart the stopped session process runner",children:"⚡ Restart Session"}),(0,a.jsx)("button",{onClick:()=>p(null),style:{border:"none",background:"none",color:"var(--muted)",cursor:"pointer",fontSize:"0.75rem"},children:"Close Panel ✖"})]})]}),(0,a.jsx)(l,{sessionId:u,wsPort:N})]}),(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:n.default.sectionTitle,children:"Shared Context Hub & Slash Commands"}),(0,a.jsxs)("div",{className:n.default.contextList,children:[(0,a.jsxs)("div",{className:`${n.default.contextItem} card`,children:[(0,a.jsxs)("div",{className:n.default.contextMeta,children:[(0,a.jsx)("span",{className:n.default.contextTitle,children:"Staged Context & System Rules (/ccc)"}),(0,a.jsx)("span",{className:n.default.contextDetails,children:"Compiles AGENTS.md guidelines and project files folder hierarchy map."})]}),(0,a.jsx)("button",{onClick:async()=>{u&&await fetch("/api/sessions/inject",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:u,command:"/ccc"})})},disabled:!u,style:{padding:"0.4rem 0.8rem",borderRadius:"6px",border:"1px solid var(--primary)",backgroundColor:"transparent",color:"var(--primary)",fontSize:"0.75rem",fontWeight:600,opacity:u?1:.5,cursor:u?"pointer":"not-allowed"},children:"🚀 Mount Context (/ccc)"})]}),(0,a.jsxs)("div",{className:`${n.default.contextItem} card`,children:[(0,a.jsxs)("div",{className:n.default.contextMeta,children:[(0,a.jsx)("span",{className:n.default.contextTitle,children:"Staged Developer Prompt (/ccp)"}),(0,a.jsx)("span",{className:n.default.contextDetails,children:"Executes instructions written in .ai/neural-loom/cprompt.md."})]}),(0,a.jsx)("button",{onClick:async()=>{u&&await fetch("/api/sessions/inject",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:u,command:"/ccp"})})},disabled:!u,style:{padding:"0.4rem 0.8rem",borderRadius:"6px",border:"1px solid var(--success)",backgroundColor:"transparent",color:"var(--success)",fontSize:"0.75rem",fontWeight:600,opacity:u?1:.5,cursor:u?"pointer":"not-allowed"},children:"⚡ Trigger Prompt (/ccp)"})]})]}),(0,a.jsx)(r,{})]})]}),(0,a.jsxs)("aside",{className:n.default.sidePanel,children:[(0,a.jsxs)("section",{children:[(0,a.jsx)("h2",{className:n.default.sectionTitle,children:"Execution Environments"}),(0,a.jsxs)("div",{className:n.default.envGrid,children:[(0,a.jsxs)("div",{className:n.default.envRow,children:[(0,a.jsx)("span",{className:n.default.envName,children:"💻 Local host OS"}),(0,a.jsx)("span",{className:n.default.envStatus,style:{color:"var(--success)"},children:"Active"})]}),(0,a.jsxs)("div",{className:n.default.envRow,style:{opacity:W?1:.6},children:[(0,a.jsx)("span",{className:n.default.envName,children:"🐳 Docker Sandbox"}),(0,a.jsx)("span",{className:n.default.envStatus,style:{color:W?"var(--success)":"var(--muted)"},children:W?"Active":"Not Mounted"})]}),(0,a.jsxs)("div",{className:n.default.envRow,style:{opacity:T?1:.6},children:[(0,a.jsx)("span",{className:n.default.envName,children:"🌐 Remote VM (SSH)"}),(0,a.jsx)("span",{className:n.default.envStatus,style:{color:T?"var(--success)":"var(--muted)"},children:T?"Active":"Disconnected"})]})]})]}),(0,a.jsxs)("section",{style:{display:"flex",flexDirection:"column",gap:"0.75rem"},children:[(0,a.jsxs)("button",{className:n.default.quickLaunchBtn,onClick:()=>R("mock"),disabled:m,children:[(0,a.jsx)("span",{children:"⚡"}),(0,a.jsx)("span",{children:"Launch Mock Agent"})]}),(0,a.jsxs)("button",{className:n.default.quickLaunchBtn,onClick:()=>{k(!1),v(!0)},disabled:m,style:{background:"linear-gradient(135deg, hsl(262, 83%, 60%) 0%, hsl(195, 100%, 45%) 100%)",border:"none"},children:[(0,a.jsx)("span",{children:"🤖"}),(0,a.jsx)("span",{children:"Launch Claude PTY"})]}),(0,a.jsxs)("button",{className:n.default.quickLaunchBtn,onClick:()=>{k(!0),v(!0)},disabled:m,style:{background:"linear-gradient(135deg, hsl(170, 72%, 40%) 0%, hsl(195, 100%, 40%) 100%)",border:"none"},children:[(0,a.jsx)("span",{children:"🐳"}),(0,a.jsx)("span",{children:"Launch Docker PTY"})]}),(0,a.jsxs)("button",{className:n.default.quickLaunchBtn,onClick:()=>f(!0),disabled:m,style:{background:"linear-gradient(135deg, hsl(38, 92%, 50%) 0%, hsl(0, 84%, 60%) 100%)",border:"none"},children:[(0,a.jsx)("span",{children:"🌐"}),(0,a.jsx)("span",{children:"Launch SSH PTY"})]}),(0,a.jsxs)("button",{className:n.default.quickLaunchBtn,onClick:()=>{y(!1),g(!0)},disabled:m,style:{background:"linear-gradient(135deg, hsl(210, 80%, 45%) 0%, hsl(262, 80%, 55%) 100%)",border:"none"},children:[(0,a.jsx)("span",{children:"🐍"}),(0,a.jsx)("span",{children:"Launch Aider PTY"})]}),(0,a.jsxs)("button",{className:n.default.quickLaunchBtn,onClick:()=>{y(!0),g(!0)},disabled:m,style:{background:"linear-gradient(135deg, hsl(195, 100%, 40%) 0%, hsl(262, 80%, 55%) 100%)",border:"none"},children:[(0,a.jsx)("span",{children:"🐳"}),(0,a.jsx)("span",{children:"Launch Aider Docker"})]})]}),(0,a.jsxs)("section",{className:"card",style:{padding:"1.5rem",display:"flex",flexDirection:"column",gap:"0.75rem"},children:[(0,a.jsx)("h3",{style:{fontSize:"1rem",fontWeight:700},children:"Quick Actions"}),(0,a.jsxs)("ul",{style:{listStyle:"none",fontSize:"0.875rem",display:"flex",flexDirection:"column",gap:"0.5rem",color:"var(--muted)"},children:[(0,a.jsxs)("li",{style:{display:"flex",justifyContent:"space-between"},children:[(0,a.jsx)("span",{children:"Configure global API Keys"}),(0,a.jsx)("span",{style:{color:"var(--primary)",cursor:"pointer"},children:"→"})]}),(0,a.jsxs)("li",{style:{display:"flex",justifyContent:"space-between"},children:[(0,a.jsx)("span",{children:"Edit rules templates"}),(0,a.jsx)("span",{style:{color:"var(--primary)",cursor:"pointer"},children:"→"})]}),(0,a.jsxs)("li",{style:{display:"flex",justifyContent:"space-between"},children:[(0,a.jsx)("span",{children:"Inspect process locks"}),(0,a.jsx)("span",{style:{color:"var(--primary)",cursor:"pointer"},children:"→"})]})]})]})]})]}),(0,a.jsxs)("footer",{className:n.default.footer,children:[(0,a.jsx)("span",{children:"NeuralLoom v0.2.13 — Experimental AI Orchestrator Bridge"}),(0,a.jsxs)("span",{children:["Directory: ",C||"Loading..."]})]}),_&&(0,a.jsx)(o,{onClose:()=>f(!1),onConfirmLaunch:()=>{f(!1),R("claude-ssh")}}),x&&(0,a.jsx)(i,{onClose:()=>g(!1),isDocker:j,onConfirmLaunch:()=>{g(!1),R(j?"aider-docker":"aider")}}),b&&(0,a.jsx)(d,{onClose:()=>v(!1),isDocker:w,onConfirmLaunch:(e,a,s)=>{v(!1),R(w?"claude-docker":"claude",e,a,s)}})]})}])},33779,e=>{e.v(a=>Promise.all(["static/chunks/03g6xpslyid3~.js","static/chunks/0x__nd4avi0fg.js","static/chunks/0ga14ztvrhau2.css"].map(a=>e.l(a))).then(()=>a(37314)))},39429,e=>{e.v(a=>Promise.all(["static/chunks/16w4~t4h7gk13.js"].map(a=>e.l(a))).then(()=>a(1985)))},56915,e=>{e.v(a=>Promise.all(["static/chunks/0lnobx4eh3~-_.js"].map(a=>e.l(a))).then(()=>a(99026)))},78716,e=>{e.v(a=>Promise.all(["static/chunks/0jxar8nsw_py3.js"].map(a=>e.l(a))).then(()=>a(9949)))},33789,e=>{e.v(a=>Promise.all(["static/chunks/0b89ti7ob.09t.js"].map(a=>e.l(a))).then(()=>a(20032)))},78003,e=>{e.v(a=>Promise.all(["static/chunks/0eidfx-s54367.js","static/chunks/0x__nd4avi0fg.js","static/chunks/0ek0280331wie.js","static/chunks/0ga14ztvrhau2.css"].map(a=>e.l(a))).then(()=>a(97722)))}]);