prime-dev-cli 1.0.17 → 1.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/bin/cli.mjs +6 -1
  2. package/dist/server/.next/BUILD_ID +1 -1
  3. package/dist/server/.next/app-build-manifest.json +20 -24
  4. package/dist/server/.next/app-path-routes-manifest.json +4 -0
  5. package/dist/server/.next/build-manifest.json +9 -10
  6. package/dist/server/.next/cache/.rscinfo +1 -1
  7. package/dist/server/.next/cache/.tsbuildinfo +1 -1
  8. package/dist/server/.next/cache/eslint/.cache_1qa5vxt +1 -1
  9. package/dist/server/.next/fallback-build-manifest.json +6 -6
  10. package/dist/server/.next/next-minimal-server.js.nft.json +1 -1
  11. package/dist/server/.next/next-server.js.nft.json +1 -1
  12. package/dist/server/.next/prerender-manifest.json +9 -9
  13. package/dist/server/.next/required-server-files.json +1 -0
  14. package/dist/server/.next/server/app/_not-found/page/app-build-manifest.json +4 -5
  15. package/dist/server/.next/server/app/_not-found/page/build-manifest.json +3 -4
  16. package/dist/server/.next/server/app/_not-found/page.js +1 -1
  17. package/dist/server/.next/server/app/_not-found/page.js.nft.json +1 -1
  18. package/dist/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  19. package/dist/server/.next/server/app/_not-found.html +1 -1
  20. package/dist/server/.next/server/app/_not-found.rsc +2 -2
  21. package/dist/server/.next/server/app/api/admin-status/route/app-build-manifest.json +10 -0
  22. package/dist/server/.next/server/app/api/admin-status/route/app-paths-manifest.json +3 -0
  23. package/dist/server/.next/server/app/api/admin-status/route/build-manifest.json +16 -0
  24. package/dist/server/.next/server/app/api/admin-status/route/next-font-manifest.json +6 -0
  25. package/dist/server/.next/server/app/api/admin-status/route/react-loadable-manifest.json +1 -0
  26. package/dist/server/.next/server/app/api/admin-status/route/server-reference-manifest.json +4 -0
  27. package/dist/server/.next/server/app/api/admin-status/route.js +8 -0
  28. package/dist/server/.next/server/app/api/admin-status/route.js.map +5 -0
  29. package/dist/server/.next/server/app/api/admin-status/route.js.nft.json +1 -0
  30. package/dist/server/.next/server/app/api/admin-status/route_client-reference-manifest.js +2 -0
  31. package/dist/server/.next/server/app/api/all-projects-envs/route/app-build-manifest.json +3 -4
  32. package/dist/server/.next/server/app/api/all-projects-envs/route/build-manifest.json +3 -4
  33. package/dist/server/.next/server/app/api/all-projects-envs/route.js +1 -1
  34. package/dist/server/.next/server/app/api/all-projects-envs/route.js.nft.json +1 -1
  35. package/dist/server/.next/server/app/api/check-mock-intercept/route/app-build-manifest.json +3 -4
  36. package/dist/server/.next/server/app/api/check-mock-intercept/route/build-manifest.json +3 -4
  37. package/dist/server/.next/server/app/api/check-mock-intercept/route.js +1 -1
  38. package/dist/server/.next/server/app/api/check-mock-intercept/route.js.nft.json +1 -1
  39. package/dist/server/.next/server/app/api/check-workspace/route/app-build-manifest.json +3 -4
  40. package/dist/server/.next/server/app/api/check-workspace/route/build-manifest.json +3 -4
  41. package/dist/server/.next/server/app/api/check-workspace/route.js +1 -1
  42. package/dist/server/.next/server/app/api/check-workspace/route.js.nft.json +1 -1
  43. package/dist/server/.next/server/app/api/cleanup-mock/route/app-build-manifest.json +3 -4
  44. package/dist/server/.next/server/app/api/cleanup-mock/route/build-manifest.json +3 -4
  45. package/dist/server/.next/server/app/api/cleanup-mock/route.js +1 -1
  46. package/dist/server/.next/server/app/api/cleanup-mock/route.js.nft.json +1 -1
  47. package/dist/server/.next/server/app/api/cleanup-project/route/app-build-manifest.json +3 -4
  48. package/dist/server/.next/server/app/api/cleanup-project/route/build-manifest.json +3 -4
  49. package/dist/server/.next/server/app/api/cleanup-project/route.js +1 -1
  50. package/dist/server/.next/server/app/api/cleanup-project/route.js.nft.json +1 -1
  51. package/dist/server/.next/server/app/api/current-branch/route/app-build-manifest.json +3 -4
  52. package/dist/server/.next/server/app/api/current-branch/route/build-manifest.json +3 -4
  53. package/dist/server/.next/server/app/api/current-branch/route.js +1 -1
  54. package/dist/server/.next/server/app/api/current-branch/route.js.nft.json +1 -1
  55. package/dist/server/.next/server/app/api/delete-mock-api/route/app-build-manifest.json +3 -4
  56. package/dist/server/.next/server/app/api/delete-mock-api/route/build-manifest.json +3 -4
  57. package/dist/server/.next/server/app/api/delete-mock-api/route.js +1 -1
  58. package/dist/server/.next/server/app/api/delete-mock-api/route.js.nft.json +1 -1
  59. package/dist/server/.next/server/app/api/get-mock-data/route/app-build-manifest.json +3 -4
  60. package/dist/server/.next/server/app/api/get-mock-data/route/build-manifest.json +3 -4
  61. package/dist/server/.next/server/app/api/get-mock-data/route.js +1 -1
  62. package/dist/server/.next/server/app/api/get-mock-data/route.js.nft.json +1 -1
  63. package/dist/server/.next/server/app/api/initialize-workspace/route/app-build-manifest.json +3 -4
  64. package/dist/server/.next/server/app/api/initialize-workspace/route/build-manifest.json +3 -4
  65. package/dist/server/.next/server/app/api/initialize-workspace/route.js +1 -1
  66. package/dist/server/.next/server/app/api/initialize-workspace/route.js.nft.json +1 -1
  67. package/dist/server/.next/server/app/api/memory-status/route/app-build-manifest.json +3 -4
  68. package/dist/server/.next/server/app/api/memory-status/route/build-manifest.json +3 -4
  69. package/dist/server/.next/server/app/api/memory-status/route.js +1 -1
  70. package/dist/server/.next/server/app/api/memory-status/route.js.nft.json +1 -1
  71. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/app-build-manifest.json +3 -4
  72. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route/build-manifest.json +3 -4
  73. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js +1 -1
  74. package/dist/server/.next/server/app/api/microapp-proxy-change-stream/route.js.nft.json +1 -1
  75. package/dist/server/.next/server/app/api/microapp-proxy-config/route/app-build-manifest.json +3 -4
  76. package/dist/server/.next/server/app/api/microapp-proxy-config/route/build-manifest.json +3 -4
  77. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js +1 -1
  78. package/dist/server/.next/server/app/api/microapp-proxy-config/route.js.nft.json +1 -1
  79. package/dist/server/.next/server/app/api/mock-file/route/app-build-manifest.json +3 -4
  80. package/dist/server/.next/server/app/api/mock-file/route/build-manifest.json +3 -4
  81. package/dist/server/.next/server/app/api/mock-file/route.js +1 -1
  82. package/dist/server/.next/server/app/api/mock-file/route.js.nft.json +1 -1
  83. package/dist/server/.next/server/app/api/mock-file-content/route/app-build-manifest.json +3 -4
  84. package/dist/server/.next/server/app/api/mock-file-content/route/build-manifest.json +3 -4
  85. package/dist/server/.next/server/app/api/mock-file-content/route.js +1 -1
  86. package/dist/server/.next/server/app/api/mock-file-content/route.js.nft.json +1 -1
  87. package/dist/server/.next/server/app/api/mock-open-status/route/app-build-manifest.json +3 -4
  88. package/dist/server/.next/server/app/api/mock-open-status/route/build-manifest.json +3 -4
  89. package/dist/server/.next/server/app/api/mock-open-status/route.js +1 -1
  90. package/dist/server/.next/server/app/api/mock-open-status/route.js.nft.json +1 -1
  91. package/dist/server/.next/server/app/api/mock-setting/route/app-build-manifest.json +3 -4
  92. package/dist/server/.next/server/app/api/mock-setting/route/build-manifest.json +3 -4
  93. package/dist/server/.next/server/app/api/mock-setting/route.js +1 -1
  94. package/dist/server/.next/server/app/api/mock-setting/route.js.nft.json +1 -1
  95. package/dist/server/.next/server/app/api/open-all-mock/route/app-build-manifest.json +3 -4
  96. package/dist/server/.next/server/app/api/open-all-mock/route/build-manifest.json +3 -4
  97. package/dist/server/.next/server/app/api/open-all-mock/route.js +1 -1
  98. package/dist/server/.next/server/app/api/open-all-mock/route.js.nft.json +1 -1
  99. package/dist/server/.next/server/app/api/open-project/route/app-build-manifest.json +3 -4
  100. package/dist/server/.next/server/app/api/open-project/route/build-manifest.json +3 -4
  101. package/dist/server/.next/server/app/api/open-project/route.js +1 -1
  102. package/dist/server/.next/server/app/api/open-project/route.js.nft.json +1 -1
  103. package/dist/server/.next/server/app/api/process/logs/route/app-build-manifest.json +3 -4
  104. package/dist/server/.next/server/app/api/process/logs/route/build-manifest.json +3 -4
  105. package/dist/server/.next/server/app/api/process/logs/route.js +1 -1
  106. package/dist/server/.next/server/app/api/process/logs/route.js.nft.json +1 -1
  107. package/dist/server/.next/server/app/api/process/logs/stream/route/app-build-manifest.json +3 -4
  108. package/dist/server/.next/server/app/api/process/logs/stream/route/build-manifest.json +3 -4
  109. package/dist/server/.next/server/app/api/process/logs/stream/route.js +1 -1
  110. package/dist/server/.next/server/app/api/process/logs/stream/route.js.nft.json +1 -1
  111. package/dist/server/.next/server/app/api/process/start/route/app-build-manifest.json +3 -4
  112. package/dist/server/.next/server/app/api/process/start/route/build-manifest.json +3 -4
  113. package/dist/server/.next/server/app/api/process/start/route.js +1 -1
  114. package/dist/server/.next/server/app/api/process/start/route.js.nft.json +1 -1
  115. package/dist/server/.next/server/app/api/process/status/route/app-build-manifest.json +3 -4
  116. package/dist/server/.next/server/app/api/process/status/route/build-manifest.json +3 -4
  117. package/dist/server/.next/server/app/api/process/status/route.js +1 -1
  118. package/dist/server/.next/server/app/api/process/status/route.js.nft.json +1 -1
  119. package/dist/server/.next/server/app/api/project-config/route/app-build-manifest.json +3 -4
  120. package/dist/server/.next/server/app/api/project-config/route/build-manifest.json +3 -4
  121. package/dist/server/.next/server/app/api/project-config/route.js +1 -1
  122. package/dist/server/.next/server/app/api/project-config/route.js.nft.json +1 -1
  123. package/dist/server/.next/server/app/api/retry-project/route/app-build-manifest.json +3 -4
  124. package/dist/server/.next/server/app/api/retry-project/route/build-manifest.json +3 -4
  125. package/dist/server/.next/server/app/api/retry-project/route.js +1 -1
  126. package/dist/server/.next/server/app/api/retry-project/route.js.nft.json +1 -1
  127. package/dist/server/.next/server/app/api/uat-git-flow/abort/route/app-build-manifest.json +10 -0
  128. package/dist/server/.next/server/app/api/uat-git-flow/abort/route/app-paths-manifest.json +3 -0
  129. package/dist/server/.next/server/app/api/uat-git-flow/abort/route/build-manifest.json +16 -0
  130. package/dist/server/.next/server/app/api/uat-git-flow/abort/route/next-font-manifest.json +6 -0
  131. package/dist/server/.next/server/app/api/uat-git-flow/abort/route/react-loadable-manifest.json +1 -0
  132. package/dist/server/.next/server/app/api/uat-git-flow/abort/route/server-reference-manifest.json +4 -0
  133. package/dist/server/.next/server/app/api/uat-git-flow/abort/route.js +8 -0
  134. package/dist/server/.next/server/app/api/uat-git-flow/abort/route.js.map +5 -0
  135. package/dist/server/.next/server/app/api/uat-git-flow/abort/route.js.nft.json +1 -0
  136. package/dist/server/.next/server/app/api/uat-git-flow/abort/route_client-reference-manifest.js +2 -0
  137. package/dist/server/.next/server/app/api/uat-git-flow/route/app-build-manifest.json +10 -0
  138. package/dist/server/.next/server/app/api/uat-git-flow/route/app-paths-manifest.json +3 -0
  139. package/dist/server/.next/server/app/api/uat-git-flow/route/build-manifest.json +16 -0
  140. package/dist/server/.next/server/app/api/uat-git-flow/route/next-font-manifest.json +6 -0
  141. package/dist/server/.next/server/app/api/uat-git-flow/route/react-loadable-manifest.json +1 -0
  142. package/dist/server/.next/server/app/api/uat-git-flow/route/server-reference-manifest.json +4 -0
  143. package/dist/server/.next/server/app/api/uat-git-flow/route.js +9 -0
  144. package/dist/server/.next/server/app/api/uat-git-flow/route.js.map +5 -0
  145. package/dist/server/.next/server/app/api/uat-git-flow/route.js.nft.json +1 -0
  146. package/dist/server/.next/server/app/api/uat-git-flow/route_client-reference-manifest.js +2 -0
  147. package/dist/server/.next/server/app/api/uat-git-flow/step/route/app-build-manifest.json +10 -0
  148. package/dist/server/.next/server/app/api/uat-git-flow/step/route/app-paths-manifest.json +3 -0
  149. package/dist/server/.next/server/app/api/uat-git-flow/step/route/build-manifest.json +16 -0
  150. package/dist/server/.next/server/app/api/uat-git-flow/step/route/next-font-manifest.json +6 -0
  151. package/dist/server/.next/server/app/api/uat-git-flow/step/route/react-loadable-manifest.json +1 -0
  152. package/dist/server/.next/server/app/api/uat-git-flow/step/route/server-reference-manifest.json +4 -0
  153. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js +9 -0
  154. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.map +5 -0
  155. package/dist/server/.next/server/app/api/uat-git-flow/step/route.js.nft.json +1 -0
  156. package/dist/server/.next/server/app/api/uat-git-flow/step/route_client-reference-manifest.js +2 -0
  157. package/dist/server/.next/server/app/api/workspace/create/route/app-build-manifest.json +3 -4
  158. package/dist/server/.next/server/app/api/workspace/create/route/build-manifest.json +3 -4
  159. package/dist/server/.next/server/app/api/workspace/create/route.js +1 -1
  160. package/dist/server/.next/server/app/api/workspace/create/route.js.nft.json +1 -1
  161. package/dist/server/.next/server/app/configuration/page/app-build-manifest.json +6 -7
  162. package/dist/server/.next/server/app/configuration/page/build-manifest.json +3 -4
  163. package/dist/server/.next/server/app/configuration/page.js +1 -1
  164. package/dist/server/.next/server/app/configuration/page.js.nft.json +1 -1
  165. package/dist/server/.next/server/app/configuration/page_client-reference-manifest.js +1 -1
  166. package/dist/server/.next/server/app/configuration.html +1 -1
  167. package/dist/server/.next/server/app/configuration.rsc +3 -3
  168. package/dist/server/.next/server/app/favicon.ico/route/app-build-manifest.json +3 -4
  169. package/dist/server/.next/server/app/favicon.ico/route/build-manifest.json +3 -4
  170. package/dist/server/.next/server/app/index.html +1 -1
  171. package/dist/server/.next/server/app/index.rsc +2 -2
  172. package/dist/server/.next/server/app/initialization/page/app-build-manifest.json +6 -7
  173. package/dist/server/.next/server/app/initialization/page/build-manifest.json +3 -4
  174. package/dist/server/.next/server/app/initialization/page.js +1 -1
  175. package/dist/server/.next/server/app/initialization/page.js.nft.json +1 -1
  176. package/dist/server/.next/server/app/initialization/page_client-reference-manifest.js +1 -1
  177. package/dist/server/.next/server/app/initialization.html +1 -1
  178. package/dist/server/.next/server/app/initialization.rsc +3 -3
  179. package/dist/server/.next/server/app/page/app-build-manifest.json +4 -5
  180. package/dist/server/.next/server/app/page/build-manifest.json +3 -4
  181. package/dist/server/.next/server/app/page.js +1 -1
  182. package/dist/server/.next/server/app/page.js.nft.json +1 -1
  183. package/dist/server/.next/server/app/page_client-reference-manifest.js +1 -1
  184. package/dist/server/.next/server/app-paths-manifest.json +4 -0
  185. package/dist/server/.next/server/chunks/{[root-of-the-server]__8fcbb2f0._.js → [root-of-the-server]__0879b2d6._.js} +2 -2
  186. package/dist/server/.next/server/chunks/[root-of-the-server]__0d56f35b._.js +3 -0
  187. package/dist/server/.next/server/chunks/[root-of-the-server]__0d56f35b._.js.map +1 -0
  188. package/dist/server/.next/server/chunks/{[root-of-the-server]__771e8133._.js → [root-of-the-server]__0e8a08fc._.js} +2 -2
  189. package/dist/server/.next/server/chunks/{[root-of-the-server]__21616bf9._.js → [root-of-the-server]__1e792460._.js} +2 -2
  190. package/dist/server/.next/server/chunks/{[root-of-the-server]__03c2b225._.js → [root-of-the-server]__2a29597f._.js} +2 -2
  191. package/dist/server/.next/server/chunks/{[root-of-the-server]__5348b4aa._.js → [root-of-the-server]__2a78acef._.js} +2 -2
  192. package/dist/server/.next/server/chunks/{[root-of-the-server]__5100a0c5._.js → [root-of-the-server]__2f8b52da._.js} +2 -2
  193. package/dist/server/.next/server/chunks/{[root-of-the-server]__3dfc0dc4._.js → [root-of-the-server]__2ffbf0d3._.js} +2 -2
  194. package/dist/server/.next/server/chunks/{[root-of-the-server]__899d82eb._.js → [root-of-the-server]__452b5f9c._.js} +2 -2
  195. package/dist/server/.next/server/chunks/[root-of-the-server]__4ab3dd83._.js +16 -0
  196. package/dist/server/.next/server/chunks/[root-of-the-server]__4ab3dd83._.js.map +1 -0
  197. package/dist/server/.next/server/chunks/{[root-of-the-server]__2fcc7175._.js → [root-of-the-server]__4b595942._.js} +2 -2
  198. package/dist/server/.next/server/chunks/{[root-of-the-server]__973c48a6._.js → [root-of-the-server]__4ec3205b._.js} +2 -2
  199. package/dist/server/.next/server/chunks/{[root-of-the-server]__072f5c45._.js → [root-of-the-server]__4fd52ac1._.js} +2 -2
  200. package/dist/server/.next/server/chunks/{[root-of-the-server]__6e5dc117._.js → [root-of-the-server]__5c9f62f9._.js} +2 -2
  201. package/dist/server/.next/server/chunks/[root-of-the-server]__6cbd50e9._.js +16 -0
  202. package/dist/server/.next/server/chunks/[root-of-the-server]__6cbd50e9._.js.map +1 -0
  203. package/dist/server/.next/server/chunks/[root-of-the-server]__703c317f._.js +3 -0
  204. package/dist/server/.next/server/chunks/[root-of-the-server]__703c317f._.js.map +1 -0
  205. package/dist/server/.next/server/chunks/{[root-of-the-server]__7500acb0._.js → [root-of-the-server]__8637b7f1._.js} +2 -2
  206. package/dist/server/.next/server/chunks/[root-of-the-server]__98088bea._.js +3 -0
  207. package/dist/server/.next/server/chunks/[root-of-the-server]__98088bea._.js.map +1 -0
  208. package/dist/server/.next/server/chunks/{[root-of-the-server]__94e10604._.js → [root-of-the-server]__a6fbefc6._.js} +2 -2
  209. package/dist/server/.next/server/chunks/{[root-of-the-server]__31a13318._.js → [root-of-the-server]__a74239fc._.js} +2 -2
  210. package/dist/server/.next/server/chunks/{[root-of-the-server]__388e6150._.js → [root-of-the-server]__aaa3fe74._.js} +2 -2
  211. package/dist/server/.next/server/chunks/{[root-of-the-server]__7fc974c9._.js → [root-of-the-server]__b176e8df._.js} +2 -2
  212. package/dist/server/.next/server/chunks/{[root-of-the-server]__a292866b._.js → [root-of-the-server]__be14bdb6._.js} +2 -2
  213. package/dist/server/.next/server/chunks/{[root-of-the-server]__f815ea40._.js → [root-of-the-server]__c18498ef._.js} +2 -2
  214. package/dist/server/.next/server/chunks/{[root-of-the-server]__c8b26634._.js → [root-of-the-server]__c9627539._.js} +2 -2
  215. package/dist/server/.next/server/chunks/{[root-of-the-server]__5355b75a._.js → [root-of-the-server]__dda45cac._.js} +2 -2
  216. package/dist/server/.next/server/chunks/[root-of-the-server]__de18efbd._.js +16 -0
  217. package/dist/server/.next/server/chunks/[root-of-the-server]__de18efbd._.js.map +1 -0
  218. package/dist/server/.next/server/chunks/{[root-of-the-server]__2ba93285._.js → [root-of-the-server]__e0b7050d._.js} +2 -2
  219. package/dist/server/.next/server/chunks/{[root-of-the-server]__419d3b16._.js → [root-of-the-server]__ec681197._.js} +2 -2
  220. package/dist/server/.next/server/chunks/_24087f66._.js +3 -0
  221. package/dist/server/.next/server/chunks/_24087f66._.js.map +1 -0
  222. package/dist/server/.next/server/chunks/_61c263b3._.js +3 -0
  223. package/dist/server/.next/server/chunks/_61c263b3._.js.map +1 -0
  224. package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__2e9964e3._.js +3 -0
  225. package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__f617a52d._.js → [root-of-the-server]__7b253128._.js} +2 -2
  226. package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__f617a52d._.js.map → [root-of-the-server]__7b253128._.js.map} +1 -1
  227. package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__c53d10ac._.js → [root-of-the-server]__a085452f._.js} +2 -2
  228. package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__a085452f._.js.map +1 -0
  229. package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__63c188bd._.js → [root-of-the-server]__b8a5c1ab._.js} +2 -2
  230. package/dist/server/.next/server/chunks/ssr/_5579d68f._.js +57 -0
  231. package/dist/server/.next/server/chunks/ssr/_5579d68f._.js.map +1 -0
  232. package/dist/server/.next/server/chunks/ssr/_a1ab1c09._.js +8 -0
  233. package/dist/server/.next/server/chunks/ssr/_a1ab1c09._.js.map +1 -0
  234. package/dist/server/.next/server/chunks/ssr/_ee0c9da0._.js +8 -0
  235. package/dist/server/.next/server/chunks/ssr/_ee0c9da0._.js.map +1 -0
  236. package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js +1 -1
  237. package/dist/server/.next/server/chunks/ssr/packages_server_src_7cef6dbd._.js.map +1 -1
  238. package/dist/server/.next/server/middleware-build-manifest.js +7 -8
  239. package/dist/server/.next/server/pages/404.html +1 -1
  240. package/dist/server/.next/server/pages/500.html +1 -1
  241. package/dist/server/.next/server/pages/_app/build-manifest.json +2 -2
  242. package/dist/server/.next/server/pages/_document.js +1 -1
  243. package/dist/server/.next/server/pages/_document.js.nft.json +1 -1
  244. package/dist/server/.next/server/pages/_error/build-manifest.json +2 -2
  245. package/dist/server/.next/server/pages/_error.js +1 -1
  246. package/dist/server/.next/server/pages/_error.js.nft.json +1 -1
  247. package/dist/server/.next/server/server-reference-manifest.js +1 -1
  248. package/dist/server/.next/server/server-reference-manifest.json +1 -1
  249. package/dist/server/.next/static/chunks/{d65b8ba84ba3d819.js → 1091ba2f3c451a47.js} +1 -1
  250. package/dist/server/.next/static/chunks/{294d677a4838a994.js → 1154a499e8e3867b.js} +1 -1
  251. package/dist/server/.next/static/chunks/{f9ef1d12f3c1646a.js → 1aa036ed62a506c8.js} +2 -2
  252. package/dist/server/.next/static/chunks/205cbae70a6c50e1.js.map +1 -0
  253. package/dist/server/.next/static/chunks/{479d60165927b286.js.map → 2602bf706e977560.js.map} +1 -1
  254. package/dist/server/.next/static/chunks/2d2322acba49236a.js +57 -0
  255. package/dist/server/.next/static/chunks/43c514797c454939.js +7 -0
  256. package/dist/server/.next/static/chunks/511924c894f8e3de.css.map +1 -0
  257. package/dist/server/.next/static/chunks/861aac2fba8d4e28.css +3 -0
  258. package/dist/server/.next/static/chunks/888146b3e75fe817.js.map +1 -0
  259. package/dist/server/.next/static/chunks/9148331cad3a934e.js +7 -0
  260. package/dist/server/.next/static/chunks/{84f5ecdc99cc0be6.js.map → 988047fb36ff8bd4.js.map} +1 -1
  261. package/dist/server/.next/static/chunks/99154153690ad580.js.map +1 -0
  262. package/dist/server/.next/static/chunks/9bc1bbb3fe6e5eb3.js +3 -0
  263. package/dist/server/.next/static/chunks/c4c1da381d908575.js +5 -0
  264. package/dist/server/.next/static/chunks/d8d9344b4a8007c0.js.map +1 -0
  265. package/dist/server/.next/static/chunks/e5e4fd3e83ab66f8.js +4 -0
  266. package/dist/server/.next/static/chunks/e70508cc9f59709d.js.map +1 -0
  267. package/dist/server/.next/static/chunks/pages/_app.js +2 -2
  268. package/dist/server/.next/static/chunks/pages/_error.js +2 -2
  269. package/dist/server/.next/trace +1 -1
  270. package/package.json +1 -1
  271. package/dist/server/.next/server/chunks/[root-of-the-server]__629e6d6a._.js +0 -3
  272. package/dist/server/.next/server/chunks/[root-of-the-server]__629e6d6a._.js.map +0 -1
  273. package/dist/server/.next/server/chunks/[root-of-the-server]__f6d4fb58._.js +0 -16
  274. package/dist/server/.next/server/chunks/[root-of-the-server]__f6d4fb58._.js.map +0 -1
  275. package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__c53d10ac._.js.map +0 -1
  276. package/dist/server/.next/server/chunks/ssr/[root-of-the-server]__e3a2aebd._.js +0 -3
  277. package/dist/server/.next/server/chunks/ssr/_5d353cf8._.js +0 -61
  278. package/dist/server/.next/server/chunks/ssr/_5d353cf8._.js.map +0 -1
  279. package/dist/server/.next/server/chunks/ssr/_e037a20f._.js +0 -4
  280. package/dist/server/.next/server/chunks/ssr/_e037a20f._.js.map +0 -1
  281. package/dist/server/.next/static/chunks/0dfafa95d29e5c79.js +0 -3
  282. package/dist/server/.next/static/chunks/1ad898191df92f90.css +0 -3
  283. package/dist/server/.next/static/chunks/5f8beee58a024d75.js +0 -3
  284. package/dist/server/.next/static/chunks/7e0a49ac2b139df9.js.map +0 -1
  285. package/dist/server/.next/static/chunks/9650e7136a9bfc30.js +0 -61
  286. package/dist/server/.next/static/chunks/a7b45611d4ad55fe.js +0 -4
  287. package/dist/server/.next/static/chunks/a9cba6096fe97a30.js +0 -5
  288. package/dist/server/.next/static/chunks/b0840b8d648f6401.css.map +0 -1
  289. package/dist/server/.next/static/chunks/c2cc02f47cf64419.js.map +0 -1
  290. package/dist/server/.next/static/chunks/cf3b2abf3523d13f.js +0 -3
  291. package/dist/server/.next/static/chunks/d0ab7593ca8c77ca.js.map +0 -1
  292. package/dist/server/.next/static/chunks/f31695470ae3a484.js.map +0 -1
  293. package/dist/server/.next/static/chunks/ffb74809cc596ae9.js.map +0 -1
  294. /package/dist/server/.next/server/chunks/{[root-of-the-server]__8fcbb2f0._.js.map → [root-of-the-server]__0879b2d6._.js.map} +0 -0
  295. /package/dist/server/.next/server/chunks/{[root-of-the-server]__771e8133._.js.map → [root-of-the-server]__0e8a08fc._.js.map} +0 -0
  296. /package/dist/server/.next/server/chunks/{[root-of-the-server]__21616bf9._.js.map → [root-of-the-server]__1e792460._.js.map} +0 -0
  297. /package/dist/server/.next/server/chunks/{[root-of-the-server]__03c2b225._.js.map → [root-of-the-server]__2a29597f._.js.map} +0 -0
  298. /package/dist/server/.next/server/chunks/{[root-of-the-server]__5348b4aa._.js.map → [root-of-the-server]__2a78acef._.js.map} +0 -0
  299. /package/dist/server/.next/server/chunks/{[root-of-the-server]__5100a0c5._.js.map → [root-of-the-server]__2f8b52da._.js.map} +0 -0
  300. /package/dist/server/.next/server/chunks/{[root-of-the-server]__3dfc0dc4._.js.map → [root-of-the-server]__2ffbf0d3._.js.map} +0 -0
  301. /package/dist/server/.next/server/chunks/{[root-of-the-server]__899d82eb._.js.map → [root-of-the-server]__452b5f9c._.js.map} +0 -0
  302. /package/dist/server/.next/server/chunks/{[root-of-the-server]__2fcc7175._.js.map → [root-of-the-server]__4b595942._.js.map} +0 -0
  303. /package/dist/server/.next/server/chunks/{[root-of-the-server]__973c48a6._.js.map → [root-of-the-server]__4ec3205b._.js.map} +0 -0
  304. /package/dist/server/.next/server/chunks/{[root-of-the-server]__072f5c45._.js.map → [root-of-the-server]__4fd52ac1._.js.map} +0 -0
  305. /package/dist/server/.next/server/chunks/{[root-of-the-server]__6e5dc117._.js.map → [root-of-the-server]__5c9f62f9._.js.map} +0 -0
  306. /package/dist/server/.next/server/chunks/{[root-of-the-server]__7500acb0._.js.map → [root-of-the-server]__8637b7f1._.js.map} +0 -0
  307. /package/dist/server/.next/server/chunks/{[root-of-the-server]__94e10604._.js.map → [root-of-the-server]__a6fbefc6._.js.map} +0 -0
  308. /package/dist/server/.next/server/chunks/{[root-of-the-server]__31a13318._.js.map → [root-of-the-server]__a74239fc._.js.map} +0 -0
  309. /package/dist/server/.next/server/chunks/{[root-of-the-server]__388e6150._.js.map → [root-of-the-server]__aaa3fe74._.js.map} +0 -0
  310. /package/dist/server/.next/server/chunks/{[root-of-the-server]__7fc974c9._.js.map → [root-of-the-server]__b176e8df._.js.map} +0 -0
  311. /package/dist/server/.next/server/chunks/{[root-of-the-server]__a292866b._.js.map → [root-of-the-server]__be14bdb6._.js.map} +0 -0
  312. /package/dist/server/.next/server/chunks/{[root-of-the-server]__f815ea40._.js.map → [root-of-the-server]__c18498ef._.js.map} +0 -0
  313. /package/dist/server/.next/server/chunks/{[root-of-the-server]__c8b26634._.js.map → [root-of-the-server]__c9627539._.js.map} +0 -0
  314. /package/dist/server/.next/server/chunks/{[root-of-the-server]__5355b75a._.js.map → [root-of-the-server]__dda45cac._.js.map} +0 -0
  315. /package/dist/server/.next/server/chunks/{[root-of-the-server]__2ba93285._.js.map → [root-of-the-server]__e0b7050d._.js.map} +0 -0
  316. /package/dist/server/.next/server/chunks/{[root-of-the-server]__419d3b16._.js.map → [root-of-the-server]__ec681197._.js.map} +0 -0
  317. /package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__e3a2aebd._.js.map → [root-of-the-server]__2e9964e3._.js.map} +0 -0
  318. /package/dist/server/.next/server/chunks/ssr/{[root-of-the-server]__63c188bd._.js.map → [root-of-the-server]__b8a5c1ab._.js.map} +0 -0
  319. /package/dist/server/.next/static/{Xoig0sIWc0oIgbMH6U6Ew → tz_bf3MbzRijrx8XdXPWA}/_buildManifest.js +0 -0
  320. /package/dist/server/.next/static/{Xoig0sIWc0oIgbMH6U6Ew → tz_bf3MbzRijrx8XdXPWA}/_clientMiddlewareManifest.json +0 -0
  321. /package/dist/server/.next/static/{Xoig0sIWc0oIgbMH6U6Ew → tz_bf3MbzRijrx8XdXPWA}/_ssgManifest.js +0 -0
