prime-dev-cli 1.0.14 → 1.0.16

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 (159) hide show
  1. package/dist/server/.next/BUILD_ID +1 -1
  2. package/dist/server/.next/app-path-routes-manifest.json +1 -0
  3. package/dist/server/.next/build-manifest.json +6 -6
  4. package/dist/server/.next/cache/.rscinfo +1 -1
  5. package/dist/server/.next/cache/.tsbuildinfo +1 -1
  6. package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
  7. package/dist/server/.next/fallback-build-manifest.json +6 -6
  8. package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
  9. package/dist/server/.next/next-server.js.nft.json +1 -1
  10. package/dist/server/.next/prerender-manifest.json +9 -9
  11. package/dist/server/.next/server/app/_not-found/page.js +2 -1
  12. package/dist/server/.next/server/app/_not-found/page.js.nft.json +1 -1
  13. package/dist/server/.next/server/app/_not-found.html +1 -1
  14. package/dist/server/.next/server/app/_not-found.rsc +2 -2
  15. package/dist/server/.next/server/app/api/all-projects-envs/route.js +1 -1
  16. package/dist/server/.next/server/app/api/all-projects-envs/route.js.nft.json +1 -1
  17. package/dist/server/.next/server/app/api/check-mock-intercept/route.js +1 -1
  18. package/dist/server/.next/server/app/api/check-mock-intercept/route.js.nft.json +1 -1
  19. package/dist/server/.next/server/app/api/check-workspace/route.js +1 -1
  20. package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
  21. package/dist/server/.next/server/app/api/cleanup-mock/route.js +1 -1
  22. package/dist/server/.next/server/app/api/cleanup-mock/route.js.nft.json +1 -1
  23. package/dist/server/.next/server/app/api/delete-mock-api/route.js +1 -1
  24. package/dist/server/.next/server/app/api/delete-mock-api/route.js.nft.json +1 -1
  25. package/dist/server/.next/server/app/api/get-mock-data/route.js +1 -1
  26. package/dist/server/.next/server/app/api/get-mock-data/route.js.nft.json +1 -1
  27. package/dist/server/.next/server/app/api/initialize-workspace/route.js +1 -1
  28. package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
  29. package/dist/server/.next/server/app/api/memory-status/route/app-build-manifest.json +11 -0
  30. package/dist/server/.next/server/app/api/memory-status/route/app-paths-manifest.json +3 -0
  31. package/dist/server/.next/server/app/api/memory-status/route/build-manifest.json +17 -0
  32. package/dist/server/.next/server/app/api/memory-status/route/next-font-manifest.json +6 -0
  33. package/dist/server/.next/server/app/api/memory-status/route/react-loadable-manifest.json +1 -0
  34. package/dist/server/.next/server/app/api/memory-status/route/server-reference-manifest.json +4 -0
  35. package/dist/server/.next/server/app/api/memory-status/route.js +8 -0
  36. package/dist/server/.next/server/app/api/memory-status/route.js.map +5 -0
  37. package/dist/server/.next/server/app/api/memory-status/route.js.nft.json +1 -0
  38. package/dist/server/.next/server/app/api/memory-status/route_client-reference-manifest.js +2 -0
  39. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js +1 -1
  40. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js.nft.json +1 -1
  41. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js +1 -1
  42. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
  43. package/dist/server/.next/server/app/api/mock-file/route.js +1 -1
  44. package/dist/server/.next/server/app/api/mock-file/route.js.nft.json +1 -1
  45. package/dist/server/.next/server/app/api/mock-file-content/route.js +1 -1
  46. package/dist/server/.next/server/app/api/mock-file-content/route.js.nft.json +1 -1
  47. package/dist/server/.next/server/app/api/mock-open-status/route.js +1 -1
  48. package/dist/server/.next/server/app/api/mock-open-status/route.js.nft.json +1 -1
  49. package/dist/server/.next/server/app/api/mock-setting/route.js +1 -1
  50. package/dist/server/.next/server/app/api/mock-setting/route.js.nft.json +1 -1
  51. package/dist/server/.next/server/app/api/open-all-mock/route.js +1 -1
  52. package/dist/server/.next/server/app/api/open-all-mock/route.js.nft.json +1 -1
  53. package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
  54. package/dist/server/.next/server/app/api/process/logs/route.js +1 -1
  55. package/dist/server/.next/server/app/api/process/logs/route.js.nft.json +1 -1
  56. package/dist/server/.next/server/app/api/process/logs/stream/route.js +1 -1
  57. package/dist/server/.next/server/app/api/process/logs/stream/route.js.nft.json +1 -1
  58. package/dist/server/.next/server/app/api/process/start/route.js +1 -1
  59. package/dist/server/.next/server/app/api/process/start/route.js.nft.json +1 -1
  60. package/dist/server/.next/server/app/api/process/status/route.js +1 -1
  61. package/dist/server/.next/server/app/api/process/status/route.js.nft.json +1 -1
  62. package/dist/server/.next/server/app/api/project-config/route.js +1 -1
  63. package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
  64. package/dist/server/.next/server/app/api/retry-project/route.js +1 -1
  65. package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
  66. package/dist/server/.next/server/app/api/workspace/create/route.js +1 -1
  67. package/dist/server/.next/server/app/api/workspace/create/route.js.nft.json +1 -1
  68. package/dist/server/.next/server/app/configuration/page.js +2 -1
  69. package/dist/server/.next/server/app/configuration/page.js.nft.json +1 -1
  70. package/dist/server/.next/server/app/configuration.html +1 -1
  71. package/dist/server/.next/server/app/configuration.rsc +2 -2
  72. package/dist/server/.next/server/app/index.html +1 -1
  73. package/dist/server/.next/server/app/index.rsc +2 -2
  74. package/dist/server/.next/server/app/initialization/page.js +2 -1
  75. package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
  76. package/dist/server/.next/server/app/initialization.html +1 -1
  77. package/dist/server/.next/server/app/initialization.rsc +2 -2
  78. package/dist/server/.next/server/app/page.js +2 -1
  79. package/dist/server/.next/server/app/page.js.nft.json +1 -1
  80. package/dist/server/.next/server/app-paths-manifest.json +1 -0
  81. package/dist/server/.next/server/chunks/{[root-of-the-server]__7c3ad3a9._.js → [root-of-the-server]__03c2b225._.js} +2 -2
  82. package/dist/server/.next/server/chunks/{[root-of-the-server]__7c3ad3a9._.js.map → [root-of-the-server]__03c2b225._.js.map} +1 -1
  83. package/dist/server/.next/server/chunks/{[root-of-the-server]__e54d7eff._.js → [root-of-the-server]__072f5c45._.js} +2 -2
  84. package/dist/server/.next/server/chunks/{[root-of-the-server]__e54d7eff._.js.map → [root-of-the-server]__072f5c45._.js.map} +1 -1
  85. package/dist/server/.next/server/chunks/{[root-of-the-server]__9370ea2b._.js → [root-of-the-server]__2ba93285._.js} +2 -2
  86. package/dist/server/.next/server/chunks/{[root-of-the-server]__9370ea2b._.js.map → [root-of-the-server]__2ba93285._.js.map} +1 -1
  87. package/dist/server/.next/server/chunks/[root-of-the-server]__2fcc7175._.js +5 -0
  88. package/dist/server/.next/server/chunks/[root-of-the-server]__2fcc7175._.js.map +1 -0
  89. package/dist/server/.next/server/chunks/{[root-of-the-server]__6f66caff._.js → [root-of-the-server]__31a13318._.js} +2 -2
  90. package/dist/server/.next/server/chunks/{[root-of-the-server]__6f66caff._.js.map → [root-of-the-server]__31a13318._.js.map} +1 -1
  91. package/dist/server/.next/server/chunks/[root-of-the-server]__388e6150._.js +5 -0
  92. package/dist/server/.next/server/chunks/[root-of-the-server]__388e6150._.js.map +1 -0
  93. package/dist/server/.next/server/chunks/{[root-of-the-server]__4498bb74._.js → [root-of-the-server]__3dfc0dc4._.js} +2 -2
  94. package/dist/server/.next/server/chunks/{[root-of-the-server]__4498bb74._.js.map → [root-of-the-server]__3dfc0dc4._.js.map} +1 -1
  95. package/dist/server/.next/server/chunks/{[root-of-the-server]__0aaf11fd._.js → [root-of-the-server]__419d3b16._.js} +2 -2
  96. package/dist/server/.next/server/chunks/{[root-of-the-server]__0aaf11fd._.js.map → [root-of-the-server]__419d3b16._.js.map} +1 -1
  97. package/dist/server/.next/server/chunks/{[root-of-the-server]__442ae257._.js → [root-of-the-server]__5100a0c5._.js} +2 -2
  98. package/dist/server/.next/server/chunks/{[root-of-the-server]__442ae257._.js.map → [root-of-the-server]__5100a0c5._.js.map} +1 -1
  99. package/dist/server/.next/server/chunks/{[root-of-the-server]__aba5bddd._.js → [root-of-the-server]__5348b4aa._.js} +2 -2
  100. package/dist/server/.next/server/chunks/{[root-of-the-server]__aba5bddd._.js.map → [root-of-the-server]__5348b4aa._.js.map} +1 -1
  101. package/dist/server/.next/server/chunks/{[root-of-the-server]__70a56518._.js → [root-of-the-server]__5355b75a._.js} +2 -2
  102. package/dist/server/.next/server/chunks/{[root-of-the-server]__70a56518._.js.map → [root-of-the-server]__5355b75a._.js.map} +1 -1
  103. package/dist/server/.next/server/chunks/[root-of-the-server]__629e6d6a._.js +3 -0
  104. package/dist/server/.next/server/chunks/[root-of-the-server]__629e6d6a._.js.map +1 -0
  105. package/dist/server/.next/server/chunks/{[root-of-the-server]__c8cd1231._.js → [root-of-the-server]__6e5dc117._.js} +2 -2
  106. package/dist/server/.next/server/chunks/[root-of-the-server]__6e5dc117._.js.map +1 -0
  107. package/dist/server/.next/server/chunks/{[root-of-the-server]__07bd4a2b._.js → [root-of-the-server]__7500acb0._.js} +2 -2
  108. package/dist/server/.next/server/chunks/{[root-of-the-server]__07bd4a2b._.js.map → [root-of-the-server]__7500acb0._.js.map} +1 -1
  109. package/dist/server/.next/server/chunks/{[root-of-the-server]__6f17de68._.js → [root-of-the-server]__771e8133._.js} +2 -2
  110. package/dist/server/.next/server/chunks/{[root-of-the-server]__6f17de68._.js.map → [root-of-the-server]__771e8133._.js.map} +1 -1
  111. package/dist/server/.next/server/chunks/{[root-of-the-server]__c15317cb._.js → [root-of-the-server]__7fc974c9._.js} +2 -2
  112. package/dist/server/.next/server/chunks/{[root-of-the-server]__c15317cb._.js.map → [root-of-the-server]__7fc974c9._.js.map} +1 -1
  113. package/dist/server/.next/server/chunks/{[root-of-the-server]__9f32f8a7._.js → [root-of-the-server]__899d82eb._.js} +2 -2
  114. package/dist/server/.next/server/chunks/{[root-of-the-server]__9f32f8a7._.js.map → [root-of-the-server]__899d82eb._.js.map} +1 -1
  115. package/dist/server/.next/server/chunks/[root-of-the-server]__8fcbb2f0._.js +3 -0
  116. package/dist/server/.next/server/chunks/[root-of-the-server]__8fcbb2f0._.js.map +1 -0
  117. package/dist/server/.next/server/chunks/{[root-of-the-server]__6cc174c2._.js → [root-of-the-server]__973c48a6._.js} +2 -2
  118. package/dist/server/.next/server/chunks/{[root-of-the-server]__6cc174c2._.js.map → [root-of-the-server]__973c48a6._.js.map} +1 -1
  119. package/dist/server/.next/server/chunks/[root-of-the-server]__a292866b._.js +15 -0
  120. package/dist/server/.next/server/chunks/[root-of-the-server]__a292866b._.js.map +1 -0
  121. package/dist/server/.next/server/chunks/[root-of-the-server]__c8b26634._.js +3 -0
  122. package/dist/server/.next/server/chunks/[root-of-the-server]__c8b26634._.js.map +1 -0
  123. package/dist/server/.next/server/chunks/{[root-of-the-server]__f76d331f._.js → [root-of-the-server]__f815ea40._.js} +2 -2
  124. package/dist/server/.next/server/chunks/{[root-of-the-server]__f76d331f._.js.map → [root-of-the-server]__f815ea40._.js.map} +1 -1
  125. package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__828c7089._.js +3 -0
  126. package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__828c7089._.js.map +1 -0
  127. package/dist/server/.next/server/chunks/ssr/packages_server_src_eb289b89._.js +5 -0
  128. package/dist/server/.next/server/chunks/ssr/packages_server_src_eb289b89._.js.map +1 -0
  129. package/dist/server/.next/server/middleware-build-manifest.js +4 -4
  130. package/dist/server/.next/server/pages/404.html +1 -1
  131. package/dist/server/.next/server/pages/500.html +1 -1
  132. package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
  133. package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
  134. package/dist/server/.next/server/server-reference-manifest.js +1 -1
  135. package/dist/server/.next/server/server-reference-manifest.json +1 -1
  136. package/dist/server/.next/static/chunks/{0089092a8fff7e00.js → 294d677a4838a994.js} +2 -2
  137. package/dist/server/.next/static/chunks/{fc5c3c838ec48e75.js.map → 479d60165927b286.js.map} +1 -1
  138. package/dist/server/.next/static/chunks/{0d1500d118ef892c.js → d65b8ba84ba3d819.js} +2 -2
  139. package/dist/server/.next/static/chunks/{bf41727b544d17b4.js → f9ef1d12f3c1646a.js} +2 -2
  140. package/dist/server/.next/static/chunks/pages/_app.js +2 -2
  141. package/dist/server/.next/static/chunks/pages/_error.js +2 -2
  142. package/dist/server/.next/trace +1 -1
  143. package/package.json +1 -1
  144. package/dist/server/.next/server/chunks/[root-of-the-server]__616d1a09._.js +0 -3
  145. package/dist/server/.next/server/chunks/[root-of-the-server]__616d1a09._.js.map +0 -1
  146. package/dist/server/.next/server/chunks/[root-of-the-server]__66ca8d3f._.js +0 -11
  147. package/dist/server/.next/server/chunks/[root-of-the-server]__66ca8d3f._.js.map +0 -1
  148. package/dist/server/.next/server/chunks/[root-of-the-server]__b310ec65._.js +0 -3
  149. package/dist/server/.next/server/chunks/[root-of-the-server]__b310ec65._.js.map +0 -1
  150. package/dist/server/.next/server/chunks/[root-of-the-server]__c8cd1231._.js.map +0 -1
  151. package/dist/server/.next/server/chunks/[root-of-the-server]__e68f3764._.js +0 -3
  152. package/dist/server/.next/server/chunks/[root-of-the-server]__e68f3764._.js.map +0 -1
  153. package/dist/server/.next/server/chunks/[root-of-the-server]__fefd40ba._.js +0 -5
  154. package/dist/server/.next/server/chunks/[root-of-the-server]__fefd40ba._.js.map +0 -1
  155. package/dist/server/.next/server/chunks/ssr/packages_server_src_app_layout_tsx_0712e1b4._.js +0 -3
  156. package/dist/server/.next/server/chunks/ssr/packages_server_src_app_layout_tsx_0712e1b4._.js.map +0 -1
  157. /package/dist/server/.next/static/{e1tjd_meooMxESv5gSLAU → bC3bTGQyq6cbRR_M7T8N6}/_buildManifest.js +0 -0
  158. /package/dist/server/.next/static/{e1tjd_meooMxESv5gSLAU → bC3bTGQyq6cbRR_M7T8N6}/_clientMiddlewareManifest.json +0 -0
  159. /package/dist/server/.next/static/{e1tjd_meooMxESv5gSLAU → bC3bTGQyq6cbRR_M7T8N6}/_ssgManifest.js +0 -0