@@ -1,8 +1,8 @@
1
- module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>n,WORKSPACE_CONFIG:()=>t});var s=e.i(13442),o=e.i(30331);let t={WORKSPACE_ROOT:(0,o.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,o.join)((0,s.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}({})}},29549:function(e){var{g:t,__dirname:r,m:s,e:o}=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:o}=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:o}=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:o}=e;s.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:r,m:s,e:o}=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:o}=e;s.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:r,m:s,e:o}=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:t,__dirname:r,m:s,e:o}=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:()=>n,saveProjectsConfig:()=>i});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(o.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=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,o.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}({})},15650:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("module",()=>require("module"))},21340:function(e){var{g:t,__dirname:r,m:s,e:o}=e},17228:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PUT:()=>c});var s=e.i(15494),o=e.i(83886),n=e.i(30331),i=e.i(35692),a=e.i(88941);let t=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/mock-open-status/route.ts")}`}}.url);async function c(e){try{let{projectName:r,apiName:c,method:u,siteName:p,isOpen:l}=await e.json();if(!r||!c||!u||!p||"boolean"!=typeof l)return s.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, siteName, isOpen"},{status:400});if(!(await (0,i.getProjectsConfig)())[r])return s.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});let m=(0,n.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,r),x=(0,n.join)(m,".mock",c,u.toLowerCase(),"setting.cjs");try{await o.promises.access(x)}catch{return s.NextResponse.json({success:!1,error:"setting.cjs文件不存在"},{status:404})}let g={};try{let e=(0,n.resolve)(x);delete t.cache[e],g=t(e)}catch(e){console.warn(`解析setting.cjs失败: ${x}`,e)}Array.isArray(g.open)||(g.open=[]);let d=g.open,f=d.indexOf(p);l?-1===f&&d.push(p):-1!==f&&d.splice(f,1);let v=`module.exports = {
1
+ module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("fs",()=>require("fs"))},45935:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>n,WORKSPACE_CONFIG:()=>t});var s=e.i(13442),o=e.i(30331);let t={WORKSPACE_ROOT:(0,o.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,o.join)((0,s.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}({})}},30331:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:t,__dirname:r,m:s,e:o}=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:o}=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:o}=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"))},23430:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:t,__dirname:r,m:s,e:o}=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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:t,__dirname:r,m:s,e:o}=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:()=>n,saveProjectsConfig:()=>i});var s=e.i(9892),o=e.i(88941);async function n(){try{await (0,s.access)(o.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}try{let e=await (0,s.readFile)(o.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=o.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(t,o.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}({})},15650:function(e){var{g:t,__dirname:r,m:s,e:o}=e;s.exports=e.x("module",()=>require("module"))},21340:function(e){var{g:t,__dirname:r,m:s,e:o}=e},17228:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PUT:()=>c});var s=e.i(15494),o=e.i(83886),n=e.i(30331),i=e.i(35692),a=e.i(88941);let t=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/mock-open-status/route.ts")}`}}.url);async function c(e){try{let{projectName:r,apiName:c,method:u,siteName:p,isOpen:l}=await e.json();if(!r||!c||!u||!p||"boolean"!=typeof l)return s.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, siteName, isOpen"},{status:400});if(!(await (0,i.getProjectsConfig)())[r])return s.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});let m=(0,n.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,r),x=(0,n.join)(m,".mock",c,u.toLowerCase(),"setting.cjs");try{await o.promises.access(x)}catch{return s.NextResponse.json({success:!1,error:"setting.cjs文件不存在"},{status:404})}let g={};try{let e=(0,n.resolve)(x);delete t.cache[e],g=t(e)}catch(e){console.warn(`解析setting.cjs失败: ${x}`,e)}Array.isArray(g.open)||(g.open=[]);let d=g.open,f=d.indexOf(p);l?-1===f&&d.push(p):-1!==f&&d.splice(f,1);let v=`module.exports = {
2
2
  // 当前场景名称
3
3
  currentSite: '${g.currentSite||p}',
4
4
  // 开启Mock的场景列表
5
5
  open: ${JSON.stringify(d)}
6
6
  };`;return await o.promises.writeFile(x,v,"utf-8"),s.NextResponse.json({success:!0,message:"Mock开启状态更新成功",data:{projectName:r,apiName:c,method:u.toLowerCase(),siteName:p,isOpen:l,openSites:d,filePath:(0,n.join)(".mock",c,u.toLowerCase(),"setting.cjs"),updatedAt:new Date().toISOString()}})}catch(t){let e=t instanceof Error?t.message:"更新Mock开启状态失败";return console.error("更新Mock开启状态失败:",t),s.NextResponse.json({success:!1,error:e},{status:500})}}}},40178:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),o=e.i(93828),n=e.i(18250),i=e.i(17228);let t=new s.AppRouteRouteModule({definition:{kind:o.RouteKind.APP_ROUTE,page:"/api/mock-open-status/route",pathname:"/api/mock-open-status",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/mock-open-status/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,n.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
7
7
 
8
- //# sourceMappingURL=%5Broot-of-the-server%5D__5100a0c5._.js.map
8
+ //# sourceMappingURL=%5Broot-of-the-server%5D__2f8b52da._.js.map
@@ -1,3 +1,3 @@
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"))},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),n=e.i(30331);let r={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},t=(0,n.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}({})}},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"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>i,getProjectsConfig:()=>o,saveProjectsConfig:()=>a});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await a({}),{}}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 a(e){let r=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},85748:function(e){var{g:r,__dirname:t,m:s,e:n}=e},46299:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({GET:()=>a,OPTIONS:()=>o});var s=e.i(15494),n=e.i(35692);async function o(){return new s.NextResponse(null,{status:200,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Max-Age":"86400"}})}async function a(){try{let e=await (0,n.getProjectsConfig)(),r=Object.entries(e).flatMap(([e,r])=>Object.entries(r.envs).map(([t,s])=>({projectName:e,envName:t,host:s.host,repo:r.repo,currentProxy:s.currentProxy,proxyEnv:s.proxyEnv,subApps:s.subApps||[]}))),t=s.NextResponse.json({success:!0,data:r,message:`成功获取 ${r.length} 个环境配置`});return t.headers.set("Access-Control-Allow-Origin","*"),t.headers.set("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),t.headers.set("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),t}catch(t){let e=t instanceof Error?t.message:"获取项目环境配置失败";console.error("获取所有项目环境配置失败:",t);let r=s.NextResponse.json({success:!1,error:e},{status:500});return r.headers.set("Access-Control-Allow-Origin","*"),r.headers.set("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),r.headers.set("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),r}}},22785:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>i,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),a=e.i(46299);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/all-projects-envs/route",pathname:"/api/all-projects-envs",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/all-projects-envs/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function i(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
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"))},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),n=e.i(30331);let r={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},t=(0,n.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}({})}},30331:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:r,__dirname:t,m:s,e:n}=e;s.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({ProjectStatus:()=>i,getProjectsConfig:()=>o,saveProjectsConfig:()=>a});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await a({}),{}}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 a(e){let r=n.PROJECT_CONFIG_PATH+".tmp";try{await (0,s.writeFile)(r,JSON.stringify(e,null,2),"utf-8"),await (0,s.rename)(r,n.PROJECT_CONFIG_PATH)}catch(e){throw console.error("保存项目配置文件失败:",e),Error("无法保存项目配置")}}var i=function(e){return e.PENDING="pending",e.EXISTING="existing",e.CLONING="cloning",e.SUCCESS="success",e.FAILED="failed",e.RETRYING="retrying",e}({})},85748:function(e){var{g:r,__dirname:t,m:s,e:n}=e},46299:e=>{"use strict";var{g:r,__dirname:t}=e;e.s({GET:()=>a,OPTIONS:()=>o});var s=e.i(15494),n=e.i(35692);async function o(){return new s.NextResponse(null,{status:200,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Max-Age":"86400"}})}async function a(){try{let e=await (0,n.getProjectsConfig)(),r=Object.entries(e).flatMap(([e,r])=>Object.entries(r.envs).map(([t,s])=>({projectName:e,envName:t,host:s.host,repo:r.repo,currentProxy:s.currentProxy,proxyEnv:s.proxyEnv,subApps:s.subApps||[]}))),t=s.NextResponse.json({success:!0,data:r,message:`成功获取 ${r.length} 个环境配置`});return t.headers.set("Access-Control-Allow-Origin","*"),t.headers.set("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),t.headers.set("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),t}catch(t){let e=t instanceof Error?t.message:"获取项目环境配置失败";console.error("获取所有项目环境配置失败:",t);let r=s.NextResponse.json({success:!1,error:e},{status:500});return r.headers.set("Access-Control-Allow-Origin","*"),r.headers.set("Access-Control-Allow-Methods","GET, POST, PUT, DELETE, OPTIONS"),r.headers.set("Access-Control-Allow-Headers","Content-Type, Authorization, X-Requested-With"),r}}},22785:e=>{"use strict";var{g:r,__dirname:t}=e;{e.s({patchFetch:()=>i,routeModule:()=>r,serverHooks:()=>p,workAsyncStorage:()=>t,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),a=e.i(46299);let r=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/all-projects-envs/route",pathname:"/api/all-projects-envs",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/all-projects-envs/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:t,workUnitAsyncStorage:c,serverHooks:p}=r;function i(){return(0,o.patchFetch)({workAsyncStorage:t,workUnitAsyncStorage:c})}}}};
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__3dfc0dc4._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__2ffbf0d3._.js.map
@@ -1,4 +1,4 @@
1
- module.exports={88941:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var r=e.i(13442),n=e.i(30331);let t={WORKSPACE_ROOT:(0,n.join)((0,r.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,r.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},s=(0,n.join)((0,r.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}({})}},29549:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});var r=e.i(9892),n=e.i(88941);async function i(){try{await (0,r.access)(n.PROJECT_CONFIG_PATH,r.constants.F_OK)}catch{return await o({}),{}}try{let e=await (0,r.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,r.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,r.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}({})},83886:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var r=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:s,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let p=Date.now(),d={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:p};a?.(0,"开始克隆项目...");let g=(0,i.join)(s,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
1
+ module.exports={88941:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({PROJECT_CONFIG_PATH:()=>s,ProjectStatus:()=>i,WORKSPACE_CONFIG:()=>t});var r=e.i(13442),n=e.i(30331);let t={WORKSPACE_ROOT:(0,n.join)((0,r.homedir)(),"Documents","prime-workspace"),GIT_TIMEOUT:3e5,MAX_CONCURRENT_CLONES:Math.max(2,Math.min((0,r.cpus)().length,8)),MAX_RETRY_ATTEMPTS:3},s=(0,n.join)((0,r.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}({})}},30331:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.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:s,m:r,e:n}=e;r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},23430:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.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"))},13442:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({ProjectStatus:()=>a,getProjectsConfig:()=>i,saveProjectsConfig:()=>o});var r=e.i(9892),n=e.i(88941);async function i(){try{await (0,r.access)(n.PROJECT_CONFIG_PATH,r.constants.F_OK)}catch{return await o({}),{}}try{let e=await (0,r.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,r.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,r.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}({})},83886:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:s,m:r,e:n}=e;r.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var r=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:s,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let p=Date.now(),d={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:p};a?.(0,"开始克隆项目...");let g=(0,i.join)(s,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
2
2
  `),u?.(l,"stdout",`[目标目录] ${g}
3
3
  `),u?.(l,"stdout",`[仓库地址] ${t}
4
4
  `);let f=(0,r.spawn)("git",m,{cwd:s,stdio:["pipe","pipe","pipe"]}),x="",j=0;u?.(l,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
@@ -13,4 +13,4 @@ ${x}
13
13
  `),u?.(l,"stderr",`[错误详情] ${t.stack||"No stack trace"}
14
14
  `);let s={...d,status:o.ProjectStatus.FAILED,progress:j,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};c?.(`${l}: ${t.message}`),e(s)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function l(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function p(e,t){try{let s=(0,i.join)(e,t);if(!(0,n.existsSync)(s))return{exists:!1,status:"not_exists",needsCleanup:!1};let r=(0,i.join)(s,".git");if(!(0,n.existsSync)(r))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(s))return console.log(`检测到不完整的Git仓库: ${s}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function d(e,t){return"complete"===(await p(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let s=(0,i.join)(t,e);if(!(0,n.existsSync)(s))return!1}let s=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===s.length)return!1;let r=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(r,"utf-8");if(!o.trim()||o.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let s={},r=t.map(async t=>{let r=await d(e,t);s[t]=r});return await Promise.all(r),s}},30533:function(e){var{g:t,__dirname:s,m:r,e:n}=e},54635:e=>{"use strict";var{g:t,__dirname:s}=e;e.s({GET:()=>a});var r=e.i(9892),n=e.i(88941),i=e.i(35692),o=e.i(77159);async function a(){try{let e=await (0,i.getProjectsConfig)(),t=Object.keys(e);if(0===t.length)return new Response(JSON.stringify({success:!0,workspaceExists:!1,projects:[],message:"没有找到配置的项目"}),{status:200,headers:{"Content-Type":"application/json"}});let s=n.WORKSPACE_CONFIG.WORKSPACE_ROOT,a=!1;try{await r.default.access(s),a=!0}catch{a=!1}let c=[],u=(c=a?await Promise.all(t.map(async e=>{let t,r,i=await (0,o.checkProjectStatus)(s,e);switch(i.status){case"complete":t=n.ProjectStatus.EXISTING,r="项目已存在";break;case"incomplete":t=n.ProjectStatus.INCOMPLETE,r="项目不完整,需要清理";break;default:t=n.ProjectStatus.PENDING,r="待克隆"}return{name:e,status:t,message:r,needsCleanup:i.needsCleanup}})):t.map(e=>({name:e,status:n.ProjectStatus.PENDING,message:"待克隆"}))).filter(e=>e.status===n.ProjectStatus.EXISTING).length,l=c.filter(e=>e.status===n.ProjectStatus.PENDING).length,p=c.filter(e=>e.status===n.ProjectStatus.INCOMPLETE).length;return new Response(JSON.stringify({success:!0,workspaceExists:a,workspacePath:s,projects:c,summary:{total:t.length,existing:u,pending:l,incomplete:p},message:a?`工作空间已存在,发现 ${u} 个已存在项目,${l} 个待克隆项目${p>0?`,${p} 个不完整项目需要清理`:""}`:`工作空间不存在,${t.length} 个项目待克隆`}),{status:200,headers:{"Content-Type":"application/json"}})}catch(t){let e=t instanceof Error?t.message:String(t);return console.error("检查工作空间状态失败:",t),new Response(JSON.stringify({success:!1,error:`检查工作空间状态失败: ${e}`,workspaceExists:!1,projects:[]}),{status:500,headers:{"Content-Type":"application/json"}})}}},81743:e=>{"use strict";var{g:t,__dirname:s}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>s,workUnitAsyncStorage:()=>c});var r=e.i(45746),n=e.i(93828),i=e.i(18250),o=e.i(54635);let t=new r.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/check-workspace/route",pathname:"/api/check-workspace",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/check-workspace/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:s,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:s,workUnitAsyncStorage:c})}}}};
15
15
 
16
- //# sourceMappingURL=%5Broot-of-the-server%5D__899d82eb._.js.map
16
+ //# sourceMappingURL=%5Broot-of-the-server%5D__452b5f9c._.js.map
@@ -0,0 +1,16 @@
1
+ module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},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"))},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}({})}},30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},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"))},77159:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>p,checkProjectStatus:()=>d,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var s=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:r,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let d=Date.now(),p={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:d};a?.(0,"开始克隆项目...");let g=(0,i.join)(r,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
2
+ `),u?.(l,"stdout",`[目标目录] ${g}
3
+ `),u?.(l,"stdout",`[仓库地址] ${t}
4
+ `);let f=(0,s.spawn)("git",m,{cwd:r,stdio:["pipe","pipe","pipe"]}),x="",j=0;u?.(l,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
5
+ `);let v=setTimeout(()=>{u?.(l,"stderr",`[超时警告] Git 进程运行超过 ${n/1e3}s,即将终止
6
+ `),f.kill("SIGTERM");let t={...p,status:o.ProjectStatus.FAILED,progress:j,message:"克隆操作超时",error:`克隆操作超时 (${n/1e3}s)`,endTime:Date.now()};u?.(l,"stderr",`[进程终止] 克隆操作超时
7
+ `),c?.(`${l}: 克隆操作超时`),e(t)},n);f.stdout?.on("data",e=>{let t=e.toString();u?.(l,"stdout",t),j=Math.min(j+10,80),a?.(j,"正在克隆代码...")}),f.stderr?.on("data",e=>{let t=e.toString();x+=t,t.includes("remote:")||t.includes("Receiving objects")||t.includes("Resolving deltas")||t.includes("Counting objects")||t.includes("Enumerating objects")||t.includes("Compressing objects")||t.includes("upload-pack")||t.includes("POST git-")||t.includes("正克隆到")||t.includes("Cloning into")?u?.(l,"progress",t):u?.(l,"stderr",t),t.includes("Receiving objects")||t.includes("Resolving deltas")?(j=Math.min(j+5,90),a?.(j,"正在接收对象...")):t.includes("Counting objects")?(j=Math.min(j+2,70),a?.(j,"正在计算对象...")):t.includes("Enumerating objects")&&(j=Math.min(j+2,50),a?.(j,"正在枚举对象..."))}),f.on("close",t=>{clearTimeout(v);let r=Date.now(),s=r-d;if(u?.(l,"stdout",`[进程结束] Git 进程退出,代码: ${t},耗时: ${Math.round(s/1e3)}s
8
+ `),0===t){u?.(l,"stdout",`[克隆成功] 项目已成功克隆到: ${g}
9
+ `);let t={...p,status:o.ProjectStatus.SUCCESS,progress:100,message:"克隆完成",endTime:r};a?.(100,"克隆完成"),e(t)}else{let s=function(e){let t=e.toLowerCase();return t.includes("authentication failed")||t.includes("access denied")?"身份验证失败,请检查仓库访问权限":t.includes("repository not found")||t.includes("not found")?"仓库不存在或无法访问":t.includes("network")||t.includes("connection")?"网络连接问题,请检查网络设置":t.includes("timeout")?"网络超时,请重试":t.includes("permission denied")?"权限被拒绝,请检查文件系统权限":t.includes("already exists")?"目标目录已存在":e.slice(0,200)+(e.length>200?"...":"")}(x);u?.(l,"stderr",`[克隆失败] 错误信息: ${s}
10
+ `),u?.(l,"stderr",`[完整错误输出]
11
+ ${x}
12
+ `);let n={...p,status:o.ProjectStatus.FAILED,progress:j,message:"克隆失败",error:s||`Git 进程退出,代码: ${t}`,endTime:r};c?.(`${l}: ${n.error}`),e(n)}}),f.on("error",t=>{clearTimeout(v),u?.(l,"stderr",`[进程错误] Git 进程启动失败: ${t.message}
13
+ `),u?.(l,"stderr",`[错误详情] ${t.stack||"No stack trace"}
14
+ `);let r={...p,status:o.ProjectStatus.FAILED,progress:j,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};c?.(`${l}: ${t.message}`),e(r)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function l(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function d(e,t){try{let r=(0,i.join)(e,t);if(!(0,n.existsSync)(r))return{exists:!1,status:"not_exists",needsCleanup:!1};let s=(0,i.join)(r,".git");if(!(0,n.existsSync)(s))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(r))return console.log(`检测到不完整的Git仓库: ${r}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function p(e,t){return"complete"===(await d(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let r=(0,i.join)(t,e);if(!(0,n.existsSync)(r))return!1}let r=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===r.length)return!1;let s=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(s,"utf-8");if(!o.trim()||o.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let r={},s=t.map(async t=>{let s=await p(e,t);r[t]=s});return await Promise.all(s),r}},79810:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({clearUatGitFlowState:()=>a,createUatGitFlowState:()=>n,isUatGitFlowAborted:()=>o,markUatGitFlowAbort:()=>i});let t=new Map;function s(){let e=Date.now();for(let[r,s]of t.entries())e-s.updatedAt>18e5&&t.delete(r)}function n(e){s(),t.set(e,{aborted:!1,updatedAt:Date.now()})}function i(e){let r=t.get(e);t.set(e,{aborted:!0,updatedAt:Date.now()}),r||s()}function o(e){return s(),t.get(e)?.aborted??!1}function a(e){t.delete(e)}}},26921:function(e){var{g:t,__dirname:r,m:s,e:n}=e}};
15
+
16
+ //# sourceMappingURL=%5Broot-of-the-server%5D__4ab3dd83._.js.map
@@ -0,0 +1 @@
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/git-operations.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/state.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 { spawn, ChildProcess } from 'child_process';\nimport { existsSync, mkdirSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { join, basename } from 'path';\nimport {\n ProjectStatus,\n type GitOperationConfig,\n type ProjectProgress,\n} from './workspace-types';\n\n/**\n * 创建工作空间目录\n * @param workspacePath 工作空间路径\n * @returns 创建结果\n */\nexport async function createWorkspaceDirectory(workspacePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n if (!existsSync(workspacePath)) {\n mkdirSync(workspacePath, { recursive: true });\n }\n return { success: true };\n } catch (error) {\n return { \n success: false, \n error: `创建工作空间目录失败: ${error instanceof Error ? error.message : String(error)}` \n };\n }\n}\n\n/**\n * 执行 Git 克隆操作\n * @param config Git 操作配置\n * @returns Promise<ProjectProgress>\n */\nexport async function cloneRepository(config: GitOperationConfig): Promise<ProjectProgress> {\n const { repoUrl, targetDir, timeout, onProgress, onError, onLog } = config;\n const projectName = basename(repoUrl, '.git');\n \n return new Promise<ProjectProgress>((resolve) => {\n const startTime = Date.now();\n \n // 更新开始状态\n const initialProgress: ProjectProgress = {\n projectName,\n status: ProjectStatus.CLONING,\n progress: 0,\n message: '开始克隆项目...',\n startTime,\n };\n onProgress?.(0, '开始克隆项目...');\n\n // 执行 git clone 命令\n const targetPath = join(targetDir, projectName);\n // 添加 --progress 参数来强制显示进度,--verbose 显示详细信息\n const gitArgs = ['clone', '--progress', '--verbose', repoUrl, targetPath];\n \n // 记录命令启动信息\n onLog?.(projectName, 'stdout', `[开始克隆] 执行命令: git ${gitArgs.join(' ')}\\n`);\n onLog?.(projectName, 'stdout', `[目标目录] ${targetPath}\\n`);\n onLog?.(projectName, 'stdout', `[仓库地址] ${repoUrl}\\n`);\n \n const gitProcess: ChildProcess = spawn('git', gitArgs, {\n cwd: targetDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let errorOutput = '';\n let progressValue = 0;\n \n // 记录进程启动成功\n onLog?.(projectName, 'stdout', `[进程启动] Git 进程 PID: ${gitProcess.pid}\\n`);\n\n // 设置超时\n const timeoutId = setTimeout(() => {\n onLog?.(projectName, 'stderr', `[超时警告] Git 进程运行超过 ${timeout / 1000}s,即将终止\\n`);\n gitProcess.kill('SIGTERM');\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆操作超时',\n error: `克隆操作超时 (${timeout / 1000}s)`,\n endTime: Date.now(),\n };\n onLog?.(projectName, 'stderr', `[进程终止] 克隆操作超时\\n`);\n onError?.(`${projectName}: 克隆操作超时`);\n resolve(errorResult);\n }, timeout);\n\n // 处理标准输出\n gitProcess.stdout?.on('data', (data: Buffer) => {\n const stdoutText = data.toString();\n \n // 实时发送日志\n onLog?.(projectName, 'stdout', stdoutText);\n \n // 模拟进度更新(Git 克隆没有内置进度,这里基于时间估算)\n progressValue = Math.min(progressValue + 10, 80);\n onProgress?.(progressValue, '正在克隆代码...');\n });\n\n // 处理错误输出\n gitProcess.stderr?.on('data', (data: Buffer) => {\n const stderrText = data.toString();\n errorOutput += stderrText;\n \n // 判断是进度信息还是错误信息\n const isProgressInfo = stderrText.includes('remote:') || \n stderrText.includes('Receiving objects') || \n stderrText.includes('Resolving deltas') ||\n stderrText.includes('Counting objects') ||\n stderrText.includes('Enumerating objects') ||\n stderrText.includes('Compressing objects') ||\n stderrText.includes('upload-pack') ||\n stderrText.includes('POST git-') ||\n stderrText.includes('正克隆到') ||\n stderrText.includes('Cloning into');\n \n // 根据内容类型发送不同的日志\n if (isProgressInfo) {\n onLog?.(projectName, 'progress', stderrText);\n } else {\n onLog?.(projectName, 'stderr', stderrText);\n }\n \n // Git 的进度信息通常在 stderr 中\n if (stderrText.includes('Receiving objects') || stderrText.includes('Resolving deltas')) {\n progressValue = Math.min(progressValue + 5, 90);\n onProgress?.(progressValue, '正在接收对象...');\n } else if (stderrText.includes('Counting objects')) {\n progressValue = Math.min(progressValue + 2, 70);\n onProgress?.(progressValue, '正在计算对象...');\n } else if (stderrText.includes('Enumerating objects')) {\n progressValue = Math.min(progressValue + 2, 50);\n onProgress?.(progressValue, '正在枚举对象...');\n }\n });\n\n // 处理进程结束\n gitProcess.on('close', (code: number | null) => {\n clearTimeout(timeoutId);\n const endTime = Date.now();\n const duration = endTime - startTime;\n \n onLog?.(projectName, 'stdout', `[进程结束] Git 进程退出,代码: ${code},耗时: ${Math.round(duration / 1000)}s\\n`);\n \n if (code === 0) {\n // 克隆成功\n onLog?.(projectName, 'stdout', `[克隆成功] 项目已成功克隆到: ${targetPath}\\n`);\n const successResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.SUCCESS,\n progress: 100,\n message: '克隆完成',\n endTime,\n };\n onProgress?.(100, '克隆完成');\n resolve(successResult);\n } else {\n // 克隆失败\n const parsedError = parseGitError(errorOutput);\n onLog?.(projectName, 'stderr', `[克隆失败] 错误信息: ${parsedError}\\n`);\n onLog?.(projectName, 'stderr', `[完整错误输出]\\n${errorOutput}\\n`);\n \n const failureResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆失败',\n error: parsedError || `Git 进程退出,代码: ${code}`,\n endTime,\n };\n onError?.(`${projectName}: ${failureResult.error}`);\n resolve(failureResult);\n }\n });\n\n // 处理进程错误\n gitProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n onLog?.(projectName, 'stderr', `[进程错误] Git 进程启动失败: ${error.message}\\n`);\n onLog?.(projectName, 'stderr', `[错误详情] ${error.stack || 'No stack trace'}\\n`);\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '进程启动失败',\n error: `进程启动失败: ${error.message}`,\n endTime: Date.now(),\n };\n onError?.(`${projectName}: ${error.message}`);\n resolve(errorResult);\n });\n });\n}\n\n/**\n * 解析 Git 错误信息,提供用户友好的错误描述\n * @param errorOutput Git stderr 输出\n * @returns 用户友好的错误描述\n */\nfunction parseGitError(errorOutput: string): string {\n const lowerOutput = errorOutput.toLowerCase();\n \n if (lowerOutput.includes('authentication failed') || lowerOutput.includes('access denied')) {\n return '身份验证失败,请检查仓库访问权限';\n }\n \n if (lowerOutput.includes('repository not found') || lowerOutput.includes('not found')) {\n return '仓库不存在或无法访问';\n }\n \n if (lowerOutput.includes('network') || lowerOutput.includes('connection')) {\n return '网络连接问题,请检查网络设置';\n }\n \n if (lowerOutput.includes('timeout')) {\n return '网络超时,请重试';\n }\n \n if (lowerOutput.includes('permission denied')) {\n return '权限被拒绝,请检查文件系统权限';\n }\n \n if (lowerOutput.includes('already exists')) {\n return '目标目录已存在';\n }\n \n // 返回原始错误的前200个字符\n return errorOutput.slice(0, 200) + (errorOutput.length > 200 ? '...' : '');\n}\n\n/**\n * 验证 Git 仓库 URL 格式\n * @param url Git 仓库 URL\n * @returns 是否有效\n */\nexport function isValidGitUrl(url: string): boolean {\n const gitUrlPattern = /^(https?:\\/\\/|git@)[^\\s]+\\.git$/i;\n return gitUrlPattern.test(url);\n}\n\n/**\n * 清理项目名称,移除不安全字符\n * @param projectName 项目名称\n * @returns 清理后的项目名称\n */\nexport function sanitizeProjectName(projectName: string): string {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/**\n * 项目检查结果类型\n */\nexport type ProjectCheckResult = {\n exists: boolean;\n status: 'not_exists' | 'complete' | 'incomplete';\n needsCleanup: boolean;\n};\n\n/**\n * 检查项目状态(详细版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<ProjectCheckResult> 详细的项目状态\n */\nexport async function checkProjectStatus(workspacePath: string, projectName: string): Promise<ProjectCheckResult> {\n try {\n const projectPath = join(workspacePath, projectName);\n \n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n \n // 检查是否为 Git 仓库(存在 .git 目录)\n const gitPath = join(projectPath, '.git');\n if (!existsSync(gitPath)) {\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n // 更严格的完整性检查\n const isComplete = await isGitRepositoryComplete(projectPath);\n if (!isComplete) {\n console.log(`检测到不完整的Git仓库: ${projectPath}`);\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n return {\n exists: true,\n status: 'complete',\n needsCleanup: false\n };\n } catch (error) {\n console.error(`检查项目 ${projectName} 状态时出错:`, error);\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n}\n\n/**\n * 检查项目是否已存在于工作空间中(兼容版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<boolean> 项目是否存在且为有效的 Git 仓库\n */\nexport async function checkProjectExists(workspacePath: string, projectName: string): Promise<boolean> {\n const result = await checkProjectStatus(workspacePath, projectName);\n return result.status === 'complete';\n}\n\n/**\n * 检查Git仓库是否完整\n * @param projectPath 项目路径\n * @returns Promise<boolean> 仓库是否完整\n */\nasync function isGitRepositoryComplete(projectPath: string): Promise<boolean> {\n try {\n const gitPath = join(projectPath, '.git');\n \n // 检查关键的Git文件是否存在\n const requiredFiles = ['HEAD', 'config', 'refs'];\n for (const file of requiredFiles) {\n const filePath = join(gitPath, file);\n if (!existsSync(filePath)) {\n return false;\n }\n }\n \n // 检查是否有实际的项目文件(不只是.git目录)\n const entries = await fs.readdir(projectPath);\n const nonGitFiles = entries.filter((entry: string) => entry !== '.git');\n \n // 如果只有.git目录,说明克隆未完成\n if (nonGitFiles.length === 0) {\n return false;\n }\n \n // 检查HEAD文件是否有效\n const headPath = join(gitPath, 'HEAD');\n const headContent = await fs.readFile(headPath, 'utf-8');\n if (!headContent.trim() || headContent.includes('unborn')) {\n return false;\n }\n \n return true;\n } catch (error) {\n console.error('检查Git仓库完整性时出错:', error);\n return false;\n }\n}\n\n/**\n * 清理不完整的项目目录\n * @param projectPath 项目路径\n */\nexport async function cleanupIncompleteProject(projectPath: string): Promise<void> {\n try {\n console.log(`正在清理不完整的项目: ${projectPath}`);\n await fs.rm(projectPath, { recursive: true, force: true });\n console.log(`清理完成: ${projectPath}`);\n } catch (error) {\n console.error(`清理项目失败 ${projectPath}:`, error);\n // 清理失败不抛出错误,避免阻塞后续流程\n }\n}\n\n/**\n * 批量检查多个项目的存在状态\n * @param workspacePath 工作空间路径\n * @param projectNames 项目名称列表\n * @returns Promise<Record<string, boolean>> 项目名称到存在状态的映射\n */\nexport async function checkMultipleProjectsExist(\n workspacePath: string, \n projectNames: string[]\n): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n \n // 并行检查所有项目\n const checks = projectNames.map(async (projectName) => {\n const exists = await checkProjectExists(workspacePath, projectName);\n results[projectName] = exists;\n });\n \n await Promise.all(checks);\n return results;\n} ","type AbortState = {\n aborted: boolean;\n updatedAt: number;\n};\n\nconst abortStates = new Map<string, AbortState>();\nconst ABORT_STATE_TTL = 1000 * 60 * 30;\n\nfunction cleanupAbortStates() {\n const now = Date.now();\n for (const [runId, state] of abortStates.entries()) {\n if (now - state.updatedAt > ABORT_STATE_TTL) {\n abortStates.delete(runId);\n }\n }\n}\n\nexport function createUatGitFlowState(runId: string) {\n cleanupAbortStates();\n abortStates.set(runId, { aborted: false, updatedAt: Date.now() });\n}\n\nexport function markUatGitFlowAbort(runId: string) {\n const existing = abortStates.get(runId);\n abortStates.set(runId, {\n aborted: true,\n updatedAt: Date.now(),\n });\n if (!existing) {\n cleanupAbortStates();\n }\n}\n\nexport function isUatGitFlowAborted(runId: string) {\n cleanupAbortStates();\n return abortStates.get(runId)?.aborted ?? false;\n}\n\nexport function clearUatGitFlowState(runId: string) {\n abortStates.delete(runId);\n}\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- module.exports={45935:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.exports=e.x("fs/promises",()=>require("fs/promises"))},87485:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("child_process",()=>require("child_process"))},4713:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("util",()=>require("util"))},70967:e=>{"use strict";var{g:t,__dirname:o}=e;{e.s({appendLog:()=>h,cleanupOldLogs:()=>g,deleteProcessLogs:()=>m,getLogsDirSize:()=>f,getProcessLogPath:()=>i,readLastNLines:()=>d,rotateLogFile:()=>u,startLogCleanupTask:()=>y,stopLogCleanupTask:()=>E,truncateLogLine:()=>c,writeLogsSync:()=>p});var r=e.i(9892),s=e.i(30331),n=e.i(13442);let t={MAX_FILE_SIZE:5242880,MAX_LOG_FILES:3,MAX_LOG_AGE_DAYS:7,MAX_LINE_LENGTH:1e3,CLEANUP_INTERVAL:18e5};function a(){return s.default.join(n.default.homedir(),".prime-process-logs")}function i(e){return s.default.join(a(),`${e}.log`)}function c(e){return e.length<=t.MAX_LINE_LENGTH?e:e.substring(0,t.MAX_LINE_LENGTH)+"... [truncated]"}async function l(e){try{return(await r.default.stat(e)).size}catch{return 0}}async function u(e){let o=i(e),s=await l(o);if(!(s<t.MAX_FILE_SIZE)){console.log(`[日志管理] 轮转日志文件: ${e}, 大小: ${(s/1024/1024).toFixed(2)}MB`);try{let s=`${o}.${t.MAX_LOG_FILES}`;try{await r.default.unlink(s)}catch{}for(let e=t.MAX_LOG_FILES-1;e>=1;e--){let t=1===e?o:`${o}.${e}`,s=`${o}.${e+1}`;try{await r.default.rename(t,s)}catch{}}await r.default.rename(o,`${o}.1`),await r.default.writeFile(o,"","utf-8"),console.log(`[日志管理] 日志轮转完成: ${e}`)}catch(t){console.error(`[日志管理] 轮转日志文件失败: ${e}`,t)}}}async function h(e,t){await u(e);let o=i(e),s=c(t);try{await r.default.mkdir(a(),{recursive:!0}),await r.default.appendFile(o,s+"\n","utf-8")}catch(t){console.error(`[日志管理] 追加日志失败: ${e}`,t)}}async function p(e,t){await u(e);let o=i(e),s=t.map(e=>c(e));try{await r.default.mkdir(a(),{recursive:!0}),await r.default.writeFile(o,s.join("\n")+"\n","utf-8")}catch(t){console.error(`[日志管理] 写入日志失败: ${e}`,t)}}async function d(e,t=100){let o=i(e);try{return(await r.default.readFile(o,"utf-8")).split("\n").filter(e=>e.trim()).slice(-t)}catch{return[]}}async function g(){console.log("[日志管理] 开始清理旧日志...");try{let e=a();try{await r.default.access(e)}catch{console.log("[日志管理] 日志目录不存在,无需清理");return}let o=await r.default.readdir(e),n=Date.now(),i=24*t.MAX_LOG_AGE_DAYS*36e5,c=0,l=0;for(let t of o){let o=s.default.join(e,t);try{let e=await r.default.stat(o);if(n-e.mtime.getTime()>i){l+=e.size;try{await r.default.unlink(o),c++,console.log(`[日志管理] 删除过期日志: ${t}`)}catch(e){e?.code!=="ENOENT"&&console.error(`[日志管理] 删除文件失败: ${t}`,e)}}}catch(e){e?.code!=="ENOENT"&&console.error(`[日志管理] 处理文件失败: ${t}`,e)}}console.log(`[日志管理] 清理完成: 删除 ${c} 个文件, 释放 ${(l/1024/1024).toFixed(2)}MB`)}catch(e){console.error("[日志管理] 清理日志失败:",e)}}async function m(e){let o=i(e);try{await r.default.unlink(o)}catch(t){t?.code!=="ENOENT"&&console.error(`[日志管理] 删除主日志文件失败: ${e}`,t)}for(let s=1;s<=t.MAX_LOG_FILES;s++)try{await r.default.unlink(`${o}.${s}`)}catch(t){t?.code!=="ENOENT"&&console.error(`[日志管理] 删除轮转日志文件失败: ${e}.${s}`,t)}console.log(`[日志管理] 删除进程日志: ${e}`)}async function f(){try{let e=a(),t=await r.default.readdir(e),o=0,n=0;for(let a of t)try{let t=await r.default.stat(s.default.join(e,a));o+=t.size,n++}catch{}return{totalSize:o,fileCount:n}}catch{return{totalSize:0,fileCount:0}}}let o=null;function y(){o||(console.log("[日志管理] 启动定期清理任务"),g(),o=setInterval(()=>{g()},t.CLEANUP_INTERVAL))}function E(){o&&(clearInterval(o),o=null,console.log("[日志管理] 停止定期清理任务"))}process.on("SIGINT",()=>{E()}),process.on("SIGTERM",()=>{E()})}},94722:e=>{"use strict";var{g:t,__dirname:o}=e;{e.s({sseConnectionManager:()=>o});class t{connections=new Map;encoder=new TextEncoder;heartbeatInterval=null;HEARTBEAT_INTERVAL=3e4;CONNECTION_TIMEOUT=12e4;MAX_CONNECTIONS_PER_ENV=10;constructor(){this.startHeartbeat()}clearAllConnections(){console.log("[SSE] 开始清理所有连接...");let e=Array.from(this.connections.values()).reduce((e,t)=>e+t.size,0);this.connections.forEach(e=>{e.forEach(e=>{try{e.controller.close()}catch{}})}),this.connections.clear(),console.log(`[SSE] 已清理 ${e} 个连接`)}addConnection(e,t,o){console.log(`[SSE] 添加连接: 环境=${e}, 客户端=${o}`),this.connections.has(e)||this.connections.set(e,new Set);let r=this.connections.get(e);if(r.size>=this.MAX_CONNECTIONS_PER_ENV){console.warn(`[SSE] 环境 ${e} 连接数已达上限,清理最旧的连接`);let t=Array.from(r).sort((e,t)=>e.timestamp-t.timestamp)[0];if(t){try{t.controller.close()}catch{}r.delete(t)}}let s={controller:t,timestamp:Date.now(),clientId:o,envName:e};r.add(s),this.sendToConnection(s,{type:"heartbeat",timestamp:Date.now()}),console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}removeConnection(e,t){console.log(`[SSE] 移除连接: 环境=${e}, 客户端=${t}`);let o=this.connections.get(e);if(o){let r=Array.from(o).find(e=>e.clientId===t);r&&(o.delete(r),0===o.size&&this.connections.delete(e))}console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}broadcastToEnv(e,t){console.log(`[SSE] 向环境 ${e} 广播配置变化消息`);let o=this.connections.get(e);if(!o||0===o.size)return void console.log(`[SSE] 环境 ${e} 没有活跃连接,跳过广播`);let r=[];o.forEach(e=>{try{this.sendToConnection(e,t)}catch(t){console.error(`[SSE] 发送消息到客户端 ${e.clientId} 失败:`,t),r.push(e)}}),r.forEach(e=>{o.delete(e),console.log(`[SSE] 清理无效连接: 客户端=${e.clientId}`)}),console.log(`[SSE] 成功发送给 ${o.size} 个连接`)}sendToConnection(e,t){let o=`data: ${JSON.stringify(t)}
1
+ module.exports={45935:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.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"))},30331:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.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:o,m:r,e:s}=e;r.exports=e.x("next/dist/server/app-render/work-async-storage.external.js",()=>require("next/dist/server/app-render/work-async-storage.external.js"))},23430:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.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"))},13442:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("fs/promises",()=>require("fs/promises"))},87485:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("child_process",()=>require("child_process"))},4713:function(e){var{g:t,__dirname:o,m:r,e:s}=e;r.exports=e.x("util",()=>require("util"))},70967:e=>{"use strict";var{g:t,__dirname:o}=e;{e.s({appendLog:()=>h,cleanupOldLogs:()=>g,deleteProcessLogs:()=>m,getLogsDirSize:()=>f,getProcessLogPath:()=>i,readLastNLines:()=>d,rotateLogFile:()=>u,startLogCleanupTask:()=>y,stopLogCleanupTask:()=>E,truncateLogLine:()=>c,writeLogsSync:()=>p});var r=e.i(9892),s=e.i(30331),n=e.i(13442);let t={MAX_FILE_SIZE:5242880,MAX_LOG_FILES:3,MAX_LOG_AGE_DAYS:7,MAX_LINE_LENGTH:1e3,CLEANUP_INTERVAL:18e5};function a(){return s.default.join(n.default.homedir(),".prime-process-logs")}function i(e){return s.default.join(a(),`${e}.log`)}function c(e){return e.length<=t.MAX_LINE_LENGTH?e:e.substring(0,t.MAX_LINE_LENGTH)+"... [truncated]"}async function l(e){try{return(await r.default.stat(e)).size}catch{return 0}}async function u(e){let o=i(e),s=await l(o);if(!(s<t.MAX_FILE_SIZE)){console.log(`[日志管理] 轮转日志文件: ${e}, 大小: ${(s/1024/1024).toFixed(2)}MB`);try{let s=`${o}.${t.MAX_LOG_FILES}`;try{await r.default.unlink(s)}catch{}for(let e=t.MAX_LOG_FILES-1;e>=1;e--){let t=1===e?o:`${o}.${e}`,s=`${o}.${e+1}`;try{await r.default.rename(t,s)}catch{}}await r.default.rename(o,`${o}.1`),await r.default.writeFile(o,"","utf-8"),console.log(`[日志管理] 日志轮转完成: ${e}`)}catch(t){console.error(`[日志管理] 轮转日志文件失败: ${e}`,t)}}}async function h(e,t){await u(e);let o=i(e),s=c(t);try{await r.default.mkdir(a(),{recursive:!0}),await r.default.appendFile(o,s+"\n","utf-8")}catch(t){console.error(`[日志管理] 追加日志失败: ${e}`,t)}}async function p(e,t){await u(e);let o=i(e),s=t.map(e=>c(e));try{await r.default.mkdir(a(),{recursive:!0}),await r.default.writeFile(o,s.join("\n")+"\n","utf-8")}catch(t){console.error(`[日志管理] 写入日志失败: ${e}`,t)}}async function d(e,t=100){let o=i(e);try{return(await r.default.readFile(o,"utf-8")).split("\n").filter(e=>e.trim()).slice(-t)}catch{return[]}}async function g(){console.log("[日志管理] 开始清理旧日志...");try{let e=a();try{await r.default.access(e)}catch{console.log("[日志管理] 日志目录不存在,无需清理");return}let o=await r.default.readdir(e),n=Date.now(),i=24*t.MAX_LOG_AGE_DAYS*36e5,c=0,l=0;for(let t of o){let o=s.default.join(e,t);try{let e=await r.default.stat(o);if(n-e.mtime.getTime()>i){l+=e.size;try{await r.default.unlink(o),c++,console.log(`[日志管理] 删除过期日志: ${t}`)}catch(e){e?.code!=="ENOENT"&&console.error(`[日志管理] 删除文件失败: ${t}`,e)}}}catch(e){e?.code!=="ENOENT"&&console.error(`[日志管理] 处理文件失败: ${t}`,e)}}console.log(`[日志管理] 清理完成: 删除 ${c} 个文件, 释放 ${(l/1024/1024).toFixed(2)}MB`)}catch(e){console.error("[日志管理] 清理日志失败:",e)}}async function m(e){let o=i(e);try{await r.default.unlink(o)}catch(t){t?.code!=="ENOENT"&&console.error(`[日志管理] 删除主日志文件失败: ${e}`,t)}for(let s=1;s<=t.MAX_LOG_FILES;s++)try{await r.default.unlink(`${o}.${s}`)}catch(t){t?.code!=="ENOENT"&&console.error(`[日志管理] 删除轮转日志文件失败: ${e}.${s}`,t)}console.log(`[日志管理] 删除进程日志: ${e}`)}async function f(){try{let e=a(),t=await r.default.readdir(e),o=0,n=0;for(let a of t)try{let t=await r.default.stat(s.default.join(e,a));o+=t.size,n++}catch{}return{totalSize:o,fileCount:n}}catch{return{totalSize:0,fileCount:0}}}let o=null;function y(){o||(console.log("[日志管理] 启动定期清理任务"),g(),o=setInterval(()=>{g()},t.CLEANUP_INTERVAL))}function E(){o&&(clearInterval(o),o=null,console.log("[日志管理] 停止定期清理任务"))}process.on("SIGINT",()=>{E()}),process.on("SIGTERM",()=>{E()})}},94722:e=>{"use strict";var{g:t,__dirname:o}=e;{e.s({sseConnectionManager:()=>o});class t{connections=new Map;encoder=new TextEncoder;heartbeatInterval=null;HEARTBEAT_INTERVAL=3e4;CONNECTION_TIMEOUT=12e4;MAX_CONNECTIONS_PER_ENV=10;constructor(){this.startHeartbeat()}clearAllConnections(){console.log("[SSE] 开始清理所有连接...");let e=Array.from(this.connections.values()).reduce((e,t)=>e+t.size,0);this.connections.forEach(e=>{e.forEach(e=>{try{e.controller.close()}catch{}})}),this.connections.clear(),console.log(`[SSE] 已清理 ${e} 个连接`)}addConnection(e,t,o){console.log(`[SSE] 添加连接: 环境=${e}, 客户端=${o}`),this.connections.has(e)||this.connections.set(e,new Set);let r=this.connections.get(e);if(r.size>=this.MAX_CONNECTIONS_PER_ENV){console.warn(`[SSE] 环境 ${e} 连接数已达上限,清理最旧的连接`);let t=Array.from(r).sort((e,t)=>e.timestamp-t.timestamp)[0];if(t){try{t.controller.close()}catch{}r.delete(t)}}let s={controller:t,timestamp:Date.now(),clientId:o,envName:e};r.add(s),this.sendToConnection(s,{type:"heartbeat",timestamp:Date.now()}),console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}removeConnection(e,t){console.log(`[SSE] 移除连接: 环境=${e}, 客户端=${t}`);let o=this.connections.get(e);if(o){let r=Array.from(o).find(e=>e.clientId===t);r&&(o.delete(r),0===o.size&&this.connections.delete(e))}console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}broadcastToEnv(e,t){console.log(`[SSE] 向环境 ${e} 广播配置变化消息`);let o=this.connections.get(e);if(!o||0===o.size)return void console.log(`[SSE] 环境 ${e} 没有活跃连接,跳过广播`);let r=[];o.forEach(e=>{try{this.sendToConnection(e,t)}catch(t){console.error(`[SSE] 发送消息到客户端 ${e.clientId} 失败:`,t),r.push(e)}}),r.forEach(e=>{o.delete(e),console.log(`[SSE] 清理无效连接: 客户端=${e.clientId}`)}),console.log(`[SSE] 成功发送给 ${o.size} 个连接`)}sendToConnection(e,t){let o=`data: ${JSON.stringify(t)}
2
2
 
3
3
  `,r=this.encoder.encode(o);try{e.controller.enqueue(r),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(o=>{t+=o.size;let r=[];o.forEach(t=>{try{this.sendToConnection(t,e)}catch{r.push(t)}}),r.forEach(e=>o.delete(e))}),t>0&&console.log(`[SSE] 心跳发送完成,活跃连接数: ${t}`)}cleanupStaleConnections(){let e=Date.now(),t=0;this.connections.forEach((o,r)=>{let s=[];o.forEach(t=>{e-t.timestamp>this.CONNECTION_TIMEOUT&&s.push(t)}),s.forEach(e=>{o.delete(e),t++,console.log(`[SSE] 清理过期连接: 环境=${r}, 客户端=${e.clientId}`)}),0===o.size&&this.connections.delete(r)}),t>0&&console.log(`[SSE] 连接清理完成,清理数量: ${t}`)}getConnectionStats(){let e=[],t=0;return this.connections.forEach((o,r)=>{let s=o.size;t+=s,e.push(`${r}: ${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 o=new t;process.on("SIGINT",()=>{console.log("[SSE] 收到退出信号,正在清理连接..."),o.stop(),process.exit(0)}),process.on("SIGTERM",()=>{console.log("[SSE] 收到终止信号,正在清理连接..."),o.stop(),process.exit(0)})}},71034:function(e){var{g:t,__dirname:o,m:r,e:s}=e},20248:e=>{"use strict";var{g:t,__dirname:o}=e;{e.s({memoryMonitor:()=>n});var r=e.i(87485);let o=(0,e.i(4713).promisify)(r.exec),s={warningMB:512,criticalMB:1024,heapUsagePercent:90},n=new class{monitorTimer=null;thresholds;cleanupCallbacks=[];lastWarningTime=0;warningCooldown=3e5;constructor(e={}){this.thresholds={...s,...e}}registerCleanupCallback(e){this.cleanupCallbacks.push(e)}async getSystemMemory(){try{{let{stdout:e}=await o(`ps -o rss= -g ${process.pid}`),t=e.trim().split("\n").reduce((e,t)=>{let o=parseInt(t.trim());return e+(isNaN(o)?0:o)},0);return 1024*t}}catch{}return 0}getMemoryUsage(){let e=process.memoryUsage();return{rss:e.rss,heapTotal:e.heapTotal,heapUsed:e.heapUsed,external:e.external,arrayBuffers:e.arrayBuffers}}async getFullMemoryUsage(){let e=this.getMemoryUsage(),t=await this.getSystemMemory();return{...e,systemTotal:t>0?t:void 0}}formatBytes(e){return`${(e/1024/1024).toFixed(2)} MB`}async checkMemory(){let e=await this.getFullMemoryUsage(),t=e.rss/1024/1024,o=e.heapUsed/e.heapTotal*100,r=e.systemTotal?e.systemTotal/1024/1024:null,s={rss:this.formatBytes(e.rss),heapUsed:this.formatBytes(e.heapUsed),heapTotal:this.formatBytes(e.heapTotal),heapUsagePercent:`${o.toFixed(2)}%`};e.systemTotal&&(s.systemTotal=this.formatBytes(e.systemTotal)),console.log("[内存监控] 当前使用:",s);let n=r||t;if(n>=this.thresholds.criticalMB){console.error(`[内存监控] ⚠️ 内存使用达到临界值: ${n.toFixed(2)}MB`),await this.triggerCleanup("critical");return}if(n>=this.thresholds.warningMB||o>=this.thresholds.heapUsagePercent){let e=Date.now();e-this.lastWarningTime>this.warningCooldown&&(console.warn(`[内存监控] ⚠️ 内存使用较高: ${n.toFixed(2)}MB (堆使用率: ${o.toFixed(2)}%)`),this.lastWarningTime=e,await this.triggerCleanup("warning"))}}async triggerCleanup(e){console.log(`[内存监控] 开始 ${"critical"===e?"紧急":"常规"} 清理...`);let o=this.getMemoryUsage();for(let e of this.cleanupCallbacks)try{await e()}catch(e){console.error("[内存监控] 清理回调执行失败:",e)}t.gc?(t.gc(),console.log("[内存监控] 已触发垃圾回收")):"critical"===e&&console.warn("[内存监控] 垃圾回收不可用。启动 Node.js 时使用 --expose-gc 标志以启用手动垃圾回收");let r=this.getMemoryUsage(),s=(o.rss-r.rss)/1024/1024;console.log(`[内存监控] 清理完成,释放内存: ${s.toFixed(2)}MB`)}start(){if(this.monitorTimer)return void console.warn("[内存监控] 监控器已经在运行");console.log("[内存监控] 启动内存监控",{interval:`60秒`,thresholds:{warning:`${this.thresholds.warningMB}MB`,critical:`${this.thresholds.criticalMB}MB`,heapUsage:`${this.thresholds.heapUsagePercent}%`}}),this.checkMemory(),this.monitorTimer=setInterval(()=>{this.checkMemory()},6e4)}stop(){this.monitorTimer&&(clearInterval(this.monitorTimer),this.monitorTimer=null,console.log("[内存监控] 监控器已停止"))}async check(){return await this.checkMemory(),await this.getFullMemoryUsage()}};process.on("SIGINT",()=>{n.stop()}),process.on("SIGTERM",()=>{n.stop()})}},44691:e=>{"use strict";var{g:t,__dirname:o}=e;e.s({GET:()=>i,POST:()=>c});var r=e.i(15494),s=e.i(20248),n=e.i(70967),a=e.i(94722);async function i(){try{let e=await s.memoryMonitor.check(),t=await (0,n.getLogsDirSize)(),o={rss:`${(e.rss/1024/1024).toFixed(2)} MB`,heapUsed:`${(e.heapUsed/1024/1024).toFixed(2)} MB`,heapTotal:`${(e.heapTotal/1024/1024).toFixed(2)} MB`,heapUsagePercent:`${(e.heapUsed/e.heapTotal*100).toFixed(2)}%`,external:`${(e.external/1024/1024).toFixed(2)} MB`};return e.systemTotal&&(o.systemTotal=`${(e.systemTotal/1024/1024).toFixed(2)} MB`,o.note="systemTotal 包含所有子进程和相关资源"),r.NextResponse.json({success:!0,data:{memory:o,logs:{totalSize:`${(t.totalSize/1024/1024).toFixed(2)} MB`,fileCount:t.fileCount},connections:a.sseConnectionManager.getConnectionStats(),timestamp:new Date().toISOString()}})}catch(e){return r.NextResponse.json({success:!1,error:e instanceof Error?e.message:"获取内存状态失败"},{status:500})}}async function c(){try{return await s.memoryMonitor.check(),r.NextResponse.json({success:!0,message:"已触发内存检查和清理"})}catch(e){return r.NextResponse.json({success:!1,error:e instanceof Error?e.message:"触发清理失败"},{status:500})}}},74662:e=>{"use strict";var{g:t,__dirname:o}=e;{e.s({patchFetch:()=>i,routeModule:()=>t,serverHooks:()=>l,workAsyncStorage:()=>o,workUnitAsyncStorage:()=>c});var r=e.i(45746),s=e.i(93828),n=e.i(18250),a=e.i(44691);let t=new r.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/memory-status/route",pathname:"/api/memory-status",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/memory-status/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:o,workUnitAsyncStorage:c,serverHooks:l}=t;function i(){return(0,n.patchFetch)({workAsyncStorage:o,workUnitAsyncStorage:c})}}}};
4
4
 
5
- //# sourceMappingURL=%5Broot-of-the-server%5D__2fcc7175._.js.map
5
+ //# sourceMappingURL=%5Broot-of-the-server%5D__4b595942._.js.map
@@ -1,3 +1,3 @@
1
- module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>o,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 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}({})}},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"))},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:()=>o,saveProjectsConfig:()=>i});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}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 i(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}({})},15650:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("module",()=>require("module"))},48647:function(e){var{g:t,__dirname:r,m:s,e:n}=e},68385:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PUT:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);let t=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/mock-setting/route.ts")}`}}.url);async function c(e){try{let{projectName:r,apiName:c,method:u,currentSite:p}=await e.json();if(!r||!c||!u||!p)return s.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, currentSite"},{status:400});if(!(await (0,i.getProjectsConfig)())[r])return s.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});let g=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,r),l=(0,o.join)(g,".mock",c,u.toLowerCase(),"setting.cjs");try{await n.promises.access(l)}catch{return s.NextResponse.json({success:!1,error:"setting.cjs文件不存在"},{status:404})}let m={};try{let e=(0,o.resolve)(l);delete t.cache[e],m=t(e)}catch(e){console.warn(`解析setting.cjs失败: ${l}`,e)}m.currentSite=p;let x=`module.exports = ${JSON.stringify(m,null,2).replace(/"([^"]+)":/g,"$1:")};`;return await n.promises.writeFile(l,x,"utf-8"),s.NextResponse.json({success:!0,message:"Mock设置更新成功",data:{projectName:r,apiName:c,method:u.toLowerCase(),currentSite:p,filePath:(0,o.join)(".mock",c,u.toLowerCase(),"setting.cjs"),updatedAt:new Date().toISOString()}})}catch(t){let e=t instanceof Error?t.message:"更新Mock设置失败";return console.error("更新Mock设置失败:",t),s.NextResponse.json({success:!1,error:e},{status:500})}}}},68510:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(68385);let t=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/mock-setting/route",pathname:"/api/mock-setting",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/mock-setting/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,o.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
1
+ module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},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"))},88941:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PROJECT_CONFIG_PATH:()=>r,ProjectStatus:()=>o,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 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}({})}},30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},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:()=>o,saveProjectsConfig:()=>i});var s=e.i(9892),n=e.i(88941);async function o(){try{await (0,s.access)(n.PROJECT_CONFIG_PATH,s.constants.F_OK)}catch{return await i({}),{}}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 i(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}({})},15650:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("module",()=>require("module"))},48647:function(e){var{g:t,__dirname:r,m:s,e:n}=e},68385:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({PUT:()=>c});var s=e.i(15494),n=e.i(83886),o=e.i(30331),i=e.i(35692),a=e.i(88941);let t=(0,e.i(15650).createRequire)({get url(){return`file://${e.P("packages/server/src/app/api/mock-setting/route.ts")}`}}.url);async function c(e){try{let{projectName:r,apiName:c,method:u,currentSite:p}=await e.json();if(!r||!c||!u||!p)return s.NextResponse.json({success:!1,error:"缺少必要参数:projectName, apiName, method, currentSite"},{status:400});if(!(await (0,i.getProjectsConfig)())[r])return s.NextResponse.json({success:!1,error:`项目 ${r} 不存在`},{status:404});let g=(0,o.join)(a.WORKSPACE_CONFIG.WORKSPACE_ROOT,r),l=(0,o.join)(g,".mock",c,u.toLowerCase(),"setting.cjs");try{await n.promises.access(l)}catch{return s.NextResponse.json({success:!1,error:"setting.cjs文件不存在"},{status:404})}let m={};try{let e=(0,o.resolve)(l);delete t.cache[e],m=t(e)}catch(e){console.warn(`解析setting.cjs失败: ${l}`,e)}m.currentSite=p;let x=`module.exports = ${JSON.stringify(m,null,2).replace(/"([^"]+)":/g,"$1:")};`;return await n.promises.writeFile(l,x,"utf-8"),s.NextResponse.json({success:!0,message:"Mock设置更新成功",data:{projectName:r,apiName:c,method:u.toLowerCase(),currentSite:p,filePath:(0,o.join)(".mock",c,u.toLowerCase(),"setting.cjs"),updatedAt:new Date().toISOString()}})}catch(t){let e=t instanceof Error?t.message:"更新Mock设置失败";return console.error("更新Mock设置失败:",t),s.NextResponse.json({success:!1,error:e},{status:500})}}}},68510:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),o=e.i(18250),i=e.i(68385);let t=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/mock-setting/route",pathname:"/api/mock-setting",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/mock-setting/route.ts",nextConfigOutput:"",userland:i}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,o.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
2
2
 
3
- //# sourceMappingURL=%5Broot-of-the-server%5D__973c48a6._.js.map
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__4ec3205b._.js.map
@@ -1,4 +1,4 @@
1
- module.exports={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}({})}},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"))},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}({})},83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var s=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:r,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let p=Date.now(),d={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:p};a?.(0,"开始克隆项目...");let g=(0,i.join)(r,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
1
+ module.exports={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}({})}},30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},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}({})},83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},87485:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("child_process",()=>require("child_process"))},77159:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>d,checkProjectStatus:()=>p,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var s=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:r,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let p=Date.now(),d={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:p};a?.(0,"开始克隆项目...");let g=(0,i.join)(r,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
2
2
  `),u?.(l,"stdout",`[目标目录] ${g}
3
3
  `),u?.(l,"stdout",`[仓库地址] ${t}
4
4
  `);let f=(0,s.spawn)("git",m,{cwd:r,stdio:["pipe","pipe","pipe"]}),x="",y=0;u?.(l,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
@@ -13,4 +13,4 @@ ${x}
13
13
  `),u?.(l,"stderr",`[错误详情] ${t.stack||"No stack trace"}
14
14
  `);let r={...d,status:o.ProjectStatus.FAILED,progress:y,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};c?.(`${l}: ${t.message}`),e(r)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function l(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function p(e,t){try{let r=(0,i.join)(e,t);if(!(0,n.existsSync)(r))return{exists:!1,status:"not_exists",needsCleanup:!1};let s=(0,i.join)(r,".git");if(!(0,n.existsSync)(s))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(r))return console.log(`检测到不完整的Git仓库: ${r}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function d(e,t){return"complete"===(await p(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let r=(0,i.join)(t,e);if(!(0,n.existsSync)(r))return!1}let r=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===r.length)return!1;let s=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(s,"utf-8");if(!o.trim()||o.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let r={},s=t.map(async t=>{let s=await d(e,t);r[t]=s});return await Promise.all(s),r}},16822:function(e){var{g:t,__dirname:r,m:s,e:n}=e},89950:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({POST:()=>o});var s=e.i(88941),n=e.i(35692),i=e.i(77159);async function o(e){try{let{projectName:t}=await e.json();if(!t||"string"!=typeof t)return new Response(JSON.stringify({success:!1,error:"项目名称是必需的"}),{status:400,headers:{"Content-Type":"application/json"}});let r=await (0,n.getProjectsConfig)();if(!(t in r))return new Response(JSON.stringify({success:!1,error:`项目 ${t} 不存在于配置中`}),{status:404,headers:{"Content-Type":"application/json"}});let o=r[t],a=s.WORKSPACE_CONFIG.WORKSPACE_ROOT,c=await (0,i.cloneRepository)({repoUrl:o.repo,targetDir:a,timeout:s.WORKSPACE_CONFIG.GIT_TIMEOUT}),u={success:c.status===s.ProjectStatus.SUCCESS,projectName:t,status:c.status,message:c.message,error:c.error,progress:c.progress,duration:c.endTime&&c.startTime?c.endTime-c.startTime:0};return new Response(JSON.stringify(u),{status:200,headers:{"Content-Type":"application/json"}})}catch(t){let e=t instanceof Error?t.message:String(t);return console.error("重试项目克隆失败:",t),new Response(JSON.stringify({success:!1,error:`重试失败: ${e}`}),{status:500,headers:{"Content-Type":"application/json"}})}}},23856:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>a,routeModule:()=>t,serverHooks:()=>u,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>c});var s=e.i(45746),n=e.i(93828),i=e.i(18250),o=e.i(89950);let t=new s.AppRouteRouteModule({definition:{kind:n.RouteKind.APP_ROUTE,page:"/api/retry-project/route",pathname:"/api/retry-project",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/retry-project/route.ts",nextConfigOutput:"",userland:o}),{workAsyncStorage:r,workUnitAsyncStorage:c,serverHooks:u}=t;function a(){return(0,i.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:c})}}}};
15
15
 
16
- //# sourceMappingURL=%5Broot-of-the-server%5D__072f5c45._.js.map
16
+ //# sourceMappingURL=%5Broot-of-the-server%5D__4fd52ac1._.js.map
@@ -1,7 +1,7 @@
1
- module.exports={45935:function(e){var{g:t,__dirname:n,m:o,e:r}=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"))},88941:e=>{"use strict";var{g:t,__dirname:n}=e;{e.s({PROJECT_CONFIG_PATH:()=>n,ProjectStatus:()=>s,WORKSPACE_CONFIG:()=>t});var o=e.i(13442),r=e.i(30331);let t={WORKSPACE_ROOT:(0,r.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},n=(0,r.join)((0,o.homedir)(),".prime-projects.json");var s=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}({})}},29549:function(e){var{g:t,__dirname:n,m:o,e:r}=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:n,m:o,e:r}=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:n,m:o,e:r}=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:n,m:o,e:r}=e;o.exports=e.x("path",()=>require("path"))},23430:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},13442:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("os",()=>require("os"))},52670:function(e){var{g:t,__dirname:n,m:o,e:r}=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"))},9892:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:n}=e;e.s({ProjectStatus:()=>c,getProjectsConfig:()=>s,saveProjectsConfig:()=>a});var o=e.i(9892),r=e.i(88941);async function s(){try{await (0,o.access)(r.PROJECT_CONFIG_PATH,o.constants.F_OK)}catch{return await a({}),{}}try{let e=await (0,o.readFile)(r.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function a(e){let t=r.PROJECT_CONFIG_PATH+".tmp";try{await (0,o.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,o.rename)(t,r.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}({})},94722:e=>{"use strict";var{g:t,__dirname:n}=e;{e.s({sseConnectionManager:()=>n});class t{connections=new Map;encoder=new TextEncoder;heartbeatInterval=null;HEARTBEAT_INTERVAL=3e4;CONNECTION_TIMEOUT=12e4;MAX_CONNECTIONS_PER_ENV=10;constructor(){this.startHeartbeat()}clearAllConnections(){console.log("[SSE] 开始清理所有连接...");let e=Array.from(this.connections.values()).reduce((e,t)=>e+t.size,0);this.connections.forEach(e=>{e.forEach(e=>{try{e.controller.close()}catch{}})}),this.connections.clear(),console.log(`[SSE] 已清理 ${e} 个连接`)}addConnection(e,t,n){console.log(`[SSE] 添加连接: 环境=${e}, 客户端=${n}`),this.connections.has(e)||this.connections.set(e,new Set);let o=this.connections.get(e);if(o.size>=this.MAX_CONNECTIONS_PER_ENV){console.warn(`[SSE] 环境 ${e} 连接数已达上限,清理最旧的连接`);let t=Array.from(o).sort((e,t)=>e.timestamp-t.timestamp)[0];if(t){try{t.controller.close()}catch{}o.delete(t)}}let r={controller:t,timestamp:Date.now(),clientId:n,envName:e};o.add(r),this.sendToConnection(r,{type:"heartbeat",timestamp:Date.now()}),console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}removeConnection(e,t){console.log(`[SSE] 移除连接: 环境=${e}, 客户端=${t}`);let n=this.connections.get(e);if(n){let o=Array.from(n).find(e=>e.clientId===t);o&&(n.delete(o),0===n.size&&this.connections.delete(e))}console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}broadcastToEnv(e,t){console.log(`[SSE] 向环境 ${e} 广播配置变化消息`);let n=this.connections.get(e);if(!n||0===n.size)return void console.log(`[SSE] 环境 ${e} 没有活跃连接,跳过广播`);let o=[];n.forEach(e=>{try{this.sendToConnection(e,t)}catch(t){console.error(`[SSE] 发送消息到客户端 ${e.clientId} 失败:`,t),o.push(e)}}),o.forEach(e=>{n.delete(e),console.log(`[SSE] 清理无效连接: 客户端=${e.clientId}`)}),console.log(`[SSE] 成功发送给 ${n.size} 个连接`)}sendToConnection(e,t){let n=`data: ${JSON.stringify(t)}
1
+ module.exports={45935:function(e){var{g:t,__dirname:n,m:o,e:r}=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"))},88941:e=>{"use strict";var{g:t,__dirname:n}=e;{e.s({PROJECT_CONFIG_PATH:()=>n,ProjectStatus:()=>s,WORKSPACE_CONFIG:()=>t});var o=e.i(13442),r=e.i(30331);let t={WORKSPACE_ROOT:(0,r.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},n=(0,r.join)((0,o.homedir)(),".prime-projects.json");var s=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}({})}},30331:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("path",()=>require("path"))},29549:function(e){var{g:t,__dirname:n,m:o,e:r}=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:n,m:o,e:r}=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:n,m:o,e:r}=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"))},23430:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:t,__dirname:n,m:o,e:r}=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"))},13442:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("os",()=>require("os"))},9892:function(e){var{g:t,__dirname:n,m:o,e:r}=e;o.exports=e.x("fs/promises",()=>require("fs/promises"))},35692:e=>{"use strict";var{g:t,__dirname:n}=e;e.s({ProjectStatus:()=>c,getProjectsConfig:()=>s,saveProjectsConfig:()=>a});var o=e.i(9892),r=e.i(88941);async function s(){try{await (0,o.access)(r.PROJECT_CONFIG_PATH,o.constants.F_OK)}catch{return await a({}),{}}try{let e=await (0,o.readFile)(r.PROJECT_CONFIG_PATH,"utf-8");if(!e)return{};return JSON.parse(e)}catch(e){throw console.error("读取或解析项目配置文件失败:",e),Error("无法加载项目配置")}}async function a(e){let t=r.PROJECT_CONFIG_PATH+".tmp";try{await (0,o.writeFile)(t,JSON.stringify(e,null,2),"utf-8"),await (0,o.rename)(t,r.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}({})},94722:e=>{"use strict";var{g:t,__dirname:n}=e;{e.s({sseConnectionManager:()=>n});class t{connections=new Map;encoder=new TextEncoder;heartbeatInterval=null;HEARTBEAT_INTERVAL=3e4;CONNECTION_TIMEOUT=12e4;MAX_CONNECTIONS_PER_ENV=10;constructor(){this.startHeartbeat()}clearAllConnections(){console.log("[SSE] 开始清理所有连接...");let e=Array.from(this.connections.values()).reduce((e,t)=>e+t.size,0);this.connections.forEach(e=>{e.forEach(e=>{try{e.controller.close()}catch{}})}),this.connections.clear(),console.log(`[SSE] 已清理 ${e} 个连接`)}addConnection(e,t,n){console.log(`[SSE] 添加连接: 环境=${e}, 客户端=${n}`),this.connections.has(e)||this.connections.set(e,new Set);let o=this.connections.get(e);if(o.size>=this.MAX_CONNECTIONS_PER_ENV){console.warn(`[SSE] 环境 ${e} 连接数已达上限,清理最旧的连接`);let t=Array.from(o).sort((e,t)=>e.timestamp-t.timestamp)[0];if(t){try{t.controller.close()}catch{}o.delete(t)}}let r={controller:t,timestamp:Date.now(),clientId:n,envName:e};o.add(r),this.sendToConnection(r,{type:"heartbeat",timestamp:Date.now()}),console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}removeConnection(e,t){console.log(`[SSE] 移除连接: 环境=${e}, 客户端=${t}`);let n=this.connections.get(e);if(n){let o=Array.from(n).find(e=>e.clientId===t);o&&(n.delete(o),0===n.size&&this.connections.delete(e))}console.log(`[SSE] 当前连接统计: ${this.getConnectionStats()}`)}broadcastToEnv(e,t){console.log(`[SSE] 向环境 ${e} 广播配置变化消息`);let n=this.connections.get(e);if(!n||0===n.size)return void console.log(`[SSE] 环境 ${e} 没有活跃连接,跳过广播`);let o=[];n.forEach(e=>{try{this.sendToConnection(e,t)}catch(t){console.error(`[SSE] 发送消息到客户端 ${e.clientId} 失败:`,t),o.push(e)}}),o.forEach(e=>{n.delete(e),console.log(`[SSE] 清理无效连接: 客户端=${e.clientId}`)}),console.log(`[SSE] 成功发送给 ${n.size} 个连接`)}sendToConnection(e,t){let n=`data: ${JSON.stringify(t)}
2
2
 
3
3
  `,o=this.encoder.encode(n);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(n=>{t+=n.size;let o=[];n.forEach(t=>{try{this.sendToConnection(t,e)}catch{o.push(t)}}),o.forEach(e=>n.delete(e))}),t>0&&console.log(`[SSE] 心跳发送完成,活跃连接数: ${t}`)}cleanupStaleConnections(){let e=Date.now(),t=0;this.connections.forEach((n,o)=>{let r=[];n.forEach(t=>{e-t.timestamp>this.CONNECTION_TIMEOUT&&r.push(t)}),r.forEach(e=>{n.delete(e),t++,console.log(`[SSE] 清理过期连接: 环境=${o}, 客户端=${e.clientId}`)}),0===n.size&&this.connections.delete(o)}),t>0&&console.log(`[SSE] 连接清理完成,清理数量: ${t}`)}getConnectionStats(){let e=[],t=0;return this.connections.forEach((n,o)=>{let r=n.size;t+=r,e.push(`${o}: ${r}`)}),`总计 ${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 n=new t;process.on("SIGINT",()=>{console.log("[SSE] 收到退出信号,正在清理连接..."),n.stop(),process.exit(0)}),process.on("SIGTERM",()=>{console.log("[SSE] 收到终止信号,正在清理连接..."),n.stop(),process.exit(0)})}},90449:function(e){var{g:t,__dirname:n,m:o,e:r}=e},36628:e=>{"use strict";var{g:t,__dirname:n}=e;e.s({GET:()=>a,OPTIONS:()=>c});var o=e.i(15494),r=e.i(94722),s=e.i(35692);async function a(e){let{searchParams:t}=new URL(e.url),n=t.get("env"),a=t.get("clientId")||`client-${Date.now()}-${Math.random().toString(36).substr(2,9)}`;if(!n)return o.NextResponse.json({success:!1,error:"缺少必要参数:env(环境名称)"},{status:400});try{let e=await (0,s.getProjectsConfig)(),t=!1;for(let[,o]of Object.entries(e))if(o.envs&&o.envs[n]){t=!0;break}if(!t)return o.NextResponse.json({success:!1,error:`环境 "${n}" 不存在于任何项目中`},{status:404});console.log(`[SSE] 新的连接请求: 环境=${n}, 客户端=${a}`);let c=new TextEncoder,i=new ReadableStream({start(e){r.sseConnectionManager.addConnection(n,e,a);let t={type:"connection-established",envName:n,clientId:a,timestamp:Date.now(),message:`已连接到环境 ${n} 的配置变化推送流`},o=`data: ${JSON.stringify(t)}
4
4
 
5
5
  `;e.enqueue(c.encode(o))},cancel(){console.log(`[SSE] 连接取消: 环境=${n}, 客户端=${a}`),r.sseConnectionManager.removeConnection(n,a)}});return new Response(i,{status:200,headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET","Access-Control-Allow-Headers":"Cache-Control, Content-Type"}})}catch(t){let e=t instanceof Error?t.message:"SSE连接建立失败";return console.error(`[SSE] 连接建立失败: 环境=${n}, 客户端=${a}`,t),o.NextResponse.json({success:!1,error:e},{status:500})}}async function c(){return new Response(null,{status:200,headers:{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Cache-Control","Access-Control-Max-Age":"86400"}})}},61976:e=>{"use strict";var{g:t,__dirname:n}=e;{e.s({patchFetch:()=>c,routeModule:()=>t,serverHooks:()=>l,workAsyncStorage:()=>n,workUnitAsyncStorage:()=>i});var o=e.i(45746),r=e.i(93828),s=e.i(18250),a=e.i(36628);let t=new o.AppRouteRouteModule({definition:{kind:r.RouteKind.APP_ROUTE,page:"/api/microapp-proxy-change-stream/route",pathname:"/api/microapp-proxy-change-stream",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/microapp-proxy-change-stream/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:n,workUnitAsyncStorage:i,serverHooks:l}=t;function c(){return(0,s.patchFetch)({workAsyncStorage:n,workUnitAsyncStorage:i})}}}};
6
6
 
7
- //# sourceMappingURL=%5Broot-of-the-server%5D__6e5dc117._.js.map
7
+ //# sourceMappingURL=%5Broot-of-the-server%5D__5c9f62f9._.js.map
@@ -0,0 +1,16 @@
1
+ module.exports={83886:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("fs",()=>require("fs"))},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"))},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}({})}},30331:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("path",()=>require("path"))},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"))},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"))},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"))},13442:function(e){var{g:t,__dirname:r,m:s,e:n}=e;s.exports=e.x("os",()=>require("os"))},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"))},77159:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({checkMultipleProjectsExist:()=>f,checkProjectExists:()=>p,checkProjectStatus:()=>d,cleanupIncompleteProject:()=>m,cloneRepository:()=>c,createWorkspaceDirectory:()=>a,isValidGitUrl:()=>u,sanitizeProjectName:()=>l});var s=e.i(87485),n=e.i(83886),i=e.i(30331),o=e.i(88941);async function a(e){try{return(0,n.existsSync)(e)||(0,n.mkdirSync)(e,{recursive:!0}),{success:!0}}catch(e){return{success:!1,error:`创建工作空间目录失败: ${e instanceof Error?e.message:String(e)}`}}}async function c(e){let{repoUrl:t,targetDir:r,timeout:n,onProgress:a,onError:c,onLog:u}=e,l=(0,i.basename)(t,".git");return new Promise(e=>{let d=Date.now(),p={projectName:l,status:o.ProjectStatus.CLONING,progress:0,message:"开始克隆项目...",startTime:d};a?.(0,"开始克隆项目...");let g=(0,i.join)(r,l),m=["clone","--progress","--verbose",t,g];u?.(l,"stdout",`[开始克隆] 执行命令: git ${m.join(" ")}
2
+ `),u?.(l,"stdout",`[目标目录] ${g}
3
+ `),u?.(l,"stdout",`[仓库地址] ${t}
4
+ `);let f=(0,s.spawn)("git",m,{cwd:r,stdio:["pipe","pipe","pipe"]}),x="",j=0;u?.(l,"stdout",`[进程启动] Git 进程 PID: ${f.pid}
5
+ `);let v=setTimeout(()=>{u?.(l,"stderr",`[超时警告] Git 进程运行超过 ${n/1e3}s,即将终止
6
+ `),f.kill("SIGTERM");let t={...p,status:o.ProjectStatus.FAILED,progress:j,message:"克隆操作超时",error:`克隆操作超时 (${n/1e3}s)`,endTime:Date.now()};u?.(l,"stderr",`[进程终止] 克隆操作超时
7
+ `),c?.(`${l}: 克隆操作超时`),e(t)},n);f.stdout?.on("data",e=>{let t=e.toString();u?.(l,"stdout",t),j=Math.min(j+10,80),a?.(j,"正在克隆代码...")}),f.stderr?.on("data",e=>{let t=e.toString();x+=t,t.includes("remote:")||t.includes("Receiving objects")||t.includes("Resolving deltas")||t.includes("Counting objects")||t.includes("Enumerating objects")||t.includes("Compressing objects")||t.includes("upload-pack")||t.includes("POST git-")||t.includes("正克隆到")||t.includes("Cloning into")?u?.(l,"progress",t):u?.(l,"stderr",t),t.includes("Receiving objects")||t.includes("Resolving deltas")?(j=Math.min(j+5,90),a?.(j,"正在接收对象...")):t.includes("Counting objects")?(j=Math.min(j+2,70),a?.(j,"正在计算对象...")):t.includes("Enumerating objects")&&(j=Math.min(j+2,50),a?.(j,"正在枚举对象..."))}),f.on("close",t=>{clearTimeout(v);let r=Date.now(),s=r-d;if(u?.(l,"stdout",`[进程结束] Git 进程退出,代码: ${t},耗时: ${Math.round(s/1e3)}s
8
+ `),0===t){u?.(l,"stdout",`[克隆成功] 项目已成功克隆到: ${g}
9
+ `);let t={...p,status:o.ProjectStatus.SUCCESS,progress:100,message:"克隆完成",endTime:r};a?.(100,"克隆完成"),e(t)}else{let s=function(e){let t=e.toLowerCase();return t.includes("authentication failed")||t.includes("access denied")?"身份验证失败,请检查仓库访问权限":t.includes("repository not found")||t.includes("not found")?"仓库不存在或无法访问":t.includes("network")||t.includes("connection")?"网络连接问题,请检查网络设置":t.includes("timeout")?"网络超时,请重试":t.includes("permission denied")?"权限被拒绝,请检查文件系统权限":t.includes("already exists")?"目标目录已存在":e.slice(0,200)+(e.length>200?"...":"")}(x);u?.(l,"stderr",`[克隆失败] 错误信息: ${s}
10
+ `),u?.(l,"stderr",`[完整错误输出]
11
+ ${x}
12
+ `);let n={...p,status:o.ProjectStatus.FAILED,progress:j,message:"克隆失败",error:s||`Git 进程退出,代码: ${t}`,endTime:r};c?.(`${l}: ${n.error}`),e(n)}}),f.on("error",t=>{clearTimeout(v),u?.(l,"stderr",`[进程错误] Git 进程启动失败: ${t.message}
13
+ `),u?.(l,"stderr",`[错误详情] ${t.stack||"No stack trace"}
14
+ `);let r={...p,status:o.ProjectStatus.FAILED,progress:j,message:"进程启动失败",error:`进程启动失败: ${t.message}`,endTime:Date.now()};c?.(`${l}: ${t.message}`),e(r)})})}function u(e){return/^(https?:\/\/|git@)[^\s]+\.git$/i.test(e)}function l(e){return e.replace(/[^a-zA-Z0-9\-_]/g,"")}async function d(e,t){try{let r=(0,i.join)(e,t);if(!(0,n.existsSync)(r))return{exists:!1,status:"not_exists",needsCleanup:!1};let s=(0,i.join)(r,".git");if(!(0,n.existsSync)(s))return{exists:!0,status:"incomplete",needsCleanup:!0};if(!await g(r))return console.log(`检测到不完整的Git仓库: ${r}`),{exists:!0,status:"incomplete",needsCleanup:!0};return{exists:!0,status:"complete",needsCleanup:!1}}catch(e){return console.error(`检查项目 ${t} 状态时出错:`,e),{exists:!1,status:"not_exists",needsCleanup:!1}}}async function p(e,t){return"complete"===(await d(e,t)).status}async function g(e){try{let t=(0,i.join)(e,".git");for(let e of["HEAD","config","refs"]){let r=(0,i.join)(t,e);if(!(0,n.existsSync)(r))return!1}let r=(await n.promises.readdir(e)).filter(e=>".git"!==e);if(0===r.length)return!1;let s=(0,i.join)(t,"HEAD"),o=await n.promises.readFile(s,"utf-8");if(!o.trim()||o.includes("unborn"))return!1;return!0}catch(e){return console.error("检查Git仓库完整性时出错:",e),!1}}async function m(e){try{console.log(`正在清理不完整的项目: ${e}`),await n.promises.rm(e,{recursive:!0,force:!0}),console.log(`清理完成: ${e}`)}catch(t){console.error(`清理项目失败 ${e}:`,t)}}async function f(e,t){let r={},s=t.map(async t=>{let s=await p(e,t);r[t]=s});return await Promise.all(s),r}},79810:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({clearUatGitFlowState:()=>a,createUatGitFlowState:()=>n,isUatGitFlowAborted:()=>o,markUatGitFlowAbort:()=>i});let t=new Map;function s(){let e=Date.now();for(let[r,s]of t.entries())e-s.updatedAt>18e5&&t.delete(r)}function n(e){s(),t.set(e,{aborted:!1,updatedAt:Date.now()})}function i(e){let r=t.get(e);t.set(e,{aborted:!0,updatedAt:Date.now()}),r||s()}function o(e){return s(),t.get(e)?.aborted??!1}function a(e){t.delete(e)}}},28814:function(e){var{g:t,__dirname:r,m:s,e:n}=e}};
15
+
16
+ //# sourceMappingURL=%5Broot-of-the-server%5D__6cbd50e9._.js.map
@@ -0,0 +1 @@
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/git-operations.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/state.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 { spawn, ChildProcess } from 'child_process';\nimport { existsSync, mkdirSync } from 'fs';\nimport { promises as fs } from 'fs';\nimport { join, basename } from 'path';\nimport {\n ProjectStatus,\n type GitOperationConfig,\n type ProjectProgress,\n} from './workspace-types';\n\n/**\n * 创建工作空间目录\n * @param workspacePath 工作空间路径\n * @returns 创建结果\n */\nexport async function createWorkspaceDirectory(workspacePath: string): Promise<{ success: boolean; error?: string }> {\n try {\n if (!existsSync(workspacePath)) {\n mkdirSync(workspacePath, { recursive: true });\n }\n return { success: true };\n } catch (error) {\n return { \n success: false, \n error: `创建工作空间目录失败: ${error instanceof Error ? error.message : String(error)}` \n };\n }\n}\n\n/**\n * 执行 Git 克隆操作\n * @param config Git 操作配置\n * @returns Promise<ProjectProgress>\n */\nexport async function cloneRepository(config: GitOperationConfig): Promise<ProjectProgress> {\n const { repoUrl, targetDir, timeout, onProgress, onError, onLog } = config;\n const projectName = basename(repoUrl, '.git');\n \n return new Promise<ProjectProgress>((resolve) => {\n const startTime = Date.now();\n \n // 更新开始状态\n const initialProgress: ProjectProgress = {\n projectName,\n status: ProjectStatus.CLONING,\n progress: 0,\n message: '开始克隆项目...',\n startTime,\n };\n onProgress?.(0, '开始克隆项目...');\n\n // 执行 git clone 命令\n const targetPath = join(targetDir, projectName);\n // 添加 --progress 参数来强制显示进度,--verbose 显示详细信息\n const gitArgs = ['clone', '--progress', '--verbose', repoUrl, targetPath];\n \n // 记录命令启动信息\n onLog?.(projectName, 'stdout', `[开始克隆] 执行命令: git ${gitArgs.join(' ')}\\n`);\n onLog?.(projectName, 'stdout', `[目标目录] ${targetPath}\\n`);\n onLog?.(projectName, 'stdout', `[仓库地址] ${repoUrl}\\n`);\n \n const gitProcess: ChildProcess = spawn('git', gitArgs, {\n cwd: targetDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n\n let errorOutput = '';\n let progressValue = 0;\n \n // 记录进程启动成功\n onLog?.(projectName, 'stdout', `[进程启动] Git 进程 PID: ${gitProcess.pid}\\n`);\n\n // 设置超时\n const timeoutId = setTimeout(() => {\n onLog?.(projectName, 'stderr', `[超时警告] Git 进程运行超过 ${timeout / 1000}s,即将终止\\n`);\n gitProcess.kill('SIGTERM');\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆操作超时',\n error: `克隆操作超时 (${timeout / 1000}s)`,\n endTime: Date.now(),\n };\n onLog?.(projectName, 'stderr', `[进程终止] 克隆操作超时\\n`);\n onError?.(`${projectName}: 克隆操作超时`);\n resolve(errorResult);\n }, timeout);\n\n // 处理标准输出\n gitProcess.stdout?.on('data', (data: Buffer) => {\n const stdoutText = data.toString();\n \n // 实时发送日志\n onLog?.(projectName, 'stdout', stdoutText);\n \n // 模拟进度更新(Git 克隆没有内置进度,这里基于时间估算)\n progressValue = Math.min(progressValue + 10, 80);\n onProgress?.(progressValue, '正在克隆代码...');\n });\n\n // 处理错误输出\n gitProcess.stderr?.on('data', (data: Buffer) => {\n const stderrText = data.toString();\n errorOutput += stderrText;\n \n // 判断是进度信息还是错误信息\n const isProgressInfo = stderrText.includes('remote:') || \n stderrText.includes('Receiving objects') || \n stderrText.includes('Resolving deltas') ||\n stderrText.includes('Counting objects') ||\n stderrText.includes('Enumerating objects') ||\n stderrText.includes('Compressing objects') ||\n stderrText.includes('upload-pack') ||\n stderrText.includes('POST git-') ||\n stderrText.includes('正克隆到') ||\n stderrText.includes('Cloning into');\n \n // 根据内容类型发送不同的日志\n if (isProgressInfo) {\n onLog?.(projectName, 'progress', stderrText);\n } else {\n onLog?.(projectName, 'stderr', stderrText);\n }\n \n // Git 的进度信息通常在 stderr 中\n if (stderrText.includes('Receiving objects') || stderrText.includes('Resolving deltas')) {\n progressValue = Math.min(progressValue + 5, 90);\n onProgress?.(progressValue, '正在接收对象...');\n } else if (stderrText.includes('Counting objects')) {\n progressValue = Math.min(progressValue + 2, 70);\n onProgress?.(progressValue, '正在计算对象...');\n } else if (stderrText.includes('Enumerating objects')) {\n progressValue = Math.min(progressValue + 2, 50);\n onProgress?.(progressValue, '正在枚举对象...');\n }\n });\n\n // 处理进程结束\n gitProcess.on('close', (code: number | null) => {\n clearTimeout(timeoutId);\n const endTime = Date.now();\n const duration = endTime - startTime;\n \n onLog?.(projectName, 'stdout', `[进程结束] Git 进程退出,代码: ${code},耗时: ${Math.round(duration / 1000)}s\\n`);\n \n if (code === 0) {\n // 克隆成功\n onLog?.(projectName, 'stdout', `[克隆成功] 项目已成功克隆到: ${targetPath}\\n`);\n const successResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.SUCCESS,\n progress: 100,\n message: '克隆完成',\n endTime,\n };\n onProgress?.(100, '克隆完成');\n resolve(successResult);\n } else {\n // 克隆失败\n const parsedError = parseGitError(errorOutput);\n onLog?.(projectName, 'stderr', `[克隆失败] 错误信息: ${parsedError}\\n`);\n onLog?.(projectName, 'stderr', `[完整错误输出]\\n${errorOutput}\\n`);\n \n const failureResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '克隆失败',\n error: parsedError || `Git 进程退出,代码: ${code}`,\n endTime,\n };\n onError?.(`${projectName}: ${failureResult.error}`);\n resolve(failureResult);\n }\n });\n\n // 处理进程错误\n gitProcess.on('error', (error: Error) => {\n clearTimeout(timeoutId);\n onLog?.(projectName, 'stderr', `[进程错误] Git 进程启动失败: ${error.message}\\n`);\n onLog?.(projectName, 'stderr', `[错误详情] ${error.stack || 'No stack trace'}\\n`);\n \n const errorResult: ProjectProgress = {\n ...initialProgress,\n status: ProjectStatus.FAILED,\n progress: progressValue,\n message: '进程启动失败',\n error: `进程启动失败: ${error.message}`,\n endTime: Date.now(),\n };\n onError?.(`${projectName}: ${error.message}`);\n resolve(errorResult);\n });\n });\n}\n\n/**\n * 解析 Git 错误信息,提供用户友好的错误描述\n * @param errorOutput Git stderr 输出\n * @returns 用户友好的错误描述\n */\nfunction parseGitError(errorOutput: string): string {\n const lowerOutput = errorOutput.toLowerCase();\n \n if (lowerOutput.includes('authentication failed') || lowerOutput.includes('access denied')) {\n return '身份验证失败,请检查仓库访问权限';\n }\n \n if (lowerOutput.includes('repository not found') || lowerOutput.includes('not found')) {\n return '仓库不存在或无法访问';\n }\n \n if (lowerOutput.includes('network') || lowerOutput.includes('connection')) {\n return '网络连接问题,请检查网络设置';\n }\n \n if (lowerOutput.includes('timeout')) {\n return '网络超时,请重试';\n }\n \n if (lowerOutput.includes('permission denied')) {\n return '权限被拒绝,请检查文件系统权限';\n }\n \n if (lowerOutput.includes('already exists')) {\n return '目标目录已存在';\n }\n \n // 返回原始错误的前200个字符\n return errorOutput.slice(0, 200) + (errorOutput.length > 200 ? '...' : '');\n}\n\n/**\n * 验证 Git 仓库 URL 格式\n * @param url Git 仓库 URL\n * @returns 是否有效\n */\nexport function isValidGitUrl(url: string): boolean {\n const gitUrlPattern = /^(https?:\\/\\/|git@)[^\\s]+\\.git$/i;\n return gitUrlPattern.test(url);\n}\n\n/**\n * 清理项目名称,移除不安全字符\n * @param projectName 项目名称\n * @returns 清理后的项目名称\n */\nexport function sanitizeProjectName(projectName: string): string {\n return projectName.replace(/[^a-zA-Z0-9\\-_]/g, '');\n}\n\n/**\n * 项目检查结果类型\n */\nexport type ProjectCheckResult = {\n exists: boolean;\n status: 'not_exists' | 'complete' | 'incomplete';\n needsCleanup: boolean;\n};\n\n/**\n * 检查项目状态(详细版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<ProjectCheckResult> 详细的项目状态\n */\nexport async function checkProjectStatus(workspacePath: string, projectName: string): Promise<ProjectCheckResult> {\n try {\n const projectPath = join(workspacePath, projectName);\n \n // 检查项目目录是否存在\n if (!existsSync(projectPath)) {\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n \n // 检查是否为 Git 仓库(存在 .git 目录)\n const gitPath = join(projectPath, '.git');\n if (!existsSync(gitPath)) {\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n // 更严格的完整性检查\n const isComplete = await isGitRepositoryComplete(projectPath);\n if (!isComplete) {\n console.log(`检测到不完整的Git仓库: ${projectPath}`);\n return {\n exists: true,\n status: 'incomplete',\n needsCleanup: true\n };\n }\n \n return {\n exists: true,\n status: 'complete',\n needsCleanup: false\n };\n } catch (error) {\n console.error(`检查项目 ${projectName} 状态时出错:`, error);\n return {\n exists: false,\n status: 'not_exists',\n needsCleanup: false\n };\n }\n}\n\n/**\n * 检查项目是否已存在于工作空间中(兼容版本)\n * @param workspacePath 工作空间路径\n * @param projectName 项目名称\n * @returns Promise<boolean> 项目是否存在且为有效的 Git 仓库\n */\nexport async function checkProjectExists(workspacePath: string, projectName: string): Promise<boolean> {\n const result = await checkProjectStatus(workspacePath, projectName);\n return result.status === 'complete';\n}\n\n/**\n * 检查Git仓库是否完整\n * @param projectPath 项目路径\n * @returns Promise<boolean> 仓库是否完整\n */\nasync function isGitRepositoryComplete(projectPath: string): Promise<boolean> {\n try {\n const gitPath = join(projectPath, '.git');\n \n // 检查关键的Git文件是否存在\n const requiredFiles = ['HEAD', 'config', 'refs'];\n for (const file of requiredFiles) {\n const filePath = join(gitPath, file);\n if (!existsSync(filePath)) {\n return false;\n }\n }\n \n // 检查是否有实际的项目文件(不只是.git目录)\n const entries = await fs.readdir(projectPath);\n const nonGitFiles = entries.filter((entry: string) => entry !== '.git');\n \n // 如果只有.git目录,说明克隆未完成\n if (nonGitFiles.length === 0) {\n return false;\n }\n \n // 检查HEAD文件是否有效\n const headPath = join(gitPath, 'HEAD');\n const headContent = await fs.readFile(headPath, 'utf-8');\n if (!headContent.trim() || headContent.includes('unborn')) {\n return false;\n }\n \n return true;\n } catch (error) {\n console.error('检查Git仓库完整性时出错:', error);\n return false;\n }\n}\n\n/**\n * 清理不完整的项目目录\n * @param projectPath 项目路径\n */\nexport async function cleanupIncompleteProject(projectPath: string): Promise<void> {\n try {\n console.log(`正在清理不完整的项目: ${projectPath}`);\n await fs.rm(projectPath, { recursive: true, force: true });\n console.log(`清理完成: ${projectPath}`);\n } catch (error) {\n console.error(`清理项目失败 ${projectPath}:`, error);\n // 清理失败不抛出错误,避免阻塞后续流程\n }\n}\n\n/**\n * 批量检查多个项目的存在状态\n * @param workspacePath 工作空间路径\n * @param projectNames 项目名称列表\n * @returns Promise<Record<string, boolean>> 项目名称到存在状态的映射\n */\nexport async function checkMultipleProjectsExist(\n workspacePath: string, \n projectNames: string[]\n): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n \n // 并行检查所有项目\n const checks = projectNames.map(async (projectName) => {\n const exists = await checkProjectExists(workspacePath, projectName);\n results[projectName] = exists;\n });\n \n await Promise.all(checks);\n return results;\n} ","type AbortState = {\n aborted: boolean;\n updatedAt: number;\n};\n\nconst abortStates = new Map<string, AbortState>();\nconst ABORT_STATE_TTL = 1000 * 60 * 30;\n\nfunction cleanupAbortStates() {\n const now = Date.now();\n for (const [runId, state] of abortStates.entries()) {\n if (now - state.updatedAt > ABORT_STATE_TTL) {\n abortStates.delete(runId);\n }\n }\n}\n\nexport function createUatGitFlowState(runId: string) {\n cleanupAbortStates();\n abortStates.set(runId, { aborted: false, updatedAt: Date.now() });\n}\n\nexport function markUatGitFlowAbort(runId: string) {\n const existing = abortStates.get(runId);\n abortStates.set(runId, {\n aborted: true,\n updatedAt: Date.now(),\n });\n if (!existing) {\n cleanupAbortStates();\n }\n}\n\nexport function isUatGitFlowAborted(runId: string) {\n cleanupAbortStates();\n return abortStates.get(runId)?.aborted ?? false;\n}\n\nexport function clearUatGitFlowState(runId: string) {\n abortStates.delete(runId);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ module.exports={45935:function(e){var{g:t,__dirname:r,m:n,e:s}=e;n.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:n,e:s}=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:s}=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:s}=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"))},23430:function(e){var{g:t,__dirname:r,m:n,e:s}=e;n.exports=e.x("next/dist/compiled/@opentelemetry/api",()=>require("next/dist/compiled/@opentelemetry/api"))},52670:function(e){var{g:t,__dirname:r,m:n,e:s}=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"))},79810:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({clearUatGitFlowState:()=>i,createUatGitFlowState:()=>s,isUatGitFlowAborted:()=>a,markUatGitFlowAbort:()=>o});let t=new Map;function n(){let e=Date.now();for(let[r,n]of t.entries())e-n.updatedAt>18e5&&t.delete(r)}function s(e){n(),t.set(e,{aborted:!1,updatedAt:Date.now()})}function o(e){let r=t.get(e);t.set(e,{aborted:!0,updatedAt:Date.now()}),r||n()}function a(e){return n(),t.get(e)?.aborted??!1}function i(e){t.delete(e)}}},93640:function(e){var{g:t,__dirname:r,m:n,e:s}=e},6524:e=>{"use strict";var{g:t,__dirname:r}=e;e.s({POST:()=>o});var n=e.i(15494),s=e.i(79810);async function o(e){try{let t=await e.json(),r="string"==typeof t.runId?t.runId:"";if(!r)return n.NextResponse.json({success:!1,error:"缺少 runId"},{status:400});return(0,s.markUatGitFlowAbort)(r),n.NextResponse.json({success:!0,message:"已发送中断请求"})}catch(e){return n.NextResponse.json({success:!1,error:e instanceof Error?e.message:"中断失败"},{status:500})}}},83151:e=>{"use strict";var{g:t,__dirname:r}=e;{e.s({patchFetch:()=>i,routeModule:()=>t,serverHooks:()=>p,workAsyncStorage:()=>r,workUnitAsyncStorage:()=>u});var n=e.i(45746),s=e.i(93828),o=e.i(18250),a=e.i(6524);let t=new n.AppRouteRouteModule({definition:{kind:s.RouteKind.APP_ROUTE,page:"/api/uat-git-flow/abort/route",pathname:"/api/uat-git-flow/abort",filename:"route",bundlePath:""},resolvedPagePath:"[project]/packages/server/src/app/api/uat-git-flow/abort/route.ts",nextConfigOutput:"",userland:a}),{workAsyncStorage:r,workUnitAsyncStorage:u,serverHooks:p}=t;function i(){return(0,o.patchFetch)({workAsyncStorage:r,workUnitAsyncStorage:u})}}}};
2
+
3
+ //# sourceMappingURL=%5Broot-of-the-server%5D__703c317f._.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["turbopack:///[project]/packages/server/src/app/api/uat-git-flow/state.ts","turbopack:///[project]/packages/server/src/app/api/uat-git-flow/abort/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":["type AbortState = {\n aborted: boolean;\n updatedAt: number;\n};\n\nconst abortStates = new Map<string, AbortState>();\nconst ABORT_STATE_TTL = 1000 * 60 * 30;\n\nfunction cleanupAbortStates() {\n const now = Date.now();\n for (const [runId, state] of abortStates.entries()) {\n if (now - state.updatedAt > ABORT_STATE_TTL) {\n abortStates.delete(runId);\n }\n }\n}\n\nexport function createUatGitFlowState(runId: string) {\n cleanupAbortStates();\n abortStates.set(runId, { aborted: false, updatedAt: Date.now() });\n}\n\nexport function markUatGitFlowAbort(runId: string) {\n const existing = abortStates.get(runId);\n abortStates.set(runId, {\n aborted: true,\n updatedAt: Date.now(),\n });\n if (!existing) {\n cleanupAbortStates();\n }\n}\n\nexport function isUatGitFlowAborted(runId: string) {\n cleanupAbortStates();\n return abortStates.get(runId)?.aborted ?? false;\n}\n\nexport function clearUatGitFlowState(runId: string) {\n abortStates.delete(runId);\n}\n","import { NextRequest, NextResponse } from 'next/server';\nimport { markUatGitFlowAbort } from '../state';\n\nexport async function POST(request: NextRequest) {\n try {\n const body = await request.json();\n const runId = typeof body.runId === 'string' ? body.runId : '';\n\n if (!runId) {\n return NextResponse.json({\n success: false,\n error: '缺少 runId'\n }, { status: 400 });\n }\n\n markUatGitFlowAbort(runId);\n\n return NextResponse.json({\n success: true,\n message: '已发送中断请求'\n });\n } catch (error) {\n return NextResponse.json({\n success: false,\n error: error instanceof Error ? error.message : '中断失败'\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":"21CAKA,IAAM,EAAc,IAAI,IAGxB,SAAS,IACP,IAAM,EAAM,KAAK,GAAG,GACpB,IAAK,GAAM,CAAC,EAAO,EAAM,GAAI,EAAY,OAAO,GAAI,AAC9C,EAAM,EAAM,SAAS,CALL,EAKQ,IAC1B,CANyB,CAMb,IANkB,EAMZ,CAAC,EAGzB,CAEO,CAN0C,QAMjC,EAAsB,CAAa,EACjD,IACA,EAAY,GAAG,CAAC,EAAO,CAAE,QAAS,GAAO,UAAW,KAAK,GAAG,EAAG,EACjE,CAEO,SAAS,EAAoB,CAAa,EAC/C,IAAM,EAAW,EAAY,GAAG,CAAC,GACjC,EAAY,GAAG,CAAC,EAAO,CACrB,SAAS,EACT,UAAW,KAAK,GAAG,EACrB,GACI,AAAC,GACH,GAEJ,CAEO,GALU,MAKD,EAAoB,CAAa,EAE/C,OADA,IACO,EAAY,GAAG,CAAC,IAAQ,UAAW,CAC5C,CAEO,SAAS,EAAqB,CAAa,EAChD,EAAY,MAAM,CAAC,EACrB,qHCxCA,IAAA,EAAA,EAAA,CAAA,CAAA,OACA,EAAA,EAAA,CAAA,CAAA,OAEO,eAAe,EAAK,CAAoB,EAC7C,GAAI,CACF,IAAM,EAAO,MAAM,EAAQ,IAAI,GACzB,EAA8B,UAAtB,OAAO,EAAK,KAAK,CAAgB,EAAK,KAAK,CAAG,GAE5D,GAAI,CAAC,EACH,KADU,EACH,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,QAAS,GACT,MAAO,AAFF,UAGP,EAAG,CAAE,OAAQ,GAAI,GAKnB,MAFA,CAAA,EAAA,EAAA,mBAAA,AAAkB,EAAE,GAEb,EAAA,UAFP,EAEmB,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,EAEI,SACX,EACF,CAAE,MAAO,EAAO,CACd,OAAO,EAAA,YAAY,CAAC,IAAI,CAAC,CACvB,SAAS,EACT,MAFK,AAEE,aAAiB,MAAQ,EAAM,OAAO,CAAG,MAClD,EAAG,CAAE,OAAQ,GAAI,EACnB,CACF,gKC3BA,IAAA,EAGO,EAAA,CAFLA,AAEK,CAAA,OACP,EAA0B,EAAyB,CAA1CC,AAA0C,CAAA,GAAA,EAH9B,EAIrB,CADkB,CAD2C,AAEnB,EAAA,CAAjCC,AAAiC,CAFnC,AAEmC,GADhB,CAC8C,GAExE,EAAwC,EAAA,CAAA,CAAA,AAFjBC,EAEXC,IAWZ,IAAMC,CAb4B,CAad,IAXM,AAWN,EAAIL,CAbkB,YAEF,MAWhBA,CAAoB,CAC1CM,WAAY,CACVC,KAAMN,EAAAA,SAAAA,CAAUO,SAAS,CACzBC,KAAM,gCACNC,SAAU,0BACVC,SAAU,QACVC,WAAY,EACd,EACAC,iBAAkB,oEAClBC,iBAXF,CAA0B,WAYxBV,CACF,GAKM,kBAAEW,CAAgB,CAAEC,sBAAoB,aAAEC,CAAW,CAAE,CAAGZ,EAEhE,SAASH,IACP,MAAA,CAAA,EAAA,EAAOC,UAAAA,EAAY,kBACjBY,uBACAC,CACF,EACF","ignoreList":[2]}