@@ -1,5 +1,5 @@
1
1
  __turbopack_load_page_chunks__("/_app", [
2
2
  "static/chunks/7d7379cdf8fe9ec5.js",
3
- "static/chunks/bf41727b544d17b4.js",
4
- "static/chunks/0089092a8fff7e00.js"
3
+ "static/chunks/f9ef1d12f3c1646a.js",
4
+ "static/chunks/d65b8ba84ba3d819.js"
5
5
  ])
@@ -1,5 +1,5 @@
1
1
  __turbopack_load_page_chunks__("/_error", [
2
2
  "static/chunks/cf6e515377591a1f.js",
3
- "static/chunks/bf41727b544d17b4.js",
4
- "static/chunks/0d1500d118ef892c.js"
3
+ "static/chunks/f9ef1d12f3c1646a.js",
4
+ "static/chunks/294d677a4838a994.js"
5
5
  ])
@@ -1 +1 @@
1
- [{"name":"generate-buildid","duration":140,"timestamp":275247639046,"id":4,"parentId":1,"tags":{},"startTime":1762408282358,"traceId":"cbf742c0d8dfb185"},{"name":"load-custom-routes","duration":1077,"timestamp":275247639234,"id":5,"parentId":1,"tags":{},"startTime":1762408282358,"traceId":"cbf742c0d8dfb185"},{"name":"create-dist-dir","duration":161,"timestamp":275247674270,"id":6,"parentId":1,"tags":{},"startTime":1762408282393,"traceId":"cbf742c0d8dfb185"},{"name":"create-pages-mapping","duration":110,"timestamp":275247675653,"id":7,"parentId":1,"tags":{},"startTime":1762408282394,"traceId":"cbf742c0d8dfb185"},{"name":"collect-app-paths","duration":1961,"timestamp":275247675781,"id":8,"parentId":1,"tags":{},"startTime":1762408282394,"traceId":"cbf742c0d8dfb185"},{"name":"create-app-mapping","duration":30417,"timestamp":275247677762,"id":9,"parentId":1,"tags":{},"startTime":1762408282396,"traceId":"cbf742c0d8dfb185"},{"name":"public-dir-conflict-check","duration":303,"timestamp":275247708547,"id":10,"parentId":1,"tags":{},"startTime":1762408282427,"traceId":"cbf742c0d8dfb185"},{"name":"generate-routes-manifest","duration":1222,"timestamp":275247708966,"id":11,"parentId":1,"tags":{},"startTime":1762408282428,"traceId":"cbf742c0d8dfb185"},{"name":"verify-and-lint","duration":1981920,"timestamp":275250591516,"id":15,"parentId":1,"tags":{},"startTime":1762408285310,"traceId":"cbf742c0d8dfb185"},{"name":"verify-typescript-setup","duration":2371168,"timestamp":275250586128,"id":14,"parentId":1,"tags":{},"startTime":1762408285305,"traceId":"cbf742c0d8dfb185"},{"name":"check-static-error-page","duration":1939,"timestamp":275252965902,"id":18,"parentId":17,"tags":{},"startTime":1762408287685,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":2163,"timestamp":275252979170,"id":19,"parentId":17,"tags":{"page":"/_app"},"startTime":1762408287698,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":1675,"timestamp":275252979669,"id":21,"parentId":17,"tags":{"page":"/_document"},"startTime":1762408287698,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":1762,"timestamp":275252979613,"id":20,"parentId":17,"tags":{"page":"/_error"},"startTime":1762408287698,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":314362,"timestamp":275252982986,"id":54,"parentId":27,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":317532,"timestamp":275252979873,"id":27,"parentId":17,"tags":{"page":"/api/cleanup-project"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":327484,"timestamp":275252982748,"id":51,"parentId":23,"tags":{},"startTime":1762408287701,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":330514,"timestamp":275252979746,"id":23,"parentId":17,"tags":{"page":"/api/all-projects-envs"},"startTime":1762408287698,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":329289,"timestamp":275252982938,"id":53,"parentId":26,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":332382,"timestamp":275252979863,"id":26,"parentId":17,"tags":{"page":"/api/cleanup-mock"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":334654,"timestamp":275252983241,"id":59,"parentId":31,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":338018,"timestamp":275252979913,"id":31,"parentId":17,"tags":{"page":"/api/initialize-workspace"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":336069,"timestamp":275252983184,"id":57,"parentId":30,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":339395,"timestamp":275252979906,"id":30,"parentId":17,"tags":{"page":"/api/get-mock-data"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":338985,"timestamp":275252983351,"id":60,"parentId":32,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":342439,"timestamp":275252979921,"id":32,"parentId":17,"tags":{"page":"/api/microapp-proxy-change-stream"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":339073,"timestamp":275252983400,"id":62,"parentId":37,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":342400,"timestamp":275252980082,"id":37,"parentId":17,"tags":{"page":"/api/mock-setting"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":340369,"timestamp":275252982893,"id":52,"parentId":24,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":343519,"timestamp":275252979762,"id":24,"parentId":17,"tags":{"page":"/api/check-mock-intercept"},"startTime":1762408287698,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":341193,"timestamp":275252983434,"id":64,"parentId":39,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":344555,"timestamp":275252980098,"id":39,"parentId":17,"tags":{"page":"/api/open-project"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":343086,"timestamp":275252983456,"id":66,"parentId":36,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":346498,"timestamp":275252980063,"id":36,"parentId":17,"tags":{"page":"/api/mock-open-status"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":343209,"timestamp":275252983383,"id":61,"parentId":33,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":346670,"timestamp":275252979929,"id":33,"parentId":17,"tags":{"page":"/api/microapp-proxy-config"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":344667,"timestamp":275252983465,"id":67,"parentId":40,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":348273,"timestamp":275252980104,"id":40,"parentId":17,"tags":{"page":"/api/process/logs"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":345134,"timestamp":275252983445,"id":65,"parentId":38,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":348504,"timestamp":275252980090,"id":38,"parentId":17,"tags":{"page":"/api/open-all-mock"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":346837,"timestamp":275252983495,"id":69,"parentId":42,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":350239,"timestamp":275252980117,"id":42,"parentId":17,"tags":{"page":"/api/process/start"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":347254,"timestamp":275252983154,"id":56,"parentId":28,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":350533,"timestamp":275252979886,"id":28,"parentId":17,"tags":{"page":"/api/current-branch"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":348235,"timestamp":275252983032,"id":55,"parentId":25,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":351461,"timestamp":275252979849,"id":25,"parentId":17,"tags":{"page":"/api/check-workspace"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":348570,"timestamp":275252983626,"id":71,"parentId":44,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":352092,"timestamp":275252980129,"id":44,"parentId":17,"tags":{"page":"/api/project-config"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":350814,"timestamp":275252983655,"id":74,"parentId":34,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":354548,"timestamp":275252979943,"id":34,"parentId":17,"tags":{"page":"/api/mock-file-content"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":350932,"timestamp":275252983647,"id":73,"parentId":46,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":354446,"timestamp":275252980142,"id":46,"parentId":17,"tags":{"page":"/api/workspace/create"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":352191,"timestamp":275252983601,"id":70,"parentId":43,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":355678,"timestamp":275252980122,"id":43,"parentId":17,"tags":{"page":"/api/process/status"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":355249,"timestamp":275252983475,"id":68,"parentId":41,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":358636,"timestamp":275252980110,"id":41,"parentId":17,"tags":{"page":"/api/process/logs/stream"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":357309,"timestamp":275252983638,"id":72,"parentId":45,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":360830,"timestamp":275252980137,"id":45,"parentId":17,"tags":{"page":"/api/retry-project"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":360759,"timestamp":275252983421,"id":63,"parentId":35,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":364251,"timestamp":275252979951,"id":35,"parentId":17,"tags":{"page":"/api/mock-file"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":365565,"timestamp":275252983813,"id":76,"parentId":50,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":369217,"timestamp":275252980186,"id":50,"parentId":17,"tags":{"page":"/favicon.ico"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":365632,"timestamp":275252983803,"id":75,"parentId":22,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":369760,"timestamp":275252979681,"id":22,"parentId":17,"tags":{"page":"/_not-found"},"startTime":1762408287698,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":368802,"timestamp":275252986490,"id":78,"parentId":48,"tags":{},"startTime":1762408287705,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":375139,"timestamp":275252980167,"id":48,"parentId":17,"tags":{"page":"/initialization"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":369435,"timestamp":275252986494,"id":79,"parentId":47,"tags":{},"startTime":1762408287705,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":375787,"timestamp":275252980149,"id":47,"parentId":17,"tags":{"page":"/configuration"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":370078,"timestamp":275252986478,"id":77,"parentId":49,"tags":{},"startTime":1762408287705,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":376397,"timestamp":275252980177,"id":49,"parentId":17,"tags":{"page":"/"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"is-page-static","duration":373723,"timestamp":275252983205,"id":58,"parentId":29,"tags":{},"startTime":1762408287702,"traceId":"cbf742c0d8dfb185"},{"name":"check-page","duration":377041,"timestamp":275252979898,"id":29,"parentId":17,"tags":{"page":"/api/delete-mock-api"},"startTime":1762408287699,"traceId":"cbf742c0d8dfb185"},{"name":"static-check","duration":391372,"timestamp":275252965605,"id":17,"parentId":1,"tags":{},"startTime":1762408287684,"traceId":"cbf742c0d8dfb185"},{"name":"generate-required-server-files","duration":234,"timestamp":275253357188,"id":81,"parentId":1,"tags":{},"startTime":1762408288076,"traceId":"cbf742c0d8dfb185"},{"name":"write-routes-manifest","duration":1025,"timestamp":275253363380,"id":83,"parentId":1,"tags":{},"startTime":1762408288082,"traceId":"cbf742c0d8dfb185"},{"name":"load-dotenv","duration":11,"timestamp":275253376582,"id":86,"parentId":85,"tags":{},"startTime":1762408288095,"traceId":"cbf742c0d8dfb185"},{"name":"run-export-path-map","duration":246,"timestamp":275253485142,"id":87,"parentId":85,"tags":{},"startTime":1762408288204,"traceId":"cbf742c0d8dfb185"},{"name":"next-export","duration":507211,"timestamp":275253376102,"id":85,"parentId":1,"tags":{},"startTime":1762408288095,"traceId":"cbf742c0d8dfb185"},{"name":"move-exported-app-not-found-","duration":4102,"timestamp":275253884569,"id":88,"parentId":84,"tags":{},"startTime":1762408288603,"traceId":"cbf742c0d8dfb185"},{"name":"move-exported-page","duration":8672,"timestamp":275253888776,"id":89,"parentId":84,"tags":{},"startTime":1762408288607,"traceId":"cbf742c0d8dfb185"},{"name":"static-generation","duration":565664,"timestamp":275253372454,"id":84,"parentId":1,"tags":{},"startTime":1762408288091,"traceId":"cbf742c0d8dfb185"},{"name":"write-routes-manifest","duration":6379,"timestamp":275253938135,"id":90,"parentId":1,"tags":{},"startTime":1762408288657,"traceId":"cbf742c0d8dfb185"},{"name":"node-file-trace-build","duration":4106586,"timestamp":275253359346,"id":82,"parentId":1,"tags":{"isTurbotrace":"false"},"startTime":1762408288078,"traceId":"cbf742c0d8dfb185"},{"name":"apply-include-excludes","duration":234,"timestamp":275257465951,"id":91,"parentId":1,"tags":{},"startTime":1762408292185,"traceId":"cbf742c0d8dfb185"},{"name":"print-tree-view","duration":2349,"timestamp":275257466582,"id":92,"parentId":1,"tags":{},"startTime":1762408292185,"traceId":"cbf742c0d8dfb185"},{"name":"telemetry-flush","duration":25,"timestamp":275257468941,"id":93,"parentId":1,"tags":{},"startTime":1762408292188,"traceId":"cbf742c0d8dfb185"},{"name":"next-build","duration":9971801,"timestamp":275247497168,"id":1,"tags":{"buildMode":"default","isTurboBuild":"true","version":"15.3.4","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1762408282216,"traceId":"cbf742c0d8dfb185"}]
1
+ [{"name":"generate-buildid","duration":122,"timestamp":86774619618,"id":4,"parentId":1,"tags":{},"startTime":1763098101927,"traceId":"b3e487e9a1e261ab"},{"name":"load-custom-routes","duration":934,"timestamp":86774619788,"id":5,"parentId":1,"tags":{},"startTime":1763098101927,"traceId":"b3e487e9a1e261ab"},{"name":"create-dist-dir","duration":133,"timestamp":86774657021,"id":6,"parentId":1,"tags":{},"startTime":1763098101965,"traceId":"b3e487e9a1e261ab"},{"name":"create-pages-mapping","duration":104,"timestamp":86774658473,"id":7,"parentId":1,"tags":{},"startTime":1763098101966,"traceId":"b3e487e9a1e261ab"},{"name":"collect-app-paths","duration":30029,"timestamp":86774658601,"id":8,"parentId":1,"tags":{},"startTime":1763098101966,"traceId":"b3e487e9a1e261ab"},{"name":"create-app-mapping","duration":1842,"timestamp":86774688658,"id":9,"parentId":1,"tags":{},"startTime":1763098101996,"traceId":"b3e487e9a1e261ab"},{"name":"public-dir-conflict-check","duration":321,"timestamp":86774690797,"id":10,"parentId":1,"tags":{},"startTime":1763098101998,"traceId":"b3e487e9a1e261ab"},{"name":"generate-routes-manifest","duration":1347,"timestamp":86774691233,"id":11,"parentId":1,"tags":{},"startTime":1763098101999,"traceId":"b3e487e9a1e261ab"},{"name":"verify-and-lint","duration":3154692,"timestamp":86777831825,"id":15,"parentId":1,"tags":{},"startTime":1763098105139,"traceId":"b3e487e9a1e261ab"},{"name":"verify-typescript-setup","duration":3345141,"timestamp":86777830215,"id":14,"parentId":1,"tags":{},"startTime":1763098105138,"traceId":"b3e487e9a1e261ab"},{"name":"check-static-error-page","duration":1860,"timestamp":86781187061,"id":18,"parentId":17,"tags":{},"startTime":1763098108495,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":2421,"timestamp":86781269836,"id":19,"parentId":17,"tags":{"page":"/_app"},"startTime":1763098108577,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":1842,"timestamp":86781270426,"id":21,"parentId":17,"tags":{"page":"/_document"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":1946,"timestamp":86781270355,"id":20,"parentId":17,"tags":{"page":"/_error"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":257819,"timestamp":86781274817,"id":55,"parentId":25,"tags":{},"startTime":1763098108582,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":262070,"timestamp":86781270640,"id":25,"parentId":17,"tags":{"page":"/api/check-workspace"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":274199,"timestamp":86781274763,"id":54,"parentId":26,"tags":{},"startTime":1763098108582,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":278346,"timestamp":86781270654,"id":26,"parentId":17,"tags":{"page":"/api/cleanup-mock"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":275835,"timestamp":86781274536,"id":52,"parentId":24,"tags":{},"startTime":1763098108582,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":279767,"timestamp":86781270620,"id":24,"parentId":17,"tags":{"page":"/api/check-mock-intercept"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":278168,"timestamp":86781274868,"id":56,"parentId":27,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":282406,"timestamp":86781270663,"id":27,"parentId":17,"tags":{"page":"/api/cleanup-project"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":285467,"timestamp":86781275054,"id":59,"parentId":30,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":289847,"timestamp":86781270702,"id":30,"parentId":17,"tags":{"page":"/api/get-mock-data"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":293689,"timestamp":86781274713,"id":53,"parentId":23,"tags":{},"startTime":1763098108582,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":297869,"timestamp":86781270598,"id":23,"parentId":17,"tags":{"page":"/api/all-projects-envs"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":300597,"timestamp":86781275089,"id":60,"parentId":31,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":305009,"timestamp":86781270711,"id":31,"parentId":17,"tags":{"page":"/api/initialize-workspace"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":304405,"timestamp":86781275200,"id":61,"parentId":32,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":308919,"timestamp":86781270717,"id":32,"parentId":17,"tags":{"page":"/api/memory-status"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":307937,"timestamp":86781275229,"id":62,"parentId":33,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":312476,"timestamp":86781270798,"id":33,"parentId":17,"tags":{"page":"/api/microapp-proxy-change-stream"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":312887,"timestamp":86781275249,"id":63,"parentId":34,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":317357,"timestamp":86781270811,"id":34,"parentId":17,"tags":{"page":"/api/microapp-proxy-config"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":315325,"timestamp":86781275028,"id":58,"parentId":29,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":319693,"timestamp":86781270692,"id":29,"parentId":17,"tags":{"page":"/api/delete-mock-api"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":315167,"timestamp":86781275310,"id":68,"parentId":40,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":319540,"timestamp":86781270945,"id":40,"parentId":17,"tags":{"page":"/api/open-project"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":318014,"timestamp":86781275442,"id":70,"parentId":42,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":322523,"timestamp":86781270958,"id":42,"parentId":17,"tags":{"page":"/api/process/logs/stream"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":318349,"timestamp":86781275319,"id":69,"parentId":41,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":322730,"timestamp":86781270951,"id":41,"parentId":17,"tags":{"page":"/api/process/logs"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":322420,"timestamp":86781275477,"id":71,"parentId":36,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":327036,"timestamp":86781270892,"id":36,"parentId":17,"tags":{"page":"/api/mock-file"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":323394,"timestamp":86781275262,"id":64,"parentId":35,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":327865,"timestamp":86781270820,"id":35,"parentId":17,"tags":{"page":"/api/mock-file-content"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":324323,"timestamp":86781275523,"id":73,"parentId":45,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":328945,"timestamp":86781270979,"id":45,"parentId":17,"tags":{"page":"/api/project-config"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":325008,"timestamp":86781275538,"id":74,"parentId":44,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":329601,"timestamp":86781270973,"id":44,"parentId":17,"tags":{"page":"/api/process/status"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":325375,"timestamp":86781275510,"id":72,"parentId":43,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":329943,"timestamp":86781270964,"id":43,"parentId":17,"tags":{"page":"/api/process/start"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":325672,"timestamp":86781275299,"id":67,"parentId":39,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":330052,"timestamp":86781270926,"id":39,"parentId":17,"tags":{"page":"/api/open-all-mock"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":326442,"timestamp":86781275289,"id":66,"parentId":38,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":330832,"timestamp":86781270920,"id":38,"parentId":17,"tags":{"page":"/api/mock-setting"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":327009,"timestamp":86781275567,"id":77,"parentId":47,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":331622,"timestamp":86781270991,"id":47,"parentId":17,"tags":{"page":"/api/workspace/create"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":327490,"timestamp":86781275279,"id":65,"parentId":37,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":331877,"timestamp":86781270909,"id":37,"parentId":17,"tags":{"page":"/api/mock-open-status"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":327284,"timestamp":86781275547,"id":75,"parentId":46,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":331861,"timestamp":86781270984,"id":46,"parentId":17,"tags":{"page":"/api/retry-project"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":331153,"timestamp":86781275003,"id":57,"parentId":28,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":335541,"timestamp":86781270680,"id":28,"parentId":17,"tags":{"page":"/api/current-branch"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":338058,"timestamp":86781275556,"id":76,"parentId":51,"tags":{},"startTime":1763098108583,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":342718,"timestamp":86781271031,"id":51,"parentId":17,"tags":{"page":"/favicon.ico"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":346411,"timestamp":86781279483,"id":79,"parentId":50,"tags":{},"startTime":1763098108587,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":354896,"timestamp":86781271023,"id":50,"parentId":17,"tags":{"page":"/"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":348486,"timestamp":86781279509,"id":80,"parentId":48,"tags":{},"startTime":1763098108587,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":357158,"timestamp":86781270996,"id":48,"parentId":17,"tags":{"page":"/configuration"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":352445,"timestamp":86781276011,"id":78,"parentId":22,"tags":{},"startTime":1763098108584,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":358024,"timestamp":86781270439,"id":22,"parentId":17,"tags":{"page":"/_not-found"},"startTime":1763098108578,"traceId":"b3e487e9a1e261ab"},{"name":"is-page-static","duration":350232,"timestamp":86781279514,"id":81,"parentId":49,"tags":{},"startTime":1763098108587,"traceId":"b3e487e9a1e261ab"},{"name":"check-page","duration":358761,"timestamp":86781271012,"id":49,"parentId":17,"tags":{"page":"/initialization"},"startTime":1763098108579,"traceId":"b3e487e9a1e261ab"},{"name":"static-check","duration":443146,"timestamp":86781186678,"id":17,"parentId":1,"tags":{},"startTime":1763098108494,"traceId":"b3e487e9a1e261ab"},{"name":"generate-required-server-files","duration":269,"timestamp":86781630076,"id":83,"parentId":1,"tags":{},"startTime":1763098108938,"traceId":"b3e487e9a1e261ab"},{"name":"write-routes-manifest","duration":1025,"timestamp":86781636121,"id":85,"parentId":1,"tags":{},"startTime":1763098108944,"traceId":"b3e487e9a1e261ab"},{"name":"load-dotenv","duration":13,"timestamp":86781650261,"id":88,"parentId":87,"tags":{},"startTime":1763098108958,"traceId":"b3e487e9a1e261ab"},{"name":"run-export-path-map","duration":229,"timestamp":86781798595,"id":89,"parentId":87,"tags":{},"startTime":1763098109106,"traceId":"b3e487e9a1e261ab"},{"name":"next-export","duration":729400,"timestamp":86781649696,"id":87,"parentId":1,"tags":{},"startTime":1763098108957,"traceId":"b3e487e9a1e261ab"},{"name":"move-exported-app-not-found-","duration":3856,"timestamp":86782380872,"id":90,"parentId":86,"tags":{},"startTime":1763098109689,"traceId":"b3e487e9a1e261ab"},{"name":"move-exported-page","duration":6950,"timestamp":86782384837,"id":91,"parentId":86,"tags":{},"startTime":1763098109692,"traceId":"b3e487e9a1e261ab"},{"name":"static-generation","duration":841531,"timestamp":86781645632,"id":86,"parentId":1,"tags":{},"startTime":1763098108953,"traceId":"b3e487e9a1e261ab"},{"name":"write-routes-manifest","duration":10579,"timestamp":86782487184,"id":92,"parentId":1,"tags":{},"startTime":1763098109795,"traceId":"b3e487e9a1e261ab"},{"name":"node-file-trace-build","duration":4556327,"timestamp":86781631862,"id":84,"parentId":1,"tags":{"isTurbotrace":"false"},"startTime":1763098108940,"traceId":"b3e487e9a1e261ab"},{"name":"apply-include-excludes","duration":261,"timestamp":86786188207,"id":93,"parentId":1,"tags":{},"startTime":1763098113496,"traceId":"b3e487e9a1e261ab"},{"name":"print-tree-view","duration":2768,"timestamp":86786188959,"id":94,"parentId":1,"tags":{},"startTime":1763098113497,"traceId":"b3e487e9a1e261ab"},{"name":"telemetry-flush","duration":29,"timestamp":86786191737,"id":95,"parentId":1,"tags":{},"startTime":1763098113499,"traceId":"b3e487e9a1e261ab"},{"name":"next-build","duration":11720014,"timestamp":86774471756,"id":1,"tags":{"buildMode":"default","isTurboBuild":"true","version":"15.3.4","has-custom-webpack-config":"false","use-build-worker":"true"},"startTime":1763098101779,"traceId":"b3e487e9a1e261ab"}]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prime-dev-cli",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "main": "index.js",
5
5
  "scripts": {
6
6
  "refresh:config": "node ./bin/cli.mjs init",
@@ -1,3 +0,0 @@
1
- module.exports={45935:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},24713:function(e){var{g:r,__dirname:t,m:s,e:n}=e},57948:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({DELETE:()=>p,GET:()=>u});var s=e.i(15494),n=e.i(30331),o=e.i(9892),a=e.i(13442);function i(e,r){let t=`${e}-${r}`;return n.default.join(a.default.homedir(),".prime-process-logs",`${t}.log`)}async function u(e){try{let{searchParams:r}=new URL(e.url),t=r.get("projectName"),n=r.get("envName"),a=r.get("tail")||"100";if(!t||!n)return s.NextResponse.json({success:!1,error:"缺少必要参数"},{status:400});let u=i(t,n);try{let e=(await o.default.readFile(u,"utf-8")).split("\n").filter(e=>e.trim()),r=parseInt(a),t=e.slice(-r);return s.NextResponse.json({success:!0,data:{logs:t,totalLines:e.length,tailCount:t.length}})}catch{return s.NextResponse.json({success:!0,data:{logs:[],totalLines:0,tailCount:0}})}}catch(e){return console.error("获取进程日志失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"获取进程日志失败"},{status:500})}}async function p(e){try{let{searchParams:r}=new URL(e.url),t=r.get("projectName"),n=r.get("envName");if(!t||!n)return s.NextResponse.json({success:!1,error:"缺少必要参数"},{status:400});let a=i(t,n);try{return await o.default.unlink(a),s.NextResponse.json({success:!0,message:"日志已清除"})}catch{return s.NextResponse.json({success:!0,message:"日志文件不存在"})}}catch(e){return console.error("清除进程日志失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"清除进程日志失败"},{status:500})}}},47527:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>i,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>u});var s=e.i(45746),n=e.i(93828),o=e.i(18250),a=e.i(57948);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/process/logs/route",pathname:"/api/process/logs",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/process/logs/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:t,workUnitAsyncStorage:u,serverHooks:p}=r;function i(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:u})}}}};
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__616d1a09._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/process/logs/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport os from 'os';\n\n// 获取进程日志文件路径\nfunction getProcessLogPath(projectName: string, envName: string) {\n const processKey = `${projectName}-${envName}`;\n return path.join(os.homedir(), '.prime-process-logs', `${processKey}.log`);\n}\n\nexport async function GET(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n const tail = searchParams.get('tail') || '100'; // 默认返回最后100行\n\n if (!projectName || !envName) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n const logPath = getProcessLogPath(projectName, envName);\n \n try {\n // 读取日志文件\n const logContent = await fs.readFile(logPath, 'utf-8');\n const lines = logContent.split('\\n').filter(line => line.trim());\n \n // 获取指定数量的最后几行\n const tailCount = parseInt(tail);\n const tailedLines = lines.slice(-tailCount);\n \n return NextResponse.json({\n success: true,\n data: {\n logs: tailedLines,\n totalLines: lines.length,\n tailCount: tailedLines.length\n }\n });\n } catch {\n // 日志文件不存在\n return NextResponse.json({\n success: true,\n data: {\n logs: [],\n totalLines: 0,\n tailCount: 0\n }\n });\n }\n } catch (error) {\n console.error('获取进程日志失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '获取进程日志失败'\n }, { status: 500 });\n }\n}\n\n// 清除日志\nexport async function DELETE(request: NextRequest) {\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n\n if (!projectName || !envName) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n const logPath = getProcessLogPath(projectName, envName);\n \n try {\n await fs.unlink(logPath);\n return NextResponse.json({\n success: true,\n message: '日志已清除'\n });\n } catch {\n // 文件不存在也算成功\n return NextResponse.json({\n success: true,\n message: '日志文件不存在'\n });\n }\n } catch (error) {\n console.error('清除进程日志失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '清除进程日志失败'\n }, { status: 500 });\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[1]}
@@ -1,11 +0,0 @@
1
- module.exports={29549:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},9892:function(e){var{g:t,__dirname:r,m:n,e:a}=e;n.exports=e.x("fs/promises",()=>require("fs/promises"))},33939:function(e){var{g:t,__dirname:r,m:n,e:a}=e},82988:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({GET:()=>o});var n=e.i(30331),a=e.i(9892),s=e.i(13442);async function o(e){let{searchParams:t}=new URL(e.url),r=t.get("projectName"),o=t.get("envName");if(!r||!o)return new Response("缺少必要参数",{status:400});let i=function(e,t){let r=`${e}-${t}`;return n.default.join(s.default.homedir(),".prime-process-logs",`${r}.log`)}(r,o);return new Response(new ReadableStream({async start(t){let r=new TextEncoder;t.enqueue(r.encode(": ping\n\n"));try{for(let e of(await a.default.readFile(i,"utf-8")).split("\n").filter(e=>e.trim()).slice(-100)){let n=`data: ${JSON.stringify({type:"log",content:e})}
2
-
3
- `;t.enqueue(r.encode(n))}}catch{let e=`data: ${JSON.stringify({type:"init",message:"等待日志..."})}
4
-
5
- `;t.enqueue(r.encode(e))}let n=0;try{n=(await a.default.stat(i)).size}catch{}let s=setInterval(async()=>{try{let e=await a.default.stat(i);if(e.size>n){let s=await a.default.open(i,"r"),o=Buffer.alloc(e.size-n);for(let e of(await s.read(o,0,o.length,n),await s.close(),o.toString("utf-8").split("\n").filter(e=>e.trim()))){let n=`data: ${JSON.stringify({type:"log",content:e})}
6
-
7
- `;t.enqueue(r.encode(n))}n=e.size}}catch{if(n>0){let e=`data: ${JSON.stringify({type:"end",message:"进程已结束"})}
8
-
9
- `;t.enqueue(r.encode(e)),n=0}}t.enqueue(r.encode(": ping\n\n"))},1e3);e.signal.addEventListener("abort",()=>{clearInterval(s),t.close()})}}),{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}})}},13002:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>i,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>p});var n=e.i(45746),a=e.i(93828),s=e.i(18250),o=e.i(82988);let t=new n.AppRouteRouteModule({definition:{kind:a.RouteKind.APP_ROUTE,page:"/api/process/logs/stream/route",pathname:"/api/process/logs/stream",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/process/logs/stream/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:r,workUnitAsyncStorage:p,serverHooks:u}=t;function i(){return(0,s.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:p})}}}};
10
-
11
- //# sourceMappingURL=%5Broot-of-the-server%5D__66ca8d3f._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/process/logs/stream/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { NextRequest } from 'next/server';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport os from 'os';\n\n// 获取进程日志文件路径\nfunction getProcessLogPath(projectName: string, envName: string) {\n const processKey = `${projectName}-${envName}`;\n return path.join(os.homedir(), '.prime-process-logs', `${processKey}.log`);\n}\n\n\nexport async function GET(request: NextRequest) {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n\n if (!projectName || !envName) {\n return new Response('缺少必要参数', { status: 400 });\n }\n\n const logPath = getProcessLogPath(projectName, envName);\n\n // 创建一个可读流来发送SSE\n const stream = new ReadableStream({\n async start(controller) {\n const encoder = new TextEncoder();\n \n // 发送初始连接消息\n controller.enqueue(encoder.encode(': ping\\n\\n'));\n \n // 读取现有日志\n try {\n const logContent = await fs.readFile(logPath, 'utf-8');\n const lines = logContent.split('\\n').filter(line => line.trim());\n const tailLines = lines.slice(-100); // 发送最后100行\n \n for (const line of tailLines) {\n const data = `data: ${JSON.stringify({ type: 'log', content: line })}\\n\\n`;\n controller.enqueue(encoder.encode(data));\n }\n } catch {\n // 文件不存在,发送空日志\n const data = `data: ${JSON.stringify({ type: 'init', message: '等待日志...' })}\\n\\n`;\n controller.enqueue(encoder.encode(data));\n }\n \n // 监听文件变化\n let lastSize = 0;\n try {\n const stats = await fs.stat(logPath);\n lastSize = stats.size;\n } catch {\n // 文件不存在\n }\n \n // 定期检查文件变化\n const interval = setInterval(async () => {\n try {\n const stats = await fs.stat(logPath);\n if (stats.size > lastSize) {\n // 文件有新内容\n const fileHandle = await fs.open(logPath, 'r');\n const buffer = Buffer.alloc(stats.size - lastSize);\n await fileHandle.read(buffer, 0, buffer.length, lastSize);\n await fileHandle.close();\n \n const newContent = buffer.toString('utf-8');\n const newLines = newContent.split('\\n').filter(line => line.trim());\n \n for (const line of newLines) {\n const data = `data: ${JSON.stringify({ type: 'log', content: line })}\\n\\n`;\n controller.enqueue(encoder.encode(data));\n }\n \n lastSize = stats.size;\n }\n } catch {\n // 文件可能被删除\n if (lastSize > 0) {\n const data = `data: ${JSON.stringify({ type: 'end', message: '进程已结束' })}\\n\\n`;\n controller.enqueue(encoder.encode(data));\n lastSize = 0;\n }\n }\n \n // 发送心跳\n controller.enqueue(encoder.encode(': ping\\n\\n'));\n }, 1000); // 每秒检查一次\n \n // 清理函数\n request.signal.addEventListener('abort', () => {\n clearInterval(interval);\n controller.close();\n });\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n },\n });\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[1]}
@@ -1,3 +0,0 @@
1
- module.exports={29549:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({PROJECT_CONFIG_PATH:()=>t,ProjectStatus:()=>o,WORKSPACE_CONFIG:()=>r});var s=e.i(13442),i=e.i(30331);let r={WORKSPACE_ROOT:(0,i.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},t=(0,i.join)((0,s.homedir)(),".prime-projects.json");var o=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},87485:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("child_process",()=>require("child_process"))},4713:function(e){var{g:r,__dirname:t,m:s,e:i}=e;s.exports=e.x("util",()=>require("util"))},45916:function(e){var{g:r,__dirname:t,m:s,e:i}=e},15016:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({POST:()=>p});var s=e.i(9892),i=e.i(30331),o=e.i(13442),n=e.i(87485),a=e.i(4713),c=e.i(88941);let r=(0,a.promisify)(n.exec),t=(0,i.join)((0,o.homedir)(),".prime-workspaces");async function p(e){try{let{projects:o}=await e.json();if(!o||!Array.isArray(o)||0===o.length)return Response.json({success:!1,error:"请至少选择一个项目"},{status:400});let n=c.WORKSPACE_CONFIG.WORKSPACE_ROOT,a=[...o].sort(),p=`${a.join("-")}.code-workspace`;try{await (0,s.access)(t)}catch{await (0,s.mkdir)(t,{recursive:!0})}let u=(0,i.join)(t,p),m=!1;try{await (0,s.access)(u),m=!0}catch{m=!1}if(!m){let e={folders:a.map(e=>({path:(0,i.join)(n,e)})),settings:{}};await (0,s.writeFile)(u,JSON.stringify(e,null,2),"utf-8")}try{return await r(`cursor "${u}"`),Response.json({success:!0,message:m?"已打开现有工作区":"工作区已创建并在 Cursor 中打开",workspaceFile:u,isExisting:m})}catch(r){let e=r instanceof Error?r.message:String(r);return Response.json({success:!1,error:`无法打开 Cursor: ${e}`},{status:500})}}catch(r){let e=r instanceof Error?r.message:String(r);return console.error("创建工作区失败:",r),Response.json({success:!1,error:`创建工作区失败: ${e}`},{status:500})}}}},73337:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>a,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),i=e.i(93828),o=e.i(18250),n=e.i(15016);let r=new s.AppRouteRouteModule({definition:{kind:i.RouteKind.APP_ROUTE,page:"/api/workspace/create/route",pathname:"/api/workspace/create",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/workspace/create/route.ts",nextConfigOutput:"",userland:n}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function a(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__b310ec65._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/app/api/workspace/create/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { NextRequest } from 'next/server';\nimport { writeFile, access, mkdir } from 'fs/promises';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\nconst execAsync = promisify(exec);\n\ninterface WorkspaceFolder {\n path: string;\n}\n\ninterface WorkspaceConfig {\n folders: WorkspaceFolder[];\n settings: Record<string, unknown>;\n}\n\n// 工作区文件存储目录\nconst WORKSPACE_FILES_DIR = join(homedir(), '.prime-workspaces');\n\n/**\n * 创建并打开 Cursor 工作区\n */\nexport async function POST(request: NextRequest) {\n try {\n const { projects } = await request.json();\n\n if (!projects || !Array.isArray(projects) || projects.length === 0) {\n return Response.json(\n { success: false, error: '请至少选择一个项目' },\n { status: 400 }\n );\n }\n\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n\n // 对项目名称排序,生成稳定的文件名\n const sortedProjects = [...projects].sort();\n const workspaceFileName = `${sortedProjects.join('-')}.code-workspace`;\n \n // 确保工作区文件目录存在\n try {\n await access(WORKSPACE_FILES_DIR);\n } catch {\n await mkdir(WORKSPACE_FILES_DIR, { recursive: true });\n }\n\n const workspaceFilePath = join(WORKSPACE_FILES_DIR, workspaceFileName);\n\n // 检查工作区文件是否已存在\n let fileExists = false;\n try {\n await access(workspaceFilePath);\n fileExists = true;\n } catch {\n // 文件不存在,需要创建\n fileExists = false;\n }\n\n // 如果文件不存在,创建新的工作区文件\n if (!fileExists) {\n // 构建工作区配置\n const workspaceConfig: WorkspaceConfig = {\n folders: sortedProjects.map((projectName: string) => ({\n path: join(workspacePath, projectName)\n })),\n settings: {}\n };\n\n // 写入工作区文件\n await writeFile(\n workspaceFilePath,\n JSON.stringify(workspaceConfig, null, 2),\n 'utf-8'\n );\n }\n\n // 使用 cursor 命令打开工作区\n try {\n await execAsync(`cursor \"${workspaceFilePath}\"`);\n\n return Response.json({\n success: true,\n message: fileExists ? '已打开现有工作区' : '工作区已创建并在 Cursor 中打开',\n workspaceFile: workspaceFilePath,\n isExisting: fileExists\n });\n } catch (execError) {\n const errorMessage = execError instanceof Error ? execError.message : String(execError);\n return Response.json(\n { success: false, error: `无法打开 Cursor: ${errorMessage}` },\n { status: 500 }\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error('创建工作区失败:', error);\n \n return Response.json(\n { success: false, error: `创建工作区失败: ${errorMessage}` },\n { status: 500 }\n );\n }\n}\n","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[2]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/sse-connection-manager.ts","turbopack:///[project]/packages/server/src/app/api/microapp-proxy-change-stream/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","/**\n * SSE连接管理器\n * 用于管理MicroApp代理配置变化推送的SSE连接\n */\n\nexport interface ConnectionInfo {\n controller: ReadableStreamDefaultController<Uint8Array>;\n timestamp: number;\n clientId: string;\n envName: string;\n}\n\nexport interface ConfigChangeMessage {\n type: 'microapp-proxy-config-change';\n envName: string;\n timestamp: number;\n changes: {\n before: string[];\n after: string[];\n added: string[];\n removed: string[];\n };\n projectName: string;\n message: string;\n}\n\nexport interface HeartbeatMessage {\n type: 'heartbeat';\n timestamp: number;\n}\n\ntype SSEMessage = ConfigChangeMessage | HeartbeatMessage;\n\n/**\n * SSE连接管理器类\n */\nclass SSEConnectionManager {\n private connections = new Map<string, Set<ConnectionInfo>>();\n private encoder = new TextEncoder();\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private readonly HEARTBEAT_INTERVAL = 30000; // 30秒心跳\n private readonly CONNECTION_TIMEOUT = 120000; // 2分钟连接超时\n\n constructor() {\n this.startHeartbeat();\n }\n\n /**\n * 添加新的SSE连接\n */\n addConnection(envName: string, controller: ReadableStreamDefaultController<Uint8Array>, clientId: string): void {\n console.log(`[SSE] 添加连接: 环境=${envName}, 客户端=${clientId}`);\n \n const connectionInfo: ConnectionInfo = {\n controller,\n timestamp: Date.now(),\n clientId,\n envName,\n };\n\n if (!this.connections.has(envName)) {\n this.connections.set(envName, new Set());\n }\n \n this.connections.get(envName)!.add(connectionInfo);\n \n // 发送连接确认消息\n this.sendToConnection(connectionInfo, {\n type: 'heartbeat',\n timestamp: Date.now(),\n });\n\n console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`);\n }\n\n /**\n * 移除SSE连接\n */\n removeConnection(envName: string, clientId: string): void {\n console.log(`[SSE] 移除连接: 环境=${envName}, 客户端=${clientId}`);\n \n const connections = this.connections.get(envName);\n if (connections) {\n const connectionToRemove = Array.from(connections).find(conn => conn.clientId === clientId);\n if (connectionToRemove) {\n connections.delete(connectionToRemove);\n \n // 如果该环境没有连接了,删除整个entry\n if (connections.size === 0) {\n this.connections.delete(envName);\n }\n }\n }\n\n console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`);\n }\n\n /**\n * 向指定环境广播消息\n */\n broadcastToEnv(envName: string, message: ConfigChangeMessage): void {\n console.log(`[SSE] 向环境 ${envName} 广播配置变化消息`);\n \n const connections = this.connections.get(envName);\n if (!connections || connections.size === 0) {\n console.log(`[SSE] 环境 ${envName} 没有活跃连接,跳过广播`);\n return;\n }\n\n const deadConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n try {\n this.sendToConnection(connectionInfo, message);\n } catch (error) {\n console.error(`[SSE] 发送消息到客户端 ${connectionInfo.clientId} 失败:`, error);\n deadConnections.push(connectionInfo);\n }\n });\n\n // 清理无效连接\n deadConnections.forEach(conn => {\n connections.delete(conn);\n console.log(`[SSE] 清理无效连接: 客户端=${conn.clientId}`);\n });\n\n console.log(`[SSE] 成功发送给 ${connections.size} 个连接`);\n }\n\n /**\n * 向单个连接发送消息\n */\n private sendToConnection(connectionInfo: ConnectionInfo, message: SSEMessage): void {\n const data = `data: ${JSON.stringify(message)}\\n\\n`;\n const encodedData = this.encoder.encode(data);\n \n try {\n connectionInfo.controller.enqueue(encodedData);\n connectionInfo.timestamp = Date.now(); // 更新最后活跃时间\n } catch (error) {\n console.error(`[SSE] 发送消息失败:`, error);\n throw error;\n }\n }\n\n /**\n * 启动心跳机制\n */\n private startHeartbeat(): void {\n this.heartbeatInterval = setInterval(() => {\n this.sendHeartbeat();\n this.cleanupStaleConnections();\n }, this.HEARTBEAT_INTERVAL);\n \n console.log(`[SSE] 心跳机制已启动,间隔: ${this.HEARTBEAT_INTERVAL}ms`);\n }\n\n /**\n * 发送心跳消息\n */\n private sendHeartbeat(): void {\n const heartbeatMessage: HeartbeatMessage = {\n type: 'heartbeat',\n timestamp: Date.now(),\n };\n\n let totalConnections = 0;\n this.connections.forEach((connections) => {\n totalConnections += connections.size;\n const deadConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n try {\n this.sendToConnection(connectionInfo, heartbeatMessage);\n } catch {\n deadConnections.push(connectionInfo);\n }\n });\n\n // 清理无效连接\n deadConnections.forEach(conn => connections.delete(conn));\n });\n\n if (totalConnections > 0) {\n console.log(`[SSE] 心跳发送完成,活跃连接数: ${totalConnections}`);\n }\n }\n\n /**\n * 清理过期连接\n */\n private cleanupStaleConnections(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n this.connections.forEach((connections, envName) => {\n const staleConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n if (now - connectionInfo.timestamp > this.CONNECTION_TIMEOUT) {\n staleConnections.push(connectionInfo);\n }\n });\n\n staleConnections.forEach(conn => {\n connections.delete(conn);\n cleanedCount++;\n console.log(`[SSE] 清理过期连接: 环境=${envName}, 客户端=${conn.clientId}`);\n });\n\n // 如果该环境没有连接了,删除整个entry\n if (connections.size === 0) {\n this.connections.delete(envName);\n }\n });\n\n if (cleanedCount > 0) {\n console.log(`[SSE] 连接清理完成,清理数量: ${cleanedCount}`);\n }\n }\n\n /**\n * 获取连接统计信息\n */\n getConnectionStats(): string {\n const stats: string[] = [];\n let totalConnections = 0;\n \n this.connections.forEach((connections, envName) => {\n const count = connections.size;\n totalConnections += count;\n stats.push(`${envName}: ${count}`);\n });\n\n return `总计 ${totalConnections} 个连接 (${stats.join(', ')})`;\n }\n\n /**\n * 停止连接管理器\n */\n stop(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n console.log(`[SSE] 心跳机制已停止`);\n }\n\n // 关闭所有连接\n this.connections.forEach((connections) => {\n connections.forEach(connectionInfo => {\n try {\n connectionInfo.controller.close();\n } catch (error) {\n console.error(`[SSE] 关闭连接失败:`, error);\n }\n });\n });\n\n this.connections.clear();\n console.log(`[SSE] 所有连接已关闭`);\n }\n}\n\n// 创建全局实例\nexport const sseConnectionManager = new SSEConnectionManager();\n\n// 在进程退出时清理资源\nprocess.on('SIGINT', () => {\n console.log('[SSE] 收到退出信号,正在清理连接...');\n sseConnectionManager.stop();\n process.exit(0);\n});\n\nprocess.on('SIGTERM', () => {\n console.log('[SSE] 收到终止信号,正在清理连接...');\n sseConnectionManager.stop();\n process.exit(0);\n}); ","import { NextRequest, NextResponse } from 'next/server';\nimport { sseConnectionManager } from '@/lib/sse-connection-manager';\nimport { getProjectsConfig } from '@/lib/workspace-config';\n\n/**\n * MicroApp代理配置变化推送 SSE 端点\n * \n * 查询参数:\n * - env: 需要监听的环境名称\n * - clientId: 客户端标识符(可选,用于连接管理)\n */\nexport async function GET(request: NextRequest): Promise<Response> {\n const { searchParams } = new URL(request.url);\n const envName = searchParams.get('env');\n const clientId = searchParams.get('clientId') || `client-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n\n // 参数验证\n if (!envName) {\n return NextResponse.json(\n { \n success: false, \n error: '缺少必要参数:env(环境名称)' \n },\n { status: 400 }\n );\n }\n\n try {\n // 验证环境是否存在\n const projectsConfig = await getProjectsConfig();\n let envExists = false;\n \n // 检查所有项目中是否存在指定环境\n for (const [, projectConfig] of Object.entries(projectsConfig)) {\n if (projectConfig.envs && projectConfig.envs[envName]) {\n envExists = true;\n break;\n }\n }\n\n if (!envExists) {\n return NextResponse.json(\n { \n success: false, \n error: `环境 \"${envName}\" 不存在于任何项目中` \n },\n { status: 404 }\n );\n }\n\n console.log(`[SSE] 新的连接请求: 环境=${envName}, 客户端=${clientId}`);\n\n // 创建SSE流\n const encoder = new TextEncoder();\n \n const stream = new ReadableStream({\n start(controller) {\n // 添加连接到管理器\n sseConnectionManager.addConnection(envName, controller, clientId);\n\n // 发送初始连接成功消息\n const initialMessage = {\n type: 'connection-established' as const,\n envName,\n clientId,\n timestamp: Date.now(),\n message: `已连接到环境 ${envName} 的配置变化推送流`\n };\n\n const data = `data: ${JSON.stringify(initialMessage)}\\n\\n`;\n controller.enqueue(encoder.encode(data));\n },\n\n cancel() {\n // 连接取消时清理\n console.log(`[SSE] 连接取消: 环境=${envName}, 客户端=${clientId}`);\n sseConnectionManager.removeConnection(envName, clientId);\n }\n });\n\n // 返回SSE响应\n return new Response(stream, {\n status: 200,\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET',\n 'Access-Control-Allow-Headers': 'Cache-Control, Content-Type',\n },\n });\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'SSE连接建立失败';\n console.error(`[SSE] 连接建立失败: 环境=${envName}, 客户端=${clientId}`, error);\n \n return NextResponse.json(\n { \n success: false, \n error: errorMessage \n },\n { status: 500 }\n );\n }\n}\n\n/**\n * 处理预检请求\n */\nexport async function OPTIONS(): Promise<Response> {\n return new Response(null, {\n status: 200,\n headers: {\n 'Access-Control-Allow-Origin': '*',\n 'Access-Control-Allow-Methods': 'GET, OPTIONS',\n 'Access-Control-Allow-Headers': 'Content-Type, Cache-Control',\n 'Access-Control-Max-Age': '86400',\n },\n });\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[4]}
@@ -1,3 +0,0 @@
1
- module.exports={45935:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var s=e.i(13442),n=e.i(30331);let t={WORKSPACE_ROOT:(0,n.join)((0,s.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,s.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},r=(0,n.join)((0,s.homedir)(),".prime-projects.json");var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});var s=e.i(9892),n=e.i(88941);async function i(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await o({}),{}}try{let e=await (0,s.readFile)(n.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function o(e){let t=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var a=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},87485:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},4713:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("util",()=>require("util"))},30646:function(e){var{g:t,__dirname:r,m:s,e:n}=e},47814:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({initializeProcessMonitoring:()=>p,loadAndCleanProcesses:()=>l});var s=e.i(9892),n=e.i(30331),i=e.i(13442),o=e.i(87485);function a(){return n.default.join(i.default.homedir(),".prime-processes.json")}async function c(e){try{return process.kill(e,0),!0}catch{return!1}}async function l(){try{let e=await s.default.readFile(a(),"utf-8"),t=JSON.parse(e),r=[];for(let e of t)await c(e.pid)&&r.push(e);return r.length!==t.length&&await s.default.writeFile(a(),JSON.stringify(r,null,2)),r}catch{return[]}}async function p(){console.log("初始化进程监控...");let e=await l();return console.log(`发现 ${e.length} 个正在运行的进程`),e}(0,e.i(4713).promisify)(o.exec)},91359:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({DELETE:()=>x,POST:()=>m});var s=e.i(15494),n=e.i(87485),i=e.i(30331),o=e.i(9892),a=e.i(13442),c=e.i(47814),l=e.i(35692),p=e.i(88941);let t=new Map;function u(e){return i.default.join(a.default.homedir(),".prime-process-logs",`${e}.log`)}async function d(e,t){let r=i.default.join(a.default.homedir(),".prime-process-logs"),s=u(e);try{await o.default.mkdir(r,{recursive:!0}),await o.default.writeFile(s,t.join("\n"),"utf-8")}catch(e){console.error("保存进程日志失败:",e)}}async function f(){let e=[];t.forEach((t,r)=>{e.push({key:r,projectName:t.projectName,envName:t.envName,startTime:t.startTime,port:t.port,pid:t.process.pid})});try{await o.default.writeFile(i.default.join(a.default.homedir(),".prime-processes.json"),JSON.stringify(e,null,2))}catch(e){console.error("保存进程信息失败:",e)}}let r=!1;async function g(){if(!r){for(let e of(await (0,c.loadAndCleanProcesses)())){let r=[];try{let t=u(e.key),s=await o.default.readFile(t,"utf-8");r.push(...s.split("\n").filter(e=>e.trim()))}catch{}t.set(e.key,{process:{pid:e.pid,killed:!1},projectName:e.projectName,envName:e.envName,startTime:new Date(e.startTime),port:e.port,logs:r,maxLogLines:1e3})}r=!0}}async function m(e){await g();try{let{projectName:r,envName:a,startCommand:c}=await e.json();if(!r||!a||!c)return s.NextResponse.json({success:!1,error:"缺少必要参数"},{status:400});let u=`${r}-${a}`;if(t.has(u)){let e=t.get(u);if(e&&e.process&&!e.process.killed)return s.NextResponse.json({success:!1,error:"该环境已经在运行中"},{status:400})}let g=await (0,l.getProjectsConfig)(),m=p.WORKSPACE_CONFIG.WORKSPACE_ROOT,x=i.default.join(m,r);try{await o.default.access(x)}catch{return s.NextResponse.json({success:!1,error:"项目目录不存在"},{status:404})}let[h,...w]=c.split(" "),v=(0,n.spawn)(h,w,{cwd:x,shell:!0,detached:!1,stdio:["ignore","pipe","pipe"],env:{...process.env,NODE_ENV:"development",FORCE_COLOR:"1"}}),N=g[r],j=N?.envs?.[a],y=j?.host?.split(":").pop()||"",E=[],O={process:{pid:v.pid||0,killed:!1,kill:()=>v.kill(),on:(e,t)=>{v.on(e,t)}},projectName:r,envName:a,startTime:new Date,port:y,logs:E,maxLogLines:1e3};t.set(u,O),v.stdout&&v.stdout.on("data",e=>{e.toString().split("\n").forEach(e=>{if(e.replace(/\x1b\[[0-9;]*m/g,"").replace(/\x1b\[[0-9]*[A-Z]/g,"").replace(/\[\d+[A-Z]/g,"").trim()){let t=`[${new Date().toISOString()}] [STDOUT] ${e}`;E.push(t),E.length>1e3&&E.shift()}})}),v.stderr&&v.stderr.on("data",e=>{e.toString().split("\n").forEach(e=>{if(e.replace(/\x1b\[[0-9;]*m/g,"").replace(/\x1b\[[0-9]*[A-Z]/g,"").replace(/\[\d+[A-Z]/g,"").trim()){let t=`[${new Date().toISOString()}] [STDERR] ${e}`;E.push(t),E.length>1e3&&E.shift()}})}),await f(),await d(u,E);let T=function(e){let r=setInterval(async()=>{let s=t.get(e);s?await d(e,s.logs):clearInterval(r)},5e3);return r}(u);if(v.on("exit",async e=>{console.log(`进程 ${u} 退出,退出码: ${e}`);let r=`[${new Date().toISOString()}] [SYSTEM] 进程退出,退出码: ${e}`;E.push(r),await d(u,E),clearInterval(T),t.delete(u),await f()}),v.on("error",e=>{console.error(`进程 ${u} 错误:`,e),t.delete(u),f()}),await new Promise(e=>setTimeout(e,2e3)),v.killed)return t.delete(u),await f(),s.NextResponse.json({success:!1,error:"进程启动失败"},{status:500});return s.NextResponse.json({success:!0,data:{pid:v.pid,startTime:new Date,port:y}})}catch(e){return console.error("启动进程失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"启动进程失败"},{status:500})}}async function x(e){await g();try{let{searchParams:r}=new URL(e.url),n=r.get("projectName"),i=r.get("envName");if(!n||!i)return s.NextResponse.json({success:!1,error:"缺少必要参数"},{status:400});let a=`${n}-${i}`,c=t.get(a);if(!c)return s.NextResponse.json({success:!1,error:"进程未找到"},{status:404});try{process.kill(c.process.pid,"SIGTERM"),await new Promise(e=>setTimeout(e,1e3));try{process.kill(c.process.pid,0),process.kill(c.process.pid,"SIGKILL")}catch{}}catch(e){console.error("终止进程失败:",e)}t.delete(a),await f();try{let e=u(a);await o.default.unlink(e)}catch{}return s.NextResponse.json({success:!0,message:"进程已停止"})}catch(e){return console.error("停止进程失败:",e),s.NextResponse.json({success:!1,error:e instanceof Error?e.message:"停止进程失败"},{status:500})}}}},93992:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>l,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),i=e.i(18250),o=e.i(91359);let t=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/process/start/route",pathname:"/api/process/start",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/process/start/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:l}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
2
-
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__e68f3764._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/process-monitor.ts","turbopack:///[project]/packages/server/src/app/api/process/start/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import fs from 'fs/promises';\nimport path from 'path';\nimport os from 'os';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\n\nconst execAsync = promisify(exec);\n\n// 进程信息接口\ninterface ProcessInfo {\n key: string;\n projectName: string;\n envName: string;\n pid: number;\n startTime: Date;\n port: string;\n}\n\n// 获取进程存储文件路径\nfunction getProcessStorePath() {\n return path.join(os.homedir(), '.prime-processes.json');\n}\n\n// 检查进程是否仍在运行\nasync function isProcessRunning(pid: number): Promise<boolean> {\n try {\n if (process.platform !== 'win32') {\n process.kill(pid, 0);\n return true;\n } else {\n const { stdout } = await execAsync(`tasklist /FI \"PID eq ${pid}\"`);\n return stdout.includes(pid.toString());\n }\n } catch {\n return false;\n }\n}\n\n// 加载并清理过期的进程信息\nexport async function loadAndCleanProcesses(): Promise<ProcessInfo[]> {\n try {\n const processInfoContent = await fs.readFile(getProcessStorePath(), 'utf-8');\n const processInfoList: ProcessInfo[] = JSON.parse(processInfoContent);\n \n // 过滤出仍在运行的进程\n const runningProcesses: ProcessInfo[] = [];\n \n for (const processInfo of processInfoList) {\n const isRunning = await isProcessRunning(processInfo.pid);\n if (isRunning) {\n runningProcesses.push(processInfo);\n }\n }\n \n // 如果有进程被清理,更新文件\n if (runningProcesses.length !== processInfoList.length) {\n await fs.writeFile(getProcessStorePath(), JSON.stringify(runningProcesses, null, 2));\n }\n \n return runningProcesses;\n } catch {\n // 文件不存在或解析错误,返回空数组\n return [];\n }\n}\n\n// 初始化进程监控 - 在应用启动时调用\nexport async function initializeProcessMonitoring() {\n console.log('初始化进程监控...');\n const processes = await loadAndCleanProcesses();\n console.log(`发现 ${processes.length} 个正在运行的进程`);\n return processes;\n}","import { NextRequest, NextResponse } from 'next/server';\nimport { spawn } from 'child_process';\nimport path from 'path';\nimport fs from 'fs/promises';\nimport os from 'os';\nimport { loadAndCleanProcesses } from '@/lib/process-monitor';\nimport { getProjectsConfig } from '@/lib/workspace-config';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\n\n// 存储进程信息的Map\ninterface ProcessData {\n process: {\n pid: number;\n killed: boolean;\n kill?: () => void;\n on?: (event: string, callback: (code?: number) => void) => void;\n };\n projectName: string;\n envName: string;\n startTime: Date;\n port: string;\n logs: string[];\n maxLogLines?: number;\n}\n\nconst processes = new Map<string, ProcessData>();\nconst MAX_LOG_LINES = 1000; // 最多保存1000行日志\n\n// 获取进程存储文件路径\nfunction getProcessStorePath() {\n return path.join(os.homedir(), '.prime-processes.json');\n}\n\n// 获取进程日志文件路径\nfunction getProcessLogPath(processKey: string) {\n return path.join(os.homedir(), '.prime-process-logs', `${processKey}.log`);\n}\n\n// 保存进程日志\nasync function saveProcessLogs(processKey: string, logs: string[]) {\n const logDir = path.join(os.homedir(), '.prime-process-logs');\n const logPath = getProcessLogPath(processKey);\n \n try {\n // 确保日志目录存在\n await fs.mkdir(logDir, { recursive: true });\n // 写入日志文件\n await fs.writeFile(logPath, logs.join('\\n'), 'utf-8');\n } catch (error) {\n console.error('保存进程日志失败:', error);\n }\n}\n\n// 定期保存日志\nfunction startLogSaver(processKey: string) {\n const interval = setInterval(async () => {\n const processData = processes.get(processKey);\n if (processData) {\n await saveProcessLogs(processKey, processData.logs);\n } else {\n clearInterval(interval);\n }\n }, 5000); // 每5秒保存一次\n \n return interval;\n}\n\n// 保存进程信息到文件\nasync function saveProcessInfo() {\n const processInfo: {\n key: string;\n projectName: string;\n envName: string;\n startTime: Date;\n port: string;\n pid: number;\n }[] = [];\n processes.forEach((value, key) => {\n processInfo.push({\n key,\n projectName: value.projectName,\n envName: value.envName,\n startTime: value.startTime,\n port: value.port,\n pid: value.process.pid\n });\n });\n \n try {\n await fs.writeFile(getProcessStorePath(), JSON.stringify(processInfo, null, 2));\n } catch (error) {\n console.error('保存进程信息失败:', error);\n }\n}\n\n// 在启动时加载现有进程信息\nlet processesInitialized = false;\nasync function ensureProcessesLoaded() {\n if (!processesInitialized) {\n const existingProcesses = await loadAndCleanProcesses();\n for (const processInfo of existingProcesses) {\n // 恢复进程信息到内存,但不恢复实际的进程对象\n // 因为我们只需要知道进程存在,状态查询会检查实际的PID\n // 尝试加载已保存的日志\n const logs: string[] = [];\n try {\n const logPath = getProcessLogPath(processInfo.key);\n const logContent = await fs.readFile(logPath, 'utf-8');\n logs.push(...logContent.split('\\n').filter(line => line.trim()));\n } catch {\n // 日志文件不存在或读取失败,使用空日志\n }\n \n processes.set(processInfo.key, {\n process: { pid: processInfo.pid, killed: false },\n projectName: processInfo.projectName,\n envName: processInfo.envName,\n startTime: new Date(processInfo.startTime),\n port: processInfo.port,\n logs,\n maxLogLines: MAX_LOG_LINES\n });\n }\n processesInitialized = true;\n }\n}\n\nexport async function POST(request: NextRequest) {\n await ensureProcessesLoaded();\n try {\n const { projectName, envName, startCommand } = await request.json();\n\n if (!projectName || !envName || !startCommand) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n // 生成进程的唯一标识\n const processKey = `${projectName}-${envName}`;\n\n // 检查进程是否已经在运行\n if (processes.has(processKey)) {\n const existingProcess = processes.get(processKey);\n if (existingProcess && existingProcess.process && !existingProcess.process.killed) {\n return NextResponse.json({\n success: false,\n error: '该环境已经在运行中'\n }, { status: 400 });\n }\n }\n\n // 读取配置文件获取工作区路径\n const config = await getProjectsConfig();\n \n // 使用工作区常量路径\n const workspacePath = WORKSPACE_CONFIG.WORKSPACE_ROOT;\n \n // 构建项目路径\n const projectPath = path.join(workspacePath, projectName);\n\n // 检查项目目录是否存在\n try {\n await fs.access(projectPath);\n } catch {\n return NextResponse.json({\n success: false,\n error: '项目目录不存在'\n }, { status: 404 });\n }\n\n // 解析命令\n const [command, ...args] = startCommand.split(' ');\n\n // 启动进程 - 不传递 env 参数,让子进程继承父进程环境变量\n // 但通过环境变量覆盖确保开发模式\n const childProcess = spawn(command, args, {\n cwd: projectPath,\n shell: true,\n detached: false,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n ...process.env,\n NODE_ENV: 'development', // 强制设置为开发模式\n FORCE_COLOR: '1', // 保留颜色输出\n }\n });\n\n // 获取项目配置中的端口信息\n const projectConfig = config[projectName];\n const envConfig = projectConfig?.envs?.[envName];\n const port = envConfig?.host?.split(':').pop() || '';\n\n // 初始化日志数组\n const logs: string[] = [];\n \n // 存储进程信息\n const processData: ProcessData = {\n process: {\n pid: childProcess.pid || 0,\n killed: false,\n kill: () => childProcess.kill(),\n on: (event: string, callback: (code?: number) => void) => {\n childProcess.on(event, callback);\n }\n },\n projectName,\n envName,\n startTime: new Date(),\n port,\n logs,\n maxLogLines: MAX_LOG_LINES\n };\n \n processes.set(processKey, processData);\n \n // 捕获标准输出\n if (childProcess.stdout) {\n childProcess.stdout.on('data', (data: Buffer) => {\n const text = data.toString();\n // 分割成行,但保留空行以便过滤\n const lines = text.split('\\n');\n \n lines.forEach(line => {\n // 过滤掉只包含控制序列的行\n const cleanedLine = line\n .replace(/\\x1b\\[[0-9;]*m/g, '') // 移除颜色代码\n .replace(/\\x1b\\[[0-9]*[A-Z]/g, '') // 移除光标控制\n .replace(/\\[\\d+[A-Z]/g, '') // 移除其他控制序列\n .trim();\n \n // 如果清理后的行不为空,则记录\n if (cleanedLine) {\n const logEntry = `[${new Date().toISOString()}] [STDOUT] ${line}`;\n logs.push(logEntry);\n // 限制日志大小\n if (logs.length > MAX_LOG_LINES) {\n logs.shift();\n }\n }\n });\n });\n }\n \n // 捕获标准错误\n if (childProcess.stderr) {\n childProcess.stderr.on('data', (data: Buffer) => {\n const text = data.toString();\n const lines = text.split('\\n');\n \n lines.forEach(line => {\n // 过滤掉只包含控制序列的行\n const cleanedLine = line\n .replace(/\\x1b\\[[0-9;]*m/g, '')\n .replace(/\\x1b\\[[0-9]*[A-Z]/g, '')\n .replace(/\\[\\d+[A-Z]/g, '')\n .trim();\n \n if (cleanedLine) {\n const logEntry = `[${new Date().toISOString()}] [STDERR] ${line}`;\n logs.push(logEntry);\n // 限制日志大小\n if (logs.length > MAX_LOG_LINES) {\n logs.shift();\n }\n }\n });\n });\n }\n\n // 保存进程信息到文件\n await saveProcessInfo();\n \n // 同时保存日志\n await saveProcessLogs(processKey, logs);\n\n // 启动日志定期保存\n const logSaveInterval = startLogSaver(processKey);\n \n // 监听进程退出\n childProcess.on('exit', async (code) => {\n console.log(`进程 ${processKey} 退出,退出码: ${code}`);\n const logEntry = `[${new Date().toISOString()}] [SYSTEM] 进程退出,退出码: ${code}`;\n logs.push(logEntry);\n \n // 最后一次保存日志\n await saveProcessLogs(processKey, logs);\n \n // 清理定时器\n clearInterval(logSaveInterval);\n \n processes.delete(processKey);\n await saveProcessInfo();\n });\n\n childProcess.on('error', (error) => {\n console.error(`进程 ${processKey} 错误:`, error);\n processes.delete(processKey);\n saveProcessInfo();\n });\n\n // 等待一小段时间确保进程启动\n await new Promise(resolve => setTimeout(resolve, 2000));\n\n // 检查进程是否仍在运行\n if (childProcess.killed) {\n processes.delete(processKey);\n await saveProcessInfo();\n return NextResponse.json({\n success: false,\n error: '进程启动失败'\n }, { status: 500 });\n }\n\n return NextResponse.json({\n success: true,\n data: {\n pid: childProcess.pid,\n startTime: new Date(),\n port\n }\n });\n } catch (error) {\n console.error('启动进程失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '启动进程失败'\n }, { status: 500 });\n }\n}\n\n// 停止进程\nexport async function DELETE(request: NextRequest) {\n await ensureProcessesLoaded();\n try {\n const { searchParams } = new URL(request.url);\n const projectName = searchParams.get('projectName');\n const envName = searchParams.get('envName');\n\n if (!projectName || !envName) {\n return NextResponse.json({\n success: false,\n error: '缺少必要参数'\n }, { status: 400 });\n }\n\n const processKey = `${projectName}-${envName}`;\n const processInfo = processes.get(processKey);\n\n if (!processInfo) {\n return NextResponse.json({\n success: false,\n error: '进程未找到'\n }, { status: 404 });\n }\n\n try {\n // 尝试优雅地终止进程\n process.kill(processInfo.process.pid, 'SIGTERM');\n \n // 给进程一些时间来清理\n await new Promise(resolve => setTimeout(resolve, 1000));\n \n // 如果进程仍在运行,强制终止\n try {\n process.kill(processInfo.process.pid, 0); // 检查进程是否存在\n process.kill(processInfo.process.pid, 'SIGKILL');\n } catch {\n // 进程已经退出\n }\n } catch (error) {\n console.error('终止进程失败:', error);\n }\n\n processes.delete(processKey);\n await saveProcessInfo();\n \n // 清理日志文件\n try {\n const logPath = getProcessLogPath(processKey);\n await fs.unlink(logPath);\n } catch {\n // 忽略删除失败\n }\n\n return NextResponse.json({\n success: true,\n message: '进程已停止'\n });\n } catch (error) {\n console.error('停止进程失败:', error);\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '停止进程失败'\n }, { status: 500 });\n }\n}","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[4]}
@@ -1,5 +0,0 @@
1
- module.exports={83886:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("next/dist/server/app-render/after-task-async-storage.external.js",()=>require("next/dist/server/app-render/after-task-async-storage.external.js"))},29549:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-page-turbo.runtime.prod.js"))},83943:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("next/dist/server/app-render/work-unit-async-storage.external.js",()=>require("next/dist/server/app-render/work-unit-async-storage.external.js"))},86103:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},30331:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js",()=>require("next/dist/compiled/next-server/app-route-turbo.runtime.prod.js"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>n,WORKSPACE_CONFIG:()=>t});var o=e.i(13442),s=e.i(30331);let t={WORKSPACE_ROOT:(0,s.join)((0,o.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,o.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},r=(0,s.join)((0,o.homedir)(),".prime-projects.json");var n=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e.INCOMPLETE="incomplete",e}({})}},9892:function(e){var{g:t,__dirname:r,m:o,e:s}=e;o.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({ProjectStatus:()=>c,getProjectsConfig:()=>n,saveProjectsConfig:()=>i});var o=e.i(9892),s=e.i(88941);async function n(){try{await (0,o.access)(s.PROJECT_CONFIG_PATH,o.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,o.readFile)(s.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function i(e){let t=s.PROJECT_CONFIG_PATH+".tmp";try{await (0,o.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,o.rename)(t,s.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var c=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},15079:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({createProjectEnvFiles:()=>n,createProjectMockDirectories:()=>i,updateProjectEnvFile:()=>c});var o=e.i(83886),s=e.i(30331);async function n(e,t,r){let n=(0,s.join)(r,e),i=[],c=[];try{let e=t.envs||{};for(let t in e){let r=e[t];if(r.envFileName&&r.proxyKey){let e=(0,s.join)(n,r.envFileName);try{await o.promises.access(e),c.push(r.envFileName)}catch{let t=r.proxyEnv[r.currentProxy]||"",s=`${r.proxyKey}=${t}`;await o.promises.writeFile(e,s,"utf-8"),i.push(r.envFileName)}}}return{success:!0,createdFiles:i,skippedFiles:c}}catch(r){let t=r instanceof Error?r.message:String(r);return console.error(`在为项目 ${e} 创建环境文件时出错:`,r),{success:!1,createdFiles:i,skippedFiles:c,error:t}}}async function i(e,t){let r=(0,s.join)(t,e),n=(0,s.join)(r,".mock"),i=[],c=[];try{try{await o.promises.access(n),c.push(".mock")}catch{await o.promises.mkdir(n,{recursive:!0}),i.push(".mock")}return{success:!0,createdDirectories:i,skippedDirectories:c}}catch(r){let t=r instanceof Error?r.message:String(r);return console.error(`在为项目 ${e} 创建Mock目录时出错:`,r),{success:!1,createdDirectories:i,skippedDirectories:c,error:t}}}async function c(e,t,r,n){try{let i=r.envs[t];if(!i)return{success:!1,error:`环境 ${t} 不存在于项目 ${e} 配置中`};if(!i.envFileName||!i.proxyKey)return{success:!1,error:`环境 ${t} 缺少 envFileName 或 proxyKey 配置`};let c=(0,s.join)(n,e),a=(0,s.join)(c,i.envFileName),l=i.proxyEnv[i.currentProxy]||i.currentProxy,p=`${i.proxyKey}=${l}`;return await o.promises.writeFile(a,p,"utf-8"),console.log(`已更新环境文件: ${a}, 内容: ${p}`),{success:!0,updatedFile:i.envFileName}}catch(o){let r=o instanceof Error?o.message:String(o);return console.error(`更新项目 ${e} 环境 ${t} 的环境文件时出错:`,o),{success:!1,error:r}}}},94722:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({sseConnectionManager:()=>r});class t{connections=new Map;encoder=new TextEncoder;heartbeatInterval=null;HEARTBEAT_INTERVAL=3e4;CONNECTION_TIMEOUT=12e4;constructor(){this.startHeartbeat()}addConnection(e,t,r){console.log(`[SSE] 添加连接: 环境=${e}, 客户端=${r}`);let o={controller:t,timestamp:Date.now(),clientId:r,envName:e};this.connections.has(e)||this.connections.set(e,new Set),this.connections.get(e).add(o),this.sendToConnection(o,{type:"heartbeat",timestamp:Date.now()}),console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}removeConnection(e,t){console.log(`[SSE] 移除连接: 环境=${e}, 客户端=${t}`);let r=this.connections.get(e);if(r){let o=Array.from(r).find(e=>e.clientId===t);o&&(r.delete(o),0===r.size&&this.connections.delete(e))}console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}broadcastToEnv(e,t){console.log(`[SSE] 向环境 ${e} 广播配置变化消息`);let r=this.connections.get(e);if(!r||0===r.size)return void console.log(`[SSE] 环境 ${e} 没有活跃连接,跳过广播`);let o=[];r.forEach(e=>{try{this.sendToConnection(e,t)}catch(t){console.error(`[SSE] 发送消息到客户端 ${e.clientId} 失败:`,t),o.push(e)}}),o.forEach(e=>{r.delete(e),console.log(`[SSE] 清理无效连接: 客户端=${e.clientId}`)}),console.log(`[SSE] 成功发送给 ${r.size} 个连接`)}sendToConnection(e,t){let r=`data: ${JSON.stringify(t)}
2
-
3
- `,o=this.encoder.encode(r);try{e.controller.enqueue(o),e.timestamp=Date.now()}catch(e){throw console.error(`[SSE] 发送消息失败:`,e),e}}startHeartbeat(){this.heartbeatInterval=setInterval(()=>{this.sendHeartbeat(),this.cleanupStaleConnections()},this.HEARTBEAT_INTERVAL),console.log(`[SSE] 心跳机制已启动,间隔: ${this.HEARTBEAT_INTERVAL}ms`)}sendHeartbeat(){let e={type:"heartbeat",timestamp:Date.now()},t=0;this.connections.forEach(r=>{t+=r.size;let o=[];r.forEach(t=>{try{this.sendToConnection(t,e)}catch{o.push(t)}}),o.forEach(e=>r.delete(e))}),t>0&&console.log(`[SSE] 心跳发送完成,活跃连接数: ${t}`)}cleanupStaleConnections(){let e=Date.now(),t=0;this.connections.forEach((r,o)=>{let s=[];r.forEach(t=>{e-t.timestamp>this.CONNECTION_TIMEOUT&&s.push(t)}),s.forEach(e=>{r.delete(e),t++,console.log(`[SSE] 清理过期连接: 环境=${o}, 客户端=${e.clientId}`)}),0===r.size&&this.connections.delete(o)}),t>0&&console.log(`[SSE] 连接清理完成,清理数量: ${t}`)}getConnectionStats(){let e=[],t=0;return this.connections.forEach((r,o)=>{let s=r.size;t+=s,e.push(`${o}: ${s}`)}),`总计 ${t} 个连接 (${e.join(", ")})`}stop(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null,console.log(`[SSE] 心跳机制已停止`)),this.connections.forEach(e=>{e.forEach(e=>{try{e.controller.close()}catch(e){console.error(`[SSE] 关闭连接失败:`,e)}})}),this.connections.clear(),console.log(`[SSE] 所有连接已关闭`)}}let r=new t;process.on("SIGINT",()=>{console.log("[SSE] 收到退出信号,正在清理连接..."),r.stop(),process.exit(0)}),process.on("SIGTERM",()=>{console.log("[SSE] 收到终止信号,正在清理连接..."),r.stop(),process.exit(0)})}},57606:function(e){var{g:t,__dirname:r,m:o,e:s}=e},67375:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({PUT:()=>a});var o=e.i(15494),s=e.i(35692),n=e.i(15079),i=e.i(88941),c=e.i(94722);async function a(e){try{let{envName:t,projectName:r,selectedItems:a}=await e.json();if(!t||!r||!Array.isArray(a))return o.NextResponse.json({success:!1,error:"缺少必要参数:envName, projectName, selectedItems"},{status:400});let l=await (0,s.getProjectsConfig)();if(!l[r])return o.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});if(!l[r].envs[t])return o.NextResponse.json({success:!1,error:`项目 ${r} 中不存在环境 ${t}`},{status:404});let p=l[r].envs[t].host,u=l[r].envs[t].subApps||[];l[r].envs[t].subApps=a;let g=[];if(a.forEach(e=>{Object.keys(l).forEach(t=>{if(l[t].envs[e]){let r=l[t].envs[e];r.currentProxy="custom",r.proxyEnv.custom=p,g.push({projectName:t,envName:e})}})}),await (0,s.saveProjectsConfig)(l),JSON.stringify(u.sort())!==JSON.stringify(a.sort())){console.log(`[配置变化] 环境 ${t} 的 MicroApp 代理配置发生变化`),console.log(`[配置变化] 变化前: ${JSON.stringify(u)}`),console.log(`[配置变化] 变化后: ${JSON.stringify(a)}`);let e=new Set(u),o=new Set(a),s=a.filter(t=>!e.has(t)),n=u.filter(e=>!o.has(e)),i={type:"microapp-proxy-config-change",envName:t,timestamp:Date.now(),changes:{before:u,after:a,added:s,removed:n},projectName:r,message:`环境 ${t} 的 MicroApp 代理配置已更新`};try{c.sseConnectionManager.broadcastToEnv(t,i),console.log(`[推送成功] 已向环境 ${t} 推送配置变化通知`)}catch(e){console.error(`[推送失败] 向环境 ${t} 推送通知失败:`,e)}}else console.log(`[配置未变化] 环境 ${t} 的 MicroApp 代理配置无变化,跳过推送`);let h=(await Promise.allSettled(g.map(async({projectName:e,envName:t})=>(0,n.updateProjectEnvFile)(e,t,l[e],i.WORKSPACE_CONFIG.WORKSPACE_ROOT)))).map((e,t)=>({result:e,project:g[t]})).filter(({result:e})=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success),m="MicroApp代理配置保存成功,已更新选中环境的代理地址";return h.length>0&&(m+=`,但有 ${h.length} 个环境文件更新失败`),o.NextResponse.json({success:!0,message:m,data:{projectName:r,envName:t,subApps:a,currentHost:p,updatedProjects:g.length,envFileUpdateFailures:h.length}})}catch(t){let e=t instanceof Error?t.message:"保存MicroApp代理配置失败";return console.error("保存MicroApp代理配置失败:",t),o.NextResponse.json({success:!1,error:e},{status:500})}}},30280:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>c,routeModule:()=>t,serverHooks:()=>l,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>a});var o=e.i(45746),s=e.i(93828),n=e.i(18250),i=e.i(67375);let t=new o.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/microapp-proxy-config/route",pathname:"/api/microapp-proxy-config",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/microapp-proxy-config/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:r,workUnitAsyncStorage:a,serverHooks:l}=t;function c(){return(0,n.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:a})}}}};
4
-
5
- //# sourceMappingURL=%5Broot-of-the-server%5D__fefd40ba._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/lib/workspace-types.ts","turbopack:///[project]/packages/server/src/lib/workspace-config.ts","turbopack:///[project]/packages/server/src/lib/env-file-operations.ts","turbopack:///[project]/packages/server/src/lib/sse-connection-manager.ts","turbopack:///[project]/packages/server/src/app/api/microapp-proxy-config/route.ts","turbopack:///[project]/node_modules/.pnpm/next@15.3.4_react-dom@19.1.0_react@19.1.0__react@19.1.0/node_modules/next/dist/src/build/templates/app-route.ts"],"sourcesContent":["import { homedir, cpus } from 'os';\nimport { join } from 'path';\n\n/**\n * 工作空间配置常量\n */\nexport const WORKSPACE_CONFIG = {\n // 工作空间根目录路径\n WORKSPACE_ROOT: join(homedir(), 'Documents', 'prime-workspace'),\n\n // Git 操作超时时间 (毫秒)\n GIT_TIMEOUT: 300000, // 5分钟\n\n // 最大并发克隆数量(基于CPU核心数,最小2个,最大8个)\n MAX_CONCURRENT_CLONES: Math.max(2, Math.min(cpus().length, 8)),\n\n // 重试次数限制\n MAX_RETRY_ATTEMPTS: 3,\n} as const;\n\nexport const PROJECT_CONFIG_PATH = join(homedir(), '.prime-projects.json');\n\nexport interface ProjectConfig {\n repo: string;\n mockingIntercept?: boolean;\n mockOpen?: boolean;\n envs: {\n [envName: string]: {\n host: string;\n currentProxy: string;\n proxyEnv: {\n [key: string]: string;\n };\n envFileName: string;\n proxyKey: string;\n subApps?: string[];\n };\n };\n}\n\nexport interface ProjectsConfig {\n [projectName: string]: ProjectConfig;\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n INCOMPLETE = 'incomplete', // 不完整的项目,需要清理\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n onLog?: (projectName: string, logType: 'stdout' | 'stderr' | 'progress', content: string) => void;\n} ","import { readFile, writeFile, access, constants, rename } from 'fs/promises';\nimport type { ProjectsConfig } from './workspace-types';\nimport { PROJECT_CONFIG_PATH } from './workspace-types';\n\n/**\n * 读取并解析项目配置文件\n * @returns {Promise<ProjectsConfig>} 项目配置对象\n */\nexport async function getProjectsConfig(): Promise<ProjectsConfig> {\n try {\n await access(PROJECT_CONFIG_PATH, constants.F_OK);\n } catch {\n // 文件不存在,创建并写入空对象\n await saveProjectsConfig({});\n return {};\n }\n\n try {\n const configContent = await readFile(PROJECT_CONFIG_PATH, 'utf-8');\n // 如果文件为空,返回空对象\n if (!configContent) {\n return {};\n }\n return JSON.parse(configContent);\n } catch (error) {\n console.error('读取或解析项目配置文件失败:', error);\n // 在出错时返回空对象或抛出错误,这里选择抛出以通知调用者\n throw new Error('无法加载项目配置');\n }\n}\n\n/**\n * 将项目配置写入文件(原子操作)\n * @param {ProjectsConfig} config - 要保存的配置对象\n */\nexport async function saveProjectsConfig(config: ProjectsConfig): Promise<void> {\n const tempConfigPath = PROJECT_CONFIG_PATH + '.tmp';\n try {\n await writeFile(tempConfigPath, JSON.stringify(config, null, 2), 'utf-8');\n await rename(tempConfigPath, PROJECT_CONFIG_PATH);\n } catch (error) {\n console.error('保存项目配置文件失败:', error);\n throw new Error('无法保存项目配置');\n }\n}\n\n/**\n * 项目状态枚举\n */\nexport enum ProjectStatus {\n PENDING = 'pending',\n EXISTING = 'existing',\n CLONING = 'cloning',\n SUCCESS = 'success',\n FAILED = 'failed',\n RETRYING = 'retrying',\n}\n\n/**\n * 项目进度信息接口\n */\nexport interface ProjectProgress {\n projectName: string;\n status: ProjectStatus;\n progress: number; // 0-100\n message: string;\n error?: string;\n startTime?: number;\n endTime?: number;\n}\n\n/**\n * 初始化结果接口\n */\nexport interface InitializationResult {\n success: boolean;\n totalProjects: number;\n successCount: number;\n failedCount: number;\n failedProjects: string[];\n workspacePath: string;\n duration: number;\n}\n\n/**\n * Git 操作配置接口\n */\nexport interface GitOperationConfig {\n repoUrl: string;\n targetDir: string;\n timeout: number;\n onProgress?: (progress: number, message: string) => void;\n onError?: (error: string) => void;\n}","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { ProjectConfig } from './workspace-types';\n\n/**\n * 为指定项目创建环境文件,如果文件已存在则跳过。\n * @param projectName - 项目名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 一个包含已创建和已跳过文件列表的对象\n */\nexport async function createProjectEnvFiles(\n projectName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdFiles: string[];\n skippedFiles: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const createdFiles: string[] = [];\n const skippedFiles: string[] = [];\n\n try {\n const envs = projectConfig.envs || {};\n for (const envName in envs) {\n const envConfig = envs[envName];\n if (envConfig.envFileName && envConfig.proxyKey) {\n const filePath = join(projectPath, envConfig.envFileName);\n \n try {\n await fs.access(filePath);\n // 文件已存在,跳过\n skippedFiles.push(envConfig.envFileName);\n } catch {\n // 文件不存在,创建它\n const currentProxyUrl = envConfig.proxyEnv[envConfig.currentProxy] || '';\n const content = `${envConfig.proxyKey}=${currentProxyUrl}`;\n await fs.writeFile(filePath, content, 'utf-8');\n createdFiles.push(envConfig.envFileName);\n }\n }\n }\n return { success: true, createdFiles, skippedFiles };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建环境文件时出错:`, error);\n return { success: false, createdFiles, skippedFiles, error: errorMessage };\n }\n}\n\n/**\n * 为指定项目创建.mock文件夹\n * @param projectName - 项目名称\n * @param workspacePath - 工作空间根路径\n * @returns 创建结果\n */\nexport async function createProjectMockDirectories(\n projectName: string,\n workspacePath: string,\n): Promise<{\n success: boolean;\n createdDirectories: string[];\n skippedDirectories: string[];\n error?: string;\n}> {\n const projectPath = join(workspacePath, projectName);\n const mockPath = join(projectPath, '.mock');\n const createdDirectories: string[] = [];\n const skippedDirectories: string[] = [];\n\n try {\n // 创建 .mock 文件夹\n try {\n await fs.access(mockPath);\n skippedDirectories.push('.mock');\n } catch {\n await fs.mkdir(mockPath, { recursive: true });\n createdDirectories.push('.mock');\n }\n\n return { success: true, createdDirectories, skippedDirectories };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`在为项目 ${projectName} 创建Mock目录时出错:`, error);\n return { success: false, createdDirectories, skippedDirectories, error: errorMessage };\n }\n}\n\n/**\n * 更新指定项目环境的环境文件内容\n * @param projectName - 项目名称\n * @param envName - 环境名称\n * @param projectConfig - 项目配置\n * @param workspacePath - 工作空间根路径\n * @returns 更新结果\n */\nexport async function updateProjectEnvFile(\n projectName: string,\n envName: string,\n projectConfig: ProjectConfig,\n workspacePath: string,\n): Promise<{\n success: boolean;\n updatedFile?: string;\n error?: string;\n}> {\n try {\n const envConfig = projectConfig.envs[envName];\n \n if (!envConfig) {\n return {\n success: false,\n error: `环境 ${envName} 不存在于项目 ${projectName} 配置中`,\n };\n }\n\n if (!envConfig.envFileName || !envConfig.proxyKey) {\n return {\n success: false,\n error: `环境 ${envName} 缺少 envFileName 或 proxyKey 配置`,\n };\n }\n\n const projectPath = join(workspacePath, projectName);\n const filePath = join(projectPath, envConfig.envFileName);\n \n // 获取当前代理URL\n const currentProxyUrl = envConfig.proxyEnv[envConfig.currentProxy] || envConfig.currentProxy;\n const content = `${envConfig.proxyKey}=${currentProxyUrl}`;\n \n // 写入文件内容\n await fs.writeFile(filePath, content, 'utf-8');\n \n console.log(`已更新环境文件: ${filePath}, 内容: ${content}`);\n \n return {\n success: true,\n updatedFile: envConfig.envFileName,\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n console.error(`更新项目 ${projectName} 环境 ${envName} 的环境文件时出错:`, error);\n return {\n success: false,\n error: errorMessage,\n };\n }\n} ","/**\n * SSE连接管理器\n * 用于管理MicroApp代理配置变化推送的SSE连接\n */\n\nexport interface ConnectionInfo {\n controller: ReadableStreamDefaultController<Uint8Array>;\n timestamp: number;\n clientId: string;\n envName: string;\n}\n\nexport interface ConfigChangeMessage {\n type: 'microapp-proxy-config-change';\n envName: string;\n timestamp: number;\n changes: {\n before: string[];\n after: string[];\n added: string[];\n removed: string[];\n };\n projectName: string;\n message: string;\n}\n\nexport interface HeartbeatMessage {\n type: 'heartbeat';\n timestamp: number;\n}\n\ntype SSEMessage = ConfigChangeMessage | HeartbeatMessage;\n\n/**\n * SSE连接管理器类\n */\nclass SSEConnectionManager {\n private connections = new Map<string, Set<ConnectionInfo>>();\n private encoder = new TextEncoder();\n private heartbeatInterval: NodeJS.Timeout | null = null;\n private readonly HEARTBEAT_INTERVAL = 30000; // 30秒心跳\n private readonly CONNECTION_TIMEOUT = 120000; // 2分钟连接超时\n\n constructor() {\n this.startHeartbeat();\n }\n\n /**\n * 添加新的SSE连接\n */\n addConnection(envName: string, controller: ReadableStreamDefaultController<Uint8Array>, clientId: string): void {\n console.log(`[SSE] 添加连接: 环境=${envName}, 客户端=${clientId}`);\n \n const connectionInfo: ConnectionInfo = {\n controller,\n timestamp: Date.now(),\n clientId,\n envName,\n };\n\n if (!this.connections.has(envName)) {\n this.connections.set(envName, new Set());\n }\n \n this.connections.get(envName)!.add(connectionInfo);\n \n // 发送连接确认消息\n this.sendToConnection(connectionInfo, {\n type: 'heartbeat',\n timestamp: Date.now(),\n });\n\n console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`);\n }\n\n /**\n * 移除SSE连接\n */\n removeConnection(envName: string, clientId: string): void {\n console.log(`[SSE] 移除连接: 环境=${envName}, 客户端=${clientId}`);\n \n const connections = this.connections.get(envName);\n if (connections) {\n const connectionToRemove = Array.from(connections).find(conn => conn.clientId === clientId);\n if (connectionToRemove) {\n connections.delete(connectionToRemove);\n \n // 如果该环境没有连接了,删除整个entry\n if (connections.size === 0) {\n this.connections.delete(envName);\n }\n }\n }\n\n console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`);\n }\n\n /**\n * 向指定环境广播消息\n */\n broadcastToEnv(envName: string, message: ConfigChangeMessage): void {\n console.log(`[SSE] 向环境 ${envName} 广播配置变化消息`);\n \n const connections = this.connections.get(envName);\n if (!connections || connections.size === 0) {\n console.log(`[SSE] 环境 ${envName} 没有活跃连接,跳过广播`);\n return;\n }\n\n const deadConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n try {\n this.sendToConnection(connectionInfo, message);\n } catch (error) {\n console.error(`[SSE] 发送消息到客户端 ${connectionInfo.clientId} 失败:`, error);\n deadConnections.push(connectionInfo);\n }\n });\n\n // 清理无效连接\n deadConnections.forEach(conn => {\n connections.delete(conn);\n console.log(`[SSE] 清理无效连接: 客户端=${conn.clientId}`);\n });\n\n console.log(`[SSE] 成功发送给 ${connections.size} 个连接`);\n }\n\n /**\n * 向单个连接发送消息\n */\n private sendToConnection(connectionInfo: ConnectionInfo, message: SSEMessage): void {\n const data = `data: ${JSON.stringify(message)}\\n\\n`;\n const encodedData = this.encoder.encode(data);\n \n try {\n connectionInfo.controller.enqueue(encodedData);\n connectionInfo.timestamp = Date.now(); // 更新最后活跃时间\n } catch (error) {\n console.error(`[SSE] 发送消息失败:`, error);\n throw error;\n }\n }\n\n /**\n * 启动心跳机制\n */\n private startHeartbeat(): void {\n this.heartbeatInterval = setInterval(() => {\n this.sendHeartbeat();\n this.cleanupStaleConnections();\n }, this.HEARTBEAT_INTERVAL);\n \n console.log(`[SSE] 心跳机制已启动,间隔: ${this.HEARTBEAT_INTERVAL}ms`);\n }\n\n /**\n * 发送心跳消息\n */\n private sendHeartbeat(): void {\n const heartbeatMessage: HeartbeatMessage = {\n type: 'heartbeat',\n timestamp: Date.now(),\n };\n\n let totalConnections = 0;\n this.connections.forEach((connections) => {\n totalConnections += connections.size;\n const deadConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n try {\n this.sendToConnection(connectionInfo, heartbeatMessage);\n } catch {\n deadConnections.push(connectionInfo);\n }\n });\n\n // 清理无效连接\n deadConnections.forEach(conn => connections.delete(conn));\n });\n\n if (totalConnections > 0) {\n console.log(`[SSE] 心跳发送完成,活跃连接数: ${totalConnections}`);\n }\n }\n\n /**\n * 清理过期连接\n */\n private cleanupStaleConnections(): void {\n const now = Date.now();\n let cleanedCount = 0;\n\n this.connections.forEach((connections, envName) => {\n const staleConnections: ConnectionInfo[] = [];\n \n connections.forEach(connectionInfo => {\n if (now - connectionInfo.timestamp > this.CONNECTION_TIMEOUT) {\n staleConnections.push(connectionInfo);\n }\n });\n\n staleConnections.forEach(conn => {\n connections.delete(conn);\n cleanedCount++;\n console.log(`[SSE] 清理过期连接: 环境=${envName}, 客户端=${conn.clientId}`);\n });\n\n // 如果该环境没有连接了,删除整个entry\n if (connections.size === 0) {\n this.connections.delete(envName);\n }\n });\n\n if (cleanedCount > 0) {\n console.log(`[SSE] 连接清理完成,清理数量: ${cleanedCount}`);\n }\n }\n\n /**\n * 获取连接统计信息\n */\n getConnectionStats(): string {\n const stats: string[] = [];\n let totalConnections = 0;\n \n this.connections.forEach((connections, envName) => {\n const count = connections.size;\n totalConnections += count;\n stats.push(`${envName}: ${count}`);\n });\n\n return `总计 ${totalConnections} 个连接 (${stats.join(', ')})`;\n }\n\n /**\n * 停止连接管理器\n */\n stop(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n console.log(`[SSE] 心跳机制已停止`);\n }\n\n // 关闭所有连接\n this.connections.forEach((connections) => {\n connections.forEach(connectionInfo => {\n try {\n connectionInfo.controller.close();\n } catch (error) {\n console.error(`[SSE] 关闭连接失败:`, error);\n }\n });\n });\n\n this.connections.clear();\n console.log(`[SSE] 所有连接已关闭`);\n }\n}\n\n// 创建全局实例\nexport const sseConnectionManager = new SSEConnectionManager();\n\n// 在进程退出时清理资源\nprocess.on('SIGINT', () => {\n console.log('[SSE] 收到退出信号,正在清理连接...');\n sseConnectionManager.stop();\n process.exit(0);\n});\n\nprocess.on('SIGTERM', () => {\n console.log('[SSE] 收到终止信号,正在清理连接...');\n sseConnectionManager.stop();\n process.exit(0);\n}); ","import { NextRequest, NextResponse } from 'next/server';\nimport {\n getProjectsConfig,\n saveProjectsConfig,\n} from '@/lib/workspace-config';\nimport { updateProjectEnvFile } from '@/lib/env-file-operations';\nimport { WORKSPACE_CONFIG } from '@/lib/workspace-types';\nimport { sseConnectionManager } from '@/lib/sse-connection-manager';\nimport type { ConfigChangeMessage } from '@/lib/sse-connection-manager';\n\nexport async function PUT(request: NextRequest) {\n try {\n // 解析请求体\n const { envName, projectName, selectedItems } = await request.json();\n\n // 参数验证\n if (!envName || !projectName || !Array.isArray(selectedItems)) {\n return NextResponse.json(\n {\n success: false,\n error: '缺少必要参数:envName, projectName, selectedItems',\n },\n { status: 400 },\n );\n }\n\n // 读取当前配置文件\n const projectsConfig = await getProjectsConfig();\n\n // 检查项目是否存在\n if (!projectsConfig[projectName]) {\n return NextResponse.json(\n { success: false, error: `项目 ${projectName} 不存在` },\n { status: 404 },\n );\n }\n\n // 检查环境是否存在\n if (!projectsConfig[projectName].envs[envName]) {\n return NextResponse.json(\n {\n success: false,\n error: `项目 ${projectName} 中不存在环境 ${envName}`,\n },\n { status: 404 },\n );\n }\n\n // 获取当前环境的host\n const currentHost = projectsConfig[projectName].envs[envName].host;\n\n // 保存更新前的配置用于变化检测\n const beforeSubApps = projectsConfig[projectName].envs[envName].subApps || [];\n\n // 更新 subApps 配置\n projectsConfig[projectName].envs[envName].subApps = selectedItems;\n\n // 记录更新的项目和环境,用于后续更新环境文件\n const updatedProjects: Array<{projectName: string, envName: string}> = [];\n\n // 将选中的环境的代理改为当前环境的host\n selectedItems.forEach((selectedEnvName: string) => {\n // 遍历所有项目,找到包含该环境的项目并更新其代理配置\n Object.keys(projectsConfig).forEach(projName => {\n if (projectsConfig[projName].envs[selectedEnvName]) {\n // 找到匹配的环境,更新其代理配置\n const targetEnv = projectsConfig[projName].envs[selectedEnvName];\n \n // 将选中环境的代理设置为custom,并指向当前环境的host\n targetEnv.currentProxy = 'custom';\n targetEnv.proxyEnv.custom = currentHost;\n \n // 记录需要更新环境文件的项目和环境\n updatedProjects.push({\n projectName: projName,\n envName: selectedEnvName\n });\n }\n });\n });\n\n // 保存更新后的配置\n await saveProjectsConfig(projectsConfig);\n\n // 检测配置变化并推送通知\n const afterSubApps = selectedItems;\n const hasChanges = JSON.stringify(beforeSubApps.sort()) !== JSON.stringify(afterSubApps.sort());\n \n if (hasChanges) {\n console.log(`[配置变化] 环境 ${envName} 的 MicroApp 代理配置发生变化`);\n console.log(`[配置变化] 变化前: ${JSON.stringify(beforeSubApps)}`);\n console.log(`[配置变化] 变化后: ${JSON.stringify(afterSubApps)}`);\n\n // 计算具体变化\n const beforeSet = new Set(beforeSubApps);\n const afterSet = new Set(afterSubApps);\n const added = afterSubApps.filter(item => !beforeSet.has(item));\n const removed = beforeSubApps.filter(item => !afterSet.has(item));\n\n // 构建推送消息\n const changeMessage: ConfigChangeMessage = {\n type: 'microapp-proxy-config-change',\n envName,\n timestamp: Date.now(),\n changes: {\n before: beforeSubApps,\n after: afterSubApps,\n added,\n removed,\n },\n projectName,\n message: `环境 ${envName} 的 MicroApp 代理配置已更新`\n };\n\n // 推送给相关环境的连接\n try {\n sseConnectionManager.broadcastToEnv(envName, changeMessage);\n console.log(`[推送成功] 已向环境 ${envName} 推送配置变化通知`);\n } catch (pushError) {\n console.error(`[推送失败] 向环境 ${envName} 推送通知失败:`, pushError);\n // 推送失败不影响主要功能,只记录错误\n }\n } else {\n console.log(`[配置未变化] 环境 ${envName} 的 MicroApp 代理配置无变化,跳过推送`);\n }\n\n // 更新相关项目的环境文件\n const envFileUpdates = await Promise.allSettled(\n updatedProjects.map(async ({ projectName: projName, envName: envNameToUpdate }) => {\n return updateProjectEnvFile(\n projName,\n envNameToUpdate,\n projectsConfig[projName],\n WORKSPACE_CONFIG.WORKSPACE_ROOT,\n );\n })\n );\n\n // 检查环境文件更新结果\n const failedUpdates = envFileUpdates\n .map((result, index) => ({ result, project: updatedProjects[index] }))\n .filter(({ result }) => result.status === 'rejected' || (result.status === 'fulfilled' && !result.value.success));\n\n // 构建响应消息\n let message = 'MicroApp代理配置保存成功,已更新选中环境的代理地址';\n if (failedUpdates.length > 0) {\n message += `,但有 ${failedUpdates.length} 个环境文件更新失败`;\n }\n\n return NextResponse.json({\n success: true,\n message,\n data: {\n projectName,\n envName,\n subApps: selectedItems,\n currentHost,\n updatedProjects: updatedProjects.length,\n envFileUpdateFailures: failedUpdates.length,\n },\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '保存MicroApp代理配置失败';\n console.error('保存MicroApp代理配置失败:', error);\n return NextResponse.json(\n { success: false, error: errorMessage },\n { status: 500 },\n );\n }\n} ","import {\n AppRouteRouteModule,\n type AppRouteRouteModuleOptions,\n} from '../../server/route-modules/app-route/module.compiled'\nimport { RouteKind } from '../../server/route-kind'\nimport { patchFetch as _patchFetch } from '../../server/lib/patch-fetch'\n\nimport * as userland from 'VAR_USERLAND'\n\n// These are injected by the loader afterwards. This is injected as a variable\n// instead of a replacement because this could also be `undefined` instead of\n// an empty string.\ndeclare const nextConfigOutput: AppRouteRouteModuleOptions['nextConfigOutput']\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\n// INJECT:nextConfigOutput\n\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: 'VAR_DEFINITION_PAGE',\n pathname: 'VAR_DEFINITION_PATHNAME',\n filename: 'VAR_DEFINITION_FILENAME',\n bundlePath: 'VAR_DEFINITION_BUNDLE_PATH',\n },\n resolvedPagePath: 'VAR_RESOLVED_PAGE_PATH',\n nextConfigOutput,\n userland,\n})\n\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule\n\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage,\n })\n}\n\nexport {\n routeModule,\n workAsyncStorage,\n workUnitAsyncStorage,\n serverHooks,\n patchFetch,\n}\n"],"names":["AppRouteRouteModule","RouteKind","patchFetch","_patchFetch","userland","routeModule","definition","kind","APP_ROUTE","page","pathname","filename","bundlePath","resolvedPagePath","nextConfigOutput","workAsyncStorage","workUnitAsyncStorage","serverHooks"],"mappings":"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","ignoreList":[5]}
@@ -1,3 +0,0 @@
1
- module.exports={30507:a=>{"use strict";var{g:b,__dirname:c}=a;{a.s({default:()=>e,metadata:()=>b});var d=a.i(93200);let b={title:"Create Next App",description:"Generated by create next app"};function e({children:a}){return(0,d.jsx)("html",{lang:"en",children:(0,d.jsx)("body",{children:a})})}}}};
2
-
3
- //# sourceMappingURL=packages_server_src_app_layout_tsx_0712e1b4._.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["turbopack:///[project]/packages/server/src/app/layout.tsx"],"sourcesContent":["import type { Metadata } from \"next\";\n// import { Geist, Geist_Mono } from \"next/font/google\";\nimport \"./globals.css\";\n\n// const geistSans = Geist({\n// variable: \"--font-geist-sans\",\n// subsets: [\"latin\"],\n// });\n\n// const geistMono = Geist_Mono({\n// variable: \"--font-geist-mono\",\n// subsets: [\"latin\"],\n// });\n\nexport const metadata: Metadata = {\n title: \"Create Next App\",\n description: \"Generated by create next app\",\n};\n\nexport default function RootLayout({\n children,\n}: Readonly<{\n children: React.ReactNode;\n}>) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n );\n}\n"],"names":[],"mappings":"oHAcO,IAAM,EAAqB,CAChC,MAAO,kBACP,YAAa,8BACf,EAEe,SAAS,EAAW,UACjC,CAAQ,CAGR,EACA,MACE,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,CAAK,KAAK,cACT,CAAA,EAAA,EAAA,GAAA,EAAC,OAAA,UAAM,KAGb"}